On Sun, 2018-09-16 at 12:22 +0100, Jonathan Cameron wrote: > On Thu, 13 Sep 2018 14:02:12 +0300 > Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> wrote: > > > Add support for the AD7605-4 to the AD7606 driver. The AD7605-4 is > > mostly > > interface compatible to the AD7606-6 with the only difference being not > > having support for oversampling. > > > > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> > > I am guessing this might clash with the devm change from earlier in the > day so I'm not going to apply it (too much risk of a bug sneaking in). > > Please resend the remaining patches in for this driver as a series so > ordering is obvious etc. Hmm, the patch doesn't clash, but I will send them as a series. > > Otherwise this one looks good to me. > > Thanks, > > Jonathan Thanks Alex > > --- > > drivers/staging/iio/adc/Kconfig | 2 +- > > drivers/staging/iio/adc/ad7606.c | 33 +++++++++++++++++++++++----- > > drivers/staging/iio/adc/ad7606.h | 3 +++ > > drivers/staging/iio/adc/ad7606_par.c | 3 +++ > > drivers/staging/iio/adc/ad7606_spi.c | 1 + > > 5 files changed, 36 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/staging/iio/adc/Kconfig > > b/drivers/staging/iio/adc/Kconfig > > index e17efb03bac0..9d3062a07460 100644 > > --- a/drivers/staging/iio/adc/Kconfig > > +++ b/drivers/staging/iio/adc/Kconfig > > @@ -11,7 +11,7 @@ config AD7606 > > select IIO_TRIGGERED_BUFFER > > help > > Say yes here to build support for Analog Devices: > > - ad7606, ad7606-6, ad7606-4 analog to digital converters > > (ADC). > > + ad7605-4, ad7606, ad7606-6, ad7606-4 analog to digital > > converters (ADC). > > > > To compile this driver as a module, choose M here: the > > module will be called ad7606. > > diff --git a/drivers/staging/iio/adc/ad7606.c > > b/drivers/staging/iio/adc/ad7606.c > > index 793de92f27ed..06d65196bedb 100644 > > --- a/drivers/staging/iio/adc/ad7606.c > > +++ b/drivers/staging/iio/adc/ad7606.c > > @@ -275,7 +275,7 @@ static const struct attribute_group > > ad7606_attribute_group_range = { > > .attrs = ad7606_attributes_range, > > }; > > > > -#define AD7606_CHANNEL(num) \ > > +#define AD760X_CHANNEL(num, mask) \ > > { \ > > .type = IIO_VOLTAGE, \ > > .indexed = 1, \ > > @@ -283,8 +283,7 @@ static const struct attribute_group > > ad7606_attribute_group_range = { > > .address = num, > > \ > > .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ > > .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),\ > > - .info_mask_shared_by_all = \ > > - BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > \ > > + .info_mask_shared_by_all = mask, \ > > .scan_index = num, \ > > .scan_type = { > > \ > > .sign = 's', \ > > @@ -294,6 +293,20 @@ static const struct attribute_group > > ad7606_attribute_group_range = { > > }, \ > > } > > > > +#define AD7605_CHANNEL(num) \ > > + AD760X_CHANNEL(num, 0) > > + > > +#define AD7606_CHANNEL(num) \ > > + AD760X_CHANNEL(num, BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO)) > > + > > +static const struct iio_chan_spec ad7605_channels[] = { > > + IIO_CHAN_SOFT_TIMESTAMP(4), > > + AD7605_CHANNEL(0), > > + AD7605_CHANNEL(1), > > + AD7605_CHANNEL(2), > > + AD7605_CHANNEL(3), > > +}; > > + > > static const struct iio_chan_spec ad7606_channels[] = { > > IIO_CHAN_SOFT_TIMESTAMP(8), > > AD7606_CHANNEL(0), > > @@ -310,17 +323,24 @@ static const struct ad7606_chip_info > > ad7606_chip_info_tbl[] = { > > /* > > * More devices added in future > > */ > > + [ID_AD7605_4] = { > > + .channels = ad7605_channels, > > + .num_channels = 5, > > + }, > > [ID_AD7606_8] = { > > .channels = ad7606_channels, > > .num_channels = 9, > > + .has_oversampling = true, > > }, > > [ID_AD7606_6] = { > > .channels = ad7606_channels, > > .num_channels = 7, > > + .has_oversampling = true, > > }, > > [ID_AD7606_4] = { > > .channels = ad7606_channels, > > .num_channels = 5, > > + .has_oversampling = true, > > }, > > }; > > > > @@ -351,6 +371,9 @@ static int ad7606_request_gpios(struct ad7606_state > > *st) > > if (IS_ERR(st->gpio_frstdata)) > > return PTR_ERR(st->gpio_frstdata); > > > > + if (!st->chip_info->has_oversampling) > > + return 0; > > + > > st->gpio_os = devm_gpiod_get_array_optional(dev, > > "oversampling-ratio", > > GPIOD_OUT_LOW); > > return PTR_ERR_OR_ZERO(st->gpio_os); > > @@ -429,12 +452,12 @@ int ad7606_probe(struct device *dev, int irq, > > void __iomem *base_address, > > return ret; > > } > > > > + st->chip_info = &ad7606_chip_info_tbl[id]; > > + > > ret = ad7606_request_gpios(st); > > if (ret) > > goto error_disable_reg; > > > > - st->chip_info = &ad7606_chip_info_tbl[id]; > > - > > indio_dev->dev.parent = dev; > > if (st->gpio_os) { > > if (st->gpio_range) > > diff --git a/drivers/staging/iio/adc/ad7606.h > > b/drivers/staging/iio/adc/ad7606.h > > index 57f11b46bc69..f422296354c9 100644 > > --- a/drivers/staging/iio/adc/ad7606.h > > +++ b/drivers/staging/iio/adc/ad7606.h > > @@ -13,11 +13,13 @@ > > * struct ad7606_chip_info - chip specific information > > * @channels: channel specification > > * @num_channels: number of channels > > + * @has_oversampling: whether the device has oversampling support > > */ > > > > struct ad7606_chip_info { > > const struct iio_chan_spec *channels; > > unsigned int num_channels; > > + bool has_oversampling; > > }; > > > > /** > > @@ -87,6 +89,7 @@ int ad7606_probe(struct device *dev, int irq, void > > __iomem *base_address, > > int ad7606_remove(struct device *dev, int irq); > > > > enum ad7606_supported_device_ids { > > + ID_AD7605_4, > > ID_AD7606_8, > > ID_AD7606_6, > > ID_AD7606_4 > > diff --git a/drivers/staging/iio/adc/ad7606_par.c > > b/drivers/staging/iio/adc/ad7606_par.c > > index 956e38774767..8bd86e727b02 100644 > > --- a/drivers/staging/iio/adc/ad7606_par.c > > +++ b/drivers/staging/iio/adc/ad7606_par.c > > @@ -79,6 +79,9 @@ static int ad7606_par_remove(struct platform_device > > *pdev) > > > > static const struct platform_device_id ad7606_driver_ids[] = { > > { > > + .name = "ad7605-4", > > + .driver_data = ID_AD7605_4, > > + }, { > > .name = "ad7606-8", > > .driver_data = ID_AD7606_8, > > }, { > > diff --git a/drivers/staging/iio/adc/ad7606_spi.c > > b/drivers/staging/iio/adc/ad7606_spi.c > > index ffd9d0626ec2..b76ca5a8c059 100644 > > --- a/drivers/staging/iio/adc/ad7606_spi.c > > +++ b/drivers/staging/iio/adc/ad7606_spi.c > > @@ -55,6 +55,7 @@ static int ad7606_spi_remove(struct spi_device *spi) > > } > > > > static const struct spi_device_id ad7606_id[] = { > > + {"ad7605-4", ID_AD7605_4}, > > {"ad7606-8", ID_AD7606_8}, > > {"ad7606-6", ID_AD7606_6}, > > {"ad7606-4", ID_AD7606_4}, > >