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; +}