summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hsu <mhsu@nvidia.com>2013-06-06 21:13:08 -0700
committerAnshul Jain (SW) <anshulj@nvidia.com>2013-06-07 18:00:49 -0700
commit3d4c996407fc1b98464a2e148619f4b8fb6a8de0 (patch)
tree6ac19d7385b690fd62bb809b10b056067575400a
parente9d814ed83329fe74bc11c600a479a5190bf6fc5 (diff)
arm: tegra: thor: fix wlan-bt power sequence
Use mutexes to prevent concurrent wifi / bluetooth turn on sequence. Bug 1302412 Change-Id: Icd086b616af2f5ccbff7968d613310c365ad549a Signed-off-by: Michael Hsu <mhsu@nvidia.com> Reviewed-on: http://git-master/r/236533 Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com>
-rw-r--r--drivers/misc/bluedroid_pm.c22
-rw-r--r--drivers/net/wireless/bcmdhd/Makefile3
-rw-r--r--drivers/net/wireless/bcmdhd/wl_android.c17
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);