devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 00/12] iio: ad2s1200: Driver clean up
@ 2018-05-18 18:20 David Veenstra
  2018-05-18 18:21 ` [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license David Veenstra
                   ` (11 more replies)
  0 siblings, 12 replies; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:20 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

For v1 see [1], for v2 see [2], for v3 see [3].

A summary of this patch:
1. Clean up of minor code style issues.
2. Replace legacy GPIO ABI with modern ABI and remove usage of.
   platform data.
4. Add scaling factor for angular position and angular velocity to
   match the sysfs IIO ABI.
5. Add documentation for device tree binding
6. Move driver to main line.

Changes in v4:
- Some new minor code style fix ups.
- Move spi setup to before iio device registration.
- Add vendor prefix to gpios function name, and dt docs.
- Add device tree table
- Add copyright.

Best regards,
David Veenstra

[1] https://marc.info/?l=linux-iio&m=152137920426820&w=2
[2] https://marc.info/?l=linux-iio&m=152425250915148&w=2
[3] https://marc.info/?l=linux-iio&m=152443456824272&w=2

David Veenstra (12):
  staging: iio: ad2s1200: Remove unneeded newline in license
  staging: iio: ad2s1200: Remove unneeded initializations
  staging: iio: ad2s1200: Add kernel docs to driver state
  staging: iio: ad2s1200: Setup spi before iio device register
  staging: iio: ad2s1200: Replace legacy gpio API with modern API
  staging: iio: ad2s1200: Replace platform data with dt bindings
  staging: iio: ad2s1200: Add dt table
  dt-bindings: iio: resolver: Document AD2S1200 bindings
  staging: iio: ad2s1200: Add scaling factor for angular velocity
    channel
  staging: iio: ad2s1200: Add scaling factor for angle channel
  staging: iio: ad2s1200: Add copyright
  staging: iio: ad2s1200: Move driver out of staging

 .../bindings/iio/resolver/ad2s1200.txt        |  16 ++
 drivers/iio/Kconfig                           |   1 +
 drivers/iio/Makefile                          |   1 +
 drivers/iio/resolver/Kconfig                  |  17 ++
 drivers/iio/resolver/Makefile                 |   5 +
 drivers/iio/resolver/ad2s1200.c               | 210 ++++++++++++++++++
 drivers/staging/iio/resolver/Kconfig          |  12 -
 drivers/staging/iio/resolver/Makefile         |   1 -
 drivers/staging/iio/resolver/ad2s1200.c       | 168 --------------
 9 files changed, 250 insertions(+), 181 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt
 create mode 100644 drivers/iio/resolver/Kconfig
 create mode 100644 drivers/iio/resolver/Makefile
 create mode 100644 drivers/iio/resolver/ad2s1200.c
 delete mode 100644 drivers/staging/iio/resolver/ad2s1200.c

-- 
2.17.0

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

