usb: chipidea: udc: protect usb interrupt enable
authorJun Li <jun.li@nxp.com>
Tue, 10 Sep 2019 06:54:57 +0000 (14:54 +0800)
committerPeter Chen <peter.chen@nxp.com>
Mon, 18 Nov 2019 08:45:30 +0000 (16:45 +0800)
commit72dc8df7920fc24eba0f586c56e900a1643ff2b3
treec9caf1c2e45a8864e3e496bb62f03f475bdb6fc5
parentd16ab536aad208421c5ed32cdcb01b5ab6aa1f19
usb: chipidea: udc: protect usb interrupt enable

We hit the problem with below sequence:
- ci_udc_vbus_session() update vbus_active flag and ci->driver
is valid,
- before calling the ci_hdrc_gadget_connect(),
usb_gadget_udc_stop() is called by application remove gadget
driver,
- ci_udc_vbus_session() will contine do ci_hdrc_gadget_connect() as
gadget_ready is 1, so udc interrupt is enabled, but ci->driver is
NULL.
- USB connection irq generated but ci->driver is NULL.

As udc irq only should be enabled when gadget driver is binded, so
add spinlock to protect the usb irq enable for vbus session handling.

Signed-off-by: Jun Li <jun.li@nxp.com>
Signed-off-by: Peter Chen <peter.chen@nxp.com>
drivers/usb/chipidea/udc.c