diff options
-rw-r--r-- | drivers/input/twl4030.c | 39 | ||||
-rw-r--r-- | include/twl4030.h | 3 |
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/input/twl4030.c b/drivers/input/twl4030.c index a5ded35d92..dc5868c0ab 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 a4d5fbdb61..103137372d 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 */ |