static irqreturn_t hd64465_gpio_interrupt(int irq, void *dev, struct pt_regs *regs) { unsigned short port, pin, isr, mask, portpin; for (port=0 ; port<GPIO_NPORTS ; port++) { isr = inw(GPIO_ISR(port)); for (pin=0 ; pin<8 ; pin++) { mask = 1<<pin; if (isr & mask) { portpin = (port<<3)|pin; if (handlers[portpin].func != 0) handlers[portpin].func(portpin, handlers[portpin].dev); else printk(KERN_NOTICE "unexpected GPIO interrupt, pin %c%d\n", port+'A', (int)pin); } } /* Write 1s back to ISR to clear it? That's what the manual says.. */ outw(isr, GPIO_ISR(port)); } return IRQ_HANDLED; }
__interrupt void PORT1_ISR_HOOK(void) { /* USER CODE START (section: PORT1_ISR_HOOK) */ GPIO_ISR(); __bis_SR_register_on_exit(LPM3_bits); /* USER CODE END (section: PORT1_ISR_HOOK) */ }