summaryrefslogtreecommitdiff
path: root/drivers/misc/bluedroid_pm.c
diff options
context:
space:
mode:
authorNagarjuna Kristam <nkristam@nvidia.com>2012-12-20 21:51:27 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:48:22 -0700
commitb47a8839db21a2a59125749d6eefc042e39ebea2 (patch)
treef925b32615182fbe01384d12cc72cab032b12f1e /drivers/misc/bluedroid_pm.c
parenta938d59a8cfa28364f4cac7377369681122286c2 (diff)
misc: bluedroid_pm: add wake_lock support
Use wake locks when bluetooth communication is on-going to dis-allow system suspend Bug 1205772 Change-Id: I57d4286ef6a7ae7d246bd0cbd53db68afa832827 Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com> Reviewed-on: http://git-master/r/173177 (cherry picked from commit 113a9e90c82a991e293580119fb6df1882f9da84) Reviewed-on: http://git-master/r/174406 Reviewed-by: Riham Haidar <rhaidar@nvidia.com> Tested-by: Riham Haidar <rhaidar@nvidia.com>
Diffstat (limited to 'drivers/misc/bluedroid_pm.c')
-rw-r--r--drivers/misc/bluedroid_pm.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/misc/bluedroid_pm.c b/drivers/misc/bluedroid_pm.c
index 011552ed3f9c..2b27f0fdf6c0 100644
--- a/drivers/misc/bluedroid_pm.c
+++ b/drivers/misc/bluedroid_pm.c
@@ -33,6 +33,7 @@
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/interrupt.h>
+#include <linux/wakelock.h>
#define PROC_DIR "bluetooth/sleep"
struct bluedroid_pm_data {
@@ -45,6 +46,7 @@ struct bluedroid_pm_data {
struct regulator *vdd_3v3;
struct regulator *vdd_1v8;
struct rfkill *rfkill;
+ struct wake_lock wake_lock;
};
struct proc_dir_entry *proc_bt_dir, *bluetooth_sleep_dir;
@@ -78,6 +80,8 @@ static int bluedroid_pm_rfkill_set_power(void *data, bool blocked)
regulator_disable(bluedroid_pm->vdd_3v3);
if (bluedroid_pm->vdd_1v8)
regulator_disable(bluedroid_pm->vdd_1v8);
+ if (bluedroid_pm->ext_wake)
+ wake_unlock(&bluedroid_pm->wake_lock);
} else {
if (bluedroid_pm->vdd_3v3)
regulator_enable(bluedroid_pm->vdd_3v3);
@@ -235,6 +239,9 @@ static int bluedroid_pm_probe(struct platform_device *pdev)
pr_err("%s: Failed to create proc interface", __func__);
goto free_res;
}
+ /* initialize wake lock */
+ wake_lock_init(&bluedroid_pm->wake_lock, WAKE_LOCK_SUSPEND,
+ "bluedroid_pm");
} else {
pr_debug("%s: gpio_ext_wake not registered\n", __func__);
bluedroid_pm->ext_wake = 0;
@@ -275,6 +282,7 @@ static int bluedroid_pm_remove(struct platform_device *pdev)
if (bluedroid_pm->host_wake_irq)
free_irq(bluedroid_pm->host_wake_irq, NULL);
if (bluedroid_pm->ext_wake) {
+ wake_lock_destroy(&bluedroid_pm->wake_lock);
gpio_free(bluedroid_pm->ext_wake);
remove_bt_proc_interface();
}
@@ -354,11 +362,13 @@ static int lpm_write_proc(struct file *file, const char *buffer,
}
if (!bluedroid_pm->is_blocked) {
- if (buf[0] == '0')
+ if (buf[0] == '0') {
gpio_set_value(bluedroid_pm->ext_wake, 0);
- else if (buf[0] == '1')
+ wake_unlock(&bluedroid_pm->wake_lock);
+ } else if (buf[0] == '1') {
gpio_set_value(bluedroid_pm->ext_wake, 1);
- else {
+ wake_lock(&bluedroid_pm->wake_lock);
+ } else {
kfree(buf);
return -EINVAL;
}