X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=usbhost%2Fusb%2Fmusb%2Fomap2430.c;h=276ee85b91ab93ac2b6268911aeb8f5aecd6736f;hb=d63038aff4232e423df3c232a517db4cc64cabe9;hp=a712bc910e146bf4d906d55ca3702800c14d8c90;hpb=a693a0af76461a59f1007238fe51b610d8da4988;p=kernel-power diff --git a/usbhost/usb/musb/omap2430.c b/usbhost/usb/musb/omap2430.c index a712bc9..276ee85 100644 --- a/usbhost/usb/musb/omap2430.c +++ b/usbhost/usb/musb/omap2430.c @@ -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);