diff --git a/components/esp_hw_support/include/esp_private/esp_pmu.h b/components/esp_hw_support/include/esp_private/esp_pmu.h index ce04a4bb32..7179e9cc33 100644 --- a/components/esp_hw_support/include/esp_private/esp_pmu.h +++ b/components/esp_hw_support/include/esp_private/esp_pmu.h @@ -116,6 +116,14 @@ typedef enum pmu_sleep_regdma_entry { PMU_SLEEP_REGDMA_ENTRY_MAX } pmu_sleep_regdma_entry_t; +/** + * @brief PMU ICG modem code of HP system + */ +typedef enum { + PMU_HP_ICG_MODEM_CODE_SLEEP = 0, + PMU_HP_ICG_MODEM_CODE_MODEM = 1, + PMU_HP_ICG_MODEM_CODE_ACTIVE = 2, +} pmu_hp_icg_modem_mode_t; /** diff --git a/components/esp_hw_support/modem_clock.c b/components/esp_hw_support/modem_clock.c index cd9773ad41..2c66910b9c 100644 --- a/components/esp_hw_support/modem_clock.c +++ b/components/esp_hw_support/modem_clock.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,6 +13,7 @@ #include "freertos/FreeRTOS.h" #include "hal/clk_gate_ll.h" #include "esp_private/esp_modem_clock.h" +#include "esp_private/esp_pmu.h" #include "esp_sleep.h" // Please define the frequently called modules in the low bit, @@ -136,30 +137,25 @@ modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(voi return &modem_clock_context; } - -// TODO: IDF-5351: move to esp_pmu.h after support pmu driver -#define PMU_SLEEP 0 -#define PMU_MODEM 1 -#define PMU_ACTIVE 2 -#define SLEEP_MODE BIT(PMU_SLEEP) -#define MODEM_MODE BIT(PMU_MODEM) -#define ACTIVE_MODE BIT(PMU_ACTIVE) - static void IRAM_ATTR modem_clock_domain_power_state_icg_map_init(modem_clock_context_t *ctx) { + #define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) + #define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) + #define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) + /* the ICG code's bit 0, 1 and 2 indicates the ICG state * of pmu SLEEP, MODEM and ACTIVE mode respectively */ const uint32_t code[MODEM_CLOCK_DOMAIN_MAX] = { - [MODEM_CLOCK_DOMAIN_MODEM_APB] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_WIFI] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_BT] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_FE] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_IEEE802154] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_LP_APB] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_I2C_MASTER] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_COEX] = MODEM_MODE | ACTIVE_MODE, - [MODEM_CLOCK_DOMAIN_WIFIPWR] = MODEM_MODE | ACTIVE_MODE, + [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, + [MODEM_CLOCK_DOMAIN_WIFI] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_LP_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_I2C_MASTER] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_COEX] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_WIFIPWR] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, }; for (modem_clock_domain_t domain = MODEM_CLOCK_DOMAIN_MODEM_APB; domain < MODEM_CLOCK_DOMAIN_MAX; domain++) { modem_clock_hal_set_clock_domain_icg_bitmap(ctx->hal, domain, code[domain]); @@ -167,16 +163,8 @@ static void IRAM_ATTR modem_clock_domain_power_state_icg_map_init(modem_clock_co } -#include "soc/pmu_reg.h" void modem_clock_domain_pmu_state_icg_map_init(void) { - // Set modem clock ICG code map, should implement with pmu driver // TODO: IDF-5351 - REG_SET_FIELD(PMU_HP_SLEEP_ICG_MODEM_REG, PMU_HP_SLEEP_DIG_ICG_MODEM_CODE, PMU_SLEEP); - REG_SET_FIELD(PMU_HP_MODEM_ICG_MODEM_REG, PMU_HP_MODEM_DIG_ICG_MODEM_CODE, PMU_MODEM); - REG_SET_FIELD(PMU_HP_ACTIVE_ICG_MODEM_REG, PMU_HP_ACTIVE_DIG_ICG_MODEM_CODE, PMU_ACTIVE); - REG_SET_BIT(PMU_IMM_MODEM_ICG_REG, PMU_UPDATE_DIG_ICG_MODEM_EN); - REG_SET_BIT(PMU_IMM_SLEEP_SYSCLK_REG, PMU_UPDATE_DIG_ICG_SWITCH); - modem_clock_domain_power_state_icg_map_init(MODEM_CLOCK_instance()); } diff --git a/components/esp_hw_support/port/esp32c6/pmu_param.c b/components/esp_hw_support/port/esp32c6/pmu_param.c index 0cd70d4985..1121e91109 100644 --- a/components/esp_hw_support/port/esp32c6/pmu_param.c +++ b/components/esp_hw_support/port/esp32c6/pmu_param.c @@ -98,7 +98,7 @@ const pmu_hp_system_power_param_t * pmu_hp_system_power_param_default(pmu_hp_mod .icg_func = 0xffffffff, \ .icg_apb = 0xffffffff, \ .icg_modem = { \ - .code = 2 \ + .code = PMU_HP_ICG_MODEM_CODE_ACTIVE \ }, \ .sysclk = { \ .dig_sysclk_nodiv = 0, \ @@ -113,7 +113,7 @@ const pmu_hp_system_power_param_t * pmu_hp_system_power_param_default(pmu_hp_mod .icg_func = 0, \ .icg_apb = 0, \ .icg_modem = { \ - .code = 1 \ + .code = PMU_HP_ICG_MODEM_CODE_MODEM \ }, \ .sysclk = { \ .dig_sysclk_nodiv = 0, \ @@ -128,7 +128,7 @@ const pmu_hp_system_power_param_t * pmu_hp_system_power_param_default(pmu_hp_mod .icg_func = 0, \ .icg_apb = 0, \ .icg_modem = { \ - .code = 0 \ + .code = PMU_HP_ICG_MODEM_CODE_SLEEP \ }, \ .sysclk = { \ .dig_sysclk_nodiv = 0, \