blob: b5e647597e2eee469af5007dbc0c697009fd2c07 [file] [log] [blame]
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -07001/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
2 *
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#include <linux/kernel.h>
14#include <linux/platform_device.h>
Harini Jayaramaneba52672011-09-08 15:13:00 -060015#include <linux/i2c.h>
Kenneth Heitkeaf3d3cf2011-09-08 11:45:31 -070016#include <linux/msm_ssbi.h>
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -070017#include <linux/platform_data/qcom_crypto_device.h>
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -070018#include <asm/mach-types.h>
19#include <asm/mach/arch.h>
Krishna Kondadd794462011-10-01 00:19:29 -070020#include <asm/mach/mmc.h>
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -070021#include <mach/board.h>
22#include <mach/msm_iomap.h>
23#include <mach/gpio.h>
24#include <mach/gpiomux.h>
Harini Jayaraman738c9312011-09-08 15:22:38 -060025#include <mach/msm_spi.h>
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -070026#include "timer.h"
27#include "devices.h"
David Collinsfb88c432011-08-25 15:12:47 -070028#include "board-9615.h"
Maheshkumar Sivasubramanian4923db22011-09-15 09:28:15 -060029#include "cpuidle.h"
30#include "pm.h"
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -070031
Rohit Vaswani09666872011-08-23 17:41:54 -070032static struct platform_device *common_devices[] = {
Jeff Ohlsteind19bf442011-09-09 12:48:18 -070033 &msm9615_device_dmov,
Jeff Hugo56b933a2011-09-28 14:42:05 -060034 &msm_device_smd,
Rohit Vaswani09666872011-08-23 17:41:54 -070035 &msm9615_device_uart_gsbi4,
Kenneth Heitkeaf3d3cf2011-09-08 11:45:31 -070036 &msm9615_device_ssbi_pmic1,
Harini Jayaramaneba52672011-09-08 15:13:00 -060037 &msm9615_device_qup_i2c_gsbi5,
Harini Jayaraman738c9312011-09-08 15:22:38 -060038 &msm9615_device_qup_spi_gsbi3,
Yan He092b7272011-09-21 15:25:03 -070039 &msm_device_sps,
Siddartha Mohanadoss5d49cec2011-09-21 10:26:15 -070040 &msm9615_device_tsens,
Sahitya Tummala38295432011-09-29 10:08:45 +053041 &msm_device_nand,
Praveen Chidambaramab3b1c42011-08-25 08:44:05 -060042 &msm_rpm_device,
Ramesh Masavarapu5ad37392011-10-10 10:44:10 -070043#ifdef CONFIG_HW_RANDOM_MSM
44 &msm_device_rng,
45#endif
Ramesh Masavarapufa679d92011-10-13 23:42:59 -070046
47#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
48 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
49 &qcrypto_device,
50#endif
51
52#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
53 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
54 &qcedev_device,
55#endif
Rohit Vaswani09666872011-08-23 17:41:54 -070056};
57
David Collinsfb88c432011-08-25 15:12:47 -070058static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata __devinitdata = {
59 .irq_base = PM8018_IRQ_BASE,
60 .devirq = MSM_GPIO_TO_INT(87),
61 .irq_trigger_flag = IRQF_TRIGGER_LOW,
62};
63
64static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata __devinitdata = {
65 .gpio_base = PM8018_GPIO_PM_TO_SYS(1),
66};
67
68static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
69 .mpp_base = PM8018_MPP_PM_TO_SYS(1),
70};
71
72static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
73 .rtc_write_enable = false,
74};
75
76static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
77 .pull_up = 1,
78 .kpd_trigger_delay_us = 970,
79 .wakeup = 1,
80};
81
82static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = {
83 .priority = 0,
84};
85
86static struct pm8018_platform_data pm8018_platform_data __devinitdata = {
87 .irq_pdata = &pm8xxx_irq_pdata,
88 .gpio_pdata = &pm8xxx_gpio_pdata,
89 .mpp_pdata = &pm8xxx_mpp_pdata,
90 .rtc_pdata = &pm8xxx_rtc_pdata,
91 .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
92 .misc_pdata = &pm8xxx_misc_pdata,
David Collins00b31e62011-08-31 20:00:10 -070093 .regulator_pdatas = msm_pm8018_regulator_pdata,
David Collinsfb88c432011-08-25 15:12:47 -070094};
95
Kenneth Heitkeaf3d3cf2011-09-08 11:45:31 -070096static struct msm_ssbi_platform_data msm9615_ssbi_pm8018_pdata __devinitdata = {
97 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
98 .slave = {
David Collinsfb88c432011-08-25 15:12:47 -070099 .name = PM8018_CORE_DEV_NAME,
100 .platform_data = &pm8018_platform_data,
Kenneth Heitkeaf3d3cf2011-09-08 11:45:31 -0700101 },
102};
103
David Collinsbea297a2011-09-28 13:11:14 -0700104static struct platform_device msm9615_device_rpm_regulator __devinitdata = {
105 .name = "rpm-regulator",
106 .id = -1,
107 .dev = {
108 .platform_data = &msm_rpm_regulator_9615_pdata,
109 },
110};
111
Rohit Vaswanif688fa62011-10-13 18:13:10 -0700112static struct gpiomux_setting ps_hold = {
113 .func = GPIOMUX_FUNC_1,
114 .drv = GPIOMUX_DRV_8MA,
115 .pull = GPIOMUX_PULL_NONE,
116};
117
Rohit Vaswani09666872011-08-23 17:41:54 -0700118static struct gpiomux_setting gsbi4 = {
119 .func = GPIOMUX_FUNC_1,
120 .drv = GPIOMUX_DRV_8MA,
121 .pull = GPIOMUX_PULL_NONE,
122};
123
Harini Jayaramaneba52672011-09-08 15:13:00 -0600124static struct gpiomux_setting gsbi5 = {
125 .func = GPIOMUX_FUNC_1,
126 .drv = GPIOMUX_DRV_8MA,
127 .pull = GPIOMUX_PULL_NONE,
128};
129
Harini Jayaraman738c9312011-09-08 15:22:38 -0600130static struct gpiomux_setting gsbi3 = {
131 .func = GPIOMUX_FUNC_1,
132 .drv = GPIOMUX_DRV_8MA,
133 .pull = GPIOMUX_PULL_NONE,
134};
135
136static struct gpiomux_setting gsbi3_cs1_config = {
137 .func = GPIOMUX_FUNC_4,
138 .drv = GPIOMUX_DRV_8MA,
139 .pull = GPIOMUX_PULL_NONE,
140};
141
Rohit Vaswanif688fa62011-10-13 18:13:10 -0700142struct msm_gpiomux_config msm9615_ps_hold_config[] __initdata = {
143 {
144 .gpio = 83,
145 .settings = {
146 [GPIOMUX_SUSPENDED] = &ps_hold,
147 },
148 },
149};
150
Rohit Vaswani09666872011-08-23 17:41:54 -0700151struct msm_gpiomux_config msm9615_gsbi_configs[] __initdata = {
152 {
Harini Jayaraman738c9312011-09-08 15:22:38 -0600153 .gpio = 8, /* GSBI3 QUP SPI_CLK */
154 .settings = {
155 [GPIOMUX_SUSPENDED] = &gsbi3,
156 },
157 },
158 {
159 .gpio = 9, /* GSBI3 QUP SPI_CS_N */
160 .settings = {
161 [GPIOMUX_SUSPENDED] = &gsbi3,
162 },
163 },
164 {
165 .gpio = 10, /* GSBI3 QUP SPI_DATA_MISO */
166 .settings = {
167 [GPIOMUX_SUSPENDED] = &gsbi3,
168 },
169 },
170 {
171 .gpio = 11, /* GSBI3 QUP SPI_DATA_MOSI */
172 .settings = {
173 [GPIOMUX_SUSPENDED] = &gsbi3,
174 },
175 },
176 {
Rohit Vaswani09666872011-08-23 17:41:54 -0700177 .gpio = 12, /* GSBI4 UART */
178 .settings = {
179 [GPIOMUX_SUSPENDED] = &gsbi4,
180 },
181 },
182 {
183 .gpio = 13, /* GSBI4 UART */
184 .settings = {
185 [GPIOMUX_SUSPENDED] = &gsbi4,
186 },
187 },
188 {
189 .gpio = 14, /* GSBI4 UART */
190 .settings = {
191 [GPIOMUX_SUSPENDED] = &gsbi4,
192 },
193 },
194 {
195 .gpio = 15, /* GSBI4 UART */
196 .settings = {
197 [GPIOMUX_SUSPENDED] = &gsbi4,
198 },
199 },
Harini Jayaramaneba52672011-09-08 15:13:00 -0600200 {
201 .gpio = 16, /* GSBI5 I2C QUP SCL */
202 .settings = {
203 [GPIOMUX_SUSPENDED] = &gsbi5,
204 },
205 },
206 {
207 .gpio = 17, /* GSBI5 I2C QUP SDA */
208 .settings = {
209 [GPIOMUX_SUSPENDED] = &gsbi5,
210 },
211 },
Harini Jayaraman738c9312011-09-08 15:22:38 -0600212 {
213 /* GPIO 19 can be used for I2C/UART on GSBI5 */
214 .gpio = 19, /* GSBI3 QUP SPI_CS_1 */
215 .settings = {
216 [GPIOMUX_SUSPENDED] = &gsbi3_cs1_config,
217 },
218 },
Rohit Vaswani09666872011-08-23 17:41:54 -0700219};
220
Ramesh Masavarapufa679d92011-10-13 23:42:59 -0700221#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
222 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \
223 defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
224 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
225
226#define QCE_SIZE 0x10000
227#define QCE_0_BASE 0x18500000
228
229#define QCE_HW_KEY_SUPPORT 0
230#define QCE_SHA_HMAC_SUPPORT 1
231#define QCE_SHARE_CE_RESOURCE 1
232#define QCE_CE_SHARED 0
233
234static struct resource qcrypto_resources[] = {
235 [0] = {
236 .start = QCE_0_BASE,
237 .end = QCE_0_BASE + QCE_SIZE - 1,
238 .flags = IORESOURCE_MEM,
239 },
240 [1] = {
241 .name = "crypto_channels",
242 .start = DMOV_CE_IN_CHAN,
243 .end = DMOV_CE_OUT_CHAN,
244 .flags = IORESOURCE_DMA,
245 },
246 [2] = {
247 .name = "crypto_crci_in",
248 .start = DMOV_CE_IN_CRCI,
249 .end = DMOV_CE_IN_CRCI,
250 .flags = IORESOURCE_DMA,
251 },
252 [3] = {
253 .name = "crypto_crci_out",
254 .start = DMOV_CE_OUT_CRCI,
255 .end = DMOV_CE_OUT_CRCI,
256 .flags = IORESOURCE_DMA,
257 },
258};
259
260static struct resource qcedev_resources[] = {
261 [0] = {
262 .start = QCE_0_BASE,
263 .end = QCE_0_BASE + QCE_SIZE - 1,
264 .flags = IORESOURCE_MEM,
265 },
266 [1] = {
267 .name = "crypto_channels",
268 .start = DMOV_CE_IN_CHAN,
269 .end = DMOV_CE_OUT_CHAN,
270 .flags = IORESOURCE_DMA,
271 },
272 [2] = {
273 .name = "crypto_crci_in",
274 .start = DMOV_CE_IN_CRCI,
275 .end = DMOV_CE_IN_CRCI,
276 .flags = IORESOURCE_DMA,
277 },
278 [3] = {
279 .name = "crypto_crci_out",
280 .start = DMOV_CE_OUT_CRCI,
281 .end = DMOV_CE_OUT_CRCI,
282 .flags = IORESOURCE_DMA,
283 },
284};
285
286#endif
287
288#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
289 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
290
291static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
292 .ce_shared = QCE_CE_SHARED,
293 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
294 .hw_key_support = QCE_HW_KEY_SUPPORT,
295 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
296};
297
298static struct platform_device qcrypto_device = {
299 .name = "qcrypto",
300 .id = 0,
301 .num_resources = ARRAY_SIZE(qcrypto_resources),
302 .resource = qcrypto_resources,
303 .dev = {
304 .coherent_dma_mask = DMA_BIT_MASK(32),
305 .platform_data = &qcrypto_ce_hw_suppport,
306 },
307};
308#endif
309
310#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
311 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
312
313static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
314 .ce_shared = QCE_CE_SHARED,
315 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
316 .hw_key_support = QCE_HW_KEY_SUPPORT,
317 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
318};
319
320static struct platform_device qcedev_device = {
321 .name = "qce",
322 .id = 0,
323 .num_resources = ARRAY_SIZE(qcedev_resources),
324 .resource = qcedev_resources,
325 .dev = {
326 .coherent_dma_mask = DMA_BIT_MASK(32),
327 .platform_data = &qcedev_ce_hw_suppport,
328 },
329};
330#endif
331
Krishna Kondadd794462011-10-01 00:19:29 -0700332#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\
333 || defined(CONFIG_MMC_MSM_SDC2_SUPPORT))
334
335#define GPIO_SDCARD_PWR_EN 18
336
337/* MDM9x15 have 2 SDCC controllers */
338enum sdcc_controllers {
339 SDCC1,
340 SDCC2,
341 MAX_SDCC_CONTROLLER
342};
343
344#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
345/* SDC1 pad data */
346static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = {
347 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA},
348 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA},
349 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA}
350};
351
352static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = {
353 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA},
354 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA},
355 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA}
356};
357
358static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = {
359 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
360 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
361 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
362};
363
364static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = {
365 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
366 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_DOWN},
367 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_DOWN}
368};
369
370static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = {
371 [SDCC1] = {
372 .on = sdc1_pad_pull_on_cfg,
373 .off = sdc1_pad_pull_off_cfg,
374 .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg)
375 },
376};
377
378static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = {
379 [SDCC1] = {
380 .on = sdc1_pad_drv_on_cfg,
381 .off = sdc1_pad_drv_off_cfg,
382 .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg)
383 },
384};
385
386static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = {
387 [SDCC1] = {
388 .pull = &mmc_pad_pull_data[SDCC1],
389 .drv = &mmc_pad_drv_data[SDCC1]
390 },
391};
392#endif
393
Krishna Konda71aef182011-10-01 02:27:51 -0700394#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
395static struct gpiomux_setting sdcc2_clk_actv_cfg = {
396 .func = GPIOMUX_FUNC_1,
397 .drv = GPIOMUX_DRV_16MA,
398 .pull = GPIOMUX_PULL_NONE,
399};
400
401static struct gpiomux_setting sdcc2_cmd_data_0_3_actv_cfg = {
402 .func = GPIOMUX_FUNC_1,
403 .drv = GPIOMUX_DRV_8MA,
404 .pull = GPIOMUX_PULL_UP,
405};
406
407static struct gpiomux_setting sdcc2_suspend_cfg = {
408 .func = GPIOMUX_FUNC_1,
409 .drv = GPIOMUX_DRV_2MA,
410 .pull = GPIOMUX_PULL_DOWN,
411};
412
413static struct msm_gpiomux_config msm9615_sdcc2_configs[] __initdata = {
414 {
415 /* SDC2_DATA_0 */
416 .gpio = 25,
417 .settings = {
418 [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg,
419 [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg,
420 },
421 },
422 {
423 /* SDC2_DATA_1 */
424 .gpio = 26,
425 .settings = {
426 [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg,
427 [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg,
428 },
429 },
430 {
431 /* SDC2_DATA_2 */
432 .gpio = 27,
433 .settings = {
434 [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg,
435 [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg,
436 },
437 },
438 {
439 /* SDC2_DATA_3 */
440 .gpio = 28,
441 .settings = {
442 [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg,
443 [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg,
444 },
445 },
446 {
447 /* SDC2_CMD GSBI1 */
448 .gpio = 29,
449 .settings = {
450 [GPIOMUX_ACTIVE] = &sdcc2_cmd_data_0_3_actv_cfg,
451 [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg,
452 },
453 },
454 {
455 /* SDC2_CLK GSBI1 */
456 .gpio = 30,
457 .settings = {
458 [GPIOMUX_ACTIVE] = &sdcc2_clk_actv_cfg,
459 [GPIOMUX_SUSPENDED] = &sdcc2_suspend_cfg,
460 },
461 },
462};
463
464static struct msm_mmc_gpio sdc2_gpio_cfg[] = {
465 {25, "sdc2_dat_0"},
466 {26, "sdc2_dat_1"},
467 {27, "sdc2_dat_2"},
468 {28, "sdc2_dat_3"},
469 {29, "sdc2_cmd"},
470 {30, "sdc2_clk"},
471};
472
473static struct msm_mmc_gpio_data mmc_gpio_data[MAX_SDCC_CONTROLLER] = {
474 [SDCC2] = {
475 .gpio = sdc2_gpio_cfg,
476 .size = ARRAY_SIZE(sdc2_gpio_cfg),
477 },
478};
479#else
480static struct msm_gpiomux_config msm9615_sdcc2_configs[0];
481#endif
482
483static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = {
Krishna Kondadd794462011-10-01 00:19:29 -0700484#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
485 [SDCC1] = {
486 .is_gpio = 0,
487 .pad_data = &mmc_pad_data[SDCC1],
488 },
489#endif
Krishna Konda71aef182011-10-01 02:27:51 -0700490#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
491 [SDCC2] = {
492 .is_gpio = 1,
493 .gpio_data = &mmc_gpio_data[SDCC2],
494 },
495#endif
Krishna Kondadd794462011-10-01 00:19:29 -0700496};
497
498#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
499static unsigned int sdc1_sup_clk_rates[] = {
500 400000, 24000000, 48000000
501};
502
503static struct mmc_platform_data sdc1_data = {
504 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
505 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
506 .sup_clk_table = sdc1_sup_clk_rates,
507 .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates),
508 .sdcc_v4_sup = true,
509 .pin_data = &mmc_slot_pin_data[SDCC1],
510};
511static struct mmc_platform_data *msm9615_sdc1_pdata = &sdc1_data;
512#else
513static struct mmc_platform_data *msm9615_sdc1_pdata;
514#endif
515
Krishna Konda71aef182011-10-01 02:27:51 -0700516#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
517static unsigned int sdc2_sup_clk_rates[] = {
518 400000, 24000000, 48000000
519};
520
521static struct mmc_platform_data sdc2_data = {
522 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
523 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
524 .sup_clk_table = sdc2_sup_clk_rates,
525 .sup_clk_cnt = ARRAY_SIZE(sdc2_sup_clk_rates),
526 .sdcc_v4_sup = true,
527 .pin_data = &mmc_slot_pin_data[SDCC2],
528};
529static struct mmc_platform_data *msm9615_sdc2_pdata = &sdc2_data;
530#else
531static struct mmc_platform_data *msm9615_sdc2_pdata;
532#endif
533
Krishna Kondadd794462011-10-01 00:19:29 -0700534static void __init msm9615_init_mmc(void)
535{
536 int ret;
537
538 if (msm9615_sdc1_pdata) {
539 ret = gpio_request(GPIO_SDCARD_PWR_EN, "SDCARD_PWR_EN");
540
541 if (ret) {
542 pr_err("%s: sdcc1: Error requesting GPIO "
543 "SDCARD_PWR_EN:%d\n", __func__, ret);
544 } else {
545 ret = gpio_direction_output(GPIO_SDCARD_PWR_EN, 1);
546 if (ret) {
547 pr_err("%s: sdcc1: Error setting o/p direction"
548 " for GPIO SDCARD_PWR_EN:%d\n",
549 __func__, ret);
550 gpio_free(GPIO_SDCARD_PWR_EN);
551 } else {
552 msm_add_sdcc(1, msm9615_sdc1_pdata);
553 }
554 }
555 }
Krishna Konda71aef182011-10-01 02:27:51 -0700556
557 if (msm9615_sdc2_pdata) {
558 msm_gpiomux_install(msm9615_sdcc2_configs,
559 ARRAY_SIZE(msm9615_sdcc2_configs));
560
561 /* SDC2: External card slot */
562 msm_add_sdcc(2, msm9615_sdc2_pdata);
563 }
Krishna Kondadd794462011-10-01 00:19:29 -0700564}
565#else
566static void __init msm9615_init_mmc(void) { }
567#endif
Maheshkumar Sivasubramanian4923db22011-09-15 09:28:15 -0600568static struct msm_cpuidle_state msm_cstates[] __initdata = {
569 {0, 0, "C0", "WFI",
570 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT},
571
572 {0, 1, "C1", "STANDALONE_POWER_COLLAPSE",
573 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE},
574
575 {0, 2, "C2", "POWER_COLLAPSE",
576 MSM_PM_SLEEP_MODE_POWER_COLLAPSE},
577};
578static struct msm_pm_platform_data msm_pm_data[MSM_PM_SLEEP_MODE_NR] = {
579 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {
580 .idle_supported = 1,
581 .suspend_supported = 1,
582 .idle_enabled = 0,
583 .suspend_enabled = 0,
584 },
585 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
586 .idle_supported = 1,
587 .suspend_supported = 1,
588 .idle_enabled = 0,
589 .suspend_enabled = 0,
590 },
591 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
592 .idle_supported = 1,
593 .suspend_supported = 1,
594 .idle_enabled = 1,
595 .suspend_enabled = 1,
596 },
597};
Krishna Kondadd794462011-10-01 00:19:29 -0700598
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -0700599static int __init gpiomux_init(void)
600{
601 int rc;
602
603 rc = msm_gpiomux_init(NR_GPIO_IRQS);
604 if (rc) {
605 pr_err(KERN_ERR "msm_gpiomux_init failed %d\n", rc);
606 return rc;
607 }
Rohit Vaswani09666872011-08-23 17:41:54 -0700608 msm_gpiomux_install(msm9615_gsbi_configs,
609 ARRAY_SIZE(msm9615_gsbi_configs));
610
Rohit Vaswanif688fa62011-10-13 18:13:10 -0700611 msm_gpiomux_install(msm9615_ps_hold_config,
612 ARRAY_SIZE(msm9615_ps_hold_config));
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -0700613 return 0;
614}
615
Harini Jayaraman738c9312011-09-08 15:22:38 -0600616static struct msm_spi_platform_data msm9615_qup_spi_gsbi3_pdata = {
617 .max_clock_speed = 24000000,
618};
619
Harini Jayaramaneba52672011-09-08 15:13:00 -0600620static struct msm_i2c_platform_data msm9615_i2c_qup_gsbi5_pdata = {
621 .clk_freq = 100000,
622 .src_clk_rate = 24000000,
623};
624
625static void __init msm9615_i2c_init(void)
626{
627 msm9615_device_qup_i2c_gsbi5.dev.platform_data =
628 &msm9615_i2c_qup_gsbi5_pdata;
629}
630
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -0700631static void __init msm9615_common_init(void)
632{
633 msm9615_device_init();
634 gpiomux_init();
Harini Jayaramaneba52672011-09-08 15:13:00 -0600635 msm9615_i2c_init();
David Collins00b31e62011-08-31 20:00:10 -0700636 regulator_suppress_info_printing();
David Collinsbea297a2011-09-28 13:11:14 -0700637 platform_device_register(&msm9615_device_rpm_regulator);
Harini Jayaraman738c9312011-09-08 15:22:38 -0600638 msm9615_device_qup_spi_gsbi3.dev.platform_data =
639 &msm9615_qup_spi_gsbi3_pdata;
Kenneth Heitkeaf3d3cf2011-09-08 11:45:31 -0700640 msm9615_device_ssbi_pmic1.dev.platform_data =
641 &msm9615_ssbi_pm8018_pdata;
David Collins00b31e62011-08-31 20:00:10 -0700642 pm8018_platform_data.num_regulators = msm_pm8018_regulator_pdata_len;
Rohit Vaswani09666872011-08-23 17:41:54 -0700643 platform_add_devices(common_devices, ARRAY_SIZE(common_devices));
Krishna Kondadd794462011-10-01 00:19:29 -0700644
645 msm9615_init_mmc();
Maheshkumar Sivasubramanian4923db22011-09-15 09:28:15 -0600646 msm_pm_set_platform_data(msm_pm_data, ARRAY_SIZE(msm_pm_data));
647 msm_pm_set_rpm_wakeup_irq(RPM_APCC_CPU0_WAKE_UP_IRQ);
648 msm_cpuidle_set_states(msm_cstates, ARRAY_SIZE(msm_cstates),
649 msm_pm_data);
Rohit Vaswaniced9b3b2011-08-23 17:21:49 -0700650}
651
652static void __init msm9615_cdp_init(void)
653{
654 msm9615_common_init();
655}
656
657static void __init msm9615_mtp_init(void)
658{
659 msm9615_common_init();
660}
661
662MACHINE_START(MSM9615_CDP, "QCT MSM9615 CDP")
663 .map_io = msm9615_map_io,
664 .init_irq = msm9615_init_irq,
665 .timer = &msm_timer,
666 .init_machine = msm9615_cdp_init,
667MACHINE_END
668
669MACHINE_START(MSM9615_MTP, "QCT MSM9615 MTP")
670 .map_io = msm9615_map_io,
671 .init_irq = msm9615_init_irq,
672 .timer = &msm_timer,
673 .init_machine = msm9615_mtp_init,
674MACHINE_END