blob: b634615b1381642b163735466bff466a71e53cd5 [file] [log] [blame]
Sundar Iyere43abe62010-12-03 20:35:36 +05301/*
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 */
26static 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
49static 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
77static 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 */
85static 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 */
107static 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
122static 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
131void mop500_keypad_init(void)
132{
133 db8500_add_ske_keypad(&ske_keypad_board);
134}