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