summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-04-11 22:13:29 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-04-11 22:13:28 -0700
commitf02dfcce2cb2e069daeb0d01db11fe9e6d360926 (patch)
treef5371c1374f129cf035c9a23a9edfe28d22f61e9
parent55b4dd9721ab23d4197b102c3585a700854157f7 (diff)
parent70dc54f5deaa8e64fdf9092a8fe2ba492cbd7e5a (diff)
Merge "usb: XHCI: Implement xhci_handshake_check_state() API"
-rw-r--r--drivers/usb/host/xhci.c21
-rw-r--r--drivers/usb/host/xhci.h2
2 files changed, 23 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 3e11317db602..0ccd5cec42ff 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -77,6 +77,27 @@ int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, int usec)
return -ETIMEDOUT;
}
+int xhci_handshake_check_state(struct xhci_hcd *xhci,
+ void __iomem *ptr, u32 mask, u32 done, int usec)
+{
+ u32 result;
+
+ do {
+ result = readl_relaxed(ptr);
+ if (result == ~(u32)0) /* card removed */
+ return -ENODEV;
+ /* host removed. Bail out */
+ if (xhci->xhc_state & XHCI_STATE_REMOVING)
+ return -ENODEV;
+ result &= mask;
+ if (result == done)
+ return 0;
+ udelay(1);
+ usec--;
+ } while (usec > 0);
+ return -ETIMEDOUT;
+}
+
/*
* Disable interrupts and begin the xHCI halting process.
*/
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 5800dda719f5..c0928f463d08 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1836,6 +1836,8 @@ int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num);
/* xHCI host controller glue */
typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *);
int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, int usec);
+int xhci_handshake_check_state(struct xhci_hcd *xhci,
+ void __iomem *ptr, u32 mask, u32 done, int usec);
void xhci_quiesce(struct xhci_hcd *xhci);
int xhci_halt(struct xhci_hcd *xhci);
int xhci_reset(struct xhci_hcd *xhci);