xref: /openbmc/linux/drivers/iio/gyro/st_gyro_i2c.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
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