static irqreturn_t pmic8058_kp_irq(int irq, void *data) { struct pmic8058_kp *kp = data; u8 ctrl_val, events; int rc; dev_dbg(kp->dev, "key sense irq\n"); __dump_kp_regs(kp, "pmic8058_kp_irq"); rc = pmic8058_kp_read(kp, &ctrl_val, KEYP_CTRL, 1); events = ctrl_val & KEYP_CTRL_EVNTS_MASK; rc = pmic8058_kp_scan_matrix(kp, events); return IRQ_HANDLED; }
/* * NOTE: Any row multiple interrupt issue - PMIC4 Rev A0 * * If the S/W responds to the key-event interrupt too early and reads the * recent data, the keypad FSM will mistakenly go to the IDLE state, instead * of the scan pause state as it is supposed too. Since the key is still * pressed, the keypad scanner will go through the debounce, scan, and generate * another key event interrupt. The workaround for this issue is to add delay * of 1ms between servicing the key event interrupt and reading the recent data. */ static irqreturn_t pmic8058_kp_irq(int irq, void *data) { struct pmic8058_kp *kp = data; u8 ctrl_val, events; int rc; if (pm8058_rev(kp->pm_chip) == PM_8058_REV_1p0) mdelay(1); pr_info("key sense irq\n"); dev_dbg(kp->dev, "key sense irq\n"); __dump_kp_regs(kp, "pmic8058_kp_irq"); rc = pmic8058_kp_read(kp, &ctrl_val, KEYP_CTRL, 1); events = ctrl_val & KEYP_CTRL_EVNTS_MASK; rc = pmic8058_kp_scan_matrix(kp, events); return IRQ_HANDLED; }