From: Macpaul Lin Date: Mon, 25 May 2020 02:50:47 +0000 (-0500) Subject: usb: musb: mediatek: add reset FADDR to zero in reset interrupt handle X-Git-Tag: v5.7.5~69 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=99d000bed7d5b82ffa17dd852084eb543146ab81;p=users%2Fdwmw2%2Flinux.git usb: musb: mediatek: add reset FADDR to zero in reset interrupt handle commit 402bcac4b25b520c89ba60db85eb6316f36e797f upstream. When receiving reset interrupt, FADDR need to be reset to zero in peripheral mode. Otherwise ep0 cannot do enumeration when re-plugging USB cable. Signed-off-by: Macpaul Lin Acked-by: Min Guo Signed-off-by: Bin Liu Link: https://lore.kernel.org/r/20200525025049.3400-5-b-liu@ti.com Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c index 6196b0e8d77d2..eebeadd269461 100644 --- a/drivers/usb/musb/mediatek.c +++ b/drivers/usb/musb/mediatek.c @@ -208,6 +208,12 @@ static irqreturn_t generic_interrupt(int irq, void *__hci) musb->int_rx = musb_clearw(musb->mregs, MUSB_INTRRX); musb->int_tx = musb_clearw(musb->mregs, MUSB_INTRTX); + if ((musb->int_usb & MUSB_INTR_RESET) && !is_host_active(musb)) { + /* ep0 FADDR must be 0 when (re)entering peripheral mode */ + musb_ep_select(musb->mregs, 0); + musb_writeb(musb->mregs, MUSB_FADDR, 0); + } + if (musb->int_usb || musb->int_tx || musb->int_rx) retval = musb_interrupt(musb);