GNU Linux-libre 4.9.287-gnu1
[releases.git] / drivers / input / keyboard / matrix_keypad.c
1 /*
2  *  GPIO driven matrix keyboard driver
3  *
4  *  Copyright (c) 2008 Marek Vasut <marek.vasut@gmail.com>
5  *
6  *  Based on corgikbd.c
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License version 2 as
10  *  published by the Free Software Foundation.
11  *
12  */
13
14 #include <linux/types.h>
15 #include <linux/delay.h>
16 #include <linux/platform_device.h>
17 #include <linux/input.h>
18 #include <linux/irq.h>
19 #include <linux/interrupt.h>
20 #include <linux/jiffies.h>
21 #include <linux/module.h>
22 #include <linux/gpio.h>
23 #include <linux/input/matrix_keypad.h>
24 #include <linux/slab.h>
25 #include <linux/of.h>
26 #include <linux/of_gpio.h>
27 #include <linux/of_platform.h>
28
29 struct matrix_keypad {
30         const struct matrix_keypad_platform_data *pdata;
31         struct input_dev *input_dev;
32         unsigned int row_shift;
33
34         DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS);
35
36         uint32_t last_key_state[MATRIX_MAX_COLS];
37         struct delayed_work work;
38         spinlock_t lock;
39         bool scan_pending;
40         bool stopped;
41         bool gpio_all_disabled;
42 };
43
44 /*
45  * NOTE: normally the GPIO has to be put into HiZ when de-activated to cause
46  * minmal side effect when scanning other columns, here it is configured to
47  * be input, and it should work on most platforms.
48  */
49 static void __activate_col(const struct matrix_keypad_platform_data *pdata,
50                            int col, bool on)
51 {
52         bool level_on = !pdata->active_low;
53
54         if (on) {
55                 gpio_direction_output(pdata->col_gpios[col], level_on);
56         } else {
57                 gpio_set_value_cansleep(pdata->col_gpios[col], !level_on);
58                 gpio_direction_input(pdata->col_gpios[col]);
59         }
60 }
61
62 static void activate_col(const struct matrix_keypad_platform_data *pdata,
63                          int col, bool on)
64 {
65         __activate_col(pdata, col, on);
66
67         if (on && pdata->col_scan_delay_us)
68                 udelay(pdata->col_scan_delay_us);
69 }
70
71 static void activate_all_cols(const struct matrix_keypad_platform_data *pdata,
72                               bool on)
73 {
74         int col;
75
76         for (col = 0; col < pdata->num_col_gpios; col++)
77                 __activate_col(pdata, col, on);
78 }
79
80 static bool row_asserted(const struct matrix_keypad_platform_data *pdata,
81                          int row)
82 {
83         return gpio_get_value_cansleep(pdata->row_gpios[row]) ?
84                         !pdata->active_low : pdata->active_low;
85 }
86
87 static void enable_row_irqs(struct matrix_keypad *keypad)
88 {
89         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
90         int i;
91
92         if (pdata->clustered_irq > 0)
93                 enable_irq(pdata->clustered_irq);
94         else {
95                 for (i = 0; i < pdata->num_row_gpios; i++)
96                         enable_irq(gpio_to_irq(pdata->row_gpios[i]));
97         }
98 }
99
100 static void disable_row_irqs(struct matrix_keypad *keypad)
101 {
102         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
103         int i;
104
105         if (pdata->clustered_irq > 0)
106                 disable_irq_nosync(pdata->clustered_irq);
107         else {
108                 for (i = 0; i < pdata->num_row_gpios; i++)
109                         disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i]));
110         }
111 }
112
113 /*
114  * This gets the keys from keyboard and reports it to input subsystem
115  */
116 static void matrix_keypad_scan(struct work_struct *work)
117 {
118         struct matrix_keypad *keypad =
119                 container_of(work, struct matrix_keypad, work.work);
120         struct input_dev *input_dev = keypad->input_dev;
121         const unsigned short *keycodes = input_dev->keycode;
122         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
123         uint32_t new_state[MATRIX_MAX_COLS];
124         int row, col, code;
125
126         /* de-activate all columns for scanning */
127         activate_all_cols(pdata, false);
128
129         memset(new_state, 0, sizeof(new_state));
130
131         /* assert each column and read the row status out */
132         for (col = 0; col < pdata->num_col_gpios; col++) {
133
134                 activate_col(pdata, col, true);
135
136                 for (row = 0; row < pdata->num_row_gpios; row++)
137                         new_state[col] |=
138                                 row_asserted(pdata, row) ? (1 << row) : 0;
139
140                 activate_col(pdata, col, false);
141         }
142
143         for (col = 0; col < pdata->num_col_gpios; col++) {
144                 uint32_t bits_changed;
145
146                 bits_changed = keypad->last_key_state[col] ^ new_state[col];
147                 if (bits_changed == 0)
148                         continue;
149
150                 for (row = 0; row < pdata->num_row_gpios; row++) {
151                         if ((bits_changed & (1 << row)) == 0)
152                                 continue;
153
154                         code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
155                         input_event(input_dev, EV_MSC, MSC_SCAN, code);
156                         input_report_key(input_dev,
157                                          keycodes[code],
158                                          new_state[col] & (1 << row));
159                 }
160         }
161         input_sync(input_dev);
162
163         memcpy(keypad->last_key_state, new_state, sizeof(new_state));
164
165         activate_all_cols(pdata, true);
166
167         /* Enable IRQs again */
168         spin_lock_irq(&keypad->lock);
169         keypad->scan_pending = false;
170         enable_row_irqs(keypad);
171         spin_unlock_irq(&keypad->lock);
172 }
173
174 static irqreturn_t matrix_keypad_interrupt(int irq, void *id)
175 {
176         struct matrix_keypad *keypad = id;
177         unsigned long flags;
178
179         spin_lock_irqsave(&keypad->lock, flags);
180
181         /*
182          * See if another IRQ beaten us to it and scheduled the
183          * scan already. In that case we should not try to
184          * disable IRQs again.
185          */
186         if (unlikely(keypad->scan_pending || keypad->stopped))
187                 goto out;
188
189         disable_row_irqs(keypad);
190         keypad->scan_pending = true;
191         schedule_delayed_work(&keypad->work,
192                 msecs_to_jiffies(keypad->pdata->debounce_ms));
193
194 out:
195         spin_unlock_irqrestore(&keypad->lock, flags);
196         return IRQ_HANDLED;
197 }
198
199 static int matrix_keypad_start(struct input_dev *dev)
200 {
201         struct matrix_keypad *keypad = input_get_drvdata(dev);
202
203         keypad->stopped = false;
204         mb();
205
206         /*
207          * Schedule an immediate key scan to capture current key state;
208          * columns will be activated and IRQs be enabled after the scan.
209          */
210         schedule_delayed_work(&keypad->work, 0);
211
212         return 0;
213 }
214
215 static void matrix_keypad_stop(struct input_dev *dev)
216 {
217         struct matrix_keypad *keypad = input_get_drvdata(dev);
218
219         spin_lock_irq(&keypad->lock);
220         keypad->stopped = true;
221         spin_unlock_irq(&keypad->lock);
222
223         flush_delayed_work(&keypad->work);
224         /*
225          * matrix_keypad_scan() will leave IRQs enabled;
226          * we should disable them now.
227          */
228         disable_row_irqs(keypad);
229 }
230
231 #ifdef CONFIG_PM_SLEEP
232 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
233 {
234         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
235         unsigned int gpio;
236         int i;
237
238         if (pdata->clustered_irq > 0) {
239                 if (enable_irq_wake(pdata->clustered_irq) == 0)
240                         keypad->gpio_all_disabled = true;
241         } else {
242
243                 for (i = 0; i < pdata->num_row_gpios; i++) {
244                         if (!test_bit(i, keypad->disabled_gpios)) {
245                                 gpio = pdata->row_gpios[i];
246
247                                 if (enable_irq_wake(gpio_to_irq(gpio)) == 0)
248                                         __set_bit(i, keypad->disabled_gpios);
249                         }
250                 }
251         }
252 }
253
254 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
255 {
256         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
257         unsigned int gpio;
258         int i;
259
260         if (pdata->clustered_irq > 0) {
261                 if (keypad->gpio_all_disabled) {
262                         disable_irq_wake(pdata->clustered_irq);
263                         keypad->gpio_all_disabled = false;
264                 }
265         } else {
266                 for (i = 0; i < pdata->num_row_gpios; i++) {
267                         if (test_and_clear_bit(i, keypad->disabled_gpios)) {
268                                 gpio = pdata->row_gpios[i];
269                                 disable_irq_wake(gpio_to_irq(gpio));
270                         }
271                 }
272         }
273 }
274
275 static int matrix_keypad_suspend(struct device *dev)
276 {
277         struct platform_device *pdev = to_platform_device(dev);
278         struct matrix_keypad *keypad = platform_get_drvdata(pdev);
279
280         matrix_keypad_stop(keypad->input_dev);
281
282         if (device_may_wakeup(&pdev->dev))
283                 matrix_keypad_enable_wakeup(keypad);
284
285         return 0;
286 }
287
288 static int matrix_keypad_resume(struct device *dev)
289 {
290         struct platform_device *pdev = to_platform_device(dev);
291         struct matrix_keypad *keypad = platform_get_drvdata(pdev);
292
293         if (device_may_wakeup(&pdev->dev))
294                 matrix_keypad_disable_wakeup(keypad);
295
296         matrix_keypad_start(keypad->input_dev);
297
298         return 0;
299 }
300 #endif
301
302 static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops,
303                          matrix_keypad_suspend, matrix_keypad_resume);
304
305 static int matrix_keypad_init_gpio(struct platform_device *pdev,
306                                    struct matrix_keypad *keypad)
307 {
308         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
309         int i, err;
310
311         /* initialized strobe lines as outputs, activated */
312         for (i = 0; i < pdata->num_col_gpios; i++) {
313                 err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col");
314                 if (err) {
315                         dev_err(&pdev->dev,
316                                 "failed to request GPIO%d for COL%d\n",
317                                 pdata->col_gpios[i], i);
318                         goto err_free_cols;
319                 }
320
321                 gpio_direction_output(pdata->col_gpios[i], !pdata->active_low);
322         }
323
324         for (i = 0; i < pdata->num_row_gpios; i++) {
325                 err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row");
326                 if (err) {
327                         dev_err(&pdev->dev,
328                                 "failed to request GPIO%d for ROW%d\n",
329                                 pdata->row_gpios[i], i);
330                         goto err_free_rows;
331                 }
332
333                 gpio_direction_input(pdata->row_gpios[i]);
334         }
335
336         if (pdata->clustered_irq > 0) {
337                 err = request_any_context_irq(pdata->clustered_irq,
338                                 matrix_keypad_interrupt,
339                                 pdata->clustered_irq_flags,
340                                 "matrix-keypad", keypad);
341                 if (err < 0) {
342                         dev_err(&pdev->dev,
343                                 "Unable to acquire clustered interrupt\n");
344                         goto err_free_rows;
345                 }
346         } else {
347                 for (i = 0; i < pdata->num_row_gpios; i++) {
348                         err = request_any_context_irq(
349                                         gpio_to_irq(pdata->row_gpios[i]),
350                                         matrix_keypad_interrupt,
351                                         IRQF_TRIGGER_RISING |
352                                         IRQF_TRIGGER_FALLING,
353                                         "matrix-keypad", keypad);
354                         if (err < 0) {
355                                 dev_err(&pdev->dev,
356                                         "Unable to acquire interrupt for GPIO line %i\n",
357                                         pdata->row_gpios[i]);
358                                 goto err_free_irqs;
359                         }
360                 }
361         }
362
363         /* initialized as disabled - enabled by input->open */
364         disable_row_irqs(keypad);
365         return 0;
366
367 err_free_irqs:
368         while (--i >= 0)
369                 free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
370         i = pdata->num_row_gpios;
371 err_free_rows:
372         while (--i >= 0)
373                 gpio_free(pdata->row_gpios[i]);
374         i = pdata->num_col_gpios;
375 err_free_cols:
376         while (--i >= 0)
377                 gpio_free(pdata->col_gpios[i]);
378
379         return err;
380 }
381
382 static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
383 {
384         const struct matrix_keypad_platform_data *pdata = keypad->pdata;
385         int i;
386
387         if (pdata->clustered_irq > 0) {
388                 free_irq(pdata->clustered_irq, keypad);
389         } else {
390                 for (i = 0; i < pdata->num_row_gpios; i++)
391                         free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
392         }
393
394         for (i = 0; i < pdata->num_row_gpios; i++)
395                 gpio_free(pdata->row_gpios[i]);
396
397         for (i = 0; i < pdata->num_col_gpios; i++)
398                 gpio_free(pdata->col_gpios[i]);
399 }
400
401 #ifdef CONFIG_OF
402 static struct matrix_keypad_platform_data *
403 matrix_keypad_parse_dt(struct device *dev)
404 {
405         struct matrix_keypad_platform_data *pdata;
406         struct device_node *np = dev->of_node;
407         unsigned int *gpios;
408         int ret, i, nrow, ncol;
409
410         if (!np) {
411                 dev_err(dev, "device lacks DT data\n");
412                 return ERR_PTR(-ENODEV);
413         }
414
415         pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
416         if (!pdata) {
417                 dev_err(dev, "could not allocate memory for platform data\n");
418                 return ERR_PTR(-ENOMEM);
419         }
420
421         pdata->num_row_gpios = nrow = of_gpio_named_count(np, "row-gpios");
422         pdata->num_col_gpios = ncol = of_gpio_named_count(np, "col-gpios");
423         if (nrow <= 0 || ncol <= 0) {
424                 dev_err(dev, "number of keypad rows/columns not specified\n");
425                 return ERR_PTR(-EINVAL);
426         }
427
428         if (of_get_property(np, "linux,no-autorepeat", NULL))
429                 pdata->no_autorepeat = true;
430
431         pdata->wakeup = of_property_read_bool(np, "wakeup-source") ||
432                         of_property_read_bool(np, "linux,wakeup"); /* legacy */
433
434         if (of_get_property(np, "gpio-activelow", NULL))
435                 pdata->active_low = true;
436
437         of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms);
438         of_property_read_u32(np, "col-scan-delay-us",
439                                                 &pdata->col_scan_delay_us);
440
441         gpios = devm_kzalloc(dev,
442                              sizeof(unsigned int) *
443                                 (pdata->num_row_gpios + pdata->num_col_gpios),
444                              GFP_KERNEL);
445         if (!gpios) {
446                 dev_err(dev, "could not allocate memory for gpios\n");
447                 return ERR_PTR(-ENOMEM);
448         }
449
450         for (i = 0; i < nrow; i++) {
451                 ret = of_get_named_gpio(np, "row-gpios", i);
452                 if (ret < 0)
453                         return ERR_PTR(ret);
454                 gpios[i] = ret;
455         }
456
457         for (i = 0; i < ncol; i++) {
458                 ret = of_get_named_gpio(np, "col-gpios", i);
459                 if (ret < 0)
460                         return ERR_PTR(ret);
461                 gpios[nrow + i] = ret;
462         }
463
464         pdata->row_gpios = gpios;
465         pdata->col_gpios = &gpios[pdata->num_row_gpios];
466
467         return pdata;
468 }
469 #else
470 static inline struct matrix_keypad_platform_data *
471 matrix_keypad_parse_dt(struct device *dev)
472 {
473         dev_err(dev, "no platform data defined\n");
474
475         return ERR_PTR(-EINVAL);
476 }
477 #endif
478
479 static int matrix_keypad_probe(struct platform_device *pdev)
480 {
481         const struct matrix_keypad_platform_data *pdata;
482         struct matrix_keypad *keypad;
483         struct input_dev *input_dev;
484         int err;
485
486         pdata = dev_get_platdata(&pdev->dev);
487         if (!pdata) {
488                 pdata = matrix_keypad_parse_dt(&pdev->dev);
489                 if (IS_ERR(pdata))
490                         return PTR_ERR(pdata);
491         } else if (!pdata->keymap_data) {
492                 dev_err(&pdev->dev, "no keymap data defined\n");
493                 return -EINVAL;
494         }
495
496         keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
497         input_dev = input_allocate_device();
498         if (!keypad || !input_dev) {
499                 err = -ENOMEM;
500                 goto err_free_mem;
501         }
502
503         keypad->input_dev = input_dev;
504         keypad->pdata = pdata;
505         keypad->row_shift = get_count_order(pdata->num_col_gpios);
506         keypad->stopped = true;
507         INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
508         spin_lock_init(&keypad->lock);
509
510         input_dev->name         = pdev->name;
511         input_dev->id.bustype   = BUS_HOST;
512         input_dev->dev.parent   = &pdev->dev;
513         input_dev->open         = matrix_keypad_start;
514         input_dev->close        = matrix_keypad_stop;
515
516         err = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
517                                          pdata->num_row_gpios,
518                                          pdata->num_col_gpios,
519                                          NULL, input_dev);
520         if (err) {
521                 dev_err(&pdev->dev, "failed to build keymap\n");
522                 goto err_free_mem;
523         }
524
525         if (!pdata->no_autorepeat)
526                 __set_bit(EV_REP, input_dev->evbit);
527         input_set_capability(input_dev, EV_MSC, MSC_SCAN);
528         input_set_drvdata(input_dev, keypad);
529
530         err = matrix_keypad_init_gpio(pdev, keypad);
531         if (err)
532                 goto err_free_mem;
533
534         err = input_register_device(keypad->input_dev);
535         if (err)
536                 goto err_free_gpio;
537
538         device_init_wakeup(&pdev->dev, pdata->wakeup);
539         platform_set_drvdata(pdev, keypad);
540
541         return 0;
542
543 err_free_gpio:
544         matrix_keypad_free_gpio(keypad);
545 err_free_mem:
546         input_free_device(input_dev);
547         kfree(keypad);
548         return err;
549 }
550
551 static int matrix_keypad_remove(struct platform_device *pdev)
552 {
553         struct matrix_keypad *keypad = platform_get_drvdata(pdev);
554
555         device_init_wakeup(&pdev->dev, 0);
556
557         matrix_keypad_free_gpio(keypad);
558         input_unregister_device(keypad->input_dev);
559         kfree(keypad);
560
561         return 0;
562 }
563
564 #ifdef CONFIG_OF
565 static const struct of_device_id matrix_keypad_dt_match[] = {
566         { .compatible = "gpio-matrix-keypad" },
567         { }
568 };
569 MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match);
570 #endif
571
572 static struct platform_driver matrix_keypad_driver = {
573         .probe          = matrix_keypad_probe,
574         .remove         = matrix_keypad_remove,
575         .driver         = {
576                 .name   = "matrix-keypad",
577                 .pm     = &matrix_keypad_pm_ops,
578                 .of_match_table = of_match_ptr(matrix_keypad_dt_match),
579         },
580 };
581 module_platform_driver(matrix_keypad_driver);
582
583 MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
584 MODULE_DESCRIPTION("GPIO Driven Matrix Keypad Driver");
585 MODULE_LICENSE("GPL v2");
586 MODULE_ALIAS("platform:matrix-keypad");