On Tue, 2 Apr 2019 16:18:40 +0300 Beniamin Bia <beniamin.bia@xxxxxxxxxx> wrote: > The AD7616 is a 12-bit ADC with 16 channels. > > The AD7616 can be configured to work in hardware mode by controlling it via > gpio pins and read data via spi. No support for software mode yet, but it > is a work in progress. > > This device requires a reset in order to update oversampling, so chip info > has got a new attribute to mark this. > > The current assumption that this driver makes for AD7616, is that it's > working in Hardware Mode with Serial, Burst and Sequencer modes activated. > To activate them, following pins must be pulled high: > -SER/PAR > -SEQEN > And following must be pulled low: > -WR/BURST > -DB4/SEQEN > > Datasheets: > Link: https://www.analog.com/media/en/technical-documentation/data-sheets/ad7616.pdf > > Signed-off-by: Beniamin Bia <beniamin.bia@xxxxxxxxxx> > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> Looks good to me. One thing to look at in future is making it completely clear what the various people in the signed-off-by list did. It may be that you would ideally have a co-authored-by tag in here? The usecases for that have only be clarified very recently so I won't worry too much this time. Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it. Thanks, Jonathan > --- > drivers/iio/adc/ad7606.c | 46 ++++++++++++++++++++++++++++++++++++ > drivers/iio/adc/ad7606.h | 9 ++++--- > drivers/iio/adc/ad7606_spi.c | 2 ++ > 3 files changed, 54 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c > index 6b87ed410c93..24c70c3cefb4 100644 > --- a/drivers/iio/adc/ad7606.c > +++ b/drivers/iio/adc/ad7606.c > @@ -39,6 +39,10 @@ static const unsigned int ad7606_oversampling_avail[7] = { > 1, 2, 4, 8, 16, 32, 64, > }; > > +static const unsigned int ad7616_oversampling_avail[8] = { > + 1, 2, 4, 8, 16, 32, 64, 128, > +}; > + > static int ad7606_reset(struct ad7606_state *st) > { > if (st->gpio_reset) { > @@ -220,6 +224,11 @@ static int ad7606_write_raw(struct iio_dev *indio_dev, > mutex_lock(&st->lock); > gpiod_set_array_value(ARRAY_SIZE(values), st->gpio_os->desc, > st->gpio_os->info, values); > + > + /* AD7616 requires a reset to update value */ > + if (st->chip_info->os_req_reset) > + ad7606_reset(st); > + > st->oversampling = st->oversampling_avail[i]; > mutex_unlock(&st->lock); > > @@ -314,6 +323,36 @@ static const struct iio_chan_spec ad7606_channels[] = { > AD7606_CHANNEL(7), > }; > > +/* > + * The current assumption that this driver makes for AD7616, is that it's > + * working in Hardware Mode with Serial, Burst and Sequencer modes activated. > + * To activate them, following pins must be pulled high: > + * -SER/PAR > + * -SEQEN > + * And following pins must be pulled low: > + * -WR/BURST > + * -DB4/SER1W > + */ > +static const struct iio_chan_spec ad7616_channels[] = { > + IIO_CHAN_SOFT_TIMESTAMP(16), > + AD7606_CHANNEL(0), > + AD7606_CHANNEL(1), > + AD7606_CHANNEL(2), > + AD7606_CHANNEL(3), > + AD7606_CHANNEL(4), > + AD7606_CHANNEL(5), > + AD7606_CHANNEL(6), > + AD7606_CHANNEL(7), > + AD7606_CHANNEL(8), > + AD7606_CHANNEL(9), > + AD7606_CHANNEL(10), > + AD7606_CHANNEL(11), > + AD7606_CHANNEL(12), > + AD7606_CHANNEL(13), > + AD7606_CHANNEL(14), > + AD7606_CHANNEL(15), > +}; > + > static const struct ad7606_chip_info ad7606_chip_info_tbl[] = { > /* More devices added in future */ > [ID_AD7605_4] = { > @@ -338,6 +377,13 @@ static const struct ad7606_chip_info ad7606_chip_info_tbl[] = { > .oversampling_avail = ad7606_oversampling_avail, > .oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail), > }, > + [ID_AD7616] = { > + .channels = ad7616_channels, > + .num_channels = 17, > + .oversampling_avail = ad7616_oversampling_avail, > + .oversampling_num = ARRAY_SIZE(ad7616_oversampling_avail), > + .os_req_reset = true, > + }, > }; > > static int ad7606_request_gpios(struct ad7606_state *st) > diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h > index 8c91bd427c4e..f9ef52131e74 100644 > --- a/drivers/iio/adc/ad7606.h > +++ b/drivers/iio/adc/ad7606.h > @@ -15,12 +15,14 @@ > * @oversampling_avail pointer to the array which stores the available > * oversampling ratios. > * @oversampling_num number of elements stored in oversampling_avail array > + * @os_req_reset some devices require a reset to update oversampling > */ > struct ad7606_chip_info { > const struct iio_chan_spec *channels; > unsigned int num_channels; > const unsigned int *oversampling_avail; > unsigned int oversampling_num; > + bool os_req_reset; > }; > > /** > @@ -76,9 +78,9 @@ struct ad7606_state { > /* > * DMA (thus cache coherency maintenance) requires the > * transfer buffers to live in their own cache lines. > - * 8 * 16-bit samples + 64-bit timestamp > + * 16 * 16-bit samples + 64-bit timestamp > */ > - unsigned short data[12] ____cacheline_aligned; > + unsigned short data[20] ____cacheline_aligned; > }; > > /** > @@ -98,7 +100,8 @@ enum ad7606_supported_device_ids { > ID_AD7605_4, > ID_AD7606_8, > ID_AD7606_6, > - ID_AD7606_4 > + ID_AD7606_4, > + ID_AD7616, > }; > > #ifdef CONFIG_PM_SLEEP > diff --git a/drivers/iio/adc/ad7606_spi.c b/drivers/iio/adc/ad7606_spi.c > index 4fd0ec36a086..b7faef69a58f 100644 > --- a/drivers/iio/adc/ad7606_spi.c > +++ b/drivers/iio/adc/ad7606_spi.c > @@ -53,6 +53,7 @@ static const struct spi_device_id ad7606_id_table[] = { > { "ad7606-4", ID_AD7606_4 }, > { "ad7606-6", ID_AD7606_6 }, > { "ad7606-8", ID_AD7606_8 }, > + { "ad7616", ID_AD7616 }, > {} > }; > MODULE_DEVICE_TABLE(spi, ad7606_id_table); > @@ -62,6 +63,7 @@ static const struct of_device_id ad7606_of_match[] = { > { .compatible = "adi,ad7606-4" }, > { .compatible = "adi,ad7606-6" }, > { .compatible = "adi,ad7606-8" }, > + { .compatible = "adi,ad7616" }, > { }, > }; > MODULE_DEVICE_TABLE(of, ad7606_of_match);