blob: 83fb5fd05d2291d0af90e1254e6459deef532d7e [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"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080027
28/* MSM8960 has 5 SDCC controllers */
29enum sdcc_controllers {
30 SDCC1,
31 SDCC2,
32 SDCC3,
33 SDCC4,
34 SDCC5,
35 MAX_SDCC_CONTROLLER
36};
37
38/* All SDCC controllers require VDD/VCC voltage */
39static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = {
40 /* SDCC1 : eMMC card connected */
41 [SDCC1] = {
42 .name = "sdc_vdd",
43 .high_vol_level = 2950000,
44 .low_vol_level = 2950000,
45 .always_on = 1,
46 .lpm_sup = 1,
47 .lpm_uA = 9000,
48 .hpm_uA = 200000, /* 200mA */
49 },
50 /* SDCC3 : External card slot connected */
51 [SDCC3] = {
52 .name = "sdc_vdd",
53 .high_vol_level = 2950000,
54 .low_vol_level = 2950000,
Krishna Kondad4f88122012-02-17 18:43:52 -080055 .hpm_uA = 800000, /* 800mA */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080056 }
57};
58
59/* Only slots having eMMC card will require VCCQ voltage */
60static struct msm_mmc_reg_data mmc_vccq_reg_data[1] = {
61 /* SDCC1 : eMMC card connected */
62 [SDCC1] = {
63 .name = "sdc_vccq",
64 .always_on = 1,
65 .high_vol_level = 1800000,
66 .low_vol_level = 1800000,
67 .hpm_uA = 200000, /* 200mA */
68 }
69};
70
71/* All SDCC controllers may require voting for VDD PAD voltage */
72static struct msm_mmc_reg_data mmc_vddp_reg_data[MAX_SDCC_CONTROLLER] = {
73 /* SDCC3 : External card slot connected */
74 [SDCC3] = {
75 .name = "sdc_vddp",
76 .high_vol_level = 2950000,
77 .low_vol_level = 1850000,
78 .always_on = 1,
79 .lpm_sup = 1,
80 /* Max. Active current required is 16 mA */
81 .hpm_uA = 16000,
82 /*
83 * Sleep current required is ~300 uA. But min. vote can be
84 * in terms of mA (min. 1 mA). So let's vote for 2 mA
85 * during sleep.
86 */
87 .lpm_uA = 2000,
88 }
89};
90
91static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = {
92 /* SDCC1 : eMMC card connected */
93 [SDCC1] = {
94 .vdd_data = &mmc_vdd_reg_data[SDCC1],
95 .vccq_data = &mmc_vccq_reg_data[SDCC1],
96 },
97 /* SDCC3 : External card slot connected */
98 [SDCC3] = {
99 .vdd_data = &mmc_vdd_reg_data[SDCC3],
100 .vddp_data = &mmc_vddp_reg_data[SDCC3],
101 }
102};
103
104/* SDC1 pad data */
105static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = {
106 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA},
107 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA},
108 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA}
109};
110
111static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = {
112 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA},
113 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA},
114 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA}
115};
116
117static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = {
118 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
119 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
120 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
121};
122
123static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = {
124 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
Krishna Kondacf10b9f2012-02-17 19:22:39 -0800125 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
126 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800127};
128
129/* SDC3 pad data */
130static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = {
131 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA},
132 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA},
133 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA}
134};
135
136static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = {
137 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA},
138 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA},
139 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA}
140};
141
142static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = {
143 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
144 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
145 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
146};
147
148static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = {
149 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
150 /*
151 * SDC3 CMD line should be PULLed UP otherwise fluid platform will
152 * see transitions (1 -> 0 and 0 -> 1) on card detection line,
153 * which would result in false card detection interrupts.
154 */
155 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
156 /*
157 * Keeping DATA lines status to PULL UP will make sure that
158 * there is no current leak during sleep if external pull up
159 * is connected to DATA lines.
160 */
161 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
162};
163
164static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = {
165 [SDCC1] = {
166 .on = sdc1_pad_pull_on_cfg,
167 .off = sdc1_pad_pull_off_cfg,
168 .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg)
169 },
170 [SDCC3] = {
171 .on = sdc3_pad_pull_on_cfg,
172 .off = sdc3_pad_pull_off_cfg,
173 .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg)
174 },
175};
176
177static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = {
178 [SDCC1] = {
179 .on = sdc1_pad_drv_on_cfg,
180 .off = sdc1_pad_drv_off_cfg,
181 .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg)
182 },
183 [SDCC3] = {
184 .on = sdc3_pad_drv_on_cfg,
185 .off = sdc3_pad_drv_off_cfg,
186 .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg)
187 },
188};
189
190static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = {
191 [SDCC1] = {
192 .pull = &mmc_pad_pull_data[SDCC1],
193 .drv = &mmc_pad_drv_data[SDCC1]
194 },
195 [SDCC3] = {
196 .pull = &mmc_pad_pull_data[SDCC3],
197 .drv = &mmc_pad_drv_data[SDCC3]
198 },
199};
200
201static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = {
202 [SDCC1] = {
203 .pad_data = &mmc_pad_data[SDCC1],
204 },
205 [SDCC3] = {
206 .pad_data = &mmc_pad_data[SDCC3],
207 },
208};
209
210static unsigned int sdc1_sup_clk_rates[] = {
Krishna Kondad4f88122012-02-17 18:43:52 -0800211 400000, 24000000, 48000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800212};
213
214static unsigned int sdc3_sup_clk_rates[] = {
Krishna Kondad4f88122012-02-17 18:43:52 -0800215 400000, 24000000, 48000000, 96000000, 192000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800216};
217
218#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
219static struct mmc_platform_data msm8960_sdc1_data = {
220 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
221#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT
222 .mmc_bus_width = MMC_CAP_8_BIT_DATA,
223#else
224 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
225#endif
226 .sup_clk_table = sdc1_sup_clk_rates,
227 .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates),
228 .pclk_src_dfab = 1,
229 .nonremovable = 1,
230 .vreg_data = &mmc_slot_vreg_data[SDCC1],
231 .pin_data = &mmc_slot_pin_data[SDCC1]
232};
233#endif
234
235#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
236static struct mmc_platform_data msm8960_sdc3_data = {
237 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
238 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
239 .sup_clk_table = sdc3_sup_clk_rates,
240 .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates),
241 .pclk_src_dfab = 1,
242#ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT
Jay Chokshi06fa7542011-12-07 13:09:17 -0800243/*TODO: Insert right replacement for PM8038 */
244#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800245 .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16),
Krishna Konda40ec7e92011-12-20 19:28:25 -0800246#else
247 .wpswitch_gpio = 66,
Krishna Kondabd3480f2012-03-29 13:59:22 -0700248 .wpswitch_polarity = 1,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800249#endif
Jay Chokshi06fa7542011-12-07 13:09:17 -0800250#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800251 .vreg_data = &mmc_slot_vreg_data[SDCC3],
252 .pin_data = &mmc_slot_pin_data[SDCC3],
253#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION
Jay Chokshi06fa7542011-12-07 13:09:17 -0800254/*TODO: Insert right replacement for PM8038 */
255#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800256 .status_gpio = PM8921_GPIO_PM_TO_SYS(26),
257 .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26),
Krishna Konda40ec7e92011-12-20 19:28:25 -0800258#else
259 .status_gpio = 94,
260 .status_irq = MSM_GPIO_TO_INT(94),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800261#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800262 .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
Krishna Konda941604a2012-01-10 17:46:34 -0800263 .is_status_gpio_active_low = true,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800264#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 |
Krishna Kondad4f88122012-02-17 18:43:52 -0800268 MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_800),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800269};
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}