sh: sh7786: modify usb setup timeout judgment bug.
authorKuninori Morimoto <[email protected]>
Fri, 10 Apr 2009 00:54:07 +0000 (00:54 +0000)
committerPaul Mundt <[email protected]>
Mon, 13 Apr 2009 22:25:35 +0000 (07:25 +0900)
This corrects a race with the PHY RST bit not being set properly if the
PLL status changes right before timeout. This resulted in it potentially
failing even if the device came up in time.

Special thanks to Mr. Juha Leppanen and Iwamatsu-san for reporting this
out and reviewing it.

Reported-by: Juha Leppanen <[email protected]>
Reviewed-by: Nobuhiro Iwamatsu <[email protected]>
Tested-by: Paul Mundt <[email protected]>
Signed-off-by: Kuninori Morimoto <[email protected]>
Signed-off-by: Paul Mundt <[email protected]>
arch/sh/kernel/cpu/sh4a/setup-sh7786.c

index 5a47e1cf442eb97a39778c053fa588ce97f0f124..90e8cfff55fd4977def48d24a259d532726008e9 100644 (file)
@@ -143,14 +143,14 @@ static void __init sh7786_usb_setup(void)
         * Set the PHY and PLL enable bit
         */
        __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1);
-       while (i-- &&
-              ((__raw_readl(USBST) & ACT_PLL_STATUS) != ACT_PLL_STATUS))
+       while (i--) {
+               if (ACT_PLL_STATUS == (__raw_readl(USBST) & ACT_PLL_STATUS)) {
+                       /* Set the PHY RST bit */
+                       __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1);
+                       printk(KERN_INFO "sh7786 usb setup done\n");
+                       break;
+               }
                cpu_relax();
-
-       if (i) {
-               /* Set the PHY RST bit */
-               __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1);
-               printk(KERN_INFO "sh7786 usb setup done\n");
        }
 }