| From 7f2d73788d9067fd4f677ac5f60ffd25945af7af Mon Sep 17 00:00:00 2001 |
| From: Neal Liu <neal_liu@aspeedtech.com> |
| Date: Fri, 10 Sep 2021 15:36:19 +0800 |
| Subject: usb: ehci: handshake CMD_RUN instead of STS_HALT |
| |
| From: Neal Liu <neal_liu@aspeedtech.com> |
| |
| commit 7f2d73788d9067fd4f677ac5f60ffd25945af7af upstream. |
| |
| For Aspeed, HCHalted status depends on not only Run/Stop but also |
| ASS/PSS status. |
| Handshake CMD_RUN on startup instead. |
| |
| Tested-by: Tao Ren <rentao.bupt@gmail.com> |
| Reviewed-by: Tao Ren <rentao.bupt@gmail.com> |
| Acked-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Neal Liu <neal_liu@aspeedtech.com> |
| Link: https://lore.kernel.org/r/20210910073619.26095-1-neal_liu@aspeedtech.com |
| Cc: Joel Stanley <joel@jms.id.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/host/ehci-hcd.c | 11 ++++++++++- |
| drivers/usb/host/ehci-platform.c | 6 ++++++ |
| drivers/usb/host/ehci.h | 1 + |
| 3 files changed, 17 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/usb/host/ehci-hcd.c |
| +++ b/drivers/usb/host/ehci-hcd.c |
| @@ -634,7 +634,16 @@ static int ehci_run (struct usb_hcd *hcd |
| /* Wait until HC become operational */ |
| ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ |
| msleep(5); |
| - rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000); |
| + |
| + /* For Aspeed, STS_HALT also depends on ASS/PSS status. |
| + * Check CMD_RUN instead. |
| + */ |
| + if (ehci->is_aspeed) |
| + rc = ehci_handshake(ehci, &ehci->regs->command, CMD_RUN, |
| + 1, 100 * 1000); |
| + else |
| + rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, |
| + 0, 100 * 1000); |
| |
| up_write(&ehci_cf_port_reset_rwsem); |
| |
| --- a/drivers/usb/host/ehci-platform.c |
| +++ b/drivers/usb/host/ehci-platform.c |
| @@ -286,6 +286,12 @@ static int ehci_platform_probe(struct pl |
| "has-transaction-translator")) |
| hcd->has_tt = 1; |
| |
| + if (of_device_is_compatible(dev->dev.of_node, |
| + "aspeed,ast2500-ehci") || |
| + of_device_is_compatible(dev->dev.of_node, |
| + "aspeed,ast2600-ehci")) |
| + ehci->is_aspeed = 1; |
| + |
| if (soc_device_match(quirk_poll_match)) |
| priv->quirk_poll = true; |
| |
| --- a/drivers/usb/host/ehci.h |
| +++ b/drivers/usb/host/ehci.h |
| @@ -218,6 +218,7 @@ struct ehci_hcd { /* one per controlle |
| unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ |
| unsigned need_oc_pp_cycle:1; /* MPC834X port power */ |
| unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ |
| + unsigned is_aspeed:1; |
| |
| /* required for usb32 quirk */ |
| #define OHCI_CTRL_HCFS (3 << 6) |