#include "esp_intr_alloc.h"
#include "esp_log.h"
#include "esp_err.h"
+#include "esp_pm.h"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/xtensa_api.h"
QueueHandle_t trans_queue;
QueueHandle_t ret_queue;
int dma_chan;
+#ifdef CONFIG_PM_ENABLE
+ esp_pm_lock_handle_t pm_lock;
+#endif
} spi_slave_t;
static spi_slave_t *spihost[3];
//We're limited to non-DMA transfers: the SPI work registers can hold 64 bytes at most.
spihost[host]->max_transfer_sz = 16 * 4;
}
+#ifdef CONFIG_PM_ENABLE
+ esp_err_t err = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "spi_slave",
+ &spihost[host]->pm_lock);
+ if (err != ESP_OK) {
+ goto nomem;
+ }
+ // Lock APB frequency while SPI slave driver is in use
+ esp_pm_lock_acquire(spihost[host]->pm_lock);
+#endif //CONFIG_PM_ENABLE
//Create queues
spihost[host]->trans_queue = xQueueCreate(slave_config->queue_size, sizeof(spi_slave_transaction_t *));
if (spihost[host]->ret_queue) vQueueDelete(spihost[host]->ret_queue);
free(spihost[host]->dmadesc_tx);
free(spihost[host]->dmadesc_rx);
+#ifdef CONFIG_PM_ENABLE
+ if (spihost[host]->pm_lock) {
+ esp_pm_lock_release(spihost[host]->pm_lock);
+ esp_pm_lock_delete(spihost[host]->pm_lock);
+ }
+#endif
}
free(spihost[host]);
spihost[host] = NULL;
}
free(spihost[host]->dmadesc_tx);
free(spihost[host]->dmadesc_rx);
+#ifdef CONFIG_PM_ENABLE
+ esp_pm_lock_release(spihost[host]->pm_lock);
+ esp_pm_lock_delete(spihost[host]->pm_lock);
+#endif //CONFIG_PM_ENABLE
free(spihost[host]);
spihost[host] = NULL;
spicommon_periph_free(host);