lkml.org 
[lkml]   [2017]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 2/4] iio: hi8435: avoid garbage event at first enable
    From
    Date
    On 19/05/17 15:48, Nikita Yushchenko wrote:
    > Currently, driver generates events for channels if new reading differs
    > from previous one. This "previous value" is initialized to zero, which
    > results into event if value is constant-one.
    >
    > Fix that by initializing "previous value" by reading at event enable
    > time.
    >
    > This provides reliable sequence for userspace:
    > - enable event,
    > - AFTER THAT read current value,
    > - AFTER THAT each event will correspond to change.
    >
    > Signed-off-by: Nikita Yushchenko <nikita.yoush@cogentembedded.com>
    I'm hoping there aren't any userspace apps out there relying on this
    'unusual' behaviour. *cross fingers*

    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/hi8435.c | 15 +++++++++++++--
    > 1 file changed, 13 insertions(+), 2 deletions(-)
    >
    > diff --git a/drivers/iio/adc/hi8435.c b/drivers/iio/adc/hi8435.c
    > index cb8e6342eddf..45a92e3e8f2b 100644
    > --- a/drivers/iio/adc/hi8435.c
    > +++ b/drivers/iio/adc/hi8435.c
    > @@ -141,10 +141,21 @@ static int hi8435_write_event_config(struct iio_dev *idev,
    > enum iio_event_direction dir, int state)
    > {
    > struct hi8435_priv *priv = iio_priv(idev);
    > + int ret;
    > + u32 tmp;
    > +
    > + if (state) {
    > + ret = hi8435_readl(priv, HI8435_SO31_0_REG, &tmp);
    > + if (ret < 0)
    > + return ret;
    > + if (tmp & BIT(chan->channel))
    > + priv->event_prev_val |= BIT(chan->channel);
    > + else
    > + priv->event_prev_val &= ~BIT(chan->channel);
    >
    > - priv->event_scan_mask &= ~BIT(chan->channel);
    > - if (state)
    > priv->event_scan_mask |= BIT(chan->channel);
    > + } else
    > + priv->event_scan_mask &= ~BIT(chan->channel);
    >
    > return 0;
    > }
    >

    \
     
     \ /
      Last update: 2017-05-20 18:35    [W:2.880 / U:0.480 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site