[ARM] tegra: ventana: fix gpio key for menu options
[linux-2.6.git] / arch / arm / mach-tegra / board-ventana.c
1 /*
2  * arch/arm/mach-tegra/board-ventana.c
3  *
4  * Copyright (c) 2010, NVIDIA Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/slab.h>
24 #include <linux/ctype.h>
25 #include <linux/platform_device.h>
26 #include <linux/clk.h>
27 #include <linux/serial_8250.h>
28 #include <linux/i2c.h>
29 #include <linux/i2c/panjit_ts.h>
30 #include <linux/dma-mapping.h>
31 #include <linux/delay.h>
32 #include <linux/i2c-tegra.h>
33 #include <linux/gpio.h>
34 #include <linux/gpio_keys.h>
35 #include <linux/input.h>
36
37 #include <mach/clk.h>
38 #include <mach/iomap.h>
39 #include <mach/irqs.h>
40 #include <mach/pinmux.h>
41 #include <mach/iomap.h>
42 #include <mach/io.h>
43
44 #include <asm/mach-types.h>
45 #include <asm/mach/arch.h>
46
47 #include "board.h"
48 #include "clock.h"
49 #include "board-ventana.h"
50 #include "devices.h"
51 #include "gpio-names.h"
52
53 static struct plat_serial8250_port debug_uart_platform_data[] = {
54         {
55                 .membase        = IO_ADDRESS(TEGRA_UARTD_BASE),
56                 .mapbase        = TEGRA_UARTD_BASE,
57                 .irq            = INT_UARTD,
58                 .flags          = UPF_BOOT_AUTOCONF,
59                 .iotype         = UPIO_MEM,
60                 .regshift       = 2,
61                 .uartclk        = 216000000,
62         }, {
63                 .flags          = 0,
64         }
65 };
66
67 static struct platform_device debug_uart = {
68         .name = "serial8250",
69         .id = PLAT8250_DEV_PLATFORM,
70         .dev = {
71                 .platform_data = debug_uart_platform_data,
72         },
73 };
74
75 static __initdata struct tegra_clk_init_table ventana_clk_init_table[] = {
76         /* name         parent          rate            enabled */
77         { "uartd",      "pll_p",        216000000,      true},
78         { "pll_m",      "clk_m",        600000000,      true},
79         { "pwm",        "clk_32k",      32768,          false},
80         { NULL,         NULL,           0,              0},
81 };
82
83 static struct tegra_i2c_platform_data ventana_i2c1_platform_data = {
84         .adapter_nr     = 0,
85         .bus_count      = 1,
86         .bus_clk_rate   = { 400000, 0 },
87 };
88
89 static const struct tegra_pingroup_config i2c2_ddc = {
90         .pingroup       = TEGRA_PINGROUP_DDC,
91         .func           = TEGRA_MUX_I2C2,
92 };
93
94 static const struct tegra_pingroup_config i2c2_gen2 = {
95         .pingroup       = TEGRA_PINGROUP_PTA,
96         .func           = TEGRA_MUX_I2C2,
97 };
98
99 static struct tegra_i2c_platform_data ventana_i2c2_platform_data = {
100         .adapter_nr     = 1,
101         .bus_count      = 2,
102         .bus_clk_rate   = { 400000, 100000 },
103         .bus_mux        = { &i2c2_ddc, &i2c2_gen2 },
104         .bus_mux_len    = { 1, 1 },
105 };
106
107 static struct tegra_i2c_platform_data ventana_i2c3_platform_data = {
108         .adapter_nr     = 3,
109         .bus_count      = 1,
110         .bus_clk_rate   = { 400000, 0 },
111 };
112
113 static struct tegra_i2c_platform_data ventana_dvc_platform_data = {
114         .adapter_nr     = 4,
115         .bus_count      = 1,
116         .bus_clk_rate   = { 400000, 0 },
117         .is_dvc         = true,
118 };
119
120 static void ventana_i2c_init(void)
121 {
122         tegra_i2c_device1.dev.platform_data = &ventana_i2c1_platform_data;
123         tegra_i2c_device2.dev.platform_data = &ventana_i2c2_platform_data;
124         tegra_i2c_device3.dev.platform_data = &ventana_i2c3_platform_data;
125         tegra_i2c_device4.dev.platform_data = &ventana_dvc_platform_data;
126
127         platform_device_register(&tegra_i2c_device4);
128         platform_device_register(&tegra_i2c_device3);
129         platform_device_register(&tegra_i2c_device2);
130         platform_device_register(&tegra_i2c_device1);
131 }
132
133 #define GPIO_KEY(_id, _gpio, _iswake)           \
134         {                                       \
135                 .code = _id,                    \
136                 .gpio = TEGRA_GPIO_##_gpio,     \
137                 .active_low = 1,                \
138                 .desc = #_id,                   \
139                 .type = EV_KEY,                 \
140                 .wakeup = _iswake,              \
141                 .debounce_interval = 10,        \
142         }
143
144 static struct gpio_keys_button ventana_keys[] = {
145         [0] = GPIO_KEY(KEY_MENU, PQ3, 0),
146         [1] = GPIO_KEY(KEY_HOME, PQ1, 0),
147         [2] = GPIO_KEY(KEY_BACK, PQ2, 0),
148         [3] = GPIO_KEY(KEY_VOLUMEUP, PQ5, 0),
149         [4] = GPIO_KEY(KEY_VOLUMEDOWN, PQ4, 0),
150         [5] = GPIO_KEY(KEY_POWER, PV2, 1),
151 };
152
153 static struct gpio_keys_platform_data ventana_keys_platform_data = {
154         .buttons        = ventana_keys,
155         .nbuttons       = ARRAY_SIZE(ventana_keys),
156 };
157
158 static struct platform_device ventana_keys_device = {
159         .name   = "gpio-keys",
160         .id     = 0,
161         .dev    = {
162                 .platform_data  = &ventana_keys_platform_data,
163         },
164 };
165
166 static struct platform_device *ventana_devices[] __initdata = {
167         &tegra_otg_device,
168         &debug_uart,
169         &pmu_device,
170         &tegra_udc_device,
171         &tegra_gart_device,
172         &ventana_keys_device,
173 };
174
175 static void ventana_keys_init(void)
176 {
177         int i;
178
179         for (i = 0; i < ARRAY_SIZE(ventana_keys); i++)
180                 tegra_gpio_enable(ventana_keys[i].gpio);
181 }
182
183 static struct panjit_i2c_ts_platform_data panjit_data = {
184         .gpio_reset = TEGRA_GPIO_PQ7,
185 };
186
187 static const struct i2c_board_info ventana_i2c_bus1_touch_info[] = {
188         {
189                 I2C_BOARD_INFO("panjit_touch", 0x3),
190                 .irq            = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV6),
191                 .platform_data  = &panjit_data,
192         },
193 };
194
195 static int __init ventana_touch_init(void)
196 {
197         tegra_gpio_enable(TEGRA_GPIO_PV6);
198
199         tegra_gpio_enable(TEGRA_GPIO_PQ7);
200         i2c_register_board_info(0, ventana_i2c_bus1_touch_info, 1);
201
202         return 0;
203 }
204
205 static void __init tegra_ventana_init(void)
206 {
207         tegra_common_init();
208
209         tegra_clk_init_from_table(ventana_clk_init_table);
210         ventana_pinmux_init();
211
212         platform_add_devices(ventana_devices, ARRAY_SIZE(ventana_devices));
213         ventana_sdhci_init();
214         ventana_i2c_init();
215         ventana_regulator_init();
216         ventana_touch_init();
217         ventana_keys_init();
218         ventana_panel_init();
219 }
220
221 MACHINE_START(VENTANA, "ventana")
222         .boot_params    = 0x00000100,
223         .phys_io        = IO_APB_PHYS,
224         .io_pg_offst    = ((IO_APB_VIRT) >> 18) & 0xfffc,
225         .init_irq       = tegra_init_irq,
226         .init_machine   = tegra_ventana_init,
227         .map_io         = tegra_map_common_io,
228         .timer          = &tegra_timer,
229 MACHINE_END