Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | /* * arch/mips/ddb5074/irq.c -- NEC DDB Vrc-5074 interrupt routines * * Copyright (C) 2000 Geert Uytterhoeven <geert@sonycom.com> * Sony Software Development Center Europe (SDCE), Brussels */ #include <linux/init.h> #include <linux/irq.h> #include <linux/signal.h> #include <linux/sched.h> #include <linux/types.h> #include <linux/interrupt.h> #include <linux/ioport.h> #include <asm/i8259.h> #include <asm/io.h> #include <asm/irq_cpu.h> #include <asm/ptrace.h> #include <asm/nile4.h> #include <asm/ddb5xxx/ddb5xxx.h> #include <asm/ddb5xxx/ddb5074.h> extern asmlinkage void ddbIRQ(void); static struct irqaction irq_cascade = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL }; #define M1543_PNP_CONFIG 0x03f0 /* PnP Config Port */ #define M1543_PNP_INDEX 0x03f0 /* PnP Index Port */ #define M1543_PNP_DATA 0x03f1 /* PnP Data Port */ #define M1543_PNP_ALT_CONFIG 0x0370 /* Alternative PnP Config Port */ #define M1543_PNP_ALT_INDEX 0x0370 /* Alternative PnP Index Port */ #define M1543_PNP_ALT_DATA 0x0371 /* Alternative PnP Data Port */ #define M1543_INT1_MASTER_CTRL 0x0020 /* INT_1 (master) Control Register */ #define M1543_INT1_MASTER_MASK 0x0021 /* INT_1 (master) Mask Register */ #define M1543_INT1_SLAVE_CTRL 0x00a0 /* INT_1 (slave) Control Register */ #define M1543_INT1_SLAVE_MASK 0x00a1 /* INT_1 (slave) Mask Register */ #define M1543_INT1_MASTER_ELCR 0x04d0 /* INT_1 (master) Edge/Level Control */ #define M1543_INT1_SLAVE_ELCR 0x04d1 /* INT_1 (slave) Edge/Level Control */ static void m1543_irq_setup(void) { /* * The ALI M1543 has 13 interrupt inputs, IRQ1..IRQ13. Not all * the possible IO sources in the M1543 are in use by us. We will * use the following mapping: * * IRQ1 - keyboard (default set by M1543) * IRQ3 - reserved for UART B (default set by M1543) (note that * the schematics for the DDB Vrc-5074 board seem to * indicate that IRQ3 is connected to the DS1386 * watchdog timer interrupt output so we might have * a conflict) * IRQ4 - reserved for UART A (default set by M1543) * IRQ5 - parallel (default set by M1543) * IRQ8 - DS1386 time of day (RTC) interrupt * IRQ12 - mouse */ /* * Assing mouse interrupt to IRQ12 */ /* Enter configuration mode */ outb(0x51, M1543_PNP_CONFIG); outb(0x23, M1543_PNP_CONFIG); /* Select logical device 7 (Keyboard) */ outb(0x07, M1543_PNP_INDEX); outb(0x07, M1543_PNP_DATA); /* Select IRQ12 */ outb(0x72, M1543_PNP_INDEX); outb(0x0c, M1543_PNP_DATA); outb(0x30, M1543_PNP_INDEX); printk("device 7, 0x30: %02x\n",inb(M1543_PNP_DATA)); outb(0x70, M1543_PNP_INDEX); printk("device 7, 0x70: %02x\n",inb(M1543_PNP_DATA)); /* Leave configration mode */ outb(0xbb, M1543_PNP_CONFIG); } void ddb_local0_irqdispatch(struct pt_regs *regs) { u32 mask; int nile4_irq; mask = nile4_get_irq_stat(0); /* Handle the timer interrupt first */ #if 0 if (mask & (1 << NILE4_INT_GPT)) { do_IRQ(nile4_to_irq(NILE4_INT_GPT), regs); mask &= ~(1 << NILE4_INT_GPT); } #endif for (nile4_irq = 0; mask; nile4_irq++, mask >>= 1) if (mask & 1) { if (nile4_irq == NILE4_INT_INTE) { int i8259_irq; nile4_clear_irq(NILE4_INT_INTE); i8259_irq = nile4_i8259_iack(); do_IRQ(i8259_irq, regs); } else do_IRQ(nile4_to_irq(nile4_irq), regs); } } void ddb_local1_irqdispatch(void) { printk("ddb_local1_irqdispatch called\n"); } void ddb_buserror_irq(void) { printk("ddb_buserror_irq called\n"); } void ddb_8254timer_irq(void) { printk("ddb_8254timer_irq called\n"); } void __init arch_init_irq(void) { /* setup cascade interrupts */ setup_irq(NILE4_IRQ_BASE + NILE4_INT_INTE, &irq_cascade); setup_irq(CPU_IRQ_BASE + CPU_NILE4_CASCADE, &irq_cascade); set_except_vector(0, ddbIRQ); nile4_irq_setup(NILE4_IRQ_BASE); m1543_irq_setup(); init_i8259_irqs(); printk("CPU_IRQ_BASE: %d\n",CPU_IRQ_BASE); mips_cpu_irq_init(CPU_IRQ_BASE); printk("enabling 8259 cascade\n"); ddb5074_led_hex(0); /* Enable the interrupt cascade */ nile4_enable_irq(NILE4_IRQ_BASE+IRQ_I8259_CASCADE); } |