Skip to content
  • Tony Lindgren's avatar
    usb: musb: Fix sleeping function called from invalid context for hdrc glue · ea2f35c0
    Tony Lindgren authored
    Commit 65b3f50e ("usb: musb: Add PM runtime support for MUSB DSPS
    glue layer") wrongly added a call for pm_runtime_get_sync to otg_timer
    that runs in softirq context. That causes a "BUG: sleeping function called
    from invalid context" every time when polling the cable status:
    
    [<c015ebb4>] (__might_sleep) from [<c0413d60>] (__pm_runtime_resume+0x9c/0xa0)
    [<c0413d60>] (__pm_runtime_resume) from [<c04d0bc4>] (otg_timer+0x3c/0x254)
    [<c04d0bc4>] (otg_timer) from [<c0191180>] (call_timer_fn+0xfc/0x41c)
    [<c0191180>] (call_timer_fn) from [<c01915c0>] (expire_timers+0x120/0x210)
    [<c01915c0>] (expire_timers) from [<c0191acc>] (run_timer_softirq+0xa4/0xdc)
    [<c0191acc>] (run_timer_softirq) from [<c010168c>] (__do_softirq+0x12c/0x594)
    
    I did not notice that as I did not have CONFIG_DEBUG_ATOMIC_SLEEP enabled.
    And looks like also musb_gadget_queue() suffers from the same problem.
    
    Let's fix the issue by using a list of delayed work then call it on
    resume. Note that we want to do this only when musb core and it's
    parent devices are awake, and we need to make sure the DSPS glue
    timer is stopped as noted by Johan Hovold <johan@kernel.org>.
    Note that we already are re-enabling the timer with mod_timer() in
    dsps_musb_enable().
    
    Later on we may be able to remove other delayed work in the musb driver
    and just do it from pending_resume_work. But this should be done only
    for delayed work that does not have other timing requirements beyond
    just being run on resume.
    
    Fixes: 65b3f50e
    
     ("usb: musb: Add PM runtime support for MUSB DSPS
    glue layer")
    Reported-by: default avatarJohan Hovold <johan@kernel.org>
    Reviewed-by: default avatarJohan Hovold <johan@kernel.org>
    Tested-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarBin Liu <b-liu@ti.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ea2f35c0