diff options
-rw-r--r-- | drivers/misc/bluedroid_pm.c | 22 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/Makefile | 3 | ||||
-rw-r--r-- | drivers/net/wireless/bcmdhd/wl_android.c | 17 |
3 files changed, 42 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; } diff --git a/drivers/net/wireless/bcmdhd/Makefile b/drivers/net/wireless/bcmdhd/Makefile index 7361e03b16f8..b59bedf1043a 100644 --- a/drivers/net/wireless/bcmdhd/Makefile +++ b/drivers/net/wireless/bcmdhd/Makefile @@ -21,6 +21,9 @@ DHDCFLAGS += -DNV_BCM943341_WBFGN_MULTI_MODULE_SUPPORT ifeq ($(CONFIG_BCMDHD_WIFI_CONTROL_FUNC), y) DHDCFLAGS += -DCONFIG_WIFI_CONTROL_FUNC endif +ifeq ($(CONFIG_BLUEDROID_PM),y) +DHDCFLAGS += -DENABLE_WiFI_BT_TURN_ON_SYNC +endif #ifeq ($(CONFIG_BCM4334),y) #DHDCFLAGS += -DPROP_TXSTATUS_VSDB #DHDCFLAGS += -DCUSTOM_GLOM_SETTING=5 diff --git a/drivers/net/wireless/bcmdhd/wl_android.c b/drivers/net/wireless/bcmdhd/wl_android.c index 6ef39311f3af..03fbfa9b3306 100644 --- a/drivers/net/wireless/bcmdhd/wl_android.c +++ b/drivers/net/wireless/bcmdhd/wl_android.c @@ -48,6 +48,9 @@ #endif #endif /* CONFIG_WIFI_CONTROL_FUNC */ +#ifdef ENABLE_WiFI_BT_TURN_ON_SYNC +#include <linux/delay.h> +#endif /* * Android private command strings, PLEASE define new private commands here * so they can be updated easily in the future (if needed) @@ -195,6 +198,10 @@ extern int dhd_wlfc_init(dhd_pub_t *dhd); extern void dhd_wlfc_deinit(dhd_pub_t *dhd); #endif +#ifdef ENABLE_WiFI_BT_TURN_ON_SYNC +extern void bt_wlan_lock(void); +extern void bt_wlan_unlock(void); +#endif extern bool ap_fw_loaded; #if defined(CUSTOMER_HW2) @@ -1254,7 +1261,17 @@ int wifi_set_power(int on, unsigned long msec) { DHD_ERROR(("%s = %d\n", __FUNCTION__, on)); if (wifi_control_data && wifi_control_data->set_power) { +#ifdef ENABLE_WiFI_BT_TURN_ON_SYNC + bt_wlan_lock(); + if (on) + msleep(600); + else + msleep(50); +#endif wifi_control_data->set_power(on); +#ifdef ENABLE_WiFI_BT_TURN_ON_SYNC + bt_wlan_unlock(); +#endif } if (msec) msleep(msec); |