linux-sg2042/drivers/usb/musb
Tony Lindgren ea2f35c01d usb: musb: Fix sleeping function called from invalid context for hdrc glue
Commit 65b3f50ed6 ("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: 65b3f50ed6 ("usb: musb: Add PM runtime support for MUSB DSPS
glue layer")
Reported-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Johan Hovold <johan@kernel.org>
Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-11-17 16:25:39 +01:00
..
Kconfig Merge 4.8-rc7 into usb-next 2016-09-19 09:12:41 +02:00
Makefile usb: musb: add tracepoints support for debugging 2016-07-17 08:23:57 +09:00
am35x.c usb: musb: am35x: fix error return code in am35x_probe() 2016-09-13 17:20:02 +02:00
blackfin.c usb: musb: Set up function pointers for DMA 2015-05-07 13:35:51 -05:00
blackfin.h
cppi_dma.c usb: musb: cleanup cppi_dma header 2016-07-17 08:23:57 +09:00
cppi_dma.h usb: musb: cppi41: move struct cppi41_dma_channel to header 2016-07-17 08:23:57 +09:00
da8xx.c usb: musb: da8xx: Don't print phy error on -EPROBE_DEFER 2016-11-07 10:10:24 +01:00
davinci.c usb: musb: Set up function pointers for DMA 2015-05-07 13:35:51 -05:00
davinci.h usb: musb: davinci: Fix build breakage 2012-06-04 18:29:42 +03:00
jz4740.c usb: musb: jz4740: fix error check of usb_get_phy() 2016-04-26 14:50:02 -07:00
musb_am335x.c usb: musb: Fix panic upon musb_am335x module removal 2014-06-27 10:53:06 -05:00
musb_core.c usb: musb: Fix sleeping function called from invalid context for hdrc glue 2016-11-17 16:25:39 +01:00
musb_core.h usb: musb: Fix sleeping function called from invalid context for hdrc glue 2016-11-17 16:25:39 +01:00
musb_cppi41.c usb: musb: cppi41: add dma channel tracepoints 2016-07-17 08:23:57 +09:00
musb_debug.h usb: musb: add tracepoints support for debugging 2016-07-17 08:23:57 +09:00
musb_debugfs.c usb: musb: add softconnect for host mode 2015-05-07 13:49:23 -05:00
musb_dma.h usb: musb: Set up function pointers for DMA 2015-05-07 13:35:51 -05:00
musb_dsps.c usb: musb: Fix sleeping function called from invalid context for hdrc glue 2016-11-17 16:25:39 +01:00
musb_gadget.c usb: musb: Fix sleeping function called from invalid context for hdrc glue 2016-11-17 16:25:39 +01:00
musb_gadget.h usb: musb: add Kconfig options for HOST, GAGDET or DUAL_ROLE modes 2013-05-28 19:22:23 +03:00
musb_gadget_ep0.c usb: musb: switch dev_dbg to tracepoints 2016-07-17 08:23:57 +09:00
musb_host.c usb: musb: host: add urb tracepoints 2016-07-17 08:23:57 +09:00
musb_host.h usb: musb: fix prototype for musb_port_reset 2013-12-20 15:05:43 -06:00
musb_io.h usb: musb: Make busctl_offset an io-op rather then a define 2015-05-26 10:46:54 -05:00
musb_regs.h usb: musb: Make busctl_offset an io-op rather then a define 2015-05-26 10:46:54 -05:00
musb_trace.c usb: musb: add tracepoints support for debugging 2016-07-17 08:23:57 +09:00
musb_trace.h usb: musb: cppi41: add dma channel tracepoints 2016-07-17 08:23:57 +09:00
musb_virthub.c musb: Export musb_root_disconnect for use in modules 2016-09-22 12:00:21 +02:00
musbhsdma.c usb: musb: switch dev_dbg to tracepoints 2016-07-17 08:23:57 +09:00
musbhsdma.h usb: musb: remove generic_interrupt 2012-11-06 15:32:13 +02:00
omap2430.c usb: musb: Fix hardirq-safe hardirq-unsafe lock order error 2016-10-24 14:29:08 +02:00
omap2430.h usb: start using the control module driver 2013-01-25 12:27:24 +02:00
sunxi.c musb: sunxi: Add support for platform_set_mode 2016-09-13 17:20:02 +02:00
tusb6010.c usb: musb: Set up function pointers for DMA 2015-05-07 13:35:51 -05:00
tusb6010.h usb: musb: Fix up DMA related macros 2015-05-07 13:35:46 -05:00
tusb6010_omap.c usb: musb: use %pad format string from dma_addr_t 2016-03-04 15:14:30 +02:00
ux500.c usb: musb: ux500: Fix NULL pointer dereference at system PM 2016-02-03 20:03:40 +02:00
ux500_dma.c usb: musb/ux500: remove duplicate check for dma_is_compatible 2016-03-04 15:14:30 +02:00