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