static int pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, unsigned int events) { u16 new_state[PM8XXX_MAX_ROWS]; u16 old_state[PM8XXX_MAX_ROWS]; int rc; #if defined(CONFIG_MACH_KS02) if(Is_folder_state()){ dev_err(kp->dev, "[KEY] not report keypad : Folder is closed\n"); return 0; } #endif switch (events) { case 0x1: rc = pmic8xxx_kp_read_matrix(kp, new_state, NULL); if (rc < 0) return rc; /* detecting ghost key is not an error */ if (pmic8xxx_detect_ghost_keys(kp, new_state)) return 0; __pmic8xxx_kp_scan_matrix(kp, new_state, kp->keystate); memcpy(kp->keystate, new_state, sizeof(new_state)); break; case 0x3: /* two events - eventcounter is gray-coded */ rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) return rc; __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); memcpy(kp->keystate, new_state, sizeof(new_state)); break; case 0x2: dev_dbg(kp->dev, "Some key events were lost\n"); rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) return rc; __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); memcpy(kp->keystate, new_state, sizeof(new_state)); break; default: rc = -EINVAL; } return rc; }
static int pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, unsigned int events) { u16 new_state[PM8XXX_MAX_ROWS]; u16 old_state[PM8XXX_MAX_ROWS]; int rc; //printk("enter %s \n",__func__); switch (events) { case 0x1: rc = pmic8xxx_kp_read_matrix(kp, new_state, NULL); if (rc < 0) return rc; /* detecting ghost key is not an error */ if (pmic8xxx_detect_ghost_keys(kp, new_state)) return 0; __pmic8xxx_kp_scan_matrix(kp, new_state, kp->keystate); memcpy(kp->keystate, new_state, sizeof(new_state)); break; case 0x3: /* two events - eventcounter is gray-coded */ rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) return rc; __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); memcpy(kp->keystate, new_state, sizeof(new_state)); break; case 0x2: dev_dbg(kp->dev, "Some key events were lost\n"); rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) return rc; __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); memcpy(kp->keystate, new_state, sizeof(new_state)); break; default: rc = -EINVAL; } //printk("leave %s \n",__func__); return rc; }
static int pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, unsigned int events) { u16 new_state[PM8XXX_MAX_ROWS]; u16 old_state[PM8XXX_MAX_ROWS]; int rc; switch (events) { case 0x1: rc = pmic8xxx_kp_read_matrix(kp, new_state, NULL); if (rc < 0) return rc; /* */ if (pmic8xxx_detect_ghost_keys(kp, new_state)) return 0; __pmic8xxx_kp_scan_matrix(kp, new_state, kp->keystate); memcpy(kp->keystate, new_state, sizeof(new_state)); break; case 0x3: /* */ rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) return rc; __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); memcpy(kp->keystate, new_state, sizeof(new_state)); break; case 0x2: dev_dbg(kp->dev, "Some key events were lost\n"); rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) return rc; __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); memcpy(kp->keystate, new_state, sizeof(new_state)); break; default: rc = -EINVAL; } return rc; }
/* * NOTE: We are reading recent and old data registers blindly * whenever key-stuck interrupt happens, because events counter doesn't * get updated when this interrupt happens due to key stuck doesn't get * considered as key state change. * * We are not using old data register contents after they are being read * because it might report the key which was pressed before the key being stuck * as stuck key because it's pressed status is stored in the old data * register. */ static irqreturn_t pmic8xxx_kp_stuck_irq(int irq, void *data) { u16 new_state[PM8XXX_MAX_ROWS]; u16 old_state[PM8XXX_MAX_ROWS]; int rc; struct pmic8xxx_kp *kp = data; rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); if (rc < 0) { dev_err(kp->dev, "failed to read keypad matrix\n"); return IRQ_HANDLED; } __pmic8xxx_kp_scan_matrix(kp, new_state, kp->stuckstate); return IRQ_HANDLED; }