blob: e38f877201d89e867a90f76db0ebb06531f9c16f [file] [log] [blame]
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001/* 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
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
26/* TODO: Remove this once PM8038 physically becomes
27 * available.
28 */
29#ifndef MSM8930_PHASE_2
30#include "board-8960.h"
31#else
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080032#include "board-8930.h"
Jay Chokshi06fa7542011-12-07 13:09:17 -080033#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080034
35/* MSM8960 has 5 SDCC controllers */
36enum sdcc_controllers {
37 SDCC1,
38 SDCC2,
39 SDCC3,
40 SDCC4,
41 SDCC5,
42 MAX_SDCC_CONTROLLER
43};
44
45/* All SDCC controllers require VDD/VCC voltage */
46static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = {
47 /* SDCC1 : eMMC card connected */
48 [SDCC1] = {
49 .name = "sdc_vdd",
50 .high_vol_level = 2950000,
51 .low_vol_level = 2950000,
52 .always_on = 1,
53 .lpm_sup = 1,
54 .lpm_uA = 9000,
55 .hpm_uA = 200000, /* 200mA */
56 },
57 /* SDCC3 : External card slot connected */
58 [SDCC3] = {
59 .name = "sdc_vdd",
60 .high_vol_level = 2950000,
61 .low_vol_level = 2950000,
62 .hpm_uA = 600000, /* 600mA */
63 }
64};
65
66/* Only slots having eMMC card will require VCCQ voltage */
67static struct msm_mmc_reg_data mmc_vccq_reg_data[1] = {
68 /* SDCC1 : eMMC card connected */
69 [SDCC1] = {
70 .name = "sdc_vccq",
71 .always_on = 1,
72 .high_vol_level = 1800000,
73 .low_vol_level = 1800000,
74 .hpm_uA = 200000, /* 200mA */
75 }
76};
77
78/* All SDCC controllers may require voting for VDD PAD voltage */
79static struct msm_mmc_reg_data mmc_vddp_reg_data[MAX_SDCC_CONTROLLER] = {
80 /* SDCC3 : External card slot connected */
81 [SDCC3] = {
82 .name = "sdc_vddp",
83 .high_vol_level = 2950000,
84 .low_vol_level = 1850000,
85 .always_on = 1,
86 .lpm_sup = 1,
87 /* Max. Active current required is 16 mA */
88 .hpm_uA = 16000,
89 /*
90 * Sleep current required is ~300 uA. But min. vote can be
91 * in terms of mA (min. 1 mA). So let's vote for 2 mA
92 * during sleep.
93 */
94 .lpm_uA = 2000,
95 }
96};
97
98static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = {
99 /* SDCC1 : eMMC card connected */
100 [SDCC1] = {
101 .vdd_data = &mmc_vdd_reg_data[SDCC1],
102 .vccq_data = &mmc_vccq_reg_data[SDCC1],
103 },
104 /* SDCC3 : External card slot connected */
105 [SDCC3] = {
106 .vdd_data = &mmc_vdd_reg_data[SDCC3],
107 .vddp_data = &mmc_vddp_reg_data[SDCC3],
108 }
109};
110
111/* SDC1 pad data */
112static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = {
113 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA},
114 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA},
115 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA}
116};
117
118static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = {
119 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA},
120 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA},
121 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA}
122};
123
124static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = {
125 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
126 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
127 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
128};
129
130static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = {
131 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
132 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_DOWN},
133 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_DOWN}
134};
135
136/* SDC3 pad data */
137static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = {
138 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA},
139 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA},
140 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA}
141};
142
143static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = {
144 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA},
145 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA},
146 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA}
147};
148
149static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = {
150 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
151 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
152 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
153};
154
155static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = {
156 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
157 /*
158 * SDC3 CMD line should be PULLed UP otherwise fluid platform will
159 * see transitions (1 -> 0 and 0 -> 1) on card detection line,
160 * which would result in false card detection interrupts.
161 */
162 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
163 /*
164 * Keeping DATA lines status to PULL UP will make sure that
165 * there is no current leak during sleep if external pull up
166 * is connected to DATA lines.
167 */
168 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
169};
170
171static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = {
172 [SDCC1] = {
173 .on = sdc1_pad_pull_on_cfg,
174 .off = sdc1_pad_pull_off_cfg,
175 .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg)
176 },
177 [SDCC3] = {
178 .on = sdc3_pad_pull_on_cfg,
179 .off = sdc3_pad_pull_off_cfg,
180 .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg)
181 },
182};
183
184static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = {
185 [SDCC1] = {
186 .on = sdc1_pad_drv_on_cfg,
187 .off = sdc1_pad_drv_off_cfg,
188 .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg)
189 },
190 [SDCC3] = {
191 .on = sdc3_pad_drv_on_cfg,
192 .off = sdc3_pad_drv_off_cfg,
193 .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg)
194 },
195};
196
197static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = {
198 [SDCC1] = {
199 .pull = &mmc_pad_pull_data[SDCC1],
200 .drv = &mmc_pad_drv_data[SDCC1]
201 },
202 [SDCC3] = {
203 .pull = &mmc_pad_pull_data[SDCC3],
204 .drv = &mmc_pad_drv_data[SDCC3]
205 },
206};
207
208static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = {
209 [SDCC1] = {
210 .pad_data = &mmc_pad_data[SDCC1],
211 },
212 [SDCC3] = {
213 .pad_data = &mmc_pad_data[SDCC3],
214 },
215};
216
217static unsigned int sdc1_sup_clk_rates[] = {
218 400000, 24000000, 48000000
219};
220
221static unsigned int sdc3_sup_clk_rates[] = {
222 400000, 24000000, 48000000, 96000000
223};
224
225#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
226static struct mmc_platform_data msm8960_sdc1_data = {
227 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
228#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT
229 .mmc_bus_width = MMC_CAP_8_BIT_DATA,
230#else
231 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
232#endif
233 .sup_clk_table = sdc1_sup_clk_rates,
234 .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates),
235 .pclk_src_dfab = 1,
236 .nonremovable = 1,
237 .vreg_data = &mmc_slot_vreg_data[SDCC1],
238 .pin_data = &mmc_slot_pin_data[SDCC1]
239};
240#endif
241
242#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
243static struct mmc_platform_data msm8960_sdc3_data = {
244 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
245 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
246 .sup_clk_table = sdc3_sup_clk_rates,
247 .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates),
248 .pclk_src_dfab = 1,
249#ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT
Jay Chokshi06fa7542011-12-07 13:09:17 -0800250/*TODO: Insert right replacement for PM8038 */
251#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800252 .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16),
253#endif
Jay Chokshi06fa7542011-12-07 13:09:17 -0800254#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800255 .vreg_data = &mmc_slot_vreg_data[SDCC3],
256 .pin_data = &mmc_slot_pin_data[SDCC3],
257#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION
Jay Chokshi06fa7542011-12-07 13:09:17 -0800258/*TODO: Insert right replacement for PM8038 */
259#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800260 .status_gpio = PM8921_GPIO_PM_TO_SYS(26),
261 .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800262#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800263 .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
264#endif
265 .xpc_cap = 1,
266 .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
267 MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
268 MMC_CAP_MAX_CURRENT_600)
269};
270#endif
271
272void __init msm8930_init_mmc(void)
273{
274#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
275 /* SDC1 : eMMC card connected */
276 msm_add_sdcc(1, &msm8960_sdc1_data);
277#endif
278#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
279 /* SDC3: External card slot */
280 msm_add_sdcc(3, &msm8960_sdc3_data);
281#endif
282}