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