From 4fe28805ce00b482803680439a4b6cf67874297c Mon Sep 17 00:00:00 2001 From: Ravi Babu Date: Fri, 18 Jan 2013 16:52:44 +0530 Subject: [PATCH] usb: musb: ti81xx: fix for handling vbus error some bus powered devices can draw more current and can cause fluctuation in vbus leads to vbuserror condition, the workaround fix is to set session and wait till vbus raise to above valid threshold. Signed-off-by: Ravi Babu --- drivers/usb/musb/ti81xx.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/usb/musb/ti81xx.c b/drivers/usb/musb/ti81xx.c index 077f6ec..aabfba5 100644 --- a/drivers/usb/musb/ti81xx.c +++ b/drivers/usb/musb/ti81xx.c @@ -703,6 +703,10 @@ static void otg_timer(unsigned long _musb) } break; case OTG_STATE_A_WAIT_VFALL: + devctl |= MUSB_DEVCTL_SESSION; + musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); + + devctl = musb_readb(musb->mregs, MUSB_DEVCTL); /* * Wait till VBUS falls below SessionEnd (~0.2 V); the 1.3 * RTL seems to mis-handle session "start" otherwise (or in @@ -715,7 +719,7 @@ static void otg_timer(unsigned long _musb) break; } musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; - musb_writel(musb->ctrl_base, USB_CORE_INTR_SET_REG, + musb_writel(musb->ctrl_base, USB_IRQ_STATUS_RAW_1, MUSB_INTR_VBUSERROR << USB_INTR_USB_SHIFT); break; case OTG_STATE_B_IDLE: @@ -1026,6 +1030,7 @@ static irqreturn_t ti81xx_interrupt(int irq, void *hci) u32 pend1 = 0, pend2 = 0; u32 epintr, usbintr; u8 is_babble = 0; + int err; spin_lock_irqsave(&musb->lock, flags); @@ -1093,14 +1098,14 @@ static irqreturn_t ti81xx_interrupt(int irq, void *hci) ERR("CAUTION: musb%d: Babble Interrupt Occured\n", musb->id); } - if (usbintr & (USB_INTR_DRVVBUS << USB_INTR_USB_SHIFT)) { + err = is_host_enabled(musb) && (musb->int_usb & + MUSB_INTR_VBUSERROR); + + if (err || (usbintr & (USB_INTR_DRVVBUS << USB_INTR_USB_SHIFT))) { int drvvbus = musb_readl(reg_base, USB_STAT_REG); void __iomem *mregs = musb->mregs; u8 devctl = musb_readb(mregs, MUSB_DEVCTL); - int err; - err = is_host_enabled(musb) && (musb->int_usb & - MUSB_INTR_VBUSERROR); if (err) { /* * The Mentor core doesn't debounce VBUS as needed -- 1.7.0.4