diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2019-04-11 22:13:29 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-04-11 22:13:28 -0700 |
| commit | f02dfcce2cb2e069daeb0d01db11fe9e6d360926 (patch) | |
| tree | f5371c1374f129cf035c9a23a9edfe28d22f61e9 | |
| parent | 55b4dd9721ab23d4197b102c3585a700854157f7 (diff) | |
| parent | 70dc54f5deaa8e64fdf9092a8fe2ba492cbd7e5a (diff) | |
Merge "usb: XHCI: Implement xhci_handshake_check_state() API"
| -rw-r--r-- | drivers/usb/host/xhci.c | 21 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.h | 2 |
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); |
