board-mop500-keypads.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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/mfd/tc3589x.h>
  14. #include <linux/input/matrix_keypad.h>
  15. #include <plat/pincfg.h>
  16. #include <plat/ske.h>
  17. #include <mach/devices.h>
  18. #include <mach/hardware.h>
  19. #include "devices-db8500.h"
  20. #include "board-mop500.h"
  21. /* STMPE/SKE keypad use this key layout */
  22. static const unsigned int mop500_keymap[] = {
  23. KEY(2, 5, KEY_END),
  24. KEY(4, 1, KEY_POWER),
  25. KEY(3, 5, KEY_VOLUMEDOWN),
  26. KEY(1, 3, KEY_3),
  27. KEY(5, 2, KEY_RIGHT),
  28. KEY(5, 0, KEY_9),
  29. KEY(0, 5, KEY_MENU),
  30. KEY(7, 6, KEY_ENTER),
  31. KEY(4, 5, KEY_0),
  32. KEY(6, 7, KEY_2),
  33. KEY(3, 4, KEY_UP),
  34. KEY(3, 3, KEY_DOWN),
  35. KEY(6, 4, KEY_SEND),
  36. KEY(6, 2, KEY_BACK),
  37. KEY(4, 2, KEY_VOLUMEUP),
  38. KEY(5, 5, KEY_1),
  39. KEY(4, 3, KEY_LEFT),
  40. KEY(3, 2, KEY_7),
  41. };
  42. static const struct matrix_keymap_data mop500_keymap_data = {
  43. .keymap = mop500_keymap,
  44. .keymap_size = ARRAY_SIZE(mop500_keymap),
  45. };
  46. /*
  47. * Nomadik SKE keypad
  48. */
  49. #define ROW_PIN_I0 164
  50. #define ROW_PIN_I1 163
  51. #define ROW_PIN_I2 162
  52. #define ROW_PIN_I3 161
  53. #define ROW_PIN_I4 156
  54. #define ROW_PIN_I5 155
  55. #define ROW_PIN_I6 154
  56. #define ROW_PIN_I7 153
  57. #define COL_PIN_O0 168
  58. #define COL_PIN_O1 167
  59. #define COL_PIN_O2 166
  60. #define COL_PIN_O3 165
  61. #define COL_PIN_O4 160
  62. #define COL_PIN_O5 159
  63. #define COL_PIN_O6 158
  64. #define COL_PIN_O7 157
  65. #define SKE_KPD_MAX_ROWS 8
  66. #define SKE_KPD_MAX_COLS 8
  67. static int ske_kp_rows[] = {
  68. ROW_PIN_I0, ROW_PIN_I1, ROW_PIN_I2, ROW_PIN_I3,
  69. ROW_PIN_I4, ROW_PIN_I5, ROW_PIN_I6, ROW_PIN_I7,
  70. };
  71. /*
  72. * ske_set_gpio_row: request and set gpio rows
  73. */
  74. static int ske_set_gpio_row(int gpio)
  75. {
  76. int ret;
  77. ret = gpio_request(gpio, "ske-kp");
  78. if (ret < 0) {
  79. pr_err("ske_set_gpio_row: gpio request failed\n");
  80. return ret;
  81. }
  82. ret = gpio_direction_output(gpio, 1);
  83. if (ret < 0) {
  84. pr_err("ske_set_gpio_row: gpio direction failed\n");
  85. gpio_free(gpio);
  86. }
  87. return ret;
  88. }
  89. /*
  90. * ske_kp_init - enable the gpio configuration
  91. */
  92. static int ske_kp_init(void)
  93. {
  94. int ret, i;
  95. for (i = 0; i < SKE_KPD_MAX_ROWS; i++) {
  96. ret = ske_set_gpio_row(ske_kp_rows[i]);
  97. if (ret < 0) {
  98. pr_err("ske_kp_init: failed init\n");
  99. return ret;
  100. }
  101. }
  102. return 0;
  103. }
  104. static struct ske_keypad_platform_data ske_keypad_board = {
  105. .init = ske_kp_init,
  106. .keymap_data = &mop500_keymap_data,
  107. .no_autorepeat = true,
  108. .krow = SKE_KPD_MAX_ROWS, /* 8x8 matrix */
  109. .kcol = SKE_KPD_MAX_COLS,
  110. .debounce_ms = 40, /* in millisecs */
  111. };
  112. /*
  113. * STMPE1601
  114. */
  115. static struct stmpe_keypad_platform_data stmpe1601_keypad_data = {
  116. .debounce_ms = 64,
  117. .scan_count = 8,
  118. .no_autorepeat = true,
  119. .keymap_data = &mop500_keymap_data,
  120. };
  121. static struct stmpe_platform_data stmpe1601_data = {
  122. .id = 1,
  123. .blocks = STMPE_BLOCK_KEYPAD,
  124. .irq_trigger = IRQF_TRIGGER_FALLING,
  125. .irq_base = MOP500_STMPE1601_IRQ(0),
  126. .keypad = &stmpe1601_keypad_data,
  127. .autosleep = true,
  128. .autosleep_timeout = 1024,
  129. };
  130. static struct i2c_board_info mop500_i2c0_devices_stuib[] = {
  131. {
  132. I2C_BOARD_INFO("stmpe1601", 0x40),
  133. .irq = NOMADIK_GPIO_TO_IRQ(218),
  134. .platform_data = &stmpe1601_data,
  135. .flags = I2C_CLIENT_WAKE,
  136. },
  137. };
  138. /*
  139. * TC35893
  140. */
  141. static const unsigned int uib_keymap[] = {
  142. KEY(3, 1, KEY_END),
  143. KEY(4, 1, KEY_POWER),
  144. KEY(6, 4, KEY_VOLUMEDOWN),
  145. KEY(4, 2, KEY_EMAIL),
  146. KEY(3, 3, KEY_RIGHT),
  147. KEY(2, 5, KEY_BACKSPACE),
  148. KEY(6, 7, KEY_MENU),
  149. KEY(5, 0, KEY_ENTER),
  150. KEY(4, 3, KEY_0),
  151. KEY(3, 4, KEY_DOT),
  152. KEY(5, 2, KEY_UP),
  153. KEY(3, 5, KEY_DOWN),
  154. KEY(4, 5, KEY_SEND),
  155. KEY(0, 5, KEY_BACK),
  156. KEY(6, 2, KEY_VOLUMEUP),
  157. KEY(1, 3, KEY_SPACE),
  158. KEY(7, 6, KEY_LEFT),
  159. KEY(5, 5, KEY_SEARCH),
  160. };
  161. static struct matrix_keymap_data uib_keymap_data = {
  162. .keymap = uib_keymap,
  163. .keymap_size = ARRAY_SIZE(uib_keymap),
  164. };
  165. static struct tc3589x_keypad_platform_data tc35893_data = {
  166. .krow = TC_KPD_ROWS,
  167. .kcol = TC_KPD_COLUMNS,
  168. .debounce_period = TC_KPD_DEBOUNCE_PERIOD,
  169. .settle_time = TC_KPD_SETTLE_TIME,
  170. .irqtype = IRQF_TRIGGER_FALLING,
  171. .enable_wakeup = true,
  172. .keymap_data = &uib_keymap_data,
  173. .no_autorepeat = true,
  174. };
  175. static struct tc3589x_platform_data tc3589x_keypad_data = {
  176. .block = TC3589x_BLOCK_KEYPAD,
  177. .keypad = &tc35893_data,
  178. .irq_base = MOP500_EGPIO_IRQ_BASE,
  179. };
  180. static struct i2c_board_info mop500_i2c0_devices_uib[] = {
  181. {
  182. I2C_BOARD_INFO("tc3589x", 0x44),
  183. .platform_data = &tc3589x_keypad_data,
  184. .irq = NOMADIK_GPIO_TO_IRQ(218),
  185. .flags = I2C_CLIENT_WAKE,
  186. },
  187. };
  188. void mop500_keypad_init(void)
  189. {
  190. db8500_add_ske_keypad(&ske_keypad_board);
  191. i2c_register_board_info(0, mop500_i2c0_devices_stuib,
  192. ARRAY_SIZE(mop500_i2c0_devices_stuib));
  193. i2c_register_board_info(0, mop500_i2c0_devices_uib,
  194. ARRAY_SIZE(mop500_i2c0_devices_uib));
  195. }