From 8bd502f975ea52123bb199f7ed65ca3f1554e788 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Fri, 12 Dec 2025 17:38:24 +0800 Subject: [PATCH 01/11] change(esp_hw_support): divide modem_clock config into port layer --- .../include/esp_private/esp_modem_clock.h | 133 ++++- components/esp_hw_support/modem_clock.c | 477 +----------------- .../port/esp32c5/CMakeLists.txt | 4 + .../port/esp32c5/modem_clock_impl.c | 364 +++++++++++++ .../port/esp32c6/CMakeLists.txt | 3 + .../port/esp32c6/modem_clock_impl.c | 414 +++++++++++++++ .../port/esp32c61/CMakeLists.txt | 4 + .../port/esp32c61/modem_clock_impl.c | 364 +++++++++++++ .../port/esp32h2/CMakeLists.txt | 4 + .../port/esp32h2/modem_clock_impl.c | 282 +++++++++++ .../port/esp32h21/CMakeLists.txt | 4 + .../port/esp32h21/modem_clock_impl.c | 254 ++++++++++ .../port/esp32h4/CMakeLists.txt | 4 + .../port/esp32h4/modem_clock_impl.c | 271 ++++++++++ .../hal/include/hal/modem_clock_types.h | 10 + 15 files changed, 2109 insertions(+), 483 deletions(-) create mode 100644 components/esp_hw_support/port/esp32c5/modem_clock_impl.c create mode 100644 components/esp_hw_support/port/esp32c6/modem_clock_impl.c create mode 100644 components/esp_hw_support/port/esp32c61/modem_clock_impl.c create mode 100644 components/esp_hw_support/port/esp32h2/modem_clock_impl.c create mode 100644 components/esp_hw_support/port/esp32h21/modem_clock_impl.c create mode 100644 components/esp_hw_support/port/esp32h4/modem_clock_impl.c diff --git a/components/esp_hw_support/include/esp_private/esp_modem_clock.h b/components/esp_hw_support/include/esp_private/esp_modem_clock.h index 82171e593ac..cd5c988597b 100644 --- a/components/esp_hw_support/include/esp_private/esp_modem_clock.h +++ b/components/esp_hw_support/include/esp_private/esp_modem_clock.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -15,8 +15,9 @@ #include "soc/periph_defs.h" #include "hal/modem_clock_types.h" #include "esp_private/esp_pmu.h" +#include "esp_private/critical_section.h" -#if SOC_MODEM_CLOCK_IS_INDEPENDENT +#if SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED #include "hal/modem_clock_hal.h" #endif @@ -24,6 +25,98 @@ extern "C" { #endif +#if SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED +// Please define the frequently called modules in the low bit, +// which will improve the execution efficiency +typedef enum { + MODEM_CLOCK_MODEM_ADC_COMMON_FE, + MODEM_CLOCK_MODEM_PRIVATE_FE, + MODEM_CLOCK_COEXIST, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING + MODEM_CLOCK_I2C_MASTER, +#endif +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + MODEM_CLOCK_WIFI_APB, + MODEM_CLOCK_WIFI_BB_44M, +#endif +#if SOC_WIFI_SUPPORTED + MODEM_CLOCK_WIFI_MAC, + MODEM_CLOCK_WIFI_BB, +#endif + MODEM_CLOCK_ETM, +#if SOC_BT_SUPPORTED + MODEM_CLOCK_BLE_MAC, +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + MODEM_CLOCK_BT_I154_COMMON_BB, +#endif +#if SOC_IEEE802154_SUPPORTED + MODEM_CLOCK_802154_MAC, +#endif + MODEM_CLOCK_DATADUMP, + MODEM_CLOCK_DEVICE_MAX +} modem_clock_device_t; + +#define MODEM_STATUS_IDLE (0) +#define MODEM_STATUS_WIFI_INITED (0x1UL) + +struct modem_clock_context; + +typedef struct { + int16_t refs; /* Reference count for this device, if with_refcnt is enabled */ + uint16_t with_refcnt : 1; /* Enable reference count management (true=use refs, false=ignore refs) */ + uint16_t reserved : 15; /* reserved for 15 bits aligned */ + void (*configure)(struct modem_clock_context *, bool); +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + esp_err_t (*check_enable)(struct modem_clock_context *); +#endif +} modem_clock_device_context_t; + +typedef struct modem_clock_context { + modem_clock_hal_context_t *hal; + spinlock_t lock; + modem_clock_device_context_t *dev; +#if SOC_PM_SUPPORT_PMU_MODEM_STATE + const uint8_t *initial_gating_mode; +#endif + /* the low-power clock source for each module */ + modem_clock_lpclk_src_t lpclk_src[PERIPH_MODEM_MODULE_NUM]; +#if SOC_WIFI_SUPPORTED + uint32_t modem_status; +#endif +} modem_clock_context_t; + +/** + * @brief Get module clock dependencies + * Each chip implements this function in its port file + * @param module The modem module + * @return Bitmask of clock dependencies + */ +uint32_t modem_clock_get_module_deps(shared_periph_module_t module); + +/** + * @brief Modem clock device context array + * Each chip defines this array in its port file + */ +extern modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX]; + +#if SOC_PM_SUPPORT_PMU_MODEM_STATE +/** + * @brief Initial gating mode for each clock domain + * Each chip defines this array in its port file + */ +extern const uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX]; +#endif + +#if SOC_PM_SUPPORT_PMU_MODEM_STATE +/* the ICG code's bit 0, 1 and 2 indicates the ICG state + * of pmu SLEEP, MODEM and ACTIVE mode respectively */ + #define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) + #define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) + #define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) +#endif // SOC_PM_SUPPORT_PMU_MODEM_STATE +#endif // SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED + /** * @brief Enable the clock of modem module * @@ -93,28 +186,13 @@ void modem_clock_module_mac_reset(shared_periph_module_t module); #if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND /** - * @brief Enable modem clock domain clock gate to gate it's output + * @brief Apply or clear BT low-power clock workaround for enabling Wi-Fi power clock * - * @param domain modem module clock domain - * @param mode PMU HP system ACTIVE, MODEM and SLEEP state - * - * @return - * - ESP_OK on success - * - ESP_ERR_INVALID_ARG if the argument value are not correct + * @param ctx modem clock context + * @param select true to apply (ungate); false to clear (gate) + * @param src lowpower clock source */ -esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode); - -/** - * @brief Disable modem clock domain clock gate to ungate it's output - * - * @param domain modem module clock domain - * @param mode PMU HP system ACTIVE, MODEM and SLEEP state - * - * @return - * - ESP_OK on success - * - ESP_ERR_INVALID_ARG if the argument value are not correct - */ -esp_err_t modem_clock_domain_clk_gate_disable(modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode); +void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool select, modem_clock_lpclk_src_t src); #endif /** @@ -137,6 +215,17 @@ void modem_clock_deselect_lp_clock_source(shared_periph_module_t module); */ void modem_clock_deselect_all_module_lp_clock_source(void); +#if CONFIG_IDF_TARGET_ESP32H2 +/** + * @brief BLE RTC timer LPCLK workaround on ESP32H2 + * + * @param ctx modem clock context + * @param enable true to enable rc32k; false to disable rc32k + * @param src lowpower clock source + */ +void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, bool enable, modem_clock_lpclk_src_t src); +#endif + /** * @brief Reset wifi mac */ diff --git a/components/esp_hw_support/modem_clock.c b/components/esp_hw_support/modem_clock.c index 8e78cd45b3a..e063c357789 100644 --- a/components/esp_hw_support/modem_clock.c +++ b/components/esp_hw_support/modem_clock.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -11,266 +11,14 @@ #include "esp_attr.h" #include "soc/soc.h" #include "soc/soc_caps.h" -#include "freertos/FreeRTOS.h" #include "esp_private/esp_modem_clock.h" #include "esp_private/esp_sleep_internal.h" #include "esp_private/esp_pmu.h" -#include "esp_private/critical_section.h" #include "esp_sleep.h" #include "hal/efuse_hal.h" #include "hal/clk_tree_ll.h" -#include "hal/regi2c_ctrl_ll.h" -#include "esp_private/regi2c_ctrl.h" -#if CONFIG_IDF_TARGET_ESP32H2 -#include "soc/rtc.h" -#endif // CONFIG_IDF_TARGET_ESP32H2 - -// Please define the frequently called modules in the low bit, -// which will improve the execution efficiency -typedef enum { - MODEM_CLOCK_MODEM_ADC_COMMON_FE, - MODEM_CLOCK_MODEM_PRIVATE_FE, - MODEM_CLOCK_COEXIST, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING - MODEM_CLOCK_I2C_MASTER, -#endif -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - MODEM_CLOCK_WIFI_APB, - MODEM_CLOCK_WIFI_BB_44M, -#endif -#if SOC_WIFI_SUPPORTED - MODEM_CLOCK_WIFI_MAC, - MODEM_CLOCK_WIFI_BB, -#endif - MODEM_CLOCK_ETM, -#if SOC_BT_SUPPORTED - MODEM_CLOCK_BLE_MAC, -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - MODEM_CLOCK_BT_I154_COMMON_BB, -#endif -#if SOC_IEEE802154_SUPPORTED - MODEM_CLOCK_802154_MAC, -#endif - MODEM_CLOCK_DATADUMP, - MODEM_CLOCK_DEVICE_MAX -} modem_clock_device_t; - -#define MODEM_STATUS_IDLE (0) -#define MODEM_STATUS_WIFI_INITED (0x1UL) - -typedef struct modem_clock_context { - modem_clock_hal_context_t *hal; - portMUX_TYPE lock; - struct { - int16_t refs; /* Reference count for this device, if with_refcnt is enabled */ - uint16_t with_refcnt : 1; /* Enable reference count management (true=use refs, false=ignore refs) */ - uint16_t reserved : 15; /* reserved for 15 bits aligned */ - void (*configure)(struct modem_clock_context *, bool); -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - esp_err_t (*check_enable)(struct modem_clock_context *); -#endif - } dev[MODEM_CLOCK_DEVICE_MAX]; - /* the low-power clock source for each module */ - modem_clock_lpclk_src_t lpclk_src[PERIPH_MODEM_MODULE_NUM]; -#if SOC_WIFI_SUPPORTED - uint32_t modem_status; -#endif -} modem_clock_context_t; - - -#if SOC_WIFI_SUPPORTED -static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); -#endif - modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); - } -} - -static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { - modem_syscon_ll_clk_wifibb_configure(ctx->hal->syscon_dev, enable); - } -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); -#endif - all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} - -static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_t *ctx) -{ - return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_WIFI_SUPPORTED - -#if SOC_BT_SUPPORTED -static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_BT_SUPPORTED - -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { - modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); - } -} - -static void IRAM_ATTR modem_clock_wifi_bb_44m_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { - modem_syscon_ll_enable_wifibb_44m_clock(ctx->hal->syscon_dev, enable); - } -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_wifi_apb_check_enable(modem_clock_context_t *ctx) -{ - return modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; -} - -static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_context_t *ctx) -{ - return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; -} -#endif -#endif - -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED -static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - -#if SOC_IEEE802154_SUPPORTED -static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_IEEE802154_SUPPORTED - -static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); -} - -static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); -} - -static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); -} - -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING -static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable) { - ANALOG_CLOCK_ENABLE(); - } else { - ANALOG_CLOCK_DISABLE(); - } -} -#endif - -static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); -} - -static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) -{ - return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; -} - -static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) -{ - return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; -} - -static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) -{ - return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; -} - -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING -static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) -{ - return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; -} -#endif - -static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) -{ - return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; -} - -static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} +#if SOC_CLOCK_TREE_MANAGEMENT_SUPPORTED +#include "esp_private/esp_clk_tree_common.h" #endif modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(void) @@ -278,113 +26,27 @@ modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(voi /* It should be explicitly defined in the internal RAM */ static DRAM_ATTR modem_clock_hal_context_t modem_clock_hal = { .syscon_dev = NULL, .lpcon_dev = NULL }; static DRAM_ATTR modem_clock_context_t modem_clock_context = { - .hal = &modem_clock_hal, .lock = portMUX_INITIALIZER_UNLOCKED, - .dev = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING - // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure }, + .hal = &modem_clock_hal, .lock = SPINLOCK_INITIALIZER, + .dev = g_modem_clock_dev, +#if SOC_PM_SUPPORT_PMU_MODEM_STATE + .initial_gating_mode = g_initial_gating_mode, #endif -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure }, - [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure }, -#endif -#if SOC_WIFI_SUPPORTED - [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure }, - [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure }, -#endif - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure }, -#if SOC_BT_SUPPORTED - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure }, -#endif -#if SOC_IEEE802154_SUPPORTED - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure }, -#endif - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure } - }, .lpclk_src = { [0 ... PERIPH_MODEM_MODULE_NUM - 1] = MODEM_CLOCK_LPCLK_SRC_INVALID } #if SOC_WIFI_SUPPORTED , .modem_status = MODEM_STATUS_IDLE #endif }; - if (modem_clock_hal.syscon_dev == NULL || modem_clock_hal.lpcon_dev == NULL) { modem_clock_hal.syscon_dev = &MODEM_SYSCON; modem_clock_hal.lpcon_dev = &MODEM_LPCON; #if SOC_CLOCK_TREE_MANAGEMENT_SUPPORTED ESP_ERROR_CHECK(esp_clk_tree_enable_src(SOC_MOD_CLK_MODEM_APB, true)); #endif -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - modem_clock_context.dev[MODEM_CLOCK_MODEM_ADC_COMMON_FE].check_enable = modem_clock_modem_adc_common_fe_check_enable; - modem_clock_context.dev[MODEM_CLOCK_MODEM_PRIVATE_FE].check_enable = modem_clock_modem_private_fe_check_enable; - modem_clock_context.dev[MODEM_CLOCK_COEXIST].check_enable = modem_clock_coex_check_enable; - #if ANA_I2C_MST_CLK_HAS_ROOT_GATING - modem_clock_context.dev[MODEM_CLOCK_I2C_MASTER].check_enable = modem_clock_i2c_master_check_enable; - #endif - #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - modem_clock_context.dev[MODEM_CLOCK_WIFI_APB].check_enable = modem_clock_wifi_apb_check_enable; - modem_clock_context.dev[MODEM_CLOCK_WIFI_BB_44M].check_enable = modem_clock_wifi_bb_44m_check_enable; - #endif - #if SOC_WIFI_SUPPORTED - modem_clock_context.dev[MODEM_CLOCK_WIFI_MAC].check_enable = modem_clock_wifi_mac_check_enable; - modem_clock_context.dev[MODEM_CLOCK_WIFI_BB].check_enable = modem_clock_wifi_bb_check_enable; - #endif - modem_clock_context.dev[MODEM_CLOCK_ETM].check_enable = modem_clock_etm_check_enable; - #if SOC_BT_SUPPORTED - modem_clock_context.dev[MODEM_CLOCK_BLE_MAC].check_enable = modem_clock_ble_mac_check_enable; - #endif - #if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED - modem_clock_context.dev[MODEM_CLOCK_BT_I154_COMMON_BB].check_enable = modem_clock_ble_i154_bb_check_enable; - #endif - #if SOC_IEEE802154_SUPPORTED - modem_clock_context.dev[MODEM_CLOCK_802154_MAC].check_enable = modem_clock_ieee802154_mac_check_enable; - #endif - modem_clock_context.dev[MODEM_CLOCK_DATADUMP].check_enable = modem_clock_data_dump_check_enable; -#endif // CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING } return &modem_clock_context; } -#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND -esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) -{ - if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { - return ESP_ERR_INVALID_ARG; - } - if (mode > PMU_HP_ICG_MODEM_CODE_ACTIVE || mode < PMU_HP_ICG_MODEM_CODE_SLEEP) { - return ESP_ERR_INVALID_ARG; - } - - esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); - uint32_t code = modem_clock_hal_get_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain); - modem_clock_hal_set_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain, (code & ~BIT(mode))); - esp_os_exit_critical_safe(&MODEM_CLOCK_instance()->lock); - return ESP_OK; -} - -esp_err_t modem_clock_domain_clk_gate_disable(modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) -{ - if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { - return ESP_ERR_INVALID_ARG; - } - if (mode > PMU_HP_ICG_MODEM_CODE_ACTIVE || mode < PMU_HP_ICG_MODEM_CODE_SLEEP) { - return ESP_ERR_INVALID_ARG; - } - - esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); - uint32_t code = modem_clock_hal_get_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain); - modem_clock_hal_set_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain, (code | BIT(mode))); - esp_os_exit_critical_safe(&MODEM_CLOCK_instance()->lock); - return ESP_OK; -} -#endif // #if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND - static void IRAM_ATTR modem_clock_device_enable(modem_clock_context_t *ctx, uint32_t dev_map) { int16_t refs = 0; @@ -453,88 +115,6 @@ void IRAM_ATTR modem_clock_module_mac_reset(shared_periph_module_t module) } esp_os_exit_critical_safe(&ctx->lock); } -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) -#else -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) -#endif -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 -#endif -#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) -#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 -#endif -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) - -static IRAM_ATTR uint32_t modem_clock_get_module_deps(shared_periph_module_t module) -{ - uint32_t deps = 0; - switch (module) { - case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; - case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; - case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_WIFI_SUPPORTED - case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED - case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif - case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED - case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif - default: - assert(0); - } - return deps; -} - -/* the ICG code's bit 0, 1 and 2 indicates the ICG state - * of pmu SLEEP, MODEM and ACTIVE mode respectively */ -#define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) -#define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) -#define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) - -#if SOC_PM_SUPPORT_PMU_MODEM_STATE -static const DRAM_ATTR uint32_t initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { - [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, - [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, - [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, - [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, -}; -#endif #if SOC_PM_SUPPORT_PMU_MODEM_STATE static IRAM_ATTR void modem_clock_module_icg_map_init_all(void) @@ -542,7 +122,7 @@ static IRAM_ATTR void modem_clock_module_icg_map_init_all(void) esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); for (int domain = 0; domain < MODEM_CLOCK_DOMAIN_MAX; domain++) { uint32_t code = modem_clock_hal_get_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain); - modem_clock_hal_set_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain, initial_gating_mode[domain] | code); + modem_clock_hal_set_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain, MODEM_CLOCK_instance()->initial_gating_mode[domain] | code); #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING assert((modem_clock_hal_get_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain) & code) == code); #endif @@ -633,36 +213,17 @@ void modem_clock_select_lp_clock_source(shared_periph_module_t module, modem_clo case PERIPH_BT_MODULE: { #if CONFIG_IDF_TARGET_ESP32H2 - bool rc_clk_en = true; - bool selected = (src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) || - (src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW); - if (selected) { - rc_clk_en = clk_ll_rc32k_is_enabled(); - if (!rc_clk_en) { - rtc_clk_rc32k_enable(true); - } - modem_clock_hal_select_ble_rtc_timer_lpclk_source(MODEM_CLOCK_instance()->hal, MODEM_CLOCK_LPCLK_SRC_RC32K); - } -#endif // CONFIG_IDF_TARGET_ESP32H2 + modem_clock_select_ble_rtc_timer_clk_workaround(MODEM_CLOCK_instance(), true, src); +#endif modem_clock_hal_deselect_all_ble_rtc_timer_lpclk_source(MODEM_CLOCK_instance()->hal); modem_clock_hal_select_ble_rtc_timer_lpclk_source(MODEM_CLOCK_instance()->hal, src); modem_clock_hal_set_ble_rtc_timer_divisor_value(MODEM_CLOCK_instance()->hal, divider); modem_clock_hal_enable_ble_rtc_timer_clock(MODEM_CLOCK_instance()->hal, true); #if CONFIG_IDF_TARGET_ESP32H2 - if (!rc_clk_en) { - extern void r_esp_ble_rtc_ticks_delay(uint32_t ticks); - r_esp_ble_rtc_ticks_delay(2); - rtc_clk_rc32k_enable(false); - } -#endif // CONFIG_IDF_TARGET_ESP32H2 + modem_clock_select_ble_rtc_timer_clk_workaround(MODEM_CLOCK_instance(), false, src); +#endif #if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND - if (efuse_hal_chip_revision() != 0) { - if (src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) { - esp_sleep_clock_config(ESP_SLEEP_CLOCK_BT_USE_WIFI_PWR_CLK, ESP_SLEEP_CLOCK_OPTION_UNGATE); - modem_clock_hal_enable_wifipwr_clock(MODEM_CLOCK_instance()->hal, true); - modem_clock_domain_clk_gate_disable(MODEM_CLOCK_DOMAIN_WIFIPWR, PMU_HP_ICG_MODEM_CODE_SLEEP); - } - } + modem_clock_bt_wifipwr_clk_workaround(MODEM_CLOCK_instance(), true, src); #endif break; } @@ -714,7 +275,6 @@ void modem_clock_deselect_lp_clock_source(shared_periph_module_t module) #if SOC_LIGHT_SLEEP_SUPPORTED modem_clock_lpclk_src_t last_src = MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN]; #endif - MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN] = MODEM_CLOCK_LPCLK_SRC_INVALID; switch (module) { #if SOC_WIFI_SUPPORTED @@ -728,14 +288,8 @@ void modem_clock_deselect_lp_clock_source(shared_periph_module_t module) case PERIPH_BT_MODULE: modem_clock_hal_deselect_all_ble_rtc_timer_lpclk_source(MODEM_CLOCK_instance()->hal); modem_clock_hal_enable_ble_rtc_timer_clock(MODEM_CLOCK_instance()->hal, false); -#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND && SOC_LIGHT_SLEEP_SUPPORTED // TODO: [ESP32C5] IDF-8643 - if (efuse_hal_chip_revision() != 0) { - if (last_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) { - esp_sleep_clock_config(ESP_SLEEP_CLOCK_BT_USE_WIFI_PWR_CLK, ESP_SLEEP_CLOCK_OPTION_GATE); - modem_clock_hal_enable_wifipwr_clock(MODEM_CLOCK_instance()->hal, false); - modem_clock_domain_clk_gate_enable(MODEM_CLOCK_DOMAIN_WIFIPWR, PMU_HP_ICG_MODEM_CODE_SLEEP); - } - } +#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND + modem_clock_bt_wifipwr_clk_workaround(MODEM_CLOCK_instance(), false, last_src); #endif break; #endif // SOC_BT_SUPPORTED @@ -746,6 +300,7 @@ void modem_clock_deselect_lp_clock_source(shared_periph_module_t module) default: break; } + MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN] = MODEM_CLOCK_LPCLK_SRC_INVALID; esp_os_exit_critical_safe(&MODEM_CLOCK_instance()->lock); #if SOC_LIGHT_SLEEP_SUPPORTED diff --git a/components/esp_hw_support/port/esp32c5/CMakeLists.txt b/components/esp_hw_support/port/esp32c5/CMakeLists.txt index b27e92b99c7..b8dba1dc733 100644 --- a/components/esp_hw_support/port/esp32c5/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c5/CMakeLists.txt @@ -12,6 +12,10 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") + + if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock_impl.c") + endif() endif() if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) diff --git a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c new file mode 100644 index 00000000000..ef303da61ab --- /dev/null +++ b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c @@ -0,0 +1,364 @@ +/* + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc_caps.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/regi2c_ctrl.h" + +/* Clock dependency definitions */ +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) +#else +#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) +#endif +#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#else +#define I2C_ANA_MST_CLOCK_DEPS (0) +#endif +#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) +#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#else +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#endif +#ifndef SOC_WIFI_SUPPORTED +#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#endif +#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) +#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#endif +#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) + +uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +{ + uint32_t deps = 0; + switch (module) { + case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; + case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; + case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; +#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; +#endif +#if SOC_WIFI_SUPPORTED + case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED + case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; +#endif + case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; +#if SOC_IEEE802154_SUPPORTED + case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; +#endif + default: + assert(0); + } + return deps; +} + +#if SOC_WIFI_SUPPORTED +static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { +#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); +#endif + modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); + } +} + +static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_clk_wifibb_configure(ctx->hal->syscon_dev, enable); + } +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; +#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); +#endif + all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_WIFI_SUPPORTED + +#if SOC_BT_SUPPORTED +static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED + +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); + } +} + +static void IRAM_ATTR modem_clock_wifi_bb_44m_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifibb_44m_clock(ctx->hal->syscon_dev, enable); + } +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_wifi_apb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif +#endif + +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + +#if SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_IEEE802154_SUPPORTED + +static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); +} + +static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); +} + +static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable) { + ANALOG_CLOCK_ENABLE(); + } else { + ANALOG_CLOCK_DISABLE(); + } +} +#endif + +static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); +} + +static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) +{ + return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) +{ + return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; +} +#endif + +static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif + +DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { + [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_adc_common_fe_check_enable +#endif + }, + [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_private_fe_check_enable +#endif + }, + [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_coex_check_enable +#endif + }, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_i2c_master_check_enable +#endif + }, +#endif +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_apb_check_enable +#endif + }, + [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_bb_44m_check_enable +#endif + }, +#endif +#if SOC_WIFI_SUPPORTED + [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_mac_check_enable +#endif + }, + [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_bb_check_enable +#endif + }, +#endif + [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_etm_check_enable +#endif + }, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_mac_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED + [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_i154_bb_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ieee802154_mac_check_enable +#endif + }, +#endif + [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_data_dump_check_enable +#endif + } +}; + +#if SOC_PM_SUPPORT_PMU_MODEM_STATE +const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { + [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, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + [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, +}; +#endif diff --git a/components/esp_hw_support/port/esp32c6/CMakeLists.txt b/components/esp_hw_support/port/esp32c6/CMakeLists.txt index bf7b2259131..73a9c16820b 100644 --- a/components/esp_hw_support/port/esp32c6/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c6/CMakeLists.txt @@ -13,6 +13,9 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") + if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock_impl.c") + endif() endif() if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) diff --git a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c new file mode 100644 index 00000000000..bce1cce4fb7 --- /dev/null +++ b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c @@ -0,0 +1,414 @@ +/* + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc_caps.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/regi2c_ctrl.h" + +/* Clock dependency definitions */ +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) +#else +#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) +#endif +#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#else +#define I2C_ANA_MST_CLOCK_DEPS (0) +#endif +#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) +#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#else +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#endif +#ifndef SOC_WIFI_SUPPORTED +#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#endif +#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) +#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#endif +#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) + +uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +{ + uint32_t deps = 0; + switch (module) { + case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; + case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; + case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; +#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; +#endif +#if SOC_WIFI_SUPPORTED + case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED + case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; +#endif + case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; +#if SOC_IEEE802154_SUPPORTED + case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; +#endif + default: + assert(0); + } + return deps; +} + +#if SOC_WIFI_SUPPORTED +static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { +#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); +#endif + modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); + } +} + +static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_clk_wifibb_configure(ctx->hal->syscon_dev, enable); + } +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; +#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); +#endif + all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_WIFI_SUPPORTED + +#if SOC_BT_SUPPORTED +static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED + +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); + } +} + +static void IRAM_ATTR modem_clock_wifi_bb_44m_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifibb_44m_clock(ctx->hal->syscon_dev, enable); + } +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_wifi_apb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif +#endif + +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + +#if SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_IEEE802154_SUPPORTED + +static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); +} + +static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); +} + +static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable) { + ANALOG_CLOCK_ENABLE(); + } else { + ANALOG_CLOCK_DISABLE(); + } +} +#endif + +static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); +} + +static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) +{ + return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) +{ + return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; +} +#endif + +static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif + +DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { + [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_adc_common_fe_check_enable +#endif + }, + [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_private_fe_check_enable +#endif + }, + [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_coex_check_enable +#endif + }, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_i2c_master_check_enable +#endif + }, +#endif +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_apb_check_enable +#endif + }, + [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_bb_44m_check_enable +#endif + }, +#endif +#if SOC_WIFI_SUPPORTED + [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_mac_check_enable +#endif + }, + [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_bb_check_enable +#endif + }, +#endif + [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_etm_check_enable +#endif + }, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_mac_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED + [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_i154_bb_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ieee802154_mac_check_enable +#endif + }, +#endif + [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_data_dump_check_enable +#endif + } +}; + +#if SOC_PM_SUPPORT_PMU_MODEM_STATE +const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { + [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, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + [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, +}; +#endif + +#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND +static esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_context_t *ctx, modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) +{ + if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { + return ESP_ERR_INVALID_ARG; + } + if (mode > PMU_HP_ICG_MODEM_CODE_ACTIVE || mode < PMU_HP_ICG_MODEM_CODE_SLEEP) { + return ESP_ERR_INVALID_ARG; + } + + esp_os_enter_critical_safe(&ctx->lock); + uint32_t code = modem_clock_hal_get_clock_domain_icg_bitmap(ctx->hal, domain); + modem_clock_hal_set_clock_domain_icg_bitmap(ctx->hal, domain, (code & ~BIT(mode))); + esp_os_exit_critical_safe(&ctx->lock); + return ESP_OK; +} + +static esp_err_t modem_clock_domain_clk_gate_disable(modem_clock_context_t *ctx, modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) +{ + if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { + return ESP_ERR_INVALID_ARG; + } + if (mode > PMU_HP_ICG_MODEM_CODE_ACTIVE || mode < PMU_HP_ICG_MODEM_CODE_SLEEP) { + return ESP_ERR_INVALID_ARG; + } + + esp_os_enter_critical_safe(&ctx->lock); + uint32_t code = modem_clock_hal_get_clock_domain_icg_bitmap(ctx->hal, domain); + modem_clock_hal_set_clock_domain_icg_bitmap(ctx->hal, domain, (code | BIT(mode))); + esp_os_exit_critical_safe(&ctx->lock); + return ESP_OK; +} + +void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool select, modem_clock_lpclk_src_t src) +{ + if (efuse_hal_chip_revision() != 0 && src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) { + if (select) + { + esp_sleep_clock_config(ESP_SLEEP_CLOCK_BT_USE_WIFI_PWR_CLK, ESP_SLEEP_CLOCK_OPTION_UNGATE); + modem_clock_hal_enable_wifipwr_clock(ctx->hal, true); + modem_clock_domain_clk_gate_disable(ctx, MODEM_CLOCK_DOMAIN_WIFIPWR, PMU_HP_ICG_MODEM_CODE_SLEEP); + } else { + esp_sleep_clock_config(ESP_SLEEP_CLOCK_BT_USE_WIFI_PWR_CLK, ESP_SLEEP_CLOCK_OPTION_GATE); + modem_clock_hal_enable_wifipwr_clock(ctx->hal, false); + modem_clock_domain_clk_gate_enable(ctx, MODEM_CLOCK_DOMAIN_WIFIPWR, PMU_HP_ICG_MODEM_CODE_SLEEP); + } + } +} +#endif // #if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND diff --git a/components/esp_hw_support/port/esp32c61/CMakeLists.txt b/components/esp_hw_support/port/esp32c61/CMakeLists.txt index 33715e7cb52..73a9c16820b 100644 --- a/components/esp_hw_support/port/esp32c61/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c61/CMakeLists.txt @@ -12,6 +12,10 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") + + if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock_impl.c") + endif() endif() if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) diff --git a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c new file mode 100644 index 00000000000..ef303da61ab --- /dev/null +++ b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c @@ -0,0 +1,364 @@ +/* + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc_caps.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/regi2c_ctrl.h" + +/* Clock dependency definitions */ +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) +#else +#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) +#endif +#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#else +#define I2C_ANA_MST_CLOCK_DEPS (0) +#endif +#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) +#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#else +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#endif +#ifndef SOC_WIFI_SUPPORTED +#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#endif +#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) +#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#endif +#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) + +uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +{ + uint32_t deps = 0; + switch (module) { + case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; + case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; + case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; +#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; +#endif +#if SOC_WIFI_SUPPORTED + case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED + case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; +#endif + case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; +#if SOC_IEEE802154_SUPPORTED + case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; +#endif + default: + assert(0); + } + return deps; +} + +#if SOC_WIFI_SUPPORTED +static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { +#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); +#endif + modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); + } +} + +static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_clk_wifibb_configure(ctx->hal->syscon_dev, enable); + } +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; +#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); +#endif + all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_WIFI_SUPPORTED + +#if SOC_BT_SUPPORTED +static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED + +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); + } +} + +static void IRAM_ATTR modem_clock_wifi_bb_44m_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { + modem_syscon_ll_enable_wifibb_44m_clock(ctx->hal->syscon_dev, enable); + } +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_wifi_apb_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} +#endif +#endif + +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + +#if SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_IEEE802154_SUPPORTED + +static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); +} + +static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); +} + +static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable) { + ANALOG_CLOCK_ENABLE(); + } else { + ANALOG_CLOCK_DISABLE(); + } +} +#endif + +static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); +} + +static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) +{ + return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) +{ + return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; +} +#endif + +static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif + +DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { + [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_adc_common_fe_check_enable +#endif + }, + [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_private_fe_check_enable +#endif + }, + [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_coex_check_enable +#endif + }, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_i2c_master_check_enable +#endif + }, +#endif +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_apb_check_enable +#endif + }, + [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_bb_44m_check_enable +#endif + }, +#endif +#if SOC_WIFI_SUPPORTED + [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_mac_check_enable +#endif + }, + [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_wifi_bb_check_enable +#endif + }, +#endif + [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_etm_check_enable +#endif + }, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_mac_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED + [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_i154_bb_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ieee802154_mac_check_enable +#endif + }, +#endif + [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_data_dump_check_enable +#endif + } +}; + +#if SOC_PM_SUPPORT_PMU_MODEM_STATE +const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { + [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, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + [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, +}; +#endif diff --git a/components/esp_hw_support/port/esp32h2/CMakeLists.txt b/components/esp_hw_support/port/esp32h2/CMakeLists.txt index 0be7eb5dd9e..600aed3ccc9 100644 --- a/components/esp_hw_support/port/esp32h2/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h2/CMakeLists.txt @@ -13,6 +13,10 @@ if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") endif() +if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock_impl.c") +endif() + add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") target_sources(${COMPONENT_LIB} PRIVATE "${srcs}") diff --git a/components/esp_hw_support/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/port/esp32h2/modem_clock_impl.c new file mode 100644 index 00000000000..85a930f434a --- /dev/null +++ b/components/esp_hw_support/port/esp32h2/modem_clock_impl.c @@ -0,0 +1,282 @@ +/* + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc_caps.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/regi2c_ctrl.h" +#if CONFIG_IDF_TARGET_ESP32H2 +#include "soc/rtc.h" +#endif // CONFIG_IDF_TARGET_ESP32H2 + +/* Clock dependency definitions */ +#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#else +#define I2C_ANA_MST_CLOCK_DEPS (0) +#endif +#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) +#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define PHY_CALIBRATION_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#else +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#endif +#ifndef SOC_WIFI_SUPPORTED +#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#endif +#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) +#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#endif +#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) + +uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +{ + uint32_t deps = 0; + switch (module) { + case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; + case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; + case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED + case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; +#endif + case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; +#if SOC_IEEE802154_SUPPORTED + case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; +#endif + default: + assert(0); + } + return deps; +} + +#if SOC_BT_SUPPORTED +static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED + +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + +#if SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_IEEE802154_SUPPORTED + +static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); +} + +static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); +} + +static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable) { + ANALOG_CLOCK_ENABLE(); + } else { + ANALOG_CLOCK_DISABLE(); + } +} +#endif + +static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); +} + +static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) +{ + return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) +{ + return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; +} +#endif + +static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif + +DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { + [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_adc_common_fe_check_enable +#endif + }, + [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_private_fe_check_enable +#endif + }, + [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_coex_check_enable +#endif + }, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_i2c_master_check_enable +#endif + }, +#endif + [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_etm_check_enable +#endif + }, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_mac_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED + [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_i154_bb_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ieee802154_mac_check_enable +#endif + }, +#endif + [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_data_dump_check_enable +#endif + } +}; + +#if CONFIG_IDF_TARGET_ESP32H2 +/* rc32k clock enable status before selecting BLE RTC timer clock source */ +static bool rc_clk_en = true; +void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, bool enable, modem_clock_lpclk_src_t src) +{ + if (enable) { + bool selected = (src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) || + (src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW); + if (selected) { + rc_clk_en = clk_ll_rc32k_is_enabled(); + if (!rc_clk_en) { + rtc_clk_rc32k_enable(true); + } + modem_clock_hal_select_ble_rtc_timer_lpclk_source(ctx->hal, MODEM_CLOCK_LPCLK_SRC_RC32K); + } + } else { + if (!rc_clk_en) { + extern void r_esp_ble_rtc_ticks_delay(uint32_t ticks); + r_esp_ble_rtc_ticks_delay(2); + rtc_clk_rc32k_enable(false); + } + } +} +#endif // CONFIG_IDF_TARGET_ESP32H2 diff --git a/components/esp_hw_support/port/esp32h21/CMakeLists.txt b/components/esp_hw_support/port/esp32h21/CMakeLists.txt index 9f9db291e3c..6b623f2d04e 100644 --- a/components/esp_hw_support/port/esp32h21/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h21/CMakeLists.txt @@ -11,6 +11,10 @@ if(CONFIG_SOC_PMU_SUPPORTED) ) endif() +if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock_impl.c") +endif() + add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") target_sources(${COMPONENT_LIB} PRIVATE "${srcs}") diff --git a/components/esp_hw_support/port/esp32h21/modem_clock_impl.c b/components/esp_hw_support/port/esp32h21/modem_clock_impl.c new file mode 100644 index 00000000000..232e5a16b60 --- /dev/null +++ b/components/esp_hw_support/port/esp32h21/modem_clock_impl.c @@ -0,0 +1,254 @@ +/* + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc_caps.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/regi2c_ctrl.h" + +/* Clock dependency definitions */ +#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#else +#define I2C_ANA_MST_CLOCK_DEPS (0) +#endif +#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) +#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define PHY_CALIBRATION_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#else +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#endif +#ifndef SOC_WIFI_SUPPORTED +#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#endif +#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) +#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#endif +#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) + +uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +{ + uint32_t deps = 0; + switch (module) { + case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; + case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; + case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED + case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; +#endif + case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; +#if SOC_IEEE802154_SUPPORTED + case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; +#endif + default: + assert(0); + } + return deps; +} + +#if SOC_BT_SUPPORTED +static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED + +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + +#if SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_IEEE802154_SUPPORTED + +static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); +} + +static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); +} + +static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable) { + ANALOG_CLOCK_ENABLE(); + } else { + ANALOG_CLOCK_DISABLE(); + } +} +#endif + +static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); +} + +static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) +{ + return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) +{ + return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; +} +#endif + +static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif + +DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { + [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_adc_common_fe_check_enable +#endif + }, + [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_private_fe_check_enable +#endif + }, + [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_coex_check_enable +#endif + }, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_i2c_master_check_enable +#endif + }, +#endif + [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_etm_check_enable +#endif + }, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_mac_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED + [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_i154_bb_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ieee802154_mac_check_enable +#endif + }, +#endif + [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_data_dump_check_enable +#endif + } +}; diff --git a/components/esp_hw_support/port/esp32h4/CMakeLists.txt b/components/esp_hw_support/port/esp32h4/CMakeLists.txt index 8c824225ecf..b9340190d38 100644 --- a/components/esp_hw_support/port/esp32h4/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h4/CMakeLists.txt @@ -14,6 +14,10 @@ endif() if(NOT BOOTLOADER_BUILD) # list(APPEND srcs "sar_periph_ctrl.c") // TODO: [ESP32H4] IDF-12368 + + if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock_impl.c") + endif() endif() add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") diff --git a/components/esp_hw_support/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/port/esp32h4/modem_clock_impl.c new file mode 100644 index 00000000000..40c019c74f0 --- /dev/null +++ b/components/esp_hw_support/port/esp32h4/modem_clock_impl.c @@ -0,0 +1,271 @@ +/* + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "soc/soc_caps.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/regi2c_ctrl.h" + +/* Clock dependency definitions */ +#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) +#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#else +#define I2C_ANA_MST_CLOCK_DEPS (0) +#endif +#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) +#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT +#define PHY_CALIBRATION_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#else +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#endif +#ifndef SOC_WIFI_SUPPORTED +#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#endif +#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) +#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#endif +#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) + +uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +{ + uint32_t deps = 0; + switch (module) { + case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; + case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; + case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED + case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; +#endif + case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; +#if SOC_IEEE802154_SUPPORTED + case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; +#endif + default: + assert(0); + } + return deps; +} + +#if SOC_BT_SUPPORTED +static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED + +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + +#if SOC_IEEE802154_SUPPORTED +static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif +#endif // SOC_IEEE802154_SUPPORTED + +static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_lpcon_ll_enable_coex_clock(ctx->hal->lpcon_dev, enable); +} + +static void IRAM_ATTR modem_clock_modem_adc_common_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_common_fe_clock(ctx->hal, enable); +} + +static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) +{ + if (enable) { + ANALOG_CLOCK_ENABLE(); + } else { + ANALOG_CLOCK_DISABLE(); + } +} +#endif + +static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_etm_clock(ctx->hal->syscon_dev, enable); +} + +static void IRAM_ATTR modem_clock_data_dump_configure(modem_clock_context_t *ctx, bool enable) +{ + modem_syscon_ll_enable_data_dump_clock(ctx->hal->syscon_dev, enable); + modem_syscon_ll_enable_data_dump_mux_clock(ctx->hal->syscon_dev, enable); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_coex_check_enable(modem_clock_context_t *ctx) +{ + return modem_lpcon_ll_coex_clock_is_enabled(ctx->hal->lpcon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_adc_common_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_common_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock_context_t *ctx) +{ + return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; +} + +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) +{ + return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; +} +#endif + +static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) +{ + return modem_syscon_ll_etm_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; +} + +static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_context_t *ctx) +{ + bool all_clock_enabled = true; + all_clock_enabled &= modem_syscon_ll_data_dump_clock_is_enabled(ctx->hal->syscon_dev); + all_clock_enabled &= modem_syscon_ll_data_dump_mux_clock_is_enabled(ctx->hal->syscon_dev); + return all_clock_enabled ? ESP_OK : ESP_FAIL; +} +#endif + +DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { + [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_adc_common_fe_check_enable +#endif + }, + [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_modem_private_fe_check_enable +#endif + }, + [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_coex_check_enable +#endif + }, +#if ANA_I2C_MST_CLK_HAS_ROOT_GATING +// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_i2c_master_check_enable +#endif + }, +#endif + [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_etm_check_enable +#endif + }, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_mac_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED + [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ble_i154_bb_check_enable +#endif + }, +#endif +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_ieee802154_mac_check_enable +#endif + }, +#endif + [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + , .check_enable = modem_clock_data_dump_check_enable +#endif + } +}; + +#if SOC_PM_SUPPORT_PMU_MODEM_STATE +const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { + [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, +#if SOC_BT_SUPPORTED + [MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE, +#endif + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, +#if SOC_IEEE802154_SUPPORTED + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, +#endif + [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, +}; +#endif diff --git a/components/hal/include/hal/modem_clock_types.h b/components/hal/include/hal/modem_clock_types.h index 71794e4d750..fc4d0bb3bab 100644 --- a/components/hal/include/hal/modem_clock_types.h +++ b/components/hal/include/hal/modem_clock_types.h @@ -6,6 +6,8 @@ #pragma once +#include "soc/soc_caps.h" + #ifdef __cplusplus extern "C" { #endif @@ -13,14 +15,22 @@ extern "C" { typedef enum { MODEM_CLOCK_DOMAIN_MODEM_APB = 0, MODEM_CLOCK_DOMAIN_MODEM_PERIPH, +#if SOC_WIFI_SUPPORTED MODEM_CLOCK_DOMAIN_WIFI, +#endif +#if SOC_BT_SUPPORTED MODEM_CLOCK_DOMAIN_BT, +#endif MODEM_CLOCK_DOMAIN_MODEM_FE, +#if SOC_IEEE802154_SUPPORTED MODEM_CLOCK_DOMAIN_IEEE802154, +#endif MODEM_CLOCK_DOMAIN_LP_APB, MODEM_CLOCK_DOMAIN_I2C_MASTER, MODEM_CLOCK_DOMAIN_COEX, +#if SOC_WIFI_SUPPORTED || SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND MODEM_CLOCK_DOMAIN_WIFIPWR, +#endif MODEM_CLOCK_DOMAIN_MAX } modem_clock_domain_t; From 75fd8e7a806851bc4a08834968186531a7542dd6 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Mon, 15 Dec 2025 11:58:25 +0800 Subject: [PATCH 02/11] change(esp_hw_support): clean up modem clock inclusion --- .../esp_hw_support/port/esp32c61/modem_clock_impl.c | 2 +- .../esp_hw_support/port/esp32p4/sar_periph_ctrl.c | 1 - components/esp_system/port/soc/esp32p4/clk.c | 1 - components/esp_system/port/soc/esp32s31/clk.c | 1 - components/hal/esp32c61/modem_clock_hal.c | 8 +------- components/hal/esp32h4/include/hal/modem_lpcon_ll.h | 12 ------------ components/hal/esp32h4/modem_clock_hal.c | 6 +++--- components/soc/esp32c61/include/soc/soc_caps.h | 1 - 8 files changed, 5 insertions(+), 27 deletions(-) diff --git a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c index ef303da61ab..6deeddbefa7 100644 --- a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c @@ -355,7 +355,7 @@ const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [MODEM_CLOCK_DOMAIN_WIFI] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE, [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, - [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + // [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, [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, diff --git a/components/esp_hw_support/port/esp32p4/sar_periph_ctrl.c b/components/esp_hw_support/port/esp32p4/sar_periph_ctrl.c index 613abbf52ce..1bde777e8c1 100644 --- a/components/esp_hw_support/port/esp32p4/sar_periph_ctrl.c +++ b/components/esp_hw_support/port/esp32p4/sar_periph_ctrl.c @@ -19,7 +19,6 @@ #include "freertos/FreeRTOS.h" #include "esp_private/sar_periph_ctrl.h" #include "esp_private/regi2c_ctrl.h" -#include "esp_private/esp_modem_clock.h" #include "esp_private/critical_section.h" #include "esp_private/adc_share_hw_ctrl.h" #include "hal/sar_ctrl_ll.h" diff --git a/components/esp_system/port/soc/esp32p4/clk.c b/components/esp_system/port/soc/esp32p4/clk.c index 3262708c5b6..c23e60d4770 100644 --- a/components/esp_system/port/soc/esp32p4/clk.c +++ b/components/esp_system/port/soc/esp32p4/clk.c @@ -22,7 +22,6 @@ #include "mspi_timing_tuning_configs.h" #include "hal/clk_gate_ll.h" #include "hal/wdt_hal.h" -#include "esp_private/esp_modem_clock.h" #include "esp_private/esp_sleep_internal.h" #include "esp_private/esp_clk.h" #include "esp_private/esp_pmu.h" diff --git a/components/esp_system/port/soc/esp32s31/clk.c b/components/esp_system/port/soc/esp32s31/clk.c index d9b2c7c62dc..db8c07b69bc 100644 --- a/components/esp_system/port/soc/esp32s31/clk.c +++ b/components/esp_system/port/soc/esp32s31/clk.c @@ -30,7 +30,6 @@ #include "soc/hp_alive_sys_reg.h" #include "hal/uart_ll.h" #include "hal/wdt_hal.h" -#include "esp_private/esp_modem_clock.h" #include "esp_private/esp_sleep_internal.h" #include "esp_private/periph_ctrl.h" #include "esp_private/esp_clk.h" diff --git a/components/hal/esp32c61/modem_clock_hal.c b/components/hal/esp32c61/modem_clock_hal.c index 6e49bab4b84..ccb8ac49b3c 100644 --- a/components/hal/esp32c61/modem_clock_hal.c +++ b/components/hal/esp32c61/modem_clock_hal.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -33,9 +33,6 @@ void IRAM_ATTR modem_clock_hal_set_clock_domain_icg_bitmap(modem_clock_hal_conte case MODEM_CLOCK_DOMAIN_MODEM_FE: modem_syscon_ll_set_fe_icg_bitmap(hal->syscon_dev, bitmap); break; - case MODEM_CLOCK_DOMAIN_IEEE802154: - modem_syscon_ll_set_ieee802154_icg_bitmap(hal->syscon_dev, bitmap); - break; case MODEM_CLOCK_DOMAIN_LP_APB: modem_lpcon_ll_set_lp_apb_icg_bitmap(hal->lpcon_dev, bitmap); break; @@ -74,9 +71,6 @@ uint32_t IRAM_ATTR modem_clock_hal_get_clock_domain_icg_bitmap(modem_clock_hal_c case MODEM_CLOCK_DOMAIN_MODEM_FE: bitmap = modem_syscon_ll_get_fe_icg_bitmap(hal->syscon_dev); break; - case MODEM_CLOCK_DOMAIN_IEEE802154: - bitmap = modem_syscon_ll_get_ieee802154_icg_bitmap(hal->syscon_dev); - break; case MODEM_CLOCK_DOMAIN_LP_APB: bitmap = modem_lpcon_ll_get_lp_apb_icg_bitmap(hal->lpcon_dev); break; diff --git a/components/hal/esp32h4/include/hal/modem_lpcon_ll.h b/components/hal/esp32h4/include/hal/modem_lpcon_ll.h index adbf14e1245..a87df9f979a 100644 --- a/components/hal/esp32h4/include/hal/modem_lpcon_ll.h +++ b/components/hal/esp32h4/include/hal/modem_lpcon_ll.h @@ -110,18 +110,6 @@ static inline void modem_lpcon_ll_reset_all(modem_lpcon_dev_t *hw) hw->rst_conf.val = 0; } -__attribute__((always_inline)) -static inline uint32_t modem_lpcon_ll_get_wifipwr_icg_bitmap(modem_lpcon_dev_t *hw) -{ - return hw->clk_conf_power_st.clk_wifipwr_st_map; -} - -__attribute__((always_inline)) -static inline void modem_lpcon_ll_set_wifipwr_icg_bitmap(modem_lpcon_dev_t *hw, uint32_t bitmap) -{ - hw->clk_conf_power_st.clk_wifipwr_st_map = bitmap; -} - __attribute__((always_inline)) static inline uint32_t modem_lpcon_ll_get_coex_icg_bitmap(modem_lpcon_dev_t *hw) { diff --git a/components/hal/esp32h4/modem_clock_hal.c b/components/hal/esp32h4/modem_clock_hal.c index 37932652e81..22f95a195db 100644 --- a/components/hal/esp32h4/modem_clock_hal.c +++ b/components/hal/esp32h4/modem_clock_hal.c @@ -48,9 +48,6 @@ void IRAM_ATTR modem_clock_hal_set_clock_domain_icg_bitmap(modem_clock_hal_conte case MODEM_CLOCK_DOMAIN_COEX: modem_lpcon_ll_set_coex_icg_bitmap(hal->lpcon_dev, bitmap); break; - case MODEM_CLOCK_DOMAIN_WIFIPWR: - modem_lpcon_ll_set_wifipwr_icg_bitmap(hal->lpcon_dev, bitmap); - break; default: HAL_ASSERT(0); } @@ -83,6 +80,9 @@ uint32_t IRAM_ATTR modem_clock_hal_get_clock_domain_icg_bitmap(modem_clock_hal_c case MODEM_CLOCK_DOMAIN_I2C_MASTER: bitmap = modem_lpcon_ll_get_i2c_master_icg_bitmap(hal->lpcon_dev); break; + case MODEM_CLOCK_DOMAIN_COEX: + bitmap = modem_lpcon_ll_get_coex_icg_bitmap(hal->lpcon_dev); + break; default: HAL_ASSERT(0); } diff --git a/components/soc/esp32c61/include/soc/soc_caps.h b/components/soc/esp32c61/include/soc/soc_caps.h index 51dc97ff5c4..3b755f4f606 100644 --- a/components/soc/esp32c61/include/soc/soc_caps.h +++ b/components/soc/esp32c61/include/soc/soc_caps.h @@ -31,7 +31,6 @@ #define SOC_AHB_GDMA_SUPPORTED 1 #define SOC_GPTIMER_SUPPORTED 1 #define SOC_BT_SUPPORTED 1 -// \#define SOC_IEEE802154_SUPPORTED 1 #define SOC_USB_SERIAL_JTAG_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_TEMP_SENSOR_SUPPORTED 1 From 6f3dca9cb53b769da602a8e7951baccb7f4f84a1 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Tue, 23 Dec 2025 19:24:53 +0800 Subject: [PATCH 03/11] change(esp_hw_support): change some modem clock related macros --- components/esp_hw_support/CMakeLists.txt | 2 +- .../include/esp_private/esp_modem_clock.h | 16 +++++++--------- components/esp_hw_support/modem_clock.c | 12 +++++------- .../esp_hw_support/port/esp32c5/CMakeLists.txt | 2 +- .../port/esp32c5/modem_clock_impl.c | 2 +- .../esp_hw_support/port/esp32c6/CMakeLists.txt | 2 +- .../port/esp32c6/modem_clock_impl.c | 4 ++-- .../esp_hw_support/port/esp32c61/CMakeLists.txt | 2 +- .../port/esp32c61/modem_clock_impl.c | 2 +- .../esp_hw_support/port/esp32h2/CMakeLists.txt | 2 +- .../esp_hw_support/port/esp32h21/CMakeLists.txt | 2 +- .../esp_hw_support/port/esp32h4/CMakeLists.txt | 2 +- .../port/esp32h4/modem_clock_impl.c | 2 +- components/hal/include/hal/modem_clock_hal.h | 2 +- .../soc/esp32c5/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c5/include/soc/soc_caps.h | 1 + .../soc/esp32c6/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c6/include/soc/soc_caps.h | 1 + .../soc/esp32c61/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32c61/include/soc/soc_caps.h | 1 + .../soc/esp32h2/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32h2/include/soc/soc_caps.h | 1 + .../soc/esp32h4/include/soc/Kconfig.soc_caps.in | 4 ++++ components/soc/esp32h4/include/soc/soc_caps.h | 3 ++- 24 files changed, 51 insertions(+), 30 deletions(-) diff --git a/components/esp_hw_support/CMakeLists.txt b/components/esp_hw_support/CMakeLists.txt index 81b0c772296..dd2e94454f2 100644 --- a/components/esp_hw_support/CMakeLists.txt +++ b/components/esp_hw_support/CMakeLists.txt @@ -107,7 +107,7 @@ if(NOT non_os_build) "port/regdma_link.c") endif() - if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock.c") endif() diff --git a/components/esp_hw_support/include/esp_private/esp_modem_clock.h b/components/esp_hw_support/include/esp_private/esp_modem_clock.h index cd5c988597b..d84129b5a0f 100644 --- a/components/esp_hw_support/include/esp_private/esp_modem_clock.h +++ b/components/esp_hw_support/include/esp_private/esp_modem_clock.h @@ -17,7 +17,7 @@ #include "esp_private/esp_pmu.h" #include "esp_private/critical_section.h" -#if SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED +#if SOC_MODEM_CLOCK_SUPPORTED #include "hal/modem_clock_hal.h" #endif @@ -25,7 +25,7 @@ extern "C" { #endif -#if SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED +#if SOC_MODEM_CLOCK_SUPPORTED // Please define the frequently called modules in the low bit, // which will improve the execution efficiency typedef enum { @@ -76,7 +76,7 @@ typedef struct modem_clock_context { modem_clock_hal_context_t *hal; spinlock_t lock; modem_clock_device_context_t *dev; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG const uint8_t *initial_gating_mode; #endif /* the low-power clock source for each module */ @@ -100,22 +100,20 @@ uint32_t modem_clock_get_module_deps(shared_periph_module_t module); */ extern modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX]; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG /** * @brief Initial gating mode for each clock domain * Each chip defines this array in its port file */ extern const uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX]; -#endif -#if SOC_PM_SUPPORT_PMU_MODEM_STATE /* the ICG code's bit 0, 1 and 2 indicates the ICG state * of pmu SLEEP, MODEM and ACTIVE mode respectively */ #define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) #define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) #define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) -#endif // SOC_PM_SUPPORT_PMU_MODEM_STATE -#endif // SOC_MODEM_CLOCK_IS_INDEPENDENT && SOC_MODEM_CLOCK_SUPPORTED +#endif // SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG +#endif // SOC_MODEM_CLOCK_SUPPORTED /** * @brief Enable the clock of modem module @@ -215,7 +213,7 @@ void modem_clock_deselect_lp_clock_source(shared_periph_module_t module); */ void modem_clock_deselect_all_module_lp_clock_source(void); -#if CONFIG_IDF_TARGET_ESP32H2 +#if SOC_MODEM_CLOCK_BLE_RTC_TIMER_WORKAROUND /** * @brief BLE RTC timer LPCLK workaround on ESP32H2 * diff --git a/components/esp_hw_support/modem_clock.c b/components/esp_hw_support/modem_clock.c index e063c357789..a229f925c50 100644 --- a/components/esp_hw_support/modem_clock.c +++ b/components/esp_hw_support/modem_clock.c @@ -28,7 +28,7 @@ modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(voi static DRAM_ATTR modem_clock_context_t modem_clock_context = { .hal = &modem_clock_hal, .lock = SPINLOCK_INITIALIZER, .dev = g_modem_clock_dev, -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG .initial_gating_mode = g_initial_gating_mode, #endif .lpclk_src = { [0 ... PERIPH_MODEM_MODULE_NUM - 1] = MODEM_CLOCK_LPCLK_SRC_INVALID } @@ -116,7 +116,7 @@ void IRAM_ATTR modem_clock_module_mac_reset(shared_periph_module_t module) esp_os_exit_critical_safe(&ctx->lock); } -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG static IRAM_ATTR void modem_clock_module_icg_map_init_all(void) { esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); @@ -134,7 +134,7 @@ static IRAM_ATTR void modem_clock_module_icg_map_init_all(void) void IRAM_ATTR modem_clock_module_enable(shared_periph_module_t module) { assert(IS_MODEM_MODULE(module)); -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG modem_clock_module_icg_map_init_all(); #endif uint32_t deps = modem_clock_get_module_deps(module); @@ -211,22 +211,20 @@ void modem_clock_select_lp_clock_source(shared_periph_module_t module, modem_clo #if SOC_BT_SUPPORTED case PERIPH_BT_MODULE: - { -#if CONFIG_IDF_TARGET_ESP32H2 +#if SOC_MODEM_CLOCK_BLE_RTC_TIMER_WORKAROUND modem_clock_select_ble_rtc_timer_clk_workaround(MODEM_CLOCK_instance(), true, src); #endif modem_clock_hal_deselect_all_ble_rtc_timer_lpclk_source(MODEM_CLOCK_instance()->hal); modem_clock_hal_select_ble_rtc_timer_lpclk_source(MODEM_CLOCK_instance()->hal, src); modem_clock_hal_set_ble_rtc_timer_divisor_value(MODEM_CLOCK_instance()->hal, divider); modem_clock_hal_enable_ble_rtc_timer_clock(MODEM_CLOCK_instance()->hal, true); -#if CONFIG_IDF_TARGET_ESP32H2 +#if SOC_MODEM_CLOCK_BLE_RTC_TIMER_WORKAROUND modem_clock_select_ble_rtc_timer_clk_workaround(MODEM_CLOCK_instance(), false, src); #endif #if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND modem_clock_bt_wifipwr_clk_workaround(MODEM_CLOCK_instance(), true, src); #endif break; - } #endif // SOC_BT_SUPPORTED case PERIPH_COEX_MODULE: diff --git a/components/esp_hw_support/port/esp32c5/CMakeLists.txt b/components/esp_hw_support/port/esp32c5/CMakeLists.txt index b8dba1dc733..421a560c927 100644 --- a/components/esp_hw_support/port/esp32c5/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c5/CMakeLists.txt @@ -13,7 +13,7 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") - if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock_impl.c") endif() endif() diff --git a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c index ef303da61ab..2cf8b8a284b 100644 --- a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c @@ -348,7 +348,7 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] } }; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, diff --git a/components/esp_hw_support/port/esp32c6/CMakeLists.txt b/components/esp_hw_support/port/esp32c6/CMakeLists.txt index 73a9c16820b..00f0244cc6d 100644 --- a/components/esp_hw_support/port/esp32c6/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c6/CMakeLists.txt @@ -13,7 +13,7 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") - if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock_impl.c") endif() endif() diff --git a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c index bce1cce4fb7..9438b29a26e 100644 --- a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c @@ -348,8 +348,8 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] } }; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE -const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG +static const DRAM_ATTR uint32_t s_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [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, diff --git a/components/esp_hw_support/port/esp32c61/CMakeLists.txt b/components/esp_hw_support/port/esp32c61/CMakeLists.txt index 73a9c16820b..00f0244cc6d 100644 --- a/components/esp_hw_support/port/esp32c61/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c61/CMakeLists.txt @@ -13,7 +13,7 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") - if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock_impl.c") endif() endif() diff --git a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c index 6deeddbefa7..a960d95bfcf 100644 --- a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c @@ -348,7 +348,7 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] } }; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, diff --git a/components/esp_hw_support/port/esp32h2/CMakeLists.txt b/components/esp_hw_support/port/esp32h2/CMakeLists.txt index 600aed3ccc9..2c8e46e850a 100644 --- a/components/esp_hw_support/port/esp32h2/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h2/CMakeLists.txt @@ -13,7 +13,7 @@ if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") endif() -if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) +if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock_impl.c") endif() diff --git a/components/esp_hw_support/port/esp32h21/CMakeLists.txt b/components/esp_hw_support/port/esp32h21/CMakeLists.txt index 6b623f2d04e..22415c710f9 100644 --- a/components/esp_hw_support/port/esp32h21/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h21/CMakeLists.txt @@ -11,7 +11,7 @@ if(CONFIG_SOC_PMU_SUPPORTED) ) endif() -if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) +if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock_impl.c") endif() diff --git a/components/esp_hw_support/port/esp32h4/CMakeLists.txt b/components/esp_hw_support/port/esp32h4/CMakeLists.txt index b9340190d38..377d5d38c48 100644 --- a/components/esp_hw_support/port/esp32h4/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h4/CMakeLists.txt @@ -15,7 +15,7 @@ endif() if(NOT BOOTLOADER_BUILD) # list(APPEND srcs "sar_periph_ctrl.c") // TODO: [ESP32H4] IDF-12368 - if(CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT AND CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) list(APPEND srcs "modem_clock_impl.c") endif() endif() diff --git a/components/esp_hw_support/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/port/esp32h4/modem_clock_impl.c index 40c019c74f0..1f0b1ea59f3 100644 --- a/components/esp_hw_support/port/esp32h4/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32h4/modem_clock_impl.c @@ -253,7 +253,7 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] } }; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, diff --git a/components/hal/include/hal/modem_clock_hal.h b/components/hal/include/hal/modem_clock_hal.h index 1e17817e9f3..07ad1c7b21a 100644 --- a/components/hal/include/hal/modem_clock_hal.h +++ b/components/hal/include/hal/modem_clock_hal.h @@ -24,7 +24,7 @@ typedef struct { modem_lpcon_dev_t *lpcon_dev; } modem_clock_hal_context_t; -#if SOC_PM_SUPPORT_PMU_MODEM_STATE +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG void modem_clock_hal_set_clock_domain_icg_bitmap(modem_clock_hal_context_t *hal, modem_clock_domain_t domain, uint32_t bitmap); uint32_t modem_clock_hal_get_clock_domain_icg_bitmap(modem_clock_hal_context_t *hal, modem_clock_domain_t domain); #endif diff --git a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in index 81ef3ec2544..c35bf946b58 100644 --- a/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c5/include/soc/Kconfig.soc_caps.in @@ -1423,6 +1423,10 @@ config SOC_PM_SUPPORT_PMU_CLK_ICG bool default y +config SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG + bool + default y + config SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY bool default y diff --git a/components/soc/esp32c5/include/soc/soc_caps.h b/components/soc/esp32c5/include/soc/soc_caps.h index 4fca456f1ba..784d20469d7 100644 --- a/components/soc/esp32c5/include/soc/soc_caps.h +++ b/components/soc/esp32c5/include/soc/soc_caps.h @@ -579,6 +579,7 @@ #define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE #define SOC_PM_SUPPORT_PMU_CLK_ICG (1) +#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1) #define SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY (1) /*! Date: Wed, 24 Dec 2025 10:59:57 +0800 Subject: [PATCH 04/11] change(esp_hw_support): remove macros in modem_clock_cfg.c --- .../port/esp32c5/modem_clock_impl.c | 63 ----------- .../port/esp32c6/modem_clock_impl.c | 101 +----------------- .../port/esp32h2/modem_clock_impl.c | 44 -------- 3 files changed, 1 insertion(+), 207 deletions(-) diff --git a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c index 2cf8b8a284b..bcb965d0d20 100644 --- a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c @@ -11,37 +11,16 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT #define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) -#else -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) -#endif #define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) #define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) #define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING #define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif #define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) #define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT #define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 -#endif -#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) -#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 -#endif #define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) uint32_t modem_clock_get_module_deps(shared_periph_module_t module) @@ -51,35 +30,21 @@ uint32_t modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_WIFI_SUPPORTED case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif default: assert(0); } return deps; } -#if SOC_WIFI_SUPPORTED static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) { if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); -#endif modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); } } @@ -107,9 +72,7 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_ return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_WIFI_SUPPORTED -#if SOC_BT_SUPPORTED static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); @@ -127,9 +90,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_ return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) { if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { @@ -155,9 +116,7 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_cont return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); @@ -173,9 +132,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_cont return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED -#if SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); @@ -191,7 +148,6 @@ static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_c return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) { @@ -208,7 +164,6 @@ static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) { if (enable) { @@ -217,7 +172,6 @@ static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ct ANALOG_CLOCK_DISABLE(); } } -#endif static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) { @@ -246,12 +200,10 @@ static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) { return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; } -#endif static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) { @@ -283,15 +235,12 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] , .check_enable = modem_clock_coex_check_enable #endif }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_i2c_master_check_enable -#endif }, #endif -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_wifi_apb_check_enable @@ -302,17 +251,13 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] , .check_enable = modem_clock_wifi_bb_44m_check_enable #endif }, -#endif -#if SOC_WIFI_SUPPORTED [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_wifi_mac_check_enable -#endif }, [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_wifi_bb_check_enable -#endif }, #endif [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure @@ -320,27 +265,21 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] , .check_enable = modem_clock_etm_check_enable #endif }, -#if SOC_BT_SUPPORTED [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ble_mac_check_enable #endif }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ble_i154_bb_check_enable #endif }, -#endif -#if SOC_IEEE802154_SUPPORTED [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ieee802154_mac_check_enable #endif }, -#endif [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_data_dump_check_enable @@ -348,7 +287,6 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] } }; -#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, @@ -361,4 +299,3 @@ const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [MODEM_CLOCK_DOMAIN_COEX] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_WIFIPWR] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, }; -#endif diff --git a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c index 9438b29a26e..de86e9def67 100644 --- a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c @@ -11,37 +11,16 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) -#else #define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) -#endif #define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) #define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) #define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING #define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif #define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) #define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#else #define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 -#endif -#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) -#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 -#endif #define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) uint32_t modem_clock_get_module_deps(shared_periph_module_t module) @@ -51,35 +30,22 @@ uint32_t modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_WIFI_SUPPORTED case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif default: assert(0); } return deps; } -#if SOC_WIFI_SUPPORTED static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) { if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); -#endif modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); } } @@ -107,9 +73,7 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_ return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_WIFI_SUPPORTED -#if SOC_BT_SUPPORTED static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); @@ -127,37 +91,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_ return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { - modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); - } -} - -static void IRAM_ATTR modem_clock_wifi_bb_44m_configure(modem_clock_context_t *ctx, bool enable) -{ - if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { - modem_syscon_ll_enable_wifibb_44m_clock(ctx->hal->syscon_dev, enable); - } -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_wifi_apb_check_enable(modem_clock_context_t *ctx) -{ - return modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; -} - -static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_context_t *ctx) -{ - return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; -} -#endif -#endif - -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); @@ -173,9 +107,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_cont return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED -#if SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); @@ -191,7 +123,6 @@ static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_c return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) { @@ -208,7 +139,6 @@ static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) { if (enable) { @@ -217,7 +147,6 @@ static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ct ANALOG_CLOCK_DISABLE(); } } -#endif static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) { @@ -246,12 +175,10 @@ static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) { return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; } -#endif static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) { @@ -283,27 +210,12 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] , .check_enable = modem_clock_coex_check_enable #endif }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_i2c_master_check_enable #endif }, -#endif -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_apb_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_bb_44m_check_enable -#endif - }, -#endif -#if SOC_WIFI_SUPPORTED [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_wifi_mac_check_enable @@ -314,33 +226,26 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] , .check_enable = modem_clock_wifi_bb_check_enable #endif }, -#endif [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_etm_check_enable #endif }, -#if SOC_BT_SUPPORTED [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ble_mac_check_enable #endif }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ble_i154_bb_check_enable #endif }, -#endif -#if SOC_IEEE802154_SUPPORTED [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ieee802154_mac_check_enable #endif }, -#endif [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_data_dump_check_enable @@ -348,8 +253,7 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] } }; -#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG -static const DRAM_ATTR uint32_t s_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { +const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { [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, @@ -361,9 +265,7 @@ static const DRAM_ATTR uint32_t s_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = [MODEM_CLOCK_DOMAIN_COEX] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, [MODEM_CLOCK_DOMAIN_WIFIPWR] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, }; -#endif -#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND static esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_context_t *ctx, modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) { if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { @@ -411,4 +313,3 @@ void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool sele } } } -#endif // #if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND diff --git a/components/esp_hw_support/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/port/esp32h2/modem_clock_impl.c index 85a930f434a..9a793444181 100644 --- a/components/esp_hw_support/port/esp32h2/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32h2/modem_clock_impl.c @@ -17,30 +17,12 @@ #define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) #define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) #define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING #define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif #define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) #define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS #define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 -#endif -#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) -#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 -#endif #define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) uint32_t modem_clock_get_module_deps(shared_periph_module_t module) @@ -50,26 +32,17 @@ uint32_t modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif default: assert(0); } return deps; } -#if SOC_BT_SUPPORTED static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); @@ -87,9 +60,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_ return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); @@ -105,9 +76,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_cont return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED -#if SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); @@ -123,7 +92,6 @@ static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_c return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) { @@ -140,7 +108,6 @@ static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) { if (enable) { @@ -149,7 +116,6 @@ static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ct ANALOG_CLOCK_DISABLE(); } } -#endif static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) { @@ -178,12 +144,10 @@ static esp_err_t IRAM_ATTR modem_clock_modem_private_fe_check_enable(modem_clock return modem_clock_hal_modem_private_fe_clock_is_enabled(ctx->hal) ? ESP_OK : ESP_FAIL; } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static esp_err_t IRAM_ATTR modem_clock_i2c_master_check_enable(modem_clock_context_t *ctx) { return ANALOG_CLOCK_IS_ENABLED() ? ESP_OK : ESP_FAIL; } -#endif static esp_err_t IRAM_ATTR modem_clock_etm_check_enable(modem_clock_context_t *ctx) { @@ -215,40 +179,32 @@ DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] , .check_enable = modem_clock_coex_check_enable #endif }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_i2c_master_check_enable #endif }, -#endif [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_etm_check_enable #endif }, -#if SOC_BT_SUPPORTED [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ble_mac_check_enable #endif }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ble_i154_bb_check_enable #endif }, -#endif -#if SOC_IEEE802154_SUPPORTED [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_ieee802154_mac_check_enable #endif }, -#endif [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING , .check_enable = modem_clock_data_dump_check_enable From fbc3d94f8e1535c35850bed354cdfda940afe68e Mon Sep 17 00:00:00 2001 From: hebinglin Date: Fri, 16 Jan 2026 14:23:30 +0800 Subject: [PATCH 05/11] change(esp_hw_support): workaround for esp32h4 modem clock before bt supported --- components/hal/esp32h4/modem_clock_hal.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/components/hal/esp32h4/modem_clock_hal.c b/components/hal/esp32h4/modem_clock_hal.c index 22f95a195db..35e7e865558 100644 --- a/components/hal/esp32h4/modem_clock_hal.c +++ b/components/hal/esp32h4/modem_clock_hal.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -30,9 +30,10 @@ void IRAM_ATTR modem_clock_hal_set_clock_domain_icg_bitmap(modem_clock_hal_conte case MODEM_CLOCK_DOMAIN_MODEM_PERIPH: modem_syscon_ll_set_modem_periph_icg_bitmap(hal->syscon_dev, bitmap); break; - case MODEM_CLOCK_DOMAIN_BT: - modem_syscon_ll_set_bt_icg_bitmap(hal->syscon_dev, bitmap); - break; + // TODO: PM-636 + // case MODEM_CLOCK_DOMAIN_BT: + // modem_syscon_ll_set_bt_icg_bitmap(hal->syscon_dev, bitmap); + // break; case MODEM_CLOCK_DOMAIN_MODEM_FE: modem_syscon_ll_set_fe_icg_bitmap(hal->syscon_dev, bitmap); break; @@ -65,9 +66,10 @@ uint32_t IRAM_ATTR modem_clock_hal_get_clock_domain_icg_bitmap(modem_clock_hal_c case MODEM_CLOCK_DOMAIN_MODEM_PERIPH: bitmap = modem_syscon_ll_get_modem_periph_icg_bitmap(hal->syscon_dev); break; - case MODEM_CLOCK_DOMAIN_BT: - bitmap = modem_syscon_ll_get_bt_icg_bitmap(hal->syscon_dev); - break; + // TODO: PM-636 + // case MODEM_CLOCK_DOMAIN_BT: + // bitmap = modem_syscon_ll_get_bt_icg_bitmap(hal->syscon_dev); + // break; case MODEM_CLOCK_DOMAIN_MODEM_FE: bitmap = modem_syscon_ll_get_fe_icg_bitmap(hal->syscon_dev); break; From c282040d0efd87d394dc3cf9647f2ad12184bcd6 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Fri, 16 Jan 2026 18:17:00 +0800 Subject: [PATCH 06/11] change(esp_hw_support): add modem clock bit operation defs for related clocks --- .../include/esp_private/esp_modem_clock.h | 23 ++++++++++++ .../port/esp32c5/modem_clock_impl.c | 24 ++++++------- .../port/esp32c6/modem_clock_impl.c | 24 ++++++------- .../port/esp32c61/modem_clock_impl.c | 36 +++++++++---------- .../port/esp32h2/modem_clock_impl.c | 22 ++++++------ .../port/esp32h21/modem_clock_impl.c | 34 +++++++++--------- .../port/esp32h4/modem_clock_impl.c | 34 +++++++++--------- 7 files changed, 110 insertions(+), 87 deletions(-) diff --git a/components/esp_hw_support/include/esp_private/esp_modem_clock.h b/components/esp_hw_support/include/esp_private/esp_modem_clock.h index d84129b5a0f..8de079ecb6f 100644 --- a/components/esp_hw_support/include/esp_private/esp_modem_clock.h +++ b/components/esp_hw_support/include/esp_private/esp_modem_clock.h @@ -16,6 +16,7 @@ #include "hal/modem_clock_types.h" #include "esp_private/esp_pmu.h" #include "esp_private/critical_section.h" +#include "esp_macros.h" #if SOC_MODEM_CLOCK_SUPPORTED #include "hal/modem_clock_hal.h" @@ -57,6 +58,28 @@ typedef enum { MODEM_CLOCK_DEVICE_MAX } modem_clock_device_t; +#define MODEM_CLOCK(dev) BIT(MODEM_CLOCK_##dev) + +#define MODEM_CLOCKS_1(a) MODEM_CLOCK(a) +#define MODEM_CLOCKS_2(a, b) MODEM_CLOCK(a) | MODEM_CLOCK(b) +#define MODEM_CLOCKS_3(a, b, c) MODEM_CLOCK(a) | MODEM_CLOCKS_2(b, c) +#define MODEM_CLOCKS_4(a, b, c, d) MODEM_CLOCK(a) | MODEM_CLOCKS_3(b, c, d) +#define MODEM_CLOCKS_5(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_1(__VA_ARGS__) +#define MODEM_CLOCKS_6(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_2(__VA_ARGS__) +#define MODEM_CLOCKS_7(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_3(__VA_ARGS__) +#define MODEM_CLOCKS_8(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_4(__VA_ARGS__) +#define MODEM_CLOCKS_9(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_5(__VA_ARGS__) +#define MODEM_CLOCKS_10(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_6(__VA_ARGS__) +#define MODEM_CLOCKS_11(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_7(__VA_ARGS__) +#define MODEM_CLOCKS_12(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_8(__VA_ARGS__) +#define MODEM_CLOCKS_13(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_9(__VA_ARGS__) +#define MODEM_CLOCKS_14(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_10(__VA_ARGS__) + +#define MODEM_CLOCKS_N(n) MODEM_CLOCKS_##n +#define MODEM_CLOCKS_DISPATCH(n, ...) MODEM_CLOCKS_N(n)(__VA_ARGS__) +#define MODEM_CLOCKS(...) \ + MODEM_CLOCKS_DISPATCH(ESP_VA_NARG(__VA_ARGS__), __VA_ARGS__) + #define MODEM_STATUS_IDLE (0) #define MODEM_STATUS_WIFI_INITED (0x1UL) diff --git a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c index bcb965d0d20..30c51371874 100644 --- a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c5/modem_clock_impl.c @@ -11,19 +11,19 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) +#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_APB, WIFI_BB, WIFI_BB_44M, COEXIST ) ) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) +#define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) +#define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) -uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) { uint32_t deps = 0; switch (module) { diff --git a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c index de86e9def67..7b8a2572505 100644 --- a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c6/modem_clock_impl.c @@ -11,19 +11,19 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) +#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_BB, COEXIST ) ) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) +#define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) +#define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) -uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) { uint32_t deps = 0; switch (module) { diff --git a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c index a960d95bfcf..5eca8a62f7c 100644 --- a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32c61/modem_clock_impl.c @@ -12,39 +12,39 @@ /* Clock dependency definitions */ #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_COEXIST)) +#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_APB, WIFI_BB, WIFI_BB_44M, COEXIST ) ) #else -#define WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_MAC) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_COEXIST)) +#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_BB, COEXIST ) ) #endif -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) #if ANA_I2C_MST_CLK_HAS_ROOT_GATING -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) #else -#define I2C_ANA_MST_CLOCK_DEPS (0) +#define I2C_ANA_MST_CLOCK_DEPS (0) #endif -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) #else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) #endif #ifndef SOC_WIFI_SUPPORTED #undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) #endif #if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) #undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( 0 ) #endif -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) +#define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) -uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) { uint32_t deps = 0; switch (module) { diff --git a/components/esp_hw_support/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/port/esp32h2/modem_clock_impl.c index 9a793444181..ca8260df81c 100644 --- a/components/esp_hw_support/port/esp32h2/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32h2/modem_clock_impl.c @@ -14,18 +14,18 @@ #endif // CONFIG_IDF_TARGET_ESP32H2 /* Clock dependency definitions */ -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) +#define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) +#define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) -uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) { uint32_t deps = 0; switch (module) { diff --git a/components/esp_hw_support/port/esp32h21/modem_clock_impl.c b/components/esp_hw_support/port/esp32h21/modem_clock_impl.c index 232e5a16b60..b754ff7c477 100644 --- a/components/esp_hw_support/port/esp32h21/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32h21/modem_clock_impl.c @@ -11,36 +11,36 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) #if ANA_I2C_MST_CLK_HAS_ROOT_GATING -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) #else -#define I2C_ANA_MST_CLOCK_DEPS (0) +#define I2C_ANA_MST_CLOCK_DEPS (0) #endif -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#define PHY_CALIBRATION_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) #else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) #endif #ifndef SOC_WIFI_SUPPORTED #undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) #endif #if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) #undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( 0 ) #endif -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) +#define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) -uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) { uint32_t deps = 0; switch (module) { diff --git a/components/esp_hw_support/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/port/esp32h4/modem_clock_impl.c index 1f0b1ea59f3..caf2f6b59c9 100644 --- a/components/esp_hw_support/port/esp32h4/modem_clock_impl.c +++ b/components/esp_hw_support/port/esp32h4/modem_clock_impl.c @@ -11,36 +11,36 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#define BLE_CLOCK_DEPS (BIT(MODEM_CLOCK_BLE_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define IEEE802154_CLOCK_DEPS (BIT(MODEM_CLOCK_802154_MAC) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB) | BIT(MODEM_CLOCK_ETM) | BIT(MODEM_CLOCK_COEXIST)) -#define COEXIST_CLOCK_DEPS (BIT(MODEM_CLOCK_COEXIST)) +#define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) +#define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) #if ANA_I2C_MST_CLK_HAS_ROOT_GATING -#define I2C_ANA_MST_CLOCK_DEPS (BIT(MODEM_CLOCK_I2C_MASTER)) +#define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) #else -#define I2C_ANA_MST_CLOCK_DEPS (0) +#define I2C_ANA_MST_CLOCK_DEPS (0) #endif -#define PHY_CLOCK_DEPS (I2C_ANA_MST_CLOCK_DEPS | BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE) | BIT(MODEM_CLOCK_MODEM_PRIVATE_FE)) -#define MODEM_ETM_CLOCK_DEPS (BIT(MODEM_CLOCK_ETM)) -#define MODEM_ADC_COMMON_FE_CLOCK_DEPS (BIT(MODEM_CLOCK_MODEM_ADC_COMMON_FE)) +#define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) +#define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) +#define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) #if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB) | BIT(MODEM_CLOCK_WIFI_BB_44M)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_APB) | BIT(MODEM_CLOCK_WIFI_BB_44M) | BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#define PHY_CALIBRATION_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) #else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS (BIT(MODEM_CLOCK_WIFI_BB)) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS (BIT(MODEM_CLOCK_BT_I154_COMMON_BB)) +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) #endif #ifndef SOC_WIFI_SUPPORTED #undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS 0 +#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) #endif #if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) #undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS 0 +#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( 0 ) #endif -#define PHY_CALIBRATION_CLOCK_DEPS (PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS) +#define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) -uint32_t modem_clock_get_module_deps(shared_periph_module_t module) +uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) { uint32_t deps = 0; switch (module) { From 5119bf8ac2ae144476eeb98fb8cf4716bf595c84 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Wed, 21 Jan 2026 20:31:19 +0800 Subject: [PATCH 07/11] change(esp_hw_support): move modem_clock files to modem folder --- .gitlab/CODEOWNERS | 1 + components/esp_hw_support/CMakeLists.txt | 8 +------- .../esp_hw_support/modem/CMakeLists.txt | 20 +++++++++++++++++++ .../esp_hw_support/{ => modem}/modem_clock.c | 0 .../port/esp32c5/modem_clock_impl.c | 0 .../port/esp32c6/modem_clock_impl.c | 0 .../port/esp32c61/modem_clock_impl.c | 0 .../port/esp32h2/modem_clock_impl.c | 0 .../port/esp32h21/modem_clock_impl.c | 0 .../port/esp32h4/modem_clock_impl.c | 0 .../port/esp32c5/CMakeLists.txt | 4 ---- .../port/esp32c6/CMakeLists.txt | 4 ---- .../port/esp32c61/CMakeLists.txt | 4 ---- .../port/esp32h2/CMakeLists.txt | 4 ---- .../port/esp32h21/CMakeLists.txt | 4 ---- .../port/esp32h4/CMakeLists.txt | 4 ---- 16 files changed, 22 insertions(+), 31 deletions(-) create mode 100644 components/esp_hw_support/modem/CMakeLists.txt rename components/esp_hw_support/{ => modem}/modem_clock.c (100%) rename components/esp_hw_support/{ => modem}/port/esp32c5/modem_clock_impl.c (100%) rename components/esp_hw_support/{ => modem}/port/esp32c6/modem_clock_impl.c (100%) rename components/esp_hw_support/{ => modem}/port/esp32c61/modem_clock_impl.c (100%) rename components/esp_hw_support/{ => modem}/port/esp32h2/modem_clock_impl.c (100%) rename components/esp_hw_support/{ => modem}/port/esp32h21/modem_clock_impl.c (100%) rename components/esp_hw_support/{ => modem}/port/esp32h4/modem_clock_impl.c (100%) diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index d555c90e38d..4867755f0aa 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -106,6 +106,7 @@ /components/esp_https_server/ @esp-idf-codeowners/app-utilities /components/esp_hw_support/ @esp-idf-codeowners/system @esp-idf-codeowners/peripherals /components/esp_hw_support/lowpower/ @esp-idf-codeowners/power-management +/components/esp_hw_support/modem/ @esp-idf-codeowners/power-management /components/esp_hw_support/usb_phy/ @esp-idf-codeowners/peripherals/usb /components/esp_lcd/ @esp-idf-codeowners/peripherals /components/esp_libc/ @esp-idf-codeowners/system @esp-idf-codeowners/toolchain diff --git a/components/esp_hw_support/CMakeLists.txt b/components/esp_hw_support/CMakeLists.txt index dd2e94454f2..3d205ec4b99 100644 --- a/components/esp_hw_support/CMakeLists.txt +++ b/components/esp_hw_support/CMakeLists.txt @@ -49,9 +49,6 @@ if(NOT non_os_build) if(CONFIG_SOC_PAU_SUPPORTED) list(APPEND srcs "sleep_retention.c") endif() - if(CONFIG_SOC_MODEM_SUPPORT_ETM) - list(APPEND srcs "modem/modem_etm.c") - endif() if(CONFIG_SOC_PMU_SUPPORTED) list(APPEND srcs "pmu_share_hw.c") endif() @@ -107,10 +104,6 @@ if(NOT non_os_build) "port/regdma_link.c") endif() - if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock.c") - endif() - if(NOT CONFIG_APP_BUILD_TYPE_PURE_RAM_APP) list(APPEND srcs "mspi/mspi_timing_tuning/mspi_timing_tuning.c") if(CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY AND NOT CONFIG_IDF_TARGET_ESP32S3) @@ -205,6 +198,7 @@ if(CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING) add_subdirectory(mspi/mspi_timing_tuning/port/${target}) endif() add_subdirectory(lowpower) +add_subdirectory(modem) if(CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND OR CONFIG_PM_SLP_DISABLE_GPIO) target_link_libraries(${COMPONENT_LIB} INTERFACE "-u esp_sleep_gpio_include") diff --git a/components/esp_hw_support/modem/CMakeLists.txt b/components/esp_hw_support/modem/CMakeLists.txt new file mode 100644 index 00000000000..684df345ef5 --- /dev/null +++ b/components/esp_hw_support/modem/CMakeLists.txt @@ -0,0 +1,20 @@ +idf_build_get_property(target IDF_TARGET) +idf_build_get_property(non_os_build NON_OS_BUILD) + +if(non_os_build OR NOT CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + return() +endif() + +set(srcs) + +if(CONFIG_SOC_MODEM_SUPPORT_ETM) + list(APPEND srcs "modem_etm.c") +endif() + +if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) + list(APPEND srcs "modem_clock.c") + list(APPEND srcs "port/${target}/modem_clock_impl.c") +endif() + +add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") +target_sources(${COMPONENT_LIB} PRIVATE "${srcs}") diff --git a/components/esp_hw_support/modem_clock.c b/components/esp_hw_support/modem/modem_clock.c similarity index 100% rename from components/esp_hw_support/modem_clock.c rename to components/esp_hw_support/modem/modem_clock.c diff --git a/components/esp_hw_support/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c similarity index 100% rename from components/esp_hw_support/port/esp32c5/modem_clock_impl.c rename to components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c diff --git a/components/esp_hw_support/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c similarity index 100% rename from components/esp_hw_support/port/esp32c6/modem_clock_impl.c rename to components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c diff --git a/components/esp_hw_support/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c similarity index 100% rename from components/esp_hw_support/port/esp32c61/modem_clock_impl.c rename to components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c diff --git a/components/esp_hw_support/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c similarity index 100% rename from components/esp_hw_support/port/esp32h2/modem_clock_impl.c rename to components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c diff --git a/components/esp_hw_support/port/esp32h21/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c similarity index 100% rename from components/esp_hw_support/port/esp32h21/modem_clock_impl.c rename to components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c diff --git a/components/esp_hw_support/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c similarity index 100% rename from components/esp_hw_support/port/esp32h4/modem_clock_impl.c rename to components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c diff --git a/components/esp_hw_support/port/esp32c5/CMakeLists.txt b/components/esp_hw_support/port/esp32c5/CMakeLists.txt index 421a560c927..b27e92b99c7 100644 --- a/components/esp_hw_support/port/esp32c5/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c5/CMakeLists.txt @@ -12,10 +12,6 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") - - if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock_impl.c") - endif() endif() if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) diff --git a/components/esp_hw_support/port/esp32c6/CMakeLists.txt b/components/esp_hw_support/port/esp32c6/CMakeLists.txt index 00f0244cc6d..33715e7cb52 100644 --- a/components/esp_hw_support/port/esp32c6/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c6/CMakeLists.txt @@ -12,10 +12,6 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") - - if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock_impl.c") - endif() endif() if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) diff --git a/components/esp_hw_support/port/esp32c61/CMakeLists.txt b/components/esp_hw_support/port/esp32c61/CMakeLists.txt index 00f0244cc6d..33715e7cb52 100644 --- a/components/esp_hw_support/port/esp32c61/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32c61/CMakeLists.txt @@ -12,10 +12,6 @@ set(srcs "rtc_clk_init.c" if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") - - if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock_impl.c") - endif() endif() if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT) diff --git a/components/esp_hw_support/port/esp32h2/CMakeLists.txt b/components/esp_hw_support/port/esp32h2/CMakeLists.txt index 2c8e46e850a..0be7eb5dd9e 100644 --- a/components/esp_hw_support/port/esp32h2/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h2/CMakeLists.txt @@ -13,10 +13,6 @@ if(NOT non_os_build) list(APPEND srcs "sar_periph_ctrl.c") endif() -if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock_impl.c") -endif() - add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") target_sources(${COMPONENT_LIB} PRIVATE "${srcs}") diff --git a/components/esp_hw_support/port/esp32h21/CMakeLists.txt b/components/esp_hw_support/port/esp32h21/CMakeLists.txt index 22415c710f9..9f9db291e3c 100644 --- a/components/esp_hw_support/port/esp32h21/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h21/CMakeLists.txt @@ -11,10 +11,6 @@ if(CONFIG_SOC_PMU_SUPPORTED) ) endif() -if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock_impl.c") -endif() - add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") target_sources(${COMPONENT_LIB} PRIVATE "${srcs}") diff --git a/components/esp_hw_support/port/esp32h4/CMakeLists.txt b/components/esp_hw_support/port/esp32h4/CMakeLists.txt index 377d5d38c48..8c824225ecf 100644 --- a/components/esp_hw_support/port/esp32h4/CMakeLists.txt +++ b/components/esp_hw_support/port/esp32h4/CMakeLists.txt @@ -14,10 +14,6 @@ endif() if(NOT BOOTLOADER_BUILD) # list(APPEND srcs "sar_periph_ctrl.c") // TODO: [ESP32H4] IDF-12368 - - if(CONFIG_SOC_MODEM_CLOCK_SUPPORTED) - list(APPEND srcs "modem_clock_impl.c") - endif() endif() add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") From 5049fb6a494259898fa3144d3db2b073e90c5958 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Wed, 21 Jan 2026 20:47:18 +0800 Subject: [PATCH 08/11] change(esp_hw_support): optimize modem clock configure size --- .../include/esp_private/esp_modem_clock.h | 54 ++-- components/esp_hw_support/modem/modem_clock.c | 65 ++--- .../modem/port/esp32c5/modem_clock_impl.c | 158 ++++++------ .../modem/port/esp32c6/modem_clock_impl.c | 149 +++++------ .../modem/port/esp32c61/modem_clock_impl.c | 232 ++++++------------ .../modem/port/esp32h2/modem_clock_impl.c | 106 ++++---- .../modem/port/esp32h21/modem_clock_impl.c | 227 ++++++++--------- .../modem/port/esp32h4/modem_clock_impl.c | 199 +++++++-------- 8 files changed, 521 insertions(+), 669 deletions(-) diff --git a/components/esp_hw_support/include/esp_private/esp_modem_clock.h b/components/esp_hw_support/include/esp_private/esp_modem_clock.h index 8de079ecb6f..aabab22d1b1 100644 --- a/components/esp_hw_support/include/esp_private/esp_modem_clock.h +++ b/components/esp_hw_support/include/esp_private/esp_modem_clock.h @@ -17,6 +17,7 @@ #include "esp_private/esp_pmu.h" #include "esp_private/critical_section.h" #include "esp_macros.h" +#include "hal/regi2c_ctrl_ll.h" #if SOC_MODEM_CLOCK_SUPPORTED #include "hal/modem_clock_hal.h" @@ -30,7 +31,8 @@ extern "C" { // Please define the frequently called modules in the low bit, // which will improve the execution efficiency typedef enum { - MODEM_CLOCK_MODEM_ADC_COMMON_FE, + MODEM_CLOCK_DEVICE_MIN = 0, + MODEM_CLOCK_MODEM_ADC_COMMON_FE = MODEM_CLOCK_DEVICE_MIN, MODEM_CLOCK_MODEM_PRIVATE_FE, MODEM_CLOCK_COEXIST, #if ANA_I2C_MST_CLK_HAS_ROOT_GATING @@ -83,24 +85,31 @@ typedef enum { #define MODEM_STATUS_IDLE (0) #define MODEM_STATUS_WIFI_INITED (0x1UL) -struct modem_clock_context; - -typedef struct { - int16_t refs; /* Reference count for this device, if with_refcnt is enabled */ - uint16_t with_refcnt : 1; /* Enable reference count management (true=use refs, false=ignore refs) */ - uint16_t reserved : 15; /* reserved for 15 bits aligned */ - void (*configure)(struct modem_clock_context *, bool); +typedef struct modem_clock_context modem_clock_context_t; +typedef void (*wrapper_t)(struct modem_clock_context *, bool, void (*action)(struct modem_clock_context *, bool), int16_t *, uint16_t *); +typedef void (*configure_func_t)(struct modem_clock_context *, int, bool, wrapper_t); #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - esp_err_t (*check_enable)(struct modem_clock_context *); +typedef esp_err_t (*check_func_t)(struct modem_clock_context *, int); +#endif + +#define REFS_FL_WITH_REFCNT (BIT(0)) /* Enable reference count management (true=use refs, false=ignore refs) */ +typedef struct { + struct { + int16_t count; /* Reference count for this device, if with_refcnt is enabled */ + uint16_t flags; /* Flags for this device */ + } refs[MODEM_CLOCK_DEVICE_MAX]; + configure_func_t configure; +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + check_func_t check; #endif } modem_clock_device_context_t; typedef struct modem_clock_context { - modem_clock_hal_context_t *hal; - spinlock_t lock; - modem_clock_device_context_t *dev; + modem_clock_hal_context_t *hal; + spinlock_t lock; + modem_clock_device_context_t *dev; #if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG - const uint8_t *initial_gating_mode; + uint8_t *icg_config; #endif /* the low-power clock source for each module */ modem_clock_lpclk_src_t lpclk_src[PERIPH_MODEM_MODULE_NUM]; @@ -118,23 +127,24 @@ typedef struct modem_clock_context { uint32_t modem_clock_get_module_deps(shared_periph_module_t module); /** - * @brief Modem clock device context array - * Each chip defines this array in its port file + * @brief Get modem clock device context + * Each chip implements this function in its port file + * @return Pointer to the modem clock device context */ -extern modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX]; +modem_clock_device_context_t *modem_clock_device_context(void); #if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG /** - * @brief Initial gating mode for each clock domain - * Each chip defines this array in its port file + * @brief Get initial gating configuration for each clock domain + * @return Pointer to the initial gating configuration array */ -extern const uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX]; +uint8_t *modem_clock_domain_icg_config(void); /* the ICG code's bit 0, 1 and 2 indicates the ICG state * of pmu SLEEP, MODEM and ACTIVE mode respectively */ - #define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) - #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)) +#define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) +#define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) #endif // SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG #endif // SOC_MODEM_CLOCK_SUPPORTED diff --git a/components/esp_hw_support/modem/modem_clock.c b/components/esp_hw_support/modem/modem_clock.c index a229f925c50..149f948e819 100644 --- a/components/esp_hw_support/modem/modem_clock.c +++ b/components/esp_hw_support/modem/modem_clock.c @@ -27,16 +27,23 @@ modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(voi static DRAM_ATTR modem_clock_hal_context_t modem_clock_hal = { .syscon_dev = NULL, .lpcon_dev = NULL }; static DRAM_ATTR modem_clock_context_t modem_clock_context = { .hal = &modem_clock_hal, .lock = SPINLOCK_INITIALIZER, - .dev = g_modem_clock_dev, + .dev = NULL, #if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG - .initial_gating_mode = g_initial_gating_mode, + .icg_config = NULL, +#endif +#if SOC_WIFI_SUPPORTED + .modem_status = MODEM_STATUS_IDLE, #endif .lpclk_src = { [0 ... PERIPH_MODEM_MODULE_NUM - 1] = MODEM_CLOCK_LPCLK_SRC_INVALID } -#if SOC_WIFI_SUPPORTED - , - .modem_status = MODEM_STATUS_IDLE -#endif }; + if (modem_clock_context.dev == NULL) { + modem_clock_context.dev = modem_clock_device_context(); + } +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG + if (modem_clock_context.icg_config == NULL) { + modem_clock_context.icg_config = modem_clock_domain_icg_config(); + } +#endif if (modem_clock_hal.syscon_dev == NULL || modem_clock_hal.lpcon_dev == NULL) { modem_clock_hal.syscon_dev = &MODEM_SYSCON; modem_clock_hal.lpcon_dev = &MODEM_LPCON; @@ -47,39 +54,33 @@ modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(voi return &modem_clock_context; } -static void IRAM_ATTR modem_clock_device_enable(modem_clock_context_t *ctx, uint32_t dev_map) +static IRAM_ATTR void config_wrapper(struct modem_clock_context *ctx, bool enable, void (*action)(struct modem_clock_context *, bool), + int16_t *refcnt, uint16_t *flags) { int16_t refs = 0; - esp_os_enter_critical_safe(&ctx->lock); - for (int i = 0; dev_map; dev_map >>= 1, i++) { - if (dev_map & BIT(0)) { - refs = ctx->dev[i].with_refcnt ? ctx->dev[i].refs++ : refs; - if (refs == 0 || !ctx->dev[i].with_refcnt) { - (*ctx->dev[i].configure)(ctx, true); - } -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - if (ctx->dev[i].check_enable) { - ESP_ERROR_CHECK((*ctx->dev[i].check_enable)(ctx)); - } -#endif - } + bool with_refcnt = (*flags) & REFS_FL_WITH_REFCNT; + if (enable) { + refs = with_refcnt ? (*refcnt)++ : refs; + } else { + refs = with_refcnt ? --(*refcnt) : refs; } - esp_os_exit_critical_safe(&ctx->lock); + if (refs == 0 || !with_refcnt) { + (*action)(ctx, enable); + } + assert(refs >= 0); } -static void IRAM_ATTR modem_clock_device_disable(modem_clock_context_t *ctx, uint32_t dev_map) +static IRAM_ATTR void modem_clock_device_control(modem_clock_context_t *ctx, uint32_t dev_map, bool enable) { - int16_t refs = 0; esp_os_enter_critical_safe(&ctx->lock); for (int i = 0; dev_map; dev_map >>= 1, i++) { if (dev_map & BIT(0)) { - refs = ctx->dev[i].with_refcnt ? --ctx->dev[i].refs : refs; - if (refs == 0 || !ctx->dev[i].with_refcnt) { - (*ctx->dev[i].configure)(ctx, false); - } - if (ctx->dev[i].with_refcnt) { - assert(refs >= 0); + ctx->dev->configure(ctx, i, enable, config_wrapper); +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + if (enable && ctx->dev->check) { + ESP_ERROR_CHECK((*ctx->dev->check)(ctx, i)); } +#endif } } esp_os_exit_critical_safe(&ctx->lock); @@ -122,7 +123,7 @@ static IRAM_ATTR void modem_clock_module_icg_map_init_all(void) esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); for (int domain = 0; domain < MODEM_CLOCK_DOMAIN_MAX; domain++) { uint32_t code = modem_clock_hal_get_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain); - modem_clock_hal_set_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain, MODEM_CLOCK_instance()->initial_gating_mode[domain] | code); + modem_clock_hal_set_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain, MODEM_CLOCK_instance()->icg_config[domain] | code); #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING assert((modem_clock_hal_get_clock_domain_icg_bitmap(MODEM_CLOCK_instance()->hal, domain) & code) == code); #endif @@ -138,14 +139,14 @@ void IRAM_ATTR modem_clock_module_enable(shared_periph_module_t module) modem_clock_module_icg_map_init_all(); #endif uint32_t deps = modem_clock_get_module_deps(module); - modem_clock_device_enable(MODEM_CLOCK_instance(), deps); + modem_clock_device_control(MODEM_CLOCK_instance(), deps, true); } void IRAM_ATTR modem_clock_module_disable(shared_periph_module_t module) { assert(IS_MODEM_MODULE(module)); uint32_t deps = modem_clock_get_module_deps(module); - modem_clock_device_disable(MODEM_CLOCK_instance(), deps); + modem_clock_device_control(MODEM_CLOCK_instance(), deps, false); } uint32_t IRAM_ATTR modem_clock_module_bits_get(shared_periph_module_t module) diff --git a/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c index 30c51371874..40f2ae4c509 100644 --- a/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c @@ -60,9 +60,6 @@ static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) { bool all_clock_enabled = true; -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); -#endif all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); return all_clock_enabled ? ESP_OK : ESP_FAIL; } @@ -219,83 +216,80 @@ static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_contex } #endif -DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_adc_common_fe_check_enable -#endif - }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_private_fe_check_enable -#endif - }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_coex_check_enable -#endif - }, -// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_i2c_master_check_enable - }, -#endif - [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_apb_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_bb_44m_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_mac_check_enable - }, - [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_bb_check_enable - }, -#endif - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_etm_check_enable -#endif - }, - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_mac_check_enable -#endif - }, - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_i154_bb_check_enable -#endif - }, - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ieee802154_mac_check_enable -#endif - }, - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_data_dump_check_enable -#endif - } -}; +static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int dev_id, bool enable, wrapper_t wrapper) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); -const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { - [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, - [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, - [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, - [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, -}; + void (*action)(struct modem_clock_context *, bool) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure + : (dev_id == MODEM_CLOCK_WIFI_APB) ? modem_clock_wifi_apb_configure + : (dev_id == MODEM_CLOCK_WIFI_BB_44M) ? modem_clock_wifi_bb_44m_configure + : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_configure + : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_configure + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_configure + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure + : NULL); + assert(action != NULL); + (*wrapper)(ctx, enable, action, &ctx->dev->refs[dev_id].count, &ctx->dev->refs[dev_id].flags); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, int dev_id) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + esp_err_t (*check_action)(struct modem_clock_context *) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable + : (dev_id == MODEM_CLOCK_WIFI_APB) ? modem_clock_wifi_apb_check_enable + : (dev_id == MODEM_CLOCK_WIFI_BB_44M) ? modem_clock_wifi_bb_44m_check_enable + : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_check_enable + : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_check_enable + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable + : NULL); + assert(check_action != NULL); + return (*check_action)(ctx); +} +#endif + +IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) +{ + static DRAM_ATTR modem_clock_device_context_t dev = { + .refs = { [0 ... MODEM_CLOCK_DEVICE_MAX - 1] = { .count = 0, .flags = 0 | REFS_FL_WITH_REFCNT } }, + .configure = modem_clock_configure_impl, +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + .check = modem_clock_check_impl, +#endif + }; + dev.refs[MODEM_CLOCK_I2C_MASTER].flags &= ~REFS_FL_WITH_REFCNT; + return &dev; +} + +IRAM_ATTR uint8_t *modem_clock_domain_icg_config(void) +{ + static DRAM_ATTR uint8_t icg_config_default[MODEM_CLOCK_DOMAIN_MAX] = { + [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, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + [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, + }; + return icg_config_default; +} diff --git a/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c index 7b8a2572505..945ba5c62c4 100644 --- a/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c @@ -7,6 +7,8 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc_caps.h" +#include "hal/efuse_hal.h" +#include "esp_private/esp_sleep_internal.h" #include "esp_private/esp_modem_clock.h" #include "esp_private/regi2c_ctrl.h" @@ -61,9 +63,7 @@ static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) { bool all_clock_enabled = true; -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); -#endif all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); return all_clock_enabled ? ESP_OK : ESP_FAIL; } @@ -194,77 +194,79 @@ static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_contex } #endif -DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_adc_common_fe_check_enable -#endif - }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_private_fe_check_enable -#endif - }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_coex_check_enable -#endif - }, -// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_i2c_master_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_mac_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_bb_check_enable -#endif - }, - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_etm_check_enable -#endif - }, - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_mac_check_enable -#endif - }, - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_i154_bb_check_enable -#endif - }, - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ieee802154_mac_check_enable -#endif - }, - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_data_dump_check_enable -#endif - } -}; +static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int dev_id, bool enable, wrapper_t wrapper) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); -const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { - [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, - [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, - [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, - [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, -}; + void (*action)(struct modem_clock_context *, bool) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure + : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_configure + : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_configure + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_configure + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure + : NULL); + assert(action != NULL); + (*wrapper)(ctx, enable, action, &ctx->dev->refs[dev_id].count, &ctx->dev->refs[dev_id].flags); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, int dev_id) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + esp_err_t (*check_action)(struct modem_clock_context *) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable + : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_check_enable + : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_check_enable + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable + : NULL); + assert(check_action != NULL); + return (*check_action)(ctx); +} +#endif + +IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) +{ + static DRAM_ATTR modem_clock_device_context_t dev = { + .refs = { [0 ... MODEM_CLOCK_DEVICE_MAX - 1] = { .count = 0, .flags = 0 | REFS_FL_WITH_REFCNT } }, + .configure = modem_clock_configure_impl, +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + .check = modem_clock_check_impl, +#endif + }; + dev.refs[MODEM_CLOCK_I2C_MASTER].flags &= ~REFS_FL_WITH_REFCNT; + return &dev; +} + +IRAM_ATTR uint8_t *modem_clock_domain_icg_config(void) +{ + static DRAM_ATTR uint8_t icg_config_default[MODEM_CLOCK_DOMAIN_MAX] = { + [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, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + [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, + }; + return icg_config_default; +} static esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_context_t *ctx, modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) { @@ -301,8 +303,7 @@ static esp_err_t modem_clock_domain_clk_gate_disable(modem_clock_context_t *ctx, void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool select, modem_clock_lpclk_src_t src) { if (efuse_hal_chip_revision() != 0 && src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) { - if (select) - { + if (select) { esp_sleep_clock_config(ESP_SLEEP_CLOCK_BT_USE_WIFI_PWR_CLK, ESP_SLEEP_CLOCK_OPTION_UNGATE); modem_clock_hal_enable_wifipwr_clock(ctx->hal, true); modem_clock_domain_clk_gate_disable(ctx, MODEM_CLOCK_DOMAIN_WIFIPWR, PMU_HP_ICG_MODEM_CODE_SLEEP); diff --git a/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c index 5eca8a62f7c..27b8b6d9a96 100644 --- a/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c @@ -11,37 +11,15 @@ #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT #define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_APB, WIFI_BB, WIFI_BB_44M, COEXIST ) ) -#else -#define WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_MAC, WIFI_BB, COEXIST ) ) -#endif #define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) -#define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) #define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING #define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif #define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) #define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT #define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) -#else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) -#endif -#if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) -#undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( 0 ) -#endif #define PHY_CALIBRATION_CLOCK_DEPS ( PHY_CALIBRATION_WIFI_CLOCK_DEPS | PHY_CALIBRATION_BT_I154_CLOCK_DEPS ) uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) @@ -51,35 +29,20 @@ uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_WIFI_SUPPORTED || SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_WIFI_SUPPORTED case PERIPH_WIFI_MODULE: deps = WIFI_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED - case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif default: assert(0); } return deps; } -#if SOC_WIFI_SUPPORTED static void IRAM_ATTR modem_clock_wifi_mac_configure(modem_clock_context_t *ctx, bool enable) { if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - modem_syscon_ll_enable_wifi_apb_clock(ctx->hal->syscon_dev, enable); -#endif modem_syscon_ll_enable_wifi_mac_clock(ctx->hal->syscon_dev, enable); } } @@ -95,9 +58,6 @@ static void IRAM_ATTR modem_clock_wifi_bb_configure(modem_clock_context_t *ctx, static esp_err_t IRAM_ATTR modem_clock_wifi_mac_check_enable(modem_clock_context_t *ctx) { bool all_clock_enabled = true; -#if !SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - all_clock_enabled &= modem_syscon_ll_wifi_apb_clock_is_enabled(ctx->hal->syscon_dev); -#endif all_clock_enabled &= modem_syscon_ll_wifi_mac_clock_is_enabled(ctx->hal->syscon_dev); return all_clock_enabled ? ESP_OK : ESP_FAIL; } @@ -107,9 +67,7 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_check_enable(modem_clock_context_ return modem_syscon_ll_wifibb_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_WIFI_SUPPORTED -#if SOC_BT_SUPPORTED static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); @@ -127,9 +85,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_ return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT static void IRAM_ATTR modem_clock_wifi_apb_configure(modem_clock_context_t *ctx, bool enable) { if (enable || !(ctx->modem_status & MODEM_STATUS_WIFI_INITED)) { @@ -155,9 +111,7 @@ static esp_err_t IRAM_ATTR modem_clock_wifi_bb_44m_check_enable(modem_clock_cont return modem_syscon_ll_wifibb_44m_clock_is_enabled(ctx->hal->syscon_dev) ? ESP_OK : ESP_FAIL; } #endif -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); @@ -173,25 +127,6 @@ static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_cont return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - -#if SOC_IEEE802154_SUPPORTED -static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); -} - -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) { @@ -208,7 +143,6 @@ static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) { if (enable) { @@ -217,7 +151,6 @@ static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ct ANALOG_CLOCK_DISABLE(); } } -#endif static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) { @@ -267,98 +200,77 @@ static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_contex } #endif -DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_adc_common_fe_check_enable -#endif - }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_private_fe_check_enable -#endif - }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_coex_check_enable -#endif - }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING -// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_i2c_master_check_enable -#endif - }, -#endif -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - [MODEM_CLOCK_WIFI_APB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_apb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_apb_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_BB_44M] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_44m_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_bb_44m_check_enable -#endif - }, -#endif -#if SOC_WIFI_SUPPORTED - [MODEM_CLOCK_WIFI_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_mac_check_enable -#endif - }, - [MODEM_CLOCK_WIFI_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_wifi_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_wifi_bb_check_enable -#endif - }, -#endif - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_etm_check_enable -#endif - }, -#if SOC_BT_SUPPORTED - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_mac_check_enable -#endif - }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_i154_bb_check_enable -#endif - }, -#endif -#if SOC_IEEE802154_SUPPORTED - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ieee802154_mac_check_enable -#endif - }, -#endif - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_data_dump_check_enable -#endif - } -}; +static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int dev_id, bool enable, wrapper_t wrapper) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); -#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG -const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { - [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, - [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, - // [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, - [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, -}; + void (*action)(struct modem_clock_context *, bool) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure + : (dev_id == MODEM_CLOCK_WIFI_APB) ? modem_clock_wifi_apb_configure + : (dev_id == MODEM_CLOCK_WIFI_BB_44M) ? modem_clock_wifi_bb_44m_configure + : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_configure + : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_configure + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure + : NULL); + assert(action != NULL); + (*wrapper)(ctx, enable, action, &ctx->dev->refs[dev_id].count, &ctx->dev->refs[dev_id].flags); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, int dev_id) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + esp_err_t (*check_action)(struct modem_clock_context *) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable + : (dev_id == MODEM_CLOCK_WIFI_APB) ? modem_clock_wifi_apb_check_enable + : (dev_id == MODEM_CLOCK_WIFI_BB_44M) ? modem_clock_wifi_bb_44m_check_enable + : (dev_id == MODEM_CLOCK_WIFI_MAC) ? modem_clock_wifi_mac_check_enable + : (dev_id == MODEM_CLOCK_WIFI_BB) ? modem_clock_wifi_bb_check_enable + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable + : NULL); + assert(check_action != NULL); + return (*check_action)(ctx); +} #endif + +IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) +{ + static DRAM_ATTR modem_clock_device_context_t dev = { + .refs = { [0 ... MODEM_CLOCK_DEVICE_MAX - 1] = { .count = 0, .flags = 0 | REFS_FL_WITH_REFCNT } }, + .configure = modem_clock_configure_impl, +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + .check = modem_clock_check_impl, +#endif + }; + dev.refs[MODEM_CLOCK_I2C_MASTER].flags &= ~REFS_FL_WITH_REFCNT; + return &dev; +} + +IRAM_ATTR uint8_t *modem_clock_domain_icg_config(void) +{ + static DRAM_ATTR uint8_t icg_config_default[MODEM_CLOCK_DOMAIN_MAX] = { + [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, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = 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, + }; + return icg_config_default; +} diff --git a/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c index ca8260df81c..da4e2f0af66 100644 --- a/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c @@ -7,11 +7,10 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc_caps.h" +#include "hal/clk_tree_ll.h" #include "esp_private/esp_modem_clock.h" #include "esp_private/regi2c_ctrl.h" -#if CONFIG_IDF_TARGET_ESP32H2 #include "soc/rtc.h" -#endif // CONFIG_IDF_TARGET_ESP32H2 /* Clock dependency definitions */ #define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) @@ -163,56 +162,60 @@ static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_contex } #endif -DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_adc_common_fe_check_enable -#endif - }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_private_fe_check_enable -#endif - }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_coex_check_enable -#endif - }, -// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_i2c_master_check_enable -#endif - }, - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_etm_check_enable -#endif - }, - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_mac_check_enable -#endif - }, - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_i154_bb_check_enable -#endif - }, - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ieee802154_mac_check_enable -#endif - }, - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_data_dump_check_enable -#endif - } -}; +static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int dev_id, bool enable, wrapper_t wrapper) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + void (*action)(struct modem_clock_context *, bool) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_configure + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure + : NULL); + assert(action != NULL); + (*wrapper)(ctx, enable, action, &ctx->dev->refs[dev_id].count, &ctx->dev->refs[dev_id].flags); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, int dev_id) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + esp_err_t (*check_action)(struct modem_clock_context *) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable + : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable + : NULL); + assert(check_action != NULL); + return (*check_action)(ctx); +} +#endif + +IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) +{ + static DRAM_ATTR modem_clock_device_context_t dev = { + .refs = { [0 ... MODEM_CLOCK_DEVICE_MAX - 1] = { .count = 0, .flags = 0 | REFS_FL_WITH_REFCNT } }, + .configure = modem_clock_configure_impl, +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + .check = modem_clock_check_impl, +#endif + }; + // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + dev.refs[MODEM_CLOCK_I2C_MASTER].flags &= ~REFS_FL_WITH_REFCNT; + return &dev; +} -#if CONFIG_IDF_TARGET_ESP32H2 /* rc32k clock enable status before selecting BLE RTC timer clock source */ static bool rc_clk_en = true; void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, bool enable, modem_clock_lpclk_src_t src) @@ -235,4 +238,3 @@ void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, } } } -#endif // CONFIG_IDF_TARGET_ESP32H2 diff --git a/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c index b754ff7c477..85f2a901321 100644 --- a/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c @@ -14,26 +14,12 @@ #define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) #define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) #define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING #define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif #define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) #define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M ) ) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) -#else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS #define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) -#endif #if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) #undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( 0 ) @@ -47,80 +33,66 @@ uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED - case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif + // case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; + // case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED - case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif + // case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; + // case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; default: assert(0); } return deps; } -#if SOC_BT_SUPPORTED -static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); -} +// static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +// { +// modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); +// modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); +// modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +// } -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_BT_SUPPORTED +// #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +// static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +// { +// bool all_clock_enabled = true; +// all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); +// all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); +// all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); +// return all_clock_enabled ? ESP_OK : ESP_FAIL; +// } +// #endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED -static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); -} +// static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) +// { + // modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); + // modem_syscon_ll_enable_bt_clock(ctx->hal->syscon_dev, enable); +// } -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED +// #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +// static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_context_t *ctx) +// { +// bool all_clock_enabled = true; +// all_clock_enabled &= modem_syscon_ll_bt_apb_clock_is_enabled(ctx->hal->syscon_dev); +// all_clock_enabled &= modem_syscon_ll_bt_clock_is_enabled(ctx->hal->syscon_dev); +// return all_clock_enabled ? ESP_OK : ESP_FAIL; +// } +// #endif -#if SOC_IEEE802154_SUPPORTED -static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); -} +// static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) +// { +// modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); +// modem_syscon_ll_enable_ieee802154_mac_clock(ctx->hal->syscon_dev, enable); +// } -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_IEEE802154_SUPPORTED +// #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +// static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_context_t *ctx) +// { +// bool all_clock_enabled = true; +// all_clock_enabled &= modem_syscon_ll_ieee802154_apb_clock_is_enabled(ctx->hal->syscon_dev); +// all_clock_enabled &= modem_syscon_ll_ieee802154_mac_clock_is_enabled(ctx->hal->syscon_dev); +// return all_clock_enabled ? ESP_OK : ESP_FAIL; +// } +// #endif static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) { @@ -137,7 +109,6 @@ static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) { if (enable) { @@ -146,7 +117,6 @@ static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ct ANALOG_CLOCK_DISABLE(); } } -#endif static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) { @@ -196,59 +166,56 @@ static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_contex } #endif -DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure +static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int dev_id, bool enable, wrapper_t wrapper) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + void (*action)(struct modem_clock_context *, bool) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure + // : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure */ + // : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure */ + // : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_configure */ + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure + : NULL); + assert(action != NULL); + (*wrapper)(ctx, enable, action, &ctx->dev->refs[dev_id].count, &ctx->dev->refs[dev_id].flags); +} + #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_adc_common_fe_check_enable +static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, int dev_id) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + esp_err_t (*check_action)(struct modem_clock_context *) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable + // : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable + // : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable + // : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable + : NULL); + assert(check_action != NULL); + return (*check_action)(ctx); +} #endif - }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure + +IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) +{ + static DRAM_ATTR modem_clock_device_context_t dev = { + .refs = { [0 ... MODEM_CLOCK_DEVICE_MAX - 1] = { .count = 0, .flags = 0 | REFS_FL_WITH_REFCNT } }, + .configure = modem_clock_configure_impl, #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_private_fe_check_enable + .check = modem_clock_check_impl, #endif - }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_coex_check_enable -#endif - }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING -// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_i2c_master_check_enable -#endif - }, -#endif - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_etm_check_enable -#endif - }, -#if SOC_BT_SUPPORTED - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_mac_check_enable -#endif - }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_i154_bb_check_enable -#endif - }, -#endif -#if SOC_IEEE802154_SUPPORTED - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ieee802154_mac_check_enable -#endif - }, -#endif - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_data_dump_check_enable -#endif - } -}; + }; + // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + dev.refs[MODEM_CLOCK_I2C_MASTER].flags &= ~REFS_FL_WITH_REFCNT; + return &dev; +} diff --git a/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c index caf2f6b59c9..6a09c761b84 100644 --- a/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c @@ -14,26 +14,12 @@ #define BLE_CLOCK_DEPS ( MODEM_CLOCKS( BLE_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) #define IEEE802154_CLOCK_DEPS ( MODEM_CLOCKS( 802154_MAC, BT_I154_COMMON_BB, ETM, COEXIST ) ) #define COEXIST_CLOCK_DEPS ( MODEM_CLOCKS( COEXIST ) ) -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING #define I2C_ANA_MST_CLOCK_DEPS ( MODEM_CLOCKS( I2C_MASTER ) ) -#else -#define I2C_ANA_MST_CLOCK_DEPS (0) -#endif #define PHY_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE, MODEM_PRIVATE_FE ) | I2C_ANA_MST_CLOCK_DEPS ) #define MODEM_ETM_CLOCK_DEPS ( MODEM_CLOCKS( ETM ) ) #define MODEM_ADC_COMMON_FE_CLOCK_DEPS ( MODEM_CLOCKS( MODEM_ADC_COMMON_FE ) ) -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT -#define PHY_CALIBRATION_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M ) ) -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB, WIFI_BB_44M ) ) -#define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_APB, WIFI_BB_44M, BT_I154_COMMON_BB ) ) -#else -#define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( MODEM_CLOCKS( WIFI_BB ) ) #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( MODEM_CLOCKS( BT_I154_COMMON_BB ) ) -#endif -#ifndef SOC_WIFI_SUPPORTED -#undef PHY_CALIBRATION_WIFI_CLOCK_DEPS #define PHY_CALIBRATION_WIFI_CLOCK_DEPS ( 0 ) -#endif #if !defined(SOC_BT_SUPPORTED) && !defined(SOC_IEEE802154_SUPPORTED) #undef PHY_CALIBRATION_BT_I154_CLOCK_DEPS #define PHY_CALIBRATION_BT_I154_CLOCK_DEPS ( 0 ) @@ -47,46 +33,35 @@ uint32_t IRAM_ATTR modem_clock_get_module_deps(shared_periph_module_t module) case PERIPH_ANA_I2C_MASTER_MODULE: deps = I2C_ANA_MST_CLOCK_DEPS; break; case PERIPH_PHY_MODULE: deps = PHY_CLOCK_DEPS; break; case PERIPH_MODEM_ADC_COMMON_FE_MODULE: deps = MODEM_ADC_COMMON_FE_CLOCK_DEPS; break; -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_COEX_MODULE: deps = COEXIST_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED - case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; -#endif + // case PERIPH_BT_MODULE: deps = BLE_CLOCK_DEPS; break; case PERIPH_PHY_CALIBRATION_MODULE: deps = PHY_CALIBRATION_CLOCK_DEPS; break; -#if SOC_IEEE802154_SUPPORTED case PERIPH_IEEE802154_MODULE: deps = IEEE802154_CLOCK_DEPS; break; -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED case PERIPH_MODEM_ETM_MODULE: deps = MODEM_ETM_CLOCK_DEPS; break; -#endif default: assert(0); } return deps; } -#if SOC_BT_SUPPORTED -static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) -{ - modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); - modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); -} +// static void IRAM_ATTR modem_clock_ble_mac_configure(modem_clock_context_t *ctx, bool enable) +// { + // modem_syscon_ll_enable_bt_mac_clock(ctx->hal->syscon_dev, enable); + // modem_syscon_ll_enable_modem_sec_clock(ctx->hal->syscon_dev, enable); + // modem_syscon_ll_enable_ble_timer_clock(ctx->hal->syscon_dev, enable); +// } -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) -{ - bool all_clock_enabled = true; - all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); - all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); - return all_clock_enabled ? ESP_OK : ESP_FAIL; -} -#endif -#endif // SOC_BT_SUPPORTED +// #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +// static esp_err_t IRAM_ATTR modem_clock_ble_mac_check_enable(modem_clock_context_t *ctx) +// { +// bool all_clock_enabled = true; +// all_clock_enabled &= modem_syscon_ll_bt_mac_clock_is_enabled(ctx->hal->syscon_dev); +// all_clock_enabled &= modem_syscon_ll_modem_sec_clock_is_enabled(ctx->hal->syscon_dev); +// all_clock_enabled &= modem_syscon_ll_ble_timer_clock_is_enabled(ctx->hal->syscon_dev); +// return all_clock_enabled ? ESP_OK : ESP_FAIL; +// } +// #endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ble_i154_bb_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_bt_apb_clock(ctx->hal->syscon_dev, enable); @@ -102,9 +77,7 @@ static esp_err_t IRAM_ATTR modem_clock_ble_i154_bb_check_enable(modem_clock_cont return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED -#if SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_ieee802154_mac_configure(modem_clock_context_t *ctx, bool enable) { modem_syscon_ll_enable_ieee802154_apb_clock(ctx->hal->syscon_dev, enable); @@ -120,7 +93,6 @@ static esp_err_t IRAM_ATTR modem_clock_ieee802154_mac_check_enable(modem_clock_c return all_clock_enabled ? ESP_OK : ESP_FAIL; } #endif -#endif // SOC_IEEE802154_SUPPORTED static void IRAM_ATTR modem_clock_coex_configure(modem_clock_context_t *ctx, bool enable) { @@ -137,7 +109,6 @@ static void IRAM_ATTR modem_clock_modem_private_fe_configure(modem_clock_context modem_clock_hal_enable_modem_private_fe_clock(ctx->hal, enable); } -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ctx, bool enable) { if (enable) { @@ -146,7 +117,6 @@ static void IRAM_ATTR modem_clock_i2c_master_configure(modem_clock_context_t *ct ANALOG_CLOCK_DISABLE(); } } -#endif static void IRAM_ATTR modem_clock_etm_configure(modem_clock_context_t *ctx, bool enable) { @@ -196,76 +166,71 @@ static esp_err_t IRAM_ATTR modem_clock_data_dump_check_enable(modem_clock_contex } #endif -DRAM_ATTR modem_clock_device_context_t g_modem_clock_dev[MODEM_CLOCK_DEVICE_MAX] = { - [MODEM_CLOCK_MODEM_ADC_COMMON_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_adc_common_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_adc_common_fe_check_enable -#endif - }, - [MODEM_CLOCK_MODEM_PRIVATE_FE] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_modem_private_fe_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_modem_private_fe_check_enable -#endif - }, - [MODEM_CLOCK_COEXIST] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_coex_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_coex_check_enable -#endif - }, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING -// ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. - [MODEM_CLOCK_I2C_MASTER] = { .refs = 0, .with_refcnt = false, .configure = modem_clock_i2c_master_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_i2c_master_check_enable -#endif - }, -#endif - [MODEM_CLOCK_ETM] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_etm_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_etm_check_enable -#endif - }, -#if SOC_BT_SUPPORTED - [MODEM_CLOCK_BLE_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_mac_check_enable -#endif - }, -#endif -#if SOC_IEEE802154_SUPPORTED || SOC_BT_SUPPORTED - [MODEM_CLOCK_BT_I154_COMMON_BB] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ble_i154_bb_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ble_i154_bb_check_enable -#endif - }, -#endif -#if SOC_IEEE802154_SUPPORTED - [MODEM_CLOCK_802154_MAC] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_ieee802154_mac_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_ieee802154_mac_check_enable -#endif - }, -#endif - [MODEM_CLOCK_DATADUMP] = { .refs = 0, .with_refcnt = true, .configure = modem_clock_data_dump_configure -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - , .check_enable = modem_clock_data_dump_check_enable -#endif - } -}; +static void IRAM_ATTR modem_clock_configure_impl(modem_clock_context_t *ctx, int dev_id, bool enable, wrapper_t wrapper) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); -#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG -const DRAM_ATTR uint8_t g_initial_gating_mode[MODEM_CLOCK_DOMAIN_MAX] = { - [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, - [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, -#if SOC_BT_SUPPORTED - [MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE, + void (*action)(struct modem_clock_context *, bool) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_configure + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_configure + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_configure + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_configure + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_configure + // : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_configure + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_configure + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_configure + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_configure + : NULL); + assert(action != NULL); + (*wrapper)(ctx, enable, action, &ctx->dev->refs[dev_id].count, &ctx->dev->refs[dev_id].flags); +} + +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +static esp_err_t IRAM_ATTR modem_clock_check_impl(modem_clock_context_t *ctx, int dev_id) +{ + assert(MODEM_CLOCK_DEVICE_MIN <= dev_id && dev_id < MODEM_CLOCK_DEVICE_MAX); + + esp_err_t (*check_action)(struct modem_clock_context *) = + ( (dev_id == MODEM_CLOCK_MODEM_ADC_COMMON_FE) ? modem_clock_modem_adc_common_fe_check_enable + : (dev_id == MODEM_CLOCK_MODEM_PRIVATE_FE) ? modem_clock_modem_private_fe_check_enable + : (dev_id == MODEM_CLOCK_COEXIST) ? modem_clock_coex_check_enable + : (dev_id == MODEM_CLOCK_I2C_MASTER) ? modem_clock_i2c_master_check_enable + : (dev_id == MODEM_CLOCK_ETM) ? modem_clock_etm_check_enable + // : (dev_id == MODEM_CLOCK_BLE_MAC) ? modem_clock_ble_mac_check_enable + : (dev_id == MODEM_CLOCK_BT_I154_COMMON_BB) ? modem_clock_ble_i154_bb_check_enable + : (dev_id == MODEM_CLOCK_802154_MAC) ? modem_clock_ieee802154_mac_check_enable + : (dev_id == MODEM_CLOCK_DATADUMP) ? modem_clock_data_dump_check_enable + : NULL); + assert(check_action != NULL); + return (*check_action)(ctx); +} #endif - [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, -#if SOC_IEEE802154_SUPPORTED - [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, -#endif - [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, -}; + +IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) +{ + static DRAM_ATTR modem_clock_device_context_t dev = { + .refs = { [0 ... MODEM_CLOCK_DEVICE_MAX - 1] = { .count = 0, .flags = 0 | REFS_FL_WITH_REFCNT } }, + .configure = modem_clock_configure_impl, +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + .check = modem_clock_check_impl, #endif + }; + // ANALOG_CLOCK_ENABLE/DISABLE has its own ref_cnt management. + dev.refs[MODEM_CLOCK_I2C_MASTER].flags &= ~REFS_FL_WITH_REFCNT; + return &dev; +} + +IRAM_ATTR uint8_t *modem_clock_domain_icg_config(void) +{ + static DRAM_ATTR uint8_t icg_config_default[MODEM_CLOCK_DOMAIN_MAX] = { + [MODEM_CLOCK_DOMAIN_MODEM_APB] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_MODEM_PERIPH] = ICG_NOGATING_ACTIVE, + // [MODEM_CLOCK_DOMAIN_BT] = ICG_NOGATING_ACTIVE, + [MODEM_CLOCK_DOMAIN_MODEM_FE] = ICG_NOGATING_ACTIVE | ICG_NOGATING_MODEM, + [MODEM_CLOCK_DOMAIN_IEEE802154] = ICG_NOGATING_ACTIVE, + [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, + }; + return icg_config_default; +} From f0e523db6e560e004ce35ac2ee948dd9a9c8eb40 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Wed, 21 Jan 2026 21:35:12 +0800 Subject: [PATCH 09/11] change(esp_hw_support): split the APIs in modem_clock_impl.c into modem_clock_impl.h --- .../include/esp_private/esp_modem_clock.h | 216 +++--------------- .../modem/include/modem/modem_clock_impl.h | 168 ++++++++++++++ components/esp_hw_support/modem/modem_clock.c | 2 +- .../modem/port/esp32c5/modem_clock_impl.c | 2 +- .../modem/port/esp32c6/modem_clock_impl.c | 2 +- .../modem/port/esp32c61/modem_clock_impl.c | 2 +- .../modem/port/esp32h2/modem_clock_impl.c | 2 +- .../modem/port/esp32h21/modem_clock_impl.c | 2 +- .../modem/port/esp32h4/modem_clock_impl.c | 2 +- 9 files changed, 204 insertions(+), 194 deletions(-) create mode 100644 components/esp_hw_support/modem/include/modem/modem_clock_impl.h diff --git a/components/esp_hw_support/include/esp_private/esp_modem_clock.h b/components/esp_hw_support/include/esp_private/esp_modem_clock.h index aabab22d1b1..0c29b5e864d 100644 --- a/components/esp_hw_support/include/esp_private/esp_modem_clock.h +++ b/components/esp_hw_support/include/esp_private/esp_modem_clock.h @@ -14,139 +14,13 @@ #include "soc/soc_caps.h" #include "soc/periph_defs.h" #include "hal/modem_clock_types.h" -#include "esp_private/esp_pmu.h" -#include "esp_private/critical_section.h" -#include "esp_macros.h" #include "hal/regi2c_ctrl_ll.h" -#if SOC_MODEM_CLOCK_SUPPORTED -#include "hal/modem_clock_hal.h" -#endif - #ifdef __cplusplus extern "C" { #endif #if SOC_MODEM_CLOCK_SUPPORTED -// Please define the frequently called modules in the low bit, -// which will improve the execution efficiency -typedef enum { - MODEM_CLOCK_DEVICE_MIN = 0, - MODEM_CLOCK_MODEM_ADC_COMMON_FE = MODEM_CLOCK_DEVICE_MIN, - MODEM_CLOCK_MODEM_PRIVATE_FE, - MODEM_CLOCK_COEXIST, -#if ANA_I2C_MST_CLK_HAS_ROOT_GATING - MODEM_CLOCK_I2C_MASTER, -#endif -#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT - MODEM_CLOCK_WIFI_APB, - MODEM_CLOCK_WIFI_BB_44M, -#endif -#if SOC_WIFI_SUPPORTED - MODEM_CLOCK_WIFI_MAC, - MODEM_CLOCK_WIFI_BB, -#endif - MODEM_CLOCK_ETM, -#if SOC_BT_SUPPORTED - MODEM_CLOCK_BLE_MAC, -#endif -#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED - MODEM_CLOCK_BT_I154_COMMON_BB, -#endif -#if SOC_IEEE802154_SUPPORTED - MODEM_CLOCK_802154_MAC, -#endif - MODEM_CLOCK_DATADUMP, - MODEM_CLOCK_DEVICE_MAX -} modem_clock_device_t; - -#define MODEM_CLOCK(dev) BIT(MODEM_CLOCK_##dev) - -#define MODEM_CLOCKS_1(a) MODEM_CLOCK(a) -#define MODEM_CLOCKS_2(a, b) MODEM_CLOCK(a) | MODEM_CLOCK(b) -#define MODEM_CLOCKS_3(a, b, c) MODEM_CLOCK(a) | MODEM_CLOCKS_2(b, c) -#define MODEM_CLOCKS_4(a, b, c, d) MODEM_CLOCK(a) | MODEM_CLOCKS_3(b, c, d) -#define MODEM_CLOCKS_5(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_1(__VA_ARGS__) -#define MODEM_CLOCKS_6(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_2(__VA_ARGS__) -#define MODEM_CLOCKS_7(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_3(__VA_ARGS__) -#define MODEM_CLOCKS_8(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_4(__VA_ARGS__) -#define MODEM_CLOCKS_9(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_5(__VA_ARGS__) -#define MODEM_CLOCKS_10(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_6(__VA_ARGS__) -#define MODEM_CLOCKS_11(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_7(__VA_ARGS__) -#define MODEM_CLOCKS_12(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_8(__VA_ARGS__) -#define MODEM_CLOCKS_13(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_9(__VA_ARGS__) -#define MODEM_CLOCKS_14(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_10(__VA_ARGS__) - -#define MODEM_CLOCKS_N(n) MODEM_CLOCKS_##n -#define MODEM_CLOCKS_DISPATCH(n, ...) MODEM_CLOCKS_N(n)(__VA_ARGS__) -#define MODEM_CLOCKS(...) \ - MODEM_CLOCKS_DISPATCH(ESP_VA_NARG(__VA_ARGS__), __VA_ARGS__) - -#define MODEM_STATUS_IDLE (0) -#define MODEM_STATUS_WIFI_INITED (0x1UL) - -typedef struct modem_clock_context modem_clock_context_t; -typedef void (*wrapper_t)(struct modem_clock_context *, bool, void (*action)(struct modem_clock_context *, bool), int16_t *, uint16_t *); -typedef void (*configure_func_t)(struct modem_clock_context *, int, bool, wrapper_t); -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING -typedef esp_err_t (*check_func_t)(struct modem_clock_context *, int); -#endif - -#define REFS_FL_WITH_REFCNT (BIT(0)) /* Enable reference count management (true=use refs, false=ignore refs) */ -typedef struct { - struct { - int16_t count; /* Reference count for this device, if with_refcnt is enabled */ - uint16_t flags; /* Flags for this device */ - } refs[MODEM_CLOCK_DEVICE_MAX]; - configure_func_t configure; -#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING - check_func_t check; -#endif -} modem_clock_device_context_t; - -typedef struct modem_clock_context { - modem_clock_hal_context_t *hal; - spinlock_t lock; - modem_clock_device_context_t *dev; -#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG - uint8_t *icg_config; -#endif - /* the low-power clock source for each module */ - modem_clock_lpclk_src_t lpclk_src[PERIPH_MODEM_MODULE_NUM]; -#if SOC_WIFI_SUPPORTED - uint32_t modem_status; -#endif -} modem_clock_context_t; - -/** - * @brief Get module clock dependencies - * Each chip implements this function in its port file - * @param module The modem module - * @return Bitmask of clock dependencies - */ -uint32_t modem_clock_get_module_deps(shared_periph_module_t module); - -/** - * @brief Get modem clock device context - * Each chip implements this function in its port file - * @return Pointer to the modem clock device context - */ -modem_clock_device_context_t *modem_clock_device_context(void); - -#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG -/** - * @brief Get initial gating configuration for each clock domain - * @return Pointer to the initial gating configuration array - */ -uint8_t *modem_clock_domain_icg_config(void); - -/* the ICG code's bit 0, 1 and 2 indicates the ICG state - * of pmu SLEEP, MODEM and ACTIVE mode respectively */ -#define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) -#define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) -#define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) -#endif // SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG -#endif // SOC_MODEM_CLOCK_SUPPORTED /** * @brief Enable the clock of modem module @@ -186,6 +60,34 @@ void modem_clock_module_enable(shared_periph_module_t module); */ void modem_clock_module_disable(shared_periph_module_t module); +/** + * @brief Reset the mac of modem module + * + * @param module modem module, must be one of + * PERIPH_WIFI_MODULE / PERIPH_BT_MODULE /PERIPH_IEEE802154_MODULE + */ +void modem_clock_module_mac_reset(shared_periph_module_t module); + +/** + * @brief Select the modem module lowpower clock source and configure the clock divider + * + * @param module modem module + * @param src lowpower clock source + * @param divider divider value to lowpower clock source + */ +void modem_clock_select_lp_clock_source(shared_periph_module_t module, modem_clock_lpclk_src_t src, uint32_t divider); + +/** + * @brief Disable lowpower clock source selection + * @param module modem module + */ +void modem_clock_deselect_lp_clock_source(shared_periph_module_t module); + +/** + * @brief Disable all modem module's lowpower clock source selection + */ +void modem_clock_deselect_all_module_lp_clock_source(void); + /** * @brief Gets the clock bitmask associated with the specified modem module. * @@ -207,67 +109,7 @@ uint32_t modem_clock_module_bits_get(shared_periph_module_t module); void modem_clock_configure_wifi_status(bool inited); #endif -/** - * @brief Reset the mac of modem module - * - * @param module modem module, must be one of - * PERIPH_WIFI_MODULE / PERIPH_BT_MODULE /PERIPH_IEEE802154_MODULE - */ -void modem_clock_module_mac_reset(shared_periph_module_t module); - -#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND -/** - * @brief Apply or clear BT low-power clock workaround for enabling Wi-Fi power clock - * - * @param ctx modem clock context - * @param select true to apply (ungate); false to clear (gate) - * @param src lowpower clock source - */ -void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool select, modem_clock_lpclk_src_t src); -#endif - -/** - * @brief Select the modem module lowpower clock source and configure the clock divider - * - * @param module modem module - * @param src lowpower clock source - * @param divider divider value to lowpower clock source - */ -void modem_clock_select_lp_clock_source(shared_periph_module_t module, modem_clock_lpclk_src_t src, uint32_t divider); - -/** - * @brief Disable lowpower clock source selection - * @param module modem module - */ -void modem_clock_deselect_lp_clock_source(shared_periph_module_t module); - -/** -* @brief Disable all modem module's lowpower clock source selection - */ -void modem_clock_deselect_all_module_lp_clock_source(void); - -#if SOC_MODEM_CLOCK_BLE_RTC_TIMER_WORKAROUND -/** - * @brief BLE RTC timer LPCLK workaround on ESP32H2 - * - * @param ctx modem clock context - * @param enable true to enable rc32k; false to disable rc32k - * @param src lowpower clock source - */ -void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, bool enable, modem_clock_lpclk_src_t src); -#endif - -/** - * @brief Reset wifi mac - */ -void modem_clock_wifi_mac_reset(void); - -/** - * @brief Enable clock registers which shared by both modem and ADC. Need a ref count to enable/disable them - * - * @param enable true: enable; false: disable - */ -void modem_clock_shared_enable(bool enable); +#endif // SOC_MODEM_CLOCK_SUPPORTED #ifdef __cplusplus } diff --git a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h new file mode 100644 index 00000000000..d2090875261 --- /dev/null +++ b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h @@ -0,0 +1,168 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_private/esp_modem_clock.h" +#include "esp_macros.h" +#include "esp_private/esp_pmu.h" +#include "esp_private/critical_section.h" +#if SOC_MODEM_CLOCK_SUPPORTED +#include "hal/modem_clock_hal.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if SOC_MODEM_CLOCK_SUPPORTED + +#define MODEM_CLOCK(dev) BIT(MODEM_CLOCK_##dev) +#define MODEM_CLOCKS_1(a) MODEM_CLOCK(a) +#define MODEM_CLOCKS_2(a, b) MODEM_CLOCK(a) | MODEM_CLOCK(b) +#define MODEM_CLOCKS_3(a, b, c) MODEM_CLOCK(a) | MODEM_CLOCKS_2(b, c) +#define MODEM_CLOCKS_4(a, b, c, d) MODEM_CLOCK(a) | MODEM_CLOCKS_3(b, c, d) +#define MODEM_CLOCKS_5(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_1(__VA_ARGS__) +#define MODEM_CLOCKS_6(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_2(__VA_ARGS__) +#define MODEM_CLOCKS_7(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_3(__VA_ARGS__) +#define MODEM_CLOCKS_8(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_4(__VA_ARGS__) +#define MODEM_CLOCKS_9(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_5(__VA_ARGS__) +#define MODEM_CLOCKS_10(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_6(__VA_ARGS__) +#define MODEM_CLOCKS_11(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_7(__VA_ARGS__) +#define MODEM_CLOCKS_12(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_8(__VA_ARGS__) +#define MODEM_CLOCKS_13(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_9(__VA_ARGS__) +#define MODEM_CLOCKS_14(a, b, c, d, ...) MODEM_CLOCKS_4(a, b, c, d) | MODEM_CLOCKS_10(__VA_ARGS__) + +#define MODEM_CLOCKS_N(n) MODEM_CLOCKS_##n +#define MODEM_CLOCKS_DISPATCH(n, ...) MODEM_CLOCKS_N(n)(__VA_ARGS__) +#define MODEM_CLOCKS(...) \ + MODEM_CLOCKS_DISPATCH(ESP_VA_NARG(__VA_ARGS__), __VA_ARGS__) + +#define MODEM_STATUS_IDLE (0) +#define MODEM_STATUS_WIFI_INITED (0x1UL) + +// Please define the frequently called modules in the low bit, +// which will improve the execution efficiency +typedef enum { + MODEM_CLOCK_DEVICE_MIN = 0, + MODEM_CLOCK_MODEM_ADC_COMMON_FE = MODEM_CLOCK_DEVICE_MIN, + MODEM_CLOCK_MODEM_PRIVATE_FE, + MODEM_CLOCK_COEXIST, + MODEM_CLOCK_I2C_MASTER, +#if SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + MODEM_CLOCK_WIFI_APB, + MODEM_CLOCK_WIFI_BB_44M, +#endif +#if SOC_WIFI_SUPPORTED + MODEM_CLOCK_WIFI_MAC, + MODEM_CLOCK_WIFI_BB, +#endif + MODEM_CLOCK_ETM, +#if SOC_BT_SUPPORTED + MODEM_CLOCK_BLE_MAC, +#endif +#if SOC_BT_SUPPORTED || SOC_IEEE802154_SUPPORTED + MODEM_CLOCK_BT_I154_COMMON_BB, +#endif +#if SOC_IEEE802154_SUPPORTED + MODEM_CLOCK_802154_MAC, +#endif + MODEM_CLOCK_DATADUMP, + MODEM_CLOCK_DEVICE_MAX +} modem_clock_device_t; + +typedef struct modem_clock_context modem_clock_context_t; +typedef void (*wrapper_t)(struct modem_clock_context *, bool, void (*action)(struct modem_clock_context *, bool), int16_t *, uint16_t *); +typedef void (*configure_func_t)(struct modem_clock_context *, int, bool, wrapper_t); +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING +typedef esp_err_t (*check_func_t)(struct modem_clock_context *, int); +#endif + +#define REFS_STATUS_WITH_REFCNT (BIT(0)) /* Enable reference count management (true=use refs, false=ignore refs) */ +typedef struct { + struct { + int16_t count; /* Reference count for this device, if with_refcnt is enabled */ + uint16_t status; /* status flags for this device */ + } refs[MODEM_CLOCK_DEVICE_MAX]; + configure_func_t configure; +#if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING + check_func_t check; +#endif +} modem_clock_device_context_t; + +typedef struct modem_clock_context { + modem_clock_hal_context_t *hal; + spinlock_t lock; + modem_clock_device_context_t *dev; +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG + uint8_t *icg_config; +#endif + /* the low-power clock source for each module */ + modem_clock_lpclk_src_t lpclk_src[PERIPH_MODEM_MODULE_NUM]; +#if SOC_WIFI_SUPPORTED + uint32_t modem_status; +#endif +} modem_clock_context_t; + +/** + * @brief Get module clock dependencies + * + * @param module The modem module + * @return Bitmask of clock dependencies + */ +uint32_t modem_clock_get_module_deps(shared_periph_module_t module); + +/** + * @brief Get modem clock device context + * + * @return Pointer to the modem clock device context + */ +modem_clock_device_context_t *modem_clock_device_context(void); + +#if SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG + +/* the ICG code's bit 0, 1 and 2 indicates the ICG state + * of pmu SLEEP, MODEM and ACTIVE mode respectively */ +#define ICG_NOGATING_ACTIVE (BIT(PMU_HP_ICG_MODEM_CODE_ACTIVE)) +#define ICG_NOGATING_SLEEP (BIT(PMU_HP_ICG_MODEM_CODE_SLEEP)) +#define ICG_NOGATING_MODEM (BIT(PMU_HP_ICG_MODEM_CODE_MODEM)) + +/** + * @brief Get initial gating configuration for each clock domain + * + * @return Pointer to the initial gating configuration array + */ +uint8_t *modem_clock_domain_icg_config(void); + +#endif // SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG + +#if SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND +/** + * @brief Apply or clear BT low-power clock workaround for enabling Wi-Fi power clock + * + * @param ctx modem clock context + * @param select true to apply (ungate); false to clear (gate) + * @param src lowpower clock source + */ +void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool select, modem_clock_lpclk_src_t src); +#endif + +#if SOC_MODEM_CLOCK_BLE_RTC_TIMER_WORKAROUND +/** + * @brief BLE RTC timer LPCLK workaround on ESP32H2 + * + * @param ctx modem clock context + * @param enable true to enable rc32k; false to disable rc32k + * @param src lowpower clock source + */ +void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, bool enable, modem_clock_lpclk_src_t src); + +#endif +#endif // SOC_MODEM_CLOCK_SUPPORTED + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_hw_support/modem/modem_clock.c b/components/esp_hw_support/modem/modem_clock.c index 149f948e819..5a13bcb3bce 100644 --- a/components/esp_hw_support/modem/modem_clock.c +++ b/components/esp_hw_support/modem/modem_clock.c @@ -12,8 +12,8 @@ #include "soc/soc.h" #include "soc/soc_caps.h" #include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/esp_sleep_internal.h" -#include "esp_private/esp_pmu.h" #include "esp_sleep.h" #include "hal/efuse_hal.h" #include "hal/clk_tree_ll.h" diff --git a/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c index 40f2ae4c509..66f35996e07 100644 --- a/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c5/modem_clock_impl.c @@ -7,7 +7,7 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc_caps.h" -#include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ diff --git a/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c index 945ba5c62c4..e8935e4647a 100644 --- a/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c @@ -9,7 +9,7 @@ #include "soc/soc_caps.h" #include "hal/efuse_hal.h" #include "esp_private/esp_sleep_internal.h" -#include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ diff --git a/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c index 27b8b6d9a96..cb7627b3ed6 100644 --- a/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c61/modem_clock_impl.c @@ -7,7 +7,7 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc_caps.h" -#include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ diff --git a/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c index da4e2f0af66..5f427194941 100644 --- a/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c @@ -8,7 +8,7 @@ #include "esp_attr.h" #include "soc/soc_caps.h" #include "hal/clk_tree_ll.h" -#include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/regi2c_ctrl.h" #include "soc/rtc.h" diff --git a/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c index 85f2a901321..c2f1b483639 100644 --- a/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h21/modem_clock_impl.c @@ -7,7 +7,7 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc_caps.h" -#include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ diff --git a/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c index 6a09c761b84..3ba72910164 100644 --- a/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h4/modem_clock_impl.c @@ -7,7 +7,7 @@ #include "sdkconfig.h" #include "esp_attr.h" #include "soc/soc_caps.h" -#include "esp_private/esp_modem_clock.h" +#include "modem/modem_clock_impl.h" #include "esp_private/regi2c_ctrl.h" /* Clock dependency definitions */ From 5a3a4c12701edf4ca01dd87c0837b923f377ad78 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Thu, 22 Jan 2026 16:33:30 +0800 Subject: [PATCH 10/11] change(esp_hw_support): optimize modem low-power clock source array size --- .../modem/include/modem/modem_clock_impl.h | 18 +++- components/esp_hw_support/modem/modem_clock.c | 85 ++++++++++++------- .../modem/port/esp32c6/modem_clock_impl.c | 3 + .../modem/port/esp32h2/modem_clock_impl.c | 4 +- 4 files changed, 73 insertions(+), 37 deletions(-) diff --git a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h index d2090875261..26d83e2068c 100644 --- a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h +++ b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h @@ -74,6 +74,18 @@ typedef enum { MODEM_CLOCK_DEVICE_MAX } modem_clock_device_t; +/* Low-power clock source index for modules that support LP clock */ +typedef enum { +#if SOC_WIFI_SUPPORTED + MODEM_LPCLK_SRC_MODULE_WIFI, +#endif +#if SOC_BT_SUPPORTED + MODEM_LPCLK_SRC_MODULE_BT, +#endif + MODEM_LPCLK_SRC_MODULE_COEX, + MODEM_LPCLK_SRC_MODULE_MAX +} modem_lpclk_src_module_t; + typedef struct modem_clock_context modem_clock_context_t; typedef void (*wrapper_t)(struct modem_clock_context *, bool, void (*action)(struct modem_clock_context *, bool), int16_t *, uint16_t *); typedef void (*configure_func_t)(struct modem_clock_context *, int, bool, wrapper_t); @@ -81,11 +93,11 @@ typedef void (*configure_func_t)(struct modem_clock_context *, int, bool, wrappe typedef esp_err_t (*check_func_t)(struct modem_clock_context *, int); #endif -#define REFS_STATUS_WITH_REFCNT (BIT(0)) /* Enable reference count management (true=use refs, false=ignore refs) */ +#define REFS_FL_WITH_REFCNT (BIT(0)) /* Enable reference count management (true=use refs, false=ignore refs) */ typedef struct { struct { int16_t count; /* Reference count for this device, if with_refcnt is enabled */ - uint16_t status; /* status flags for this device */ + uint16_t flags; /* flags for this device */ } refs[MODEM_CLOCK_DEVICE_MAX]; configure_func_t configure; #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING @@ -101,7 +113,7 @@ typedef struct modem_clock_context { uint8_t *icg_config; #endif /* the low-power clock source for each module */ - modem_clock_lpclk_src_t lpclk_src[PERIPH_MODEM_MODULE_NUM]; + modem_clock_lpclk_src_t lpclk_src[MODEM_LPCLK_SRC_MODULE_MAX]; #if SOC_WIFI_SUPPORTED uint32_t modem_status; #endif diff --git a/components/esp_hw_support/modem/modem_clock.c b/components/esp_hw_support/modem/modem_clock.c index 5a13bcb3bce..c5a5fbf4ec0 100644 --- a/components/esp_hw_support/modem/modem_clock.c +++ b/components/esp_hw_support/modem/modem_clock.c @@ -34,7 +34,7 @@ modem_clock_context_t * __attribute__((weak)) IRAM_ATTR MODEM_CLOCK_instance(voi #if SOC_WIFI_SUPPORTED .modem_status = MODEM_STATUS_IDLE, #endif - .lpclk_src = { [0 ... PERIPH_MODEM_MODULE_NUM - 1] = MODEM_CLOCK_LPCLK_SRC_INVALID } + .lpclk_src = { [0 ... MODEM_LPCLK_SRC_MODULE_MAX - 1] = MODEM_CLOCK_LPCLK_SRC_INVALID } }; if (modem_clock_context.dev == NULL) { modem_clock_context.dev = modem_clock_device_context(); @@ -184,6 +184,25 @@ void modem_clock_configure_wifi_status(bool inited) } #endif +/* Map module to lpclk_src array index (only WIFI, BT, COEX support LP clock) */ +static IRAM_ATTR modem_lpclk_src_module_t modem_clock_lpclk_src_module(shared_periph_module_t module) +{ +#if SOC_WIFI_SUPPORTED + if (module == PERIPH_WIFI_MODULE) { + return MODEM_LPCLK_SRC_MODULE_WIFI; + } +#endif +#if SOC_BT_SUPPORTED + if (module == PERIPH_BT_MODULE) { + return MODEM_LPCLK_SRC_MODULE_BT; + } +#endif + if (module == PERIPH_COEX_MODULE) { + return MODEM_LPCLK_SRC_MODULE_COEX; + } + return MODEM_LPCLK_SRC_MODULE_MAX; /* Invalid module */ +} + void modem_clock_deselect_all_module_lp_clock_source(void) { #if SOC_WIFI_SUPPORTED @@ -195,9 +214,29 @@ void modem_clock_deselect_all_module_lp_clock_source(void) modem_clock_hal_deselect_all_coex_lpclk_source(MODEM_CLOCK_instance()->hal); } +#if SOC_LIGHT_SLEEP_SUPPORTED +static inline esp_sleep_pd_domain_t modem_clock_lpclk_src_power_domain(modem_clock_lpclk_src_t src) +{ + return (esp_sleep_pd_domain_t) ( + (src == MODEM_CLOCK_LPCLK_SRC_RC_FAST) ? ESP_PD_DOMAIN_RC_FAST : + (src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) ? ESP_PD_DOMAIN_XTAL : +#if !CONFIG_ESP_CLK_RC32K_NOT_TO_USE + (src == MODEM_CLOCK_LPCLK_SRC_RC32K) ? ESP_PD_DOMAIN_RC32K : +#endif + (src == MODEM_CLOCK_LPCLK_SRC_XTAL32K) ? ESP_PD_DOMAIN_XTAL32K : + ESP_PD_DOMAIN_MAX); +} +#endif + void modem_clock_select_lp_clock_source(shared_periph_module_t module, modem_clock_lpclk_src_t src, uint32_t divider) { assert(IS_MODEM_MODULE(module)); + + modem_lpclk_src_module_t lpclk_src_module = modem_clock_lpclk_src_module(module); + if (lpclk_src_module >= MODEM_LPCLK_SRC_MODULE_MAX) { + return; + } + esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); switch (module) { @@ -238,41 +277,31 @@ void modem_clock_select_lp_clock_source(shared_periph_module_t module, modem_clo break; } #if SOC_LIGHT_SLEEP_SUPPORTED - modem_clock_lpclk_src_t last_src = MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN]; + modem_clock_lpclk_src_t last_src = MODEM_CLOCK_instance()->lpclk_src[lpclk_src_module]; #endif - MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN] = src; + MODEM_CLOCK_instance()->lpclk_src[lpclk_src_module] = src; esp_os_exit_critical_safe(&MODEM_CLOCK_instance()->lock); #if SOC_LIGHT_SLEEP_SUPPORTED /* The power domain of the low-power clock source required by the modem * module remains powered on during sleep */ - esp_sleep_pd_domain_t pd_domain = (esp_sleep_pd_domain_t) ( - (last_src == MODEM_CLOCK_LPCLK_SRC_RC_FAST) ? ESP_PD_DOMAIN_RC_FAST : - (last_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) ? ESP_PD_DOMAIN_XTAL : -#if !CONFIG_ESP_CLK_RC32K_NOT_TO_USE - (last_src == MODEM_CLOCK_LPCLK_SRC_RC32K) ? ESP_PD_DOMAIN_RC32K : -#endif - (last_src == MODEM_CLOCK_LPCLK_SRC_XTAL32K) ? ESP_PD_DOMAIN_XTAL32K : - ESP_PD_DOMAIN_MAX); - esp_sleep_pd_domain_t pu_domain = (esp_sleep_pd_domain_t) ( - (src == MODEM_CLOCK_LPCLK_SRC_RC_FAST) ? ESP_PD_DOMAIN_RC_FAST : - (src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) ? ESP_PD_DOMAIN_XTAL : -#if !CONFIG_ESP_CLK_RC32K_NOT_TO_USE - (src == MODEM_CLOCK_LPCLK_SRC_RC32K) ? ESP_PD_DOMAIN_RC32K : -#endif - (src == MODEM_CLOCK_LPCLK_SRC_XTAL32K) ? ESP_PD_DOMAIN_XTAL32K : - ESP_PD_DOMAIN_MAX); - esp_sleep_pd_config(pd_domain, ESP_PD_OPTION_OFF); - esp_sleep_pd_config(pu_domain, ESP_PD_OPTION_ON); + esp_sleep_pd_config(modem_clock_lpclk_src_power_domain(last_src), ESP_PD_OPTION_OFF); + esp_sleep_pd_config(modem_clock_lpclk_src_power_domain(src), ESP_PD_OPTION_ON); #endif } void modem_clock_deselect_lp_clock_source(shared_periph_module_t module) { assert(IS_MODEM_MODULE(module)); + + modem_lpclk_src_module_t lpclk_src_module = modem_clock_lpclk_src_module(module); + if (lpclk_src_module >= MODEM_LPCLK_SRC_MODULE_MAX) { + return; + } + esp_os_enter_critical_safe(&MODEM_CLOCK_instance()->lock); #if SOC_LIGHT_SLEEP_SUPPORTED - modem_clock_lpclk_src_t last_src = MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN]; + modem_clock_lpclk_src_t last_src = MODEM_CLOCK_instance()->lpclk_src[lpclk_src_module]; #endif switch (module) { @@ -299,18 +328,10 @@ void modem_clock_deselect_lp_clock_source(shared_periph_module_t module) default: break; } - MODEM_CLOCK_instance()->lpclk_src[module - PERIPH_MODEM_MODULE_MIN] = MODEM_CLOCK_LPCLK_SRC_INVALID; + MODEM_CLOCK_instance()->lpclk_src[lpclk_src_module] = MODEM_CLOCK_LPCLK_SRC_INVALID; esp_os_exit_critical_safe(&MODEM_CLOCK_instance()->lock); #if SOC_LIGHT_SLEEP_SUPPORTED - esp_sleep_pd_domain_t pd_domain = (esp_sleep_pd_domain_t) ( - (last_src == MODEM_CLOCK_LPCLK_SRC_RC_FAST) ? ESP_PD_DOMAIN_RC_FAST : - (last_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) ? ESP_PD_DOMAIN_XTAL : -#if !CONFIG_ESP_CLK_RC32K_NOT_TO_USE - (last_src == MODEM_CLOCK_LPCLK_SRC_RC32K) ? ESP_PD_DOMAIN_RC32K : -#endif - (last_src == MODEM_CLOCK_LPCLK_SRC_XTAL32K) ? ESP_PD_DOMAIN_XTAL32K : - ESP_PD_DOMAIN_MAX); - esp_sleep_pd_config(pd_domain, ESP_PD_OPTION_OFF); + esp_sleep_pd_config(modem_clock_lpclk_src_power_domain(last_src), ESP_PD_OPTION_OFF); #endif } diff --git a/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c index e8935e4647a..41633ba1fff 100644 --- a/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32c6/modem_clock_impl.c @@ -268,6 +268,7 @@ IRAM_ATTR uint8_t *modem_clock_domain_icg_config(void) return icg_config_default; } +/* enable clock domain clk gate */ static esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_context_t *ctx, modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) { if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { @@ -284,6 +285,7 @@ static esp_err_t modem_clock_domain_clk_gate_enable(modem_clock_context_t *ctx, return ESP_OK; } +/* disable clock domain clk gate */ static esp_err_t modem_clock_domain_clk_gate_disable(modem_clock_context_t *ctx, modem_clock_domain_t domain, pmu_hp_icg_modem_mode_t mode) { if (domain >= MODEM_CLOCK_DOMAIN_MAX || domain < MODEM_CLOCK_DOMAIN_MODEM_APB) { @@ -300,6 +302,7 @@ static esp_err_t modem_clock_domain_clk_gate_disable(modem_clock_context_t *ctx, return ESP_OK; } +/* workaround for BT using WiFi power clock source workaround on esp32c6 */ void modem_clock_bt_wifipwr_clk_workaround(modem_clock_context_t *ctx, bool select, modem_clock_lpclk_src_t src) { if (efuse_hal_chip_revision() != 0 && src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) { diff --git a/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c index 5f427194941..f50b8d28310 100644 --- a/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c +++ b/components/esp_hw_support/modem/port/esp32h2/modem_clock_impl.c @@ -216,10 +216,10 @@ IRAM_ATTR modem_clock_device_context_t *modem_clock_device_context(void) return &dev; } -/* rc32k clock enable status before selecting BLE RTC timer clock source */ -static bool rc_clk_en = true; +/* rc32k clock enable status before selecting BLE RTC timer clock source, which is used for workaround on esp32h2 */ void modem_clock_select_ble_rtc_timer_clk_workaround(modem_clock_context_t *ctx, bool enable, modem_clock_lpclk_src_t src) { + static bool rc_clk_en = true; if (enable) { bool selected = (src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) || (src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW); From 577736434136657b246ae6f72dbf035449e6cebc Mon Sep 17 00:00:00 2001 From: cjin Date: Fri, 30 Jan 2026 10:44:00 +0800 Subject: [PATCH 11/11] fix(ble): add modem syscon header include on ESP32H2 --- components/bt/controller/esp32h2/bt.c | 2 ++ .../esp_hw_support/modem/include/modem/modem_clock_impl.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/components/bt/controller/esp32h2/bt.c b/components/bt/controller/esp32h2/bt.c index 44d1ed41236..c9390735080 100644 --- a/components/bt/controller/esp32h2/bt.c +++ b/components/bt/controller/esp32h2/bt.c @@ -54,6 +54,7 @@ #include "esp_private/esp_clk_tree_common.h" #include "esp_sleep.h" #include "soc/rtc.h" +#include "modem/modem_syscon_struct.h" #if CONFIG_BT_LE_CONTROLLER_LOG_MODE_BLE_LOG_V2 #include "ble_log.h" @@ -569,6 +570,7 @@ static void IRAM_ATTR esp_reset_modem(uint8_t mdl_opts,uint8_t start) coex_hw_timer_set(0x04, 0x02, 15, 0, 5000); coex_hw_timer_enable(0x04); #endif // CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + // TODO: PM-659 MODEM_SYSCON.modem_rst_conf.val |= (BIT(16) | BIT(18)); MODEM_SYSCON.modem_rst_conf.val &= ~(BIT(16) | BIT(18)); } else { diff --git a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h index 26d83e2068c..110df308b12 100644 --- a/components/esp_hw_support/modem/include/modem/modem_clock_impl.h +++ b/components/esp_hw_support/modem/include/modem/modem_clock_impl.h @@ -96,8 +96,8 @@ typedef esp_err_t (*check_func_t)(struct modem_clock_context *, int); #define REFS_FL_WITH_REFCNT (BIT(0)) /* Enable reference count management (true=use refs, false=ignore refs) */ typedef struct { struct { - int16_t count; /* Reference count for this device, if with_refcnt is enabled */ - uint16_t flags; /* flags for this device */ + int16_t count; /* Reference count for this device, if with_refcnt is enabled */ + uint16_t flags; /* flags for this device */ } refs[MODEM_CLOCK_DEVICE_MAX]; configure_func_t configure; #if CONFIG_ESP_MODEM_CLOCK_ENABLE_CHECKING