void lasat_hw0_irqdispatch(struct pt_regs *regs) { unsigned long int_status; int irq; int_status = get_int_status(); /* if int_status == 0, then the interrupt has already been cleared */ if (int_status) { irq = ls1bit32(int_status); do_IRQ(irq, regs); } }
asmlinkage void plat_irq_dispatch(void) { unsigned long int_status; unsigned int cause = read_c0_cause(); int irq; if (cause & CAUSEF_IP7) { /* R4000 count / compare IRQ */ ll_timer_interrupt(7); return; } int_status = get_int_status(); /* if int_status == 0, then the interrupt has already been cleared */ if (int_status) { irq = ls1bit32(int_status); do_IRQ(irq); } }
static void kbd_int_handler(int irq, void *dev_id, struct pt_regs *regs) { struct cir_port *cir; int j; unsigned char int_status; cir = (struct cir_port *)dev_id; int_status = get_int_status(cir);; if (int_status & 0x4) { clear_fifo(cir); return; } while (cir_get_rx_count(cir)) { cir_data[data_index] = cir_read_data(cir); if (data_index == 0) {/* expecting first byte */ if (cir_data[data_index] != leading1) { //printk("!leading byte %x\n", cir_data[data_index]); set_rx_active(cir); clear_fifo(cir); continue; } } if (data_index == 1) { if ((cir_data[data_index] & 0xf) != leading2) { set_rx_active(cir); data_index = 0; /* start over */ clear_fifo(cir); continue; } } if ( (cir_data[data_index] == 0xff)) { /* last byte */ //printk("data_index %d\n", data_index); set_rx_active(cir); #if 0 for (j=0; j<=data_index; j++) { printk("rx_data %d: %x\n", j, cir_data[j]); } #endif data_index = 0; handle_data(cir_data); return; } else if (data_index>16) { set_rx_active(cir); #if 0 printk("warning: data_index %d\n", data_index); for (j=0; j<=data_index; j++) { printk("rx_data %d: %x\n", j, cir_data[j]); } #endif data_index = 0; clear_fifo(cir); return; } data_index++; } }