1fda8d26eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
27be56a8fSDenis Ciocca /*
37be56a8fSDenis Ciocca * STMicroelectronics gyroscopes driver
47be56a8fSDenis Ciocca *
57be56a8fSDenis Ciocca * Copyright 2012-2013 STMicroelectronics Inc.
67be56a8fSDenis Ciocca *
77be56a8fSDenis Ciocca * Denis Ciocca <denis.ciocca@st.com>
87be56a8fSDenis Ciocca */
97be56a8fSDenis Ciocca
107be56a8fSDenis Ciocca #include <linux/kernel.h>
117be56a8fSDenis Ciocca #include <linux/module.h>
129c6cd755SJonathan Cameron #include <linux/mod_devicetable.h>
137be56a8fSDenis Ciocca #include <linux/i2c.h>
147be56a8fSDenis Ciocca #include <linux/iio/iio.h>
157be56a8fSDenis Ciocca
167be56a8fSDenis Ciocca #include <linux/iio/common/st_sensors.h>
177be56a8fSDenis Ciocca #include <linux/iio/common/st_sensors_i2c.h>
187be56a8fSDenis Ciocca #include "st_gyro.h"
197be56a8fSDenis Ciocca
202d7768a8SLinus Walleij static const struct of_device_id st_gyro_of_match[] = {
212d7768a8SLinus Walleij {
222d7768a8SLinus Walleij .compatible = "st,l3g4200d-gyro",
232d7768a8SLinus Walleij .data = L3G4200D_GYRO_DEV_NAME,
242d7768a8SLinus Walleij },
252d7768a8SLinus Walleij {
262d7768a8SLinus Walleij .compatible = "st,lsm330d-gyro",
272d7768a8SLinus Walleij .data = LSM330D_GYRO_DEV_NAME,
282d7768a8SLinus Walleij },
292d7768a8SLinus Walleij {
302d7768a8SLinus Walleij .compatible = "st,lsm330dl-gyro",
312d7768a8SLinus Walleij .data = LSM330DL_GYRO_DEV_NAME,
322d7768a8SLinus Walleij },
332d7768a8SLinus Walleij {
342d7768a8SLinus Walleij .compatible = "st,lsm330dlc-gyro",
352d7768a8SLinus Walleij .data = LSM330DLC_GYRO_DEV_NAME,
362d7768a8SLinus Walleij },
372d7768a8SLinus Walleij {
382d7768a8SLinus Walleij .compatible = "st,l3gd20-gyro",
392d7768a8SLinus Walleij .data = L3GD20_GYRO_DEV_NAME,
402d7768a8SLinus Walleij },
412d7768a8SLinus Walleij {
4245a4e422SLorenzo Bianconi .compatible = "st,l3gd20h-gyro",
4345a4e422SLorenzo Bianconi .data = L3GD20H_GYRO_DEV_NAME,
4445a4e422SLorenzo Bianconi },
4545a4e422SLorenzo Bianconi {
462d7768a8SLinus Walleij .compatible = "st,l3g4is-gyro",
472d7768a8SLinus Walleij .data = L3G4IS_GYRO_DEV_NAME,
482d7768a8SLinus Walleij },
492d7768a8SLinus Walleij {
502d7768a8SLinus Walleij .compatible = "st,lsm330-gyro",
512d7768a8SLinus Walleij .data = LSM330_GYRO_DEV_NAME,
522d7768a8SLinus Walleij },
5341c128cbSCrestez Dan Leonard {
5441c128cbSCrestez Dan Leonard .compatible = "st,lsm9ds0-gyro",
5541c128cbSCrestez Dan Leonard .data = LSM9DS0_GYRO_DEV_NAME,
5641c128cbSCrestez Dan Leonard },
572d7768a8SLinus Walleij {},
582d7768a8SLinus Walleij };
592d7768a8SLinus Walleij MODULE_DEVICE_TABLE(of, st_gyro_of_match);
602d7768a8SLinus Walleij
st_gyro_i2c_probe(struct i2c_client * client)611522b453SUwe Kleine-König static int st_gyro_i2c_probe(struct i2c_client *client)
627be56a8fSDenis Ciocca {
633c05484cSDenis Ciocca const struct st_sensor_settings *settings;
647be56a8fSDenis Ciocca struct st_sensor_data *gdata;
653c05484cSDenis Ciocca struct iio_dev *indio_dev;
667be56a8fSDenis Ciocca int err;
677be56a8fSDenis Ciocca
68efc78983SAndy Shevchenko st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));
693c05484cSDenis Ciocca
703c05484cSDenis Ciocca settings = st_gyro_get_settings(client->name);
713c05484cSDenis Ciocca if (!settings) {
723c05484cSDenis Ciocca dev_err(&client->dev, "device name %s not recognized.\n",
733c05484cSDenis Ciocca client->name);
743c05484cSDenis Ciocca return -ENODEV;
753c05484cSDenis Ciocca }
763c05484cSDenis Ciocca
777a842ed6SSachin Kamat indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*gdata));
787a842ed6SSachin Kamat if (!indio_dev)
797a842ed6SSachin Kamat return -ENOMEM;
807be56a8fSDenis Ciocca
817be56a8fSDenis Ciocca gdata = iio_priv(indio_dev);
823c05484cSDenis Ciocca gdata->sensor_settings = (struct st_sensor_settings *)settings;
837be56a8fSDenis Ciocca
84062809efSDenis Ciocca err = st_sensors_i2c_configure(indio_dev, client);
85062809efSDenis Ciocca if (err < 0)
86062809efSDenis Ciocca return err;
877be56a8fSDenis Ciocca
887db4f2caSAndy Shevchenko err = st_sensors_power_enable(indio_dev);
897db4f2caSAndy Shevchenko if (err)
907a842ed6SSachin Kamat return err;
917be56a8fSDenis Ciocca
925363c6c1SAlexandru Ardelean return st_gyro_common_probe(indio_dev);
937be56a8fSDenis Ciocca }
947be56a8fSDenis Ciocca
957be56a8fSDenis Ciocca static const struct i2c_device_id st_gyro_id_table[] = {
967be56a8fSDenis Ciocca { L3G4200D_GYRO_DEV_NAME },
977be56a8fSDenis Ciocca { LSM330D_GYRO_DEV_NAME },
987be56a8fSDenis Ciocca { LSM330DL_GYRO_DEV_NAME },
997be56a8fSDenis Ciocca { LSM330DLC_GYRO_DEV_NAME },
1007be56a8fSDenis Ciocca { L3GD20_GYRO_DEV_NAME },
10145a4e422SLorenzo Bianconi { L3GD20H_GYRO_DEV_NAME },
1027be56a8fSDenis Ciocca { L3G4IS_GYRO_DEV_NAME },
1037be56a8fSDenis Ciocca { LSM330_GYRO_DEV_NAME },
10441c128cbSCrestez Dan Leonard { LSM9DS0_GYRO_DEV_NAME },
1057be56a8fSDenis Ciocca {},
1067be56a8fSDenis Ciocca };
1077be56a8fSDenis Ciocca MODULE_DEVICE_TABLE(i2c, st_gyro_id_table);
1087be56a8fSDenis Ciocca
1097be56a8fSDenis Ciocca static struct i2c_driver st_gyro_driver = {
1107be56a8fSDenis Ciocca .driver = {
1117be56a8fSDenis Ciocca .name = "st-gyro-i2c",
112ecb27c5eSAndy Shevchenko .of_match_table = st_gyro_of_match,
1137be56a8fSDenis Ciocca },
114*7cf15f42SUwe Kleine-König .probe = st_gyro_i2c_probe,
1157be56a8fSDenis Ciocca .id_table = st_gyro_id_table,
1167be56a8fSDenis Ciocca };
1177be56a8fSDenis Ciocca module_i2c_driver(st_gyro_driver);
1187be56a8fSDenis Ciocca
1197be56a8fSDenis Ciocca MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
1207be56a8fSDenis Ciocca MODULE_DESCRIPTION("STMicroelectronics gyroscopes i2c driver");
1217be56a8fSDenis Ciocca MODULE_LICENSE("GPL v2");
1220805b512SJonathan Cameron MODULE_IMPORT_NS(IIO_ST_SENSORS);
123