|
@@ -19,6 +19,7 @@
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
+#include <linux/module.h>
|
|
|
#include <linux/irq.h>
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/sh_intc.h>
|
|
@@ -305,14 +306,16 @@ static DECLARE_INTC_DESC(intca_desc, "sh7372-intca",
|
|
|
intca_mask_registers, intca_prio_registers,
|
|
|
NULL);
|
|
|
|
|
|
-INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000,
|
|
|
- INTC_VECT, "sh7372-intca-irq-pins");
|
|
|
+INTC_IRQ_PINS_16(intca_irq_pins_lo, 0xe6900000,
|
|
|
+ INTC_VECT, "sh7372-intca-irq-lo");
|
|
|
+
|
|
|
+INTC_IRQ_PINS_16H(intca_irq_pins_hi, 0xe6900000,
|
|
|
+ INTC_VECT, "sh7372-intca-irq-hi");
|
|
|
+
|
|
|
enum {
|
|
|
UNUSED_INTCS = 0,
|
|
|
ENABLED_INTCS,
|
|
|
|
|
|
- INTCS,
|
|
|
-
|
|
|
/* interrupt sources INTCS */
|
|
|
|
|
|
/* IRQ0S - IRQ31S */
|
|
@@ -426,8 +429,6 @@ static struct intc_vect intcs_vectors[] = {
|
|
|
INTCS_VECT(CPORTS2R, 0x1a20),
|
|
|
/* CEC */
|
|
|
INTCS_VECT(JPU6E, 0x1a80),
|
|
|
-
|
|
|
- INTC_VECT(INTCS, 0xf80),
|
|
|
};
|
|
|
|
|
|
static struct intc_group intcs_groups[] __initdata = {
|
|
@@ -490,9 +491,6 @@ static struct intc_mask_reg intcs_mask_registers[] = {
|
|
|
{ 0xffd5019c, 0xffd501dc, 8, /* IMR7SA3 / IMCR7SA3 */
|
|
|
{ MFIS2_INTCS, CPORTS2R, 0, 0,
|
|
|
JPU6E, 0, 0, 0 } },
|
|
|
- { 0xffd20104, 0, 16, /* INTAMASK */
|
|
|
- { 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
- 0, 0, 0, 0, 0, 0, 0, INTCS } },
|
|
|
};
|
|
|
|
|
|
/* Priority is needed for INTCA to receive the INTCS interrupt */
|
|
@@ -557,18 +555,30 @@ static void __iomem *intcs_ffd5;
|
|
|
void __init sh7372_init_irq(void)
|
|
|
{
|
|
|
void __iomem *intevtsa;
|
|
|
+ int n;
|
|
|
|
|
|
intcs_ffd2 = ioremap_nocache(0xffd20000, PAGE_SIZE);
|
|
|
intevtsa = intcs_ffd2 + 0x100;
|
|
|
intcs_ffd5 = ioremap_nocache(0xffd50000, PAGE_SIZE);
|
|
|
|
|
|
register_intc_controller(&intca_desc);
|
|
|
- register_intc_controller(&intca_irq_pins_desc);
|
|
|
+ register_intc_controller(&intca_irq_pins_lo_desc);
|
|
|
+ register_intc_controller(&intca_irq_pins_hi_desc);
|
|
|
register_intc_controller(&intcs_desc);
|
|
|
|
|
|
+ /* setup dummy cascade chip for INTCS */
|
|
|
+ n = evt2irq(0xf80);
|
|
|
+ irq_alloc_desc_at(n, numa_node_id());
|
|
|
+ irq_set_chip_and_handler_name(n, &dummy_irq_chip,
|
|
|
+ handle_level_irq, "level");
|
|
|
+ set_irq_flags(n, IRQF_VALID); /* yuck */
|
|
|
+
|
|
|
/* demux using INTEVTSA */
|
|
|
- irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa);
|
|
|
- irq_set_chained_handler(evt2irq(0xf80), intcs_demux);
|
|
|
+ irq_set_handler_data(n, (void *)intevtsa);
|
|
|
+ irq_set_chained_handler(n, intcs_demux);
|
|
|
+
|
|
|
+ /* unmask INTCS in INTAMASK */
|
|
|
+ iowrite16(0, intcs_ffd2 + 0x104);
|
|
|
}
|
|
|
|
|
|
static unsigned short ffd2[0x200];
|