Example #1
0
File: ints.c Project: ivucica/linux
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
File: ints.c Project: ivucica/linux
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;
}