]> granicus.if.org Git - esp-idf/commitdiff
bt: lock APB frequency while BT controller is enabled
authorIvan Grokhotkov <ivan@espressif.com>
Mon, 9 Oct 2017 07:34:31 +0000 (15:34 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Wed, 18 Oct 2017 06:37:22 +0000 (14:37 +0800)
components/bt/bt.c

index 140877d33a396e8b5163b0f05c9e5d02bc3fee34..a0539a19a669adb0e123ee28ea320d018a79d2e9 100644 (file)
@@ -33,6 +33,7 @@
 #include "bt.h"
 #include "esp_err.h"
 #include "esp_log.h"
+#include "esp_pm.h"
 
 #if CONFIG_BT_ENABLED
 
@@ -147,6 +148,10 @@ static esp_bt_controller_status_t btdm_controller_status = ESP_BT_CONTROLLER_STA
 
 static portMUX_TYPE global_int_mux = portMUX_INITIALIZER_UNLOCKED;
 
+#ifdef CONFIG_PM_ENABLE
+static esp_pm_lock_handle_t s_pm_lock;
+#endif
+
 static void IRAM_ATTR interrupt_disable(void)
 {
     portENTER_CRITICAL(&global_int_mux);
@@ -442,6 +447,13 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
         return ESP_ERR_INVALID_ARG;
     }
 
+#ifdef CONFIG_PM_ENABLE
+    esp_err_t err = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "bt", &s_pm_lock);
+    if (err != ESP_OK) {
+        return err;
+    }
+#endif
+
     btdm_osi_funcs_register(&osi_funcs);
 
     btdm_controller_mem_init();
@@ -450,6 +462,10 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
 
     ret = btdm_controller_init(btdm_cfg_mask, cfg);
     if (ret) {
+#ifdef CONFIG_PM_ENABLE
+        esp_pm_lock_delete(s_pm_lock);
+        s_pm_lock = NULL;
+#endif
         return ESP_ERR_NO_MEM;
     }
 
@@ -468,6 +484,12 @@ esp_err_t esp_bt_controller_deinit(void)
     }
 
     btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
+
+#ifdef CONFIG_PM_ENABLE
+    esp_pm_lock_delete(s_pm_lock);
+    s_pm_lock = NULL;
+#endif
+
     return ESP_OK;
 }
 
@@ -484,6 +506,10 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode)
         return ESP_ERR_INVALID_ARG;
     }
 
+#ifdef CONFIG_PM_ENABLE
+    esp_pm_lock_acquire(s_pm_lock);
+#endif
+
     esp_phy_load_cal_and_init();
 
     if (btdm_bb_init_flag == false) {
@@ -519,6 +545,10 @@ esp_err_t esp_bt_controller_disable(void)
         btdm_controller_status = ESP_BT_CONTROLLER_STATUS_INITED;
     }
 
+#ifdef CONFIG_PM_ENABLE
+    esp_pm_lock_release(s_pm_lock);
+#endif
+
     return ESP_OK;
 }