diff options
Diffstat (limited to 'drivers/misc/bluedroid_pm.c')
-rw-r--r-- | drivers/misc/bluedroid_pm.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/misc/bluedroid_pm.c b/drivers/misc/bluedroid_pm.c index 1230bfad4683..3b178d429cc2 100644 --- a/drivers/misc/bluedroid_pm.c +++ b/drivers/misc/bluedroid_pm.c @@ -34,6 +34,7 @@ #include <linux/clk.h> #include <linux/interrupt.h> #include <linux/wakelock.h> +#include <linux/delay.h> #include <linux/pm_qos.h> #define PROC_DIR "bluetooth/sleep" @@ -62,6 +63,20 @@ static bool bluedroid_pm_blocked = 1; static int create_bt_proc_interface(void *drv_data); static void remove_bt_proc_interface(void); +static DEFINE_MUTEX(bt_wlan_sync); + +void bt_wlan_lock(void) +{ + mutex_lock(&bt_wlan_sync); +} +EXPORT_SYMBOL(bt_wlan_lock); + +void bt_wlan_unlock(void) +{ + mutex_unlock(&bt_wlan_sync); +} +EXPORT_SYMBOL(bt_wlan_unlock); + static irqreturn_t bluedroid_pm_hostwake_isr(int irq, void *dev_id) { /* schedule a tasklet to handle the change in the host wake line */ @@ -78,6 +93,9 @@ static int bluedroid_pm_rfkill_set_power(void *data, bool blocked) if (gpio_get_value(bluedroid_pm->gpio_shutdown) == !blocked) return 0; + bt_wlan_lock(); + msleep(300); + if (blocked) { if (bluedroid_pm->gpio_shutdown) gpio_set_value(bluedroid_pm->gpio_shutdown, 0); @@ -103,6 +121,10 @@ static int bluedroid_pm_rfkill_set_power(void *data, bool blocked) PM_QOS_CPU_FREQ_MIN, PM_QOS_DEFAULT_VALUE); } bluedroid_pm->is_blocked = blocked; + + msleep(50); + bt_wlan_unlock(); + return 0; } |