mirror of
https://github.com/espressif/esp-idf.git
synced 2026-09-22 13:01:16 +03:00
Merge branch 'fix/use_conflict_cb_for_regi2c_when_regdma_rf_is_used' into 'master'
feat(sleep): applied regi2c conflict process at regdma rf See merge request espressif/esp-idf!51770
This commit is contained in:
@@ -138,6 +138,25 @@ void pau_regdma_trigger_extra_link_restore(void);
|
||||
bool pau_regdma_enable_aon_link_entry(bool enable);
|
||||
#endif
|
||||
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
/**
|
||||
* @brief Callback function type for modem link protect.
|
||||
*
|
||||
*/
|
||||
typedef void (* pau_regdma_modem_link_protect_cb_t)(bool protect);
|
||||
|
||||
/**
|
||||
* @brief Register the modem link trigger hook callback function
|
||||
* @param cb the callback function
|
||||
*/
|
||||
void pau_regdma_register_modem_link_protect(pau_regdma_modem_link_protect_cb_t cb);
|
||||
|
||||
/**
|
||||
* @brief Unregister the modem link trigger hook callback function
|
||||
*/
|
||||
void pau_regdma_unregister_modem_link_protect(void);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -27,12 +27,19 @@ ESP_LOG_ATTR_TAG(TAG, "pau_regdma");
|
||||
|
||||
typedef struct {
|
||||
pau_hal_context_t *hal;
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_modem_link_protect_cb_t modem_link_protect;
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
} pau_context_t;
|
||||
|
||||
pau_context_t * __attribute__((weak)) IRAM_ATTR PAU_instance(void)
|
||||
{
|
||||
static pau_hal_context_t pau_hal = { .dev = NULL };
|
||||
static pau_context_t pau_context = { .hal = &pau_hal };
|
||||
static pau_context_t pau_context = { .hal = &pau_hal,
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
.modem_link_protect = NULL,
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
};
|
||||
|
||||
/* periph_module_enable don not need to be put in iram because it is
|
||||
* called before the flash is powered off and will not be called again. */
|
||||
@@ -61,6 +68,25 @@ void pau_regdma_set_entry_link_addr(pau_regdma_link_addr_t *link_entries)
|
||||
pau_hal_set_regdma_entry_link_addr(PAU_instance()->hal, link_entries);
|
||||
}
|
||||
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
void pau_regdma_register_modem_link_protect(pau_regdma_modem_link_protect_cb_t cb)
|
||||
{
|
||||
PAU_instance()->modem_link_protect = cb;
|
||||
}
|
||||
|
||||
void pau_regdma_unregister_modem_link_protect(void)
|
||||
{
|
||||
PAU_instance()->modem_link_protect = NULL;
|
||||
}
|
||||
|
||||
static void IRAM_ATTR pau_regdma_invoke_modem_link_procect(bool protect)
|
||||
{
|
||||
if (PAU_instance()->modem_link_protect) {
|
||||
PAU_instance()->modem_link_protect(protect);
|
||||
}
|
||||
}
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
|
||||
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
|
||||
#if SOC_PM_PAU_REGDMA_LINK_MODEM
|
||||
void pau_regdma_set_modem_link_addr(void *link_addr)
|
||||
@@ -71,18 +97,30 @@ void pau_regdma_set_modem_link_addr(void *link_addr)
|
||||
|
||||
void IRAM_ATTR pau_regdma_trigger_modem_link_backup(bool blocking)
|
||||
{
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(true);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_hal_start_regdma_modem_link(PAU_instance()->hal, true, blocking);
|
||||
if (blocking) {
|
||||
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
|
||||
}
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(false);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
}
|
||||
|
||||
void IRAM_ATTR pau_regdma_trigger_modem_link_restore(bool blocking)
|
||||
{
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(true);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_hal_start_regdma_modem_link(PAU_instance()->hal, false, blocking);
|
||||
if (blocking) {
|
||||
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
|
||||
}
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(false);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
}
|
||||
|
||||
void IRAM_ATTR pau_regdma_modem_link_complete(void)
|
||||
@@ -113,14 +151,30 @@ void IRAM_ATTR pau_clear_regdma_done_status(void)
|
||||
#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND
|
||||
void IRAM_ATTR pau_regdma_trigger_wifimac_link_backup(bool blocking)
|
||||
{
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(true);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, true, blocking);
|
||||
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
|
||||
if (blocking) {
|
||||
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
|
||||
}
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(false);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
}
|
||||
|
||||
void IRAM_ATTR pau_regdma_trigger_wifimac_link_restore(bool blocking)
|
||||
{
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(true);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, false, blocking);
|
||||
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
|
||||
if (blocking) {
|
||||
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
|
||||
}
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_invoke_modem_link_procect(false);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
}
|
||||
#endif
|
||||
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
#include "soc/periph_defs.h"
|
||||
#endif
|
||||
#include "phy_init_deps.h"
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
#include "esp_private/esp_pau.h"
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
|
||||
#ifndef PHY_INIT_MODEM_CLOCK_REQUIRED_BITS
|
||||
#warning "PHY_INIT_MODEM_CLOCK_REQUIRED_BITS not defined; using default value 0"
|
||||
@@ -73,6 +76,11 @@ extern bool pm_get_wifimac_regdma_link_selection(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
extern void phy_i2c_enter_critical(void);
|
||||
extern void phy_i2c_exit_critical(void);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
|
||||
static const char* TAG = "phy_init";
|
||||
|
||||
static _lock_t s_phy_access_lock;
|
||||
@@ -511,6 +519,17 @@ void esp_wifi_bt_power_domain_off(void)
|
||||
#endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD
|
||||
}
|
||||
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
void IRAM_ATTR esp_phy_regi2c_lock_apply(bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
phy_i2c_enter_critical();
|
||||
} else {
|
||||
phy_i2c_exit_critical();
|
||||
}
|
||||
}
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
|
||||
void esp_phy_modem_init(uint8_t modem)
|
||||
{
|
||||
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP || CONFIG_ESP_PHY_HW_SWITCH_RF
|
||||
@@ -522,6 +541,9 @@ void esp_phy_modem_init(uint8_t modem)
|
||||
}
|
||||
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
|
||||
#if (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_register_modem_link_protect(esp_phy_regi2c_lock_apply);
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
if (sleep_modem_phy_init(modem) != ESP_OK) {
|
||||
ESP_LOGE(TAG, "failed to initialize sleep modem phy");
|
||||
}
|
||||
@@ -552,9 +574,14 @@ void esp_phy_modem_deinit(uint8_t modem)
|
||||
phy_init_flag();
|
||||
#endif // CONFIG_IDF_TARGET_ESP32C3
|
||||
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
|
||||
}
|
||||
#if (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
|
||||
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
pau_regdma_unregister_modem_link_protect();
|
||||
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
}
|
||||
sleep_modem_phy_deinit(modem);
|
||||
#else
|
||||
}
|
||||
#endif // (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
|
||||
_lock_release(&s_phy_access_lock);
|
||||
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP
|
||||
|
||||
@@ -1383,6 +1383,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_SUPPORT_PMU_CLK_ICG
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -559,6 +559,7 @@
|
||||
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
|
||||
/* macro redefine for pass esp_wifi headers md5sum check */
|
||||
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
|
||||
|
||||
#define SOC_PM_SUPPORT_PMU_CLK_ICG (1)
|
||||
#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1)
|
||||
|
||||
@@ -1127,6 +1127,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_SUPPORT_PMU_CLK_ICG
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -462,6 +462,7 @@
|
||||
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
|
||||
/* macro redefine for pass esp_wifi headers md5sum check */
|
||||
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
|
||||
|
||||
#define SOC_PM_SUPPORT_PMU_CLK_ICG (1)
|
||||
#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1)
|
||||
|
||||
@@ -1043,6 +1043,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_SUPPORT_PMU_CLK_ICG
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -430,6 +430,7 @@
|
||||
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
|
||||
/* macro redefine for pass esp_wifi headers md5sum check */
|
||||
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
|
||||
|
||||
#define SOC_PM_SUPPORT_PMU_CLK_ICG (1)
|
||||
#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1)
|
||||
|
||||
@@ -1583,6 +1583,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_PM_MODEM_STATE_USE_XTAL
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -586,6 +586,7 @@
|
||||
#define SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY (1)
|
||||
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
|
||||
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
|
||||
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
|
||||
/* Since SOC APB and MODEM APB on ESP32-S31 are decoupled, XTAL can be used as SOC clock in modem state */
|
||||
#define SOC_PM_MODEM_STATE_USE_XTAL (1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user