iio: adxl372: Refactor the driver
This patch restructures the existing adxl372 driver by adding a module for SPI and a header file, while the baseline module deals with the chip-logic. This is a necessary step, as this driver should support in the future a similar device which differs only in the type of interface used (I2C instead of SPI). Signed-off-by: Stefan Popa <stefan.popa@analog.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Родитель
7ac346823b
Коммит
d9e8fd0421
|
@ -548,6 +548,7 @@ M: Stefan Popa <stefan.popa@analog.com>
|
|||
W: http://ez.analog.com/community/linux-device-drivers
|
||||
S: Supported
|
||||
F: drivers/iio/accel/adxl372.c
|
||||
F: drivers/iio/accel/adxl372_spi.c
|
||||
F: Documentation/devicetree/bindings/iio/accel/adxl372.txt
|
||||
|
||||
AF9013 MEDIA DRIVER
|
||||
|
|
|
@ -61,15 +61,20 @@ config ADXL345_SPI
|
|||
for the core module.
|
||||
|
||||
config ADXL372
|
||||
tristate "Analog Devices ADXL372 3-Axis Accelerometer Driver"
|
||||
depends on SPI
|
||||
tristate
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
|
||||
config ADXL372_SPI
|
||||
tristate "Analog Devices ADXL372 3-Axis Accelerometer SPI Driver"
|
||||
depends on SPI
|
||||
select ADXL372
|
||||
select REGMAP_SPI
|
||||
help
|
||||
Say yes here to add support for the Analog Devices ADXL372 triaxial
|
||||
acceleration sensor.
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called adxl372.
|
||||
module will be called adxl372_spi.
|
||||
|
||||
config BMA180
|
||||
tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver"
|
||||
|
|
|
@ -10,6 +10,7 @@ obj-$(CONFIG_ADXL345) += adxl345_core.o
|
|||
obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o
|
||||
obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.o
|
||||
obj-$(CONFIG_ADXL372) += adxl372.o
|
||||
obj-$(CONFIG_ADXL372_SPI) += adxl372_spi.o
|
||||
obj-$(CONFIG_BMA180) += bma180.o
|
||||
obj-$(CONFIG_BMA220) += bma220_spi.o
|
||||
obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* ADXL372 3-Axis Digital Accelerometer SPI driver
|
||||
* ADXL372 3-Axis Digital Accelerometer core driver
|
||||
*
|
||||
* Copyright 2018 Analog Devices Inc.
|
||||
*/
|
||||
|
@ -20,6 +20,8 @@
|
|||
#include <linux/iio/trigger_consumer.h>
|
||||
#include <linux/iio/triggered_buffer.h>
|
||||
|
||||
#include "adxl372.h"
|
||||
|
||||
/* ADXL372 registers definition */
|
||||
#define ADXL372_DEVID 0x00
|
||||
#define ADXL372_DEVID_MST 0x01
|
||||
|
@ -246,7 +248,8 @@ static const struct iio_chan_spec adxl372_channels[] = {
|
|||
};
|
||||
|
||||
struct adxl372_state {
|
||||
struct spi_device *spi;
|
||||
int irq;
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
struct iio_trigger *dready_trig;
|
||||
enum adxl372_fifo_mode fifo_mode;
|
||||
|
@ -565,7 +568,7 @@ static int adxl372_setup(struct adxl372_state *st)
|
|||
return ret;
|
||||
|
||||
if (regval != ADXL372_DEVID_VAL) {
|
||||
dev_err(&st->spi->dev, "Invalid chip id %x\n", regval);
|
||||
dev_err(st->dev, "Invalid chip id %x\n", regval);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -891,56 +894,45 @@ static const struct iio_info adxl372_info = {
|
|||
.hwfifo_set_watermark = adxl372_set_watermark,
|
||||
};
|
||||
|
||||
static bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)
|
||||
bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
return (reg == ADXL372_FIFO_DATA);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adxl372_readable_noinc_reg);
|
||||
|
||||
static const struct regmap_config adxl372_spi_regmap_config = {
|
||||
.reg_bits = 7,
|
||||
.pad_bits = 1,
|
||||
.val_bits = 8,
|
||||
.read_flag_mask = BIT(0),
|
||||
.readable_noinc_reg = adxl372_readable_noinc_reg,
|
||||
};
|
||||
|
||||
static int adxl372_probe(struct spi_device *spi)
|
||||
int adxl372_probe(struct device *dev, struct regmap *regmap,
|
||||
int irq, const char *name)
|
||||
{
|
||||
struct iio_dev *indio_dev;
|
||||
struct adxl372_state *st;
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
|
||||
indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
|
||||
if (!indio_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
st = iio_priv(indio_dev);
|
||||
spi_set_drvdata(spi, indio_dev);
|
||||
|
||||
st->spi = spi;
|
||||
|
||||
regmap = devm_regmap_init_spi(spi, &adxl372_spi_regmap_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
dev_set_drvdata(dev, indio_dev);
|
||||
|
||||
st->dev = dev;
|
||||
st->regmap = regmap;
|
||||
st->irq = irq;
|
||||
|
||||
indio_dev->channels = adxl372_channels;
|
||||
indio_dev->num_channels = ARRAY_SIZE(adxl372_channels);
|
||||
indio_dev->available_scan_masks = adxl372_channel_masks;
|
||||
indio_dev->dev.parent = &spi->dev;
|
||||
indio_dev->name = spi_get_device_id(spi)->name;
|
||||
indio_dev->dev.parent = dev;
|
||||
indio_dev->name = name;
|
||||
indio_dev->info = &adxl372_info;
|
||||
indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
|
||||
|
||||
ret = adxl372_setup(st);
|
||||
if (ret < 0) {
|
||||
dev_err(&st->spi->dev, "ADXL372 setup failed\n");
|
||||
dev_err(dev, "ADXL372 setup failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_iio_triggered_buffer_setup(&st->spi->dev,
|
||||
ret = devm_iio_triggered_buffer_setup(dev,
|
||||
indio_dev, NULL,
|
||||
adxl372_trigger_handler,
|
||||
&adxl372_buffer_ops);
|
||||
|
@ -949,8 +941,8 @@ static int adxl372_probe(struct spi_device *spi)
|
|||
|
||||
iio_buffer_set_attrs(indio_dev->buffer, adxl372_fifo_attributes);
|
||||
|
||||
if (st->spi->irq) {
|
||||
st->dready_trig = devm_iio_trigger_alloc(&st->spi->dev,
|
||||
if (st->irq) {
|
||||
st->dready_trig = devm_iio_trigger_alloc(dev,
|
||||
"%s-dev%d",
|
||||
indio_dev->name,
|
||||
indio_dev->id);
|
||||
|
@ -958,15 +950,15 @@ static int adxl372_probe(struct spi_device *spi)
|
|||
return -ENOMEM;
|
||||
|
||||
st->dready_trig->ops = &adxl372_trigger_ops;
|
||||
st->dready_trig->dev.parent = &st->spi->dev;
|
||||
st->dready_trig->dev.parent = dev;
|
||||
iio_trigger_set_drvdata(st->dready_trig, indio_dev);
|
||||
ret = devm_iio_trigger_register(&st->spi->dev, st->dready_trig);
|
||||
ret = devm_iio_trigger_register(dev, st->dready_trig);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
indio_dev->trig = iio_trigger_get(st->dready_trig);
|
||||
|
||||
ret = devm_request_threaded_irq(&st->spi->dev, st->spi->irq,
|
||||
ret = devm_request_threaded_irq(dev, st->irq,
|
||||
iio_trigger_generic_data_rdy_poll,
|
||||
NULL,
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
|
@ -975,24 +967,9 @@ static int adxl372_probe(struct spi_device *spi)
|
|||
return ret;
|
||||
}
|
||||
|
||||
return devm_iio_device_register(&st->spi->dev, indio_dev);
|
||||
return devm_iio_device_register(dev, indio_dev);
|
||||
}
|
||||
|
||||
static const struct spi_device_id adxl372_id[] = {
|
||||
{ "adxl372", 0 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, adxl372_id);
|
||||
|
||||
static struct spi_driver adxl372_driver = {
|
||||
.driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
},
|
||||
.probe = adxl372_probe,
|
||||
.id_table = adxl372_id,
|
||||
};
|
||||
|
||||
module_spi_driver(adxl372_driver);
|
||||
EXPORT_SYMBOL_GPL(adxl372_probe);
|
||||
|
||||
MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
|
||||
MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer driver");
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* ADXL372 3-Axis Digital Accelerometer
|
||||
*
|
||||
* Copyright 2018 Analog Devices Inc.
|
||||
*/
|
||||
|
||||
#ifndef _ADXL372_H_
|
||||
#define _ADXL372_H_
|
||||
|
||||
int adxl372_probe(struct device *dev, struct regmap *regmap,
|
||||
int irq, const char *name);
|
||||
bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg);
|
||||
|
||||
#endif /* _ADXL372_H_ */
|
|
@ -0,0 +1,52 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* ADXL372 3-Axis Digital Accelerometer SPI driver
|
||||
*
|
||||
* Copyright 2018 Analog Devices Inc.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include "adxl372.h"
|
||||
|
||||
static const struct regmap_config adxl372_spi_regmap_config = {
|
||||
.reg_bits = 7,
|
||||
.pad_bits = 1,
|
||||
.val_bits = 8,
|
||||
.read_flag_mask = BIT(0),
|
||||
.readable_noinc_reg = adxl372_readable_noinc_reg,
|
||||
};
|
||||
|
||||
static int adxl372_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
const struct spi_device_id *id = spi_get_device_id(spi);
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = devm_regmap_init_spi(spi, &adxl372_spi_regmap_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
return adxl372_probe(&spi->dev, regmap, spi->irq, id->name);
|
||||
}
|
||||
|
||||
static const struct spi_device_id adxl372_spi_id[] = {
|
||||
{ "adxl372", 0 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, adxl372_spi_id);
|
||||
|
||||
static struct spi_driver adxl372_spi_driver = {
|
||||
.driver = {
|
||||
.name = "adxl372_spi",
|
||||
},
|
||||
.probe = adxl372_spi_probe,
|
||||
.id_table = adxl372_spi_id,
|
||||
};
|
||||
|
||||
module_spi_driver(adxl372_spi_driver);
|
||||
|
||||
MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
|
||||
MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer SPI driver");
|
||||
MODULE_LICENSE("GPL");
|
Загрузка…
Ссылка в новой задаче