summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-enterprise-baseband.c
diff options
context:
space:
mode:
authorSteve Lin <stlin@nvidia.com>2011-07-05 15:22:25 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:52:22 -0800
commit3ff9a7c0ae81472496ac5368b9275c2922404d66 (patch)
treea94b1b872ab4a102af5a4359ccf1b6e3ed41f118 /arch/arm/mach-tegra/board-enterprise-baseband.c
parent317ceb412a5ceda2b0a8d1211e465f12cfdaa87b (diff)
ARM: tegra: baseband: modem flashless boot and remote wakeup
Support modem reboot and re-enumeration. Support modem remote wakeup. Bug 814261 Bug 814271 Bug 846135 Original-Change-Id: I103722d0248bcb1565d5f5799a2e4317c2579a95 Reviewed-on: http://git-master/r/31441 Tested-by: Szming Lin <stlin@nvidia.com> Reviewed-by: Udaykumar Rameshchan Raval <uraval@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Rebase-Id: Re5069bff49f5b7ed327030993de385b2c014b131
Diffstat (limited to 'arch/arm/mach-tegra/board-enterprise-baseband.c')
-rw-r--r--arch/arm/mach-tegra/board-enterprise-baseband.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-enterprise-baseband.c b/arch/arm/mach-tegra/board-enterprise-baseband.c
index b3f3d7d9f76b..196c3585da3f 100644
--- a/arch/arm/mach-tegra/board-enterprise-baseband.c
+++ b/arch/arm/mach-tegra/board-enterprise-baseband.c
@@ -27,6 +27,7 @@
#include <linux/err.h>
#include <linux/device.h>
#include <linux/usb.h>
+#include <linux/wakelock.h>
#include <linux/platform_data/tegra_usb.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -54,6 +55,7 @@ struct ph450_priv {
unsigned int wake_cnt;
unsigned int restart_gpio;
struct mutex lock;
+ struct wake_lock wake_lock;
unsigned int vid;
unsigned int pid;
struct usb_device *udev;
@@ -170,6 +172,8 @@ static irqreturn_t mdm_start_thread(int irq, void *data)
if (gpio_get_value(priv->restart_gpio)) {
pr_info("BB_RST_OUT high\n");
+ /* hold wait lock to complete the enumeration */
+ wake_lock_timeout(&priv->wake_lock, HZ * 2);
} else {
pr_info("BB_RST_OUT low\n");
}
@@ -181,6 +185,7 @@ static irqreturn_t mdm_wake_thread(int irq, void *data)
{
struct ph450_priv *priv = (struct ph450_priv *)data;
+ wake_lock_timeout(&priv->wake_lock, HZ);
mutex_lock(&priv->lock);
if (priv->udev) {
usb_lock_device(priv->udev);
@@ -299,6 +304,8 @@ static int __init ph450_init(void)
ph450_priv.restart_gpio = TEGRA_GPIO_PV1;
mutex_init(&(ph450_priv.lock));
+ wake_lock_init(&(ph450_priv.wake_lock), WAKE_LOCK_SUSPEND,
+ "mdm_wake_lock");
/* create work queue */
ph450_priv.wq = create_workqueue("mdm_queue");