* [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
@ 2018-05-18 18:21 ` David Veenstra
  2018-05-20 10:52   ` Jonathan Cameron
  2018-05-18 18:21 ` [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations David Veenstra
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:21 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Remove unneeded newline in license, as it does not improve readability.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Introduced in this version.

 drivers/staging/iio/resolver/ad2s1200.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index ea7336645116..df3b34200a89 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -7,7 +7,6 @@
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
- *
  */
 
 #include <linux/bitops.h>
-- 
2.17.0

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

* [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
  2018-05-18 18:21 ` [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license David Veenstra
@ 2018-05-18 18:21 ` David Veenstra
  2018-05-20 10:53   ` Jonathan Cameron
  2018-05-18 18:21 ` [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state David Veenstra
                   ` (9 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:21 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Remove 2 initializations which are unneeded, because the
initialized values are never used.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Introduced in this version.

 drivers/staging/iio/resolver/ad2s1200.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index df3b34200a89..9bdcf0c86217 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -47,7 +47,7 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
 			     long m)
 {
 	struct ad2s1200_state *st = iio_priv(indio_dev);
-	int ret = 0;
+	int ret;
 
 	mutex_lock(&st->lock);
 	gpio_set_value(st->sample, 0);
@@ -105,7 +105,7 @@ static int ad2s1200_probe(struct spi_device *spi)
 	unsigned short *pins = spi->dev.platform_data;
 	struct ad2s1200_state *st;
 	struct iio_dev *indio_dev;
-	int pn, ret = 0;
+	int pn, ret;
 
 	for (pn = 0; pn < AD2S1200_PN; pn++) {
 		ret = devm_gpio_request_one(&spi->dev, pins[pn], GPIOF_DIR_OUT,
-- 
2.17.0

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

* [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
  2018-05-18 18:21 ` [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license David Veenstra
  2018-05-18 18:21 ` [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations David Veenstra
@ 2018-05-18 18:21 ` David Veenstra
  2018-05-20 10:53   ` Jonathan Cameron
  2018-05-18 18:21 ` [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register David Veenstra
                   ` (8 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:21 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Add missing kernel docs to the ad2s1200 driver state.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Simplified explanation of lock.

 drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 9bdcf0c86217..068aa86e9c11 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -32,6 +32,14 @@
 /* clock period in nano second */
 #define AD2S1200_TSCLK	(1000000000 / AD2S1200_HZ)
 
+/**
+ * struct ad2s1200_state - driver instance specific data.
+ * @lock:	protects both the GPIO pins and the rx buffer.
+ * @sdev:	spi device.
+ * @sample:	GPIO pin SAMPLE.
+ * @rdvel:	GPIO pin RDVEL.
+ * @rx:		buffer for spi transfers.
+ */
 struct ad2s1200_state {
 	struct mutex lock;
 	struct spi_device *sdev;
-- 
2.17.0

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

* [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (2 preceding siblings ...)
  2018-05-18 18:21 ` [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state David Veenstra
@ 2018-05-18 18:21 ` David Veenstra
  2018-05-20 10:55   ` Jonathan Cameron
  2018-05-18 18:21 ` [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API David Veenstra
                   ` (7 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:21 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

The spi should be set up before the device is registered as an iio
device.

This patch moves the setup to before the device registration.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Introduced in this version.

 drivers/staging/iio/resolver/ad2s1200.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 068aa86e9c11..430cc62591fe 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -143,15 +143,16 @@ static int ad2s1200_probe(struct spi_device *spi)
 	indio_dev->num_channels = ARRAY_SIZE(ad2s1200_channels);
 	indio_dev->name = spi_get_device_id(spi)->name;
 
-	ret = devm_iio_device_register(&spi->dev, indio_dev);
-	if (ret)
-		return ret;
-
 	spi->max_speed_hz = AD2S1200_HZ;
 	spi->mode = SPI_MODE_3;
-	spi_setup(spi);
+	ret = spi_setup(spi);
+
+	if (ret < 0) {
+		dev_err(&spi->dev, "spi_setup failed!\n");
+		return ret;
+	}
 
-	return 0;
+	return devm_iio_device_register(&spi->dev, indio_dev);
 }
 
 static const struct spi_device_id ad2s1200_id[] = {
-- 
2.17.0

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

* [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (3 preceding siblings ...)
  2018-05-18 18:21 ` [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register David Veenstra
@ 2018-05-18 18:21 ` David Veenstra
  2018-05-20 11:04   ` Jonathan Cameron
  2018-05-18 18:22 ` [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings David Veenstra
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:21 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

The legacy, integer based gpio API is replaced with the modern
descriptor based API.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
 drivers/staging/iio/resolver/ad2s1200.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 430cc62591fe..b2c46a8c6b77 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -13,6 +13,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/spi/spi.h>
@@ -43,8 +44,8 @@
 struct ad2s1200_state {
 	struct mutex lock;
 	struct spi_device *sdev;
-	int sample;
-	int rdvel;
+	struct gpio_desc *sample;
+	struct gpio_desc *rdvel;
 	__be16 rx ____cacheline_aligned;
 };
 
@@ -58,12 +59,12 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
 	int ret;
 
 	mutex_lock(&st->lock);
-	gpio_set_value(st->sample, 0);
+	gpiod_set_value(st->sample, 0);
 
 	/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
 	udelay(1);
-	gpio_set_value(st->sample, 1);
-	gpio_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
+	gpiod_set_value(st->sample, 1);
+	gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
 
 	ret = spi_read(st->sdev, &st->rx, 2);
 	if (ret < 0) {
@@ -133,8 +134,8 @@ static int ad2s1200_probe(struct spi_device *spi)
 	st = iio_priv(indio_dev);
 	mutex_init(&st->lock);
 	st->sdev = spi;
-	st->sample = pins[0];
-	st->rdvel = pins[1];
+	st->sample = gpio_to_desc(pins[0]);
+	st->rdvel = gpio_to_desc(pins[1]);
 
 	indio_dev->dev.parent = &spi->dev;
 	indio_dev->info = &ad2s1200_info;
-- 
2.17.0

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

* [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (4 preceding siblings ...)
  2018-05-18 18:21 ` [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API David Veenstra
@ 2018-05-18 18:22 ` David Veenstra
  2018-05-20 11:01   ` Jonathan Cameron
  2018-05-18 18:22 ` [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table David Veenstra
                   ` (5 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:22 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Remove usage of platform data, and replace it with device tree
facilities.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Added vendor prefix to gpio function names.

 drivers/staging/iio/resolver/ad2s1200.c | 32 ++++++++++++-------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index b2c46a8c6b77..9a8aa2448897 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -25,9 +25,6 @@
 
 #define DRV_NAME "ad2s1200"
 
-/* input pin sample and rdvel is controlled by driver */
-#define AD2S1200_PN	2
-
 /* input clock on serial interface */
 #define AD2S1200_HZ	8192000
 /* clock period in nano second */
@@ -111,20 +108,9 @@ static const struct iio_info ad2s1200_info = {
 
 static int ad2s1200_probe(struct spi_device *spi)
 {
-	unsigned short *pins = spi->dev.platform_data;
 	struct ad2s1200_state *st;
 	struct iio_dev *indio_dev;
-	int pn, ret;
-
-	for (pn = 0; pn < AD2S1200_PN; pn++) {
-		ret = devm_gpio_request_one(&spi->dev, pins[pn], GPIOF_DIR_OUT,
-					    DRV_NAME);
-		if (ret) {
-			dev_err(&spi->dev, "request gpio pin %d failed\n",
-				pins[pn]);
-			return ret;
-		}
-	}
+	int ret;
 
 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
 	if (!indio_dev)
@@ -134,8 +120,20 @@ static int ad2s1200_probe(struct spi_device *spi)
 	st = iio_priv(indio_dev);
 	mutex_init(&st->lock);
 	st->sdev = spi;
-	st->sample = gpio_to_desc(pins[0]);
-	st->rdvel = gpio_to_desc(pins[1]);
+
+	st->sample = devm_gpiod_get(&spi->dev, "adi,sample", GPIOD_OUT_LOW);
+	if (IS_ERR(st->sample)) {
+		dev_err(&spi->dev, "Failed to claim SAMPLE gpio: err=%ld\n",
+			PTR_ERR(st->sample));
+		return PTR_ERR(st->sample);
+	}
+
+	st->rdvel = devm_gpiod_get(&spi->dev, "adi,rdvel", GPIOD_OUT_LOW);
+	if (IS_ERR(st->rdvel)) {
+		dev_err(&spi->dev, "Failed to claim RDVEL gpio: err=%ld\n",
+			PTR_ERR(st->rdvel));
+		return PTR_ERR(st->rdvel);
+	}
 
 	indio_dev->dev.parent = &spi->dev;
 	indio_dev->info = &ad2s1200_info;
-- 
2.17.0

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

* [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (5 preceding siblings ...)
  2018-05-18 18:22 ` [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings David Veenstra
@ 2018-05-18 18:22 ` David Veenstra
  2018-05-20 11:02   ` Jonathan Cameron
  2018-05-18 18:22 ` [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings David Veenstra
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:22 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Add device tree table for matching with the vendor ID.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Introduced in this version.

 drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 9a8aa2448897..67d9747f88a6 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -154,6 +154,13 @@ static int ad2s1200_probe(struct spi_device *spi)
 	return devm_iio_device_register(&spi->dev, indio_dev);
 }
 
+static const struct of_device_id ad2s1200_of_match[] = {
+	{ .compatible = "adi,ad2s1200", },
+	{ .compatible = "adi,ad2s1205", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, ad2s1200_of_match);
+
 static const struct spi_device_id ad2s1200_id[] = {
 	{ "ad2s1200" },
 	{ "ad2s1205" },
@@ -164,6 +171,7 @@ MODULE_DEVICE_TABLE(spi, ad2s1200_id);
 static struct spi_driver ad2s1200_driver = {
 	.driver = {
 		.name = DRV_NAME,
+		.of_match_table = of_match_ptr(ad2s1200_of_match),
 	},
 	.probe = ad2s1200_probe,
 	.id_table = ad2s1200_id,
-- 
2.17.0

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

* [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (6 preceding siblings ...)
  2018-05-18 18:22 ` [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table David Veenstra
@ 2018-05-18 18:22 ` David Veenstra
  2018-05-20 11:05   ` Jonathan Cameron
  2018-05-18 18:23 ` [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel David Veenstra
                   ` (3 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:22 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Add documentation for the device tree bindings of the AD2S1200 resolver.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Added vendor prefix to gpio function name.
 - Added unit address.
 - Changed commit subject to be more inline with other dt-bindings
   commit .

 .../bindings/iio/resolver/ad2s1200.txt           | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt

diff --git a/Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt b/Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt
new file mode 100644
index 000000000000..bbf54260c911
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt
@@ -0,0 +1,16 @@
+Analog Devices AD2S1200 and AD2S1205 Resolver-to-Digital Converter
+
+Required properties:
+ - compatible : should be "adi,ad2s1200" or "adi,ad2s1205"
+ - reg : the SPI chip select number of the device
+ - adi,sample-gpios : The GPIO pin connected to the SAMPLE line of the AD2S1200
+ - adi,rdvel-gpios : The GPIO pin connected to the RDVEL line of the AD2S1200
+
+Example:
+
+	resolver@0 {
+		compatible = "adi,ad2s1200";
+		reg = <4>;
+		adi,sample-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
+		adi,rdvel-gpios = <&gpio 6 GPIO_ACTIVE_HIGH>;
+	};
-- 
2.17.0

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

* [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (7 preceding siblings ...)
  2018-05-18 18:22 ` [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings David Veenstra
@ 2018-05-18 18:23 ` David Veenstra
  2018-05-20 11:09   ` Jonathan Cameron
  2018-05-18 18:23 ` [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel David Veenstra
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:23 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

The sysfs iio ABI states radians per second is expected as the unit for
angular velocity, but the 12-bit angular velocity register has
revolution per seconds as its unit. So a scaling factor of approximately
2 * Pi is added to the angular velocity channel.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Changed rps to revolutions per second in commit message
   to prevent confusion.

 drivers/staging/iio/resolver/ad2s1200.c | 71 ++++++++++++++++---------
 1 file changed, 45 insertions(+), 26 deletions(-)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 67d9747f88a6..7b8af558e921 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -55,37 +55,55 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
 	struct ad2s1200_state *st = iio_priv(indio_dev);
 	int ret;
 
-	mutex_lock(&st->lock);
-	gpiod_set_value(st->sample, 0);
-
-	/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
-	udelay(1);
-	gpiod_set_value(st->sample, 1);
-	gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
-
-	ret = spi_read(st->sdev, &st->rx, 2);
-	if (ret < 0) {
+	switch (m) {
+	case IIO_CHAN_INFO_SCALE:
+		switch (chan->type) {
+		case IIO_ANGL_VEL:
+			/* 2 * Pi ~= 6.283185 */
+			*val = 6;
+			*val2 = 283185;
+			return IIO_VAL_INT_PLUS_MICRO;
+		default:
+			return -EINVAL;
+		}
+		break;
+	case IIO_CHAN_INFO_RAW:
+		mutex_lock(&st->lock);
+		gpiod_set_value(st->sample, 0);
+
+		/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
+		udelay(1);
+		gpiod_set_value(st->sample, 1);
+		gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
+
+		ret = spi_read(st->sdev, &st->rx, 2);
+		if (ret < 0) {
+			mutex_unlock(&st->lock);
+			return ret;
+		}
+
+		switch (chan->type) {
+		case IIO_ANGL:
+			*val = be16_to_cpup(&st->rx) >> 4;
+			break;
+		case IIO_ANGL_VEL:
+			*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
+			break;
+		default:
+			mutex_unlock(&st->lock);
+			return -EINVAL;
+		}
+
+		/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
+		udelay(1);
 		mutex_unlock(&st->lock);
-		return ret;
-	}
 
-	switch (chan->type) {
-	case IIO_ANGL:
-		*val = be16_to_cpup(&st->rx) >> 4;
-		break;
-	case IIO_ANGL_VEL:
-		*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
-		break;
+		return IIO_VAL_INT;
 	default:
-		mutex_unlock(&st->lock);
-		return -EINVAL;
+		break;
 	}
 
-	/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
-	udelay(1);
-	mutex_unlock(&st->lock);
-
-	return IIO_VAL_INT;
+	return -EINVAL;
 }
 
 static const struct iio_chan_spec ad2s1200_channels[] = {
@@ -99,6 +117,7 @@ static const struct iio_chan_spec ad2s1200_channels[] = {
 		.indexed = 1,
 		.channel = 0,
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
 	}
 };
 
-- 
2.17.0

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

* [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (8 preceding siblings ...)
  2018-05-18 18:23 ` [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel David Veenstra
@ 2018-05-18 18:23 ` David Veenstra
  2018-05-20 11:10   ` Jonathan Cameron
  2018-05-18 18:23 ` [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright David Veenstra
  2018-05-18 18:23 ` [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging David Veenstra
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:23 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

A scaling factor of approximately 2 * Pi / (2^12 -1) is added,
to scale the 12-bits angular position to radians.

A return type of IIO_VAL_INT_PLUS_NANO is used, so that the scale of
both the angle channel and angular velocity channel has 7 significant
digits.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
 drivers/staging/iio/resolver/ad2s1200.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 7b8af558e921..10d6d79dce79 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -58,6 +58,11 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
 	switch (m) {
 	case IIO_CHAN_INFO_SCALE:
 		switch (chan->type) {
+		case IIO_ANGL:
+			/* 2 * Pi / (2^12 - 1) ~= 0.001534355 */
+			*val = 0;
+			*val2 = 1534355;
+			return IIO_VAL_INT_PLUS_NANO;
 		case IIO_ANGL_VEL:
 			/* 2 * Pi ~= 6.283185 */
 			*val = 6;
@@ -112,6 +117,7 @@ static const struct iio_chan_spec ad2s1200_channels[] = {
 		.indexed = 1,
 		.channel = 0,
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
 	}, {
 		.type = IIO_ANGL_VEL,
 		.indexed = 1,
-- 
2.17.0

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

* [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (9 preceding siblings ...)
  2018-05-18 18:23 ` [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel David Veenstra
@ 2018-05-18 18:23 ` David Veenstra
  2018-05-20 11:11   ` Jonathan Cameron
  2018-05-18 18:23 ` [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging David Veenstra
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:23 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Add David Veenstra as a copyright holders and as an author,
for all of the staging clean ups of the ad2s1200 driver.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
Changes in v4:
 - Introduced in this version.

 drivers/staging/iio/resolver/ad2s1200.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
index 10d6d79dce79..28e618af9939 100644
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ b/drivers/staging/iio/resolver/ad2s1200.c
@@ -2,6 +2,7 @@
  * ad2s1200.c simple support for the ADI Resolver to Digital Converters:
  * AD2S1200/1205
  *
+ * Copyright (c) 2018-2018 David Veenstra <davidjulianveenstra@gmail.com>
  * Copyright (c) 2010-2010 Analog Devices Inc.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -203,6 +204,7 @@ static struct spi_driver ad2s1200_driver = {
 };
 module_spi_driver(ad2s1200_driver);
 
+MODULE_AUTHOR("David Veenstra <davidjulianveenstra@gmail.com>");
 MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
 MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver");
 MODULE_LICENSE("GPL v2");
-- 
2.17.0

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

* [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging
  2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
                   ` (10 preceding siblings ...)
  2018-05-18 18:23 ` [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright David Veenstra
@ 2018-05-18 18:23 ` David Veenstra
  2018-05-20 11:17   ` Jonathan Cameron
  11 siblings, 1 reply; 25+ messages in thread
From: David Veenstra @ 2018-05-18 18:23 UTC (permalink / raw)
  To: jic23, lars, pmeerw, robh+dt
  Cc: linux-iio, devel, devicetree, Michael.Hennerich, knaack.h

Move the iio driver for the ad2s1200 and ad2s1205 resolver-to-digital
converter out of staging, into mainline iio subsystems.

Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
---
 drivers/iio/Kconfig                     |   1 +
 drivers/iio/Makefile                    |   1 +
 drivers/iio/resolver/Kconfig            |  17 ++
 drivers/iio/resolver/Makefile           |   5 +
 drivers/iio/resolver/ad2s1200.c         | 210 ++++++++++++++++++++++++
 drivers/staging/iio/resolver/Kconfig    |  12 --
 drivers/staging/iio/resolver/Makefile   |   1 -
 drivers/staging/iio/resolver/ad2s1200.c | 210 ------------------------
 8 files changed, 234 insertions(+), 223 deletions(-)
 create mode 100644 drivers/iio/resolver/Kconfig
 create mode 100644 drivers/iio/resolver/Makefile
 create mode 100644 drivers/iio/resolver/ad2s1200.c
 delete mode 100644 drivers/staging/iio/resolver/ad2s1200.c

diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig
index d69e85a8bdc3..d08aeb41cd07 100644
--- a/drivers/iio/Kconfig
+++ b/drivers/iio/Kconfig
@@ -93,6 +93,7 @@ source "drivers/iio/potentiometer/Kconfig"
 source "drivers/iio/potentiostat/Kconfig"
 source "drivers/iio/pressure/Kconfig"
 source "drivers/iio/proximity/Kconfig"
+source "drivers/iio/resolver/Kconfig"
 source "drivers/iio/temperature/Kconfig"
 
 endif # IIO
diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile
index d8cba9c229c0..cb5993251381 100644
--- a/drivers/iio/Makefile
+++ b/drivers/iio/Makefile
@@ -36,5 +36,6 @@ obj-y += potentiometer/
 obj-y += potentiostat/
 obj-y += pressure/
 obj-y += proximity/
+obj-y += resolver/
 obj-y += temperature/
 obj-y += trigger/
diff --git a/drivers/iio/resolver/Kconfig b/drivers/iio/resolver/Kconfig
new file mode 100644
index 000000000000..2ced9f22aa70
--- /dev/null
+++ b/drivers/iio/resolver/Kconfig
@@ -0,0 +1,17 @@
+#
+# Resolver/Synchro drivers
+#
+menu "Resolver to digital converters"
+
+config AD2S1200
+	tristate "Analog Devices ad2s1200/ad2s1205 driver"
+	depends on SPI
+	depends on GPIOLIB || COMPILE_TEST
+	help
+	  Say yes here to build support for Analog Devices spi resolver
+	  to digital converters, ad2s1200 and ad2s1205, provides direct access
+	  via sysfs.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called ad2s1200.
+endmenu
diff --git a/drivers/iio/resolver/Makefile b/drivers/iio/resolver/Makefile
new file mode 100644
index 000000000000..4e1dccae07e7
--- /dev/null
+++ b/drivers/iio/resolver/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for Resolver/Synchro drivers
+#
+
+obj-$(CONFIG_AD2S1200) += ad2s1200.o
diff --git a/drivers/iio/resolver/ad2s1200.c b/drivers/iio/resolver/ad2s1200.c
new file mode 100644
index 000000000000..28e618af9939
--- /dev/null
+++ b/drivers/iio/resolver/ad2s1200.c
@@ -0,0 +1,210 @@
+/*
+ * ad2s1200.c simple support for the ADI Resolver to Digital Converters:
+ * AD2S1200/1205
+ *
+ * Copyright (c) 2018-2018 David Veenstra <davidjulianveenstra@gmail.com>
+ * Copyright (c) 2010-2010 Analog Devices Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/bitops.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/spi/spi.h>
+#include <linux/sysfs.h>
+#include <linux/types.h>
+
+#include <linux/iio/iio.h>
+#include <linux/iio/sysfs.h>
+
+#define DRV_NAME "ad2s1200"
+
+/* input clock on serial interface */
+#define AD2S1200_HZ	8192000
+/* clock period in nano second */
+#define AD2S1200_TSCLK	(1000000000 / AD2S1200_HZ)
+
+/**
+ * struct ad2s1200_state - driver instance specific data.
+ * @lock:	protects both the GPIO pins and the rx buffer.
+ * @sdev:	spi device.
+ * @sample:	GPIO pin SAMPLE.
+ * @rdvel:	GPIO pin RDVEL.
+ * @rx:		buffer for spi transfers.
+ */
+struct ad2s1200_state {
+	struct mutex lock;
+	struct spi_device *sdev;
+	struct gpio_desc *sample;
+	struct gpio_desc *rdvel;
+	__be16 rx ____cacheline_aligned;
+};
+
+static int ad2s1200_read_raw(struct iio_dev *indio_dev,
+			     struct iio_chan_spec const *chan,
+			     int *val,
+			     int *val2,
+			     long m)
+{
+	struct ad2s1200_state *st = iio_priv(indio_dev);
+	int ret;
+
+	switch (m) {
+	case IIO_CHAN_INFO_SCALE:
+		switch (chan->type) {
+		case IIO_ANGL:
+			/* 2 * Pi / (2^12 - 1) ~= 0.001534355 */
+			*val = 0;
+			*val2 = 1534355;
+			return IIO_VAL_INT_PLUS_NANO;
+		case IIO_ANGL_VEL:
+			/* 2 * Pi ~= 6.283185 */
+			*val = 6;
+			*val2 = 283185;
+			return IIO_VAL_INT_PLUS_MICRO;
+		default:
+			return -EINVAL;
+		}
+		break;
+	case IIO_CHAN_INFO_RAW:
+		mutex_lock(&st->lock);
+		gpiod_set_value(st->sample, 0);
+
+		/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
+		udelay(1);
+		gpiod_set_value(st->sample, 1);
+		gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
+
+		ret = spi_read(st->sdev, &st->rx, 2);
+		if (ret < 0) {
+			mutex_unlock(&st->lock);
+			return ret;
+		}
+
+		switch (chan->type) {
+		case IIO_ANGL:
+			*val = be16_to_cpup(&st->rx) >> 4;
+			break;
+		case IIO_ANGL_VEL:
+			*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
+			break;
+		default:
+			mutex_unlock(&st->lock);
+			return -EINVAL;
+		}
+
+		/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
+		udelay(1);
+		mutex_unlock(&st->lock);
+
+		return IIO_VAL_INT;
+	default:
+		break;
+	}
+
+	return -EINVAL;
+}
+
+static const struct iio_chan_spec ad2s1200_channels[] = {
+	{
+		.type = IIO_ANGL,
+		.indexed = 1,
+		.channel = 0,
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
+	}, {
+		.type = IIO_ANGL_VEL,
+		.indexed = 1,
+		.channel = 0,
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
+	}
+};
+
+static const struct iio_info ad2s1200_info = {
+	.read_raw = ad2s1200_read_raw,
+};
+
+static int ad2s1200_probe(struct spi_device *spi)
+{
+	struct ad2s1200_state *st;
+	struct iio_dev *indio_dev;
+	int ret;
+
+	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+	if (!indio_dev)
+		return -ENOMEM;
+
+	spi_set_drvdata(spi, indio_dev);
+	st = iio_priv(indio_dev);
+	mutex_init(&st->lock);
+	st->sdev = spi;
+
+	st->sample = devm_gpiod_get(&spi->dev, "adi,sample", GPIOD_OUT_LOW);
+	if (IS_ERR(st->sample)) {
+		dev_err(&spi->dev, "Failed to claim SAMPLE gpio: err=%ld\n",
+			PTR_ERR(st->sample));
+		return PTR_ERR(st->sample);
+	}
+
+	st->rdvel = devm_gpiod_get(&spi->dev, "adi,rdvel", GPIOD_OUT_LOW);
+	if (IS_ERR(st->rdvel)) {
+		dev_err(&spi->dev, "Failed to claim RDVEL gpio: err=%ld\n",
+			PTR_ERR(st->rdvel));
+		return PTR_ERR(st->rdvel);
+	}
+
+	indio_dev->dev.parent = &spi->dev;
+	indio_dev->info = &ad2s1200_info;
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = ad2s1200_channels;
+	indio_dev->num_channels = ARRAY_SIZE(ad2s1200_channels);
+	indio_dev->name = spi_get_device_id(spi)->name;
+
+	spi->max_speed_hz = AD2S1200_HZ;
+	spi->mode = SPI_MODE_3;
+	ret = spi_setup(spi);
+
+	if (ret < 0) {
+		dev_err(&spi->dev, "spi_setup failed!\n");
+		return ret;
+	}
+
+	return devm_iio_device_register(&spi->dev, indio_dev);
+}
+
+static const struct of_device_id ad2s1200_of_match[] = {
+	{ .compatible = "adi,ad2s1200", },
+	{ .compatible = "adi,ad2s1205", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, ad2s1200_of_match);
+
+static const struct spi_device_id ad2s1200_id[] = {
+	{ "ad2s1200" },
+	{ "ad2s1205" },
+	{}
+};
+MODULE_DEVICE_TABLE(spi, ad2s1200_id);
+
+static struct spi_driver ad2s1200_driver = {
+	.driver = {
+		.name = DRV_NAME,
+		.of_match_table = of_match_ptr(ad2s1200_of_match),
+	},
+	.probe = ad2s1200_probe,
+	.id_table = ad2s1200_id,
+};
+module_spi_driver(ad2s1200_driver);
+
+MODULE_AUTHOR("David Veenstra <davidjulianveenstra@gmail.com>");
+MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
+MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/staging/iio/resolver/Kconfig b/drivers/staging/iio/resolver/Kconfig
index 1c7e2860d6b7..6a469ee6101f 100644
--- a/drivers/staging/iio/resolver/Kconfig
+++ b/drivers/staging/iio/resolver/Kconfig
@@ -13,18 +13,6 @@ config AD2S90
 	  To compile this driver as a module, choose M here: the
 	  module will be called ad2s90.
 
-config AD2S1200
-	tristate "Analog Devices ad2s1200/ad2s1205 driver"
-	depends on SPI
-	depends on GPIOLIB || COMPILE_TEST
-	help
-	  Say yes here to build support for Analog Devices spi resolver
-	  to digital converters, ad2s1200 and ad2s1205, provides direct access
-	  via sysfs.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called ad2s1200.
-
 config AD2S1210
 	tristate "Analog Devices ad2s1210 driver"
 	depends on SPI
diff --git a/drivers/staging/iio/resolver/Makefile b/drivers/staging/iio/resolver/Makefile
index 14375e444ebf..8d901dc7500b 100644
--- a/drivers/staging/iio/resolver/Makefile
+++ b/drivers/staging/iio/resolver/Makefile
@@ -3,5 +3,4 @@
 #
 
 obj-$(CONFIG_AD2S90) += ad2s90.o
-obj-$(CONFIG_AD2S1200) += ad2s1200.o
 obj-$(CONFIG_AD2S1210) += ad2s1210.o
diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
deleted file mode 100644
index 28e618af9939..000000000000
--- a/drivers/staging/iio/resolver/ad2s1200.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * ad2s1200.c simple support for the ADI Resolver to Digital Converters:
- * AD2S1200/1205
- *
- * Copyright (c) 2018-2018 David Veenstra <davidjulianveenstra@gmail.com>
- * Copyright (c) 2010-2010 Analog Devices Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/bitops.h>
-#include <linux/delay.h>
-#include <linux/device.h>
-#include <linux/gpio.h>
-#include <linux/gpio/consumer.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/spi/spi.h>
-#include <linux/sysfs.h>
-#include <linux/types.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
-
-#define DRV_NAME "ad2s1200"
-
-/* input clock on serial interface */
-#define AD2S1200_HZ	8192000
-/* clock period in nano second */
-#define AD2S1200_TSCLK	(1000000000 / AD2S1200_HZ)
-
-/**
- * struct ad2s1200_state - driver instance specific data.
- * @lock:	protects both the GPIO pins and the rx buffer.
- * @sdev:	spi device.
- * @sample:	GPIO pin SAMPLE.
- * @rdvel:	GPIO pin RDVEL.
- * @rx:		buffer for spi transfers.
- */
-struct ad2s1200_state {
-	struct mutex lock;
-	struct spi_device *sdev;
-	struct gpio_desc *sample;
-	struct gpio_desc *rdvel;
-	__be16 rx ____cacheline_aligned;
-};
-
-static int ad2s1200_read_raw(struct iio_dev *indio_dev,
-			     struct iio_chan_spec const *chan,
-			     int *val,
-			     int *val2,
-			     long m)
-{
-	struct ad2s1200_state *st = iio_priv(indio_dev);
-	int ret;
-
-	switch (m) {
-	case IIO_CHAN_INFO_SCALE:
-		switch (chan->type) {
-		case IIO_ANGL:
-			/* 2 * Pi / (2^12 - 1) ~= 0.001534355 */
-			*val = 0;
-			*val2 = 1534355;
-			return IIO_VAL_INT_PLUS_NANO;
-		case IIO_ANGL_VEL:
-			/* 2 * Pi ~= 6.283185 */
-			*val = 6;
-			*val2 = 283185;
-			return IIO_VAL_INT_PLUS_MICRO;
-		default:
-			return -EINVAL;
-		}
-		break;
-	case IIO_CHAN_INFO_RAW:
-		mutex_lock(&st->lock);
-		gpiod_set_value(st->sample, 0);
-
-		/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
-		udelay(1);
-		gpiod_set_value(st->sample, 1);
-		gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
-
-		ret = spi_read(st->sdev, &st->rx, 2);
-		if (ret < 0) {
-			mutex_unlock(&st->lock);
-			return ret;
-		}
-
-		switch (chan->type) {
-		case IIO_ANGL:
-			*val = be16_to_cpup(&st->rx) >> 4;
-			break;
-		case IIO_ANGL_VEL:
-			*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
-			break;
-		default:
-			mutex_unlock(&st->lock);
-			return -EINVAL;
-		}
-
-		/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
-		udelay(1);
-		mutex_unlock(&st->lock);
-
-		return IIO_VAL_INT;
-	default:
-		break;
-	}
-
-	return -EINVAL;
-}
-
-static const struct iio_chan_spec ad2s1200_channels[] = {
-	{
-		.type = IIO_ANGL,
-		.indexed = 1,
-		.channel = 0,
-		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
-		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
-	}, {
-		.type = IIO_ANGL_VEL,
-		.indexed = 1,
-		.channel = 0,
-		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
-		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
-	}
-};
-
-static const struct iio_info ad2s1200_info = {
-	.read_raw = ad2s1200_read_raw,
-};
-
-static int ad2s1200_probe(struct spi_device *spi)
-{
-	struct ad2s1200_state *st;
-	struct iio_dev *indio_dev;
-	int ret;
-
-	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
-	if (!indio_dev)
-		return -ENOMEM;
-
-	spi_set_drvdata(spi, indio_dev);
-	st = iio_priv(indio_dev);
-	mutex_init(&st->lock);
-	st->sdev = spi;
-
-	st->sample = devm_gpiod_get(&spi->dev, "adi,sample", GPIOD_OUT_LOW);
-	if (IS_ERR(st->sample)) {
-		dev_err(&spi->dev, "Failed to claim SAMPLE gpio: err=%ld\n",
-			PTR_ERR(st->sample));
-		return PTR_ERR(st->sample);
-	}
-
-	st->rdvel = devm_gpiod_get(&spi->dev, "adi,rdvel", GPIOD_OUT_LOW);
-	if (IS_ERR(st->rdvel)) {
-		dev_err(&spi->dev, "Failed to claim RDVEL gpio: err=%ld\n",
-			PTR_ERR(st->rdvel));
-		return PTR_ERR(st->rdvel);
-	}
-
-	indio_dev->dev.parent = &spi->dev;
-	indio_dev->info = &ad2s1200_info;
-	indio_dev->modes = INDIO_DIRECT_MODE;
-	indio_dev->channels = ad2s1200_channels;
-	indio_dev->num_channels = ARRAY_SIZE(ad2s1200_channels);
-	indio_dev->name = spi_get_device_id(spi)->name;
-
-	spi->max_speed_hz = AD2S1200_HZ;
-	spi->mode = SPI_MODE_3;
-	ret = spi_setup(spi);
-
-	if (ret < 0) {
-		dev_err(&spi->dev, "spi_setup failed!\n");
-		return ret;
-	}
-
-	return devm_iio_device_register(&spi->dev, indio_dev);
-}
-
-static const struct of_device_id ad2s1200_of_match[] = {
-	{ .compatible = "adi,ad2s1200", },
-	{ .compatible = "adi,ad2s1205", },
-	{ }
-};
-MODULE_DEVICE_TABLE(of, ad2s1200_of_match);
-
-static const struct spi_device_id ad2s1200_id[] = {
-	{ "ad2s1200" },
-	{ "ad2s1205" },
-	{}
-};
-MODULE_DEVICE_TABLE(spi, ad2s1200_id);
-
-static struct spi_driver ad2s1200_driver = {
-	.driver = {
-		.name = DRV_NAME,
-		.of_match_table = of_match_ptr(ad2s1200_of_match),
-	},
-	.probe = ad2s1200_probe,
-	.id_table = ad2s1200_id,
-};
-module_spi_driver(ad2s1200_driver);
-
-MODULE_AUTHOR("David Veenstra <davidjulianveenstra@gmail.com>");
-MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
-MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver");
-MODULE_LICENSE("GPL v2");
-- 
2.17.0

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

* Re: [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license
  2018-05-18 18:21 ` [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license David Veenstra
@ 2018-05-20 10:52   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 10:52 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:21:06 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Remove unneeded newline in license, as it does not improve readability.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied, thanks

Jonathan

> ---
> Changes in v4:
>  - Introduced in this version.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index ea7336645116..df3b34200a89 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -7,7 +7,6 @@
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License version 2 as
>   * published by the Free Software Foundation.
> - *
>   */
>  
>  #include <linux/bitops.h>

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

* Re: [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations
  2018-05-18 18:21 ` [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations David Veenstra
@ 2018-05-20 10:53   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 10:53 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:21:23 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Remove 2 initializations which are unneeded, because the
> initialized values are never used.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied.
> ---
> Changes in v4:
>  - Introduced in this version.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index df3b34200a89..9bdcf0c86217 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -47,7 +47,7 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
>  			     long m)
>  {
>  	struct ad2s1200_state *st = iio_priv(indio_dev);
> -	int ret = 0;
> +	int ret;
>  
>  	mutex_lock(&st->lock);
>  	gpio_set_value(st->sample, 0);
> @@ -105,7 +105,7 @@ static int ad2s1200_probe(struct spi_device *spi)
>  	unsigned short *pins = spi->dev.platform_data;
>  	struct ad2s1200_state *st;
>  	struct iio_dev *indio_dev;
> -	int pn, ret = 0;
> +	int pn, ret;
>  
>  	for (pn = 0; pn < AD2S1200_PN; pn++) {
>  		ret = devm_gpio_request_one(&spi->dev, pins[pn], GPIOF_DIR_OUT,

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

* Re: [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state
  2018-05-18 18:21 ` [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state David Veenstra
@ 2018-05-20 10:53   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 10:53 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:21:34 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Add missing kernel docs to the ad2s1200 driver state.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Nice.

Applied,

Jonathan
> ---
> Changes in v4:
>  - Simplified explanation of lock.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 9bdcf0c86217..068aa86e9c11 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -32,6 +32,14 @@
>  /* clock period in nano second */
>  #define AD2S1200_TSCLK	(1000000000 / AD2S1200_HZ)
>  
> +/**
> + * struct ad2s1200_state - driver instance specific data.
> + * @lock:	protects both the GPIO pins and the rx buffer.
> + * @sdev:	spi device.
> + * @sample:	GPIO pin SAMPLE.
> + * @rdvel:	GPIO pin RDVEL.
> + * @rx:		buffer for spi transfers.
> + */
>  struct ad2s1200_state {
>  	struct mutex lock;
>  	struct spi_device *sdev;

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

* Re: [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register
  2018-05-18 18:21 ` [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register David Veenstra
@ 2018-05-20 10:55   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 10:55 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:21:44 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> The spi should be set up before the device is registered as an iio
> device.
> 
> This patch moves the setup to before the device registration.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan

> ---
> Changes in v4:
>  - Introduced in this version.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 068aa86e9c11..430cc62591fe 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -143,15 +143,16 @@ static int ad2s1200_probe(struct spi_device *spi)
>  	indio_dev->num_channels = ARRAY_SIZE(ad2s1200_channels);
>  	indio_dev->name = spi_get_device_id(spi)->name;
>  
> -	ret = devm_iio_device_register(&spi->dev, indio_dev);
> -	if (ret)
> -		return ret;
> -
>  	spi->max_speed_hz = AD2S1200_HZ;
>  	spi->mode = SPI_MODE_3;
> -	spi_setup(spi);
> +	ret = spi_setup(spi);
> +
> +	if (ret < 0) {
> +		dev_err(&spi->dev, "spi_setup failed!\n");
> +		return ret;
> +	}
>  
> -	return 0;
> +	return devm_iio_device_register(&spi->dev, indio_dev);
>  }
>  
>  static const struct spi_device_id ad2s1200_id[] = {

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

* Re: [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings
  2018-05-18 18:22 ` [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings David Veenstra
@ 2018-05-20 11:01   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:01 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:22:32 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Remove usage of platform data, and replace it with device tree
> facilities.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Great,

Applied to the togreg branch of iio.git and pushed out as testing.

I think the dt bindings that match this are uncontroversial in
what they actually are (comments to follow on that patch) so
should be no problem with this one.

Jonathan

> ---
> Changes in v4:
>  - Added vendor prefix to gpio function names.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 32 ++++++++++++-------------
>  1 file changed, 15 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index b2c46a8c6b77..9a8aa2448897 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -25,9 +25,6 @@
>  
>  #define DRV_NAME "ad2s1200"
>  
> -/* input pin sample and rdvel is controlled by driver */
> -#define AD2S1200_PN	2
> -
>  /* input clock on serial interface */
>  #define AD2S1200_HZ	8192000
>  /* clock period in nano second */
> @@ -111,20 +108,9 @@ static const struct iio_info ad2s1200_info = {
>  
>  static int ad2s1200_probe(struct spi_device *spi)
>  {
> -	unsigned short *pins = spi->dev.platform_data;
>  	struct ad2s1200_state *st;
>  	struct iio_dev *indio_dev;
> -	int pn, ret;
> -
> -	for (pn = 0; pn < AD2S1200_PN; pn++) {
> -		ret = devm_gpio_request_one(&spi->dev, pins[pn], GPIOF_DIR_OUT,
> -					    DRV_NAME);
> -		if (ret) {
> -			dev_err(&spi->dev, "request gpio pin %d failed\n",
> -				pins[pn]);
> -			return ret;
> -		}
> -	}
> +	int ret;
>  
>  	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
>  	if (!indio_dev)
> @@ -134,8 +120,20 @@ static int ad2s1200_probe(struct spi_device *spi)
>  	st = iio_priv(indio_dev);
>  	mutex_init(&st->lock);
>  	st->sdev = spi;
> -	st->sample = gpio_to_desc(pins[0]);
> -	st->rdvel = gpio_to_desc(pins[1]);
> +
> +	st->sample = devm_gpiod_get(&spi->dev, "adi,sample", GPIOD_OUT_LOW);
> +	if (IS_ERR(st->sample)) {
> +		dev_err(&spi->dev, "Failed to claim SAMPLE gpio: err=%ld\n",
> +			PTR_ERR(st->sample));
> +		return PTR_ERR(st->sample);
> +	}
> +
> +	st->rdvel = devm_gpiod_get(&spi->dev, "adi,rdvel", GPIOD_OUT_LOW);
> +	if (IS_ERR(st->rdvel)) {
> +		dev_err(&spi->dev, "Failed to claim RDVEL gpio: err=%ld\n",
> +			PTR_ERR(st->rdvel));
> +		return PTR_ERR(st->rdvel);
> +	}
>  
>  	indio_dev->dev.parent = &spi->dev;
>  	indio_dev->info = &ad2s1200_info;

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

* Re: [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table
  2018-05-18 18:22 ` [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table David Veenstra
@ 2018-05-20 11:02   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:02 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:22:41 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Add device tree table for matching with the vendor ID.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied

Thanks,

Jonathan
> ---
> Changes in v4:
>  - Introduced in this version.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 9a8aa2448897..67d9747f88a6 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -154,6 +154,13 @@ static int ad2s1200_probe(struct spi_device *spi)
>  	return devm_iio_device_register(&spi->dev, indio_dev);
>  }
>  
> +static const struct of_device_id ad2s1200_of_match[] = {
> +	{ .compatible = "adi,ad2s1200", },
> +	{ .compatible = "adi,ad2s1205", },
> +	{ }
> +};
> +MODULE_DEVICE_TABLE(of, ad2s1200_of_match);
> +
>  static const struct spi_device_id ad2s1200_id[] = {
>  	{ "ad2s1200" },
>  	{ "ad2s1205" },
> @@ -164,6 +171,7 @@ MODULE_DEVICE_TABLE(spi, ad2s1200_id);
>  static struct spi_driver ad2s1200_driver = {
>  	.driver = {
>  		.name = DRV_NAME,
> +		.of_match_table = of_match_ptr(ad2s1200_of_match),
>  	},
>  	.probe = ad2s1200_probe,
>  	.id_table = ad2s1200_id,

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

* Re: [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API
  2018-05-18 18:21 ` [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API David Veenstra
@ 2018-05-20 11:04   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:04 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:21:56 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> The legacy, integer based gpio API is replaced with the modern
> descriptor based API.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Hmm This is more complex than it needed to be because it
has to do some massaging of the two different methods only
to clean them up in the next patch.

I would have been tempted to combine the two patches or at
the very least add some comments in here that the nastier
corners are about to go away.

Anyhow, not to worry I figured it out slightly before sending
you an email saying not to do it this way ;)

Applied to the togreg branch of iio.git and pushed out as
testing for the autobuilders to play with it.

Thanks,

Jonathan

> ---
>  drivers/staging/iio/resolver/ad2s1200.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 430cc62591fe..b2c46a8c6b77 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -13,6 +13,7 @@
>  #include <linux/delay.h>
>  #include <linux/device.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/module.h>
>  #include <linux/mutex.h>
>  #include <linux/spi/spi.h>
> @@ -43,8 +44,8 @@
>  struct ad2s1200_state {
>  	struct mutex lock;
>  	struct spi_device *sdev;
> -	int sample;
> -	int rdvel;
> +	struct gpio_desc *sample;
> +	struct gpio_desc *rdvel;
>  	__be16 rx ____cacheline_aligned;
>  };
>  
> @@ -58,12 +59,12 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
>  	int ret;
>  
>  	mutex_lock(&st->lock);
> -	gpio_set_value(st->sample, 0);
> +	gpiod_set_value(st->sample, 0);
>  
>  	/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
>  	udelay(1);
> -	gpio_set_value(st->sample, 1);
> -	gpio_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
> +	gpiod_set_value(st->sample, 1);
> +	gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
>  
>  	ret = spi_read(st->sdev, &st->rx, 2);
>  	if (ret < 0) {
> @@ -133,8 +134,8 @@ static int ad2s1200_probe(struct spi_device *spi)
>  	st = iio_priv(indio_dev);
>  	mutex_init(&st->lock);
>  	st->sdev = spi;
> -	st->sample = pins[0];
> -	st->rdvel = pins[1];
> +	st->sample = gpio_to_desc(pins[0]);
> +	st->rdvel = gpio_to_desc(pins[1]);
>  
>  	indio_dev->dev.parent = &spi->dev;
>  	indio_dev->info = &ad2s1200_info;

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

* Re: [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings
  2018-05-18 18:22 ` [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings David Veenstra
@ 2018-05-20 11:05   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:05 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:22:50 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Add documentation for the device tree bindings of the AD2S1200 resolver.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>

Nothing fundamentally wrong it in here, but a few things to tidy up.

> ---
> Changes in v4:
>  - Added vendor prefix to gpio function name.
>  - Added unit address.
>  - Changed commit subject to be more inline with other dt-bindings
>    commit .
> 
>  .../bindings/iio/resolver/ad2s1200.txt           | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt
> 
> diff --git a/Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt b/Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt
> new file mode 100644
> index 000000000000..bbf54260c911
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt
> @@ -0,0 +1,16 @@
> +Analog Devices AD2S1200 and AD2S1205 Resolver-to-Digital Converter
> +
> +Required properties:
> + - compatible : should be "adi,ad2s1200" or "adi,ad2s1205"

One line per entry.  Saves us having to change this substantially when adding
more parts in future.

> + - reg : the SPI chip select number of the device
> + - adi,sample-gpios : The GPIO pin connected to the SAMPLE line of the AD2S1200
> + - adi,rdvel-gpios : The GPIO pin connected to the RDVEL line of the AD2S1200
> +
> +Example:
> +
> +	resolver@0 {

@4 if you are going to have reg = <4> below.

> +		compatible = "adi,ad2s1200";
> +		reg = <4>;
> +		adi,sample-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
> +		adi,rdvel-gpios = <&gpio 6 GPIO_ACTIVE_HIGH>;
> +	};

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

* Re: [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel
  2018-05-18 18:23 ` [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel David Veenstra
@ 2018-05-20 11:09   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:09 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:23:01 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> The sysfs iio ABI states radians per second is expected as the unit for
> angular velocity, but the 12-bit angular velocity register has
> revolution per seconds as its unit. So a scaling factor of approximately
> 2 * Pi is added to the angular velocity channel.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan

> ---
> Changes in v4:
>  - Changed rps to revolutions per second in commit message
>    to prevent confusion.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 71 ++++++++++++++++---------
>  1 file changed, 45 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 67d9747f88a6..7b8af558e921 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -55,37 +55,55 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
>  	struct ad2s1200_state *st = iio_priv(indio_dev);
>  	int ret;
>  
> -	mutex_lock(&st->lock);
> -	gpiod_set_value(st->sample, 0);
> -
> -	/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
> -	udelay(1);
> -	gpiod_set_value(st->sample, 1);
> -	gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
> -
> -	ret = spi_read(st->sdev, &st->rx, 2);
> -	if (ret < 0) {
> +	switch (m) {
> +	case IIO_CHAN_INFO_SCALE:
> +		switch (chan->type) {
> +		case IIO_ANGL_VEL:
> +			/* 2 * Pi ~= 6.283185 */
> +			*val = 6;
> +			*val2 = 283185;
> +			return IIO_VAL_INT_PLUS_MICRO;
> +		default:
> +			return -EINVAL;
> +		}
> +		break;
> +	case IIO_CHAN_INFO_RAW:
> +		mutex_lock(&st->lock);
> +		gpiod_set_value(st->sample, 0);
> +
> +		/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
> +		udelay(1);
> +		gpiod_set_value(st->sample, 1);
> +		gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
> +
> +		ret = spi_read(st->sdev, &st->rx, 2);
> +		if (ret < 0) {
> +			mutex_unlock(&st->lock);
> +			return ret;
> +		}
> +
> +		switch (chan->type) {
> +		case IIO_ANGL:
> +			*val = be16_to_cpup(&st->rx) >> 4;
> +			break;
> +		case IIO_ANGL_VEL:
> +			*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
> +			break;
> +		default:
> +			mutex_unlock(&st->lock);
> +			return -EINVAL;
> +		}
> +
> +		/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
> +		udelay(1);
>  		mutex_unlock(&st->lock);
> -		return ret;
> -	}
>  
> -	switch (chan->type) {
> -	case IIO_ANGL:
> -		*val = be16_to_cpup(&st->rx) >> 4;
> -		break;
> -	case IIO_ANGL_VEL:
> -		*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
> -		break;
> +		return IIO_VAL_INT;
>  	default:
> -		mutex_unlock(&st->lock);
> -		return -EINVAL;
> +		break;
>  	}
>  
> -	/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
> -	udelay(1);
> -	mutex_unlock(&st->lock);
> -
> -	return IIO_VAL_INT;
> +	return -EINVAL;
>  }
>  
>  static const struct iio_chan_spec ad2s1200_channels[] = {
> @@ -99,6 +117,7 @@ static const struct iio_chan_spec ad2s1200_channels[] = {
>  		.indexed = 1,
>  		.channel = 0,
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
>  	}
>  };
>  

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

* Re: [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel
  2018-05-18 18:23 ` [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel David Veenstra
@ 2018-05-20 11:10   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:10 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:23:14 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> A scaling factor of approximately 2 * Pi / (2^12 -1) is added,
> to scale the 12-bits angular position to radians.
> 
> A return type of IIO_VAL_INT_PLUS_NANO is used, so that the scale of
> both the angle channel and angular velocity channel has 7 significant
> digits.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied

Thanks,

Jonathan
> ---
>  drivers/staging/iio/resolver/ad2s1200.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 7b8af558e921..10d6d79dce79 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -58,6 +58,11 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev,
>  	switch (m) {
>  	case IIO_CHAN_INFO_SCALE:
>  		switch (chan->type) {
> +		case IIO_ANGL:
> +			/* 2 * Pi / (2^12 - 1) ~= 0.001534355 */
> +			*val = 0;
> +			*val2 = 1534355;
> +			return IIO_VAL_INT_PLUS_NANO;
>  		case IIO_ANGL_VEL:
>  			/* 2 * Pi ~= 6.283185 */
>  			*val = 6;
> @@ -112,6 +117,7 @@ static const struct iio_chan_spec ad2s1200_channels[] = {
>  		.indexed = 1,
>  		.channel = 0,
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
>  	}, {
>  		.type = IIO_ANGL_VEL,
>  		.indexed = 1,

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

* Re: [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright
  2018-05-18 18:23 ` [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright David Veenstra
@ 2018-05-20 11:11   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:11 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:23:25 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Add David Veenstra as a copyright holders and as an author,
> for all of the staging clean ups of the ad2s1200 driver.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan

> ---
> Changes in v4:
>  - Introduced in this version.
> 
>  drivers/staging/iio/resolver/ad2s1200.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c
> index 10d6d79dce79..28e618af9939 100644
> --- a/drivers/staging/iio/resolver/ad2s1200.c
> +++ b/drivers/staging/iio/resolver/ad2s1200.c
> @@ -2,6 +2,7 @@
>   * ad2s1200.c simple support for the ADI Resolver to Digital Converters:
>   * AD2S1200/1205
>   *
> + * Copyright (c) 2018-2018 David Veenstra <davidjulianveenstra@gmail.com>
>   * Copyright (c) 2010-2010 Analog Devices Inc.
>   *
>   * This program is free software; you can redistribute it and/or modify
> @@ -203,6 +204,7 @@ static struct spi_driver ad2s1200_driver = {
>  };
>  module_spi_driver(ad2s1200_driver);
>  
> +MODULE_AUTHOR("David Veenstra <davidjulianveenstra@gmail.com>");
>  MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
>  MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver");
>  MODULE_LICENSE("GPL v2");

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

* Re: [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging
  2018-05-18 18:23 ` [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging David Veenstra
@ 2018-05-20 11:17   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2018-05-20 11:17 UTC (permalink / raw)
  To: David Veenstra
  Cc: devel, devicetree, lars, Michael.Hennerich, linux-iio, robh+dt,
	pmeerw, knaack.h

On Fri, 18 May 2018 20:23:40 +0200
David Veenstra <davidjulianveenstra@gmail.com> wrote:

> Move the iio driver for the ad2s1200 and ad2s1205 resolver-to-digital
> converter out of staging, into mainline iio subsystems.
> 
> Signed-off-by: David Veenstra <davidjulianveenstra@gmail.com>
Some totally trivial rubbish inline that I noticed.
Doesn't need fixing really, I just might as well point it out whilst
looking at the rest.

Anyhow, the device tree bindings are outstanding, but only for reasons
of the formatting of the binding doc rather than real issues.  Please
follow through on that with a new version and I'd like to see an Ack
from Rob Herring for that.

Otherwise, looks good to me.  Thanks for you hard work on this.
Ideally we'd get it tested.  I do have a possibly working resolver now
so I might get to this in a few months.  If we find stuff then we can
fix it up outside staging just fine.  Seems fairly unlikely given
how simple the code ended up after you had cleaned it up but who knows.

Anyhow, applied to the togreg branch of iio.git and pushed out as
testing for the autobuilders to play with it.

Thanks,

Jonathan

> ---
>  drivers/iio/Kconfig                     |   1 +
>  drivers/iio/Makefile                    |   1 +
>  drivers/iio/resolver/Kconfig            |  17 ++
>  drivers/iio/resolver/Makefile           |   5 +
>  drivers/iio/resolver/ad2s1200.c         | 210 ++++++++++++++++++++++++
>  drivers/staging/iio/resolver/Kconfig    |  12 --
>  drivers/staging/iio/resolver/Makefile   |   1 -
>  drivers/staging/iio/resolver/ad2s1200.c | 210 ------------------------
>  8 files changed, 234 insertions(+), 223 deletions(-)
>  create mode 100644 drivers/iio/resolver/Kconfig
>  create mode 100644 drivers/iio/resolver/Makefile
>  create mode 100644 drivers/iio/resolver/ad2s1200.c
>  delete mode 100644 drivers/staging/iio/resolver/ad2s1200.c
> 
> diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig
> index d69e85a8bdc3..d08aeb41cd07 100644
> --- a/drivers/iio/Kconfig
> +++ b/drivers/iio/Kconfig
> @@ -93,6 +93,7 @@ source "drivers/iio/potentiometer/Kconfig"
>  source "drivers/iio/potentiostat/Kconfig"
>  source "drivers/iio/pressure/Kconfig"
>  source "drivers/iio/proximity/Kconfig"
> +source "drivers/iio/resolver/Kconfig"
>  source "drivers/iio/temperature/Kconfig"
>  
>  endif # IIO
> diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile
> index d8cba9c229c0..cb5993251381 100644
> --- a/drivers/iio/Makefile
> +++ b/drivers/iio/Makefile
> @@ -36,5 +36,6 @@ obj-y += potentiometer/
>  obj-y += potentiostat/
>  obj-y += pressure/
>  obj-y += proximity/
> +obj-y += resolver/
>  obj-y += temperature/
>  obj-y += trigger/
> diff --git a/drivers/iio/resolver/Kconfig b/drivers/iio/resolver/Kconfig
> new file mode 100644
> index 000000000000..2ced9f22aa70
> --- /dev/null
> +++ b/drivers/iio/resolver/Kconfig
> @@ -0,0 +1,17 @@
> +#
> +# Resolver/Synchro drivers
> +#
> +menu "Resolver to digital converters"
> +
> +config AD2S1200
> +	tristate "Analog Devices ad2s1200/ad2s1205 driver"
> +	depends on SPI
> +	depends on GPIOLIB || COMPILE_TEST
> +	help
> +	  Say yes here to build support for Analog Devices spi resolver
> +	  to digital converters, ad2s1200 and ad2s1205, provides direct access
> +	  via sysfs.
> +
> +	  To compile this driver as a module, choose M here: the
> +	  module will be called ad2s1200.
> +endmenu
> diff --git a/drivers/iio/resolver/Makefile b/drivers/iio/resolver/Makefile
> new file mode 100644
> index 000000000000..4e1dccae07e7
> --- /dev/null
> +++ b/drivers/iio/resolver/Makefile
> @@ -0,0 +1,5 @@
> +#
> +# Makefile for Resolver/Synchro drivers
> +#
> +
> +obj-$(CONFIG_AD2S1200) += ad2s1200.o
> diff --git a/drivers/iio/resolver/ad2s1200.c b/drivers/iio/resolver/ad2s1200.c
> new file mode 100644
> index 000000000000..28e618af9939
> --- /dev/null
> +++ b/drivers/iio/resolver/ad2s1200.c
> @@ -0,0 +1,210 @@
> +/*
> + * ad2s1200.c simple support for the ADI Resolver to Digital Converters:
> + * AD2S1200/1205
> + *
> + * Copyright (c) 2018-2018 David Veenstra <davidjulianveenstra@gmail.com>
> + * Copyright (c) 2010-2010 Analog Devices Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/bitops.h>
> +#include <linux/delay.h>
> +#include <linux/device.h>
> +#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/spi/spi.h>
> +#include <linux/sysfs.h>
> +#include <linux/types.h>
> +
> +#include <linux/iio/iio.h>
> +#include <linux/iio/sysfs.h>
> +
> +#define DRV_NAME "ad2s1200"
This feels a little pointless given the fact it is only used in
one place and is hardly a magic value (requiring a define to give it
a useful name.).

Meh, doesn't matter much though

> +
> +/* input clock on serial interface */
> +#define AD2S1200_HZ	8192000
> +/* clock period in nano second */
> +#define AD2S1200_TSCLK	(1000000000 / AD2S1200_HZ)
> +
> +/**
> + * struct ad2s1200_state - driver instance specific data.
> + * @lock:	protects both the GPIO pins and the rx buffer.
> + * @sdev:	spi device.
> + * @sample:	GPIO pin SAMPLE.
> + * @rdvel:	GPIO pin RDVEL.
> + * @rx:		buffer for spi transfers.
> + */
> +struct ad2s1200_state {
> +	struct mutex lock;
> +	struct spi_device *sdev;
> +	struct gpio_desc *sample;
> +	struct gpio_desc *rdvel;
> +	__be16 rx ____cacheline_aligned;
> +};
> +
> +static int ad2s1200_read_raw(struct iio_dev *indio_dev,
> +			     struct iio_chan_spec const *chan,
> +			     int *val,
> +			     int *val2,
> +			     long m)
> +{
> +	struct ad2s1200_state *st = iio_priv(indio_dev);
> +	int ret;
> +
> +	switch (m) {
> +	case IIO_CHAN_INFO_SCALE:
> +		switch (chan->type) {
> +		case IIO_ANGL:
> +			/* 2 * Pi / (2^12 - 1) ~= 0.001534355 */
> +			*val = 0;
> +			*val2 = 1534355;
> +			return IIO_VAL_INT_PLUS_NANO;
> +		case IIO_ANGL_VEL:
> +			/* 2 * Pi ~= 6.283185 */
> +			*val = 6;
> +			*val2 = 283185;
> +			return IIO_VAL_INT_PLUS_MICRO;
> +		default:
> +			return -EINVAL;
> +		}
> +		break;
> +	case IIO_CHAN_INFO_RAW:
> +		mutex_lock(&st->lock);
> +		gpiod_set_value(st->sample, 0);
> +
> +		/* delay (6 * AD2S1200_TSCLK + 20) nano seconds */
> +		udelay(1);
> +		gpiod_set_value(st->sample, 1);
> +		gpiod_set_value(st->rdvel, !!(chan->type == IIO_ANGL));
> +
> +		ret = spi_read(st->sdev, &st->rx, 2);
> +		if (ret < 0) {
> +			mutex_unlock(&st->lock);
> +			return ret;
> +		}
> +
> +		switch (chan->type) {
> +		case IIO_ANGL:
> +			*val = be16_to_cpup(&st->rx) >> 4;
> +			break;
> +		case IIO_ANGL_VEL:
> +			*val = sign_extend32(be16_to_cpup(&st->rx) >> 4, 11);
> +			break;
> +		default:
> +			mutex_unlock(&st->lock);
> +			return -EINVAL;
> +		}
> +
> +		/* delay (2 * AD2S1200_TSCLK + 20) ns for sample pulse */
> +		udelay(1);
> +		mutex_unlock(&st->lock);
> +
> +		return IIO_VAL_INT;
> +	default:
> +		break;
> +	}
> +
> +	return -EINVAL;
Totally trivial, but could move into the above switch
and save a couple of lines of code..  Only get here from the default
path after all.
> +}
> +
> +static const struct iio_chan_spec ad2s1200_channels[] = {
> +	{
> +		.type = IIO_ANGL,
> +		.indexed = 1,
> +		.channel = 0,
> +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
> +	}, {
> +		.type = IIO_ANGL_VEL,
> +		.indexed = 1,
> +		.channel = 0,
> +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
> +	}
> +};
> +
> +static const struct iio_info ad2s1200_info = {
> +	.read_raw = ad2s1200_read_raw,
> +};
> +
> +static int ad2s1200_probe(struct spi_device *spi)
> +{
> +	struct ad2s1200_state *st;
> +	struct iio_dev *indio_dev;
> +	int ret;
> +
> +	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
> +	if (!indio_dev)
> +		return -ENOMEM;
> +
> +	spi_set_drvdata(spi, indio_dev);
> +	st = iio_priv(indio_dev);
> +	mutex_init(&st->lock);
> +	st->sdev = spi;
> +
> +	st->sample = devm_gpiod_get(&spi->dev, "adi,sample", GPIOD_OUT_LOW);
> +	if (IS_ERR(st->sample)) {
> +		dev_err(&spi->dev, "Failed to claim SAMPLE gpio: err=%ld\n",
> +			PTR_ERR(st->sample));
> +		return PTR_ERR(st->sample);
> +	}
> +
> +	st->rdvel = devm_gpiod_get(&spi->dev, "adi,rdvel", GPIOD_OUT_LOW);
> +	if (IS_ERR(st->rdvel)) {
> +		dev_err(&spi->dev, "Failed to claim RDVEL gpio: err=%ld\n",
> +			PTR_ERR(st->rdvel));
> +		return PTR_ERR(st->rdvel);
> +	}
> +
> +	indio_dev->dev.parent = &spi->dev;
> +	indio_dev->info = &ad2s1200_info;
> +	indio_dev->modes = INDIO_DIRECT_MODE;
> +	indio_dev->channels = ad2s1200_channels;
> +	indio_dev->num_channels = ARRAY_SIZE(ad2s1200_channels);
> +	indio_dev->name = spi_get_device_id(spi)->name;
> +
> +	spi->max_speed_hz = AD2S1200_HZ;
> +	spi->mode = SPI_MODE_3;
> +	ret = spi_setup(spi);
> +
> +	if (ret < 0) {
> +		dev_err(&spi->dev, "spi_setup failed!\n");
> +		return ret;
> +	}
> +
> +	return devm_iio_device_register(&spi->dev, indio_dev);
> +}
> +
> +static const struct of_device_id ad2s1200_of_match[] = {
> +	{ .compatible = "adi,ad2s1200", },
> +	{ .compatible = "adi,ad2s1205", },
> +	{ }
> +};
> +MODULE_DEVICE_TABLE(of, ad2s1200_of_match);
> +
> +static const struct spi_device_id ad2s1200_id[] = {
> +	{ "ad2s1200" },
> +	{ "ad2s1205" },
> +	{}
> +};
> +MODULE_DEVICE_TABLE(spi, ad2s1200_id);
> +
> +static struct spi_driver ad2s1200_driver = {
> +	.driver = {
> +		.name = DRV_NAME,
> +		.of_match_table = of_match_ptr(ad2s1200_of_match),
> +	},
> +	.probe = ad2s1200_probe,
> +	.id_table = ad2s1200_id,
> +};
> +module_spi_driver(ad2s1200_driver);
> +
> +MODULE_AUTHOR("David Veenstra <davidjulianveenstra@gmail.com>");
> +MODULE_AUTHOR("Graff Yang <graff.yang@gmail.com>");
> +MODULE_DESCRIPTION("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver");
> +MODULE_LICENSE("GPL v2");

...

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

end of thread, other threads:[~2018-05-20 11:17 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-18 18:20 [PATCH v4 00/12] iio: ad2s1200: Driver clean up David Veenstra
2018-05-18 18:21 ` [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license David Veenstra
2018-05-20 10:52   ` Jonathan Cameron
2018-05-18 18:21 ` [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations David Veenstra
2018-05-20 10:53   ` Jonathan Cameron
2018-05-18 18:21 ` [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state David Veenstra
2018-05-20 10:53   ` Jonathan Cameron
2018-05-18 18:21 ` [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register David Veenstra
2018-05-20 10:55   ` Jonathan Cameron
2018-05-18 18:21 ` [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API David Veenstra
2018-05-20 11:04   ` Jonathan Cameron
2018-05-18 18:22 ` [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings David Veenstra
2018-05-20 11:01   ` Jonathan Cameron
2018-05-18 18:22 ` [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table David Veenstra
2018-05-20 11:02   ` Jonathan Cameron
2018-05-18 18:22 ` [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings David Veenstra
2018-05-20 11:05   ` Jonathan Cameron
2018-05-18 18:23 ` [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel David Veenstra
2018-05-20 11:09   ` Jonathan Cameron
2018-05-18 18:23 ` [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel David Veenstra
2018-05-20 11:10   ` Jonathan Cameron
2018-05-18 18:23 ` [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright David Veenstra
2018-05-20 11:11   ` Jonathan Cameron
2018-05-18 18:23 ` [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging David Veenstra
2018-05-20 11:17   ` Jonathan Cameron

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