linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
@ 2017-02-28  2:37 Eva Rachel Retuya
  2017-02-28  2:37 ` [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding Eva Rachel Retuya
                   ` (4 more replies)
  0 siblings, 5 replies; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-02-28  2:37 UTC (permalink / raw)
  To: jic23, linux-iio
  Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
	daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
	robh+dt, mark.rutland, devicetree, Eva Rachel Retuya

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 v4:
[PATCH 1/4]
* Update subject-prefix 
* Update node name from "adxl345@unit-address" to "accelerometer@unit-address"
Patches 2-4
* 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                          | 26 ++++++-
 drivers/iio/accel/Makefile                         |  4 +-
 drivers/iio/accel/adxl345.h                        | 18 +++++
 drivers/iio/accel/{adxl345.c => adxl345_core.c}    | 89 +++++++++-------------
 drivers/iio/accel/adxl345_i2c.c                    | 78 +++++++++++++++++++
 drivers/iio/accel/adxl345_spi.c                    | 83 ++++++++++++++++++++
 7 files changed, 281 insertions(+), 55 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} (62%)
 create mode 100644 drivers/iio/accel/adxl345_i2c.c
 create mode 100644 drivers/iio/accel/adxl345_spi.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding
  2017-02-28  2:37 [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
@ 2017-02-28  2:37 ` Eva Rachel Retuya
  2017-03-03  6:20   ` Rob Herring
  2017-02-28  2:37 ` [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-02-28  2:37 UTC (permalink / raw)
  To: jic23, linux-iio
  Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
	daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
	robh+dt, mark.rutland, devicetree, Eva Rachel Retuya

Add the device tree binding documentation for the ADXL345 3-axis digital
accelerometer.

Signed-off-by: Eva Rachel Retuya <eraretuya@gmail.com>
---
Changes from v4:
* Update subject-prefix 
* Update node name from "adxl345@unit-address" to "accelerometer@unit-address"

 .../devicetree/bindings/iio/accel/adxl345.txt      | 38 ++++++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/accel/adxl345.txt

diff --git a/Documentation/devicetree/bindings/iio/accel/adxl345.txt b/Documentation/devicetree/bindings/iio/accel/adxl345.txt
new file mode 100644
index 0000000..e7111b0
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/accel/adxl345.txt
@@ -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>;
+	};
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access
  2017-02-28  2:37 [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
  2017-02-28  2:37 ` [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding Eva Rachel Retuya
@ 2017-02-28  2:37 ` Eva Rachel Retuya
  2017-03-03 16:44   ` Andy Shevchenko
  2017-02-28  2:37 ` [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-02-28  2:37 UTC (permalink / raw)
  To: jic23, linux-iio
  Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
	daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
	robh+dt, mark.rutland, devicetree, 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 <eraretuya@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
Changes from v4:
* Add Andy's Reviewed-by tag

Changes from v3:
* 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.

 drivers/iio/accel/Kconfig   |  1 +
 drivers/iio/accel/adxl345.c | 66 +++++++++++++++++++++++++++++----------------
 2 files changed, 44 insertions(+), 23 deletions(-)

diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 2308bac..26b8614 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -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.
diff --git a/drivers/iio/accel/adxl345.c b/drivers/iio/accel/adxl345.c
index c34991f..bec8bec 100644
--- a/drivers/iio/accel/adxl345.c
+++ b/drivers/iio/accel/adxl345.c
@@ -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,							\
@@ -70,6 +76,7 @@ static int adxl345_read_raw(struct iio_dev *indio_dev,
 {
 	struct adxl345_data *data = iio_priv(indio_dev);
 	int ret;
+	__le16 regval;
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
@@ -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, &regval,
+				       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 device *dev;
+	struct regmap *regmap;
 	int ret;
+	u32 regval;
+
+	regmap = devm_regmap_init_i2c(client, &adxl345_regmap_config);
+	if (IS_ERR(regmap)) {
+		dev_err(&client->dev, "Error initializing regmap: %d\n",
+			(int)PTR_ERR(regmap));
+		return PTR_ERR(regmap);
+	}
+
+	dev = regmap_get_device(regmap);
 
-	ret = i2c_smbus_read_byte_data(client, ADXL345_REG_DEVID);
+	ret = regmap_read(regmap, ADXL345_REG_DEVID, &regval);
 	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[] = {
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C
  2017-02-28  2:37 [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
  2017-02-28  2:37 ` [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding Eva Rachel Retuya
  2017-02-28  2:37 ` [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
@ 2017-02-28  2:37 ` Eva Rachel Retuya
  2017-03-03 16:51   ` Andy Shevchenko
  2017-02-28  2:37 ` [PATCH v5 4/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
  2017-03-01 23:22 ` [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add " Andy Shevchenko
  4 siblings, 1 reply; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-02-28  2:37 UTC (permalink / raw)
  To: jic23, linux-iio
  Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
	daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
	robh+dt, mark.rutland, devicetree, 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 <eraretuya@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
Changes from v4:
* Add Andy's Reviewed-by tag

Changes from v3:
* Revert to explicit and separate I2C and SPI configuration
* Add OF match table, make it enumerable in ACPI environment (Andy's suggestion)

 drivers/iio/accel/Kconfig                       | 11 +++-
 drivers/iio/accel/Makefile                      |  3 +-
 drivers/iio/accel/adxl345.h                     | 18 ++++++
 drivers/iio/accel/{adxl345.c => adxl345_core.c} | 55 ++++-------------
 drivers/iio/accel/adxl345_i2c.c                 | 78 +++++++++++++++++++++++++
 5 files changed, 117 insertions(+), 48 deletions(-)
 create mode 100644 drivers/iio/accel/adxl345.h
 rename drivers/iio/accel/{adxl345.c => adxl345_core.c} (78%)
 create mode 100644 drivers/iio/accel/adxl345_i2c.c

diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 26b8614..9f5a889 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -6,16 +6,21 @@
 menu "Accelerometers"
 
 config ADXL345
-	tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver"
+	tristate
+
+config ADXL345_I2C
+	tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver"
 	depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)
 	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"
diff --git a/drivers/iio/accel/Makefile b/drivers/iio/accel/Makefile
index 618488d..3f4a6d6 100644
--- a/drivers/iio/accel/Makefile
+++ b/drivers/iio/accel/Makefile
@@ -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
diff --git a/drivers/iio/accel/adxl345.h b/drivers/iio/accel/adxl345.h
new file mode 100644
index 0000000..fca3e25
--- /dev/null
+++ b/drivers/iio/accel/adxl345.h
@@ -0,0 +1,18 @@
+/*
+ * ADXL345 3-Axis Digital Accelerometer
+ *
+ * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@gmail.com>
+ *
+ * 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_common_probe(struct device *dev, struct regmap *regmap,
+			 const char *name);
+int adxl345_common_remove(struct device *dev);
+
+#endif /* _ADXL345_H_ */
diff --git a/drivers/iio/accel/adxl345.c b/drivers/iio/accel/adxl345_core.c
similarity index 78%
rename from drivers/iio/accel/adxl345.c
rename to drivers/iio/accel/adxl345_core.c
index bec8bec..9dea6a5 100644
--- a/drivers/iio/accel/adxl345.c
+++ b/drivers/iio/accel/adxl345_core.c
@@ -7,17 +7,16 @@
  * 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)
+ * IIO core driver for ADXL345
  */
 
-#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 +49,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 +101,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_common_probe(struct device *dev, struct regmap *regmap,
+			 const char *name)
 {
 	struct adxl345_data *data;
 	struct iio_dev *indio_dev;
-	struct device *dev;
-	struct regmap *regmap;
 	int ret;
 	u32 regval;
 
-	regmap = devm_regmap_init_i2c(client, &adxl345_regmap_config);
-	if (IS_ERR(regmap)) {
-		dev_err(&client->dev, "Error initializing regmap: %d\n",
-			(int)PTR_ERR(regmap));
-		return PTR_ERR(regmap);
-	}
-
-	dev = regmap_get_device(regmap);
-
 	ret = regmap_read(regmap, ADXL345_REG_DEVID, &regval);
 	if (ret < 0) {
 		dev_err(dev, "Error reading device ID: %d\n", ret);
@@ -156,7 +139,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 +162,11 @@ static int adxl345_probe(struct i2c_client *client,
 
 	return ret;
 }
+EXPORT_SYMBOL_GPL(adxl345_common_probe);
 
-static int adxl345_remove(struct i2c_client *client)
+int adxl345_common_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 +174,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_common_remove);
 
 MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>");
-MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer driver");
+MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer core driver");
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/iio/accel/adxl345_i2c.c b/drivers/iio/accel/adxl345_i2c.c
new file mode 100644
index 0000000..19053be
--- /dev/null
+++ b/drivers/iio/accel/adxl345_i2c.c
@@ -0,0 +1,78 @@
+/*
+ * ADXL345 3-Axis Digital Accelerometer
+ *
+ * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@gmail.com>
+ *
+ * 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.
+ *
+ * I2C 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 "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;
+	const char *name = NULL;
+
+	regmap = devm_regmap_init_i2c(client, &adxl345_i2c_regmap_config);
+	if (IS_ERR(regmap)) {
+		dev_err(&client->dev, "Error initializing i2c regmap: %d\n",
+			(int)PTR_ERR(regmap));
+		return PTR_ERR(regmap);
+	}
+
+	if (id)
+		name = id->name;
+
+	return adxl345_common_probe(&client->dev, regmap, name);
+}
+
+static int adxl345_i2c_remove(struct i2c_client *client)
+{
+	return adxl345_common_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 <eraretuya@gmail.com>");
+MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer I2C driver");
+MODULE_LICENSE("GPL v2");
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v5 4/4] iio: accel: adxl345: Add SPI support
  2017-02-28  2:37 [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
                   ` (2 preceding siblings ...)
  2017-02-28  2:37 ` [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
@ 2017-02-28  2:37 ` Eva Rachel Retuya
  2017-03-03 16:55   ` Andy Shevchenko
  2017-03-01 23:22 ` [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add " Andy Shevchenko
  4 siblings, 1 reply; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-02-28  2:37 UTC (permalink / raw)
  To: jic23, linux-iio
  Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
	daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
	robh+dt, mark.rutland, devicetree, 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 <eraretuya@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---
Changes from v4:
* Add Andy's Reviewed-by tag

Changes from v3:
* Revert to explicit and separate I2C and SPI configuration
* Add OF match table, make it enumerable in ACPI environment (Andy's suggestion)

 drivers/iio/accel/Kconfig       | 14 +++++++
 drivers/iio/accel/Makefile      |  1 +
 drivers/iio/accel/adxl345_spi.c | 83 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 98 insertions(+)
 create mode 100644 drivers/iio/accel/adxl345_spi.c

diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 9f5a889..8994175 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -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=y || INPUT_ADXL34X=m)
+	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
diff --git a/drivers/iio/accel/Makefile b/drivers/iio/accel/Makefile
index 3f4a6d6..31fba19 100644
--- a/drivers/iio/accel/Makefile
+++ b/drivers/iio/accel/Makefile
@@ -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
diff --git a/drivers/iio/accel/adxl345_spi.c b/drivers/iio/accel/adxl345_spi.c
new file mode 100644
index 0000000..b7c2e7f
--- /dev/null
+++ b/drivers/iio/accel/adxl345_spi.c
@@ -0,0 +1,83 @@
+/*
+ * ADXL345 3-Axis Digital Accelerometer
+ *
+ * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@gmail.com>
+ *
+ * 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.
+ *
+ * SPI driver for ADXL345
+ */
+
+#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)
+{
+	struct regmap *regmap;
+	const struct spi_device_id *id = spi_get_device_id(spi);
+
+	/* 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: %d\n",
+			(int)PTR_ERR(regmap));
+		return PTR_ERR(regmap);
+	}
+
+	return adxl345_common_probe(&spi->dev, regmap, id->name);
+}
+
+static int adxl345_spi_remove(struct spi_device *spi)
+{
+	return adxl345_common_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 <eraretuya@gmail.com>");
+MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer SPI driver");
+MODULE_LICENSE("GPL v2");
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
  2017-02-28  2:37 [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
                   ` (3 preceding siblings ...)
  2017-02-28  2:37 ` [PATCH v5 4/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
@ 2017-03-01 23:22 ` Andy Shevchenko
  2017-03-02  3:02   ` Eva Rachel Retuya
  4 siblings, 1 reply; 16+ messages in thread
From: Andy Shevchenko @ 2017-03-01 23:22 UTC (permalink / raw)
  To: Eva Rachel Retuya
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> 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.

If I knew you are going to send new version I would have commented on v4...

>
> Changes from v4:
> [PATCH 1/4]
> * Update subject-prefix
> * Update node name from "adxl345@unit-address" to "accelerometer@unit-address"
> Patches 2-4
> * 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                          | 26 ++++++-
>  drivers/iio/accel/Makefile                         |  4 +-
>  drivers/iio/accel/adxl345.h                        | 18 +++++
>  drivers/iio/accel/{adxl345.c => adxl345_core.c}    | 89 +++++++++-------------
>  drivers/iio/accel/adxl345_i2c.c                    | 78 +++++++++++++++++++
>  drivers/iio/accel/adxl345_spi.c                    | 83 ++++++++++++++++++++
>  7 files changed, 281 insertions(+), 55 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} (62%)
>  create mode 100644 drivers/iio/accel/adxl345_i2c.c
>  create mode 100644 drivers/iio/accel/adxl345_spi.c
>
> --
> 2.7.4
>



-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
  2017-03-01 23:22 ` [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add " Andy Shevchenko
@ 2017-03-02  3:02   ` Eva Rachel Retuya
  2017-03-02 19:59     ` Jonathan Cameron
  0 siblings, 1 reply; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-03-02  3:02 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Thu, Mar 02, 2017 at 01:22:11AM +0200, Andy Shevchenko wrote:
> On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> > 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.
> 
> If I knew you are going to send new version I would have commented on v4...
> 

Hi Andy,

Please state your comments and I will submit a new revision.

Thanks,
Eva

> >
> > Changes from v4:
> > [PATCH 1/4]
> > * Update subject-prefix
> > * Update node name from "adxl345@unit-address" to "accelerometer@unit-address"
> > Patches 2-4
> > * 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                          | 26 ++++++-
> >  drivers/iio/accel/Makefile                         |  4 +-
> >  drivers/iio/accel/adxl345.h                        | 18 +++++
> >  drivers/iio/accel/{adxl345.c => adxl345_core.c}    | 89 +++++++++-------------
> >  drivers/iio/accel/adxl345_i2c.c                    | 78 +++++++++++++++++++
> >  drivers/iio/accel/adxl345_spi.c                    | 83 ++++++++++++++++++++
> >  7 files changed, 281 insertions(+), 55 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} (62%)
> >  create mode 100644 drivers/iio/accel/adxl345_i2c.c
> >  create mode 100644 drivers/iio/accel/adxl345_spi.c
> >
> > --
> > 2.7.4
> >
> 
> 
> 
> -- 
> With Best Regards,
> Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
  2017-03-02  3:02   ` Eva Rachel Retuya
@ 2017-03-02 19:59     ` Jonathan Cameron
  2017-03-03 16:57       ` Andy Shevchenko
  0 siblings, 1 reply; 16+ messages in thread
From: Jonathan Cameron @ 2017-03-02 19:59 UTC (permalink / raw)
  To: Andy Shevchenko, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On 02/03/17 03:02, Eva Rachel Retuya wrote:
> On Thu, Mar 02, 2017 at 01:22:11AM +0200, Andy Shevchenko wrote:
>> On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
>>> 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.
>>
>> If I knew you are going to send new version I would have commented on v4...
>>
> 
> Hi Andy,
> 
> Please state your comments and I will submit a new revision.
> 
> Thanks,
> Eva
Looks good to me so I'll probably pick this up over the weekend unless you want
to make a V6 with anything from Andy.  Can always send follow up patches later
for any issues highlighted.

Ideally we 'might' have devicetree ack by then, but given you have fixed
the one issue raised in the review, I may not wait for that (can add it in the
week it'll inevitably sit in my testing branch for!)

Jonathan
> 
>>>
>>> Changes from v4:
>>> [PATCH 1/4]
>>> * Update subject-prefix
>>> * Update node name from "adxl345@unit-address" to "accelerometer@unit-address"
>>> Patches 2-4
>>> * 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                          | 26 ++++++-
>>>  drivers/iio/accel/Makefile                         |  4 +-
>>>  drivers/iio/accel/adxl345.h                        | 18 +++++
>>>  drivers/iio/accel/{adxl345.c => adxl345_core.c}    | 89 +++++++++-------------
>>>  drivers/iio/accel/adxl345_i2c.c                    | 78 +++++++++++++++++++
>>>  drivers/iio/accel/adxl345_spi.c                    | 83 ++++++++++++++++++++
>>>  7 files changed, 281 insertions(+), 55 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} (62%)
>>>  create mode 100644 drivers/iio/accel/adxl345_i2c.c
>>>  create mode 100644 drivers/iio/accel/adxl345_spi.c
>>>
>>> --
>>> 2.7.4
>>>
>>
>>
>>
>> -- 
>> With Best Regards,
>> Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding
  2017-02-28  2:37 ` [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding Eva Rachel Retuya
@ 2017-03-03  6:20   ` Rob Herring
  0 siblings, 0 replies; 16+ messages in thread
From: Rob Herring @ 2017-03-03  6:20 UTC (permalink / raw)
  To: Eva Rachel Retuya
  Cc: jic23, linux-iio, knaack.h, lars, pmeerw, dmitry.torokhov,
	michael.hennerich, daniel.baluta, amsfield22, florian.vaussard,
	linux-kernel, mark.rutland, devicetree

On Tue, Feb 28, 2017 at 10:37:16AM +0800, Eva Rachel Retuya wrote:
> Add the device tree binding documentation for the ADXL345 3-axis digital
> accelerometer.
> 
> Signed-off-by: Eva Rachel Retuya <eraretuya@gmail.com>
> ---
> Changes from v4:
> * Update subject-prefix 
> * Update node name from "adxl345@unit-address" to "accelerometer@unit-address"
> 
>  .../devicetree/bindings/iio/accel/adxl345.txt      | 38 ++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/accel/adxl345.txt

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access
  2017-02-28  2:37 ` [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
@ 2017-03-03 16:44   ` Andy Shevchenko
  2017-03-04  5:52     ` Eva Rachel Retuya
  0 siblings, 1 reply; 16+ messages in thread
From: Andy Shevchenko @ 2017-03-03 16:44 UTC (permalink / raw)
  To: Eva Rachel Retuya
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> 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 <eraretuya@gmail.com>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

Okay, my another set of comments.
> @@ -70,6 +76,7 @@ static int adxl345_read_raw(struct iio_dev *indio_dev,
>  {
>         struct adxl345_data *data = iio_priv(indio_dev);

>         int ret;
> +       __le16 regval;

Reverse tree order, please.

     __le16 regval;
     int ret;

> @@ -104,37 +112,50 @@ static int adxl345_probe(struct i2c_client *client,
>  {
>         struct adxl345_data *data;
>         struct iio_dev *indio_dev;
> +       struct device *dev;
> +       struct regmap *regmap;

>         int ret;
> +       u32 regval;

Ditto.

> +
> +       regmap = devm_regmap_init_i2c(client, &adxl345_regmap_config);
> +       if (IS_ERR(regmap)) {
> +               dev_err(&client->dev, "Error initializing regmap: %d\n",
> +                       (int)PTR_ERR(regmap));

I don't like explicit casting in such cases at all. Why not to use
%ld? Same for the similar places in the series.

> -       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);

So, originally it was in decimal form. Does hex looks better or what
is behind the change?

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C
  2017-02-28  2:37 ` [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
@ 2017-03-03 16:51   ` Andy Shevchenko
  2017-03-04  5:56     ` Eva Rachel Retuya
  0 siblings, 1 reply; 16+ messages in thread
From: Andy Shevchenko @ 2017-03-03 16:51 UTC (permalink / raw)
  To: Eva Rachel Retuya
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> 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.

Portion of minor comments.

> +config ADXL345_I2C
> +       tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver"

>         depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)

I'm wondering if it works in a form of

depends on INPUT_ADXL34X=n

> +int adxl345_common_probe(struct device *dev, struct regmap *regmap,
> +                        const char *name);
> +int adxl345_common_remove(struct device *dev);

I think a "common" word is redundant.

> - * IIO driver for ADXL345
> - * 7-bit I2C slave address: 0x1D (ALT ADDRESS pin tied to VDDIO) or
> - * 0x53 (ALT ADDRESS pin grounded)

> + * IIO core driver for ADXL345

Should not it be at the beginning of header comment?

> +static int adxl345_i2c_probe(struct i2c_client *client,
> +                            const struct i2c_device_id *id)
> +{

> +       struct regmap *regmap;
> +       const char *name = NULL;

Reverse tree order, please.

> +
> +       regmap = devm_regmap_init_i2c(client, &adxl345_i2c_regmap_config);
> +       if (IS_ERR(regmap)) {
> +               dev_err(&client->dev, "Error initializing i2c regmap: %d\n",
> +                       (int)PTR_ERR(regmap));
> +               return PTR_ERR(regmap);
> +       }
> +

> +       if (id)
> +               name = id->name;
> +
> +       return adxl345_common_probe(&client->dev, regmap, name);

Do you need temporary variable?

return adxl345_probe(&client->dev, regmap, id ? id->name : NULL);

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 4/4] iio: accel: adxl345: Add SPI support
  2017-02-28  2:37 ` [PATCH v5 4/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
@ 2017-03-03 16:55   ` Andy Shevchenko
  2017-03-04  6:00     ` Eva Rachel Retuya
  0 siblings, 1 reply; 16+ messages in thread
From: Andy Shevchenko @ 2017-03-03 16:55 UTC (permalink / raw)
  To: Eva Rachel Retuya
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> 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.

Portion of minor comments.

> +config ADXL345_SPI
> +       tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer SPI Driver"

> +       depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)

Same question. Would it be just

depends on INPUT_ADXL34X=n

?

> +        /* Setting bits 7 and 6 enables multiple-byte read */
> +       .read_flag_mask = BIT(7) | BIT(6),

GENMASK(7, 6) ?

> +static int adxl345_spi_probe(struct spi_device *spi)
> +{

> +       struct regmap *regmap;
> +       const struct spi_device_id *id = spi_get_device_id(spi);

Reverse order.

And usually we do assignments from function parameters first.

> +               dev_err(&spi->dev, "Error initializing spi regmap: %d\n",
> +                       (int)PTR_ERR(regmap));

Ugly casting!

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
  2017-03-02 19:59     ` Jonathan Cameron
@ 2017-03-03 16:57       ` Andy Shevchenko
  0 siblings, 0 replies; 16+ messages in thread
From: Andy Shevchenko @ 2017-03-03 16:57 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: linux-iio, Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald,
	Dmitry Torokhov, Michael Hennerich, Daniel Baluta,
	Alison Schofield, Florian Vaussard, linux-kernel, Rob Herring,
	Mark Rutland, devicetree

On Thu, Mar 2, 2017 at 9:59 PM, Jonathan Cameron <jic23@kernel.org> wrote:
> On 02/03/17 03:02, Eva Rachel Retuya wrote:
>> On Thu, Mar 02, 2017 at 01:22:11AM +0200, Andy Shevchenko wrote:
>>> On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
>>>> This patchset modifies the adxl345 to use regmap. In doing so, we can
>>>> easily introduce SPI support and let regmap handle the rest.

>> Please state your comments and I will submit a new revision.

Just did.

> Looks good to me so I'll probably pick this up over the weekend unless you want
> to make a V6 with anything from Andy.  Can always send follow up patches later
> for any issues highlighted.

Yep, feel free incorporate now, or fix later (though I prefer now :-) )

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access
  2017-03-03 16:44   ` Andy Shevchenko
@ 2017-03-04  5:52     ` Eva Rachel Retuya
  0 siblings, 0 replies; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-03-04  5:52 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Fri, Mar 03, 2017 at 06:44:27PM +0200, Andy Shevchenko wrote:
> On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> > 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 <eraretuya@gmail.com>
> > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> 
> Okay, my another set of comments.
> > @@ -70,6 +76,7 @@ static int adxl345_read_raw(struct iio_dev *indio_dev,
> >  {
> >         struct adxl345_data *data = iio_priv(indio_dev);
> 
> >         int ret;
> > +       __le16 regval;
> 
> Reverse tree order, please.
> 
>      __le16 regval;
>      int ret;
> 

Ack.

> > @@ -104,37 +112,50 @@ static int adxl345_probe(struct i2c_client *client,
> >  {
> >         struct adxl345_data *data;
> >         struct iio_dev *indio_dev;
> > +       struct device *dev;
> > +       struct regmap *regmap;
> 
> >         int ret;
> > +       u32 regval;
> 
> Ditto.
> 
> > +
> > +       regmap = devm_regmap_init_i2c(client, &adxl345_regmap_config);
> > +       if (IS_ERR(regmap)) {
> > +               dev_err(&client->dev, "Error initializing regmap: %d\n",
> > +                       (int)PTR_ERR(regmap));
> 
> I don't like explicit casting in such cases at all. Why not to use
> %ld? Same for the similar places in the series.
> 

OK. Will do that instead.

> > -       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);
> 
> So, originally it was in decimal form. Does hex looks better or what
> is behind the change?

Yes it looks better. I made the change to make it easily seen what it
read in hex compared to the known DEVID.

Thanks,
Eva

> 
> -- 
> With Best Regards,
> Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C
  2017-03-03 16:51   ` Andy Shevchenko
@ 2017-03-04  5:56     ` Eva Rachel Retuya
  0 siblings, 0 replies; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-03-04  5:56 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Fri, Mar 03, 2017 at 06:51:28PM +0200, Andy Shevchenko wrote:
> On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> > 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.
> 
> Portion of minor comments.
> 
> > +config ADXL345_I2C
> > +       tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver"
> 
> >         depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)
> 
> I'm wondering if it works in a form of
> 
> depends on INPUT_ADXL34X=n
> 

Yes it works. Will change it into this form.

> > +int adxl345_common_probe(struct device *dev, struct regmap *regmap,
> > +                        const char *name);
> > +int adxl345_common_remove(struct device *dev);
> 
> I think a "common" word is redundant.
> 

OK. I will use "core" instead.

> > - * IIO driver for ADXL345
> > - * 7-bit I2C slave address: 0x1D (ALT ADDRESS pin tied to VDDIO) or
> > - * 0x53 (ALT ADDRESS pin grounded)
> 
> > + * IIO core driver for ADXL345
> 
> Should not it be at the beginning of header comment?
> 

Ack.

> > +static int adxl345_i2c_probe(struct i2c_client *client,
> > +                            const struct i2c_device_id *id)
> > +{
> 
> > +       struct regmap *regmap;
> > +       const char *name = NULL;
> 
> Reverse tree order, please.
> 
> > +
> > +       regmap = devm_regmap_init_i2c(client, &adxl345_i2c_regmap_config);
> > +       if (IS_ERR(regmap)) {
> > +               dev_err(&client->dev, "Error initializing i2c regmap: %d\n",
> > +                       (int)PTR_ERR(regmap));
> > +               return PTR_ERR(regmap);
> > +       }
> > +
> 
> > +       if (id)
> > +               name = id->name;
> > +
> > +       return adxl345_common_probe(&client->dev, regmap, name);
> 
> Do you need temporary variable?
> 
> return adxl345_probe(&client->dev, regmap, id ? id->name : NULL);
> 

Will remove it and use the form you suggest.

Thanks,
Eva

> -- 
> With Best Regards,
> Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v5 4/4] iio: accel: adxl345: Add SPI support
  2017-03-03 16:55   ` Andy Shevchenko
@ 2017-03-04  6:00     ` Eva Rachel Retuya
  0 siblings, 0 replies; 16+ messages in thread
From: Eva Rachel Retuya @ 2017-03-04  6:00 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Jonathan Cameron, linux-iio, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald, Dmitry Torokhov, Michael Hennerich,
	Daniel Baluta, Alison Schofield, Florian Vaussard, linux-kernel,
	Rob Herring, Mark Rutland, devicetree

On Fri, Mar 03, 2017 at 06:55:26PM +0200, Andy Shevchenko wrote:
> On Tue, Feb 28, 2017 at 4:37 AM, Eva Rachel Retuya <eraretuya@gmail.com> wrote:
> > 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.
> 
> Portion of minor comments.
> 
> > +config ADXL345_SPI
> > +       tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer SPI Driver"
> 
> > +       depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)
> 
> Same question. Would it be just
> 
> depends on INPUT_ADXL34X=n
> 
> ?
> 
> > +        /* Setting bits 7 and 6 enables multiple-byte read */
> > +       .read_flag_mask = BIT(7) | BIT(6),
> 
> GENMASK(7, 6) ?
> 

True, but I would like to keep this as is. It is more readable and
obvious than GENMASK().

> > +static int adxl345_spi_probe(struct spi_device *spi)
> > +{
> 
> > +       struct regmap *regmap;
> > +       const struct spi_device_id *id = spi_get_device_id(spi);
> 
> Reverse order.
> 
> And usually we do assignments from function parameters first.

Ack.

Thanks,
Eva
> 
> > +               dev_err(&spi->dev, "Error initializing spi regmap: %d\n",
> > +                       (int)PTR_ERR(regmap));
> 
> Ugly casting!
> 
> -- 
> With Best Regards,
> Andy Shevchenko

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2017-03-04  6:27 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-28  2:37 [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
2017-02-28  2:37 ` [PATCH v5 1/4] dt-bindings: iio: accel: Document ADXL345 accelerometer binding Eva Rachel Retuya
2017-03-03  6:20   ` Rob Herring
2017-02-28  2:37 ` [PATCH v5 2/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
2017-03-03 16:44   ` Andy Shevchenko
2017-03-04  5:52     ` Eva Rachel Retuya
2017-02-28  2:37 ` [PATCH v5 3/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
2017-03-03 16:51   ` Andy Shevchenko
2017-03-04  5:56     ` Eva Rachel Retuya
2017-02-28  2:37 ` [PATCH v5 4/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
2017-03-03 16:55   ` Andy Shevchenko
2017-03-04  6:00     ` Eva Rachel Retuya
2017-03-01 23:22 ` [PATCH v5 0/4] iio: accel: adxl345: Split driver into core and I2C then add " Andy Shevchenko
2017-03-02  3:02   ` Eva Rachel Retuya
2017-03-02 19:59     ` Jonathan Cameron
2017-03-03 16:57       ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).