diff options
author | Rakesh Bodla <rbodla@nvidia.com> | 2011-08-17 12:18:02 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:20 -0800 |
commit | ae6576a5f96969365498e0d4a16e0881a07fcd3d (patch) | |
tree | 2b47aa2dd34fc2357076b2d01fa3e414510b719a /drivers/usb/otg | |
parent | ab65dc3b89f38aaf59c1aaa5fd3ab4965555e337 (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.c | 14 |
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; } |