lkml.org 
[lkml]   [2021]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 12/16] iio: adc: max1027: Introduce an end of conversion helper
    On Wed, 18 Aug 2021 13:11:35 +0200
    Miquel Raynal <miquel.raynal@bootlin.com> wrote:

    > For now this helper only waits for the maximum duration of a conversion,
    > but it will soon be improved to properly handle the end of conversion
    > interrupt.
    >
    > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    > ---
    > drivers/iio/adc/max1027.c | 23 +++++++++++++++++++++--
    > 1 file changed, 21 insertions(+), 2 deletions(-)
    >
    > diff --git a/drivers/iio/adc/max1027.c b/drivers/iio/adc/max1027.c
    > index afc3ce69f7ea..2d6485591761 100644
    > --- a/drivers/iio/adc/max1027.c
    > +++ b/drivers/iio/adc/max1027.c
    > @@ -60,6 +60,9 @@
    > #define MAX1027_NAVG_32 (0x03 << 2)
    > #define MAX1027_AVG_EN BIT(4)
    >
    > +/* Device can achieve 300ksps so we assume a 3.33us conversion delay */
    > +#define MAX1027_CONVERSION_UDELAY 4
    > +
    > enum max1027_id {
    > max1027,
    > max1029,
    > @@ -236,6 +239,20 @@ struct max1027_state {
    > u8 reg ____cacheline_aligned;
    > };
    >
    > +static DECLARE_WAIT_QUEUE_HEAD(max1027_queue);
    Why here? This had me confused when I couldn't find it being introduced
    in the later patch that uses it. More comments in that patch.

    > +
    > +static int max1027_wait_eoc(struct iio_dev *indio_dev)
    > +{
    > + unsigned int conversion_time = MAX1027_CONVERSION_UDELAY;
    > +
    > + if (indio_dev->active_scan_mask)
    > + conversion_time *= hweight32(*indio_dev->active_scan_mask);
    > +
    > + usleep_range(conversion_time, conversion_time * 2);
    > +
    > + return 0;
    > +}
    > +
    > /* Scan from 0 to the highest requested channel */
    > static int max1027_configure_chans_to_scan(struct iio_dev *indio_dev)
    > {
    > @@ -310,9 +327,11 @@ static int max1027_read_single_value(struct iio_dev *indio_dev,
    > /*
    > * For an unknown reason, when we use the mode "10" (write
    > * conversion register), the interrupt doesn't occur every time.
    > - * So we just wait 1 ms.
    > + * So we just wait the maximum conversion time and deliver the value.
    > */
    > - mdelay(1);
    > + ret = max1027_wait_eoc(indio_dev);
    > + if (ret)
    > + return ret;
    >
    > /* Read result */
    > ret = spi_read(st->spi, st->buffer, (chan->type == IIO_TEMP) ? 4 : 2);

    \
     
     \ /
      Last update: 2021-08-30 12:32    [W:4.270 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site