lkml.org 
[lkml]   [2021]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/16] iio: adc: max1027: Introduce an end of conversion helper
    Date
    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);
    +
    +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);
    --
    2.27.0
    \
     
     \ /
      Last update: 2021-08-18 13:13    [W:5.040 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site