blob: 0d4e854ee3350766751634402ea949aa78575b12 [file] [log] [blame]
Stepan Moskovchenko5ea3c312012-01-31 18:19:40 -08001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Stepan Moskovchenko2327a952011-12-14 16:31:28 -08002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/init.h>
15#include <linux/ioport.h>
16#include <linux/platform_device.h>
17#include <linux/bootmem.h>
18#include <asm/mach-types.h>
19#include <asm/mach/mmc.h>
20#include <mach/msm_bus_board.h>
21#include <mach/board.h>
22#include <mach/gpio.h>
23#include <mach/gpiomux.h>
Joel Kingdacbc822012-01-25 13:30:57 -080024#include <mach/socinfo.h>
Stepan Moskovchenko2327a952011-12-14 16:31:28 -080025#include "devices.h"
26#include "board-8064.h"
27
28#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE)
29static struct gpiomux_setting gpio_eth_config = {
30 .pull = GPIOMUX_PULL_NONE,
31 .drv = GPIOMUX_DRV_8MA,
32 .func = GPIOMUX_FUNC_GPIO,
33};
34
35/* The SPI configurations apply to GSBI 5*/
36static struct gpiomux_setting gpio_spi_config = {
37 .func = GPIOMUX_FUNC_2,
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -080038 .drv = GPIOMUX_DRV_12MA,
Stepan Moskovchenko2327a952011-12-14 16:31:28 -080039 .pull = GPIOMUX_PULL_NONE,
40};
41
42/* The SPI configurations apply to GSBI 5 chip select 2*/
43static struct gpiomux_setting gpio_spi_cs2_config = {
44 .func = GPIOMUX_FUNC_3,
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -080045 .drv = GPIOMUX_DRV_12MA,
Stepan Moskovchenko2327a952011-12-14 16:31:28 -080046 .pull = GPIOMUX_PULL_NONE,
47};
48
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -080049/* Chip selects for SPI clients */
50static struct gpiomux_setting gpio_spi_cs_config = {
51 .func = GPIOMUX_FUNC_GPIO,
52 .drv = GPIOMUX_DRV_12MA,
53 .pull = GPIOMUX_PULL_UP,
54};
55
Stepan Moskovchenko2327a952011-12-14 16:31:28 -080056struct msm_gpiomux_config apq8064_ethernet_configs[] = {
57 {
58 .gpio = 43,
59 .settings = {
60 [GPIOMUX_SUSPENDED] = &gpio_eth_config,
61 [GPIOMUX_ACTIVE] = &gpio_eth_config,
62 }
63 },
64};
65#endif
66
Swaminathan Sathappancef966d2011-12-15 17:27:04 -080067static struct gpiomux_setting cdc_mclk = {
68 .func = GPIOMUX_FUNC_1,
69 .drv = GPIOMUX_DRV_8MA,
70 .pull = GPIOMUX_PULL_NONE,
71};
72
Stepan Moskovchenko2327a952011-12-14 16:31:28 -080073static struct gpiomux_setting audio_auxpcm[] = {
74 /* Suspended state */
75 {
76 .func = GPIOMUX_FUNC_GPIO,
77 .drv = GPIOMUX_DRV_2MA,
78 .pull = GPIOMUX_PULL_NONE,
79 },
80 /* Active state */
81 {
82 .func = GPIOMUX_FUNC_1,
83 .drv = GPIOMUX_DRV_2MA,
84 .pull = GPIOMUX_PULL_NONE,
85 },
86};
87
Swaminathan Sathappancef966d2011-12-15 17:27:04 -080088static struct gpiomux_setting slimbus = {
89 .func = GPIOMUX_FUNC_1,
90 .drv = GPIOMUX_DRV_8MA,
91 .pull = GPIOMUX_PULL_KEEPER,
92};
93
Stepan Moskovchenko5ea3c312012-01-31 18:19:40 -080094static struct gpiomux_setting gsbi1_uart_config = {
95 .func = GPIOMUX_FUNC_1,
96 .drv = GPIOMUX_DRV_16MA,
97 .pull = GPIOMUX_PULL_NONE,
98};
99
David Collinsf0d00732012-01-25 15:46:50 -0800100static struct gpiomux_setting ext_regulator_config = {
101 .func = GPIOMUX_FUNC_GPIO,
102 .drv = GPIOMUX_DRV_8MA,
103 .pull = GPIOMUX_PULL_NONE,
104 .dir = GPIOMUX_OUT_LOW,
105};
106
Jin Hong4bbbfba2012-02-02 21:48:07 -0800107static struct gpiomux_setting gsbi7_func1_cfg = {
108 .func = GPIOMUX_FUNC_1,
109 .drv = GPIOMUX_DRV_8MA,
110 .pull = GPIOMUX_PULL_NONE,
111};
112
113static struct gpiomux_setting gsbi7_func2_cfg = {
114 .func = GPIOMUX_FUNC_2,
115 .drv = GPIOMUX_DRV_8MA,
116 .pull = GPIOMUX_PULL_NONE,
117};
118
Jing Lin04601f92012-02-05 15:36:07 -0800119static struct gpiomux_setting gsbi3_suspended_cfg = {
120 .func = GPIOMUX_FUNC_1,
121 .drv = GPIOMUX_DRV_2MA,
122 .pull = GPIOMUX_PULL_KEEPER,
123};
124
125static struct gpiomux_setting gsbi3_active_cfg = {
126 .func = GPIOMUX_FUNC_1,
127 .drv = GPIOMUX_DRV_8MA,
128 .pull = GPIOMUX_PULL_NONE,
129};
130
Hemant Kumara945b472012-01-25 15:08:06 -0800131#ifdef CONFIG_USB_EHCI_MSM_HSIC
132static struct gpiomux_setting hsic_act_cfg = {
133 .func = GPIOMUX_FUNC_1,
134 .drv = GPIOMUX_DRV_8MA,
135 .pull = GPIOMUX_PULL_NONE,
136};
137
138static struct gpiomux_setting hsic_sus_cfg = {
139 .func = GPIOMUX_FUNC_GPIO,
140 .drv = GPIOMUX_DRV_2MA,
141 .pull = GPIOMUX_PULL_DOWN,
142 .dir = GPIOMUX_OUT_LOW,
143};
144
145static struct msm_gpiomux_config apq8064_hsic_configs[] = {
146 {
147 .gpio = 88, /*HSIC_STROBE */
148 .settings = {
149 [GPIOMUX_ACTIVE] = &hsic_act_cfg,
150 [GPIOMUX_SUSPENDED] = &hsic_sus_cfg,
151 },
152 },
153 {
154 .gpio = 89, /* HSIC_DATA */
155 .settings = {
156 [GPIOMUX_ACTIVE] = &hsic_act_cfg,
157 [GPIOMUX_SUSPENDED] = &hsic_sus_cfg,
158 },
159 },
160};
161#endif
162
Jing Lin21ed4de2012-02-05 15:53:28 -0800163static struct gpiomux_setting mxt_reset_sus_cfg = {
164 .func = GPIOMUX_FUNC_GPIO,
165 .drv = GPIOMUX_DRV_6MA,
166 .pull = GPIOMUX_PULL_DOWN,
167};
168
169static struct gpiomux_setting mxt_reset_act_cfg = {
170 .func = GPIOMUX_FUNC_GPIO,
171 .drv = GPIOMUX_DRV_6MA,
172 .pull = GPIOMUX_PULL_UP,
173};
174
175static struct gpiomux_setting mxt_int_sus_cfg = {
176 .func = GPIOMUX_FUNC_GPIO,
177 .drv = GPIOMUX_DRV_2MA,
178 .pull = GPIOMUX_PULL_DOWN,
179};
180
181static struct gpiomux_setting mxt_int_act_cfg = {
182 .func = GPIOMUX_FUNC_GPIO,
183 .drv = GPIOMUX_DRV_8MA,
184 .pull = GPIOMUX_PULL_UP,
185};
186
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800187static struct msm_gpiomux_config apq8064_gsbi_configs[] __initdata = {
Stepan Moskovchenko5ea3c312012-01-31 18:19:40 -0800188 {
Jing Lin04601f92012-02-05 15:36:07 -0800189 .gpio = 8, /* GSBI3 I2C QUP SDA */
190 .settings = {
191 [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg,
192 [GPIOMUX_ACTIVE] = &gsbi3_active_cfg,
193 },
194 },
195 {
196 .gpio = 9, /* GSBI3 I2C QUP SCL */
197 .settings = {
198 [GPIOMUX_SUSPENDED] = &gsbi3_suspended_cfg,
199 [GPIOMUX_ACTIVE] = &gsbi3_active_cfg,
200 },
201 },
202 {
Stepan Moskovchenko5ea3c312012-01-31 18:19:40 -0800203 .gpio = 18, /* GSBI1 UART TX */
204 .settings = {
205 [GPIOMUX_SUSPENDED] = &gsbi1_uart_config,
206 },
207 },
208 {
209 .gpio = 19, /* GSBI1 UART RX */
210 .settings = {
211 [GPIOMUX_SUSPENDED] = &gsbi1_uart_config,
212 },
213 },
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800214#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE)
215 {
216 .gpio = 51, /* GSBI5 QUP SPI_DATA_MOSI */
217 .settings = {
218 [GPIOMUX_SUSPENDED] = &gpio_spi_config,
219 },
220 },
221 {
222 .gpio = 52, /* GSBI5 QUP SPI_DATA_MISO */
223 .settings = {
224 [GPIOMUX_SUSPENDED] = &gpio_spi_config,
225 },
226 },
227 {
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -0800228 .gpio = 53, /* Funny CS0 */
229 .settings = {
230 [GPIOMUX_SUSPENDED] = &gpio_spi_config,
231 },
232 },
233 {
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800234 .gpio = 31, /* GSBI5 QUP SPI_CS2_N */
235 .settings = {
236 [GPIOMUX_SUSPENDED] = &gpio_spi_cs2_config,
237 },
238 },
239 {
240 .gpio = 54, /* GSBI5 QUP SPI_CLK */
241 .settings = {
242 [GPIOMUX_SUSPENDED] = &gpio_spi_config,
243 },
244 },
245#endif
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -0800246 {
247 .gpio = 30, /* FP CS */
248 .settings = {
249 [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config,
250 },
251 },
252 {
253 .gpio = 32, /* EPM CS */
254 .settings = {
255 [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config,
256 },
257 },
258 {
259 .gpio = 53, /* NOR CS */
260 .settings = {
261 [GPIOMUX_SUSPENDED] = &gpio_spi_cs_config,
262 },
263 },
Jin Hong4bbbfba2012-02-02 21:48:07 -0800264 {
265 .gpio = 82, /* GSBI7 UART2 TX */
266 .settings = {
267 [GPIOMUX_SUSPENDED] = &gsbi7_func2_cfg,
268 },
269 },
270 {
271 .gpio = 83, /* GSBI7 UART2 RX */
272 .settings = {
273 [GPIOMUX_SUSPENDED] = &gsbi7_func1_cfg,
274 },
275 },
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800276};
277
Swaminathan Sathappancef966d2011-12-15 17:27:04 -0800278static struct msm_gpiomux_config apq8064_slimbus_config[] __initdata = {
279 {
280 .gpio = 40, /* slimbus clk */
281 .settings = {
282 [GPIOMUX_SUSPENDED] = &slimbus,
283 },
284 },
285 {
286 .gpio = 41, /* slimbus data */
287 .settings = {
288 [GPIOMUX_SUSPENDED] = &slimbus,
289 },
290 },
291};
292
293static struct msm_gpiomux_config apq8064_audio_codec_configs[] __initdata = {
294 {
295 .gpio = 39,
296 .settings = {
297 [GPIOMUX_SUSPENDED] = &cdc_mclk,
298 },
299 },
300};
301
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800302static struct msm_gpiomux_config apq8064_audio_auxpcm_configs[] __initdata = {
303 {
304 .gpio = 43,
305 .settings = {
306 [GPIOMUX_SUSPENDED] = &audio_auxpcm[0],
307 [GPIOMUX_ACTIVE] = &audio_auxpcm[1],
308 },
309 },
310 {
311 .gpio = 44,
312 .settings = {
313 [GPIOMUX_SUSPENDED] = &audio_auxpcm[0],
314 [GPIOMUX_ACTIVE] = &audio_auxpcm[1],
315 },
316 },
317 {
318 .gpio = 45,
319 .settings = {
320 [GPIOMUX_SUSPENDED] = &audio_auxpcm[0],
321 [GPIOMUX_ACTIVE] = &audio_auxpcm[1],
322 },
323 },
324 {
325 .gpio = 46,
326 .settings = {
327 [GPIOMUX_SUSPENDED] = &audio_auxpcm[0],
328 [GPIOMUX_ACTIVE] = &audio_auxpcm[1],
329 },
330 },
331};
332
David Collinsf0d00732012-01-25 15:46:50 -0800333/* External 3.3 V regulator enable */
334static struct msm_gpiomux_config apq8064_ext_regulator_configs[] __initdata = {
335 {
336 .gpio = APQ8064_EXT_3P3V_REG_EN_GPIO,
337 .settings = {
338 [GPIOMUX_SUSPENDED] = &ext_regulator_config,
339 },
340 },
341};
342
Joel Kingdacbc822012-01-25 13:30:57 -0800343static struct gpiomux_setting ap2mdm_cfg = {
344 .func = GPIOMUX_FUNC_GPIO,
345 .drv = GPIOMUX_DRV_8MA,
346 .pull = GPIOMUX_PULL_DOWN,
347};
348
349static struct gpiomux_setting mdm2ap_status_cfg = {
350 .func = GPIOMUX_FUNC_GPIO,
351 .drv = GPIOMUX_DRV_8MA,
352 .pull = GPIOMUX_PULL_NONE,
353};
354
355static struct gpiomux_setting mdm2ap_errfatal_cfg = {
356 .func = GPIOMUX_FUNC_GPIO,
357 .drv = GPIOMUX_DRV_16MA,
358 .pull = GPIOMUX_PULL_DOWN,
359};
360
361static struct gpiomux_setting ap2mdm_pon_reset_n_cfg = {
362 .func = GPIOMUX_FUNC_GPIO,
363 .drv = GPIOMUX_DRV_8MA,
364 .pull = GPIOMUX_PULL_DOWN,
365};
366
367static struct msm_gpiomux_config mdm_configs[] __initdata = {
368 /* AP2MDM_STATUS */
369 {
370 .gpio = 48,
371 .settings = {
372 [GPIOMUX_SUSPENDED] = &ap2mdm_cfg,
373 }
374 },
375 /* MDM2AP_STATUS */
376 {
377 .gpio = 49,
378 .settings = {
379 [GPIOMUX_SUSPENDED] = &mdm2ap_status_cfg,
380 }
381 },
382 /* MDM2AP_ERRFATAL */
383 {
384 .gpio = 19,
385 .settings = {
386 [GPIOMUX_SUSPENDED] = &mdm2ap_errfatal_cfg,
387 }
388 },
389 /* AP2MDM_ERRFATAL */
390 {
391 .gpio = 18,
392 .settings = {
393 [GPIOMUX_SUSPENDED] = &ap2mdm_cfg,
394 }
395 },
396 /* AP2MDM_PON_RESET_N */
397 {
398 .gpio = 27,
399 .settings = {
400 [GPIOMUX_SUSPENDED] = &ap2mdm_pon_reset_n_cfg,
401 }
402 }
403};
404
Jing Lin21ed4de2012-02-05 15:53:28 -0800405static struct msm_gpiomux_config apq8064_mxt_configs[] __initdata = {
406 { /* TS INTERRUPT */
407 .gpio = 6,
408 .settings = {
409 [GPIOMUX_ACTIVE] = &mxt_int_act_cfg,
410 [GPIOMUX_SUSPENDED] = &mxt_int_sus_cfg,
411 },
412 },
413 { /* TS RESET */
414 .gpio = 33,
415 .settings = {
416 [GPIOMUX_ACTIVE] = &mxt_reset_act_cfg,
417 [GPIOMUX_SUSPENDED] = &mxt_reset_sus_cfg,
418 },
419 },
420};
421
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800422void __init apq8064_init_gpiomux(void)
423{
424 int rc;
425
426 rc = msm_gpiomux_init(NR_GPIO_IRQS);
427 if (rc) {
428 pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc);
429 return;
430 }
431
432#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE)
433 msm_gpiomux_install(apq8064_ethernet_configs,
434 ARRAY_SIZE(apq8064_ethernet_configs));
435#endif
436
437 msm_gpiomux_install(apq8064_gsbi_configs,
438 ARRAY_SIZE(apq8064_gsbi_configs));
439
Swaminathan Sathappancef966d2011-12-15 17:27:04 -0800440 msm_gpiomux_install(apq8064_slimbus_config,
441 ARRAY_SIZE(apq8064_slimbus_config));
442
443 msm_gpiomux_install(apq8064_audio_codec_configs,
444 ARRAY_SIZE(apq8064_audio_codec_configs));
445
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800446 msm_gpiomux_install(apq8064_audio_auxpcm_configs,
447 ARRAY_SIZE(apq8064_audio_auxpcm_configs));
David Collinsf0d00732012-01-25 15:46:50 -0800448
449 msm_gpiomux_install(apq8064_ext_regulator_configs,
450 ARRAY_SIZE(apq8064_ext_regulator_configs));
Joel Kingdacbc822012-01-25 13:30:57 -0800451
452 if (machine_is_apq8064_mtp())
453 msm_gpiomux_install(mdm_configs,
454 ARRAY_SIZE(mdm_configs));
Hemant Kumara945b472012-01-25 15:08:06 -0800455
456#ifdef CONFIG_USB_EHCI_MSM_HSIC
457 msm_gpiomux_install(apq8064_hsic_configs,
458 ARRAY_SIZE(apq8064_hsic_configs));
459#endif
Jing Lin21ed4de2012-02-05 15:53:28 -0800460
461 if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid())
462 msm_gpiomux_install(apq8064_mxt_configs,
463 ARRAY_SIZE(apq8064_mxt_configs));
Stepan Moskovchenko2327a952011-12-14 16:31:28 -0800464}