From 3d2090f53528758b8bc021441973d648943507da Mon Sep 17 00:00:00 2001 From: lyz Date: Tue, 27 Jan 2015 15:53:53 +0800 Subject: [PATCH] usb: dwc_otg: add condition judgement to filter invalid 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 --- drivers/usb/dwc_otg_310/dwc_otg_hcd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/usb/dwc_otg_310/dwc_otg_hcd.c b/drivers/usb/dwc_otg_310/dwc_otg_hcd.c index 7602e4f851f6..07845a23fc26 100755 --- a/drivers/usb/dwc_otg_310/dwc_otg_hcd.c +++ b/drivers/usb/dwc_otg_310/dwc_otg_hcd.c @@ -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; } /* -- 2.34.1