11/*
2- * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+ * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 */
@@ -71,7 +71,9 @@ struct esp_lcd_i80_bus_t {
7171 int dc_gpio_num ; // GPIO used for DC line
7272 int wr_gpio_num ; // GPIO used for WR line
7373 intr_handle_t intr ; // LCD peripheral interrupt handle
74+ #if CONFIG_PM_ENABLE
7475 esp_pm_lock_handle_t pm_lock ; // lock APB frequency when necessary
76+ #endif
7577 size_t max_transfer_bytes ; // Maximum number of bytes that can be transferred in one transaction
7678 gdma_link_list_handle_t dma_link ; // DMA link list handle
7779 uint8_t * format_buffer ;// The driver allocates an internal buffer for DMA to do data format transformer
@@ -235,9 +237,11 @@ esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lc
235237 if (bus -> format_buffer ) {
236238 free (bus -> format_buffer );
237239 }
240+ #if CONFIG_PM_ENABLE
238241 if (bus -> pm_lock ) {
239242 esp_pm_lock_delete (bus -> pm_lock );
240243 }
244+ #endif
241245 free (bus );
242246 }
243247 return ret ;
@@ -251,9 +255,11 @@ esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus)
251255 int bus_id = bus -> bus_id ;
252256 i2s_platform_release_occupation (I2S_CTLR_HP , bus_id );
253257 esp_intr_free (bus -> intr );
258+ #if CONFIG_PM_ENABLE
254259 if (bus -> pm_lock ) {
255260 esp_pm_lock_delete (bus -> pm_lock );
256261 }
262+ #endif
257263 free (bus -> format_buffer );
258264 gdma_del_link_list (bus -> dma_link );
259265 free (bus );
@@ -550,10 +556,12 @@ static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, cons
550556 // delay a while, wait for DMA data being feed to I2S FIFO
551557 // in fact, this is only needed when LCD pixel clock is set too high
552558 esp_rom_delay_us (1 );
559+ #if CONFIG_PM_ENABLE
553560 // increase the pm lock reference count before starting a new transaction
554561 if (bus -> pm_lock ) {
555562 esp_pm_lock_acquire (bus -> pm_lock );
556563 }
564+ #endif
557565 i2s_ll_tx_start (bus -> hal .dev );
558566 // polling the trans done event
559567 while (!(i2s_ll_get_intr_status (bus -> hal .dev ) & I2S_LL_EVENT_TX_EOF )) {}
@@ -574,10 +582,12 @@ static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, cons
574582 // polling the trans done event, but don't clear the event status
575583 while (!(i2s_ll_get_intr_status (bus -> hal .dev ) & I2S_LL_EVENT_TX_EOF )) {}
576584 }
585+ #if CONFIG_PM_ENABLE
577586 // decrease pm lock reference count
578587 if (bus -> pm_lock ) {
579588 esp_pm_lock_release (bus -> pm_lock );
580589 }
590+ #endif
581591 bus -> cur_trans = NULL ;
582592 return ESP_OK ;
583593}
@@ -624,17 +634,21 @@ static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, cons
624634 i2s_ll_tx_reset (bus -> hal .dev ); // reset TX engine first
625635 i2s_ll_start_out_link (bus -> hal .dev );
626636 esp_rom_delay_us (1 );
637+ #if CONFIG_PM_ENABLE
627638 // increase the pm lock reference count before starting a new transaction
628639 if (bus -> pm_lock ) {
629640 esp_pm_lock_acquire (bus -> pm_lock );
630641 }
642+ #endif
631643 i2s_ll_tx_start (bus -> hal .dev );
632644 // polling the trans done event
633645 while (!(i2s_ll_get_intr_status (bus -> hal .dev ) & I2S_LL_EVENT_TX_EOF )) {}
646+ #if CONFIG_PM_ENABLE
634647 // decrease pm lock reference count
635648 if (bus -> pm_lock ) {
636649 esp_pm_lock_release (bus -> pm_lock );
637650 }
651+ #endif
638652 bus -> cur_trans = NULL ;
639653
640654 // sending LCD color data to queue
@@ -770,10 +784,12 @@ static IRAM_ATTR void i2s_lcd_default_isr_handler(void *args)
770784 // process finished transaction
771785 if (trans_desc ) {
772786 assert (trans_desc -> i80_device == cur_device && "transaction device mismatch" );
787+ #if CONFIG_PM_ENABLE
773788 // decrease pm lock reference count
774789 if (bus -> pm_lock ) {
775790 esp_pm_lock_release (bus -> pm_lock );
776791 }
792+ #endif
777793 // device callback
778794 if (trans_desc -> trans_done_cb ) {
779795 if (trans_desc -> trans_done_cb (& cur_device -> base , NULL , trans_desc -> user_ctx )) {
@@ -824,10 +840,12 @@ static IRAM_ATTR void i2s_lcd_default_isr_handler(void *args)
824840 i2s_ll_tx_reset (bus -> hal .dev ); // reset TX engine first
825841 i2s_ll_start_out_link (bus -> hal .dev );
826842 esp_rom_delay_us (1 );
843+ #if CONFIG_PM_ENABLE
827844 // increase the pm lock reference count before starting a new transaction
828845 if (bus -> pm_lock ) {
829846 esp_pm_lock_acquire (bus -> pm_lock );
830847 }
848+ #endif
831849 i2s_ll_tx_start (bus -> hal .dev );
832850 break ; // exit for-each loop
833851 }
0 commit comments