static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state, u16 *old_state) { int rc, read_rows; u8 scan_val; if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) read_rows = PM8XXX_MIN_ROWS; else read_rows = kp->pdata->num_rows; pmic8xxx_chk_sync_read(kp); if (old_state) { rc = pmic8xxx_kp_read_data(kp, old_state, KEYP_OLD_DATA, read_rows); if (rc < 0) { dev_err(kp->dev, "Error reading KEYP_OLD_DATA, rc=%d\n", rc); return rc; } } rc = pmic8xxx_kp_read_data(kp, new_state, KEYP_RECENT_DATA, read_rows); if (rc < 0) { dev_err(kp->dev, "Error reading KEYP_RECENT_DATA, rc=%d\n", rc); return rc; } /* 4 * 32KHz clocks */ udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); if (rc < 0) { dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); return rc; } scan_val &= 0xFE; rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); if (rc < 0) dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); return rc; }
static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state, u16 *old_state) { int rc, read_rows; u8 scan_val; #ifdef CONFIG_HUAWEI_KERNEL int i=0; #endif if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) read_rows = PM8XXX_MIN_ROWS; else read_rows = kp->pdata->num_rows; pmic8xxx_chk_sync_read(kp); if (old_state) { rc = pmic8xxx_kp_read_data(kp, old_state, KEYP_OLD_DATA, read_rows); if (rc < 0) { dev_err(kp->dev, "Error reading KEYP_OLD_DATA, rc=%d\n", rc); return rc; } /*it is reslove the problem of ghost , becuse the six column just one key */ #ifdef CONFIG_HUAWEI_KERNEL if(machine_is_msm8255_u8730()) { if(~old_state[0] &(1<<(kp->pdata->num_cols-1))) { for(i=1;i< kp->pdata->num_rows;i++) { old_state[i] |= 1<<(kp->pdata->num_cols-1); } } } #endif } rc = pmic8xxx_kp_read_data(kp, new_state, KEYP_RECENT_DATA, read_rows); if (rc < 0) { dev_err(kp->dev, "Error reading KEYP_RECENT_DATA, rc=%d\n", rc); return rc; } /*it is reslove the problem of ghost , becuse the six column just one key */ #ifdef CONFIG_HUAWEI_KERNEL if(machine_is_msm8255_u8730()) { if(~new_state[0] &(1<<(kp->pdata->num_cols-1))) { for(i=1;i< kp->pdata->num_rows-1;i++) { new_state[i] |= 1<<(kp->pdata->num_cols-1); } } } #endif /* 4 * 32KHz clocks */ udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); if (rc < 0) { dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); return rc; } scan_val &= 0xFE; rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); if (rc < 0) dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); return rc; }