usb: gadget: Fix tegra udc in OTG mode
Benoit Goby [Thu, 22 Jul 2010 01:05:06 +0000 (18:05 -0700)]
Check the transceiver state before checking udc->stopped
Enable/disable the PHY and the clock on cable events

Change-Id: Id5a8a1b94f83da8060786f31181014dd1d546fc7
Signed-off-by: Benoit Goby <benoit@android.com>

drivers/usb/gadget/fsl_tegra_udc.c
drivers/usb/gadget/fsl_udc_core.c

index 5cf5e74..bdd80df 100644 (file)
@@ -83,8 +83,12 @@ void fsl_udc_clk_release(void)
 
 void fsl_udc_clk_suspend(void)
 {
+       tegra_usb_phy_power_off(phy);
+       clk_disable(udc_clk);
 }
 
 void fsl_udc_clk_resume(void)
 {
+       clk_enable(udc_clk);
+       tegra_usb_phy_power_on(phy);
 }
index d0059d7..b04a4b7 100644 (file)
@@ -1947,15 +1947,7 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
        u32 temp;
 #endif
 
-       /* Disable ISR for OTG host mode */
-       if (udc->stopped)
-               return IRQ_NONE;
        spin_lock_irqsave(&udc->lock, flags);
-       irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr);
-       /* Clear notification bits */
-       fsl_writel(irq_src, &dr_regs->usbsts);
-
-       /* VDBG("irq_src [0x%8x]", irq_src); */
 
 #ifdef CONFIG_ARCH_TEGRA
        if (udc->transceiver) {
@@ -1992,7 +1984,23 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
                        spin_unlock_irqrestore(&udc->lock, flags);
                        return IRQ_HANDLED;
                }
-       } else {
+       }
+#endif
+
+       /* Disable ISR for OTG host mode */
+       if (udc->stopped) {
+               spin_unlock_irqrestore(&udc->lock, flags);
+               return IRQ_NONE;
+       }
+
+       irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr);
+       /* Clear notification bits */
+       fsl_writel(irq_src, &dr_regs->usbsts);
+
+       /* VDBG("irq_src [0x%8x]", irq_src); */
+
+#ifdef CONFIG_ARCH_TEGRA
+       if (!udc->transceiver) {
                /* VBUS A session detection interrupts. When the interrupt is received,
                 * the mark the vbus active shadow.
                 */
@@ -2774,7 +2782,10 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
 
        create_proc_file();
 
-#ifndef CONFIG_USB_OTG_UTILS
+#ifdef CONFIG_USB_OTG_UTILS
+       if (udc_controller->transceiver)
+               udc_controller->vbus_active = 1;
+#else
 #ifdef CONFIG_ARCH_TEGRA
        /* Power down the phy if cable is not connected */
        if (!(fsl_readl(&usb_sys_regs->vbus_wakeup) & USB_SYS_VBUS_STATUS))