]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00232583 Mx6 USB host: Set HCD_FLAG_HW_ACCESSIBLE flag after clock gate
authormake shi <b15407@freescale.com>
Tue, 6 Nov 2012 07:52:24 +0000 (15:52 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:41 +0000 (08:35 +0200)
There is a USB hang issue when do system suspend/resume test with a USB
device plug in. The issue is caused by USB host driver accessing register
when clock is off. Currently set HCD_FLAG_HW_ACCESSIBLE bit before open
clock in ehci_fsl_bus_resume, it cause accessing register without clock.
So we should change the code call order to avoid driver access register
without clock.

- Set HCD_FLAG_HW_ACCESSIBLE software flag after HW clock turn on
- remove some unnecessary code in ehci_fsl_pre_irq

Signed-off-by: make shi <b15407@freescale.com>
drivers/usb/host/ehci-arc.c

index 35815869bb8df9943c62f9994fbb8cd0cdb34cbc..cf9d9e1612f08c37516d79efb4be4e22d6ce0eed 100755 (executable)
@@ -159,16 +159,6 @@ static irqreturn_t ehci_fsl_pre_irq(int irq, void *dev)
                pdata->wakeup_event = WAKEUP_EVENT_INVALID;
                fsl_usb_recover_hcd(pdev);
                return IRQ_HANDLED;
-       } else {
-               u32 portsc = 0;
-               struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-               portsc = ehci_readl(ehci, &ehci->regs->port_status[0]);
-               /* PORT_USB11 macro is used to judge line state K*/
-               if ((PORT_USB11(portsc)) && (portsc & PORT_SUSPEND)) {
-                       pdata = hcd->self.controller->platform_data;
-                       if (pdata->platform_resume)
-                               pdata->platform_resume(pdata);
-               }
        }
        return IRQ_NONE;
 }
@@ -485,10 +475,10 @@ static int ehci_fsl_bus_resume(struct usb_hcd *hcd)
        }
 
        if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
-               set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
                fsl_usb_clk_gate(hcd->self.controller->platform_data, true);
                usb_host_set_wakeup(hcd->self.controller, false);
                fsl_usb_lowpower_mode(pdata, false);
+               set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
        }
 
        if (pdata->platform_resume)