diff --git a/src/arch/xtensa/lib/cpu.c b/src/arch/xtensa/lib/cpu.c index fc2f9458d..b465dd5d0 100644 --- a/src/arch/xtensa/lib/cpu.c +++ b/src/arch/xtensa/lib/cpu.c @@ -164,7 +164,7 @@ void cpu_power_down_core(void) { arch_interrupt_global_disable(); - idc_free(); + idc_free(0); schedule_free(); diff --git a/src/drivers/intel/cavs/idc.c b/src/drivers/intel/cavs/idc.c index 72f7b0d65..cea98740f 100644 --- a/src/drivers/intel/cavs/idc.c +++ b/src/drivers/intel/cavs/idc.c @@ -279,7 +279,7 @@ int platform_idc_restore(void) /** * \brief Frees IDC data and unregisters interrupt. */ -void idc_free(void) +void idc_free(uint32_t flags) { struct idc *idc = *idc_get(); int core = cpu_get_id(); @@ -299,5 +299,8 @@ void idc_free(void) idc_write(IPC_IDCTFC(i), core, idctfc); } + if (flags & IDC_FREE_IRQ_ONLY) + return; + schedule_task_free(&idc->idc_task); } diff --git a/src/include/sof/drivers/idc.h b/src/include/sof/drivers/idc.h index a1481ac61..800710c26 100644 --- a/src/include/sof/drivers/idc.h +++ b/src/include/sof/drivers/idc.h @@ -94,6 +94,9 @@ /** \brief Max IDC message payload size in bytes. */ #define IDC_MAX_PAYLOAD_SIZE 96 +/** \brief IDC free function flags */ +#define IDC_FREE_IRQ_ONLY BIT(0) /**< disable only irqs */ + /** \brief IDC message payload. */ struct idc_payload { uint8_t data[IDC_MAX_PAYLOAD_SIZE]; @@ -128,7 +131,7 @@ static inline struct idc_payload *idc_payload_get(struct idc *idc, void idc_enable_interrupts(int target_core, int source_core); -void idc_free(void); +void idc_free(uint32_t flags); int platform_idc_init(void);