Message ID | 3f0bc36261c54c945a3213ef03425099e57e9060.1541733949.git.nishadkamdar@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | staging: iio: ad7816: Switch to the gpio descriptor interface | expand |
On Fri, 9 Nov 2018 13:06:24 +0530 Nishad Kamdar <nishadkamdar@gmail.com> wrote: > AD7818 does not support busy_pin functionality as per datasheet. > Hence drop busy_pin when AD7818 is used. > > Signed-off-by: Nishad Kamdar <nishadkamdar@gmail.com> Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it. A slight concern that I can't immediately find an answer to, is whether we should be waiting a short while for the ad7818 given we can't wait on the gpio? We can add this in a follow up patch if it is necessary. Thanks, Jonathan > --- > drivers/staging/iio/adc/ad7816.c | 35 ++++++++++++++++++++++---------- > 1 file changed, 24 insertions(+), 11 deletions(-) > > diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c > index 12c4e0ab4713..3cda5cd09365 100644 > --- a/drivers/staging/iio/adc/ad7816.c > +++ b/drivers/staging/iio/adc/ad7816.c > @@ -43,6 +43,7 @@ > */ > > struct ad7816_chip_info { > + kernel_ulong_t id; > struct spi_device *spi_dev; > struct gpio_desc *rdwr_pin; > struct gpio_desc *convert_pin; > @@ -52,6 +53,12 @@ struct ad7816_chip_info { > u8 mode; > }; > > +enum ad7816_type { > + ID_AD7816, > + ID_AD7817, > + ID_AD7818, > +}; > + > /* > * ad7816 data access by SPI > */ > @@ -78,8 +85,10 @@ static int ad7816_spi_read(struct ad7816_chip_info *chip, u16 *data) > gpiod_set_value(chip->convert_pin, 1); > } > > - while (gpiod_get_value(chip->busy_pin)) > - cpu_relax(); > + if (chip->id == ID_AD7816 || chip->id == ID_AD7817) { > + while (gpiod_get_value(chip->busy_pin)) > + cpu_relax(); > + } > > gpiod_set_value(chip->rdwr_pin, 0); > gpiod_set_value(chip->rdwr_pin, 1); > @@ -359,6 +368,7 @@ static int ad7816_probe(struct spi_device *spi_dev) > for (i = 0; i <= AD7816_CS_MAX; i++) > chip->oti_data[i] = 203; > > + chip->id = spi_get_device_id(spi_dev)->driver_data; > chip->rdwr_pin = devm_gpiod_get(&spi_dev->dev, "rdwr", GPIOD_IN); > if (IS_ERR(chip->rdwr_pin)) { > ret = PTR_ERR(chip->rdwr_pin); > @@ -373,12 +383,15 @@ static int ad7816_probe(struct spi_device *spi_dev) > ret); > return ret; > } > - chip->busy_pin = devm_gpiod_get(&spi_dev->dev, "busy", GPIOD_IN); > - if (IS_ERR(chip->busy_pin)) { > - ret = PTR_ERR(chip->busy_pin); > - dev_err(&spi_dev->dev, "Failed to request busy GPIO: %d\n", > - ret); > - return ret; > + if (chip->id == ID_AD7816 || chip->id == ID_AD7817) { > + chip->busy_pin = devm_gpiod_get(&spi_dev->dev, "busy", > + GPIOD_IN); > + if (IS_ERR(chip->busy_pin)) { > + ret = PTR_ERR(chip->busy_pin); > + dev_err(&spi_dev->dev, "Failed to request busy GPIO: %d\n", > + ret); > + return ret; > + } > } > > indio_dev->name = spi_get_device_id(spi_dev)->name; > @@ -409,9 +422,9 @@ static int ad7816_probe(struct spi_device *spi_dev) > } > > static const struct spi_device_id ad7816_id[] = { > - { "ad7816", 0 }, > - { "ad7817", 0 }, > - { "ad7818", 0 }, > + { "ad7816", ID_AD7816 }, > + { "ad7817", ID_AD7817 }, > + { "ad7818", ID_AD7818 }, > {} > }; >
diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c index 12c4e0ab4713..3cda5cd09365 100644 --- a/drivers/staging/iio/adc/ad7816.c +++ b/drivers/staging/iio/adc/ad7816.c @@ -43,6 +43,7 @@ */ struct ad7816_chip_info { + kernel_ulong_t id; struct spi_device *spi_dev; struct gpio_desc *rdwr_pin; struct gpio_desc *convert_pin; @@ -52,6 +53,12 @@ struct ad7816_chip_info { u8 mode; }; +enum ad7816_type { + ID_AD7816, + ID_AD7817, + ID_AD7818, +}; + /* * ad7816 data access by SPI */ @@ -78,8 +85,10 @@ static int ad7816_spi_read(struct ad7816_chip_info *chip, u16 *data) gpiod_set_value(chip->convert_pin, 1); } - while (gpiod_get_value(chip->busy_pin)) - cpu_relax(); + if (chip->id == ID_AD7816 || chip->id == ID_AD7817) { + while (gpiod_get_value(chip->busy_pin)) + cpu_relax(); + } gpiod_set_value(chip->rdwr_pin, 0); gpiod_set_value(chip->rdwr_pin, 1); @@ -359,6 +368,7 @@ static int ad7816_probe(struct spi_device *spi_dev) for (i = 0; i <= AD7816_CS_MAX; i++) chip->oti_data[i] = 203; + chip->id = spi_get_device_id(spi_dev)->driver_data; chip->rdwr_pin = devm_gpiod_get(&spi_dev->dev, "rdwr", GPIOD_IN); if (IS_ERR(chip->rdwr_pin)) { ret = PTR_ERR(chip->rdwr_pin); @@ -373,12 +383,15 @@ static int ad7816_probe(struct spi_device *spi_dev) ret); return ret; } - chip->busy_pin = devm_gpiod_get(&spi_dev->dev, "busy", GPIOD_IN); - if (IS_ERR(chip->busy_pin)) { - ret = PTR_ERR(chip->busy_pin); - dev_err(&spi_dev->dev, "Failed to request busy GPIO: %d\n", - ret); - return ret; + if (chip->id == ID_AD7816 || chip->id == ID_AD7817) { + chip->busy_pin = devm_gpiod_get(&spi_dev->dev, "busy", + GPIOD_IN); + if (IS_ERR(chip->busy_pin)) { + ret = PTR_ERR(chip->busy_pin); + dev_err(&spi_dev->dev, "Failed to request busy GPIO: %d\n", + ret); + return ret; + } } indio_dev->name = spi_get_device_id(spi_dev)->name; @@ -409,9 +422,9 @@ static int ad7816_probe(struct spi_device *spi_dev) } static const struct spi_device_id ad7816_id[] = { - { "ad7816", 0 }, - { "ad7817", 0 }, - { "ad7818", 0 }, + { "ad7816", ID_AD7816 }, + { "ad7817", ID_AD7817 }, + { "ad7818", ID_AD7818 }, {} };
AD7818 does not support busy_pin functionality as per datasheet. Hence drop busy_pin when AD7818 is used. Signed-off-by: Nishad Kamdar <nishadkamdar@gmail.com> --- drivers/staging/iio/adc/ad7816.c | 35 ++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 11 deletions(-)