• Quentin Schulz's avatar
    iio: adc: sun4i-gpadc-iio: fix unbalanced irq enable/disable · be2ea533
    Quentin Schulz authored
    When initializing interrupts, the devm_request_any_context_irq will
    enable them right away. An atomic flag was set in sun4i_irq_init and read
    in the interrupt handler to make sure no unwanted interrupts were
    handled. If an unwanted interrupt occurred, the handler would disable
    the irq and return IRQ_HANDLED. However, at the end of sun4i_irq_init,
    the irq would be disabled as well, resulting in an unbalanced enable
    (since there are more disables than enables, the code enabling the
    interrupt would never be called).
    
    When reading the ADC or the temperature, the respective irq would be
    enabled in the read function and disabled in the irq handler. In the
    read function, we would wait for a completion (with a timeout) that will
    be set in the irq handler. However, if the completion is never set or if
    the wait for completion times out, the irq would not be disabled in the
    read function resulting in an unbalanced enable once the read function
    is called again (since there are 2+ enables for no disable).
    
    Moving disable_irq from the irq handler to the read function get rid of
    these two cases of unbalanced enable.
    
    Fixes: d1caa990 ("iio: adc: add support for Allwinner SoCs ADC")
    Reported-by: default avatarAndreas Färber <afaerber@suse.de>
    Signed-off-by: default avatarQuentin Schulz <quentin.schulz@free-electrons.com>
    Acked-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
    Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
    be2ea533
sun4i-gpadc-iio.c 19.6 KB