From: peter.chen@freescale.com (Peter Chen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 07/11] usb: chipidea: host: add quirk for ehci operation
Date: Sat, 12 Oct 2013 17:35:09 +0800 [thread overview]
Message-ID: <1381570513-24927-8-git-send-email-peter.chen@freescale.com> (raw)
In-Reply-To: <1381570513-24927-1-git-send-email-peter.chen@freescale.com>
For chipidea controller, it does not follow ehci spec strictly.
Taking resume signal as an example, it will stop resume signal about
20-21ms later automatically, but standard ehci spec says, the resume
signal is controlled by software (clear portsc.PORT_RESUME).
This operation causes some remote wakeup problems for high speed
devices due to host controller does not send SOF in time since
software can't guarantee set run/stop bit in time (run/stop bit
was cleared at the ehci suspend routine).
When software sets run/stop bit, it needs 1 SoF time to make it effect.
If we close the PHY clock just after setting run/stop bit, it does
not be set in practice, so a software delay is needed.
Signed-off-by: Peter Chen <peter.chen@freescale.com>
---
drivers/usb/chipidea/host.c | 51 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c
index 6f96795..cbe95fc 100644
--- a/drivers/usb/chipidea/host.c
+++ b/drivers/usb/chipidea/host.c
@@ -33,6 +33,53 @@
#include "host.h"
static struct hc_driver __read_mostly ci_ehci_hc_driver;
+static int (*orig_bus_suspend)(struct usb_hcd *hcd);
+
+static int ci_ehci_bus_suspend(struct usb_hcd *hcd)
+{
+ struct ehci_hcd *ehci = hcd_to_ehci(hcd);
+ int port;
+ u32 tmp;
+
+ int ret = orig_bus_suspend(hcd);
+
+ if (ret)
+ return ret;
+
+ port = HCS_N_PORTS(ehci->hcs_params);
+ while (port--) {
+ u32 __iomem *reg = &ehci->regs->port_status[port];
+ u32 portsc = ehci_readl(ehci, reg);
+
+ if (portsc & PORT_CONNECT) {
+ /*
+ * For chipidea, the resume signal will be ended
+ * automatically, so for remote wakeup case, the
+ * usbcmd.rs may not be set before the resume has
+ * ended if other resume path consumes too much
+ * time (~23ms-24ms), in that case, the SOF will not
+ * send out within 3ms after resume ends, then the
+ * device will enter suspend again.
+ */
+ if (hcd->self.root_hub->do_remote_wakeup) {
+ ehci_dbg(ehci,
+ "Remote wakeup is enabled, "
+ "and device is on the port\n");
+
+ tmp = ehci_readl(ehci, &ehci->regs->command);
+ tmp |= CMD_RUN;
+ ehci_writel(ehci, tmp, &ehci->regs->command);
+ /*
+ * It needs a short delay between set RUNSTOP
+ * and set PHCD.
+ */
+ udelay(125);
+ }
+ }
+ }
+
+ return 0;
+}
static irqreturn_t host_irq(struct ci_hdrc *ci)
{
@@ -132,5 +179,9 @@ int ci_hdrc_host_init(struct ci_hdrc *ci)
ehci_init_driver(&ci_ehci_hc_driver, NULL);
+ orig_bus_suspend = ci_ehci_hc_driver.bus_suspend;
+
+ ci_ehci_hc_driver.bus_suspend = ci_ehci_bus_suspend;
+
return 0;
}
--
1.7.1
next prev parent reply other threads:[~2013-10-12 9:35 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-12 9:35 [PATCH 00/11] Add power management support for chipidea Peter Chen
2013-10-12 9:35 ` [PATCH 01/11] usb: chipidea: Add power management support Peter Chen
2013-10-14 8:04 ` Lothar Waßmann
2013-10-14 7:55 ` Peter Chen
2013-10-14 8:42 ` Sascha Hauer
2013-10-14 9:04 ` Peter Chen
2013-10-14 10:23 ` Sascha Hauer
2013-10-14 10:46 ` Russell King - ARM Linux
2013-10-14 10:44 ` Russell King - ARM Linux
2013-10-14 11:01 ` Russell King - ARM Linux
2013-10-15 2:18 ` Peter Chen
2013-10-15 11:15 ` Russell King - ARM Linux
2013-10-12 9:35 ` [PATCH 02/11] usb: chipidea: imx: add " Peter Chen
2013-10-12 9:35 ` [PATCH 03/11] usb: chipidea: usbmisc_imx: remove the controller's clock information Peter Chen
2013-10-12 9:35 ` [PATCH 04/11] usb: chipidea: add wakeup interrupt handler Peter Chen
2013-10-12 9:35 ` [PATCH 05/11] usb: chipidea: usbmisc_imx: add set_wakup API Peter Chen
2013-10-12 9:35 ` [PATCH 06/11] usb: chipidea: imx: call set_wakeup when necessary Peter Chen
2013-10-12 9:35 ` Peter Chen [this message]
2013-10-12 9:35 ` [PATCH 08/11] usb: chipidea: host: add ehci quirk for imx controller Peter Chen
2013-10-12 9:35 ` [PATCH 09/11] usb: chipidea: imx: Enable CI_HDRC_IMX_EHCI_QUIRK if the phy has notify APIs Peter Chen
2013-10-12 9:35 ` [PATCH 10/11] usb: chipidea: imx: add binding for supporting runtime pm Peter Chen
2013-10-12 14:40 ` Alan Stern
2013-10-14 1:22 ` Peter Chen
2013-10-14 1:39 ` Marek Vasut
2013-10-14 1:33 ` Peter Chen
2013-10-12 9:35 ` [PATCH 11/11] ARM: dts: imx6qdl-sabresd: Enable runtime pm for usbotg and usb host 1 Peter Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1381570513-24927-8-git-send-email-peter.chen@freescale.com \
--to=peter.chen@freescale.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.