static irqreturn_t hp_sdc_isr(int irq, void *dev_id) { uint8_t status, data; status = hp_sdc_status_in8(); /* Read data unconditionally to advance i8042. */ data = hp_sdc_data_in8(); /* For now we are ignoring these until we get the SDC to behave. */ if (((status & 0xf1) == 0x51) && data == 0x82) return IRQ_HANDLED; switch (status & HP_SDC_STATUS_IRQMASK) { case 0: /* This case is not documented. */ break; case HP_SDC_STATUS_USERTIMER: case HP_SDC_STATUS_PERIODIC: case HP_SDC_STATUS_TIMER: read_lock(&hp_sdc.hook_lock); if (hp_sdc.timer != NULL) hp_sdc.timer(irq, dev_id, status, data); read_unlock(&hp_sdc.hook_lock); break; case HP_SDC_STATUS_REG: hp_sdc_take(irq, dev_id, status, data); break; case HP_SDC_STATUS_HILCMD: case HP_SDC_STATUS_HILDATA: read_lock(&hp_sdc.hook_lock); if (hp_sdc.hil != NULL) hp_sdc.hil(irq, dev_id, status, data); read_unlock(&hp_sdc.hook_lock); break; case HP_SDC_STATUS_PUP: read_lock(&hp_sdc.hook_lock); if (hp_sdc.pup != NULL) hp_sdc.pup(irq, dev_id, status, data); else printk(KERN_INFO PREFIX "HP SDC reports successful PUP.\n"); read_unlock(&hp_sdc.hook_lock); break; default: read_lock(&hp_sdc.hook_lock); if (hp_sdc.cooked != NULL) hp_sdc.cooked(irq, dev_id, status, data); read_unlock(&hp_sdc.hook_lock); break; } return IRQ_HANDLED; }
static void hp_sdc_nmisr(int irq, void *dev_id, struct pt_regs * regs) { int status; status = hp_sdc_status_in8(); printk(KERN_WARNING PREFIX "NMI !\n"); #if 0 if (status & HP_SDC_NMISTATUS_FHS) { read_lock(&hp_sdc.hook_lock); if (hp_sdc.timer != NULL) hp_sdc.timer(irq, dev_id, status, 0); read_unlock(&hp_sdc.hook_lock); } else { /* TODO: pass this on to the HIL handler, or do SAK here? */ printk(KERN_WARNING PREFIX "HIL NMI\n"); } #endif }