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:
parent
d5fa3e9f73
commit
011d0dd540
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue