blob: 8dbba03eb6c17d6f5a8effefc3da88ee3f201530 [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
Sundar Iyer556fb032010-12-03 20:35:38 +0530131/*
132 * STMPE1601
133 */
134static struct stmpe_keypad_platform_data stmpe1601_keypad_data = {
135 .debounce_ms = 64,
136 .scan_count = 8,
137 .no_autorepeat = true,
138 .keymap_data = &mop500_keymap_data,
139};
140
141static struct stmpe_platform_data stmpe1601_data = {
142 .id = 1,
143 .blocks = STMPE_BLOCK_KEYPAD,
144 .irq_trigger = IRQF_TRIGGER_FALLING,
145 .irq_base = MOP500_STMPE1601_IRQ(0),
146 .keypad = &stmpe1601_keypad_data,
147 .autosleep = true,
148 .autosleep_timeout = 1024,
149};
150
151static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
152 {
153 I2C_BOARD_INFO("stmpe1601", 0x40),
154 .irq = NOMADIK_GPIO_TO_IRQ(218),
155 .platform_data = &stmpe1601_data,
156 .flags = I2C_CLIENT_WAKE,
157 },
158};
159
Sundar Iyere43abe62010-12-03 20:35:36 +0530160void mop500_keypad_init(void)
161{
162 db8500_add_ske_keypad(&ske_keypad_board);
Sundar Iyer556fb032010-12-03 20:35:38 +0530163
164 i2c_register_board_info(0, mop500_i2c0_devices_stuib,
165 ARRAY_SIZE(mop500_i2c0_devices_stuib));
Sundar Iyere43abe62010-12-03 20:35:36 +0530166}