Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
matrix_keypad.c
Go to the documentation of this file.
1 /*
2  * GPIO driven matrix keyboard driver
3  *
4  * Copyright (c) 2008 Marek Vasut <[email protected]>
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/init.h>
18 #include <linux/input.h>
19 #include <linux/irq.h>
20 #include <linux/interrupt.h>
21 #include <linux/jiffies.h>
22 #include <linux/module.h>
23 #include <linux/gpio.h>
25 #include <linux/slab.h>
26 
27 struct matrix_keypad {
30  unsigned int row_shift;
31 
32  DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS);
33 
38  bool stopped;
40 
41  unsigned short keycodes[];
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)
107  else {
108  for (i = 0; i < pdata->num_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 struct matrix_keypad_platform_data *pdata = keypad->pdata;
123  int row, col, code;
124 
125  /* de-activate all columns for scanning */
126  activate_all_cols(pdata, false);
127 
128  memset(new_state, 0, sizeof(new_state));
129 
130  /* assert each column and read the row status out */
131  for (col = 0; col < pdata->num_col_gpios; col++) {
132 
133  activate_col(pdata, col, true);
134 
135  for (row = 0; row < pdata->num_row_gpios; row++)
136  new_state[col] |=
137  row_asserted(pdata, row) ? (1 << row) : 0;
138 
139  activate_col(pdata, col, false);
140  }
141 
142  for (col = 0; col < pdata->num_col_gpios; col++) {
143  uint32_t bits_changed;
144 
145  bits_changed = keypad->last_key_state[col] ^ new_state[col];
146  if (bits_changed == 0)
147  continue;
148 
149  for (row = 0; row < pdata->num_row_gpios; row++) {
150  if ((bits_changed & (1 << row)) == 0)
151  continue;
152 
153  code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
154  input_event(input_dev, EV_MSC, MSC_SCAN, code);
155  input_report_key(input_dev,
156  keypad->keycodes[code],
157  new_state[col] & (1 << row));
158  }
159  }
160  input_sync(input_dev);
161 
162  memcpy(keypad->last_key_state, new_state, sizeof(new_state));
163 
164  activate_all_cols(pdata, true);
165 
166  /* Enable IRQs again */
167  spin_lock_irq(&keypad->lock);
168  keypad->scan_pending = false;
169  enable_row_irqs(keypad);
170  spin_unlock_irq(&keypad->lock);
171 }
172 
173 static irqreturn_t matrix_keypad_interrupt(int irq, void *id)
174 {
175  struct matrix_keypad *keypad = id;
176  unsigned long flags;
177 
178  spin_lock_irqsave(&keypad->lock, flags);
179 
180  /*
181  * See if another IRQ beaten us to it and scheduled the
182  * scan already. In that case we should not try to
183  * disable IRQs again.
184  */
185  if (unlikely(keypad->scan_pending || keypad->stopped))
186  goto out;
187 
188  disable_row_irqs(keypad);
189  keypad->scan_pending = true;
190  schedule_delayed_work(&keypad->work,
191  msecs_to_jiffies(keypad->pdata->debounce_ms));
192 
193 out:
194  spin_unlock_irqrestore(&keypad->lock, flags);
195  return IRQ_HANDLED;
196 }
197 
198 static int matrix_keypad_start(struct input_dev *dev)
199 {
200  struct matrix_keypad *keypad = input_get_drvdata(dev);
201 
202  keypad->stopped = false;
203  mb();
204 
205  /*
206  * Schedule an immediate key scan to capture current key state;
207  * columns will be activated and IRQs be enabled after the scan.
208  */
209  schedule_delayed_work(&keypad->work, 0);
210 
211  return 0;
212 }
213 
214 static void matrix_keypad_stop(struct input_dev *dev)
215 {
216  struct matrix_keypad *keypad = input_get_drvdata(dev);
217 
218  keypad->stopped = true;
219  mb();
220  flush_work(&keypad->work.work);
221  /*
222  * matrix_keypad_scan() will leave IRQs enabled;
223  * we should disable them now.
224  */
225  disable_row_irqs(keypad);
226 }
227 
228 #ifdef CONFIG_PM_SLEEP
229 static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
230 {
231  const struct matrix_keypad_platform_data *pdata = keypad->pdata;
232  unsigned int gpio;
233  int i;
234 
235  if (pdata->clustered_irq > 0) {
236  if (enable_irq_wake(pdata->clustered_irq) == 0)
237  keypad->gpio_all_disabled = true;
238  } else {
239 
240  for (i = 0; i < pdata->num_row_gpios; i++) {
241  if (!test_bit(i, keypad->disabled_gpios)) {
242  gpio = pdata->row_gpios[i];
243 
244  if (enable_irq_wake(gpio_to_irq(gpio)) == 0)
245  __set_bit(i, keypad->disabled_gpios);
246  }
247  }
248  }
249 }
250 
251 static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
252 {
253  const struct matrix_keypad_platform_data *pdata = keypad->pdata;
254  unsigned int gpio;
255  int i;
256 
257  if (pdata->clustered_irq > 0) {
258  if (keypad->gpio_all_disabled) {
259  disable_irq_wake(pdata->clustered_irq);
260  keypad->gpio_all_disabled = false;
261  }
262  } else {
263  for (i = 0; i < pdata->num_row_gpios; i++) {
264  if (test_and_clear_bit(i, keypad->disabled_gpios)) {
265  gpio = pdata->row_gpios[i];
266  disable_irq_wake(gpio_to_irq(gpio));
267  }
268  }
269  }
270 }
271 
272 static int matrix_keypad_suspend(struct device *dev)
273 {
274  struct platform_device *pdev = to_platform_device(dev);
275  struct matrix_keypad *keypad = platform_get_drvdata(pdev);
276 
277  matrix_keypad_stop(keypad->input_dev);
278 
279  if (device_may_wakeup(&pdev->dev))
280  matrix_keypad_enable_wakeup(keypad);
281 
282  return 0;
283 }
284 
285 static int matrix_keypad_resume(struct device *dev)
286 {
287  struct platform_device *pdev = to_platform_device(dev);
288  struct matrix_keypad *keypad = platform_get_drvdata(pdev);
289 
290  if (device_may_wakeup(&pdev->dev))
291  matrix_keypad_disable_wakeup(keypad);
292 
293  matrix_keypad_start(keypad->input_dev);
294 
295  return 0;
296 }
297 #endif
298 
299 static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops,
300  matrix_keypad_suspend, matrix_keypad_resume);
301 
302 static int __devinit matrix_keypad_init_gpio(struct platform_device *pdev,
303  struct matrix_keypad *keypad)
304 {
305  const struct matrix_keypad_platform_data *pdata = keypad->pdata;
306  int i, err;
307 
308  /* initialized strobe lines as outputs, activated */
309  for (i = 0; i < pdata->num_col_gpios; i++) {
310  err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col");
311  if (err) {
312  dev_err(&pdev->dev,
313  "failed to request GPIO%d for COL%d\n",
314  pdata->col_gpios[i], i);
315  goto err_free_cols;
316  }
317 
318  gpio_direction_output(pdata->col_gpios[i], !pdata->active_low);
319  }
320 
321  for (i = 0; i < pdata->num_row_gpios; i++) {
322  err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row");
323  if (err) {
324  dev_err(&pdev->dev,
325  "failed to request GPIO%d for ROW%d\n",
326  pdata->row_gpios[i], i);
327  goto err_free_rows;
328  }
329 
330  gpio_direction_input(pdata->row_gpios[i]);
331  }
332 
333  if (pdata->clustered_irq > 0) {
334  err = request_irq(pdata->clustered_irq,
335  matrix_keypad_interrupt,
336  pdata->clustered_irq_flags,
337  "matrix-keypad", keypad);
338  if (err) {
339  dev_err(&pdev->dev,
340  "Unable to acquire clustered interrupt\n");
341  goto err_free_rows;
342  }
343  } else {
344  for (i = 0; i < pdata->num_row_gpios; i++) {
345  err = request_irq(gpio_to_irq(pdata->row_gpios[i]),
346  matrix_keypad_interrupt,
349  "matrix-keypad", keypad);
350  if (err) {
351  dev_err(&pdev->dev,
352  "Unable to acquire interrupt for GPIO line %i\n",
353  pdata->row_gpios[i]);
354  goto err_free_irqs;
355  }
356  }
357  }
358 
359  /* initialized as disabled - enabled by input->open */
360  disable_row_irqs(keypad);
361  return 0;
362 
363 err_free_irqs:
364  while (--i >= 0)
365  free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
366  i = pdata->num_row_gpios;
367 err_free_rows:
368  while (--i >= 0)
369  gpio_free(pdata->row_gpios[i]);
370  i = pdata->num_col_gpios;
371 err_free_cols:
372  while (--i >= 0)
373  gpio_free(pdata->col_gpios[i]);
374 
375  return err;
376 }
377 
378 static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
379 {
380  const struct matrix_keypad_platform_data *pdata = keypad->pdata;
381  int i;
382 
383  if (pdata->clustered_irq > 0) {
384  free_irq(pdata->clustered_irq, keypad);
385  } else {
386  for (i = 0; i < pdata->num_row_gpios; i++)
387  free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
388  }
389 
390  for (i = 0; i < pdata->num_row_gpios; i++)
391  gpio_free(pdata->row_gpios[i]);
392 
393  for (i = 0; i < pdata->num_col_gpios; i++)
394  gpio_free(pdata->col_gpios[i]);
395 }
396 
397 static int __devinit matrix_keypad_probe(struct platform_device *pdev)
398 {
399  const struct matrix_keypad_platform_data *pdata;
400  const struct matrix_keymap_data *keymap_data;
401  struct matrix_keypad *keypad;
402  struct input_dev *input_dev;
403  unsigned int row_shift;
404  size_t keymap_size;
405  int err;
406 
407  pdata = pdev->dev.platform_data;
408  if (!pdata) {
409  dev_err(&pdev->dev, "no platform data defined\n");
410  return -EINVAL;
411  }
412 
413  keymap_data = pdata->keymap_data;
414  if (!keymap_data) {
415  dev_err(&pdev->dev, "no keymap data defined\n");
416  return -EINVAL;
417  }
418 
419  row_shift = get_count_order(pdata->num_col_gpios);
420  keymap_size = (pdata->num_row_gpios << row_shift) *
421  sizeof(keypad->keycodes[0]);
422  keypad = kzalloc(sizeof(struct matrix_keypad) + keymap_size,
423  GFP_KERNEL);
424  input_dev = input_allocate_device();
425  if (!keypad || !input_dev) {
426  err = -ENOMEM;
427  goto err_free_mem;
428  }
429 
430  keypad->input_dev = input_dev;
431  keypad->pdata = pdata;
432  keypad->row_shift = row_shift;
433  keypad->stopped = true;
434  INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
435  spin_lock_init(&keypad->lock);
436 
437  input_dev->name = pdev->name;
438  input_dev->id.bustype = BUS_HOST;
439  input_dev->dev.parent = &pdev->dev;
440  input_dev->open = matrix_keypad_start;
441  input_dev->close = matrix_keypad_stop;
442 
443  err = matrix_keypad_build_keymap(keymap_data, NULL,
444  pdata->num_row_gpios,
445  pdata->num_col_gpios,
446  keypad->keycodes, input_dev);
447  if (err)
448  goto err_free_mem;
449 
450  if (!pdata->no_autorepeat)
451  __set_bit(EV_REP, input_dev->evbit);
452  input_set_capability(input_dev, EV_MSC, MSC_SCAN);
453  input_set_drvdata(input_dev, keypad);
454 
455  err = matrix_keypad_init_gpio(pdev, keypad);
456  if (err)
457  goto err_free_mem;
458 
459  err = input_register_device(keypad->input_dev);
460  if (err)
461  goto err_free_gpio;
462 
463  device_init_wakeup(&pdev->dev, pdata->wakeup);
464  platform_set_drvdata(pdev, keypad);
465 
466  return 0;
467 
468 err_free_gpio:
469  matrix_keypad_free_gpio(keypad);
470 err_free_mem:
471  input_free_device(input_dev);
472  kfree(keypad);
473  return err;
474 }
475 
476 static int __devexit matrix_keypad_remove(struct platform_device *pdev)
477 {
478  struct matrix_keypad *keypad = platform_get_drvdata(pdev);
479 
480  device_init_wakeup(&pdev->dev, 0);
481 
482  matrix_keypad_free_gpio(keypad);
483  input_unregister_device(keypad->input_dev);
484  kfree(keypad);
485 
486  platform_set_drvdata(pdev, NULL);
487 
488  return 0;
489 }
490 
491 static struct platform_driver matrix_keypad_driver = {
492  .probe = matrix_keypad_probe,
493  .remove = __devexit_p(matrix_keypad_remove),
494  .driver = {
495  .name = "matrix-keypad",
496  .owner = THIS_MODULE,
497  .pm = &matrix_keypad_pm_ops,
498  },
499 };
500 module_platform_driver(matrix_keypad_driver);
501 
502 MODULE_AUTHOR("Marek Vasut <[email protected]>");
503 MODULE_DESCRIPTION("GPIO Driven Matrix Keypad Driver");
504 MODULE_LICENSE("GPL v2");
505 MODULE_ALIAS("platform:matrix-keypad");