diff options
author | Steve Lin <stlin@nvidia.com> | 2011-07-05 15:22:25 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:52:22 -0800 |
commit | 3ff9a7c0ae81472496ac5368b9275c2922404d66 (patch) | |
tree | a94b1b872ab4a102af5a4359ccf1b6e3ed41f118 /arch/arm/mach-tegra/board-enterprise-baseband.c | |
parent | 317ceb412a5ceda2b0a8d1211e465f12cfdaa87b (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.c | 7 |
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"); |