powerpc/usb: fix bug of kernel hang when initializing usb
authorShengzhou Liu <Shengzhou.Liu@freescale.com>
Thu, 16 Feb 2012 10:02:20 +0000 (18:02 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 24 Feb 2012 21:37:45 +0000 (13:37 -0800)
If USB UTMI PHY is not enable, writing to portsc register will lead to
kernel hang during boot up.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-fsl.c
drivers/usb/host/ehci-fsl.h

index cd30ea4416a6ab18e25c67318010aa56bc825049..7a15c2235758ffbd574f25827cc0325ae200cfc4 100644 (file)
@@ -216,6 +216,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci,
                               unsigned int port_offset)
 {
        u32 portsc;
+       struct usb_hcd *hcd = ehci_to_hcd(ehci);
+       void __iomem *non_ehci = hcd->regs;
 
        portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]);
        portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW);
@@ -231,6 +233,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci,
                portsc |= PORT_PTS_PTW;
                /* fall through */
        case FSL_USB2_PHY_UTMI:
+               /* enable UTMI PHY */
+               setbits32(non_ehci + FSL_SOC_USB_CTRL, CTRL_UTMI_PHY_EN);
                portsc |= PORT_PTS_UTMI;
                break;
        case FSL_USB2_PHY_NONE:
index 6d5a94e9bb3c739dee61f3f8b64b3d8b9a2398c7..863fb0c080d7cccfa7778a1212a0748d7f08a1ad 100644 (file)
@@ -47,6 +47,7 @@
 #define FSL_SOC_USB_PRICTRL    0x40c   /* NOTE: big-endian */
 #define FSL_SOC_USB_SICTRL     0x410   /* NOTE: big-endian */
 #define FSL_SOC_USB_CTRL       0x500   /* NOTE: big-endian */
+#define CTRL_UTMI_PHY_EN       (1<<9)
 #define CTRL_PHY_CLK_VALID     (1 << 17)
 #define SNOOP_SIZE_2GB         0x1e
 #endif                         /* _EHCI_FSL_H */