The complex patch with which MohammadAG had his success
[h-e-n] / drivers / usb / musb / omap2430.c
index a712bc9..276ee85 100644 (file)
@@ -77,11 +77,14 @@ static void musb_do_idle(unsigned long _musb)
 
        switch (musb->xceiv->state) {
        case OTG_STATE_A_WAIT_BCON:
+               if(host_mode(musb->mregs))
+                       break; /*Don't time out*/
+
                devctl &= ~MUSB_DEVCTL_SESSION;
                musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
 
                devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
-               if (devctl & MUSB_DEVCTL_BDEVICE) {
+               if (!host_mode(musb->mregs)) {
                        musb->xceiv->state = OTG_STATE_B_IDLE;
                        MUSB_DEV_MODE(musb);
                } else {
@@ -109,11 +112,14 @@ static void musb_do_idle(unsigned long _musb)
 #endif
 #ifdef CONFIG_USB_MUSB_HDRC_HCD
        case OTG_STATE_A_HOST:
+
+
                devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
-               if (devctl &  MUSB_DEVCTL_BDEVICE)
+               if (!host_mode(musb->mregs))
                        musb->xceiv->state = OTG_STATE_B_IDLE;
-               else
-                       musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+               /*Don't time out if host*/
+               //              else
+               //      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
 #endif
        default:
                break;
@@ -133,7 +139,7 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout)
        /* Never idle if active, or when VBUS timeout is not set as host */
        if (musb->is_active || ((musb->a_wait_bcon == 0)
                        && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
-               DBG(4, "%s active, deleting timer\n", otg_state_string(musb));
+               DBG(6, "%s active, deleting timer\n", otg_state_string(musb));
                del_timer(&musb_idle_timer);
                last_timer = jiffies;
                return;
@@ -143,13 +149,13 @@ void musb_platform_try_idle(struct musb *musb, unsigned long timeout)
                if (!timer_pending(&musb_idle_timer))
                        last_timer = timeout;
                else {
-                       DBG(4, "Longer idle timer already pending, ignoring\n");
+                       DBG(6, "Longer idle timer already pending, ignoring\n");
                        return;
                }
        }
        last_timer = timeout;
 
-       DBG(4, "%s inactive, for idle timer for %lu ms\n",
+       DBG(6, "%s inactive, for idle timer for %lu ms\n",
                otg_state_string(musb),
                (unsigned long)jiffies_to_msecs(timeout - jiffies));
        mod_timer(&musb_idle_timer, timeout);
@@ -182,8 +188,14 @@ static void omap_set_vbus(struct musb *musb, int is_on)
                musb->xceiv->default_a = 1;
                musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
                devctl |= MUSB_DEVCTL_SESSION;
-
                MUSB_HST_MODE(musb);
+               
+               if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) {
+                       /*Power is already applied. Skip VRISE and go directly to BCON.*/
+                       musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+               }
+
+
        } else {
                musb->is_active = 0;
 
@@ -420,7 +432,7 @@ void musb_restore_ctx_and_resume(struct usb_gadget *gadget)
        u8 r;
        unsigned long   flags;
 
-       DBG(3, "restoring register context\n");
+       DBG(3, "restoring register context for %s\n","musb_restore_ctx_and_resume");
 
        if (musb->board && musb->board->xceiv_power)
                musb->board->xceiv_power(1);
@@ -431,13 +443,17 @@ void musb_restore_ctx_and_resume(struct usb_gadget *gadget)
        else
                clk_enable(musb->clock);
 
-       /* Recover OTG control */
-       r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
-       r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
-       musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
-
+       if(host_mode(musb->mregs)) {
+               musb_force_term(musb->mregs,MUSB_TERM_HOST_FULLSPEED);
+               r = musb_ulpi_readb(musb->mregs,ISP1704_FUNC_CTRL);
+       } else {
+               /* Recover OTG control */
+               r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
+               r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
+               musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
+               r = ISP1704_FUNC_CTRL_FULL_SPEED;
+       }
        /* Recover FUNC control */
-       r = ISP1704_FUNC_CTRL_FULL_SPEED;
        r |= ISP1704_FUNC_CTRL_SUSPENDM | ISP1704_FUNC_CTRL_RESET;
        musb_ulpi_writeb(musb->mregs, ISP1704_FUNC_CTRL, r);