On Fri, 9 Nov 2018 13:06:24 +0530 Nishad Kamdar <nishadkamdar@xxxxxxxxx> 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@xxxxxxxxx> 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 }, > {} > }; > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel