From a4c8bbbc289e4f853b52ce9fe604079038e644cc Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Mon, 20 Jul 2015 15:17:09 +0200 Subject: input: twl4030: Keypad scan and input This allows scanning the twl4030 keypad, storing the result in a 64-byte long matrix with the twl4030_keypad_scan function. Detecting a key at a given column and row is made easier with the twl4030_keypad_key function. Signed-off-by: Paul Kocialkowski Reviewed-by: Tom Rini diff --git a/drivers/input/twl4030.c b/drivers/input/twl4030.c index a5ded35..dc5868c 100644 --- a/drivers/input/twl4030.c +++ b/drivers/input/twl4030.c @@ -47,3 +47,42 @@ int twl4030_input_usb(void) return 0; } + +int twl4030_keypad_scan(unsigned char *matrix) +{ + u8 data; + u8 c, r; + + twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD, + TWL4030_KEYPAD_KEYP_CTRL_REG, &data); + + data |= TWL4030_KEYPAD_CTRL_SOFT_NRST | TWL4030_KEYPAD_CTRL_KBD_ON; + data &= ~TWL4030_KEYPAD_CTRL_SOFTMODEN; + + twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, + TWL4030_KEYPAD_KEYP_CTRL_REG, data); + + for (c = 0; c < 8; c++) { + data = 0xff & ~(1 << c); + twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, + TWL4030_KEYPAD_KBC_REG, data); + + data = 0xff; + twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD, + TWL4030_KEYPAD_KBR_REG, &data); + + for (r = 0; r < 8; r++) + matrix[c * 8 + r] = !(data & (1 << r)); + } + + data = 0xff & ~(TWL4030_KEYPAD_CTRL_SOFT_NRST); + twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD, + TWL4030_KEYPAD_KEYP_CTRL_REG, data); + + return 0; +} + +int twl4030_keypad_key(unsigned char *matrix, u8 c, u8 r) +{ + return matrix[c * 8 + r]; +} diff --git a/include/twl4030.h b/include/twl4030.h index a4d5fbd..1031373 100644 --- a/include/twl4030.h +++ b/include/twl4030.h @@ -683,6 +683,9 @@ int twl4030_input_power_button(void); int twl4030_input_charger(void); int twl4030_input_usb(void); +int twl4030_keypad_scan(unsigned char *matrix); +int twl4030_keypad_key(unsigned char *matrix, u8 c, u8 r); + /* * LED */ -- cgit v0.10.2