summaryrefslogtreecommitdiff
path: root/drivers/usb/otg
diff options
context:
space:
mode:
authorRakesh Bodla <rbodla@nvidia.com>2011-08-17 12:18:02 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:20 -0800
commitae6576a5f96969365498e0d4a16e0881a07fcd3d (patch)
tree2b47aa2dd34fc2357076b2d01fa3e414510b719a /drivers/usb/otg
parentab65dc3b89f38aaf59c1aaa5fd3ab4965555e337 (diff)
usb: tegra: otg: check connected devices on resume
A device might be connected while CPU is in sleep mode. In this case no interrupt will be triggered. Force irq_work to recheck connected devices. Bug 860693 Reviewed-on: http://git-master/r/40331 (cherry picked from commit 749e994e1e0010843e4a2d54e27a7f19274661a7) Original-Change-Id: Ic793be7285dca123dd927931b0d92fc2c510a870 Reviewed-on: http://git-master/r/46934 Reviewed-by: Rakesh Bodla <rbodla@nvidia.com> Tested-by: Rakesh Bodla <rbodla@nvidia.com> Reviewed-by: Hanumanth Venkateswa Moganty <vmoganty@nvidia.com> Rebase-Id: R41b408abb66ad9c28c8e7c2c48812dd7a292360e
Diffstat (limited to 'drivers/usb/otg')
-rw-r--r--drivers/usb/otg/tegra-otg.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/usb/otg/tegra-otg.c b/drivers/usb/otg/tegra-otg.c
index f895c4a91e7f..5404b96da83d 100644
--- a/drivers/usb/otg/tegra-otg.c
+++ b/drivers/usb/otg/tegra-otg.c
@@ -401,6 +401,8 @@ static void tegra_otg_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct tegra_otg_data *tegra_otg = platform_get_drvdata(pdev);
+ int val;
+ unsigned long flags;
tegra_otg_enable_clk();
@@ -412,8 +414,20 @@ static void tegra_otg_resume(struct device *dev)
/* restore the interupt enable for cable ID and VBUS */
clk_enable(tegra_otg->clk);
writel(tegra_otg->intr_reg_data, (tegra_otg->regs + USB_PHY_WAKEUP));
+ val = readl(tegra_otg->regs + USB_PHY_WAKEUP);
clk_disable(tegra_otg->clk);
+ /* A device might be connected while CPU is in sleep mode. In this case no interrupt
+ * will be triggered
+ * force irq_work to recheck connected devices
+ */
+ if (!(val & USB_ID_STATUS)) {
+ spin_lock_irqsave(&tegra_otg->lock, flags);
+ tegra_otg->int_status = (val | USB_ID_INT_STATUS );
+ schedule_work(&tegra_otg->work);
+ spin_unlock_irqrestore(&tegra_otg->lock, flags);
+ }
+
return;
}