iio: accel: adxl345: Split driver into core and I2C then add SPI support
Subsystems (3)
v6 cover iio: accel: adxl345: Split driver into core and I2C then add SPI support
This patchset modifies the adxl345 to use regmap. In doing so, we can easily introduce SPI support and let regmap handle the rest.
Recap of basic features: read_raw for x, y and z axes, scale. After applying this series, driver now supports the SPI protocol and enumeration of device via device tree.
Changes from v5:
[PATCH 1/4]
* Add Rob's Acked-by tag
[PATCH 2/4]
* Re-order local variable declarations from longest to shortest line
* Remove explicit casting to int in handling devm_regmap_init_i2c() error, use %ld instead
[PATCH 3/4]
* Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
* Rename functions from *_common_* to *_core_*
* Modify header comment: place indication at the beginning
* Remove explicit casting to int in handling devm_regmap_init_i2c() error, use %ld instead
* Remove temporary variable 'name'
[PATCH 4/4]
* Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
* Modify header comment: place indication at the beginning
* Re-order local variable declarations from longest to shortest line
* Remove explicit casting to int in handling devm_regmap_init_spi() error, use %ld instead
* Rename functions calls from *_common_* to *_core_*
Changes from v4:
* Update subject-prefix of [PATCH 1/4]
* Update node name from "adxl345@unit-address" to "accelerometer@unit-address"
* Add Andy's Reviewed-by tag
Changes from v3:
[PATCH 1/4]
* None
[PATCH 2/4]
* Keep intact I2C client structure which was deleted from v3
* Make use of regmap_get_device to retrieve struct device, use these for debugging prints instead of &client->dev.
[PATCH 3/4] and [PATCH 4/4]
* Revert to explicit and separate I2C and SPI configuration
* Add OF match table, make it enumerable in ACPI environment (Andy's suggestion)
Changes from v2:
* Drop PATCH 4 iio: accel: adxl345: Add ACPI support
* Add OF match table on both I2C and SPI files and document them
Changes from v1:
[PATCH 1/4]
* Move other deletions from patch 2 in here -- make it clear what got deleted and/or modified that is hard to see previously
* Introduce the driver header file "adxl345.h" here instead of doing it in the next patch
* Completely omit traces of i2c_client and let this file (adxl345.c) mirror the core file on the next patch.
* Improve debugging print about invalid device ID in probe.
[PATCH 2/4]
* Update Kconfig to Jonathan's preferred style
* Improve similarity index from 78% to 100% (rename detection) [PATCH 4/4]
* Correct acpi_device_id: ADX0345 -> ADS0345
Eva Rachel Retuya (4):
dt-bindings: iio: accel: Document ADXL345 accelerometer binding
iio: accel: adxl345: Use I2C regmap instead of direct I2C access
iio: accel: adxl345: Split driver into core and I2C
iio: accel: adxl345: Add SPI support
.../devicetree/bindings/iio/accel/adxl345.txt | 38 +++++++++
drivers/iio/accel/Kconfig | 28 ++++++-
drivers/iio/accel/Makefile | 4 +-
drivers/iio/accel/adxl345.h | 18 +++++
drivers/iio/accel/{adxl345.c => adxl345_core.c} | 91 +++++++++-------------
drivers/iio/accel/adxl345_i2c.c | 73 +++++++++++++++++
drivers/iio/accel/adxl345_spi.c | 81 +++++++++++++++++++
7 files changed, 275 insertions(+), 58 deletions(-)
create mode 100644 Documentation/devicetree/bindings/iio/accel/adxl345.txt
create mode 100644 drivers/iio/accel/adxl345.h
rename drivers/iio/accel/{adxl345.c => adxl345_core.c} (61%)
create mode 100644 drivers/iio/accel/adxl345_i2c.c
create mode 100644 drivers/iio/accel/adxl345_spi.cSignature · 1 line
2.7.4
PATCH v6 1/4 dt-bindings: iio: accel: Document ADXL345 accelerometer binding
Add the device tree binding documentation for the ADXL345 3-axis digital accelerometer.
---
Change from v5:
* Add Rob's Acked-by tag
.../devicetree/bindings/iio/accel/adxl345.txt | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/accel/adxl345.txt
Documentation/devicetree/bindings/iio/accel/adxl345.txt new file +38 -0
@@ -0,0 +1,38 @@ +Analog Devices ADXL345 3-Axis, +/-(2g/4g/8g/16g) Digital Accelerometer + +http://www.analog.com/en/products/mems/accelerometers/adxl345.html + +Required properties: + - compatible : should be "adi,adxl345" + - reg : the I2C address or SPI chip select number of the sensor + +Required properties for SPI bus usage: + - spi-max-frequency : set maximum clock frequency, must be 5000000 + - spi-cpol and spi-cpha : must be defined for adxl345 to enable SPI mode 3 + +Optional properties: + - interrupt-parent : phandle to the parent interrupt controller as documented + in Documentation/devicetree/bindings/interrupt-controller/interrupts.txt + - interrupts: interrupt mapping for IRQ as documented in + Documentation/devicetree/bindings/interrupt-controller/interrupts.txt + +Example for a I2C device node: + + accelerometer@2a { + compatible = "adi,adxl345"; + reg = <0x53>; + interrupt-parent = <&gpio1>; + interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; + }; + +Example for a SPI device node: + + accelerometer@0 { + compatible = "adi,adxl345"; + reg = <0>; + spi-max-frequency = <5000000>; + spi-cpol; + spi-cpha; + interrupt-parent = <&gpio1>; + interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; + };
Signature · 1 line
2.7.4
Jonathan Cameron
maintainerRe: [PATCH v6 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding
Quoted 5 lines · Eva Rachel Retuya
Add the device tree binding documentation for the ADXL345 3-axis digital accelerometer.
Signed-off-by Eva Rachel Retuya <[email protected]>Acked-by Rob Herring <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with.
Thanks,
Jonathan
Quoted 43 lines
---
Change from v5:
* Add Rob's Acked-by tag.../devicetree/bindings/iio/accel/adxl345.txt | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/accel/adxl345.txtDocumentation/devicetree/bindings/iio/accel/adxl345.txt new file +28
-0@@ -0,0 +1,38 @@ +Analog Devices ADXL345 3-Axis, +/-(2g/4g/8g/16g) Digital Accelerometer + +http://www.analog.com/en/products/mems/accelerometers/adxl345.html + +Required properties: + - compatible : should be "adi,adxl345" + - reg : the I2C address or SPI chip select number of the sensor + +Required properties for SPI bus usage: + - spi-max-frequency : set maximum clock frequency, must be 5000000 + - spi-cpol and spi-cpha : must be defined for adxl345 to enable SPI mode 3 + +Optional properties: + - interrupt-parent : phandle to the parent interrupt controller as documented + in Documentation/devicetree/bindings/interrupt-controller/interrupts.txt + - interrupts: interrupt mapping for IRQ as documented in + Documentation/devicetree/bindings/interrupt-controller/interrupts.txt + +Example for a I2C device node: + + accelerometer@2a { + compatible = "adi,adxl345"; + reg = <0x53>; + interrupt-parent = <&gpio1>; + interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; + }; + +Example for a SPI device node:
Documentation/devicetree/bindings/iio/accel/adxl345.txt line 38
Quoted 10 lines
Documentation/devicetree/bindings/iio/accel/adxl345.txt new file +10
-0+ + accelerometer@0 { + compatible = "adi,adxl345"; + reg = <0>; + spi-max-frequency = <5000000>; + spi-cpol; + spi-cpha; + interrupt-parent = <&gpio1>; + interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; + };
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v6 2/4 iio: accel: adxl345: Use I2C regmap instead of direct I2C access
In reply to Eva Rachel RetuyaConvert the driver to use regmap instead of I2C-specific functions. This is done in preparation for splitting this driver into core and I2C-specific code as well as introduction of SPI driver.
---
Changes from v5:
* Re-order local variable declarations from longest to shortest line
* Remove explicit casting to int in handling devm_regmap_init_i2c() error, use %ld instead
drivers/iio/accel/Kconfig | 1 + drivers/iio/accel/adxl345.c | 66 +++++++++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 23 deletions(-)
drivers/iio/accel/Kconfig +1 -0
@@ -9,6 +9,7 @@ config ADXL345 tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver" depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m) depends on I2C + select REGMAP_I2C help Say Y here if you want to build support for the Analog Devices ADXL345 3-axis digital accelerometer.
drivers/iio/accel/adxl345.c +43 -23
140 lines not on this page · raw message
Signature · 1 line
2.7.4
Jonathan Cameron
maintainerRe: [PATCH v6 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access
Quoted 6 lines · Eva Rachel Retuya
Convert the driver to use regmap instead of I2C-specific functions. This is done in preparation for splitting this driver into core and I2C-specific code as well as introduction of SPI driver.
Signed-off-by Eva Rachel Retuya <[email protected]>Reviewed-by Andy Shevchenko <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 3 lines
---
Changes from v5:
* Re-order local variable declarations from longest to shortest line
Whilst I've no objection to this, it's definitely more of a personal taste thing than anything. Probably wise to just agree though as quicker than arguing and Andy did say they were minor points that he would have done differently rather than important!
Quoted 171 lines
* Remove explicit casting to int in handling
devm_regmap_init_i2c()error, use %ld insteaddrivers/iio/accel/Kconfig | 1 + drivers/iio/accel/adxl345.c | 66 +++++++++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 23 deletions(-)drivers/iio/accel/Kconfig +1
-0@@ -9,6 +9,7 @@ config ADXL345 tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver" depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m) depends on I2C + select REGMAP_I2C help Say Y here if you want to build support for the Analog Devices ADXL345 3-axis digital accelerometer.drivers/iio/accel/adxl345.c +43
-23@@ -14,6 +14,7 @@#include <linux/i2c.h> #include <linux/module.h> +#include <linux/regmap.h> #include <linux/iio/iio.h> @@ -45,10 +46,15 @@static const int adxl345_uscale =38300 ;struct adxl345_data { -struct i2c_client *client; +struct regmap *regmap;u8 data_range; }; +static const struct regmap_config adxl345_regmap_config = { + .reg_bits =8 , + .val_bits =8 , +}; +#define ADXL345_CHANNEL (reg, axis) { \ .type = IIO_ACCEL, \ .modified = 1, \@@ -69,6 +75,7 @@ static int adxl345_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { struct adxl345_data *data = iio_priv(indio_dev); +__le16 regval;int ret;switch (mask) {@@ -78,11 +85,12 @@ static int adxl345_read_raw(struct iio_dev *indio_dev,* ADXL345_REG_DATA(X0/Y0/Z0) contain the least significant byte * and ADXL345_REG_DATA(X0/Y0/Z0) + 1 the most significant byte */ - ret =i2c_smbus_read_word_data (data->client, chan->address); + ret =regmap_bulk_read (data->regmap, chan->address, ®val, +sizeof (regval));if (ret <0 )return ret; - *val =sign_extend32 (ret,12 ); + *val =sign_extend32 (le16_to_cpu (regval),12 );return IIO_VAL_INT ;case IIO_CHAN_INFO_SCALE : *val =0 ;@@ -104,37 +112,50 @@ static int adxl345_probe(struct i2c_client *client, {struct adxl345_data *data;struct iio_dev *indio_dev; +struct regmap *regmap; +struct device *dev; +u32 regval;int ret; - ret =i2c_smbus_read_byte_data (client,ADXL345_REG_DEVID ); + regmap =devm_regmap_init_i2c (client, &adxl345_regmap_config); +if (IS_ERR (regmap)) { +dev_err (&client->dev,"Error initializing regmap: %ld\n" , +PTR_ERR (regmap)); +return PTR_ERR (regmap); + } + + dev =regmap_get_device (regmap); + + ret =regmap_read (regmap,ADXL345_REG_DEVID , ®val);if (ret <0 ) { -dev_err (&client->dev,"Error reading device ID: %d\n" , ret); +dev_err (dev,"Error reading device ID: %d\n" , ret);return ret; } -if (ret !=ADXL345_DEVID ) { -dev_err (&client->dev,"Invalid device ID: %d\n" , ret); +if (regval !=ADXL345_DEVID ) { +dev_err (dev,"Invalid device ID: %x, expected %x\n" , + regval,ADXL345_DEVID );return -ENODEV ; } - indio_dev =devm_iio_device_alloc (&client->dev,sizeof (*data)); + indio_dev =devm_iio_device_alloc (dev,sizeof (*data));if (!indio_dev)return -ENOMEM ; data =iio_priv (indio_dev); -i2c_set_clientdata (client, indio_dev); - data->client = client; +dev_set_drvdata (dev, indio_dev); + data->regmap = regmap;/* Enable full-resolution mode */ data->data_range =ADXL345_DATA_FORMAT_FULL_RES ; - ret =i2c_smbus_write_byte_data (data->client,ADXL345_REG_DATA_FORMAT , - data->data_range); + ret =regmap_write (data->regmap,ADXL345_REG_DATA_FORMAT , + data->data_range);if (ret <0 ) { -dev_err (&client->dev,"Failed to set data range: %d\n" , ret); +dev_err (dev,"Failed to set data range: %d\n" , ret);return ret; } - indio_dev->dev.parent = &client->dev; + indio_dev->dev.parent = dev; indio_dev->name = id->name; indio_dev->info = &adxl345_info; indio_dev->modes =INDIO_DIRECT_MODE ;@@ -142,19 +163,18 @@ static int adxl345_probe(struct i2c_client *client, indio_dev->num_channels =ARRAY_SIZE (adxl345_channels);/* Enable measurement mode */ - ret =i2c_smbus_write_byte_data (data->client,ADXL345_REG_POWER_CTL , -ADXL345_POWER_CTL_MEASURE ); + ret =regmap_write (data->regmap,ADXL345_REG_POWER_CTL , +ADXL345_POWER_CTL_MEASURE );if (ret <0 ) { -dev_err (&client->dev,"Failed to enable measurement mode: %d\n" , - ret); +dev_err (dev,"Failed to enable measurement mode: %d\n" , ret);return ret; } ret =iio_device_register (indio_dev);if (ret <0 ) { -dev_err (&client->dev,"iio_device_register failed: %d\n" , ret); -i2c_smbus_write_byte_data (data->client,ADXL345_REG_POWER_CTL , -ADXL345_POWER_CTL_STANDBY ); +dev_err (dev,"iio_device_register failed: %d\n" , ret); +regmap_write (data->regmap,ADXL345_REG_POWER_CTL , +ADXL345_POWER_CTL_STANDBY ); }return ret;@@ -167,8 +187,8 @@ static int adxl345_remove(struct i2c_client *client)iio_device_unregister (indio_dev); -return i2c_smbus_write_byte_data (data->client,ADXL345_REG_POWER_CTL , -ADXL345_POWER_CTL_STANDBY ); +return regmap_write (data->regmap,ADXL345_REG_POWER_CTL , +ADXL345_POWER_CTL_STANDBY ); }static const struct i2c_device_id adxl345_i2c_id[] = {
PATCH v6 3/4 iio: accel: adxl345: Split driver into core and I2C
In reply to Eva Rachel RetuyaMove I2C-specific code into its own file and rely on regmap to access registers. The core code provides access to x, y, z and scale readings.
---
Changes from v5:
* Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
* Rename functions from *_common_* to *_core_*
* Modify header comment: place indication at the beginning
* Remove explicit casting to int in handling devm_regmap_init_i2c() error, use %ld instead
* Remove temporary variable 'name'
drivers/iio/accel/Kconfig | 13 +++--
drivers/iio/accel/Makefile | 3 +-
drivers/iio/accel/adxl345.h | 18 ++++++
drivers/iio/accel/{adxl345.c => adxl345_core.c} | 57 ++++---------------
drivers/iio/accel/adxl345_i2c.c | 73 +++++++++++++++++++++++++
5 files changed, 113 insertions(+), 51 deletions(-)
create mode 100644 drivers/iio/accel/adxl345.h
rename drivers/iio/accel/{adxl345.c => adxl345_core.c} (77%)
create mode 100644 drivers/iio/accel/adxl345_i2c.cdrivers/iio/accel/Kconfig +9 -4
@@ -6,16 +6,21 @@ menu "Accelerometers" config ADXL345 - tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver" - depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m) + tristate + +config ADXL345_I2C + tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver" + depends on INPUT_ADXL34X=n depends on I2C + select ADXL345 select REGMAP_I2C help Say Y here if you want to build support for the Analog Devices ADXL345 3-axis digital accelerometer. - To compile this driver as a module, choose M here: the - module will be called adxl345. + To compile this driver as a module, choose M here: the module + will be called adxl345_i2c and you will also get adxl345_core + for the core module. config BMA180 tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver"
drivers/iio/accel/Makefile +2 -1
@@ -3,7 +3,8 @@ # # When adding new entries keep the list in alphabetical order -obj-$(CONFIG_ADXL345) += adxl345.o +obj-$(CONFIG_ADXL345) += adxl345_core.o +obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o obj-$(CONFIG_BMA180) += bma180.o obj-$(CONFIG_BMA220) += bma220_spi.o obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o
drivers/iio/accel/adxl345.h new file +18 -0
@@ -0,0 +1,18 @@ +/* +* ADXL345 3-Axis Digital Accelerometer +* +* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> +* +* This file is subject to the terms and conditions of version 2 of +* the GNU General Public License. See the file COPYING in the main +* directory of this archive for more details. +*/ + +#ifndef _ADXL345_H_ +#define _ADXL345_H_ + +int adxl345_core_probe (struct device *dev,struct regmap *regmap, +const char *name); +int adxl345_core_remove (struct device *dev); + +#endif /* _ADXL345_H_ */
drivers/iio/accel/adxl345_core.c renamed from drivers/iio/accel/adxl345.c +11 -46
112 lines not on this page · raw message
drivers/iio/accel/adxl345_i2c.c new file +73 -0
73 lines not on this page · raw message
Signature · 1 line
2.7.4
Jonathan Cameron
maintainerRe: [PATCH v6 3/4] iio: accel: adxl345: Split driver into core and I2C
Quoted 5 lines · Eva Rachel Retuya
Move I2C-specific code into its own file and rely on regmap to access registers. The core code provides access to x, y, z and scale readings.
Signed-off-by Eva Rachel Retuya <[email protected]>Reviewed-by Andy Shevchenko <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 292 lines
---
Changes from v5:
* Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
* Rename functions from *_common_* to *_core_*
* Modify header comment: place indication at the beginning
* Remove explicit casting to int in handlingdevm_regmap_init_i2c()error, use %ld instead
* Remove temporary variable 'name'drivers/iio/accel/Kconfig | 13 +++-- drivers/iio/accel/Makefile | 3 +- drivers/iio/accel/adxl345.h | 18 ++++++ drivers/iio/accel/{adxl345.c => adxl345_core.c} | 57 ++++--------------- drivers/iio/accel/adxl345_i2c.c | 73 +++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 51 deletions(-) create mode 100644 drivers/iio/accel/adxl345.h rename drivers/iio/accel/{adxl345.c => adxl345_core.c} (77%) create mode 100644 drivers/iio/accel/adxl345_i2c.cdrivers/iio/accel/Kconfig +9
-4@@ -6,16 +6,21 @@ menu "Accelerometers" config ADXL345 - tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver" - depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m) + tristate + +config ADXL345_I2C + tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver" + depends on INPUT_ADXL34X=n depends on I2C + select ADXL345 select REGMAP_I2C help Say Y here if you want to build support for the Analog Devices ADXL345 3-axis digital accelerometer. - To compile this driver as a module, choose M here: the - module will be called adxl345. + To compile this driver as a module, choose M here: the module + will be called adxl345_i2c and you will also get adxl345_core + for the core module. config BMA180 tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver"drivers/iio/accel/Makefile +2
-1@@ -3,7 +3,8 @@ # # When adding new entries keep the list in alphabetical order -obj-$(CONFIG_ADXL345) += adxl345.o +obj-$(CONFIG_ADXL345) += adxl345_core.o +obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o obj-$(CONFIG_BMA180) += bma180.o obj-$(CONFIG_BMA220) += bma220_spi.o obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.odrivers/iio/accel/adxl345.h new file +18
-0@@ -0,0 +1,18 @@ +/* +* ADXL345 3-Axis Digital Accelerometer +* +* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> +* +* This file is subject to the terms and conditions of version 2 of +* the GNU General Public License. See the file COPYING in the main +* directory of this archive for more details. +*/ + +#ifndef _ADXL345_H_ +#define _ADXL345_H_ + +int adxl345_core_probe (struct device *dev,struct regmap *regmap, +const char *name); +int adxl345_core_remove (struct device *dev); + +#endif /* _ADXL345_H_ */ drivers/iio/accel/adxl345_core.c renamed from drivers/iio/accel/adxl345.c +11
-46@@ -1,23 +1,20 @@/* -* ADXL345 3-Axis Digital Accelerometer +* ADXL345 3-Axis Digital Accelerometer IIO core driver * * Copyright (c) 2017 Eva Rachel Retuya <[email protected]> * * This file is subject to the terms and conditions of version 2 of * the GNU General Public License. See the file COPYING in the main * directory of this archive for more details. -* -* IIO driver for ADXL345 -* 7-bit I2C slave address: 0x1D (ALT ADDRESS pin tied to VDDIO) or -* 0x53 (ALT ADDRESS pin grounded) */ -#include <linux/i2c.h> #include <linux/module.h> #include <linux/regmap.h> #include <linux/iio/iio.h> +#include "adxl345.h" +#define ADXL345_REG_DEVID 0x00#define ADXL345_REG_POWER_CTL 0x2D#define ADXL345_REG_DATA_FORMAT 0x31@@ -50,11 +47,6 @@ struct adxl345_data {u8 data_range; }; -static const struct regmap_config adxl345_regmap_config = { - .reg_bits =8 , - .val_bits =8 , -}; -#define ADXL345_CHANNEL (reg, axis) { \ .type = IIO_ACCEL, \ .modified = 1, \@@ -107,25 +99,14 @@ static const struct iio_info adxl345_info = { .read_raw = adxl345_read_raw, }; -static int adxl345_probe (struct i2c_client *client, -const struct i2c_device_id *id) +int adxl345_core_probe (struct device *dev,struct regmap *regmap, +const char *name) {struct adxl345_data *data;struct iio_dev *indio_dev; -struct regmap *regmap; -struct device *dev;u32 regval;int ret; - regmap =devm_regmap_init_i2c (client, &adxl345_regmap_config); -if (IS_ERR (regmap)) { -dev_err (&client->dev,"Error initializing regmap: %ld\n" , -PTR_ERR (regmap)); -return PTR_ERR (regmap); - } - - dev =regmap_get_device (regmap); - ret =regmap_read (regmap,ADXL345_REG_DEVID , ®val);if (ret <0 ) {dev_err (dev,"Error reading device ID: %d\n" , ret);@@ -156,7 +137,7 @@ static int adxl345_probe(struct i2c_client *client, } indio_dev->dev.parent = dev; - indio_dev->name = id->name; + indio_dev->name = name; indio_dev->info = &adxl345_info; indio_dev->modes =INDIO_DIRECT_MODE ; indio_dev->channels = adxl345_channels;@@ -179,10 +160,11 @@ static int adxl345_probe(struct i2c_client *client,return ret; } +EXPORT_SYMBOL_GPL (adxl345_core_probe); -static int adxl345_remove (struct i2c_client *client) +int adxl345_core_remove (struct device *dev) { -struct iio_dev *indio_dev =i2c_get_clientdata (client); +struct iio_dev *indio_dev =dev_get_drvdata (dev);struct adxl345_data *data =iio_priv (indio_dev);iio_device_unregister (indio_dev);@@ -190,25 +172,8 @@ static int adxl345_remove(struct i2c_client *client)return regmap_write (data->regmap,ADXL345_REG_POWER_CTL ,ADXL345_POWER_CTL_STANDBY ); } - -static const struct i2c_device_id adxl345_i2c_id[] = { - {"adxl345" ,0 }, - { } -}; - -MODULE_DEVICE_TABLE (i2c, adxl345_i2c_id); - -static struct i2c_driver adxl345_driver = { - .driver = { - .name ="adxl345" , - }, - .probe = adxl345_probe, - .remove = adxl345_remove, - .id_table = adxl345_i2c_id, -}; - -module_i2c_driver (adxl345_driver); +EXPORT_SYMBOL_GPL (adxl345_core_remove);MODULE_AUTHOR ("Eva Rachel Retuya <[email protected]>" ); -MODULE_DESCRIPTION ("ADXL345 3-Axis Digital Accelerometer driver" ); +MODULE_DESCRIPTION ("ADXL345 3-Axis Digital Accelerometer core driver" );MODULE_LICENSE ("GPL v2" );drivers/iio/accel/adxl345_i2c.c new file +73
-0@@ -0,0 +1,73 @@ +/* +* ADXL345 3-Axis Digital Accelerometer I2C driver +* +* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> +* +* This file is subject to the terms and conditions of version 2 of +* the GNU General Public License. See the file COPYING in the main +* directory of this archive for more details. +* +* 7-bit I2C slave address: 0x1D (ALT ADDRESS pin tied to VDDIO) or +* 0x53 (ALT ADDRESS pin grounded) +*/ + +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/regmap.h> + +#include "adxl345.h" + +static const struct regmap_config adxl345_i2c_regmap_config = { + .reg_bits =8 , + .val_bits =8 , +}; + +static int adxl345_i2c_probe (struct i2c_client *client, +const struct i2c_device_id *id) +{ +struct regmap *regmap; + + regmap =devm_regmap_init_i2c (client, &adxl345_i2c_regmap_config); +if (IS_ERR (regmap)) { +dev_err (&client->dev,"Error initializing i2c regmap: %ld\n" , +PTR_ERR (regmap)); +return PTR_ERR (regmap); + } + +return adxl345_core_probe (&client->dev, regmap, id ? id->name :NULL ); +} + +static int adxl345_i2c_remove (struct i2c_client *client) +{ +return adxl345_core_remove (&client->dev); +} + +static const struct i2c_device_id adxl345_i2c_id[] = { + {"adxl345" ,0 }, + { } +}; + +MODULE_DEVICE_TABLE (i2c, adxl345_i2c_id); + +static const struct of_device_id adxl345_of_match[] = { + { .compatible ="adi,adxl345" }, + { }, +}; + +MODULE_DEVICE_TABLE (of, adxl345_of_match); + +static struct i2c_driver adxl345_i2c_driver = { + .driver = { + .name ="adxl345_i2c" , + .of_match_table = adxl345_of_match, + }, + .probe = adxl345_i2c_probe, + .remove = adxl345_i2c_remove, + .id_table = adxl345_i2c_id, +}; + +module_i2c_driver (adxl345_i2c_driver); + +MODULE_AUTHOR ("Eva Rachel Retuya <[email protected]>" ); +MODULE_DESCRIPTION ("ADXL345 3-Axis Digital Accelerometer I2C driver" ); +MODULE_LICENSE ("GPL v2" );
PATCH v6 4/4 iio: accel: adxl345: Add SPI support
In reply to Eva Rachel RetuyaAdd SPI driver that initializes SPI regmap for the adxl345 core driver. The driver supports the same functionality as I2C namely the x, y, z and scale readings.
---
Changes from v5:
* Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
* Modify header comment: place indication at the beginning
* Re-order local variable declarations from longest to shortest line
* Remove explicit casting to int in handling devm_regmap_init_spi() error, use %ld instead
* Rename functions calls from *_common_* to *_core_*
drivers/iio/accel/Kconfig | 14 +++++++ drivers/iio/accel/Makefile | 1 + drivers/iio/accel/adxl345_spi.c | 81 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 drivers/iio/accel/adxl345_spi.c
drivers/iio/accel/Kconfig +14 -0
@@ -22,6 +22,20 @@ config ADXL345_I2C will be called adxl345_i2c and you will also get adxl345_core for the core module. +config ADXL345_SPI + tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer SPI Driver" + depends on INPUT_ADXL34X=n + depends on SPI + select ADXL345 + select REGMAP_SPI + help + Say Y here if you want to build support for the Analog Devices + ADXL345 3-axis digital accelerometer. + + To compile this driver as a module, choose M here: the module + will be called adxl345_spi and you will also get adxl345_core + for the core module. + config BMA180 tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver" depends on I2C
drivers/iio/accel/Makefile +1 -0
@@ -5,6 +5,7 @@ # When adding new entries keep the list in alphabetical order obj-$(CONFIG_ADXL345) += adxl345_core.o obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o +obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.o obj-$(CONFIG_BMA180) += bma180.o obj-$(CONFIG_BMA220) += bma220_spi.o obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o
drivers/iio/accel/adxl345_spi.c new file +81 -0
81 lines not on this page · raw message
Signature · 1 line
2.7.4
Jonathan Cameron
maintainerRe: [PATCH v6 4/4] iio: accel: adxl345: Add SPI support
Quoted 6 lines · Eva Rachel Retuya
Add SPI driver that initializes SPI regmap for the adxl345 core driver. The driver supports the same functionality as I2C namely the x, y, z and scale readings.
Signed-off-by Eva Rachel Retuya <[email protected]>Reviewed-by Andy Shevchenko <[email protected]>
Applied to the togreg branch og iio.git and pushed out as testing.
Thanks,
Jonathan
Quoted 140 lines
---
Changes from v5:
* Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
* Modify header comment: place indication at the beginning
* Re-order local variable declarations from longest to shortest line
* Remove explicit casting to int in handlingdevm_regmap_init_spi()error, use %ld instead
* Rename functions calls from *_common_* to *_core_*drivers/iio/accel/Kconfig | 14 +++++++ drivers/iio/accel/Makefile | 1 + drivers/iio/accel/adxl345_spi.c | 81 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 drivers/iio/accel/adxl345_spi.cdrivers/iio/accel/Kconfig +14
-0@@ -22,6 +22,20 @@ config ADXL345_I2C will be called adxl345_i2c and you will also get adxl345_core for the core module. +config ADXL345_SPI + tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer SPI Driver" + depends on INPUT_ADXL34X=n + depends on SPI + select ADXL345 + select REGMAP_SPI + help + Say Y here if you want to build support for the Analog Devices + ADXL345 3-axis digital accelerometer. + + To compile this driver as a module, choose M here: the module + will be called adxl345_spi and you will also get adxl345_core + for the core module. + config BMA180 tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver" depends on I2Cdrivers/iio/accel/Makefile +1
-0@@ -5,6 +5,7 @@ # When adding new entries keep the list in alphabetical order obj-$(CONFIG_ADXL345) += adxl345_core.o obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o +obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.o obj-$(CONFIG_BMA180) += bma180.o obj-$(CONFIG_BMA220) += bma220_spi.o obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.odrivers/iio/accel/adxl345_spi.c new file +81
-0@@ -0,0 +1,81 @@ +/* +* ADXL345 3-Axis Digital Accelerometer SPI driver +* +* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> +* +* This file is subject to the terms and conditions of version 2 of +* the GNU General Public License. See the file COPYING in the main +* directory of this archive for more details. +*/ + +#include <linux/module.h> +#include <linux/regmap.h> +#include <linux/spi/spi.h> + +#include "adxl345.h" + +#define ADXL345_MAX_SPI_FREQ_HZ 5000000 + +static const struct regmap_config adxl345_spi_regmap_config = { + .reg_bits =8 , + .val_bits =8 , +/* Setting bits 7 and 6 enables multiple-byte read */ + .read_flag_mask =BIT (7 ) |BIT (6 ), +}; + +static int adxl345_spi_probe (struct spi_device *spi) +{ +const struct spi_device_id *id =spi_get_device_id (spi); +struct regmap *regmap; + +/* Bail out if max_speed_hz exceeds 5 MHz */ +if (spi->max_speed_hz >ADXL345_MAX_SPI_FREQ_HZ ) { +dev_err (&spi->dev,"SPI CLK, %d Hz exceeds 5 MHz\n" , + spi->max_speed_hz); +return -EINVAL ; + } + + regmap =devm_regmap_init_spi (spi, &adxl345_spi_regmap_config); +if (IS_ERR (regmap)) { +dev_err (&spi->dev,"Error initializing spi regmap: %ld\n" , +PTR_ERR (regmap)); +return PTR_ERR (regmap); + } + +return adxl345_core_probe (&spi->dev, regmap, id->name); +} + +static int adxl345_spi_remove (struct spi_device *spi) +{ +return adxl345_core_remove (&spi->dev); +} + +static const struct spi_device_id adxl345_spi_id[] = { + {"adxl345" ,0 }, + { } +}; + +MODULE_DEVICE_TABLE (spi, adxl345_spi_id); + +static const struct of_device_id adxl345_of_match[] = { + { .compatible ="adi,adxl345" }, + { }, +}; + +MODULE_DEVICE_TABLE (of, adxl345_of_match); + +static struct spi_driver adxl345_spi_driver = { + .driver = { + .name ="adxl345_spi" , + .of_match_table = adxl345_of_match, + }, + .probe = adxl345_spi_probe, + .remove = adxl345_spi_remove, + .id_table = adxl345_spi_id, +}; + +module_spi_driver (adxl345_spi_driver); + +MODULE_AUTHOR ("Eva Rachel Retuya <[email protected]>" ); +MODULE_DESCRIPTION ("ADXL345 3-Axis Digital Accelerometer SPI driver" ); +MODULE_LICENSE ("GPL v2" );