• Lars-Peter Clausen's avatar
    staging:iio:sysfs-trigger: Use irq_work to properly active trigger · f38bc926
    Lars-Peter Clausen authored
    Since iio_trigger_poll() calls generic_handle_irq() it need to be called from
    hardirq context. The sysfs trigger is kicked from userspace, so it is obviously
    not possible to fulfill this requirement by calling iio_trigger_poll directly.
    As a workaround commit 1f785681 ("staging:iio:trigger sysfs userspace trigger
    rework.") added iio_trigger_poll_chained() which uses handle_nested_irq instead
    of generic_handle_irq. This in itself is a hack and only works by chance.
    handle_nested_irq is intended to be called from the threaded interrupt handler
    of the parent IRQ. Using handle_nested_irq is also problematic since it will
    only call the threaded handler of the IRQ. But quite a few IIO drivers rely on
    their hardirq handler being called or undefined behaviour will occur.
    
    This patch uses the irq_work framework to schedule the call to
    iio_trigger_poll() from hardirq context, which fixes the issues described above.
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
    f38bc926
iio-trig-sysfs.c 4.82 KB