• Kevin Hilman's avatar
    PM / Runtime: Allow _put_sync() from interrupts-disabled context · 02b26774
    Kevin Hilman authored
    Currently the use of pm_runtime_put_sync() is not safe from
    interrupts-disabled context because rpm_idle() will release the
    spinlock and enable interrupts for the idle callbacks.  This enables
    interrupts during a time where interrupts were expected to be
    disabled, and can have strange side effects on drivers that expected
    interrupts to be disabled.
    
    This is not a bug since the documentation clearly states that only
    _put_sync_suspend() is safe in IRQ-safe mode.
    
    However, pm_runtime_put_sync() could be made safe when in IRQ-safe
    mode by releasing the spinlock but not re-enabling interrupts, which
    is what this patch aims to do.
    
    Problem was found when using some buggy drivers that set
    pm_runtime_irq_safe() and used _put_sync() in interrupts-disabled
    context.
    Reported-by: default avatarColin Cross <ccross@google.com>
    Tested-by: default avatarNishanth Menon <nm@ti.com>
    Signed-off-by: default avatarKevin Hilman <khilman@ti.com>
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    02b26774
runtime_pm.txt 40.5 KB