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>
This commit is contained in:
Felipe Balbi 2015-02-26 14:00:52 -06:00
parent d5fa3e9f73
commit 011d0dd540
1 changed files with 2 additions and 21 deletions

View File

@ -604,31 +604,12 @@ static int dsps_musb_reset(struct musb *musb)
{ {
struct device *dev = musb->controller; struct device *dev = musb->controller;
struct dsps_glue *glue = dev_get_drvdata(dev->parent); struct dsps_glue *glue = dev_get_drvdata(dev->parent);
const struct dsps_musb_wrapper *wrp = glue->wrp; int session_restart = 0;
int session_restart = 0, error;
if (glue->sw_babble_enabled) if (glue->sw_babble_enabled)
session_restart = dsps_sw_babble_control(musb); session_restart = dsps_sw_babble_control(musb);
/* else
* In case of new silicon version babble condition can be recovered
* without resetting the MUSB. But for older silicon versions, MUSB
* reset is needed
*/
if (session_restart || !glue->sw_babble_enabled) {
dev_info(musb->controller, "Restarting MUSB to recover from Babble\n");
dsps_writel(musb->ctrl_base, wrp->control, (1 << wrp->reset));
usleep_range(100, 200);
usb_phy_shutdown(musb->xceiv);
error = phy_power_off(musb->phy);
if (error)
dev_err(dev, "phy shutdown failed: %i\n", error);
usleep_range(100, 200);
usb_phy_init(musb->xceiv);
error = phy_power_on(musb->phy);
if (error)
dev_err(dev, "phy powerup failed: %i\n", error);
session_restart = 1; session_restart = 1;
}
return session_restart ? 0 : -EPIPE; return session_restart ? 0 : -EPIPE;
} }