• Tomi Valkeinen's avatar
    OMAP: DSS2: DSI: use a private workqueue · 0f16aa0a
    Tomi Valkeinen authored
    Using the shared workqueue led to to a deadlock in the case where the
    display was unblanked via keyboard.
    
    What happens is something like this:
    
    - User presses a key
    
    context 1:
    - drivers/char/keyboard.c calls schedule_console_callback()
    - fb_unblank takes the console semaphore
    - dsi bus lock is taken, and frame transfer is started (dsi bus lock is
      left on)
    - Unblank code tries to set the panel backlight, which tries to take dsi
      bus lock, but is blocked while the frame transfer is going on
    
    context 2, shared workqueue, console_callback in drivers/char/vt.c:
    - Tries to take console semaphore
    - Blocks, as console semaphore is being held by context 1
    - No other shared workqueue work can be run
    
    context 3, HW irq, caused by FRAMEDONE interrupt:
    - Interrupt handler schedules framedone-work in shared workqueue
    - Framedone-work is never ran, as the shared workqueue is blocked. This
      means that the unblank thread stays blocked, which means that context 2
      stays blocked.
    
    While I think the real problem is in keyboard/virtual terminal code, using
    a private workqueue in the DSI driver is perhaps safer and more robust
    than using the shared one. The DSI works should not be delayed more than a
    millisecond or so, and even if the private workqueue gives us no hard
    promise of doing so, it's still safer bet than the shared workqueue.
    Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@nokia.com>
    0f16aa0a
dsi.c 75.8 KB