board-mop500-keypads.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. /*
  112. * STMPE1601
  113. */
  114. static struct stmpe_keypad_platform_data stmpe1601_keypad_data = {
  115. .debounce_ms = 64,
  116. .scan_count = 8,
  117. .no_autorepeat = true,
  118. .keymap_data = &mop500_keymap_data,
  119. };
  120. static struct stmpe_platform_data stmpe1601_data = {
  121. .id = 1,
  122. .blocks = STMPE_BLOCK_KEYPAD,
  123. .irq_trigger = IRQF_TRIGGER_FALLING,
  124. .irq_base = MOP500_STMPE1601_IRQ(0),
  125. .keypad = &stmpe1601_keypad_data,
  126. .autosleep = true,
  127. .autosleep_timeout = 1024,
  128. };
  129. static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
  130. {
  131. I2C_BOARD_INFO("stmpe1601", 0x40),
  132. .irq = NOMADIK_GPIO_TO_IRQ(218),
  133. .platform_data = &stmpe1601_data,
  134. .flags = I2C_CLIENT_WAKE,
  135. },
  136. };
  137. void mop500_keypad_init(void)
  138. {
  139. db8500_add_ske_keypad(&ske_keypad_board);
  140. i2c_register_board_info(0, mop500_i2c0_devices_stuib,
  141. ARRAY_SIZE(mop500_i2c0_devices_stuib));
  142. }