@@ -51,6 +51,7 @@ static inline int irq_canonicalize(int irq)
#else
#define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */
#endif
+int get_mips_sw_int(int hwint);
asmlinkage void plat_irq_dispatch(void);
@@ -9,7 +9,10 @@
#ifndef _ASM_IRQ_CPU_H
#define _ASM_IRQ_CPU_H
+#include <linux/irqdomain.h>
+
extern void mips_cpu_irq_init(void);
+extern int mips_cpu_get_sw_int(int hwint);
#ifdef CONFIG_IRQ_DOMAIN
struct device_node;
@@ -26,10 +26,27 @@
#include <linux/atomic.h>
#include <linux/uaccess.h>
+#include <asm/irq_cpu.h>
#include <asm/ipi.h>
void *irq_stack[NR_CPUS];
+int __weak get_mips_sw_int(int hwint)
+{
+ /* Only SW0 and SW1 */
+ WARN_ON(hwint > 1);
+
+ /* SW int is routed to external source */
+ if (cpu_has_veic)
+ return 0;
+
+#ifdef CONFIG_IRQ_MIPS_CPU
+ return mips_cpu_get_sw_int(hwint);
+#endif
+
+ return MIPS_CPU_IRQ_BASE + hwint;
+}
+
/*
* 'what should we do if we get a hw irq event on an illegal vector'.
* each architecture has to answer this themselves.
@@ -254,6 +254,17 @@ static inline void mips_cpu_register_ipi_domain(struct device_node *of_node) {}
#endif /* !CONFIG_GENERIC_IRQ_IPI */
+int mips_cpu_get_sw_int(int hwint)
+{
+ /* Only 0 and 1 for SW INT */
+ WARN_ON(hwint > 1);
+
+ if (!irq_domain)
+ return 0;
+
+ return irq_create_mapping(irq_domain, hwint);
+}
+
static void __init __mips_cpu_irq_init(struct device_node *of_node)
{
/* Mask interrupts. */