usb: dwc_otg: add condition judgement to filter invalid
authorlyz <lyz@rock-chips.com>
Tue, 27 Jan 2015 07:53:53 +0000 (15:53 +0800)
committerlyz <lyz@rock-chips.com>
Thu, 12 Feb 2015 02:53:39 +0000 (10:53 +0800)
disconnect interrupt

In some case, we disconnect a usb device, then usb controller
will trigger more the one disconnect interrupt, so check port
enable change bit in hprt0 to make sure just one disconnect
interrupt be handled.
here to

Signed-off-by: lyz <lyz@rock-chips.com>
drivers/usb/dwc_otg_310/dwc_otg_hcd.c

index 7602e4f851f6552ef65b8e0468f4e76c01f72a16..07845a23fc262a196f2da7c920cdc104fd42bff7 100755 (executable)
@@ -288,10 +288,12 @@ static int32_t dwc_otg_hcd_disconnect_cb(void *p)
        hprt0.d32 = DWC_READ_REG32(dwc_otg_hcd->core_if->host_if->hprt0);
        /* In some case, we don't disconnect a usb device, but
         * disconnect intr was triggered, so check hprt0 here. */
-       if ((!hprt0.b.prtenchng)
+       if (((!hprt0.b.prtenchng)
            && (!hprt0.b.prtconndet)
-           && hprt0.b.prtconnsts) {
-               DWC_PRINTF("%s: hprt0 = 0x%08x\n", __func__, hprt0.d32);
+           && hprt0.b.prtconnsts)
+           || !hprt0.b.prtenchng) {
+               DWC_PRINTF("%s: Invalid disconnect interrupt "
+                          "hprt0 = 0x%08x\n", __func__, hprt0.d32);
                return 1;
        }
        /*