xref: /linux/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_spi.c (revision 79790b6818e96c58fe2bffee1b418c16e64e7b80)
16731ca39SAndy Shevchenko // SPDX-License-Identifier: GPL-2.0-only
26731ca39SAndy Shevchenko /*
36731ca39SAndy Shevchenko  * STMicroelectronics LSM9DS0 IMU driver
46731ca39SAndy Shevchenko  *
56731ca39SAndy Shevchenko  * Copyright (C) 2021, Intel Corporation
66731ca39SAndy Shevchenko  *
76731ca39SAndy Shevchenko  * Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
86731ca39SAndy Shevchenko  */
96731ca39SAndy Shevchenko 
10*07d6a5a4Sandy.shevchenko@gmail.com #include <linux/device.h>
11*07d6a5a4Sandy.shevchenko@gmail.com #include <linux/err.h>
12*07d6a5a4Sandy.shevchenko@gmail.com #include <linux/gfp_types.h>
136731ca39SAndy Shevchenko #include <linux/module.h>
149c6cd755SJonathan Cameron #include <linux/mod_devicetable.h>
159c6cd755SJonathan Cameron #include <linux/regmap.h>
166731ca39SAndy Shevchenko #include <linux/spi/spi.h>
176731ca39SAndy Shevchenko 
186731ca39SAndy Shevchenko #include <linux/iio/common/st_sensors_spi.h>
196731ca39SAndy Shevchenko 
206731ca39SAndy Shevchenko #include "st_lsm9ds0.h"
216731ca39SAndy Shevchenko 
226731ca39SAndy Shevchenko static const struct of_device_id st_lsm9ds0_of_match[] = {
236731ca39SAndy Shevchenko 	{
24c0f68439SMarius Hoch 		.compatible = "st,lsm303d-imu",
25c0f68439SMarius Hoch 		.data = LSM303D_IMU_DEV_NAME,
26c0f68439SMarius Hoch 	},
27c0f68439SMarius Hoch 	{
286731ca39SAndy Shevchenko 		.compatible = "st,lsm9ds0-imu",
296731ca39SAndy Shevchenko 		.data = LSM9DS0_IMU_DEV_NAME,
306731ca39SAndy Shevchenko 	},
316731ca39SAndy Shevchenko 	{}
326731ca39SAndy Shevchenko };
336731ca39SAndy Shevchenko MODULE_DEVICE_TABLE(of, st_lsm9ds0_of_match);
346731ca39SAndy Shevchenko 
356731ca39SAndy Shevchenko static const struct spi_device_id st_lsm9ds0_id_table[] = {
36c0f68439SMarius Hoch 	{ LSM303D_IMU_DEV_NAME },
376731ca39SAndy Shevchenko 	{ LSM9DS0_IMU_DEV_NAME },
386731ca39SAndy Shevchenko 	{}
396731ca39SAndy Shevchenko };
406731ca39SAndy Shevchenko MODULE_DEVICE_TABLE(spi, st_lsm9ds0_id_table);
416731ca39SAndy Shevchenko 
426731ca39SAndy Shevchenko static const struct regmap_config st_lsm9ds0_regmap_config = {
436731ca39SAndy Shevchenko 	.reg_bits	= 8,
446731ca39SAndy Shevchenko 	.val_bits	= 8,
456731ca39SAndy Shevchenko 	.read_flag_mask	= 0xc0,
466731ca39SAndy Shevchenko };
476731ca39SAndy Shevchenko 
st_lsm9ds0_spi_probe(struct spi_device * spi)486731ca39SAndy Shevchenko static int st_lsm9ds0_spi_probe(struct spi_device *spi)
496731ca39SAndy Shevchenko {
506731ca39SAndy Shevchenko 	struct device *dev = &spi->dev;
516731ca39SAndy Shevchenko 	struct st_lsm9ds0 *lsm9ds0;
526731ca39SAndy Shevchenko 	struct regmap *regmap;
536731ca39SAndy Shevchenko 
546731ca39SAndy Shevchenko 	st_sensors_dev_name_probe(dev, spi->modalias, sizeof(spi->modalias));
556731ca39SAndy Shevchenko 
566731ca39SAndy Shevchenko 	lsm9ds0 = devm_kzalloc(dev, sizeof(*lsm9ds0), GFP_KERNEL);
576731ca39SAndy Shevchenko 	if (!lsm9ds0)
586731ca39SAndy Shevchenko 		return -ENOMEM;
596731ca39SAndy Shevchenko 
606731ca39SAndy Shevchenko 	lsm9ds0->dev = dev;
616731ca39SAndy Shevchenko 	lsm9ds0->name = spi->modalias;
626731ca39SAndy Shevchenko 	lsm9ds0->irq = spi->irq;
636731ca39SAndy Shevchenko 
646731ca39SAndy Shevchenko 	regmap = devm_regmap_init_spi(spi, &st_lsm9ds0_regmap_config);
656731ca39SAndy Shevchenko 	if (IS_ERR(regmap))
666731ca39SAndy Shevchenko 		return PTR_ERR(regmap);
676731ca39SAndy Shevchenko 
686731ca39SAndy Shevchenko 	spi_set_drvdata(spi, lsm9ds0);
696731ca39SAndy Shevchenko 
706731ca39SAndy Shevchenko 	return st_lsm9ds0_probe(lsm9ds0, regmap);
716731ca39SAndy Shevchenko }
726731ca39SAndy Shevchenko 
736731ca39SAndy Shevchenko static struct spi_driver st_lsm9ds0_driver = {
746731ca39SAndy Shevchenko 	.driver = {
756731ca39SAndy Shevchenko 		.name = "st-lsm9ds0-spi",
766731ca39SAndy Shevchenko 		.of_match_table = st_lsm9ds0_of_match,
776731ca39SAndy Shevchenko 	},
786731ca39SAndy Shevchenko 	.probe = st_lsm9ds0_spi_probe,
796731ca39SAndy Shevchenko 	.id_table = st_lsm9ds0_id_table,
806731ca39SAndy Shevchenko };
816731ca39SAndy Shevchenko module_spi_driver(st_lsm9ds0_driver);
826731ca39SAndy Shevchenko 
836731ca39SAndy Shevchenko MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
846731ca39SAndy Shevchenko MODULE_DESCRIPTION("STMicroelectronics LSM9DS0 IMU SPI driver");
856731ca39SAndy Shevchenko MODULE_LICENSE("GPL v2");
860805b512SJonathan Cameron MODULE_IMPORT_NS(IIO_ST_SENSORS);
87