usb: musb: dsps: fix runtime pm for peripheral mode
authorBin Liu <b-liu@ti.com>
Tue, 18 Dec 2018 13:58:05 +0000 (07:58 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Dec 2018 14:46:31 +0000 (15:46 +0100)
Since the runtime PM support was added in musb, dsps relies on the timer
calling otg_timer() to activate the usb subsystem. However the driver
doesn't enable the timer for peripheral port, then the peripheral port is
unable to be enumerated by a host if the other usb port is disabled or in
peripheral mode too.

So let's start the timer for peripheral port too.

Fixes: ea2f35c01d5e ("usb: musb: Fix sleeping function called from invalid context for hdrc glue")
Acked-by: Tony Lindgren <tony@atomide.com>
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 1e6d78b1334ee39933fb8a024e834a8eca24368e..403eb97915f8a86f15dc00f07c2077890663dc25 100644 (file)
@@ -181,9 +181,11 @@ static void dsps_musb_enable(struct musb *musb)
 
        musb_writel(reg_base, wrp->epintr_set, epmask);
        musb_writel(reg_base, wrp->coreintr_set, coremask);
-       /* start polling for ID change in dual-role idle mode */
-       if (musb->xceiv->otg->state == OTG_STATE_B_IDLE &&
-                       musb->port_mode == MUSB_OTG)
+       /*
+        * start polling for runtime PM active and idle,
+        * and for ID change in dual-role idle mode.
+        */
+       if (musb->xceiv->otg->state == OTG_STATE_B_IDLE)
                dsps_mod_timer(glue, -1);
 }
 
@@ -254,6 +256,10 @@ static int dsps_check_status(struct musb *musb, void *unused)
                                musb->xceiv->otg->state = OTG_STATE_A_IDLE;
                                MUSB_HST_MODE(musb);
                        }
+
+                       if (musb->port_mode == MUSB_PERIPHERAL)
+                               skip_session = 1;
+
                        if (!(devctl & MUSB_DEVCTL_SESSION) && !skip_session)
                                musb_writeb(mregs, MUSB_DEVCTL,
                                            MUSB_DEVCTL_SESSION);