aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/musb_dsps.c
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2015-02-26 15:00:52 -0500
committerFelipe Balbi <balbi@ti.com>2015-03-10 16:33:28 -0400
commit011d0dd5400b84e593eecfc4a17fcfb6c0c5ac60 (patch)
tree3df67d75726e3ff53e182cab8d065bb2d09c23aa /drivers/usb/musb/musb_dsps.c
parentd5fa3e9f7398adf337f03fa3257d5e9b214078ee (diff)
usb: musb: dsps: do not reset musb on babble
All we have to do is, really, drop session bit and let the session restart. Big thanks goes to Bin Liu <b-liu@ti.com> for inspiring this work. Tested-by: Bin Liu <b-liu@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb/musb_dsps.c')
-rw-r--r--drivers/usb/musb/musb_dsps.c23
1 files changed, 2 insertions, 21 deletions
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 85ebfa2c3858..a159de1225f3 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -604,31 +604,12 @@ static int dsps_musb_reset(struct musb *musb)
604{ 604{
605 struct device *dev = musb->controller; 605 struct device *dev = musb->controller;
606 struct dsps_glue *glue = dev_get_drvdata(dev->parent); 606 struct dsps_glue *glue = dev_get_drvdata(dev->parent);
607 const struct dsps_musb_wrapper *wrp = glue->wrp; 607 int session_restart = 0;
608 int session_restart = 0, error;
609 608
610 if (glue->sw_babble_enabled) 609 if (glue->sw_babble_enabled)
611 session_restart = dsps_sw_babble_control(musb); 610 session_restart = dsps_sw_babble_control(musb);
612 /* 611 else
613 * In case of new silicon version babble condition can be recovered
614 * without resetting the MUSB. But for older silicon versions, MUSB
615 * reset is needed
616 */
617 if (session_restart || !glue->sw_babble_enabled) {
618 dev_info(musb->controller, "Restarting MUSB to recover from Babble\n");
619 dsps_writel(musb->ctrl_base, wrp->control, (1 << wrp->reset));
620 usleep_range(100, 200);
621 usb_phy_shutdown(musb->xceiv);
622 error = phy_power_off(musb->phy);
623 if (error)
624 dev_err(dev, "phy shutdown failed: %i\n", error);
625 usleep_range(100, 200);
626 usb_phy_init(musb->xceiv);
627 error = phy_power_on(musb->phy);
628 if (error)
629 dev_err(dev, "phy powerup failed: %i\n", error);
630 session_restart = 1; 612 session_restart = 1;
631 }
632 613
633 return session_restart ? 0 : -EPIPE; 614 return session_restart ? 0 : -EPIPE;
634} 615}