12 #include <linux/module.h>
15 #include <linux/input.h>
18 #include <linux/i2c.h>
19 #include <linux/slab.h>
23 #define TC3589x_MAX_KPROW 8
24 #define TC3589x_MAX_KPCOL 12
27 #define TC3589x_MAX_DEBOUNCE_SETTLE 0xFF
28 #define DEDICATED_KEY_VAL 0xFF
31 #define TC3589x_NO_PULL_MASK 0x0
32 #define TC3589x_PULL_DOWN_MASK 0x1
33 #define TC3589x_PULL_UP_MASK 0x2
34 #define TC3589x_PULLUP_ALL_MASK 0xAA
35 #define TC3589x_IO_PULL_VAL(index, mask) ((mask)<<((index)%4)*2))
38 #define IOCFG_BALLCFG 0x01
41 #define KP_EVCODE_COL_MASK 0x0F
42 #define KP_EVCODE_ROW_MASK 0x70
43 #define KP_RELEASE_EVT_MASK 0x80
45 #define KP_ROW_SHIFT 4
47 #define KP_NO_VALID_KEY_MASK 0x7F
50 #define TC3589x_KBDRST 0x2
51 #define TC3589x_IRQRST 0x10
52 #define TC3589x_RESET_ALL 0x1B
55 #define TC3589x_KBDMFS_EN 0x1
58 #define KPD_CLK_EN 0x1
64 #define TC3589x_EVT_LOSS_INT 0x8
65 #define TC3589x_EVT_INT 0x4
66 #define TC3589x_KBD_LOSS_INT 0x2
67 #define TC3589x_KBD_INT 0x1
70 #define TC3589x_EVT_INT_CLR 0x2
71 #define TC3589x_KBD_INT_CLR 0x1
73 #define TC3589x_KBD_KEYMAP_SIZE 64
95 static int tc3589x_keypad_init_key_hardware(
struct tc_keypad *keypad)
165 #define TC35893_DATA_REGS 4
166 #define TC35893_KEYCODE_FIFO_EMPTY 0x7f
167 #define TC35893_KEYCODE_FIFO_CLEAR 0xff
168 #define TC35893_KEYPAD_ROW_SHIFT 0x3
174 u8 i, row_index, col_index, kbd_code,
up;
193 input_report_key(keypad->
input, keypad->
keymap[code], !up);
194 input_sync(keypad->
input);
207 static int tc3589x_keypad_enable(
struct tc_keypad *keypad)
243 static int tc3589x_keypad_disable(
struct tc_keypad *keypad)
245 struct tc3589x *tc3589x = keypad->
tc3589x;
273 static int tc3589x_keypad_open(
struct input_dev *
input)
276 struct tc_keypad *keypad = input_get_drvdata(input);
279 error = tc3589x_keypad_enable(keypad);
281 dev_err(&input->dev,
"failed to enable keypad module\n");
285 error = tc3589x_keypad_init_key_hardware(keypad);
287 dev_err(&input->dev,
"failed to configure keypad module\n");
294 static void tc3589x_keypad_close(
struct input_dev *input)
296 struct tc_keypad *keypad = input_get_drvdata(input);
299 tc3589x_keypad_disable(keypad);
306 struct input_dev *
input;
310 plat = tc3589x->
pdata->keypad;
312 dev_err(&pdev->
dev,
"invalid keypad platform data\n");
321 input = input_allocate_device();
322 if (!keypad || !input) {
323 dev_err(&pdev->
dev,
"failed to allocate keypad memory\n");
328 keypad->
board = plat;
333 input->name = pdev->
name;
334 input->dev.parent = &pdev->
dev;
336 input->open = tc3589x_keypad_open;
337 input->close = tc3589x_keypad_close;
343 dev_err(&pdev->
dev,
"Failed to build keymap\n");
351 input_set_drvdata(input, keypad);
354 tc3589x_keypad_irq, plat->
irqtype,
355 "tc3589x-keypad", keypad);
358 "Could not allocate irq %d,error %d\n",
363 error = input_register_device(input);
365 dev_err(&pdev->
dev,
"Could not register input device\n");
373 platform_set_drvdata(pdev, keypad);
380 input_free_device(input);
387 struct tc_keypad *keypad = platform_get_drvdata(pdev);
391 tc3589x_keypad_disable(keypad);
395 input_unregister_device(keypad->
input);
402 #ifdef CONFIG_PM_SLEEP
403 static int tc3589x_keypad_suspend(
struct device *
dev)
406 struct tc_keypad *keypad = platform_get_drvdata(pdev);
414 if (!device_may_wakeup(&pdev->
dev))
415 tc3589x_keypad_disable(keypad);
417 enable_irq_wake(irq);
422 static int tc3589x_keypad_resume(
struct device *dev)
425 struct tc_keypad *keypad = platform_get_drvdata(pdev);
432 if (!device_may_wakeup(&pdev->
dev))
433 tc3589x_keypad_enable(keypad);
435 disable_irq_wake(irq);
442 tc3589x_keypad_suspend, tc3589x_keypad_resume);
446 .name =
"tc3589x-keypad",
448 .pm = &tc3589x_keypad_dev_pm_ops,
450 .probe = tc3589x_keypad_probe,