board-mop500-keypads.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright (C) ST-Ericsson SA 2010
  3. *
  4. * License Terms: GNU General Public License v2
  5. *
  6. * Keypad layouts for various boards
  7. */
  8. #include <linux/i2c.h>
  9. #include <linux/gpio.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/mfd/stmpe.h>
  13. #include <linux/input/matrix_keypad.h>
  14. #include <plat/pincfg.h>
  15. #include <plat/ske.h>
  16. #include <mach/devices.h>
  17. #include <mach/hardware.h>
  18. #include "devices-db8500.h"
  19. #include "board-mop500.h"
  20. /* STMPE/SKE keypad use this key layout */
  21. static const unsigned int mop500_keymap[] = {
  22. KEY(2, 5, KEY_END),
  23. KEY(4, 1, KEY_POWER),
  24. KEY(3, 5, KEY_VOLUMEDOWN),
  25. KEY(1, 3, KEY_3),
  26. KEY(5, 2, KEY_RIGHT),
  27. KEY(5, 0, KEY_9),
  28. KEY(0, 5, KEY_MENU),
  29. KEY(7, 6, KEY_ENTER),
  30. KEY(4, 5, KEY_0),
  31. KEY(6, 7, KEY_2),
  32. KEY(3, 4, KEY_UP),
  33. KEY(3, 3, KEY_DOWN),
  34. KEY(6, 4, KEY_SEND),
  35. KEY(6, 2, KEY_BACK),
  36. KEY(4, 2, KEY_VOLUMEUP),
  37. KEY(5, 5, KEY_1),
  38. KEY(4, 3, KEY_LEFT),
  39. KEY(3, 2, KEY_7),
  40. };
  41. static const struct matrix_keymap_data mop500_keymap_data = {
  42. .keymap = mop500_keymap,
  43. .keymap_size = ARRAY_SIZE(mop500_keymap),
  44. };
  45. /*
  46. * Nomadik SKE keypad
  47. */
  48. #define ROW_PIN_I0 164
  49. #define ROW_PIN_I1 163
  50. #define ROW_PIN_I2 162
  51. #define ROW_PIN_I3 161
  52. #define ROW_PIN_I4 156
  53. #define ROW_PIN_I5 155
  54. #define ROW_PIN_I6 154
  55. #define ROW_PIN_I7 153
  56. #define COL_PIN_O0 168
  57. #define COL_PIN_O1 167
  58. #define COL_PIN_O2 166
  59. #define COL_PIN_O3 165
  60. #define COL_PIN_O4 160
  61. #define COL_PIN_O5 159
  62. #define COL_PIN_O6 158
  63. #define COL_PIN_O7 157
  64. #define SKE_KPD_MAX_ROWS 8
  65. #define SKE_KPD_MAX_COLS 8
  66. static int ske_kp_rows[] = {
  67. ROW_PIN_I0, ROW_PIN_I1, ROW_PIN_I2, ROW_PIN_I3,
  68. ROW_PIN_I4, ROW_PIN_I5, ROW_PIN_I6, ROW_PIN_I7,
  69. };
  70. /*
  71. * ske_set_gpio_row: request and set gpio rows
  72. */
  73. static int ske_set_gpio_row(int gpio)
  74. {
  75. int ret;
  76. ret = gpio_request(gpio, "ske-kp");
  77. if (ret < 0) {
  78. pr_err("ske_set_gpio_row: gpio request failed\n");
  79. return ret;
  80. }
  81. ret = gpio_direction_output(gpio, 1);
  82. if (ret < 0) {
  83. pr_err("ske_set_gpio_row: gpio direction failed\n");
  84. gpio_free(gpio);
  85. }
  86. return ret;
  87. }
  88. /*
  89. * ske_kp_init - enable the gpio configuration
  90. */
  91. static int ske_kp_init(void)
  92. {
  93. int ret, i;
  94. for (i = 0; i < SKE_KPD_MAX_ROWS; i++) {
  95. ret = ske_set_gpio_row(ske_kp_rows[i]);
  96. if (ret < 0) {
  97. pr_err("ske_kp_init: failed init\n");
  98. return ret;
  99. }
  100. }
  101. return 0;
  102. }
  103. static struct ske_keypad_platform_data ske_keypad_board = {
  104. .init = ske_kp_init,
  105. .keymap_data = &mop500_keymap_data,
  106. .no_autorepeat = true,
  107. .krow = SKE_KPD_MAX_ROWS, /* 8x8 matrix */
  108. .kcol = SKE_KPD_MAX_COLS,
  109. .debounce_ms = 40, /* in millisecs */
  110. };
  111. void mop500_keypad_init(void)
  112. {
  113. db8500_add_ske_keypad(&ske_keypad_board);
  114. }