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
172 return 1 << kp->n_cols; in twl4030_col_xlate()
174 return col & ((1 << kp->n_cols) - 1); in twl4030_col_xlate()
177 static int twl4030_read_kp_matrix_state(struct twl4030_keypad *kp, u16 *state) in twl4030_read_kp_matrix_state() argument
181 int ret = twl4030_kpread(kp, new_state, in twl4030_read_kp_matrix_state()
182 KEYP_FULL_CODE_7_0, kp->n_rows); in twl4030_read_kp_matrix_state()
184 for (row = 0; row < kp->n_rows; row++) in twl4030_read_kp_matrix_state()
185 state[row] = twl4030_col_xlate(kp, new_state[row]); in twl4030_read_kp_matrix_state()
190 static bool twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) in twl4030_is_in_ghost_state() argument
195 for (i = 0; i < kp->n_rows; i++) { in twl4030_is_in_ghost_state()
207 static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) in twl4030_kp_scan() argument
209 struct input_dev *input = kp->input; in twl4030_kp_scan()
217 int ret = twl4030_read_kp_matrix_state(kp, new_state); in twl4030_kp_scan()
222 if (twl4030_is_in_ghost_state(kp, new_state)) in twl4030_kp_scan()
227 for (row = 0; row < kp->n_rows; row++) { in twl4030_kp_scan()
228 int changed = new_state[row] ^ kp->kp_state[row]; in twl4030_kp_scan()
234 for (col = 0; col < kp->n_cols + 1; col++) { in twl4030_kp_scan()
240 dev_dbg(kp->dbg_dev, "key [%d:%d] %s\n", row, col, in twl4030_kp_scan()
246 input_report_key(input, kp->keymap[code], in twl4030_kp_scan()
249 kp->kp_state[row] = new_state[row]; in twl4030_kp_scan()
259 struct twl4030_keypad *kp = _kp; in do_kp_irq() local
264 ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); in do_kp_irq()
271 twl4030_kp_scan(kp, false); in do_kp_irq()
273 twl4030_kp_scan(kp, true); in do_kp_irq()
278 static int twl4030_kp_program(struct twl4030_keypad *kp) in twl4030_kp_program() argument
286 if (twl4030_kpwrite_u8(kp, reg, KEYP_CTRL) < 0) in twl4030_kp_program()
296 if (twl4030_kpwrite_u8(kp, reg, KEYP_EDR) < 0) in twl4030_kp_program()
301 if (twl4030_kpwrite_u8(kp, reg, KEYP_LK_PTV) < 0) in twl4030_kp_program()
306 if (twl4030_kpwrite_u8(kp, i, KEYP_DEB) < 0) in twl4030_kp_program()
311 if (twl4030_kpwrite_u8(kp, (i & 0xFF), KEYP_TIMEOUT_L) < 0) in twl4030_kp_program()
314 if (twl4030_kpwrite_u8(kp, (i >> 8), KEYP_TIMEOUT_H) < 0) in twl4030_kp_program()
322 if (twl4030_kpwrite_u8(kp, reg, KEYP_SIH_CTRL) < 0) in twl4030_kp_program()
326 if (twl4030_read_kp_matrix_state(kp, kp->kp_state) < 0) in twl4030_kp_program()
340 struct twl4030_keypad *kp; in twl4030_kp_probe() local
345 kp = devm_kzalloc(&pdev->dev, sizeof(*kp), GFP_KERNEL); in twl4030_kp_probe()
346 if (!kp) in twl4030_kp_probe()
354 kp->dbg_dev = &pdev->dev; in twl4030_kp_probe()
355 kp->input = input; in twl4030_kp_probe()
372 kp->n_rows = pdata->rows; in twl4030_kp_probe()
373 kp->n_cols = pdata->cols; in twl4030_kp_probe()
374 kp->autorepeat = pdata->rep; in twl4030_kp_probe()
377 error = matrix_keypad_parse_properties(&pdev->dev, &kp->n_rows, in twl4030_kp_probe()
378 &kp->n_cols); in twl4030_kp_probe()
382 kp->autorepeat = true; in twl4030_kp_probe()
385 if (kp->n_rows > TWL4030_MAX_ROWS || kp->n_cols > TWL4030_MAX_COLS) { in twl4030_kp_probe()
391 kp->irq = platform_get_irq(pdev, 0); in twl4030_kp_probe()
392 if (!kp->irq) { in twl4030_kp_probe()
400 kp->keymap, input); in twl4030_kp_probe()
402 dev_err(kp->dbg_dev, "Failed to build keymap\n"); in twl4030_kp_probe()
408 if (kp->autorepeat) in twl4030_kp_probe()
413 dev_err(kp->dbg_dev, in twl4030_kp_probe()
418 error = twl4030_kp_program(kp); in twl4030_kp_probe()
428 error = devm_request_threaded_irq(&pdev->dev, kp->irq, NULL, do_kp_irq, in twl4030_kp_probe()
429 0, pdev->name, kp); in twl4030_kp_probe()
431 dev_info(kp->dbg_dev, "request_irq failed for irq no=%d: %d\n", in twl4030_kp_probe()
432 kp->irq, error); in twl4030_kp_probe()
438 if (twl4030_kpwrite_u8(kp, reg, KEYP_IMR1)) { in twl4030_kp_probe()
440 (void) twl4030_kpwrite_u8(kp, 0xff, KEYP_IMR1); in twl4030_kp_probe()