UPSTREAM: usb: dwc2: gadget: don't overwrite DCTL register on NAKEFF interrupts
authorGregory Herrero <gregory.herrero@intel.com>
Mon, 7 Dec 2015 11:07:31 +0000 (12:07 +0100)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 3 Jan 2017 10:47:43 +0000 (18:47 +0800)
When receiving GINTSTS_GINNAKEFF or GINTSTS_GOUTNAKEFF interrupt,
DCTL will be overwritten with DCTL_CGOUTNAK or DCTL_CGNPINNAK values.
Instead of overwriting it, write only needed bits.

It could cause an issue if GINTSTS_GINNAKEFF or GINTSTS_GOUTNAKEFF
interrupt is received after dwc2 disabled pullup by writing
DCTL_SFTDISCON bit.
Pullup will then be re-enabled whereas it should not.

Change-Id: Idd93b20c3d780fffdf03cc30481eb4aed9aafe1e
Acked-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Gregory Herrero <gregory.herrero@intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Huang, Tao <huangtao@rock-chips.com>
(cherry picked from commit 3be99cd0e882dd2127b8cfe3942f5e464915aeba)

drivers/usb/dwc2/gadget.c

index 92a182feb936b95aaf8b1da34fc05a23bf1d7a63..3a24cbf355a9e0a6e13a1ffa0fa4987e2104c6ea 100644 (file)
@@ -2585,7 +2585,7 @@ irq_retry:
        if (gintsts & GINTSTS_GOUTNAKEFF) {
                dev_info(hsotg->dev, "GOUTNakEff triggered\n");
 
-               dwc2_writel(DCTL_CGOUTNAK, hsotg->regs + DCTL);
+               __orr32(hsotg->regs + DCTL, DCTL_CGOUTNAK);
 
                dwc2_hsotg_dump(hsotg);
        }
@@ -2593,7 +2593,7 @@ irq_retry:
        if (gintsts & GINTSTS_GINNAKEFF) {
                dev_info(hsotg->dev, "GINNakEff triggered\n");
 
-               dwc2_writel(DCTL_CGNPINNAK, hsotg->regs + DCTL);
+               __orr32(hsotg->regs + DCTL, DCTL_CGNPINNAK);
 
                dwc2_hsotg_dump(hsotg);
        }