Commit a37c6c7a authored by Paul Mundt's avatar Paul Mundt

sh: mach-se: Convert SE7722 FPGA to dynamic IRQ allocation.

This gets rid of the arbitrary set of vectors used by the SE7722 FPGA
interrupt controller and witches over to a completely dynamic set.
No assumptions regarding a contiguous range are made, and the platform
resources themselves need to be filled in lazily.
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 45b9deaf
...@@ -16,15 +16,17 @@ ...@@ -16,15 +16,17 @@
#include <asm/io.h> #include <asm/io.h>
#include <mach-se/mach/se7722.h> #include <mach-se/mach/se7722.h>
unsigned int se7722_fpga_irq[SE7722_FPGA_IRQ_NR] = { 0, };
static void disable_se7722_irq(unsigned int irq) static void disable_se7722_irq(unsigned int irq)
{ {
unsigned int bit = irq - SE7722_FPGA_IRQ_BASE; unsigned int bit = (unsigned int)get_irq_chip_data(irq);
ctrl_outw(ctrl_inw(IRQ01_MASK) | 1 << bit, IRQ01_MASK); ctrl_outw(ctrl_inw(IRQ01_MASK) | 1 << bit, IRQ01_MASK);
} }
static void enable_se7722_irq(unsigned int irq) static void enable_se7722_irq(unsigned int irq)
{ {
unsigned int bit = irq - SE7722_FPGA_IRQ_BASE; unsigned int bit = (unsigned int)get_irq_chip_data(irq);
ctrl_outw(ctrl_inw(IRQ01_MASK) & ~(1 << bit), IRQ01_MASK); ctrl_outw(ctrl_inw(IRQ01_MASK) & ~(1 << bit), IRQ01_MASK);
} }
...@@ -38,18 +40,15 @@ static struct irq_chip se7722_irq_chip __read_mostly = { ...@@ -38,18 +40,15 @@ static struct irq_chip se7722_irq_chip __read_mostly = {
static void se7722_irq_demux(unsigned int irq, struct irq_desc *desc) static void se7722_irq_demux(unsigned int irq, struct irq_desc *desc)
{ {
unsigned short intv = ctrl_inw(IRQ01_STS); unsigned short intv = ctrl_inw(IRQ01_STS);
struct irq_desc *ext_desc; unsigned int ext_irq = 0;
unsigned int ext_irq = SE7722_FPGA_IRQ_BASE;
intv &= (1 << SE7722_FPGA_IRQ_NR) - 1; intv &= (1 << SE7722_FPGA_IRQ_NR) - 1;
while (intv) { for (; intv; intv >>= 1, ext_irq++) {
if (intv & 1) { if (!(intv & 1))
ext_desc = irq_desc + ext_irq; continue;
handle_level_irq(ext_irq, ext_desc);
} generic_handle_irq(se7722_fpga_irq[ext_irq]);
intv >>= 1;
ext_irq++;
} }
} }
...@@ -63,11 +62,18 @@ void __init init_se7722_IRQ(void) ...@@ -63,11 +62,18 @@ void __init init_se7722_IRQ(void)
ctrl_outw(0, IRQ01_MASK); /* disable all irqs */ ctrl_outw(0, IRQ01_MASK); /* disable all irqs */
ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */ ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */
for (i = 0; i < SE7722_FPGA_IRQ_NR; i++) for (i = 0; i < SE7722_FPGA_IRQ_NR; i++) {
set_irq_chip_and_handler_name(SE7722_FPGA_IRQ_BASE + i, se7722_fpga_irq[i] = create_irq();
if (se7722_fpga_irq[i] < 0)
return;
set_irq_chip_and_handler_name(se7722_fpga_irq[i],
&se7722_irq_chip, &se7722_irq_chip,
handle_level_irq, "level"); handle_level_irq, "level");
set_irq_chip_data(se7722_fpga_irq[i], (void *)i);
}
set_irq_chained_handler(IRQ0_IRQ, se7722_irq_demux); set_irq_chained_handler(IRQ0_IRQ, se7722_irq_demux);
set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW); set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW);
......
...@@ -60,8 +60,7 @@ static struct resource smc91x_eth_resources[] = { ...@@ -60,8 +60,7 @@ static struct resource smc91x_eth_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
.start = SMC_IRQ, /* Filled in later */
.end = SMC_IRQ,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -90,8 +89,7 @@ static struct resource cf_ide_resources[] = { ...@@ -90,8 +89,7 @@ static struct resource cf_ide_resources[] = {
.flags = IORESOURCE_IO, .flags = IORESOURCE_IO,
}, },
[2] = { [2] = {
.start = MRSHPC_IRQ0, /* Filled in later */
.end = MRSHPC_IRQ0,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -153,6 +151,14 @@ static struct platform_device *se7722_devices[] __initdata = { ...@@ -153,6 +151,14 @@ static struct platform_device *se7722_devices[] __initdata = {
static int __init se7722_devices_setup(void) static int __init se7722_devices_setup(void)
{ {
mrshpc_setup_windows(); mrshpc_setup_windows();
/* Wire-up dynamic vectors */
cf_ide_resources[2].start = cf_ide_resources[2].end =
se7722_fpga_irq[SE7722_FPGA_IRQ_MRSHPC0];
smc91x_eth_resources[1].start = smc91x_eth_resources[1].end =
se7722_fpga_irq[SE7722_FPGA_IRQ_SMC];
return platform_add_devices(se7722_devices, ARRAY_SIZE(se7722_devices)); return platform_add_devices(se7722_devices, ARRAY_SIZE(se7722_devices));
} }
device_initcall(se7722_devices_setup); device_initcall(se7722_devices_setup);
...@@ -193,6 +199,5 @@ static void __init se7722_setup(char **cmdline_p) ...@@ -193,6 +199,5 @@ static void __init se7722_setup(char **cmdline_p)
static struct sh_machine_vector mv_se7722 __initmv = { static struct sh_machine_vector mv_se7722 __initmv = {
.mv_name = "Solution Engine 7722" , .mv_name = "Solution Engine 7722" ,
.mv_setup = se7722_setup , .mv_setup = se7722_setup ,
.mv_nr_irqs = SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_NR,
.mv_init_irq = init_se7722_IRQ, .mv_init_irq = init_se7722_IRQ,
}; };
...@@ -92,18 +92,11 @@ ...@@ -92,18 +92,11 @@
#define SE7722_FPGA_IRQ_MRSHPC1 3 /* IRQ1 */ #define SE7722_FPGA_IRQ_MRSHPC1 3 /* IRQ1 */
#define SE7722_FPGA_IRQ_MRSHPC2 4 /* IRQ1 */ #define SE7722_FPGA_IRQ_MRSHPC2 4 /* IRQ1 */
#define SE7722_FPGA_IRQ_MRSHPC3 5 /* IRQ1 */ #define SE7722_FPGA_IRQ_MRSHPC3 5 /* IRQ1 */
#define SE7722_FPGA_IRQ_NR 6 #define SE7722_FPGA_IRQ_NR 6
#define SE7722_FPGA_IRQ_BASE 110
#define MRSHPC_IRQ3 (SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_MRSHPC3)
#define MRSHPC_IRQ2 (SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_MRSHPC2)
#define MRSHPC_IRQ1 (SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_MRSHPC1)
#define MRSHPC_IRQ0 (SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_MRSHPC0)
#define SMC_IRQ (SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_SMC)
#define USB_IRQ (SE7722_FPGA_IRQ_BASE + SE7722_FPGA_IRQ_USB)
/* arch/sh/boards/se/7722/irq.c */ /* arch/sh/boards/se/7722/irq.c */
extern unsigned int se7722_fpga_irq[];
void init_se7722_IRQ(void); void init_se7722_IRQ(void);
#define __IO_PREFIX se7722 #define __IO_PREFIX se7722
......
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