void free_irq(unsigned int irq, void *dev_id) { int bitmask; if (irq >= NR_IRQS) { return; } if (!irq_list[irq] || irq_list[irq]->dev_id != dev_id) printk("Removing probably wrong IRQ %d from %s\n", irq, irq_list[irq]->devname); /* disable interrupt & release IRQ pin */ bitmask = 1 << (irq - EXT_IRQ0); switch(irq) { case EXT_IRQ0: case EXT_IRQ1: case EXT_IRQ2: case EXT_IRQ3: *(volatile unsigned char *)IER &= ~bitmask; H8300_GPIO_FREE(H8300_GPIO_P8, bitmask); break ; case EXT_IRQ4: case EXT_IRQ5: *(volatile unsigned char *)IER &= ~bitmask; H8300_GPIO_FREE(H8300_GPIO_P9, bitmask); break; } if (((unsigned long)irq_list[irq] & 0x80000000UL) == 0) { kfree(irq_list[irq]); irq_list[irq] = NULL; } }
void free_irq(unsigned int irq, void *dev_id) { if (irq >= NR_IRQS) return; if (irq_list[irq]->dev_id != dev_id) printk("%s: Removing probably wrong IRQ %d from %s\n", __FUNCTION__, irq, irq_list[irq]->devname); if (irq >= EXT_IRQ0 && irq <= EXT_IRQ15) { /* disable interrupt & release IRQ pin */ unsigned short port_no,bit_no; *(volatile unsigned short *)ISR &= ~(1 << (irq - EXT_IRQ0)); *(volatile unsigned short *)IER |= 1 << (irq - EXT_IRQ0); if (*(volatile unsigned short *)ITSR & (1 << (irq - EXT_IRQ0))) { port_no = irq_assign_table1[irq - EXT_IRQ0].port_no; bit_no = irq_assign_table1[irq - EXT_IRQ0].bit_no; } else { port_no = irq_assign_table0[irq - EXT_IRQ0].port_no; bit_no = irq_assign_table0[irq - EXT_IRQ0].bit_no; } H8300_GPIO_FREE(port_no, bit_no); } if (((unsigned long)irq_list[irq] & 0x80000000UL) == 0) { kfree(irq_list[irq]); irq_list[irq] = NULL; } }
void h8300_disable_irq_pin(unsigned int irq) { int bitmask; if (irq < EXT_IRQ0 || irq > EXT_IRQ5) return; bitmask = 1 << (irq - EXT_IRQ0); switch(irq) { case EXT_IRQ0: case EXT_IRQ1: case EXT_IRQ2: case EXT_IRQ3: *(volatile unsigned char *)IER &= ~bitmask; H8300_GPIO_FREE(H8300_GPIO_P8, bitmask); break ; case EXT_IRQ4: case EXT_IRQ5: *(volatile unsigned char *)IER &= ~bitmask; H8300_GPIO_FREE(H8300_GPIO_P9, bitmask); break; } }