aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/chipidea/udc.c
diff options
context:
space:
mode:
authorLi Jun <jun.li@nxp.com>2017-03-06 21:35:01 -0500
committerPeter Chen <peter.chen@nxp.com>2017-03-14 23:30:43 -0400
commit4f4555cfe704913ce4ce836ab2707825d784a7cc (patch)
tree6e6393d5f4bd3fa9c3f16c80d23caf620a1eb2e9 /drivers/usb/chipidea/udc.c
parent4495c08e84729385774601b5146d51d9e5849f81 (diff)
usb: chipidea: udc: update gadget state after bus resume
Gadget state is set to be suspended when bus suspened, but not updated after resume, this patch saves the gadget state before suspend and restores it after resume. Signed-off-by: Li Jun <jun.li@nxp.com> Signed-off-by: Peter Chen <peter.chen@nxp.com>
Diffstat (limited to 'drivers/usb/chipidea/udc.c')
-rw-r--r--drivers/usb/chipidea/udc.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index f88e9157fad0..be166c6ecb2d 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1845,27 +1845,32 @@ static irqreturn_t udc_irq(struct ci_hdrc *ci)
1845 if (USBi_PCI & intr) { 1845 if (USBi_PCI & intr) {
1846 ci->gadget.speed = hw_port_is_high_speed(ci) ? 1846 ci->gadget.speed = hw_port_is_high_speed(ci) ?
1847 USB_SPEED_HIGH : USB_SPEED_FULL; 1847 USB_SPEED_HIGH : USB_SPEED_FULL;
1848 if (ci->suspended && ci->driver->resume) { 1848 if (ci->suspended) {
1849 spin_unlock(&ci->lock); 1849 if (ci->driver->resume) {
1850 ci->driver->resume(&ci->gadget); 1850 spin_unlock(&ci->lock);
1851 spin_lock(&ci->lock); 1851 ci->driver->resume(&ci->gadget);
1852 spin_lock(&ci->lock);
1853 }
1852 ci->suspended = 0; 1854 ci->suspended = 0;
1855 usb_gadget_set_state(&ci->gadget,
1856 ci->resume_state);
1853 } 1857 }
1854 } 1858 }
1855 1859
1856 if (USBi_UI & intr) 1860 if (USBi_UI & intr)
1857 isr_tr_complete_handler(ci); 1861 isr_tr_complete_handler(ci);
1858 1862
1859 if (USBi_SLI & intr) { 1863 if ((USBi_SLI & intr) && !(ci->suspended)) {
1864 ci->suspended = 1;
1865 ci->resume_state = ci->gadget.state;
1860 if (ci->gadget.speed != USB_SPEED_UNKNOWN && 1866 if (ci->gadget.speed != USB_SPEED_UNKNOWN &&
1861 ci->driver->suspend) { 1867 ci->driver->suspend) {
1862 ci->suspended = 1;
1863 spin_unlock(&ci->lock); 1868 spin_unlock(&ci->lock);
1864 ci->driver->suspend(&ci->gadget); 1869 ci->driver->suspend(&ci->gadget);
1865 usb_gadget_set_state(&ci->gadget,
1866 USB_STATE_SUSPENDED);
1867 spin_lock(&ci->lock); 1870 spin_lock(&ci->lock);
1868 } 1871 }
1872 usb_gadget_set_state(&ci->gadget,
1873 USB_STATE_SUSPENDED);
1869 } 1874 }
1870 retval = IRQ_HANDLED; 1875 retval = IRQ_HANDLED;
1871 } else { 1876 } else {