Hello,

On 15-08-04 03:18:46, Duan Andy wrote:
> From: Sanchayan Maity <maitysancha...@gmail.com> Sent: Monday, August 03, 
> 2015 11:10 PM
> > To: ji...@kernel.org; linux-...@vger.kernel.org
> > Cc: ste...@agner.ch; Duan Fugang-B38611; hof...@osadl.org;
> > sanjeev_sha...@mentor.com; Estevam Fabio-R49496; knaac...@gmx.de;
> > l...@metafoo.de; pme...@pmeerw.net; antoine.ten...@free-electrons.com;
> > linux-kernel@vger.kernel.org; linux-arm-ker...@lists.infradead.org;
> > Sanchayan Maity
> > Subject: [PATCH] iio: adc: vf610: Add IIO buffer support for Vybrid ADC
> > 
> > This patch adds support for IIO buffer to the Vybrid ADC driver.
> > IIO triggered buffer infrastructure along with iio sysfs trigger is used
> > to leverage continuous sampling support provided by the ADC block.
> > 
> > Signed-off-by: Sanchayan Maity <maitysancha...@gmail.com>
> > ---
> >  drivers/iio/adc/Kconfig     |   4 ++
> >  drivers/iio/adc/vf610_adc.c | 122
> > +++++++++++++++++++++++++++++++++++++++++---
> >  2 files changed, 120 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index
> > 7c55658..4661241 100644
> > --- a/drivers/iio/adc/Kconfig
> > +++ b/drivers/iio/adc/Kconfig
> > @@ -337,6 +337,10 @@ config TWL6030_GPADC  config VF610_ADC
> >     tristate "Freescale vf610 ADC driver"
> >     depends on OF
> > +   select IIO_BUFFER
> > +   select IIO_TRIGGER
> > +   select IIO_SYSFS_TRIGGER
> > +   select IIO_TRIGGERED_BUFFER
> >     help
> >       Say yes here to support for Vybrid board analog-to-digital
> > converter.
> >       Since the IP is used for i.MX6SLX, the driver also support
> > i.MX6SLX.
> > diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
> > index 23b8fb9..af72b9a 100644
> > --- a/drivers/iio/adc/vf610_adc.c
> > +++ b/drivers/iio/adc/vf610_adc.c
> > @@ -34,8 +34,11 @@
> >  #include <linux/err.h>
> > 
> >  #include <linux/iio/iio.h>
> > +#include <linux/iio/buffer.h>
> >  #include <linux/iio/sysfs.h>
> > -#include <linux/iio/driver.h>
> > +#include <linux/iio/trigger.h>
> > +#include <linux/iio/trigger_consumer.h> #include
> > +<linux/iio/triggered_buffer.h>
> > 
> >  /* This will be the driver name the kernel reports */  #define
> > DRIVER_NAME "vf610-adc"
> > @@ -170,6 +173,7 @@ struct vf610_adc {
> >     u32 sample_freq_avail[5];
> > 
> >     struct completion completion;
> > +   u16 *buffer;
> >  };
> > 
> >  static const u32 vf610_hw_avgs[] = { 1, 4, 8, 16, 32 }; @@ -505,12
> > +509,22 @@ static const struct iio_chan_spec_ext_info vf610_ext_info[] =
> > {
> >     .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
> >                             BIT(IIO_CHAN_INFO_SAMP_FREQ),   \
> >     .ext_info = vf610_ext_info,                             \
> > +   .address = (_idx),                              \
> > +   .scan_index = (_idx),                   \
> > +   .scan_type.sign = 'u',                  \
> > +   .scan_type.realbits = 12,               \
> > +   .scan_type.storagebits = 16,    \
> >  }
> > 
> >  #define VF610_ADC_TEMPERATURE_CHAN(_idx, _chan_type) {     \
> >     .type = (_chan_type),   \
> >     .channel = (_idx),              \
> >     .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),     \
> > +   .address = (_idx),                                              \
> > +   .scan_index = (_idx),                                   \
> > +   .scan_type.sign = 'u',                                  \
> > +   .scan_type.realbits = 12,                               \
> > +   .scan_type.storagebits = 16,                    \
> >  }
> > 
> >  static const struct iio_chan_spec vf610_adc_iio_channels[] = { @@ -531,6
> > +545,7 @@ static const struct iio_chan_spec vf610_adc_iio_channels[] = {
> >     VF610_ADC_CHAN(14, IIO_VOLTAGE),
> >     VF610_ADC_CHAN(15, IIO_VOLTAGE),
> >     VF610_ADC_TEMPERATURE_CHAN(26, IIO_TEMP),
> > +   IIO_CHAN_SOFT_TIMESTAMP(32),
> >     /* sentinel */
> >  };
> > 
> > @@ -559,13 +574,21 @@ static int vf610_adc_read_data(struct vf610_adc
> > *info)
> > 
> >  static irqreturn_t vf610_adc_isr(int irq, void *dev_id)  {
> > -   struct vf610_adc *info = (struct vf610_adc *)dev_id;
> > +   struct iio_dev *indio_dev = (struct iio_dev *)dev_id;
> > +   struct vf610_adc *info = iio_priv(indio_dev);
> >     int coco;
> > 
> >     coco = readl(info->regs + VF610_REG_ADC_HS);
> >     if (coco & VF610_ADC_HS_COCO0) {
> >             info->value = vf610_adc_read_data(info);
> > -           complete(&info->completion);
> > +           if (iio_buffer_enabled(indio_dev)) {
> > +                   info->buffer[0] = info->value;
> > +                   writel(0, info->regs + VF610_REG_ADC_HS);
> The register is read only. After ADC_Rn is read, the coco bit is cleared.

Right. This crept in from a different implementation which I was trying with
PDB and perhaps a wrong interpretation of the TRM.

Will fix.

Regards,
Sanchayan.

(snip)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to