• Eugen Hristev's avatar
    iio: adc: at91-sama5d2_adc: handle unfinished conversions · 97c54cf2
    Eugen Hristev authored
    It can happen that on IRQ trigger, not all conversions are done if
    we are enabling multiple channels.
    The IRQ is triggered on first EOC (end of channel), but it can happen
    that not all channels are done. This leads into erroneous reports to
    userspace (zero values or previous values).
    To solve this, in trigger handler, check if the mask of done channels
    is the same as the mask of active scan channels.
    If it's the same, proceed and push to buffers. Otherwise, use usleep
    to sleep until the conversion is done or we timeout.
    Normally, it should happen that in a short time fashion, all channels are
    ready, since the first IRQ triggered.
    If a hardware fault happens (for example the clock suddently dissappears),
    the handler will not be completed, in which case we do not report anything to
    userspace anymore.
    Also, change from using the EOC interrupts to DRDY interrupt.
    This helps with the fact that not 'n' interrupt statuses are enabled,
    each being able to trigger an interrupt, and instead only data ready
    interrupt can wake up the CPU. Like this, when data is ready, check in
    handler which and how many channels are done. While the DRDY is raised,
    other IRQs cannot occur. Once the channel data is being read, we ack the
    IRQ and finish the conversion.
    Signed-off-by: default avatarEugen Hristev <eugen.hristev@microchip.com>
    Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    97c54cf2
at91-sama5d2_adc.c 55.3 KB