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 {
#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;
/* 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;
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);
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;
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);
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);