void free_irq(unsigned int irq, void *dev_id) { if (irq >= NR_IRQS) { printk(KERN_WARNING "%s: Incorrect IRQ %d\n", __FUNCTION__, irq); return; } if (irq_list[irq].dev_id != dev_id) printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n", __FUNCTION__, irq, irq_list[irq].devname); if (irq_list[irq].flags & IRQ_FLG_FAST) { extern asmlinkage void inthandler(void); extern void set_evector(int vecnum, void (*handler)(void)); set_evector(irq, inthandler); } if (mach_default_handler) irq_list[irq].handler = mach_default_handler; else irq_list[irq].handler = default_irq_handler; irq_list[irq].flags = IRQ_FLG_STD; irq_list[irq].dev_id = NULL; irq_list[irq].devname = NULL; }
void free_irq(unsigned int irq, void *dev_id) { if (irq & IRQ_MACHSPEC) { mach_free_irq(IRQ_IDX(irq), dev_id); return; } if (irq < 0 || irq >= NR_IRQS) { printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq); return; } if (vec_list[irq].dev_id != dev_id) printk("%s: Removing probably wrong IRQ %d from %s\n", __FUNCTION__, irq, vec_list[irq].devname); if (vec_list[irq].flags & IRQ_FLG_FAST) { extern asmlinkage void intrhandler(void); extern void set_evector(int vecnum, void (*handler)(void)); set_evector(irq, intrhandler); } if (mach_default_handler) vec_list[irq].handler = (*mach_default_handler)[irq]; else vec_list[irq].handler = default_irq_handler; vec_list[irq].flags = IRQ_FLG_STD; vec_list[irq].dev_id = NULL; vec_list[irq].devname = NULL; }
int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) { if ((irq & IRQ_MACHSPEC) && mach_request_irq) { return mach_request_irq(IRQ_IDX(irq), handler, flags, devname, dev_id); } if (irq < 0 || irq >= NR_IRQS) { printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname); return -ENXIO; } if (!(vec_list[irq].flags & IRQ_FLG_STD)) { if (vec_list[irq].flags & IRQ_FLG_LOCK) { printk("%s: IRQ %d from %s is not replaceable\n", __FUNCTION__, irq, vec_list[irq].devname); return -EBUSY; } if (flags & IRQ_FLG_REPLACE) { printk("%s: %s can't replace IRQ %d from %s\n", __FUNCTION__, devname, irq, vec_list[irq].devname); return -EBUSY; } } if (flags & IRQ_FLG_FAST) { extern asmlinkage void fasthandler(void); extern void set_evector(int vecnum, void (*handler)(void)); set_evector(irq, fasthandler); } vec_list[irq].handler = handler; vec_list[irq].flags = flags; vec_list[irq].dev_id = dev_id; vec_list[irq].devname = devname; return 0; }
int request_irq( unsigned int irq, irq_handler_t handler, unsigned long flags, const char *devname, void *dev_id) { if (irq < 0 || irq >= NR_IRQS) { printk(KERN_WARNING "%s: Incorrect IRQ %d from %s\n", __FUNCTION__, irq, devname); return -ENXIO; } if (!(irq_list[irq].flags & IRQ_FLG_STD)) { if (irq_list[irq].flags & IRQ_FLG_LOCK) { printk(KERN_WARNING "%s: IRQ %d from %s is not replaceable\n", __FUNCTION__, irq, irq_list[irq].devname); return -EBUSY; } if (flags & IRQ_FLG_REPLACE) { printk(KERN_WARNING "%s: %s can't replace IRQ %d from %s\n", __FUNCTION__, devname, irq, irq_list[irq].devname); return -EBUSY; } } if (flags & IRQ_FLG_FAST) { extern asmlinkage void fasthandler(void); extern void set_evector(int vecnum, void (*handler)(void)); set_evector(irq, fasthandler); } irq_list[irq].handler = handler; irq_list[irq].flags = flags; irq_list[irq].dev_id = dev_id; irq_list[irq].devname = devname; return 0; }