• Michael Engl's avatar
    iio: adc: ti_am335x_adc: fix fifo overrun recovery · ec271b0e
    Michael Engl authored
    commit e83bb3e6 upstream.
    
    The tiadc_irq_h(int irq, void *private) function is handling FIFO
    overruns by clearing flags, disabling and enabling the ADC to
    recover.
    
    If the ADC is running in continuous mode a FIFO overrun happens
    regularly. If the disabling of the ADC happens concurrently with
    a new conversion. It might happen that the enabling of the ADC
    is ignored by the hardware. This stops the ADC permanently. No
    more interrupts are triggered.
    
    According to the AM335x Reference Manual (SPRUH73H October 2011 -
    Revised April 2013 - Chapter 12.4 and 12.5) it is necessary to
    check the ADC FSM bits in REG_ADCFSM before enabling the ADC
    again. Because the disabling of the ADC is done right after the
    current conversion has been finished.
    
    To trigger this bug it is necessary to run the ADC in continuous
    mode. The ADC values of all channels need to be read in an endless
    loop. The bug appears within the first 6 hours (~5.4 million
    handled FIFO overruns). The user space application will hang on
    reading new values from the character device.
    
    Fixes: ca9a5638 ("iio: ti_am335x_adc: Add continuous sampling support")
    Signed-off-by: default avatarMichael Engl <michael.engl@wjw-solutions.com>
    Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ec271b0e
ti_am335x_adc.c 15.3 KB