Commit d9e8fd04 authored by Stefan Popa's avatar Stefan Popa Committed by Jonathan Cameron

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: default avatarStefan Popa <stefan.popa@analog.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 7ac34682
...@@ -548,6 +548,7 @@ M: Stefan Popa <stefan.popa@analog.com> ...@@ -548,6 +548,7 @@ M: Stefan Popa <stefan.popa@analog.com>
W: http://ez.analog.com/community/linux-device-drivers W: http://ez.analog.com/community/linux-device-drivers
S: Supported S: Supported
F: drivers/iio/accel/adxl372.c F: drivers/iio/accel/adxl372.c
F: drivers/iio/accel/adxl372_spi.c
F: Documentation/devicetree/bindings/iio/accel/adxl372.txt F: Documentation/devicetree/bindings/iio/accel/adxl372.txt
AF9013 MEDIA DRIVER AF9013 MEDIA DRIVER
......
...@@ -61,15 +61,20 @@ config ADXL345_SPI ...@@ -61,15 +61,20 @@ config ADXL345_SPI
for the core module. for the core module.
config ADXL372 config ADXL372
tristate "Analog Devices ADXL372 3-Axis Accelerometer Driver" tristate
depends on SPI
select IIO_BUFFER select IIO_BUFFER
select IIO_TRIGGERED_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 help
Say yes here to add support for the Analog Devices ADXL372 triaxial Say yes here to add support for the Analog Devices ADXL372 triaxial
acceleration sensor. acceleration sensor.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called adxl372. module will be called adxl372_spi.
config BMA180 config BMA180
tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver" tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver"
......
...@@ -10,6 +10,7 @@ obj-$(CONFIG_ADXL345) += adxl345_core.o ...@@ -10,6 +10,7 @@ obj-$(CONFIG_ADXL345) += adxl345_core.o
obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o
obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.o obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.o
obj-$(CONFIG_ADXL372) += adxl372.o obj-$(CONFIG_ADXL372) += adxl372.o
obj-$(CONFIG_ADXL372_SPI) += adxl372_spi.o
obj-$(CONFIG_BMA180) += bma180.o obj-$(CONFIG_BMA180) += bma180.o
obj-$(CONFIG_BMA220) += bma220_spi.o obj-$(CONFIG_BMA220) += bma220_spi.o
obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o
......
// SPDX-License-Identifier: GPL-2.0+ // 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. * Copyright 2018 Analog Devices Inc.
*/ */
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include <linux/iio/trigger_consumer.h> #include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h> #include <linux/iio/triggered_buffer.h>
#include "adxl372.h"
/* ADXL372 registers definition */ /* ADXL372 registers definition */
#define ADXL372_DEVID 0x00 #define ADXL372_DEVID 0x00
#define ADXL372_DEVID_MST 0x01 #define ADXL372_DEVID_MST 0x01
...@@ -246,7 +248,8 @@ static const struct iio_chan_spec adxl372_channels[] = { ...@@ -246,7 +248,8 @@ static const struct iio_chan_spec adxl372_channels[] = {
}; };
struct adxl372_state { struct adxl372_state {
struct spi_device *spi; int irq;
struct device *dev;
struct regmap *regmap; struct regmap *regmap;
struct iio_trigger *dready_trig; struct iio_trigger *dready_trig;
enum adxl372_fifo_mode fifo_mode; enum adxl372_fifo_mode fifo_mode;
...@@ -565,7 +568,7 @@ static int adxl372_setup(struct adxl372_state *st) ...@@ -565,7 +568,7 @@ static int adxl372_setup(struct adxl372_state *st)
return ret; return ret;
if (regval != ADXL372_DEVID_VAL) { 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; return -ENODEV;
} }
...@@ -891,56 +894,45 @@ static const struct iio_info adxl372_info = { ...@@ -891,56 +894,45 @@ static const struct iio_info adxl372_info = {
.hwfifo_set_watermark = adxl372_set_watermark, .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); return (reg == ADXL372_FIFO_DATA);
} }
EXPORT_SYMBOL_GPL(adxl372_readable_noinc_reg);
static const struct regmap_config adxl372_spi_regmap_config = { int adxl372_probe(struct device *dev, struct regmap *regmap,
.reg_bits = 7, int irq, const char *name)
.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)
{ {
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct adxl372_state *st; struct adxl372_state *st;
struct regmap *regmap;
int ret; int ret;
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
if (!indio_dev) if (!indio_dev)
return -ENOMEM; return -ENOMEM;
st = iio_priv(indio_dev); st = iio_priv(indio_dev);
spi_set_drvdata(spi, indio_dev); dev_set_drvdata(dev, indio_dev);
st->spi = spi;
regmap = devm_regmap_init_spi(spi, &adxl372_spi_regmap_config);
if (IS_ERR(regmap))
return PTR_ERR(regmap);
st->dev = dev;
st->regmap = regmap; st->regmap = regmap;
st->irq = irq;
indio_dev->channels = adxl372_channels; indio_dev->channels = adxl372_channels;
indio_dev->num_channels = ARRAY_SIZE(adxl372_channels); indio_dev->num_channels = ARRAY_SIZE(adxl372_channels);
indio_dev->available_scan_masks = adxl372_channel_masks; indio_dev->available_scan_masks = adxl372_channel_masks;
indio_dev->dev.parent = &spi->dev; indio_dev->dev.parent = dev;
indio_dev->name = spi_get_device_id(spi)->name; indio_dev->name = name;
indio_dev->info = &adxl372_info; indio_dev->info = &adxl372_info;
indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE; indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
ret = adxl372_setup(st); ret = adxl372_setup(st);
if (ret < 0) { if (ret < 0) {
dev_err(&st->spi->dev, "ADXL372 setup failed\n"); dev_err(dev, "ADXL372 setup failed\n");
return ret; return ret;
} }
ret = devm_iio_triggered_buffer_setup(&st->spi->dev, ret = devm_iio_triggered_buffer_setup(dev,
indio_dev, NULL, indio_dev, NULL,
adxl372_trigger_handler, adxl372_trigger_handler,
&adxl372_buffer_ops); &adxl372_buffer_ops);
...@@ -949,8 +941,8 @@ static int adxl372_probe(struct spi_device *spi) ...@@ -949,8 +941,8 @@ static int adxl372_probe(struct spi_device *spi)
iio_buffer_set_attrs(indio_dev->buffer, adxl372_fifo_attributes); iio_buffer_set_attrs(indio_dev->buffer, adxl372_fifo_attributes);
if (st->spi->irq) { if (st->irq) {
st->dready_trig = devm_iio_trigger_alloc(&st->spi->dev, st->dready_trig = devm_iio_trigger_alloc(dev,
"%s-dev%d", "%s-dev%d",
indio_dev->name, indio_dev->name,
indio_dev->id); indio_dev->id);
...@@ -958,15 +950,15 @@ static int adxl372_probe(struct spi_device *spi) ...@@ -958,15 +950,15 @@ static int adxl372_probe(struct spi_device *spi)
return -ENOMEM; return -ENOMEM;
st->dready_trig->ops = &adxl372_trigger_ops; 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); 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) if (ret < 0)
return ret; return ret;
indio_dev->trig = iio_trigger_get(st->dready_trig); 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, iio_trigger_generic_data_rdy_poll,
NULL, NULL,
IRQF_TRIGGER_RISING | IRQF_ONESHOT, IRQF_TRIGGER_RISING | IRQF_ONESHOT,
...@@ -975,24 +967,9 @@ static int adxl372_probe(struct spi_device *spi) ...@@ -975,24 +967,9 @@ static int adxl372_probe(struct spi_device *spi)
return ret; return ret;
} }
return devm_iio_device_register(&st->spi->dev, indio_dev); return devm_iio_device_register(dev, indio_dev);
} }
EXPORT_SYMBOL_GPL(adxl372_probe);
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);
MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>"); MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer driver"); MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer driver");
......
/* 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_ */
// 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");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment