- remove irq_mapping from smp.c to irq-driver - Add set_ipi_irq_mapping api to irq-driver - update asm/smp.h Signed-off-by: Guo Ren <ren_guo@xxxxxxxxx> --- arch/csky/include/asm/smp.h | 4 ++++ arch/csky/kernel/smp.c | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/arch/csky/include/asm/smp.h b/arch/csky/include/asm/smp.h index 9a53abf..fed3a5a 100644 --- a/arch/csky/include/asm/smp.h +++ b/arch/csky/include/asm/smp.h @@ -7,6 +7,8 @@ #ifdef CONFIG_SMP +#define IPI_IRQ 15 + void __init setup_smp(void); void __init setup_smp_ipi(void); @@ -19,6 +21,8 @@ void arch_send_call_function_single_ipi(int cpu); void __init set_send_ipi(void (*func)(const unsigned long *, unsigned long)); +void __init set_ipi_irq_mapping(int (*func)(void)); + #define raw_smp_processor_id() (current_thread_info()->cpu) #endif /* CONFIG_SMP */ diff --git a/arch/csky/kernel/smp.c b/arch/csky/kernel/smp.c index 522c73f..f8343f6 100644 --- a/arch/csky/kernel/smp.c +++ b/arch/csky/kernel/smp.c @@ -20,8 +20,6 @@ #include <asm/mmu_context.h> #include <asm/pgalloc.h> -#define IPI_IRQ 15 - static struct { unsigned long bits ____cacheline_aligned; } ipi_data[NR_CPUS] __cacheline_aligned; @@ -121,13 +119,23 @@ void __init enable_smp_ipi(void) enable_percpu_irq(IPI_IRQ, 0); } +static int (*arch_ipi_irq_mapping)(void) = NULL; + +void __init set_ipi_irq_mapping(int (*func)(void)) +{ + if (arch_ipi_irq_mapping) + return; + + arch_ipi_irq_mapping = func; +} + void __init setup_smp_ipi(void) { - int rc; + int rc, irq; - irq_create_mapping(NULL, IPI_IRQ); + irq = arch_ipi_irq_mapping(); - rc = request_percpu_irq(IPI_IRQ, handle_ipi, "IPI Interrupt", &ipi_dummy_dev); + rc = request_percpu_irq(irq, handle_ipi, "IPI Interrupt", &ipi_dummy_dev); if (rc) panic("%s IRQ request failed\n", __func__); -- 2.7.4