• Vignesh R's avatar
    iio: adc: ti_am335x_adc: Protect FIFO1 from concurrent access · 81e39515
    Vignesh R authored
    commit 90c43ec6 upstream.
    
    It is possible that two or more ADC channels can be simultaneously
    requested for raw samples, in which case there can be race in access to
    FIFO data resulting in loss of samples.
    If am335x_tsc_se_set_once() is called again from tiadc_read_raw(), when
    ADC is still acquired to sample one of the channels, the second process
    might be put into uninterruptible sleep state. Fix these issues, by
    protecting FIFO access and channel configurations with a mutex. Since
    tiadc_read_raw() might take anywhere between few microseconds to few
    milliseconds to finish execution (depending on averaging and delay
    values supplied via DT), its better to use mutex instead of spinlock.
    
    Fixes: 7ca6740c ("mfd: input: iio: ti_amm335x: Rework TSC/ADC synchronization")
    Signed-off-by: default avatarVignesh R <vigneshr@ti.com>
    Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    81e39515
ti_am335x_adc.c 14.1 KB