Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] m68k: convert q40 irq code

Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Roman Zippel and committed by
Linus Torvalds
77dda339 9c5f4afd

+165 -313
+1 -10
arch/m68k/kernel/entry.S
··· 205 205 206 206 movel %sp,%sp@- 207 207 movel %d0,%sp@- | put vector # on stack 208 - #if defined(MACH_Q40_ONLY) && defined(CONFIG_BLK_DEV_FD) 209 - btstb #4,0xff000000 | Q40 floppy needs very special treatment ... 210 - jbeq 1f 211 - btstb #3,0xff000004 212 - jbeq 1f 213 - jbsr floppy_hardint 214 - jbra 3f 215 - 1: 216 - #endif 217 208 auto_irqhandler_fixup = . + 2 218 209 jsr m68k_handle_int | process the IRQ 219 - 3: addql #8,%sp | pop parameters off stack 210 + addql #8,%sp | pop parameters off stack 220 211 221 212 ret_from_interrupt: 222 213 subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
-11
arch/m68k/q40/config.c
··· 38 38 39 39 extern irqreturn_t q40_process_int (int level, struct pt_regs *regs); 40 40 extern void q40_init_IRQ (void); 41 - extern void q40_free_irq (unsigned int, void *); 42 - extern int show_q40_interrupts (struct seq_file *, void *); 43 - extern void q40_enable_irq (unsigned int); 44 - extern void q40_disable_irq (unsigned int); 45 41 static void q40_get_model(char *model); 46 42 static int q40_get_hardware_list(char *buffer); 47 - extern int q40_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id); 48 43 extern void q40_sched_init(irqreturn_t (*handler)(int, void *, struct pt_regs *)); 49 44 50 45 extern unsigned long q40_gettimeoffset (void); ··· 169 174 mach_set_clock_mmss = q40_set_clock_mmss; 170 175 171 176 mach_reset = q40_reset; 172 - mach_free_irq = q40_free_irq; 173 - mach_process_int = q40_process_int; 174 - mach_get_irq_list = show_q40_interrupts; 175 - mach_request_irq = q40_request_irq; 176 - enable_irq = q40_enable_irq; 177 - disable_irq = q40_disable_irq; 178 177 mach_get_model = q40_get_model; 179 178 mach_get_hardware_list = q40_get_hardware_list; 180 179
+164 -292
arch/m68k/q40/q40ints.c
··· 14 14 #include <linux/types.h> 15 15 #include <linux/kernel.h> 16 16 #include <linux/errno.h> 17 - #include <linux/string.h> 18 - #include <linux/sched.h> 19 - #include <linux/seq_file.h> 20 17 #include <linux/interrupt.h> 21 - #include <linux/hardirq.h> 22 18 23 - #include <asm/rtc.h> 24 19 #include <asm/ptrace.h> 25 20 #include <asm/system.h> 26 21 #include <asm/irq.h> ··· 34 39 * 35 40 */ 36 41 37 - extern int ints_inited; 42 + static void q40_irq_handler(unsigned int, struct pt_regs *fp); 43 + static void q40_enable_irq(unsigned int); 44 + static void q40_disable_irq(unsigned int); 38 45 46 + unsigned short q40_ablecount[35]; 47 + unsigned short q40_state[35]; 39 48 40 - irqreturn_t q40_irq2_handler (int, void *, struct pt_regs *fp); 49 + static int q40_irq_startup(unsigned int irq) 50 + { 51 + /* test for ISA ints not implemented by HW */ 52 + switch (irq) { 53 + case 1: case 2: case 8: case 9: 54 + case 11: case 12: case 13: 55 + printk("%s: ISA IRQ %d not implemented by HW\n", __FUNCTION__, irq); 56 + return -ENXIO; 57 + } 58 + return 0; 59 + } 41 60 61 + static void q40_irq_shutdown(unsigned int irq) 62 + { 63 + } 42 64 43 - static irqreturn_t q40_defhand (int irq, void *dev_id, struct pt_regs *fp); 44 - 45 - 46 - #define DEVNAME_SIZE 24 47 - 48 - static struct q40_irq_node { 49 - irqreturn_t (*handler)(int, void *, struct pt_regs *); 50 - unsigned long flags; 51 - void *dev_id; 52 - /* struct q40_irq_node *next;*/ 53 - char devname[DEVNAME_SIZE]; 54 - unsigned count; 55 - unsigned short state; 56 - } irq_tab[Q40_IRQ_MAX+1]; 57 - 58 - short unsigned q40_ablecount[Q40_IRQ_MAX+1]; 65 + static struct irq_controller q40_irq_controller = { 66 + .name = "q40", 67 + .lock = SPIN_LOCK_UNLOCKED, 68 + .startup = q40_irq_startup, 69 + .shutdown = q40_irq_shutdown, 70 + .enable = q40_enable_irq, 71 + .disable = q40_disable_irq, 72 + }; 59 73 60 74 /* 61 75 * void q40_init_IRQ (void) ··· 77 73 * the q40 IRQ handling routines. 78 74 */ 79 75 80 - static int disabled=0; 76 + static int disabled; 81 77 82 - void q40_init_IRQ (void) 78 + void q40_init_IRQ(void) 83 79 { 84 - int i; 85 - 86 - disabled=0; 87 - for (i = 0; i <= Q40_IRQ_MAX; i++) { 88 - irq_tab[i].handler = q40_defhand; 89 - irq_tab[i].flags = 0; 90 - irq_tab[i].dev_id = NULL; 91 - /* irq_tab[i].next = NULL;*/ 92 - irq_tab[i].devname[0] = 0; 93 - irq_tab[i].count = 0; 94 - irq_tab[i].state =0; 95 - q40_ablecount[i]=0; /* all enabled */ 96 - } 80 + m68k_setup_irq_controller(&q40_irq_controller, 1, Q40_IRQ_MAX); 97 81 98 82 /* setup handler for ISA ints */ 99 - cpu_request_irq(IRQ_AUTO_2, q40_irq2_handler, 0, 100 - "q40 ISA and master chip", NULL); 83 + m68k_setup_auto_interrupt(q40_irq_handler); 84 + 85 + m68k_irq_startup(IRQ_AUTO_2); 86 + m68k_irq_startup(IRQ_AUTO_4); 101 87 102 88 /* now enable some ints.. */ 103 - master_outb(1,EXT_ENABLE_REG); /* ISA IRQ 5-15 */ 89 + master_outb(1, EXT_ENABLE_REG); /* ISA IRQ 5-15 */ 104 90 105 91 /* make sure keyboard IRQ is disabled */ 106 - master_outb(0,KEY_IRQ_ENABLE_REG); 92 + master_outb(0, KEY_IRQ_ENABLE_REG); 107 93 } 108 94 109 - int q40_request_irq(unsigned int irq, 110 - irqreturn_t (*handler)(int, void *, struct pt_regs *), 111 - unsigned long flags, const char *devname, void *dev_id) 112 - { 113 - /*printk("q40_request_irq %d, %s\n",irq,devname);*/ 114 - 115 - if (irq > Q40_IRQ_MAX || (irq>15 && irq<32)) { 116 - printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname); 117 - return -ENXIO; 118 - } 119 - 120 - /* test for ISA ints not implemented by HW */ 121 - switch (irq) 122 - { 123 - case 1: case 2: case 8: case 9: 124 - case 12: case 13: 125 - printk("%s: ISA IRQ %d from %s not implemented by HW\n", __FUNCTION__, irq, devname); 126 - return -ENXIO; 127 - case 11: 128 - printk("warning IRQ 10 and 11 not distinguishable\n"); 129 - irq=10; 130 - default: 131 - ; 132 - } 133 - 134 - if (irq<Q40_IRQ_SAMPLE) 135 - { 136 - if (irq_tab[irq].dev_id != NULL) 137 - { 138 - printk("%s: IRQ %d from %s is not replaceable\n", 139 - __FUNCTION__, irq, irq_tab[irq].devname); 140 - return -EBUSY; 141 - } 142 - /*printk("IRQ %d set to handler %p\n",irq,handler);*/ 143 - if (dev_id==NULL) 144 - { 145 - printk("WARNING: dev_id == NULL in request_irq\n"); 146 - dev_id=(void*)1; 147 - } 148 - irq_tab[irq].handler = handler; 149 - irq_tab[irq].flags = flags; 150 - irq_tab[irq].dev_id = dev_id; 151 - strlcpy(irq_tab[irq].devname,devname,sizeof(irq_tab[irq].devname)); 152 - irq_tab[irq].state = 0; 153 - return 0; 154 - } 155 - else { 156 - /* Q40_IRQ_SAMPLE :somewhat special actions required here ..*/ 157 - cpu_request_irq(4, handler, flags, devname, dev_id); 158 - cpu_request_irq(6, handler, flags, devname, dev_id); 159 - return 0; 160 - } 161 - } 162 - 163 - void q40_free_irq(unsigned int irq, void *dev_id) 164 - { 165 - if (irq > Q40_IRQ_MAX || (irq>15 && irq<32)) { 166 - printk("%s: Incorrect IRQ %d, dev_id %x \n", __FUNCTION__, irq, (unsigned)dev_id); 167 - return; 168 - } 169 - 170 - /* test for ISA ints not implemented by HW */ 171 - switch (irq) 172 - { 173 - case 1: case 2: case 8: case 9: 174 - case 12: case 13: 175 - printk("%s: ISA IRQ %d from %x invalid\n", __FUNCTION__, irq, (unsigned)dev_id); 176 - return; 177 - case 11: irq=10; 178 - default: 179 - ; 180 - } 181 - 182 - if (irq<Q40_IRQ_SAMPLE) 183 - { 184 - if (irq_tab[irq].dev_id != dev_id) 185 - printk("%s: Removing probably wrong IRQ %d from %s\n", 186 - __FUNCTION__, irq, irq_tab[irq].devname); 187 - 188 - irq_tab[irq].handler = q40_defhand; 189 - irq_tab[irq].flags = 0; 190 - irq_tab[irq].dev_id = NULL; 191 - /* irq_tab[irq].devname = NULL; */ 192 - /* do not reset state !! */ 193 - } 194 - else 195 - { /* == Q40_IRQ_SAMPLE */ 196 - cpu_free_irq(4, dev_id); 197 - cpu_free_irq(6, dev_id); 198 - } 199 - } 200 - 201 - 202 - irqreturn_t q40_process_int (int level, struct pt_regs *fp) 203 - { 204 - printk("unexpected interrupt vec=%x, pc=%lx, d0=%lx, d0_orig=%lx, d1=%lx, d2=%lx\n", 205 - level, fp->pc, fp->d0, fp->orig_d0, fp->d1, fp->d2); 206 - printk("\tIIRQ_REG = %x, EIRQ_REG = %x\n",master_inb(IIRQ_REG),master_inb(EIRQ_REG)); 207 - return IRQ_HANDLED; 208 - } 209 95 210 96 /* 211 97 * this stuff doesn't really belong here.. 212 - */ 98 + */ 213 99 214 100 int ql_ticks; /* 200Hz ticks since last jiffie */ 215 101 static int sound_ticks; ··· 108 214 109 215 void q40_mksound(unsigned int hz, unsigned int ticks) 110 216 { 111 - /* for now ignore hz, except that hz==0 switches off sound */ 112 - /* simply alternate the ampl (128-SVOL)-(128+SVOL)-..-.. at 200Hz */ 113 - if (hz==0) 114 - { 115 - if (sound_ticks) 116 - sound_ticks=1; 217 + /* for now ignore hz, except that hz==0 switches off sound */ 218 + /* simply alternate the ampl (128-SVOL)-(128+SVOL)-..-.. at 200Hz */ 219 + if (hz == 0) { 220 + if (sound_ticks) 221 + sound_ticks = 1; 117 222 118 - *DAC_LEFT=128; 119 - *DAC_RIGHT=128; 223 + *DAC_LEFT = 128; 224 + *DAC_RIGHT = 128; 120 225 121 - return; 122 - } 123 - /* sound itself is done in q40_timer_int */ 124 - if (sound_ticks == 0) sound_ticks=1000; /* pretty long beep */ 125 - sound_ticks=ticks<<1; 226 + return; 227 + } 228 + /* sound itself is done in q40_timer_int */ 229 + if (sound_ticks == 0) 230 + sound_ticks = 1000; /* pretty long beep */ 231 + sound_ticks = ticks << 1; 126 232 } 127 233 128 234 static irqreturn_t (*q40_timer_routine)(int, void *, struct pt_regs *); 129 235 130 236 static irqreturn_t q40_timer_int (int irq, void * dev, struct pt_regs * regs) 131 237 { 132 - ql_ticks = ql_ticks ? 0 : 1; 133 - if (sound_ticks) 134 - { 135 - unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; 136 - sound_ticks--; 137 - *DAC_LEFT=sval; 138 - *DAC_RIGHT=sval; 139 - } 238 + ql_ticks = ql_ticks ? 0 : 1; 239 + if (sound_ticks) { 240 + unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; 241 + sound_ticks--; 242 + *DAC_LEFT=sval; 243 + *DAC_RIGHT=sval; 244 + } 140 245 141 - if (!ql_ticks) 142 - q40_timer_routine(irq, dev, regs); 143 - return IRQ_HANDLED; 246 + if (!ql_ticks) 247 + q40_timer_routine(irq, dev, regs); 248 + return IRQ_HANDLED; 144 249 } 145 250 146 251 void q40_sched_init (irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) 147 252 { 148 - int timer_irq; 253 + int timer_irq; 149 254 150 - q40_timer_routine = timer_routine; 151 - timer_irq=Q40_IRQ_FRAME; 255 + q40_timer_routine = timer_routine; 256 + timer_irq = Q40_IRQ_FRAME; 152 257 153 - if (request_irq(timer_irq, q40_timer_int, 0, 258 + if (request_irq(timer_irq, q40_timer_int, 0, 154 259 "timer", q40_timer_int)) 155 - panic ("Couldn't register timer int"); 260 + panic("Couldn't register timer int"); 156 261 157 - master_outb(-1,FRAME_CLEAR_REG); 158 - master_outb( 1,FRAME_RATE_REG); 262 + master_outb(-1, FRAME_CLEAR_REG); 263 + master_outb( 1, FRAME_RATE_REG); 159 264 } 160 265 161 266 ··· 200 307 static int aliased_irq=0; /* how many times inside handler ?*/ 201 308 202 309 203 - /* got level 2 interrupt, dispatch to ISA or keyboard/timer IRQs */ 204 - irqreturn_t q40_irq2_handler (int vec, void *devname, struct pt_regs *fp) 310 + /* got interrupt, dispatch to ISA or keyboard/timer IRQs */ 311 + static void q40_irq_handler(unsigned int irq, struct pt_regs *fp) 205 312 { 206 - unsigned mir, mer; 207 - int irq,i; 313 + unsigned mir, mer; 314 + int i; 208 315 209 316 //repeat: 210 - mir=master_inb(IIRQ_REG); 211 - if (mir&Q40_IRQ_FRAME_MASK) { 212 - irq_tab[Q40_IRQ_FRAME].count++; 213 - irq_tab[Q40_IRQ_FRAME].handler(Q40_IRQ_FRAME,irq_tab[Q40_IRQ_FRAME].dev_id,fp); 214 - master_outb(-1,FRAME_CLEAR_REG); 215 - } 216 - if ((mir&Q40_IRQ_SER_MASK) || (mir&Q40_IRQ_EXT_MASK)) { 217 - mer=master_inb(EIRQ_REG); 218 - for (i=0; eirqs[i].mask; i++) { 219 - if (mer&(eirqs[i].mask)) { 220 - irq=eirqs[i].irq; 317 + mir = master_inb(IIRQ_REG); 318 + #ifdef CONFIG_BLK_DEV_FD 319 + if ((mir & Q40_IRQ_EXT_MASK) && 320 + (master_inb(EIRQ_REG) & Q40_IRQ6_MASK)) { 321 + floppy_hardint(); 322 + return; 323 + } 324 + #endif 325 + switch (irq) { 326 + case 4: 327 + case 6: 328 + m68k_handle_int(Q40_IRQ_SAMPLE, fp); 329 + return; 330 + } 331 + if (mir & Q40_IRQ_FRAME_MASK) { 332 + m68k_handle_int(Q40_IRQ_FRAME, fp); 333 + master_outb(-1, FRAME_CLEAR_REG); 334 + } 335 + if ((mir & Q40_IRQ_SER_MASK) || (mir & Q40_IRQ_EXT_MASK)) { 336 + mer = master_inb(EIRQ_REG); 337 + for (i = 0; eirqs[i].mask; i++) { 338 + if (mer & eirqs[i].mask) { 339 + irq = eirqs[i].irq; 221 340 /* 222 341 * There is a little mess wrt which IRQ really caused this irq request. The 223 342 * main problem is that IIRQ_REG and EIRQ_REG reflect the state when they 224 343 * are read - which is long after the request came in. In theory IRQs should 225 344 * not just go away but they occassionally do 226 345 */ 227 - if (irq>4 && irq<=15 && mext_disabled) { 228 - /*aliased_irq++;*/ 229 - goto iirq; 230 - } 231 - if (irq_tab[irq].handler == q40_defhand ) { 232 - printk("handler for IRQ %d not defined\n",irq); 233 - continue; /* ignore uninited INTs :-( */ 234 - } 235 - if ( irq_tab[irq].state & IRQ_INPROGRESS ) { 236 - /* some handlers do local_irq_enable() for irq latency reasons, */ 237 - /* however reentering an active irq handler is not permitted */ 346 + if (irq > 4 && irq <= 15 && mext_disabled) { 347 + /*aliased_irq++;*/ 348 + goto iirq; 349 + } 350 + if (q40_state[irq] & IRQ_INPROGRESS) { 351 + /* some handlers do local_irq_enable() for irq latency reasons, */ 352 + /* however reentering an active irq handler is not permitted */ 238 353 #ifdef IP_USE_DISABLE 239 - /* in theory this is the better way to do it because it still */ 240 - /* lets through eg the serial irqs, unfortunately it crashes */ 241 - disable_irq(irq); 242 - disabled=1; 354 + /* in theory this is the better way to do it because it still */ 355 + /* lets through eg the serial irqs, unfortunately it crashes */ 356 + disable_irq(irq); 357 + disabled = 1; 243 358 #else 244 - /*printk("IRQ_INPROGRESS detected for irq %d, disabling - %s disabled\n",irq,disabled ? "already" : "not yet"); */ 245 - fp->sr = (((fp->sr) & (~0x700))+0x200); 246 - disabled=1; 359 + /*printk("IRQ_INPROGRESS detected for irq %d, disabling - %s disabled\n", 360 + irq, disabled ? "already" : "not yet"); */ 361 + fp->sr = (((fp->sr) & (~0x700))+0x200); 362 + disabled = 1; 247 363 #endif 248 - goto iirq; 249 - } 250 - irq_tab[irq].count++; 251 - irq_tab[irq].state |= IRQ_INPROGRESS; 252 - irq_tab[irq].handler(irq,irq_tab[irq].dev_id,fp); 253 - irq_tab[irq].state &= ~IRQ_INPROGRESS; 364 + goto iirq; 365 + } 366 + q40_state[irq] |= IRQ_INPROGRESS; 367 + m68k_handle_int(irq, fp); 368 + q40_state[irq] &= ~IRQ_INPROGRESS; 254 369 255 - /* naively enable everything, if that fails than */ 256 - /* this function will be reentered immediately thus */ 257 - /* getting another chance to disable the IRQ */ 370 + /* naively enable everything, if that fails than */ 371 + /* this function will be reentered immediately thus */ 372 + /* getting another chance to disable the IRQ */ 258 373 259 - if ( disabled ) { 374 + if (disabled) { 260 375 #ifdef IP_USE_DISABLE 261 - if (irq>4){ 262 - disabled=0; 263 - enable_irq(irq);} 376 + if (irq > 4) { 377 + disabled = 0; 378 + enable_irq(irq); 379 + } 264 380 #else 265 - disabled=0; 266 - /*printk("reenabling irq %d\n",irq); */ 381 + disabled = 0; 382 + /*printk("reenabling irq %d\n", irq); */ 267 383 #endif 268 - } 384 + } 269 385 // used to do 'goto repeat;' here, this delayed bh processing too long 270 - return IRQ_HANDLED; 271 - } 272 - } 273 - if (mer && ccleirq>0 && !aliased_irq) 274 - printk("ISA interrupt from unknown source? EIRQ_REG = %x\n",mer),ccleirq--; 275 - } 276 - iirq: 277 - mir=master_inb(IIRQ_REG); 278 - /* should test whether keyboard irq is really enabled, doing it in defhand */ 279 - if (mir&Q40_IRQ_KEYB_MASK) { 280 - irq_tab[Q40_IRQ_KEYBOARD].count++; 281 - irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); 282 - } 283 - return IRQ_HANDLED; 284 - } 285 - 286 - int show_q40_interrupts (struct seq_file *p, void *v) 287 - { 288 - int i; 289 - 290 - for (i = 0; i <= Q40_IRQ_MAX; i++) { 291 - if (irq_tab[i].count) 292 - seq_printf(p, "%sIRQ %02d: %8d %s%s\n", 293 - (i<=15) ? "ISA-" : " " , 294 - i, irq_tab[i].count, 295 - irq_tab[i].devname[0] ? irq_tab[i].devname : "?", 296 - irq_tab[i].handler == q40_defhand ? 297 - " (now unassigned)" : ""); 386 + return; 387 + } 388 + } 389 + if (mer && ccleirq > 0 && !aliased_irq) { 390 + printk("ISA interrupt from unknown source? EIRQ_REG = %x\n",mer); 391 + ccleirq--; 392 + } 298 393 } 299 - return 0; 394 + iirq: 395 + mir = master_inb(IIRQ_REG); 396 + /* should test whether keyboard irq is really enabled, doing it in defhand */ 397 + if (mir & Q40_IRQ_KEYB_MASK) 398 + m68k_handle_int(Q40_IRQ_KEYBOARD, fp); 399 + 400 + return; 300 401 } 301 402 302 - 303 - static irqreturn_t q40_defhand (int irq, void *dev_id, struct pt_regs *fp) 403 + void q40_enable_irq(unsigned int irq) 304 404 { 305 - if (irq!=Q40_IRQ_KEYBOARD) 306 - printk ("Unknown q40 interrupt %d\n", irq); 307 - else master_outb(-1,KEYBOARD_UNLOCK_REG); 308 - return IRQ_NONE; 405 + if (irq >= 5 && irq <= 15) { 406 + mext_disabled--; 407 + if (mext_disabled > 0) 408 + printk("q40_enable_irq : nested disable/enable\n"); 409 + if (mext_disabled == 0) 410 + master_outb(1, EXT_ENABLE_REG); 411 + } 309 412 } 310 413 311 414 312 - void q40_enable_irq (unsigned int irq) 415 + void q40_disable_irq(unsigned int irq) 313 416 { 314 - if ( irq>=5 && irq<=15 ) 315 - { 316 - mext_disabled--; 317 - if (mext_disabled>0) 318 - printk("q40_enable_irq : nested disable/enable\n"); 319 - if (mext_disabled==0) 320 - master_outb(1,EXT_ENABLE_REG); 321 - } 417 + /* disable ISA iqs : only do something if the driver has been 418 + * verified to be Q40 "compatible" - right now IDE, NE2K 419 + * Any driver should not attempt to sleep across disable_irq !! 420 + */ 421 + 422 + if (irq >= 5 && irq <= 15) { 423 + master_outb(0, EXT_ENABLE_REG); 424 + mext_disabled++; 425 + if (mext_disabled > 1) 426 + printk("disable_irq nesting count %d\n",mext_disabled); 427 + } 322 428 } 323 429 324 - 325 - void q40_disable_irq (unsigned int irq) 430 + unsigned long q40_probe_irq_on(void) 326 431 { 327 - /* disable ISA iqs : only do something if the driver has been 328 - * verified to be Q40 "compatible" - right now IDE, NE2K 329 - * Any driver should not attempt to sleep across disable_irq !! 330 - */ 331 - 332 - if ( irq>=5 && irq<=15 ) { 333 - master_outb(0,EXT_ENABLE_REG); 334 - mext_disabled++; 335 - if (mext_disabled>1) printk("disable_irq nesting count %d\n",mext_disabled); 336 - } 432 + printk("irq probing not working - reconfigure the driver to avoid this\n"); 433 + return -1; 337 434 } 338 - 339 - unsigned long q40_probe_irq_on (void) 435 + int q40_probe_irq_off(unsigned long irqs) 340 436 { 341 - printk("irq probing not working - reconfigure the driver to avoid this\n"); 342 - return -1; 437 + return -1; 343 438 } 344 - int q40_probe_irq_off (unsigned long irqs) 345 - { 346 - return -1; 347 - } 348 - /* 349 - * Local variables: 350 - * compile-command: "m68k-linux-gcc -D__KERNEL__ -I/home/rz/lx/linux-2.2.6/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -fno-strength-reduce -ffixed-a2 -m68040 -c -o q40ints.o q40ints.c" 351 - * End: 352 - */