MLK-11340-36 usb: chipidea: udc: don't do hardware access if gadget has stopped
authorPeter Chen <peter.chen@freescale.com>
Tue, 26 Nov 2013 05:33:21 +0000 (13:33 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 19:47:01 +0000 (14:47 -0500)
commit91e9032fae9f4730d22fcd7d146655679a008173
treebe1b62b85e11ab0b2aa6b2e544996f9e75007cbe
parent02e13736835a4b2e8556643db177f7b7c33f35b6
MLK-11340-36 usb: chipidea: udc: don't do hardware access if gadget has stopped

After _gadget_stop_activity is executed, we can consider the hardware
operation for gadget has finished, and the udc can be stopped and enter
low power mode. So, any later hardware operations (from usb_ep_ops APIs
or usb_gadget_ops APIs) should be considered invalid, any deinitializatons
has been covered at _gadget_stop_activity.

I meet this problem when I plug out usb cable from PC (using g_mass_storage),
my callstack like: vbus interrupt->.vbus_session->composite_disconnect
->pm_runtime_put_sync(&_gadget->dev), the composite_disconnect will
call fsg_disable, but fsg_disable calls usb_ep_disable using async way,
there are register accesses for usb_ep_disable. So sometimes, I get system
hang due to visit register without clock, sometimes not.

The Linux Kernel USB maintainer Alan Stern suggests this kinds of solution.
See: http://marc.info/?l=linux-usb&m=138541769810983&w=2.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
(cherry picked from commit ac760d29366f19eb1a4d4c37899b33019570a447)
(cherry picked from commit c246b1f129daa7f15fc88849ef2d04db54935c67)
drivers/usb/chipidea/udc.c