OSDN Git Service

usb: musb: Prepare dsps glue layer for PM runtime support
authorTony Lindgren <tony@atomide.com>
Tue, 13 Sep 2016 02:48:29 +0000 (21:48 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Sep 2016 15:20:02 +0000 (17:20 +0200)
We want to be polling the state when nothing is connected.
Let's change the polling logic in preparation for PM runtime
support.

Signed-off-by: Tony Lindgren <tony@atomide.com>
[b-liu@ti.com: undo unnecessary line leading whitespace change]
Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/musb/musb_dsps.c

index 2537179..ef955c7 100644 (file)
@@ -247,6 +247,10 @@ static void otg_timer(unsigned long _musb)
 
        spin_lock_irqsave(&musb->lock, flags);
        switch (musb->xceiv->otg->state) {
+       case OTG_STATE_A_WAIT_VRISE:
+               mod_timer(&glue->timer, jiffies +
+                               msecs_to_jiffies(wrp->poll_timeout));
+               break;
        case OTG_STATE_A_WAIT_BCON:
                musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
                skip_session = 1;
@@ -338,7 +342,8 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
                        MUSB_HST_MODE(musb);
                        musb->xceiv->otg->default_a = 1;
                        musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
-                       del_timer(&glue->timer);
+                       mod_timer(&glue->timer, jiffies +
+                                 msecs_to_jiffies(wrp->poll_timeout));
                } else {
                        musb->is_active = 0;
                        MUSB_DEV_MODE(musb);
@@ -358,11 +363,17 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
        if (musb->int_tx || musb->int_rx || musb->int_usb)
                ret |= musb_interrupt(musb);
 
-       /* Poll for ID change in OTG port mode */
-       if (musb->xceiv->otg->state == OTG_STATE_B_IDLE &&
-                       musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
+       /* Poll for ID change and connect */
+       switch (musb->xceiv->otg->state) {
+       case OTG_STATE_B_IDLE:
+       case OTG_STATE_A_WAIT_BCON:
                mod_timer(&glue->timer, jiffies +
                                msecs_to_jiffies(wrp->poll_timeout));
+               break;
+       default:
+               break;
+       }
+
 out:
        spin_unlock_irqrestore(&musb->lock, flags);
 
@@ -461,6 +472,9 @@ static int dsps_musb_init(struct musb *musb)
                musb_writeb(musb->mregs, MUSB_BABBLE_CTL, val);
        }
 
+       mod_timer(&glue->timer, jiffies +
+                 msecs_to_jiffies(glue->wrp->poll_timeout));
+
        return dsps_musb_dbg_init(musb, glue);
 }