Lines Matching refs:kp
138 static int twl4030_kpread(struct twl4030_keypad *kp, in twl4030_kpread() argument
144 dev_warn(kp->dbg_dev, in twl4030_kpread()
151 static int twl4030_kpwrite_u8(struct twl4030_keypad *kp, u8 data, u32 reg) in twl4030_kpwrite_u8() argument
156 dev_warn(kp->dbg_dev, in twl4030_kpwrite_u8()
163 static inline u16 twl4030_col_xlate(struct twl4030_keypad *kp, u8 col) in twl4030_col_xlate() argument
171 return 1 << kp->n_cols; in twl4030_col_xlate()
173 return col & ((1 << kp->n_cols) - 1); in twl4030_col_xlate()
176 static int twl4030_read_kp_matrix_state(struct twl4030_keypad *kp, u16 *state) in twl4030_read_kp_matrix_state() argument
180 int ret = twl4030_kpread(kp, new_state, in twl4030_read_kp_matrix_state()
181 KEYP_FULL_CODE_7_0, kp->n_rows); in twl4030_read_kp_matrix_state()
183 for (row = 0; row < kp->n_rows; row++) in twl4030_read_kp_matrix_state()
184 state[row] = twl4030_col_xlate(kp, new_state[row]); in twl4030_read_kp_matrix_state()
189 static bool twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) in twl4030_is_in_ghost_state() argument
194 for (i = 0; i < kp->n_rows; i++) { in twl4030_is_in_ghost_state()
206 static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) in twl4030_kp_scan() argument
208 struct input_dev *input = kp->input; in twl4030_kp_scan()
216 int ret = twl4030_read_kp_matrix_state(kp, new_state); in twl4030_kp_scan()
221 if (twl4030_is_in_ghost_state(kp, new_state)) in twl4030_kp_scan()
226 for (row = 0; row < kp->n_rows; row++) { in twl4030_kp_scan()
227 int changed = new_state[row] ^ kp->kp_state[row]; in twl4030_kp_scan()
233 for (col = 0; col < kp->n_cols + 1; col++) { in twl4030_kp_scan()
239 dev_dbg(kp->dbg_dev, "key [%d:%d] %s\n", row, col, in twl4030_kp_scan()
245 input_report_key(input, kp->keymap[code], in twl4030_kp_scan()
248 kp->kp_state[row] = new_state[row]; in twl4030_kp_scan()
258 struct twl4030_keypad *kp = _kp; in do_kp_irq() local
263 ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); in do_kp_irq()
268 twl4030_kp_scan(kp, false); in do_kp_irq()
270 twl4030_kp_scan(kp, true); in do_kp_irq()
275 static int twl4030_kp_program(struct twl4030_keypad *kp) in twl4030_kp_program() argument
283 if (twl4030_kpwrite_u8(kp, reg, KEYP_CTRL) < 0) in twl4030_kp_program()
292 if (twl4030_kpwrite_u8(kp, reg, KEYP_EDR) < 0) in twl4030_kp_program()
297 if (twl4030_kpwrite_u8(kp, reg, KEYP_LK_PTV) < 0) in twl4030_kp_program()
302 if (twl4030_kpwrite_u8(kp, i, KEYP_DEB) < 0) in twl4030_kp_program()
307 if (twl4030_kpwrite_u8(kp, (i & 0xFF), KEYP_TIMEOUT_L) < 0) in twl4030_kp_program()
310 if (twl4030_kpwrite_u8(kp, (i >> 8), KEYP_TIMEOUT_H) < 0) in twl4030_kp_program()
318 if (twl4030_kpwrite_u8(kp, reg, KEYP_SIH_CTRL) < 0) in twl4030_kp_program()
322 if (twl4030_read_kp_matrix_state(kp, kp->kp_state) < 0) in twl4030_kp_program()
336 struct twl4030_keypad *kp; in twl4030_kp_probe() local
341 kp = devm_kzalloc(&pdev->dev, sizeof(*kp), GFP_KERNEL); in twl4030_kp_probe()
342 if (!kp) in twl4030_kp_probe()
350 kp->dbg_dev = &pdev->dev; in twl4030_kp_probe()
351 kp->input = input; in twl4030_kp_probe()
368 kp->n_rows = pdata->rows; in twl4030_kp_probe()
369 kp->n_cols = pdata->cols; in twl4030_kp_probe()
370 kp->autorepeat = pdata->rep; in twl4030_kp_probe()
373 error = matrix_keypad_parse_of_params(&pdev->dev, &kp->n_rows, in twl4030_kp_probe()
374 &kp->n_cols); in twl4030_kp_probe()
378 kp->autorepeat = true; in twl4030_kp_probe()
381 if (kp->n_rows > TWL4030_MAX_ROWS || kp->n_cols > TWL4030_MAX_COLS) { in twl4030_kp_probe()
387 kp->irq = platform_get_irq(pdev, 0); in twl4030_kp_probe()
388 if (!kp->irq) { in twl4030_kp_probe()
396 kp->keymap, input); in twl4030_kp_probe()
398 dev_err(kp->dbg_dev, "Failed to build keymap\n"); in twl4030_kp_probe()
404 if (kp->autorepeat) in twl4030_kp_probe()
409 dev_err(kp->dbg_dev, in twl4030_kp_probe()
414 error = twl4030_kp_program(kp); in twl4030_kp_probe()
424 error = devm_request_threaded_irq(&pdev->dev, kp->irq, NULL, do_kp_irq, in twl4030_kp_probe()
425 0, pdev->name, kp); in twl4030_kp_probe()
427 dev_info(kp->dbg_dev, "request_irq failed for irq no=%d: %d\n", in twl4030_kp_probe()
428 kp->irq, error); in twl4030_kp_probe()
434 if (twl4030_kpwrite_u8(kp, reg, KEYP_IMR1)) { in twl4030_kp_probe()
436 (void) twl4030_kpwrite_u8(kp, 0xff, KEYP_IMR1); in twl4030_kp_probe()
440 platform_set_drvdata(pdev, kp); in twl4030_kp_probe()