summaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2019-05-22 00:33:58 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2019-05-23 09:45:49 +0200
commite4d102602056745f4bcce94501671daad53dc2b8 (patch)
treee9f48ac743bd637e9aa81cd0ba410d051e88829c /drivers/usb
parent278f77fe175a71060ff480185ab39f0ac65a83c7 (diff)
downloadbarebox-e4d102602056745f4bcce94501671daad53dc2b8.tar.gz
barebox-e4d102602056745f4bcce94501671daad53dc2b8.tar.xz
usb: host: ehci: Share code to enable/disable async schedule
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/ehci-hcd.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 54ab328305..4ccaec743f 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -213,6 +213,23 @@ static int ehci_td_buffer(struct qTD *td, void *buf, size_t sz)
return 0;
}
+static int ehci_enable_async_schedule(struct ehci_host *ehci, bool enable)
+{
+ uint32_t cmd, done;
+
+ cmd = ehci_readl(&ehci->hcor->or_usbcmd);
+ if (enable) {
+ cmd |= CMD_ASE;
+ done = STD_ASS;
+ } else {
+ cmd &= ~CMD_ASE;
+ done = 0;
+ }
+ ehci_writel(&ehci->hcor->or_usbcmd, cmd);
+
+ return handshake(&ehci->hcor->or_usbsts, STD_ASS, done, 100 * 1000);
+}
+
static int
ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
int length, struct devrequest *req, int timeout_ms)
@@ -225,7 +242,6 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
uint32_t *tdp;
uint32_t endpt, token, usbsts;
uint32_t c, toggle;
- uint32_t cmd;
int ret = 0, i;
uint64_t start, timeout_val;
@@ -353,11 +369,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
ehci_writel(&ehci->hcor->or_usbsts, (usbsts & 0x3f));
/* Enable async. schedule. */
- cmd = ehci_readl(&ehci->hcor->or_usbcmd);
- cmd |= CMD_ASE;
- ehci_writel(&ehci->hcor->or_usbcmd, cmd);
-
- ret = handshake(&ehci->hcor->or_usbsts, STD_ASS, STD_ASS, 100 * 1000);
+ ret = ehci_enable_async_schedule(ehci, true);
if (ret < 0) {
dev_err(ehci->dev, "fail timeout STD_ASS set\n");
goto fail;
@@ -370,12 +382,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
do {
token = hc32_to_cpu(vtd->qt_token);
if (is_timeout_non_interruptible(start, timeout_val)) {
- /* Disable async schedule. */
- cmd = ehci_readl(&ehci->hcor->or_usbcmd);
- cmd &= ~CMD_ASE;
- ehci_writel(&ehci->hcor->or_usbcmd, cmd);
-
- ret = handshake(&ehci->hcor->or_usbsts, STD_ASS, 0, 100 * 1000);
+ ehci_enable_async_schedule(ehci, false);
ehci_writel(&qh->qt_token, 0);
return -ETIMEDOUT;
}
@@ -391,13 +398,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
}
}
- /* Disable async schedule. */
- cmd = ehci_readl(&ehci->hcor->or_usbcmd);
- cmd &= ~CMD_ASE;
- ehci_writel(&ehci->hcor->or_usbcmd, cmd);
-
- ret = handshake(&ehci->hcor->or_usbsts, STD_ASS, 0,
- 100 * 1000);
+ ret = ehci_enable_async_schedule(ehci, false);
if (ret < 0) {
dev_err(ehci->dev, "fail timeout STD_ASS reset\n");
goto fail;