From 4bfd180a943970736d7dd447b41f143e5bdfcf7c Mon Sep 17 00:00:00 2001 From: Chen Jichang Date: Fri, 16 May 2025 18:24:04 +0800 Subject: [PATCH] fix(i2c): only call esp_pm APIs when CONFIG_PM_ENABLE is enabled --- components/esp_driver_i2c/i2c_common.c | 5 +++-- components/esp_driver_i2c/i2c_master.c | 4 ++++ components/esp_driver_i2c/i2c_private.h | 4 +--- components/soc/esp32/i2c_periph.c | 2 ++ components/soc/esp32c2/i2c_periph.c | 1 + components/soc/esp32c3/i2c_periph.c | 1 + components/soc/esp32c5/i2c_periph.c | 2 ++ components/soc/esp32c6/i2c_periph.c | 2 ++ components/soc/esp32c61/i2c_periph.c | 1 + components/soc/esp32h2/i2c_periph.c | 2 ++ components/soc/esp32h21/i2c_periph.c | 2 ++ components/soc/esp32p4/i2c_periph.c | 3 +++ components/soc/esp32s2/i2c_periph.c | 2 ++ components/soc/esp32s3/i2c_periph.c | 2 ++ components/soc/include/soc/i2c_periph.h | 1 + 15 files changed, 29 insertions(+), 5 deletions(-) diff --git a/components/esp_driver_i2c/i2c_common.c b/components/esp_driver_i2c/i2c_common.c index 9c8b06288d..c8da8c554d 100644 --- a/components/esp_driver_i2c/i2c_common.c +++ b/components/esp_driver_i2c/i2c_common.c @@ -211,9 +211,11 @@ esp_err_t i2c_release_bus_handle(i2c_bus_handle_t i2c_bus) if (i2c_bus->intr_handle) { ESP_RETURN_ON_ERROR(esp_intr_free(i2c_bus->intr_handle), TAG, "delete interrupt service failed"); } +#if CONFIG_PM_ENABLE if (i2c_bus->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_delete(i2c_bus->pm_lock), TAG, "delete pm_lock failed"); } +#endif // Disable I2C module if (!i2c_bus->is_lp_i2c) { I2C_RCC_ATOMIC() { @@ -306,8 +308,7 @@ esp_err_t i2c_select_periph_clock(i2c_bus_handle_t handle, soc_module_clk_t clk_ } if (need_pm_lock) { - sprintf(handle->pm_lock_name, "I2C_%d", handle->port_num); // e.g. PORT_0 - ret = esp_pm_lock_create(pm_lock_type, 0, handle->pm_lock_name, &handle->pm_lock); + ret = esp_pm_lock_create(pm_lock_type, 0, i2c_periph_signal[handle->port_num].module_name, &handle->pm_lock); ESP_RETURN_ON_ERROR(ret, TAG, "create pm lock failed"); } #endif // CONFIG_PM_ENABLE diff --git a/components/esp_driver_i2c/i2c_master.c b/components/esp_driver_i2c/i2c_master.c index 562e6788a3..729ae7369e 100644 --- a/components/esp_driver_i2c/i2c_master.c +++ b/components/esp_driver_i2c/i2c_master.c @@ -617,9 +617,11 @@ static esp_err_t s_i2c_transaction_start(i2c_master_dev_handle_t i2c_dev, int xf ESP_RETURN_ON_ERROR(s_i2c_hw_fsm_reset(i2c_master, true), TAG, "reset hardware failed"); } +#if CONFIG_PM_ENABLE if (i2c_master->base->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_acquire(i2c_master->base->pm_lock), TAG, "acquire pm_lock failed"); } +#endif portENTER_CRITICAL(&i2c_master->base->spinlock); atomic_init(&i2c_master->trans_idx, 0); @@ -655,9 +657,11 @@ static esp_err_t s_i2c_transaction_start(i2c_master_dev_handle_t i2c_dev, int xf i2c_ll_disable_intr_mask(hal->dev, I2C_LL_MASTER_EVENT_INTR); } +#if CONFIG_PM_ENABLE if (i2c_master->base->pm_lock) { ESP_RETURN_ON_ERROR(esp_pm_lock_release(i2c_master->base->pm_lock), TAG, "release pm_lock failed"); } +#endif return ret; } diff --git a/components/esp_driver_i2c/i2c_private.h b/components/esp_driver_i2c/i2c_private.h index 5a043b263a..bc8b6aef38 100644 --- a/components/esp_driver_i2c/i2c_private.h +++ b/components/esp_driver_i2c/i2c_private.h @@ -66,7 +66,6 @@ extern "C" { #define I2C_ALLOW_INTR_PRIORITY_MASK ESP_INTR_FLAG_LOWMED -#define I2C_PM_LOCK_NAME_LEN_MAX 16 #define I2C_STATIC_OPERATION_ARRAY_MAX SOC_I2C_CMD_REG_NUM #define I2C_TRANS_READ_COMMAND(ack_value) {.ack_val = (ack_value), .op_code = I2C_LL_CMD_READ} @@ -116,9 +115,8 @@ struct i2c_bus_t { int scl_num; // SCL pin number bool pull_up_enable; // Enable pull-ups intr_handle_t intr_handle; // I2C interrupt handle - esp_pm_lock_handle_t pm_lock; // power manage lock #if CONFIG_PM_ENABLE - char pm_lock_name[I2C_PM_LOCK_NAME_LEN_MAX]; // pm lock name + esp_pm_lock_handle_t pm_lock; // power manage lock #endif i2c_bus_mode_t bus_mode; // I2C bus mode #if SOC_I2C_SUPPORT_SLEEP_RETENTION diff --git a/components/soc/esp32/i2c_periph.c b/components/soc/esp32/i2c_periph.c index daecec7bee..4a440fca4d 100644 --- a/components/soc/esp32/i2c_periph.c +++ b/components/soc/esp32/i2c_periph.c @@ -12,6 +12,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -19,6 +20,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C_EXT0_INTR_SOURCE, }, { + .module_name = "I2C1", .sda_out_sig = I2CEXT1_SDA_OUT_IDX, .sda_in_sig = I2CEXT1_SDA_IN_IDX, .scl_out_sig = I2CEXT1_SCL_OUT_IDX, diff --git a/components/soc/esp32c2/i2c_periph.c b/components/soc/esp32c2/i2c_periph.c index 0087252478..4df019865b 100644 --- a/components/soc/esp32c2/i2c_periph.c +++ b/components/soc/esp32c2/i2c_periph.c @@ -12,6 +12,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, diff --git a/components/soc/esp32c3/i2c_periph.c b/components/soc/esp32c3/i2c_periph.c index 2402f6aeae..6f18557a3a 100644 --- a/components/soc/esp32c3/i2c_periph.c +++ b/components/soc/esp32c3/i2c_periph.c @@ -12,6 +12,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, diff --git a/components/soc/esp32c5/i2c_periph.c b/components/soc/esp32c5/i2c_periph.c index 6ae52cb0cf..4436a046c5 100644 --- a/components/soc/esp32c5/i2c_periph.c +++ b/components/soc/esp32c5/i2c_periph.c @@ -14,6 +14,7 @@ static_assert(SOC_I2C_NUM == (SOC_HP_I2C_NUM + SOC_LP_I2C_NUM)); const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { /* I2C_NUM_0*/ { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -22,6 +23,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { }, /* LP_I2C_NUM_0*/ { + .module_name = "LP_I2C0", .sda_out_sig = 0, .sda_in_sig = 0, .scl_out_sig = 0, diff --git a/components/soc/esp32c6/i2c_periph.c b/components/soc/esp32c6/i2c_periph.c index 96e46a6529..2d03a38dbe 100644 --- a/components/soc/esp32c6/i2c_periph.c +++ b/components/soc/esp32c6/i2c_periph.c @@ -16,6 +16,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -23,6 +24,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C_EXT0_INTR_SOURCE, }, { + .module_name = "LP_I2C0", .sda_out_sig = 0, .sda_in_sig = 0, .scl_out_sig = 0, diff --git a/components/soc/esp32c61/i2c_periph.c b/components/soc/esp32c61/i2c_periph.c index 960fb131a5..63369e2810 100644 --- a/components/soc/esp32c61/i2c_periph.c +++ b/components/soc/esp32c61/i2c_periph.c @@ -13,6 +13,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { /* I2C_NUM_0*/ { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, diff --git a/components/soc/esp32h2/i2c_periph.c b/components/soc/esp32h2/i2c_periph.c index ffda3bf9f8..7c629655b5 100644 --- a/components/soc/esp32h2/i2c_periph.c +++ b/components/soc/esp32h2/i2c_periph.c @@ -14,6 +14,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -21,6 +22,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C_EXT0_INTR_SOURCE, }, { + .module_name = "I2C1", .sda_out_sig = I2CEXT1_SDA_OUT_IDX, .sda_in_sig = I2CEXT1_SDA_IN_IDX, .scl_out_sig = I2CEXT1_SCL_OUT_IDX, diff --git a/components/soc/esp32h21/i2c_periph.c b/components/soc/esp32h21/i2c_periph.c index ab14022496..5633761438 100644 --- a/components/soc/esp32h21/i2c_periph.c +++ b/components/soc/esp32h21/i2c_periph.c @@ -12,6 +12,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -19,6 +20,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C_EXT0_INTR_SOURCE, }, { + .module_name = "I2C1", .sda_out_sig = I2CEXT1_SDA_OUT_IDX, .sda_in_sig = I2CEXT1_SDA_IN_IDX, .scl_out_sig = I2CEXT1_SCL_OUT_IDX, diff --git a/components/soc/esp32p4/i2c_periph.c b/components/soc/esp32p4/i2c_periph.c index b895c9f362..6bf7b35482 100644 --- a/components/soc/esp32p4/i2c_periph.c +++ b/components/soc/esp32p4/i2c_periph.c @@ -13,6 +13,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2C0_SDA_PAD_OUT_IDX, .sda_in_sig = I2C0_SDA_PAD_IN_IDX, .scl_out_sig = I2C0_SCL_PAD_OUT_IDX, @@ -20,6 +21,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C0_INTR_SOURCE, }, { + .module_name = "I2C1", .sda_out_sig = I2C1_SDA_PAD_OUT_IDX, .sda_in_sig = I2C1_SDA_PAD_IN_IDX, .scl_out_sig = I2C1_SCL_PAD_OUT_IDX, @@ -27,6 +29,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C1_INTR_SOURCE, }, { + .module_name = "LP_I2C0", .sda_out_sig = LP_I2C_SDA_PAD_OUT_IDX, .sda_in_sig = LP_I2C_SDA_PAD_IN_IDX, .scl_out_sig = LP_I2C_SCL_PAD_OUT_IDX, diff --git a/components/soc/esp32s2/i2c_periph.c b/components/soc/esp32s2/i2c_periph.c index daecec7bee..4a440fca4d 100644 --- a/components/soc/esp32s2/i2c_periph.c +++ b/components/soc/esp32s2/i2c_periph.c @@ -12,6 +12,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -19,6 +20,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C_EXT0_INTR_SOURCE, }, { + .module_name = "I2C1", .sda_out_sig = I2CEXT1_SDA_OUT_IDX, .sda_in_sig = I2CEXT1_SDA_IN_IDX, .scl_out_sig = I2CEXT1_SCL_OUT_IDX, diff --git a/components/soc/esp32s3/i2c_periph.c b/components/soc/esp32s3/i2c_periph.c index daecec7bee..4a440fca4d 100644 --- a/components/soc/esp32s3/i2c_periph.c +++ b/components/soc/esp32s3/i2c_periph.c @@ -12,6 +12,7 @@ */ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { { + .module_name = "I2C0", .sda_out_sig = I2CEXT0_SDA_OUT_IDX, .sda_in_sig = I2CEXT0_SDA_IN_IDX, .scl_out_sig = I2CEXT0_SCL_OUT_IDX, @@ -19,6 +20,7 @@ const i2c_signal_conn_t i2c_periph_signal[SOC_I2C_NUM] = { .irq = ETS_I2C_EXT0_INTR_SOURCE, }, { + .module_name = "I2C1", .sda_out_sig = I2CEXT1_SDA_OUT_IDX, .sda_in_sig = I2CEXT1_SDA_IN_IDX, .scl_out_sig = I2CEXT1_SCL_OUT_IDX, diff --git a/components/soc/include/soc/i2c_periph.h b/components/soc/include/soc/i2c_periph.h index c1fbb0fbc8..23ceea1d1c 100644 --- a/components/soc/include/soc/i2c_periph.h +++ b/components/soc/include/soc/i2c_periph.h @@ -20,6 +20,7 @@ extern "C" { #endif typedef struct { + const char *module_name; const uint8_t sda_out_sig; const uint8_t sda_in_sig; const uint8_t scl_out_sig;