25 #define RM200_I8259A_IRQ_BASE 32
27 #define MEMPORT(_base,_irq) \
33 .flags = UPF_BOOT_AUTOCONF|UPF_IOREMAP, \
46 .platform_data = rm200_data,
50 static struct resource rm200_ds1216_rsrc[] = {
60 .num_resources =
ARRAY_SIZE(rm200_ds1216_rsrc),
61 .resource = rm200_ds1216_rsrc
64 static struct resource snirm_82596_rm200_rsrc[] = {
91 .name =
"snirm_82596",
92 .num_resources =
ARRAY_SIZE(snirm_82596_rm200_rsrc),
93 .resource = snirm_82596_rm200_rsrc
96 static struct resource snirm_53c710_rm200_rsrc[] = {
110 .name =
"snirm_53c710",
111 .num_resources =
ARRAY_SIZE(snirm_53c710_rm200_rsrc),
112 .resource = snirm_53c710_rm200_rsrc
115 static int __init snirm_setup_devinit(
void)
139 #define PIC_ISR PIC_CMD
140 #define PIC_POLL PIC_ISR
141 #define PIC_OCW3 PIC_ISR
144 #define PIC_CASCADE_IR 2
145 #define MASTER_ICW4_DEFAULT 0x01
146 #define SLAVE_ICW4_DEFAULT 0x01
151 static unsigned int rm200_cached_irq_mask = 0xffff;
155 #define cached_master_mask (rm200_cached_irq_mask)
156 #define cached_slave_mask (rm200_cached_irq_mask >> 8)
158 static void sni_rm200_disable_8259A_irq(
struct irq_data *
d)
165 rm200_cached_irq_mask |=
mask;
173 static void sni_rm200_enable_8259A_irq(
struct irq_data *
d)
180 rm200_cached_irq_mask &=
mask;
188 static inline int sni_rm200_i8259A_irq_real(
unsigned int irq)
191 int irqmask = 1 << irq;
200 value =
readb(rm200_pic_slave +
PIC_CMD) & (irqmask >> 8);
233 if (rm200_cached_irq_mask & irqmask)
234 goto spurious_8259A_irq;
235 rm200_cached_irq_mask |= irqmask;
255 if (sni_rm200_i8259A_irq_real(irq))
260 goto handle_real_irq;
263 static int spurious_irq_mask;
268 if (!(spurious_irq_mask & irqmask)) {
270 "spurious RM200 8259A interrupt: IRQ%d.\n", irq);
271 spurious_irq_mask |= irqmask;
279 goto handle_real_irq;
283 static struct irq_chip sni_rm200_i8259A_chip = {
284 .name =
"RM200-XT-PIC",
285 .irq_mask = sni_rm200_disable_8259A_irq,
286 .irq_unmask = sni_rm200_enable_8259A_irq,
295 static inline int sni_rm200_i8259_irq(
void)
359 static struct irqaction sni_rm200_irq2 = {
365 static struct resource sni_rm200_pic1_resource = {
366 .name =
"onboard ISA pic1",
372 static struct resource sni_rm200_pic2_resource = {
373 .name =
"onboard ISA pic2",
384 irq = sni_rm200_i8259_irq();
393 .handler = sni_rm200_i8259A_irq_handler,
394 .name =
"onboard ISA",
403 if (!rm200_pic_master)
406 if (!rm200_pic_slave) {
417 irq_set_chip_and_handler(i, &sni_rm200_i8259A_chip,
424 #define SNI_RM200_INT_STAT_REG CKSEG1ADDR(0xbc000000)
425 #define SNI_RM200_INT_ENA_REG CKSEG1ADDR(0xbc080000)
427 #define SNI_RM200_INT_START 24
428 #define SNI_RM200_INT_END 28
430 static void enable_rm200_irq(
struct irq_data *d)
444 static struct irq_chip rm200_irq_type = {
447 .irq_unmask = enable_rm200_irq,
450 static void sni_rm200_hwint(
void)
459 else if (pending &
C_IRQ0) {
463 irq =
ffs(stat & mask & 0x1f);