xref: /openbmc/linux/drivers/iio/gyro/bmg160_i2c.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
109c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
213426454SMarkus Pargmann #include <linux/i2c.h>
313426454SMarkus Pargmann #include <linux/regmap.h>
413426454SMarkus Pargmann #include <linux/iio/iio.h>
513426454SMarkus Pargmann #include <linux/module.h>
613426454SMarkus Pargmann #include <linux/acpi.h>
713426454SMarkus Pargmann 
813426454SMarkus Pargmann #include "bmg160.h"
913426454SMarkus Pargmann 
1013426454SMarkus Pargmann static const struct regmap_config bmg160_regmap_i2c_conf = {
1113426454SMarkus Pargmann 	.reg_bits = 8,
1213426454SMarkus Pargmann 	.val_bits = 8,
1313426454SMarkus Pargmann 	.max_register = 0x3f
1413426454SMarkus Pargmann };
1513426454SMarkus Pargmann 
bmg160_i2c_probe(struct i2c_client * client)16840ef016SUwe Kleine-König static int bmg160_i2c_probe(struct i2c_client *client)
1713426454SMarkus Pargmann {
18840ef016SUwe Kleine-König 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
1913426454SMarkus Pargmann 	struct regmap *regmap;
2013426454SMarkus Pargmann 	const char *name = NULL;
2113426454SMarkus Pargmann 
2213426454SMarkus Pargmann 	regmap = devm_regmap_init_i2c(client, &bmg160_regmap_i2c_conf);
2313426454SMarkus Pargmann 	if (IS_ERR(regmap)) {
2444214098SNishant Malpani 		dev_err(&client->dev, "Failed to register i2c regmap: %pe\n",
2544214098SNishant Malpani 			regmap);
2613426454SMarkus Pargmann 		return PTR_ERR(regmap);
2713426454SMarkus Pargmann 	}
2813426454SMarkus Pargmann 
2913426454SMarkus Pargmann 	if (id)
3013426454SMarkus Pargmann 		name = id->name;
3113426454SMarkus Pargmann 
3213426454SMarkus Pargmann 	return bmg160_core_probe(&client->dev, regmap, client->irq, name);
3313426454SMarkus Pargmann }
3413426454SMarkus Pargmann 
bmg160_i2c_remove(struct i2c_client * client)35ed5c2f5fSUwe Kleine-König static void bmg160_i2c_remove(struct i2c_client *client)
3613426454SMarkus Pargmann {
3713426454SMarkus Pargmann 	bmg160_core_remove(&client->dev);
3813426454SMarkus Pargmann }
3913426454SMarkus Pargmann 
4013426454SMarkus Pargmann static const struct acpi_device_id bmg160_acpi_match[] = {
4113426454SMarkus Pargmann 	{"BMG0160", 0},
4213426454SMarkus Pargmann 	{"BMI055B", 0},
431579fc06SMike Looijmans 	{"BMI088B", 0},
4413426454SMarkus Pargmann 	{},
4513426454SMarkus Pargmann };
4613426454SMarkus Pargmann 
4713426454SMarkus Pargmann MODULE_DEVICE_TABLE(acpi, bmg160_acpi_match);
4813426454SMarkus Pargmann 
4913426454SMarkus Pargmann static const struct i2c_device_id bmg160_i2c_id[] = {
5013426454SMarkus Pargmann 	{"bmg160", 0},
5113426454SMarkus Pargmann 	{"bmi055_gyro", 0},
521579fc06SMike Looijmans 	{"bmi088_gyro", 0},
5313426454SMarkus Pargmann 	{}
5413426454SMarkus Pargmann };
5513426454SMarkus Pargmann 
5613426454SMarkus Pargmann MODULE_DEVICE_TABLE(i2c, bmg160_i2c_id);
5713426454SMarkus Pargmann 
5894bceb3cSH. Nikolaus Schaller static const struct of_device_id bmg160_of_match[] = {
5994bceb3cSH. Nikolaus Schaller 	{ .compatible = "bosch,bmg160" },
6094bceb3cSH. Nikolaus Schaller 	{ .compatible = "bosch,bmi055_gyro" },
6194bceb3cSH. Nikolaus Schaller 	{ }
6294bceb3cSH. Nikolaus Schaller };
6394bceb3cSH. Nikolaus Schaller 
6494bceb3cSH. Nikolaus Schaller MODULE_DEVICE_TABLE(of, bmg160_of_match);
6594bceb3cSH. Nikolaus Schaller 
6613426454SMarkus Pargmann static struct i2c_driver bmg160_i2c_driver = {
6713426454SMarkus Pargmann 	.driver = {
6813426454SMarkus Pargmann 		.name	= "bmg160_i2c",
6913426454SMarkus Pargmann 		.acpi_match_table = ACPI_PTR(bmg160_acpi_match),
7094bceb3cSH. Nikolaus Schaller 		.of_match_table = bmg160_of_match,
7113426454SMarkus Pargmann 		.pm	= &bmg160_pm_ops,
7213426454SMarkus Pargmann 	},
73*7cf15f42SUwe Kleine-König 	.probe		= bmg160_i2c_probe,
7413426454SMarkus Pargmann 	.remove		= bmg160_i2c_remove,
7513426454SMarkus Pargmann 	.id_table	= bmg160_i2c_id,
7613426454SMarkus Pargmann };
7713426454SMarkus Pargmann module_i2c_driver(bmg160_i2c_driver);
7813426454SMarkus Pargmann 
7913426454SMarkus Pargmann MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
8013426454SMarkus Pargmann MODULE_LICENSE("GPL v2");
8113426454SMarkus Pargmann MODULE_DESCRIPTION("BMG160 I2C Gyro driver");
82