lkml.org 
[lkml]   [2014]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16 231/357] iio: adc: at91: dont use the last converted data register
    Date
    3.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ludovic Desroches <ludovic.desroches@atmel.com>

    commit d4f51956ac8ad302db9b0c4e4232775b1baa7b44 upstream.

    If touchscreen mode is enabled and a conversion is requested on another
    channel, the result in the last converted data register can be a
    touchscreen relative value. Starting a conversion involves to do a
    conversion for all active channel. It starts with ADC channels and ends
    with touchscreen channels. Then if ADC_LCD register is not read quickly,
    its content may be a touchscreen conversion.
    To remove this temporal constraint, the conversion value is taken from
    the channel data register.

    Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
    Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
    Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
    Signed-off-by: Jonathan Cameron <jic23@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/iio/adc/at91_adc.c | 12 +++++++-----
    1 file changed, 7 insertions(+), 5 deletions(-)

    --- a/drivers/iio/adc/at91_adc.c
    +++ b/drivers/iio/adc/at91_adc.c
    @@ -196,6 +196,7 @@ struct at91_adc_state {
    bool done;
    int irq;
    u16 last_value;
    + int chnb;
    struct mutex lock;
    u8 num_channels;
    void __iomem *reg_base;
    @@ -274,7 +275,7 @@ void handle_adc_eoc_trigger(int irq, str
    disable_irq_nosync(irq);
    iio_trigger_poll(idev->trig, iio_get_time_ns());
    } else {
    - st->last_value = at91_adc_readl(st, AT91_ADC_LCDR);
    + st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
    st->done = true;
    wake_up_interruptible(&st->wq_data_avail);
    }
    @@ -351,7 +352,7 @@ static irqreturn_t at91_adc_rl_interrupt
    unsigned int reg;

    status &= at91_adc_readl(st, AT91_ADC_IMR);
    - if (status & st->registers->drdy_mask)
    + if (status & GENMASK(st->num_channels - 1, 0))
    handle_adc_eoc_trigger(irq, idev);

    if (status & AT91RL_ADC_IER_PEN) {
    @@ -418,7 +419,7 @@ static irqreturn_t at91_adc_9x5_interrup
    AT91_ADC_IER_YRDY |
    AT91_ADC_IER_PRDY;

    - if (status & st->registers->drdy_mask)
    + if (status & GENMASK(st->num_channels - 1, 0))
    handle_adc_eoc_trigger(irq, idev);

    if (status & AT91_ADC_IER_PEN) {
    @@ -689,9 +690,10 @@ static int at91_adc_read_raw(struct iio_
    case IIO_CHAN_INFO_RAW:
    mutex_lock(&st->lock);

    + st->chnb = chan->channel;
    at91_adc_writel(st, AT91_ADC_CHER,
    AT91_ADC_CH(chan->channel));
    - at91_adc_writel(st, AT91_ADC_IER, st->registers->drdy_mask);
    + at91_adc_writel(st, AT91_ADC_IER, BIT(chan->channel));
    at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START);

    ret = wait_event_interruptible_timeout(st->wq_data_avail,
    @@ -708,7 +710,7 @@ static int at91_adc_read_raw(struct iio_

    at91_adc_writel(st, AT91_ADC_CHDR,
    AT91_ADC_CH(chan->channel));
    - at91_adc_writel(st, AT91_ADC_IDR, st->registers->drdy_mask);
    + at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel));

    st->last_value = 0;
    st->done = false;



    \
     
     \ /
      Last update: 2014-10-04 02:41    [W:2.740 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site