Commit 179cf194 authored by Vineet Gupta's avatar Vineet Gupta

ARCv2: intc: Use runtime value of irq count for setting up intc

Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent f33b8cdd
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#ifdef CONFIG_ISA_ARCV2 #ifdef CONFIG_ISA_ARCV2
#define IPI_IRQ 19 #define IPI_IRQ 19
#define SOFTIRQ_IRQ 21 #define SOFTIRQ_IRQ 21
#define FIRST_EXT_IRQ 24
#endif #endif
#include <linux/interrupt.h> #include <linux/interrupt.h>
......
...@@ -14,7 +14,15 @@ ...@@ -14,7 +14,15 @@
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <asm/irq.h> #include <asm/irq.h>
#define NR_CPU_IRQS 32 /* number of irq lines coming in */ #define NR_EXCEPTIONS 16
struct bcr_irq_arcv2 {
#ifdef CONFIG_CPU_BIG_ENDIAN
unsigned int pad:3, firq:1, prio:4, exts:8, irqs:8, ver:8;
#else
unsigned int ver:8, irqs:8, exts:8, prio:4, firq:1, pad:3;
#endif
};
/* /*
* Early Hardware specific Interrupt setup * Early Hardware specific Interrupt setup
...@@ -25,14 +33,7 @@ ...@@ -25,14 +33,7 @@
void arc_init_IRQ(void) void arc_init_IRQ(void)
{ {
unsigned int tmp, irq_prio; unsigned int tmp, irq_prio;
struct bcr_irq_arcv2 irq_bcr;
struct irq_build {
#ifdef CONFIG_CPU_BIG_ENDIAN
unsigned int pad:3, firq:1, prio:4, exts:8, irqs:8, ver:8;
#else
unsigned int ver:8, irqs:8, exts:8, prio:4, firq:1, pad:3;
#endif
} irq_bcr;
struct aux_irq_ctrl { struct aux_irq_ctrl {
#ifdef CONFIG_CPU_BIG_ENDIAN #ifdef CONFIG_CPU_BIG_ENDIAN
...@@ -117,7 +118,7 @@ static int arcv2_irq_map(struct irq_domain *d, unsigned int irq, ...@@ -117,7 +118,7 @@ static int arcv2_irq_map(struct irq_domain *d, unsigned int irq,
* core intc IRQs [16, 23]: * core intc IRQs [16, 23]:
* Statically assigned always private-per-core (Timers, WDT, IPI, PCT) * Statically assigned always private-per-core (Timers, WDT, IPI, PCT)
*/ */
if (hw < 24) { if (hw < FIRST_EXT_IRQ) {
/* /*
* A subsequent request_percpu_irq() fails if percpu_devid is * A subsequent request_percpu_irq() fails if percpu_devid is
* not set. That in turns sets NOAUTOEN, meaning each core needs * not set. That in turns sets NOAUTOEN, meaning each core needs
...@@ -142,11 +143,16 @@ static int __init ...@@ -142,11 +143,16 @@ static int __init
init_onchip_IRQ(struct device_node *intc, struct device_node *parent) init_onchip_IRQ(struct device_node *intc, struct device_node *parent)
{ {
struct irq_domain *root_domain; struct irq_domain *root_domain;
struct bcr_irq_arcv2 irq_bcr;
unsigned int nr_cpu_irqs;
READ_BCR(ARC_REG_IRQ_BCR, irq_bcr);
nr_cpu_irqs = irq_bcr.irqs + NR_EXCEPTIONS;
if (parent) if (parent)
panic("DeviceTree incore intc not a root irq controller\n"); panic("DeviceTree incore intc not a root irq controller\n");
root_domain = irq_domain_add_linear(intc, NR_CPU_IRQS, &arcv2_irq_ops, NULL); root_domain = irq_domain_add_linear(intc, nr_cpu_irqs, &arcv2_irq_ops, NULL);
if (!root_domain) if (!root_domain)
panic("root irq domain not avail\n"); panic("root irq domain not avail\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment