From: peter.chen@freescale.com (Peter Chen)
To: linux-arm-kernel@lists.infradead.org
Subject: [Patch v2 03/10] usb: chipidea: add wakeup interrupt handler
Date: Tue, 22 Oct 2013 14:23:32 +0800 [thread overview]
Message-ID: <1382423019-26184-4-git-send-email-peter.chen@freescale.com> (raw)
In-Reply-To: <1382423019-26184-1-git-send-email-peter.chen@freescale.com>
When the controller is at suspend mode, it can be waken up by
external events (like vbus, dp/dm or id change). Once we receive
the wakeup interrupt, we need to resume the controller first, eg
open clocks, disable some wakeup settings, etc. After that, the
controller can receive the normal USB interrupts.
Signed-off-by: Peter Chen <peter.chen@freescale.com>
---
drivers/usb/chipidea/ci.h | 1 +
drivers/usb/chipidea/core.c | 20 ++++++++++++++++++++
drivers/usb/chipidea/otg.c | 5 +++++
3 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
index 6ea1892..38598b3 100644
--- a/drivers/usb/chipidea/ci.h
+++ b/drivers/usb/chipidea/ci.h
@@ -175,6 +175,7 @@ struct ci_hdrc {
bool b_sess_valid_event;
bool supports_runtime_pm;
bool in_lpm;
+ bool wakeup_int;
};
static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci)
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index a5b8f43..a9497eb 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -190,6 +190,13 @@ static void ci_hdrc_enter_lpm(struct ci_hdrc *ci, bool enable)
* than 1ms) to leave low power mode.
*/
usleep_range(1500, 2000);
+ } else if (!enable) {
+ /*
+ * At wakeup interrupt, the phcd will be cleared by hardware
+ * automatically, but the controller needs at least 1ms
+ * to reflect PHY's status.
+ */
+ usleep_range(1200, 1800);
}
}
@@ -355,6 +362,13 @@ static irqreturn_t ci_irq(int irq, void *data)
irqreturn_t ret = IRQ_NONE;
u32 otgsc = 0;
+ if (ci->in_lpm) {
+ disable_irq_nosync(irq);
+ ci->wakeup_int = true;
+ pm_runtime_get(ci->dev);
+ return IRQ_HANDLED;
+ }
+
if (ci->is_otg)
otgsc = hw_read(ci, OP_OTGSC, ~0);
@@ -739,6 +753,12 @@ static int ci_controller_resume(struct device *dev)
ci->in_lpm = false;
+ if (ci->wakeup_int) {
+ ci->wakeup_int = false;
+ enable_irq(ci->irq);
+ pm_runtime_put(ci->dev);
+ }
+
return 0;
}
diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c
index 39bd7ec..54bc7c0 100644
--- a/drivers/usb/chipidea/otg.c
+++ b/drivers/usb/chipidea/otg.c
@@ -78,10 +78,15 @@ static void ci_otg_work(struct work_struct *work)
if (ci->id_event) {
ci->id_event = false;
+ /* Keep controller active during id switch */
+ pm_runtime_get_sync(ci->dev);
ci_handle_id_switch(ci);
+ pm_runtime_put_sync(ci->dev);
} else if (ci->b_sess_valid_event) {
ci->b_sess_valid_event = false;
+ pm_runtime_get_sync(ci->dev);
ci_handle_vbus_change(ci);
+ pm_runtime_put_sync(ci->dev);
} else
dev_err(ci->dev, "unexpected event occurs at %s\n", __func__);
--
1.7.1
next prev parent reply other threads:[~2013-10-22 6:23 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-22 6:23 [Patch v2 00/10] Add power management support for chipidea Peter Chen
2013-10-22 6:23 ` [Patch v2 01/10] usb: chipidea: Add power management support Peter Chen
2013-10-22 6:23 ` [Patch v2 02/10] usb: chipidea: imx: add " Peter Chen
2013-10-22 6:23 ` Peter Chen [this message]
2013-10-22 6:23 ` [Patch v2 04/10] usb: chipidea: usbmisc_imx: remove the controller's clock information Peter Chen
2013-10-22 6:23 ` [Patch v2 05/10] usb: chipidea: usbmisc_imx: add set_wakup API Peter Chen
2013-10-22 6:23 ` [Patch v2 06/10] usb: chipidea: imx: call set_wakeup when necessary Peter Chen
2013-10-22 6:23 ` [Patch v2 07/10] usb: chipidea: imx: Enable runtime pm support for imx6 SoC serial Peter Chen
2013-10-22 6:23 ` [Patch v2 08/10] usb: chipidea: host: add quirk for ehci operation Peter Chen
2013-10-23 14:42 ` Alan Stern
2013-10-24 0:47 ` Peter Chen
2013-10-24 5:51 ` Lothar Waßmann
2013-10-24 5:50 ` Peter Chen
2013-10-22 6:23 ` [Patch v2 09/10] usb: chipidea: host: add ehci quirk for imx controller Peter Chen
2013-10-23 14:46 ` Alan Stern
2013-10-23 18:06 ` Felipe Balbi
2013-10-23 18:45 ` Alan Stern
2013-10-24 1:33 ` Peter Chen
2013-10-24 12:04 ` Felipe Balbi
2013-10-24 12:11 ` Peter Chen
2013-10-22 6:23 ` [Patch v2 10/10] usb: chipidea: imx: Enable CI_HDRC_IMX_EHCI_QUIRK if the phy has notify APIs 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=1382423019-26184-4-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).