diff --git a/components/esp_phy/esp32c5/phy_init_data.c b/components/esp_phy/esp32c5/phy_init_data.c index 844bc85e3fb..836eb5b715d 100644 --- a/components/esp_phy/esp32c5/phy_init_data.c +++ b/components/esp_phy/esp32c5/phy_init_data.c @@ -276,13 +276,16 @@ const esp_phy_init_data_t phy_init_data= { { } }; const char __attribute__((section(".rodata"))) phy_init_magic_post[] = PHY_INIT_MAGIC; +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) +#include "esp_private/sleep_retention.h" +uint8_t s_phy_fe_retention_ref = 0; +static _lock_t s_phy_fe_retention_lock; +static const char* TAG = "phy_sleep"; + +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) #if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD -#include "esp_private/sleep_retention.h" - -static const char* TAG = "phy_sleep"; - static esp_err_t sleep_retention_wifi_bb_init(void *arg) { #define N_REGS_WIFI_AGC() (130) @@ -353,18 +356,19 @@ void esp_phy_sleep_data_deinit(void) ESP_LOGW(TAG, "WiFi BB sleep retention deinit failed"); } } +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) static esp_err_t sleep_retention_phy_fe_init(void *arg) { - #define N_REGS_FE_COEX() (21) - #define N_REGS_FE_DATA() (35) - #define N_REGS_FE_CTRL() (56) - #define N_REGS_FE_DATA_WIFI() (22) + #define N_REGS_FE_COEX() (21) + #define N_REGS_FE_DATA() (35) + #define N_REGS_FE_CTRL() (56) + #define N_REGS_FE_DATA_WIFI() (22) #define REG_FECOEX_BASE 0x600a0000 #define REG_FEDATA_BASE 0x600a0400 #define REG_FECTRL_BASE 0x600a0800 #define REG_FEDATAWIFI_BASE 0x600a0c00 - const static sleep_retention_entries_config_t phy_fe_regs_retention[] = { [0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEM_FE_LINK(0), REG_FECOEX_BASE, REG_FECOEX_BASE, N_REGS_FE_COEX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE COEX */ [1] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_MODEM_FE_LINK(1), REG_FEDATA_BASE, REG_FEDATA_BASE, N_REGS_FE_DATA(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE DATA */ @@ -377,25 +381,40 @@ static esp_err_t sleep_retention_phy_fe_init(void *arg) return ESP_OK; } -void esp_phy_fe_sleep_data_init(void) +esp_err_t esp_phy_fe_sleep_data_init(void) { - sleep_retention_module_init_param_t init_param = { - .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, - .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH - }; - esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention init failed"); - return; + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref++ == 0) { + sleep_retention_module_init_param_t init_param = { + .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, + .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH + }; + esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention init failed"); + s_phy_fe_retention_ref --; + _lock_release(&s_phy_fe_retention_lock); + return err; + } } + _lock_release(&s_phy_fe_retention_lock); + return ESP_OK; } void esp_phy_fe_sleep_data_deinit(void) { - esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref == 0) { + _lock_release(&s_phy_fe_retention_lock); return; } + + if (--s_phy_fe_retention_ref == 0) { + esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + } + } + _lock_release(&s_phy_fe_retention_lock); } -#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) diff --git a/components/esp_phy/esp32c6/phy_init_data.c b/components/esp_phy/esp32c6/phy_init_data.c index f7a82173b29..383d82a19eb 100644 --- a/components/esp_phy/esp32c6/phy_init_data.c +++ b/components/esp_phy/esp32c6/phy_init_data.c @@ -148,12 +148,15 @@ const esp_phy_init_data_t phy_init_data= { { const char __attribute__((section(".rodata"))) phy_init_magic_post[] = PHY_INIT_MAGIC; -#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD - +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) #include "esp_private/sleep_retention.h" static const char* TAG = "phy_sleep"; +static _lock_t s_phy_fe_retention_lock; +uint8_t s_phy_fe_retention_ref = 0; +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD static esp_err_t sleep_retention_wifi_bb_init(void *arg) { #define N_REGS_WIFI_AGC() (121) @@ -223,7 +226,9 @@ void esp_phy_sleep_data_deinit(void) ESP_LOGW(TAG, "WiFi BB sleep retention deinit failed"); } } +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) static esp_err_t sleep_retention_phy_fe_init(void *arg) { #define N_REGS_FE_COEX() (58) @@ -238,25 +243,40 @@ static esp_err_t sleep_retention_phy_fe_init(void *arg) return ESP_OK; } -void esp_phy_fe_sleep_data_init(void) +esp_err_t esp_phy_fe_sleep_data_init(void) { - sleep_retention_module_init_param_t init_param = { - .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, - .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH - }; - esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention init failed"); - return; + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref++ == 0) { + sleep_retention_module_init_param_t init_param = { + .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, + .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH + }; + esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention init failed"); + s_phy_fe_retention_ref --; + _lock_release(&s_phy_fe_retention_lock); + return err; + } } + _lock_release(&s_phy_fe_retention_lock); + return ESP_OK; } void esp_phy_fe_sleep_data_deinit(void) { - esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref == 0) { + _lock_release(&s_phy_fe_retention_lock); return; } + + if (--s_phy_fe_retention_ref == 0) { + esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + } + } + _lock_release(&s_phy_fe_retention_lock); } -#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) diff --git a/components/esp_phy/esp32c61/phy_init_data.c b/components/esp_phy/esp32c61/phy_init_data.c index e653e2ebf58..e491a4f0a62 100644 --- a/components/esp_phy/esp32c61/phy_init_data.c +++ b/components/esp_phy/esp32c61/phy_init_data.c @@ -148,13 +148,15 @@ const esp_phy_init_data_t phy_init_data= { { } }; const char __attribute__((section(".rodata"))) phy_init_magic_post[] = PHY_INIT_MAGIC; - -#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD - +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) #include "esp_private/sleep_retention.h" static const char* TAG = "phy_sleep"; +static _lock_t s_phy_fe_retention_lock; +uint8_t s_phy_fe_retention_ref = 0; +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD static esp_err_t sleep_retention_wifi_bb_init(void *arg) { #define N_REGS_WIFI_AGC() (130) @@ -226,12 +228,15 @@ void esp_phy_sleep_data_deinit(void) } } +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD. + +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) static esp_err_t sleep_retention_phy_fe_init(void *arg) { - #define N_REGS_FE_COEX() (21) - #define N_REGS_FE_DATA() (34) - #define N_REGS_FE_CTRL() (56) - #define N_REGS_FE_DATA_WIFI() (21) + #define N_REGS_FE_COEX() (21) + #define N_REGS_FE_DATA() (34) + #define N_REGS_FE_CTRL() (56) + #define N_REGS_FE_DATA_WIFI() (21) #define REG_FECOEX_BASE 0x600a0000 #define REG_FEDATA_BASE 0x600a0400 #define REG_FECTRL_BASE 0x600a0800 @@ -249,25 +254,40 @@ static esp_err_t sleep_retention_phy_fe_init(void *arg) return ESP_OK; } -void esp_phy_fe_sleep_data_init(void) +esp_err_t esp_phy_fe_sleep_data_init(void) { - sleep_retention_module_init_param_t init_param = { - .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, - .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH - }; - esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention init failed"); - return; + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref++ == 0) { + sleep_retention_module_init_param_t init_param = { + .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, + .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH + }; + esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention init failed"); + s_phy_fe_retention_ref --; + _lock_release(&s_phy_fe_retention_lock); + return err; + } } + _lock_release(&s_phy_fe_retention_lock); + return ESP_OK; } void esp_phy_fe_sleep_data_deinit(void) { - esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref == 0) { + _lock_release(&s_phy_fe_retention_lock); return; } + + if (--s_phy_fe_retention_ref == 0) { + esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + } + } + _lock_release(&s_phy_fe_retention_lock); } -#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) diff --git a/components/esp_phy/esp32s31/phy_init_data.c b/components/esp_phy/esp32s31/phy_init_data.c index cc21fb626a4..5f83a25756c 100644 --- a/components/esp_phy/esp32s31/phy_init_data.c +++ b/components/esp_phy/esp32s31/phy_init_data.c @@ -154,6 +154,8 @@ const char __attribute__((section(".rodata"))) phy_init_magic_post[] = PHY_INIT_ #include "esp_private/sleep_retention.h" static const char* TAG = "phy_sleep"; +static _lock_t s_phy_fe_retention_lock; +uint8_t s_phy_fe_retention_ref = 0; #endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) @@ -240,13 +242,15 @@ void esp_phy_sleep_data_deinit(void) ESP_LOGW(TAG, "WiFi BB sleep retention deinit failed"); } } +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) static esp_err_t sleep_retention_phy_fe_init(void *arg) { - #define N_REGS_FE_COEX() (22) - #define N_REGS_FE_DATA() (35) - #define N_REGS_FE_CTRL() (57) - #define N_REGS_FE_DATA_WIFI() (22) + #define N_REGS_FE_COEX() (22) + #define N_REGS_FE_DATA() (35) + #define N_REGS_FE_CTRL() (57) + #define N_REGS_FE_DATA_WIFI() (22) #define REG_FECOEX_BASE 0x20100000 #define REG_FEDATA_BASE 0x20100400 #define REG_FECTRL_BASE 0x20100800 @@ -264,25 +268,40 @@ static esp_err_t sleep_retention_phy_fe_init(void *arg) return ESP_OK; } -void esp_phy_fe_sleep_data_init(void) +esp_err_t esp_phy_fe_sleep_data_init(void) { - sleep_retention_module_init_param_t init_param = { - .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, - .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH - }; - esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention init failed"); - return; + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref++ == 0) { + sleep_retention_module_init_param_t init_param = { + .cbs = { .create = { .handle = sleep_retention_phy_fe_init, .arg = NULL } }, + .attribute = SLEEP_RETENTION_MODULE_ATTR_PASSIVE | SLEEP_RETENTION_MODULE_ATTR_ATTACH + }; + esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_PHY_FE, &init_param); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention init failed"); + s_phy_fe_retention_ref --; + _lock_release(&s_phy_fe_retention_lock); + return err; + } } + _lock_release(&s_phy_fe_retention_lock); + return ESP_OK; } void esp_phy_fe_sleep_data_deinit(void) { - esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); - if (err != ESP_OK) { - ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + _lock_acquire(&s_phy_fe_retention_lock); + if (s_phy_fe_retention_ref == 0) { + _lock_release(&s_phy_fe_retention_lock); return; } + + if (--s_phy_fe_retention_ref == 0) { + esp_err_t err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_PHY_FE); + if (err != ESP_OK) { + ESP_LOGW(TAG, "PHY FE sleep retention deinit failed"); + } + } + _lock_release(&s_phy_fe_retention_lock); } -#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) diff --git a/components/esp_phy/include/esp_private/phy.h b/components/esp_phy/include/esp_private/phy.h index ca003827b6e..21d4374fb35 100644 --- a/components/esp_phy/include/esp_private/phy.h +++ b/components/esp_phy/include/esp_private/phy.h @@ -300,20 +300,19 @@ void phy_wait_freq_hw_hop_done(void); */ void phy_track_temp_debug(uint8_t debug_flag, uint8_t track_temp); #endif -#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) /** * @brief PHY module common memory (FE) initialize * */ -void esp_phy_fe_sleep_data_init(void); +esp_err_t esp_phy_fe_sleep_data_init(void); /** * @brief PHY module common memory (FE) de-initialize * */ void esp_phy_fe_sleep_data_deinit(void); -#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD - +#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && (CONFIG_MAC_BB_PD || CONFIG_ESP_PHY_HW_SWITCH_RF) #ifdef __cplusplus } #endif diff --git a/components/esp_phy/src/btbb_init.c b/components/esp_phy/src/btbb_init.c index 3b89879538c..a0199764577 100644 --- a/components/esp_phy/src/btbb_init.c +++ b/components/esp_phy/src/btbb_init.c @@ -71,6 +71,9 @@ static esp_err_t btbb_sleep_retention_enable(void) .attribute = SLEEP_RETENTION_MODULE_ATTR_ATTACH, }; init_param.depends.bitmap[SLEEP_RETENTION_MODULE_CLOCK_MODEM >> 5] |= BIT(SLEEP_RETENTION_MODULE_CLOCK_MODEM % 32); +#if CONFIG_ESP_PHY_HW_SWITCH_RF + init_param.depends.bitmap[SLEEP_RETENTION_MODULE_PHY_FE >> 5] |= BIT(SLEEP_RETENTION_MODULE_PHY_FE % 32); +#endif // CONFIG_ESP_PHY_HW_SWITCH_RF #if SOC_PM_MODEM_LOCK_CLK_WORKAROUND && CONFIG_BT_CTRL_SLEEP_ENABLE init_param.depends.bitmap[SLEEP_RETENTION_MODULE_POWER >> 5] |= BIT(SLEEP_RETENTION_MODULE_POWER % 32); #endif @@ -98,9 +101,20 @@ void esp_btbb_enable(void) if (s_btbb_access_ref == 0) { bt_bb_v2_init_cmplx(BTBB_ENABLE_VERSION_PRINT); #if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE - esp_err_t err = btbb_sleep_retention_enable(); + esp_err_t err = ESP_OK; +#if CONFIG_ESP_PHY_HW_SWITCH_RF + err = esp_phy_fe_sleep_data_init(); + if (err != ESP_OK) { + _lock_release(&s_btbb_access_lock); + return; + } +#endif // CONFIG_ESP_PHY_HW_SWITCH_RF + err = btbb_sleep_retention_enable(); if (err != ESP_OK) { btbb_sleep_retention_disable(); +#if CONFIG_ESP_PHY_HW_SWITCH_RF + esp_phy_fe_sleep_data_deinit(); +#endif // CONFIG_ESP_PHY_HW_SWITCH_RF _lock_release(&s_btbb_access_lock); return; } @@ -116,6 +130,9 @@ void esp_btbb_disable(void) if (s_btbb_access_ref && (--s_btbb_access_ref == 0)) { #if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE btbb_sleep_retention_disable(); +#if CONFIG_ESP_PHY_HW_SWITCH_RF + esp_phy_fe_sleep_data_deinit(); +#endif // CONFIG_ESP_PHY_HW_SWITCH_RF #endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE } _lock_release(&s_btbb_access_lock);