forked from Minki/linux
d7e7e4ffc6
Add INTC_IRQ_PINS_16H to allow broken out support of the the high 16 external interrupt pins. On SoCs with 32 external interrupt pins the interrupt vectors for the low 16 and the high 16 interrupt pins are sparesly populated. The low 16 are at 0x0200 and high 16 are at 0x3200 which with current macros results in a separation of 384 linux interrupts. This sparse population makes it unsuitable with a single IRQ domain to cover the full IRQ range, so this macro breaks out the 32 pins into two separate 16 bit controllers to allow two independent INTC instances with two separate IRQ domains. Signed-off-by: Magnus Damm <damm@opensource.se> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
291 lines
10 KiB
C
291 lines
10 KiB
C
#ifndef __ASM_MACH_INTC_H
|
|
#define __ASM_MACH_INTC_H
|
|
#include <linux/sh_intc.h>
|
|
|
|
#define INTC_IRQ_PINS_ENUM_16L(p) \
|
|
p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
|
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7, \
|
|
p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
|
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15
|
|
|
|
#define INTC_IRQ_PINS_ENUM_16H(p) \
|
|
p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
|
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23, \
|
|
p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
|
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31
|
|
|
|
#define INTC_IRQ_PINS_VECT_16L(p, vect) \
|
|
vect(p ## _IRQ0, 0x0200), vect(p ## _IRQ1, 0x0220), \
|
|
vect(p ## _IRQ2, 0x0240), vect(p ## _IRQ3, 0x0260), \
|
|
vect(p ## _IRQ4, 0x0280), vect(p ## _IRQ5, 0x02a0), \
|
|
vect(p ## _IRQ6, 0x02c0), vect(p ## _IRQ7, 0x02e0), \
|
|
vect(p ## _IRQ8, 0x0300), vect(p ## _IRQ9, 0x0320), \
|
|
vect(p ## _IRQ10, 0x0340), vect(p ## _IRQ11, 0x0360), \
|
|
vect(p ## _IRQ12, 0x0380), vect(p ## _IRQ13, 0x03a0), \
|
|
vect(p ## _IRQ14, 0x03c0), vect(p ## _IRQ15, 0x03e0)
|
|
|
|
#define INTC_IRQ_PINS_VECT_16H(p, vect) \
|
|
vect(p ## _IRQ16, 0x3200), vect(p ## _IRQ17, 0x3220), \
|
|
vect(p ## _IRQ18, 0x3240), vect(p ## _IRQ19, 0x3260), \
|
|
vect(p ## _IRQ20, 0x3280), vect(p ## _IRQ21, 0x32a0), \
|
|
vect(p ## _IRQ22, 0x32c0), vect(p ## _IRQ23, 0x32e0), \
|
|
vect(p ## _IRQ24, 0x3300), vect(p ## _IRQ25, 0x3320), \
|
|
vect(p ## _IRQ26, 0x3340), vect(p ## _IRQ27, 0x3360), \
|
|
vect(p ## _IRQ28, 0x3380), vect(p ## _IRQ29, 0x33a0), \
|
|
vect(p ## _IRQ30, 0x33c0), vect(p ## _IRQ31, 0x33e0)
|
|
|
|
#define INTC_IRQ_PINS_MASK_16L(p, base) \
|
|
{ base + 0x40, base + 0x60, 8, /* INTMSK00A / INTMSKCLR00A */ \
|
|
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
|
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
|
{ base + 0x44, base + 0x64, 8, /* INTMSK10A / INTMSKCLR10A */ \
|
|
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
|
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
|
|
|
#define INTC_IRQ_PINS_MASK_16H(p, base) \
|
|
{ base + 0x48, base + 0x68, 8, /* INTMSK20A / INTMSKCLR20A */ \
|
|
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
|
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
|
{ base + 0x4c, base + 0x6c, 8, /* INTMSK30A / INTMSKCLR30A */ \
|
|
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
|
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
|
|
|
#define INTC_IRQ_PINS_PRIO_16L(p, base) \
|
|
{ base + 0x10, 0, 32, 4, /* INTPRI00A */ \
|
|
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
|
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
|
{ base + 0x14, 0, 32, 4, /* INTPRI10A */ \
|
|
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
|
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
|
|
|
#define INTC_IRQ_PINS_PRIO_16H(p, base) \
|
|
{ base + 0x18, 0, 32, 4, /* INTPRI20A */ \
|
|
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
|
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
|
{ base + 0x1c, 0, 32, 4, /* INTPRI30A */ \
|
|
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
|
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
|
|
|
#define INTC_IRQ_PINS_SENSE_16L(p, base) \
|
|
{ base + 0x00, 32, 4, /* ICR1A */ \
|
|
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
|
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
|
{ base + 0x04, 32, 4, /* ICR2A */ \
|
|
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
|
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
|
|
|
#define INTC_IRQ_PINS_SENSE_16H(p, base) \
|
|
{ base + 0x08, 32, 4, /* ICR3A */ \
|
|
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
|
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
|
{ base + 0x0c, 32, 4, /* ICR4A */ \
|
|
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
|
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
|
|
|
#define INTC_IRQ_PINS_ACK_16L(p, base) \
|
|
{ base + 0x20, 0, 8, /* INTREQ00A */ \
|
|
{ p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3, \
|
|
p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } }, \
|
|
{ base + 0x24, 0, 8, /* INTREQ10A */ \
|
|
{ p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11, \
|
|
p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
|
|
|
|
#define INTC_IRQ_PINS_ACK_16H(p, base) \
|
|
{ base + 0x28, 0, 8, /* INTREQ20A */ \
|
|
{ p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19, \
|
|
p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } }, \
|
|
{ base + 0x2c, 0, 8, /* INTREQ30A */ \
|
|
{ p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27, \
|
|
p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
|
|
|
|
#define INTC_IRQ_PINS_16(p, base, vect, str) \
|
|
\
|
|
static struct resource p ## _resources[] __initdata = { \
|
|
[0] = { \
|
|
.start = base, \
|
|
.end = base + 0x64, \
|
|
.flags = IORESOURCE_MEM, \
|
|
}, \
|
|
}; \
|
|
\
|
|
enum { \
|
|
p ## _UNUSED = 0, \
|
|
INTC_IRQ_PINS_ENUM_16L(p), \
|
|
}; \
|
|
\
|
|
static struct intc_vect p ## _vectors[] __initdata = { \
|
|
INTC_IRQ_PINS_VECT_16L(p, vect), \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_MASK_16L(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_prio_reg p ## _prio_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_PRIO_16L(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_SENSE_16L(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _ack_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_ACK_16L(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_desc p ## _desc __initdata = { \
|
|
.name = str, \
|
|
.resource = p ## _resources, \
|
|
.num_resources = ARRAY_SIZE(p ## _resources), \
|
|
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
|
p ## _mask_registers, p ## _prio_registers, \
|
|
p ## _sense_registers, p ## _ack_registers) \
|
|
}
|
|
|
|
#define INTC_IRQ_PINS_16H(p, base, vect, str) \
|
|
\
|
|
static struct resource p ## _resources[] __initdata = { \
|
|
[0] = { \
|
|
.start = base, \
|
|
.end = base + 0x64, \
|
|
.flags = IORESOURCE_MEM, \
|
|
}, \
|
|
}; \
|
|
\
|
|
enum { \
|
|
p ## _UNUSED = 0, \
|
|
INTC_IRQ_PINS_ENUM_16H(p), \
|
|
}; \
|
|
\
|
|
static struct intc_vect p ## _vectors[] __initdata = { \
|
|
INTC_IRQ_PINS_VECT_16H(p, vect), \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_MASK_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_prio_reg p ## _prio_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_PRIO_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_SENSE_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _ack_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_ACK_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_desc p ## _desc __initdata = { \
|
|
.name = str, \
|
|
.resource = p ## _resources, \
|
|
.num_resources = ARRAY_SIZE(p ## _resources), \
|
|
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
|
p ## _mask_registers, p ## _prio_registers, \
|
|
p ## _sense_registers, p ## _ack_registers) \
|
|
}
|
|
|
|
#define INTC_IRQ_PINS_32(p, base, vect, str) \
|
|
\
|
|
static struct resource p ## _resources[] __initdata = { \
|
|
[0] = { \
|
|
.start = base, \
|
|
.end = base + 0x6c, \
|
|
.flags = IORESOURCE_MEM, \
|
|
}, \
|
|
}; \
|
|
\
|
|
enum { \
|
|
p ## _UNUSED = 0, \
|
|
INTC_IRQ_PINS_ENUM_16L(p), \
|
|
INTC_IRQ_PINS_ENUM_16H(p), \
|
|
}; \
|
|
\
|
|
static struct intc_vect p ## _vectors[] __initdata = { \
|
|
INTC_IRQ_PINS_VECT_16L(p, vect), \
|
|
INTC_IRQ_PINS_VECT_16H(p, vect), \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_MASK_16L(p, base), \
|
|
INTC_IRQ_PINS_MASK_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_prio_reg p ## _prio_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_PRIO_16L(p, base), \
|
|
INTC_IRQ_PINS_PRIO_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_SENSE_16L(p, base), \
|
|
INTC_IRQ_PINS_SENSE_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _ack_registers[] __initdata = { \
|
|
INTC_IRQ_PINS_ACK_16L(p, base), \
|
|
INTC_IRQ_PINS_ACK_16H(p, base), \
|
|
}; \
|
|
\
|
|
static struct intc_desc p ## _desc __initdata = { \
|
|
.name = str, \
|
|
.resource = p ## _resources, \
|
|
.num_resources = ARRAY_SIZE(p ## _resources), \
|
|
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
|
p ## _mask_registers, p ## _prio_registers, \
|
|
p ## _sense_registers, p ## _ack_registers) \
|
|
}
|
|
|
|
#define INTC_PINT_E_EMPTY
|
|
#define INTC_PINT_E_NONE 0, 0, 0, 0, 0, 0, 0, 0,
|
|
#define INTC_PINT_E(p) \
|
|
PINT ## p ## 0, PINT ## p ## 1, PINT ## p ## 2, PINT ## p ## 3, \
|
|
PINT ## p ## 4, PINT ## p ## 5, PINT ## p ## 6, PINT ## p ## 7,
|
|
|
|
#define INTC_PINT_V_NONE
|
|
#define INTC_PINT_V(p, vect) \
|
|
vect(PINT ## p ## 0, 0), vect(PINT ## p ## 1, 1), \
|
|
vect(PINT ## p ## 2, 2), vect(PINT ## p ## 3, 3), \
|
|
vect(PINT ## p ## 4, 4), vect(PINT ## p ## 5, 5), \
|
|
vect(PINT ## p ## 6, 6), vect(PINT ## p ## 7, 7),
|
|
|
|
#define INTC_PINT(p, mask_reg, sense_base, str, \
|
|
enums_1, enums_2, enums_3, enums_4, \
|
|
vect_1, vect_2, vect_3, vect_4, \
|
|
mask_a, mask_b, mask_c, mask_d, \
|
|
sense_a, sense_b, sense_c, sense_d) \
|
|
\
|
|
enum { \
|
|
PINT ## p ## _UNUSED = 0, \
|
|
enums_1 enums_2 enums_3 enums_4 \
|
|
}; \
|
|
\
|
|
static struct intc_vect p ## _vectors[] __initdata = { \
|
|
vect_1 vect_2 vect_3 vect_4 \
|
|
}; \
|
|
\
|
|
static struct intc_mask_reg p ## _mask_registers[] __initdata = { \
|
|
{ mask_reg, 0, 32, /* PINTER */ \
|
|
{ mask_a mask_b mask_c mask_d } } \
|
|
}; \
|
|
\
|
|
static struct intc_sense_reg p ## _sense_registers[] __initdata = { \
|
|
{ sense_base + 0x00, 16, 2, /* PINTCR */ \
|
|
{ sense_a } }, \
|
|
{ sense_base + 0x04, 16, 2, /* PINTCR */ \
|
|
{ sense_b } }, \
|
|
{ sense_base + 0x08, 16, 2, /* PINTCR */ \
|
|
{ sense_c } }, \
|
|
{ sense_base + 0x0c, 16, 2, /* PINTCR */ \
|
|
{ sense_d } }, \
|
|
}; \
|
|
\
|
|
static struct intc_desc p ## _desc __initdata = { \
|
|
.name = str, \
|
|
.hw = INTC_HW_DESC(p ## _vectors, NULL, \
|
|
p ## _mask_registers, NULL, \
|
|
p ## _sense_registers, NULL), \
|
|
}
|
|
|
|
#endif /* __ASM_MACH_INTC_H */
|