summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Zhao2012-09-12 13:58:08 +0200
committerGreg Kroah-Hartman2012-09-12 20:20:38 +0200
commit984f753cf120db60d97271e34cf16c95761f0278 (patch)
treeeab720420efdb324a0a2ae8b27e100820fb21121
parentUSB: chipidea: delay 2ms before read ID status at probe time (diff)
downloadkernel-qcow2-linux-984f753cf120db60d97271e34cf16c95761f0278.tar.gz
kernel-qcow2-linux-984f753cf120db60d97271e34cf16c95761f0278.tar.xz
kernel-qcow2-linux-984f753cf120db60d97271e34cf16c95761f0278.zip
USB: chipidea: acknowledge ID change interrupt in irq handler
In order to avoid re-queueing of the role changing work, we need to clear the ID change interrupt bit right in the irq handler. Tested-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Tested-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Richard Zhao <richard.zhao@freescale.com> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/chipidea/core.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 3c3ed77a55bb..19ef3242cf43 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -273,8 +273,6 @@ static void ci_role_work(struct work_struct *work)
struct ci13xxx *ci = container_of(work, struct ci13xxx, work);
enum ci_role role = ci_otg_role(ci);
- hw_write(ci, OP_OTGSC, OTGSC_IDIS, OTGSC_IDIS);
-
if (role != ci->role) {
dev_dbg(ci->dev, "switching from %s to %s\n",
ci_role(ci)->name, ci->roles[role]->name);
@@ -325,6 +323,7 @@ static irqreturn_t ci_irq(int irq, void *data)
u32 sts = hw_read(ci, OP_OTGSC, ~0);
if (sts & OTGSC_IDIS) {
+ hw_write(ci, OP_OTGSC, OTGSC_IDIS, OTGSC_IDIS);
queue_work(ci->wq, &ci->work);
ret = IRQ_HANDLED;
}