keypad-surf-ffa.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /*
  2. * Copyright (C) 2007 Google, Inc.
  3. * Copyright (c) 2008-2009, The Linux Foundation. All rights reserved.
  4. * Author: Brian Swetland <swetland@google.com>
  5. *
  6. * This software is licensed under the terms of the GNU General Public
  7. * License version 2, as published by the Free Software Foundation, and
  8. * may be copied, distributed, and modified under those terms.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. */
  16. #include <linux/platform_device.h>
  17. #include <linux/gpio_event.h>
  18. #include <asm/mach-types.h>
  19. /* don't turn this on without updating the ffa support */
  20. #define SCAN_FUNCTION_KEYS 0
  21. /* FFA:
  22. 36: KEYSENSE_N(0)
  23. 37: KEYSENSE_N(1)
  24. 38: KEYSENSE_N(2)
  25. 39: KEYSENSE_N(3)
  26. 40: KEYSENSE_N(4)
  27. 31: KYPD_17
  28. 32: KYPD_15
  29. 33: KYPD_13
  30. 34: KYPD_11
  31. 35: KYPD_9
  32. 41: KYPD_MEMO
  33. */
  34. static unsigned int keypad_row_gpios[] = {
  35. 31, 32, 33, 34, 35, 41
  36. #if SCAN_FUNCTION_KEYS
  37. , 42
  38. #endif
  39. };
  40. static unsigned int keypad_col_gpios[] = { 36, 37, 38, 39, 40 };
  41. static unsigned int keypad_row_gpios_8k_ffa[] = {31, 32, 33, 34, 35, 36};
  42. static unsigned int keypad_col_gpios_8k_ffa[] = {38, 39, 40, 41, 42};
  43. #define KEYMAP_INDEX(row, col) ((row)*ARRAY_SIZE(keypad_col_gpios) + (col))
  44. #define FFA_8K_KEYMAP_INDEX(row, col) ((row)* \
  45. ARRAY_SIZE(keypad_col_gpios_8k_ffa) + (col))
  46. static const unsigned short keypad_keymap_surf[ARRAY_SIZE(keypad_col_gpios) *
  47. ARRAY_SIZE(keypad_row_gpios)] = {
  48. [KEYMAP_INDEX(0, 0)] = KEY_5,
  49. [KEYMAP_INDEX(0, 1)] = KEY_9,
  50. [KEYMAP_INDEX(0, 2)] = 229, /* SOFT1 */
  51. [KEYMAP_INDEX(0, 3)] = KEY_6,
  52. [KEYMAP_INDEX(0, 4)] = KEY_LEFT,
  53. [KEYMAP_INDEX(1, 0)] = KEY_0,
  54. [KEYMAP_INDEX(1, 1)] = KEY_RIGHT,
  55. [KEYMAP_INDEX(1, 2)] = KEY_1,
  56. [KEYMAP_INDEX(1, 3)] = 228, /* KEY_SHARP */
  57. [KEYMAP_INDEX(1, 4)] = KEY_SEND,
  58. [KEYMAP_INDEX(2, 0)] = KEY_VOLUMEUP,
  59. [KEYMAP_INDEX(2, 1)] = KEY_HOME, /* FA */
  60. [KEYMAP_INDEX(2, 2)] = KEY_F8, /* QCHT */
  61. [KEYMAP_INDEX(2, 3)] = KEY_F6, /* R+ */
  62. [KEYMAP_INDEX(2, 4)] = KEY_F7, /* R- */
  63. [KEYMAP_INDEX(3, 0)] = KEY_UP,
  64. [KEYMAP_INDEX(3, 1)] = KEY_CLEAR,
  65. [KEYMAP_INDEX(3, 2)] = KEY_4,
  66. [KEYMAP_INDEX(3, 3)] = KEY_MUTE, /* SPKR */
  67. [KEYMAP_INDEX(3, 4)] = KEY_2,
  68. [KEYMAP_INDEX(4, 0)] = 230, /* SOFT2 */
  69. [KEYMAP_INDEX(4, 1)] = 232, /* KEY_CENTER */
  70. [KEYMAP_INDEX(4, 2)] = KEY_DOWN,
  71. [KEYMAP_INDEX(4, 3)] = KEY_BACK, /* FB */
  72. [KEYMAP_INDEX(4, 4)] = KEY_8,
  73. [KEYMAP_INDEX(5, 0)] = KEY_VOLUMEDOWN,
  74. [KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */
  75. [KEYMAP_INDEX(5, 2)] = KEY_MAIL, /* MESG */
  76. [KEYMAP_INDEX(5, 3)] = KEY_3,
  77. [KEYMAP_INDEX(5, 4)] = KEY_7,
  78. #if SCAN_FUNCTION_KEYS
  79. [KEYMAP_INDEX(6, 0)] = KEY_F5,
  80. [KEYMAP_INDEX(6, 1)] = KEY_F4,
  81. [KEYMAP_INDEX(6, 2)] = KEY_F3,
  82. [KEYMAP_INDEX(6, 3)] = KEY_F2,
  83. [KEYMAP_INDEX(6, 4)] = KEY_F1
  84. #endif
  85. };
  86. static const unsigned short keypad_keymap_ffa[ARRAY_SIZE(keypad_col_gpios) *
  87. ARRAY_SIZE(keypad_row_gpios)] = {
  88. /*[KEYMAP_INDEX(0, 0)] = ,*/
  89. /*[KEYMAP_INDEX(0, 1)] = ,*/
  90. [KEYMAP_INDEX(0, 2)] = KEY_1,
  91. [KEYMAP_INDEX(0, 3)] = KEY_SEND,
  92. [KEYMAP_INDEX(0, 4)] = KEY_LEFT,
  93. [KEYMAP_INDEX(1, 0)] = KEY_3,
  94. [KEYMAP_INDEX(1, 1)] = KEY_RIGHT,
  95. [KEYMAP_INDEX(1, 2)] = KEY_VOLUMEUP,
  96. /*[KEYMAP_INDEX(1, 3)] = ,*/
  97. [KEYMAP_INDEX(1, 4)] = KEY_6,
  98. [KEYMAP_INDEX(2, 0)] = KEY_HOME, /* A */
  99. [KEYMAP_INDEX(2, 1)] = KEY_BACK, /* B */
  100. [KEYMAP_INDEX(2, 2)] = KEY_0,
  101. [KEYMAP_INDEX(2, 3)] = 228, /* KEY_SHARP */
  102. [KEYMAP_INDEX(2, 4)] = KEY_9,
  103. [KEYMAP_INDEX(3, 0)] = KEY_UP,
  104. [KEYMAP_INDEX(3, 1)] = 232, /* KEY_CENTER */ /* i */
  105. [KEYMAP_INDEX(3, 2)] = KEY_4,
  106. /*[KEYMAP_INDEX(3, 3)] = ,*/
  107. [KEYMAP_INDEX(3, 4)] = KEY_2,
  108. [KEYMAP_INDEX(4, 0)] = KEY_VOLUMEDOWN,
  109. [KEYMAP_INDEX(4, 1)] = KEY_SOUND,
  110. [KEYMAP_INDEX(4, 2)] = KEY_DOWN,
  111. [KEYMAP_INDEX(4, 3)] = KEY_8,
  112. [KEYMAP_INDEX(4, 4)] = KEY_5,
  113. /*[KEYMAP_INDEX(5, 0)] = ,*/
  114. [KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */
  115. [KEYMAP_INDEX(5, 2)] = 230, /*SOFT2*/ /* 2 */
  116. [KEYMAP_INDEX(5, 3)] = KEY_MENU, /* 1 */
  117. [KEYMAP_INDEX(5, 4)] = KEY_7,
  118. };
  119. #define QSD8x50_FFA_KEYMAP_SIZE (ARRAY_SIZE(keypad_col_gpios_8k_ffa) * \
  120. ARRAY_SIZE(keypad_row_gpios_8k_ffa))
  121. static const unsigned short keypad_keymap_8k_ffa[QSD8x50_FFA_KEYMAP_SIZE] = {
  122. [FFA_8K_KEYMAP_INDEX(0, 0)] = KEY_VOLUMEDOWN,
  123. /*[KEYMAP_INDEX(0, 1)] = ,*/
  124. [FFA_8K_KEYMAP_INDEX(0, 2)] = KEY_DOWN,
  125. [FFA_8K_KEYMAP_INDEX(0, 3)] = KEY_8,
  126. [FFA_8K_KEYMAP_INDEX(0, 4)] = KEY_5,
  127. [FFA_8K_KEYMAP_INDEX(1, 0)] = KEY_UP,
  128. [FFA_8K_KEYMAP_INDEX(1, 1)] = KEY_CLEAR,
  129. [FFA_8K_KEYMAP_INDEX(1, 2)] = KEY_4,
  130. /*[KEYMAP_INDEX(1, 3)] = ,*/
  131. [FFA_8K_KEYMAP_INDEX(1, 4)] = KEY_2,
  132. [FFA_8K_KEYMAP_INDEX(2, 0)] = KEY_HOME, /* A */
  133. [FFA_8K_KEYMAP_INDEX(2, 1)] = KEY_BACK, /* B */
  134. [FFA_8K_KEYMAP_INDEX(2, 2)] = KEY_0,
  135. [FFA_8K_KEYMAP_INDEX(2, 3)] = 228, /* KEY_SHARP */
  136. [FFA_8K_KEYMAP_INDEX(2, 4)] = KEY_9,
  137. [FFA_8K_KEYMAP_INDEX(3, 0)] = KEY_3,
  138. [FFA_8K_KEYMAP_INDEX(3, 1)] = KEY_RIGHT,
  139. [FFA_8K_KEYMAP_INDEX(3, 2)] = KEY_VOLUMEUP,
  140. /*[KEYMAP_INDEX(3, 3)] = ,*/
  141. [FFA_8K_KEYMAP_INDEX(3, 4)] = KEY_6,
  142. [FFA_8K_KEYMAP_INDEX(4, 0)] = 232, /* OK */
  143. [FFA_8K_KEYMAP_INDEX(4, 1)] = KEY_SOUND,
  144. [FFA_8K_KEYMAP_INDEX(4, 2)] = KEY_1,
  145. [FFA_8K_KEYMAP_INDEX(4, 3)] = KEY_SEND,
  146. [FFA_8K_KEYMAP_INDEX(4, 4)] = KEY_LEFT,
  147. /*[KEYMAP_INDEX(5, 0)] = ,*/
  148. [FFA_8K_KEYMAP_INDEX(5, 1)] = 227, /* KEY_STAR */
  149. [FFA_8K_KEYMAP_INDEX(5, 2)] = 230, /*SOFT2*/ /* 2 */
  150. [FFA_8K_KEYMAP_INDEX(5, 3)] = 229, /* 1 */
  151. [FFA_8K_KEYMAP_INDEX(5, 4)] = KEY_7,
  152. };
  153. /* SURF keypad platform device information */
  154. static struct gpio_event_matrix_info surf_keypad_matrix_info = {
  155. .info.func = gpio_event_matrix_func,
  156. .keymap = keypad_keymap_surf,
  157. .output_gpios = keypad_row_gpios,
  158. .input_gpios = keypad_col_gpios,
  159. .noutputs = ARRAY_SIZE(keypad_row_gpios),
  160. .ninputs = ARRAY_SIZE(keypad_col_gpios),
  161. .settle_time.tv64 = 40 * NSEC_PER_USEC,
  162. .poll_time.tv64 = 20 * NSEC_PER_MSEC,
  163. .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE |
  164. GPIOKPF_PRINT_UNMAPPED_KEYS
  165. };
  166. static struct gpio_event_info *surf_keypad_info[] = {
  167. &surf_keypad_matrix_info.info
  168. };
  169. static struct gpio_event_platform_data surf_keypad_data = {
  170. .name = "surf_keypad",
  171. .info = surf_keypad_info,
  172. .info_count = ARRAY_SIZE(surf_keypad_info)
  173. };
  174. struct platform_device keypad_device_surf = {
  175. .name = GPIO_EVENT_DEV_NAME,
  176. .id = -1,
  177. .dev = {
  178. .platform_data = &surf_keypad_data,
  179. },
  180. };
  181. /* 8k FFA keypad platform device information */
  182. static struct gpio_event_matrix_info keypad_matrix_info_8k_ffa = {
  183. .info.func = gpio_event_matrix_func,
  184. .keymap = keypad_keymap_8k_ffa,
  185. .output_gpios = keypad_row_gpios_8k_ffa,
  186. .input_gpios = keypad_col_gpios_8k_ffa,
  187. .noutputs = ARRAY_SIZE(keypad_row_gpios_8k_ffa),
  188. .ninputs = ARRAY_SIZE(keypad_col_gpios_8k_ffa),
  189. .settle_time.tv64 = 40 * NSEC_PER_USEC,
  190. .poll_time.tv64 = 20 * NSEC_PER_MSEC,
  191. .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE |
  192. GPIOKPF_PRINT_UNMAPPED_KEYS
  193. };
  194. static struct gpio_event_info *keypad_info_8k_ffa[] = {
  195. &keypad_matrix_info_8k_ffa.info
  196. };
  197. static struct gpio_event_platform_data keypad_data_8k_ffa = {
  198. .name = "8k_ffa_keypad",
  199. .info = keypad_info_8k_ffa,
  200. .info_count = ARRAY_SIZE(keypad_info_8k_ffa)
  201. };
  202. struct platform_device keypad_device_8k_ffa = {
  203. .name = GPIO_EVENT_DEV_NAME,
  204. .id = -1,
  205. .dev = {
  206. .platform_data = &keypad_data_8k_ffa,
  207. },
  208. };
  209. /* 7k FFA keypad platform device information */
  210. static struct gpio_event_matrix_info keypad_matrix_info_7k_ffa = {
  211. .info.func = gpio_event_matrix_func,
  212. .keymap = keypad_keymap_ffa,
  213. .output_gpios = keypad_row_gpios,
  214. .input_gpios = keypad_col_gpios,
  215. .noutputs = ARRAY_SIZE(keypad_row_gpios),
  216. .ninputs = ARRAY_SIZE(keypad_col_gpios),
  217. .settle_time.tv64 = 40 * NSEC_PER_USEC,
  218. .poll_time.tv64 = 20 * NSEC_PER_MSEC,
  219. .flags = GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_DRIVE_INACTIVE |
  220. GPIOKPF_PRINT_UNMAPPED_KEYS
  221. };
  222. static struct gpio_event_info *keypad_info_7k_ffa[] = {
  223. &keypad_matrix_info_7k_ffa.info
  224. };
  225. static struct gpio_event_platform_data keypad_data_7k_ffa = {
  226. .name = "7k_ffa_keypad",
  227. .info = keypad_info_7k_ffa,
  228. .info_count = ARRAY_SIZE(keypad_info_7k_ffa)
  229. };
  230. struct platform_device keypad_device_7k_ffa = {
  231. .name = GPIO_EVENT_DEV_NAME,
  232. .id = -1,
  233. .dev = {
  234. .platform_data = &keypad_data_7k_ffa,
  235. },
  236. };