37
37
static void q40_irq_handler(unsigned int, struct pt_regs *fp);
38
static void q40_enable_irq(unsigned int);
39
static void q40_disable_irq(unsigned int);
38
static void q40_irq_enable(struct irq_data *data);
39
static void q40_irq_disable(struct irq_data *data);
41
41
unsigned short q40_ablecount[35];
42
42
unsigned short q40_state[35];
44
static int q40_irq_startup(unsigned int irq)
44
static unsigned int q40_irq_startup(struct irq_data *data)
46
unsigned int irq = data->irq;
46
48
/* test for ISA ints not implemented by HW */
48
50
case 1: case 2: case 8: case 9:
49
51
case 11: case 12: case 13:
50
52
printk("%s: ISA IRQ %d not implemented by HW\n", __func__, irq);
53
/* FIXME return -ENXIO; */
56
static void q40_irq_shutdown(unsigned int irq)
58
static void q40_irq_shutdown(struct irq_data *data)
60
static struct irq_controller q40_irq_controller = {
62
static struct irq_chip q40_irq_chip = {
62
.lock = __SPIN_LOCK_UNLOCKED(q40_irq_controller.lock),
63
.startup = q40_irq_startup,
64
.shutdown = q40_irq_shutdown,
65
.enable = q40_enable_irq,
66
.disable = q40_disable_irq,
64
.irq_startup = q40_irq_startup,
65
.irq_shutdown = q40_irq_shutdown,
66
.irq_enable = q40_irq_enable,
67
.irq_disable = q40_irq_disable,
82
83
void __init q40_init_IRQ(void)
84
m68k_setup_irq_controller(&q40_irq_controller, 1, Q40_IRQ_MAX);
85
m68k_setup_irq_controller(&q40_irq_chip, handle_simple_irq, 1,
86
88
/* setup handler for ISA ints */
87
89
m68k_setup_auto_interrupt(q40_irq_handler);
89
m68k_irq_startup(IRQ_AUTO_2);
90
m68k_irq_startup(IRQ_AUTO_4);
91
m68k_irq_startup_irq(IRQ_AUTO_2);
92
m68k_irq_startup_irq(IRQ_AUTO_4);
92
94
/* now enable some ints.. */
93
95
master_outb(1, EXT_ENABLE_REG); /* ISA IRQ 5-15 */
221
__m68k_handle_int(Q40_IRQ_SAMPLE, fp);
223
do_IRQ(Q40_IRQ_SAMPLE, fp);
224
226
if (mir & Q40_IRQ_FRAME_MASK) {
225
__m68k_handle_int(Q40_IRQ_FRAME, fp);
227
do_IRQ(Q40_IRQ_FRAME, fp);
226
228
master_outb(-1, FRAME_CLEAR_REG);
228
230
if ((mir & Q40_IRQ_SER_MASK) || (mir & Q40_IRQ_EXT_MASK)) {
259
261
q40_state[irq] |= IRQ_INPROGRESS;
260
__m68k_handle_int(irq, fp);
261
263
q40_state[irq] &= ~IRQ_INPROGRESS;
263
265
/* naively enable everything, if that fails than */
288
290
mir = master_inb(IIRQ_REG);
289
291
/* should test whether keyboard irq is really enabled, doing it in defhand */
290
292
if (mir & Q40_IRQ_KEYB_MASK)
291
__m68k_handle_int(Q40_IRQ_KEYBOARD, fp);
293
do_IRQ(Q40_IRQ_KEYBOARD, fp);
296
void q40_enable_irq(unsigned int irq)
298
void q40_irq_enable(struct irq_data *data)
300
unsigned int irq = data->irq;
298
302
if (irq >= 5 && irq <= 15) {
300
304
if (mext_disabled > 0)
301
printk("q40_enable_irq : nested disable/enable\n");
305
printk("q40_irq_enable : nested disable/enable\n");
302
306
if (mext_disabled == 0)
303
307
master_outb(1, EXT_ENABLE_REG);
308
void q40_disable_irq(unsigned int irq)
312
void q40_irq_disable(struct irq_data *data)
314
unsigned int irq = data->irq;
310
316
/* disable ISA iqs : only do something if the driver has been
311
317
* verified to be Q40 "compatible" - right now IDE, NE2K
312
318
* Any driver should not attempt to sleep across disable_irq !!
319
325
printk("disable_irq nesting count %d\n",mext_disabled);
323
unsigned long q40_probe_irq_on(void)
325
printk("irq probing not working - reconfigure the driver to avoid this\n");
328
int q40_probe_irq_off(unsigned long irqs)