mirror of https://github.com/thesofproject/sof.git
idc: add an irq private data member
Use the platform provided IDC IRQ number only once and save the number in a private field. This relies on the fact, that the interrupt number is the same on all cores. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
This commit is contained in:
parent
d79c9190e9
commit
fe5886808b
|
@ -50,9 +50,11 @@ static struct idc **idc_get(void)
|
||||||
*/
|
*/
|
||||||
void idc_enable_interrupts(int target_core, int source_core)
|
void idc_enable_interrupts(int target_core, int source_core)
|
||||||
{
|
{
|
||||||
|
struct idc *idc = *idc_get();
|
||||||
|
|
||||||
idc_write(IPC_IDCCTL, target_core,
|
idc_write(IPC_IDCCTL, target_core,
|
||||||
IPC_IDCCTL_IDCTBIE(source_core));
|
IPC_IDCCTL_IDCTBIE(source_core));
|
||||||
interrupt_unmask(PLATFORM_IDC_INTERRUPT(target_core), target_core);
|
interrupt_unmask(idc->irq, target_core);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -347,11 +349,12 @@ int arch_idc_init(void)
|
||||||
SOF_TASK_PRI_IDC, idc_do_cmd, *idc, core, 0);
|
SOF_TASK_PRI_IDC, idc_do_cmd, *idc, core, 0);
|
||||||
|
|
||||||
/* configure interrupt */
|
/* configure interrupt */
|
||||||
ret = interrupt_register(PLATFORM_IDC_INTERRUPT(core), IRQ_AUTO_UNMASK,
|
(*idc)->irq = PLATFORM_IDC_INTERRUPT(core);
|
||||||
idc_irq_handler, *idc);
|
ret = interrupt_register((*idc)->irq, IRQ_AUTO_UNMASK, idc_irq_handler,
|
||||||
|
*idc);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
interrupt_enable(PLATFORM_IDC_INTERRUPT(core));
|
interrupt_enable((*idc)->irq);
|
||||||
|
|
||||||
/* enable BUSY and DONE (only for master core) interrupts */
|
/* enable BUSY and DONE (only for master core) interrupts */
|
||||||
idc_write(IPC_IDCCTL, core,
|
idc_write(IPC_IDCCTL, core,
|
||||||
|
@ -373,8 +376,8 @@ void idc_free(void)
|
||||||
trace_idc("idc_free()");
|
trace_idc("idc_free()");
|
||||||
|
|
||||||
/* disable and unregister interrupt */
|
/* disable and unregister interrupt */
|
||||||
interrupt_disable(PLATFORM_IDC_INTERRUPT(core));
|
interrupt_disable(idc->irq);
|
||||||
interrupt_unregister(PLATFORM_IDC_INTERRUPT(core), idc);
|
interrupt_unregister(idc->irq, idc);
|
||||||
|
|
||||||
/* clear BUSY bits */
|
/* clear BUSY bits */
|
||||||
for (i = 0; i < PLATFORM_CORE_COUNT; i++) {
|
for (i = 0; i < PLATFORM_CORE_COUNT; i++) {
|
||||||
|
|
|
@ -98,6 +98,7 @@ struct idc {
|
||||||
uint32_t done_bit_mask; /**< done interrupt mask */
|
uint32_t done_bit_mask; /**< done interrupt mask */
|
||||||
struct idc_msg received_msg; /**< received message */
|
struct idc_msg received_msg; /**< received message */
|
||||||
struct task idc_task; /**< IDC processing task */
|
struct task idc_task; /**< IDC processing task */
|
||||||
|
int irq;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __SOF_DRIVERS_IDC_H__ */
|
#endif /* __SOF_DRIVERS_IDC_H__ */
|
||||||
|
|
Loading…
Reference in New Issue