12 #include <linux/kernel.h>
13 #include <linux/module.h>
16 #include <linux/input.h>
17 #include <linux/device.h>
22 #include <linux/slab.h>
28 #define KPI_3KCONF 0x04
29 #define KPI_LPCONF 0x08
30 #define KPI_STATUS 0x0C
32 #define IS1KEY (0x01 << 16)
33 #define INTTR (0x01 << 21)
34 #define KEY0R (0x0f << 3)
36 #define DEBOUNCE_BIT 0x08
37 #define KSIZE0 (0x01 << 16)
38 #define KSIZE1 (0x01 << 17)
39 #define KPSEL (0x01 << 19)
40 #define ENKP (0x01 << 18)
42 #define KGET_RAW(n) (((n) & KEY0R) >> 3)
43 #define KGET_COLUMN(n) ((n) & KEY0C)
45 #define W90P910_NUM_ROWS 8
46 #define W90P910_NUM_COLS 8
47 #define W90P910_ROW_SHIFT 3
58 static void w90p910_keypad_scan_matrix(
struct w90p910_keypad *keypad,
61 struct input_dev *input_dev = keypad->
input_dev;
68 input_report_key(input_dev, key, 1);
69 input_sync(input_dev);
72 input_report_key(input_dev, key, 0);
73 input_sync(input_dev);
79 unsigned int kstatus,
val;
86 w90p910_keypad_scan_matrix(keypad, kstatus);
113 static void w90p910_keypad_close(
struct input_dev *
dev)
124 pdev->
dev.platform_data;
127 struct input_dev *input_dev;
133 dev_err(&pdev->
dev,
"no platform data defined\n");
141 dev_err(&pdev->
dev,
"failed to get keypad irq\n");
146 input_dev = input_allocate_device();
147 if (!keypad || !input_dev) {
148 dev_err(&pdev->
dev,
"failed to allocate driver data\n");
159 dev_err(&pdev->
dev,
"failed to get I/O memory\n");
166 dev_err(&pdev->
dev,
"failed to request I/O memory\n");
173 dev_err(&pdev->
dev,
"failed to remap I/O memory\n");
175 goto failed_free_res;
179 if (IS_ERR(keypad->
clk)) {
180 dev_err(&pdev->
dev,
"failed to get keypad clock\n");
181 error = PTR_ERR(keypad->
clk);
188 input_dev->name = pdev->
name;
190 input_dev->open = w90p910_keypad_open;
191 input_dev->close = w90p910_keypad_close;
192 input_dev->dev.parent = &pdev->
dev;
196 keypad->
keymap, input_dev);
198 dev_err(&pdev->
dev,
"failed to build keymap\n");
203 0, pdev->
name, keypad);
205 dev_err(&pdev->
dev,
"failed to request IRQ\n");
211 input_set_drvdata(input_dev, keypad);
214 error = input_register_device(input_dev);
216 dev_err(&pdev->
dev,
"failed to register input device\n");
217 goto failed_free_irq;
220 platform_set_drvdata(pdev, keypad);
232 input_free_device(input_dev);
246 input_unregister_device(keypad->
input_dev);
252 platform_set_drvdata(pdev,
NULL);
259 .probe = w90p910_keypad_probe,
262 .name =
"nuc900-kpi",