Linux Audio

Check our new training course

Loading...
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * STMicroelectronics magnetometers driver
  4 *
  5 * Copyright 2012-2013 STMicroelectronics Inc.
  6 *
  7 * Denis Ciocca <denis.ciocca@st.com>
  8 */
  9
 10#include <linux/kernel.h>
 11#include <linux/module.h>
 12#include <linux/mod_devicetable.h>
 13#include <linux/spi/spi.h>
 14#include <linux/iio/iio.h>
 15
 16#include <linux/iio/common/st_sensors.h>
 17#include <linux/iio/common/st_sensors_spi.h>
 18#include "st_magn.h"
 19
 20/*
 21 * For new single-chip sensors use <device_name> as compatible string.
 22 * For old single-chip devices keep <device_name>-magn to maintain
 23 * compatibility
 24 * For multi-chip devices, use <device_name>-magn to distinguish which
 25 * capability is being used
 26 */
 27static const struct of_device_id st_magn_of_match[] = {
 28	{
 29		.compatible = "st,lis3mdl-magn",
 30		.data = LIS3MDL_MAGN_DEV_NAME,
 31	},
 32	{
 33		.compatible = "st,lsm303agr-magn",
 34		.data = LSM303AGR_MAGN_DEV_NAME,
 35	},
 36	{
 37		.compatible = "st,lis2mdl",
 38		.data = LIS2MDL_MAGN_DEV_NAME,
 39	},
 40	{
 41		.compatible = "st,lsm9ds1-magn",
 42		.data = LSM9DS1_MAGN_DEV_NAME,
 43	},
 44	{
 45		.compatible = "st,iis2mdc",
 46		.data = IIS2MDC_MAGN_DEV_NAME,
 47	},
 48	{
 49		.compatible = "st,lsm303c-magn",
 50		.data = LSM303C_MAGN_DEV_NAME,
 51	},
 52	{}
 53};
 54MODULE_DEVICE_TABLE(of, st_magn_of_match);
 55
 56static int st_magn_spi_probe(struct spi_device *spi)
 57{
 58	const struct st_sensor_settings *settings;
 59	struct st_sensor_data *mdata;
 60	struct iio_dev *indio_dev;
 61	int err;
 62
 63	st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias));
 64
 65	settings = st_magn_get_settings(spi->modalias);
 66	if (!settings) {
 67		dev_err(&spi->dev, "device name %s not recognized.\n",
 68			spi->modalias);
 69		return -ENODEV;
 70	}
 71
 72	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*mdata));
 73	if (!indio_dev)
 74		return -ENOMEM;
 75
 76	mdata = iio_priv(indio_dev);
 77	mdata->sensor_settings = (struct st_sensor_settings *)settings;
 78
 79	err = st_sensors_spi_configure(indio_dev, spi);
 80	if (err < 0)
 81		return err;
 82
 83	err = st_sensors_power_enable(indio_dev);
 84	if (err)
 85		return err;
 86
 87	return st_magn_common_probe(indio_dev);
 88}
 89
 90static const struct spi_device_id st_magn_id_table[] = {
 91	{ LIS3MDL_MAGN_DEV_NAME },
 92	{ LSM303AGR_MAGN_DEV_NAME },
 93	{ LIS2MDL_MAGN_DEV_NAME },
 94	{ LSM9DS1_MAGN_DEV_NAME },
 95	{ IIS2MDC_MAGN_DEV_NAME },
 96	{ LSM303C_MAGN_DEV_NAME },
 97	{},
 98};
 99MODULE_DEVICE_TABLE(spi, st_magn_id_table);
100
101static struct spi_driver st_magn_driver = {
102	.driver = {
103		.name = "st-magn-spi",
104		.of_match_table = st_magn_of_match,
105	},
106	.probe = st_magn_spi_probe,
107	.id_table = st_magn_id_table,
108};
109module_spi_driver(st_magn_driver);
110
111MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
112MODULE_DESCRIPTION("STMicroelectronics magnetometers spi driver");
113MODULE_LICENSE("GPL v2");
114MODULE_IMPORT_NS(IIO_ST_SENSORS);