iio: ad2s1200: Driver clean up
Subsystems (5)
v4 cover iio: ad2s1200: Driver clean up
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
Signature · 1 line
2.17.0
PATCH v4 1/12 staging: iio: ad2s1200: Remove unneeded newline in license
Remove unneeded newline in license, as it does not improve readability.
---
Changes in v4:
- Introduced in this version.
drivers/staging/iio/resolver/ad2s1200.c | 1 - 1 file changed, 1 deletion(-)
drivers/staging/iio/resolver/ad2s1200.c +0 -1
@@ -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>
Signature · 1 line
2.17.0
Re: [PATCH v4 01/12] staging: iio: ad2s1200: Remove unneeded newline in license
Quoted 3 lines · On Fri, 18 May 2018 20:21:06 +0200 David Veenstra…
Remove unneeded newline in license, as it does not improve readability.
Signed-off-by David Veenstra <[email protected]>
Applied, thanks
Jonathan
Quoted 19 lines
---
Changes in v4:
- Introduced in this version.drivers/staging/iio/resolver/ad2s1200.c | 1 - 1 file changed, 1 deletion(-)drivers/staging/iio/resolver/ad2s1200.c +0
-1@@ -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>
PATCH v4 2/12 staging: iio: ad2s1200: Remove unneeded initializations
In reply to David VeenstraRemove 2 initializations which are unneeded, because the initialized values are never used.
---
Changes in v4:
- Introduced in this version.
drivers/staging/iio/resolver/ad2s1200.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/iio/resolver/ad2s1200.c +2 -2
@@ -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,
Signature · 1 line
2.17.0
Re: [PATCH v4 02/12] staging: iio: ad2s1200: Remove unneeded initializations
Quoted 4 lines · On Fri, 18 May 2018 20:21:23 +0200 David Veenstra…
Remove 2 initializations which are unneeded, because the initialized values are never used.
Signed-off-by David Veenstra <[email protected]>
Applied.
Quoted 29 lines
---
Changes in v4:
- Introduced in this version.drivers/staging/iio/resolver/ad2s1200.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/staging/iio/resolver/ad2s1200.c +2
-2@@ -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,
PATCH v4 3/12 staging: iio: ad2s1200: Add kernel docs to driver state
In reply to David VeenstraAdd missing kernel docs to the ad2s1200 driver state.
---
Changes in v4:
- Simplified explanation of lock.
drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/staging/iio/resolver/ad2s1200.c +8 -0
@@ -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;
Signature · 1 line
2.17.0
Re: [PATCH v4 03/12] staging: iio: ad2s1200: Add kernel docs to driver state
Quoted 3 lines · On Fri, 18 May 2018 20:21:34 +0200 David Veenstra…
Add missing kernel docs to the ad2s1200 driver state.
Signed-off-by David Veenstra <[email protected]>
Nice.
Applied,
Jonathan
Quoted 26 lines
---
Changes in v4:
- Simplified explanation of lock.drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++ 1 file changed, 8 insertions(+)drivers/staging/iio/resolver/ad2s1200.c +8
-0@@ -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;
PATCH v4 4/12 staging: iio: ad2s1200: Setup spi before iio device register
In reply to David VeenstraThe spi should be set up before the device is registered as an iio device.
This patch moves the setup to before the device registration.
---
Changes in v4:
- Introduced in this version.
drivers/staging/iio/resolver/ad2s1200.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/staging/iio/resolver/ad2s1200.c +7 -6
@@ -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[] = {
Signature · 1 line
2.17.0
Jonathan Cameron
maintainerRe: [PATCH v4 04/12] staging: iio: ad2s1200: Setup spi before iio device register
Quoted 6 lines · On Fri, 18 May 2018 20:21:44 +0200 David Veenstra…
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 <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 34 lines
---
Changes in v4:
- Introduced in this version.drivers/staging/iio/resolver/ad2s1200.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)drivers/staging/iio/resolver/ad2s1200.c +7
-6@@ -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[] = {
PATCH v4 5/12 staging: iio: ad2s1200: Replace legacy gpio API with modern API
In reply to David VeenstraThe legacy, integer based gpio API is replaced with the modern descriptor based API.
--- drivers/staging/iio/resolver/ad2s1200.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/staging/iio/resolver/ad2s1200.c +8 -7
@@ -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;
Signature · 1 line
2.17.0
Re: [PATCH v4 05/12] staging: iio: ad2s1200: Replace legacy gpio API with modern API
Quoted 4 lines · On Fri, 18 May 2018 20:21:56 +0200 David Veenstra…
The legacy, integer based gpio API is replaced with the modern descriptor based API.
Signed-off-by David Veenstra <[email protected]>
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
Quoted 54 lines
--- drivers/staging/iio/resolver/ad2s1200.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)drivers/staging/iio/resolver/ad2s1200.c +8
-7@@ -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;
PATCH v4 6/12 staging: iio: ad2s1200: Replace platform data with dt bindings
In reply to David VeenstraRemove usage of platform data, and replace it with device tree facilities.
---
Changes in v4:
- Added vendor prefix to gpio function names.
drivers/staging/iio/resolver/ad2s1200.c | 32 ++++++++++++------------- 1 file changed, 15 insertions(+), 17 deletions(-)
drivers/staging/iio/resolver/ad2s1200.c +15 -17
@@ -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;
Signature · 1 line
2.17.0
Jonathan Cameron
maintainerRe: [PATCH v4 06/12] staging: iio: ad2s1200: Replace platform data with dt bindings
Quoted 4 lines · On Fri, 18 May 2018 20:22:32 +0200 David Veenstra…
Remove usage of platform data, and replace it with device tree facilities.
Signed-off-by David Veenstra <[email protected]>
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
Quoted 66 lines
---
Changes in v4:
- Added vendor prefix to gpio function names.drivers/staging/iio/resolver/ad2s1200.c | 32 ++++++++++++------------- 1 file changed, 15 insertions(+), 17 deletions(-)drivers/staging/iio/resolver/ad2s1200.c +15
-17@@ -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;
PATCH v4 7/12 staging: iio: ad2s1200: Add dt table
In reply to David VeenstraAdd device tree table for matching with the vendor ID.
---
Changes in v4:
- Introduced in this version.
drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/staging/iio/resolver/ad2s1200.c +8 -0
@@ -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,
Signature · 1 line
2.17.0
Re: [PATCH v4 07/12] staging: iio: ad2s1200: Add dt table
Quoted 3 lines · On Fri, 18 May 2018 20:22:41 +0200 David Veenstra…
Add device tree table for matching with the vendor ID.
Signed-off-by David Veenstra <[email protected]>
Applied
Thanks,
Jonathan
Quoted 33 lines
---
Changes in v4:
- Introduced in this version.drivers/staging/iio/resolver/ad2s1200.c | 8 ++++++++ 1 file changed, 8 insertions(+)drivers/staging/iio/resolver/ad2s1200.c +8
-0@@ -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,
PATCH v4 8/12 dt-bindings: iio: resolver: Document AD2S1200 bindings
In reply to David VeenstraAdd documentation for the device tree bindings of the AD2S1200 resolver.
---
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
Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt new file +16 -0
@@ -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>; + };
Signature · 1 line
2.17.0
Jonathan Cameron
maintainerRe: [PATCH v4 08/12] dt-bindings: iio: resolver: Document AD2S1200 bindings
Quoted 3 lines · On Fri, 18 May 2018 20:22:50 +0200 David Veenstra…
Add documentation for the device tree bindings of the AD2S1200 resolver.
Signed-off-by David Veenstra <[email protected]>
Nothing fundamentally wrong it in here, but a few things to tidy up.
Quoted 17 lines
---
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.txtDocumentation/devicetree/bindings/iio/resolver/ad2s1200.txt new file +0
-0
Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt line 4
Quoted 4 lines
Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt new file +4
-0@@ -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.
Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt line 11
Quoted 7 lines
Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt new file +7
-0+ - 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.
Quoted 5 lines
Documentation/devicetree/bindings/iio/resolver/ad2s1200.txt new file +5
-0+ compatible = "adi,ad2s1200"; + reg = <4>; + adi,sample-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>; + adi,rdvel-gpios = <&gpio 6 GPIO_ACTIVE_HIGH>; + };
PATCH v4 9/12 staging: iio: ad2s1200: Add scaling factor for angular velocity channel
In reply to David VeenstraThe 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.
---
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(-)
drivers/staging/iio/resolver/ad2s1200.c +45 -26
@@ -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), } };
Signature · 1 line
2.17.0
Jonathan Cameron
maintainerRe: [PATCH v4 09/12] staging: iio: ad2s1200: Add scaling factor for angular velocity channel
Quoted 6 lines · On Fri, 18 May 2018 20:23:01 +0200 David Veenstra…
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 <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 102 lines
---
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(-)drivers/staging/iio/resolver/ad2s1200.c +45
-26@@ -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), } };
PATCH v4 10/12 staging: iio: ad2s1200: Add scaling factor for angle channel
In reply to David VeenstraA 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.
--- drivers/staging/iio/resolver/ad2s1200.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/staging/iio/resolver/ad2s1200.c +6 -0
@@ -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,
Signature · 1 line
2.17.0
Re: [PATCH v4 10/12] staging: iio: ad2s1200: Add scaling factor for angle channel
Quoted 8 lines · On Fri, 18 May 2018 20:23:14 +0200 David Veenstra…
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_NANOis used, so that the scale of both the angle channel and angular velocity channel has 7 significant digits.Signed-off-by David Veenstra <[email protected]>
Applied
Thanks,
Jonathan
Quoted 28 lines
--- drivers/staging/iio/resolver/ad2s1200.c | 6 ++++++ 1 file changed, 6 insertions(+)drivers/staging/iio/resolver/ad2s1200.c +6
-0@@ -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,
PATCH v4 11/12 staging: iio: ad2s1200: Add copyright
In reply to David VeenstraAdd David Veenstra as a copyright holders and as an author, for all of the staging clean ups of the ad2s1200 driver.
---
Changes in v4:
- Introduced in this version.
drivers/staging/iio/resolver/ad2s1200.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/staging/iio/resolver/ad2s1200.c +2 -0
@@ -2,6 +2,7 @@* ad2s1200.c simple support for the ADI Resolver to Digital Converters: * AD2S1200/1205 * +* Copyright (c) 2018-2018 David Veenstra <[email protected]> * 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 <[email protected]>" );MODULE_AUTHOR ("Graff Yang <[email protected]>" );MODULE_DESCRIPTION ("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.17.0
Jonathan Cameron
maintainerRe: [PATCH v4 11/12] staging: iio: ad2s1200: Add copyright
Quoted 4 lines · On Fri, 18 May 2018 20:23:25 +0200 David Veenstra…
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 <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 27 lines
---
Changes in v4:
- Introduced in this version.drivers/staging/iio/resolver/ad2s1200.c | 2 ++ 1 file changed, 2 insertions(+)drivers/staging/iio/resolver/ad2s1200.c +2
-0@@ -2,6 +2,7 @@* ad2s1200.c simple support for the ADI Resolver to Digital Converters: * AD2S1200/1205 * +* Copyright (c) 2018-2018 David Veenstra <[email protected]> * 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 <[email protected]>" );MODULE_AUTHOR ("Graff Yang <[email protected]>" );MODULE_DESCRIPTION ("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver" );MODULE_LICENSE ("GPL v2" );
PATCH v4 12/12 staging: iio: ad2s1200: Move driver out of staging
In reply to David VeenstraMove the iio driver for the ad2s1200 and ad2s1205 resolver-to-digital converter out of staging, into mainline iio subsystems.
--- 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
drivers/iio/Kconfig +1 -0
@@ -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
drivers/iio/Makefile +1 -0
@@ -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/
drivers/iio/resolver/Kconfig new file +17 -0
@@ -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
drivers/iio/resolver/Makefile new file +5 -0
@@ -0,0 +1,5 @@ +# +# Makefile for Resolver/Synchro drivers +# + +obj-$(CONFIG_AD2S1200) += ad2s1200.o
drivers/iio/resolver/ad2s1200.c new file +210 -0
210 lines not on this page · raw message
drivers/staging/iio/resolver/Kconfig +0 -12
@@ -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
drivers/staging/iio/resolver/Makefile +0 -1
@@ -3,5 +3,4 @@ # obj-$(CONFIG_AD2S90) += ad2s90.o -obj-$(CONFIG_AD2S1200) += ad2s1200.o obj-$(CONFIG_AD2S1210) += ad2s1210.o
drivers/staging/iio/resolver/ad2s1200.c deleted +0 -210
210 lines not on this page · raw message
Signature · 1 line
2.17.0
Jonathan Cameron
maintainerRe: [PATCH v4 12/12] staging: iio: ad2s1200: Move driver out of staging
Quoted 4 lines · On Fri, 18 May 2018 20:23:40 +0200 David Veenstra…
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 <[email protected]>
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
Quoted 95 lines
--- 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.cdrivers/iio/Kconfig +1
-0@@ -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 # IIOdrivers/iio/Makefile +1
-0@@ -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/drivers/iio/resolver/Kconfig new file +17
-0@@ -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. +endmenudrivers/iio/resolver/Makefile new file +5
-0@@ -0,0 +1,5 @@ +# +# Makefile for Resolver/Synchro drivers +# + +obj-$(CONFIG_AD2S1200) += ad2s1200.odrivers/iio/resolver/ad2s1200.c new file +17
-0@@ -0,0 +1,210 @@ +/* +* ad2s1200.c simple support for the ADI Resolver to Digital Converters: +* AD2S1200/1205 +* +* Copyright (c) 2018-2018 David Veenstra <[email protected]> +* 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>
drivers/iio/resolver/ad2s1200.c line 27
Quoted 10 lines
drivers/iio/resolver/ad2s1200.c new file +10
-0+#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
Quoted 75 lines
drivers/iio/resolver/ad2s1200.c new file +75
-0+ +/* 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 ; + } +
drivers/iio/resolver/ad2s1200.c line 112
Quoted 10 lines
drivers/iio/resolver/ad2s1200.c new file +10
-0+/* 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.
Quoted 98 lines
drivers/iio/resolver/ad2s1200.c new file +98
-0+} + +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 <[email protected]>" ); +MODULE_AUTHOR ("Graff Yang <[email protected]>" ); +MODULE_DESCRIPTION ("Analog Devices AD2S1200/1205 Resolver to Digital SPI driver" ); +MODULE_LICENSE ("GPL v2" );
...