blob: 6dd7addb2a5d710c5f07d2c4f5942261c2f358ad [file] [log] [blame]
Krishna Konda941604a2012-01-10 17:46:34 -08001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Stepan Moskovchenko39236d72011-11-30 17:42:23 -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>
24#include "devices.h"
Jay Chokshi06fa7542011-12-07 13:09:17 -080025
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080026#include "board-8930.h"
Subhash Jadavanibcd435f2012-04-24 18:26:49 +053027#include "board-storage-common-a.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080028
29/* MSM8960 has 5 SDCC controllers */
30enum sdcc_controllers {
31 SDCC1,
32 SDCC2,
33 SDCC3,
34 SDCC4,
35 SDCC5,
36 MAX_SDCC_CONTROLLER
37};
38
39/* All SDCC controllers require VDD/VCC voltage */
40static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = {
41 /* SDCC1 : eMMC card connected */
42 [SDCC1] = {
43 .name = "sdc_vdd",
44 .high_vol_level = 2950000,
45 .low_vol_level = 2950000,
46 .always_on = 1,
47 .lpm_sup = 1,
48 .lpm_uA = 9000,
49 .hpm_uA = 200000, /* 200mA */
50 },
51 /* SDCC3 : External card slot connected */
52 [SDCC3] = {
53 .name = "sdc_vdd",
54 .high_vol_level = 2950000,
55 .low_vol_level = 2950000,
Krishna Kondad4f88122012-02-17 18:43:52 -080056 .hpm_uA = 800000, /* 800mA */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080057 }
58};
59
60/* Only slots having eMMC card will require VCCQ voltage */
61static struct msm_mmc_reg_data mmc_vccq_reg_data[1] = {
62 /* SDCC1 : eMMC card connected */
63 [SDCC1] = {
64 .name = "sdc_vccq",
65 .always_on = 1,
66 .high_vol_level = 1800000,
67 .low_vol_level = 1800000,
68 .hpm_uA = 200000, /* 200mA */
69 }
70};
71
72/* All SDCC controllers may require voting for VDD PAD voltage */
73static struct msm_mmc_reg_data mmc_vddp_reg_data[MAX_SDCC_CONTROLLER] = {
74 /* SDCC3 : External card slot connected */
75 [SDCC3] = {
76 .name = "sdc_vddp",
77 .high_vol_level = 2950000,
78 .low_vol_level = 1850000,
79 .always_on = 1,
80 .lpm_sup = 1,
81 /* Max. Active current required is 16 mA */
82 .hpm_uA = 16000,
83 /*
84 * Sleep current required is ~300 uA. But min. vote can be
85 * in terms of mA (min. 1 mA). So let's vote for 2 mA
86 * during sleep.
87 */
88 .lpm_uA = 2000,
89 }
90};
91
92static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = {
93 /* SDCC1 : eMMC card connected */
94 [SDCC1] = {
95 .vdd_data = &mmc_vdd_reg_data[SDCC1],
96 .vccq_data = &mmc_vccq_reg_data[SDCC1],
97 },
98 /* SDCC3 : External card slot connected */
99 [SDCC3] = {
100 .vdd_data = &mmc_vdd_reg_data[SDCC3],
101 .vddp_data = &mmc_vddp_reg_data[SDCC3],
102 }
103};
104
105/* SDC1 pad data */
106static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = {
107 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA},
108 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA},
109 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA}
110};
111
112static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = {
113 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA},
114 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA},
115 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA}
116};
117
118static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = {
119 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
120 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
121 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
122};
123
124static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = {
125 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
Krishna Kondacf10b9f2012-02-17 19:22:39 -0800126 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
127 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800128};
129
130/* SDC3 pad data */
131static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = {
132 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA},
133 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA},
134 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA}
135};
136
137static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = {
138 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA},
139 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA},
140 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA}
141};
142
143static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = {
144 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
145 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
146 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
147};
148
149static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = {
150 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
151 /*
152 * SDC3 CMD line should be PULLed UP otherwise fluid platform will
153 * see transitions (1 -> 0 and 0 -> 1) on card detection line,
154 * which would result in false card detection interrupts.
155 */
156 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
157 /*
158 * Keeping DATA lines status to PULL UP will make sure that
159 * there is no current leak during sleep if external pull up
160 * is connected to DATA lines.
161 */
162 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
163};
164
165static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = {
166 [SDCC1] = {
167 .on = sdc1_pad_pull_on_cfg,
168 .off = sdc1_pad_pull_off_cfg,
169 .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg)
170 },
171 [SDCC3] = {
172 .on = sdc3_pad_pull_on_cfg,
173 .off = sdc3_pad_pull_off_cfg,
174 .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg)
175 },
176};
177
178static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = {
179 [SDCC1] = {
180 .on = sdc1_pad_drv_on_cfg,
181 .off = sdc1_pad_drv_off_cfg,
182 .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg)
183 },
184 [SDCC3] = {
185 .on = sdc3_pad_drv_on_cfg,
186 .off = sdc3_pad_drv_off_cfg,
187 .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg)
188 },
189};
190
191static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = {
192 [SDCC1] = {
193 .pull = &mmc_pad_pull_data[SDCC1],
194 .drv = &mmc_pad_drv_data[SDCC1]
195 },
196 [SDCC3] = {
197 .pull = &mmc_pad_pull_data[SDCC3],
198 .drv = &mmc_pad_drv_data[SDCC3]
199 },
200};
201
202static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = {
203 [SDCC1] = {
204 .pad_data = &mmc_pad_data[SDCC1],
205 },
206 [SDCC3] = {
207 .pad_data = &mmc_pad_data[SDCC3],
208 },
209};
210
Subhash Jadavani55e188e2012-04-13 11:31:08 +0530211#define MSM_MPM_PIN_SDC1_DAT1 17
212#define MSM_MPM_PIN_SDC3_DAT1 21
213
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800214static unsigned int sdc1_sup_clk_rates[] = {
Krishna Kondad4f88122012-02-17 18:43:52 -0800215 400000, 24000000, 48000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800216};
217
Terence Hampson2e1705f2012-04-11 19:55:29 -0400218#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800219static unsigned int sdc3_sup_clk_rates[] = {
Krishna Kondad4f88122012-02-17 18:43:52 -0800220 400000, 24000000, 48000000, 96000000, 192000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800221};
Terence Hampson2e1705f2012-04-11 19:55:29 -0400222#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800223
224#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
225static struct mmc_platform_data msm8960_sdc1_data = {
226 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
227#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT
228 .mmc_bus_width = MMC_CAP_8_BIT_DATA,
229#else
230 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
231#endif
232 .sup_clk_table = sdc1_sup_clk_rates,
233 .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates),
234 .pclk_src_dfab = 1,
235 .nonremovable = 1,
236 .vreg_data = &mmc_slot_vreg_data[SDCC1],
Subhash Jadavani55e188e2012-04-13 11:31:08 +0530237 .pin_data = &mmc_slot_pin_data[SDCC1],
238 .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
Subhash Jadavanibcd435f2012-04-24 18:26:49 +0530239 .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800240};
241#endif
242
243#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
244static struct mmc_platform_data msm8960_sdc3_data = {
245 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
246 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
247 .sup_clk_table = sdc3_sup_clk_rates,
248 .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates),
249 .pclk_src_dfab = 1,
250#ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT
Jay Chokshi06fa7542011-12-07 13:09:17 -0800251/*TODO: Insert right replacement for PM8038 */
252#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800253 .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16),
Krishna Konda40ec7e92011-12-20 19:28:25 -0800254#else
255 .wpswitch_gpio = 66,
Krishna Kondabd3480f2012-03-29 13:59:22 -0700256 .wpswitch_polarity = 1,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800257#endif
Jay Chokshi06fa7542011-12-07 13:09:17 -0800258#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800259 .vreg_data = &mmc_slot_vreg_data[SDCC3],
260 .pin_data = &mmc_slot_pin_data[SDCC3],
261#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION
Jay Chokshi06fa7542011-12-07 13:09:17 -0800262/*TODO: Insert right replacement for PM8038 */
263#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800264 .status_gpio = PM8921_GPIO_PM_TO_SYS(26),
265 .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26),
Krishna Konda40ec7e92011-12-20 19:28:25 -0800266#else
267 .status_gpio = 94,
268 .status_irq = MSM_GPIO_TO_INT(94),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800269#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800270 .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
Krishna Konda941604a2012-01-10 17:46:34 -0800271 .is_status_gpio_active_low = true,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800272#endif
273 .xpc_cap = 1,
274 .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
275 MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
Krishna Kondad4f88122012-02-17 18:43:52 -0800276 MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_800),
Subhash Jadavani55e188e2012-04-13 11:31:08 +0530277 .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
Subhash Jadavanibcd435f2012-04-24 18:26:49 +0530278 .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800279};
280#endif
281
282void __init msm8930_init_mmc(void)
283{
284#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
285 /* SDC1 : eMMC card connected */
286 msm_add_sdcc(1, &msm8960_sdc1_data);
287#endif
288#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
289 /* SDC3: External card slot */
Krishna Kondafb2b1982012-05-15 20:32:26 -0700290 if (!machine_is_msm8930_cdp()) {
291 msm8960_sdc3_data.wpswitch_gpio = 0;
292 msm8960_sdc3_data.wpswitch_polarity = 0;
293 }
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800294 msm_add_sdcc(3, &msm8960_sdc3_data);
295#endif
296}