blob: 7280b22582ebfbbb60ff48f84e350e61f75554fa [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>
Steve Mucklef132c6c2012-06-06 18:30:57 -070018#include <linux/gpio.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080019#include <asm/mach-types.h>
20#include <asm/mach/mmc.h>
21#include <mach/msm_bus_board.h>
22#include <mach/board.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080023#include <mach/gpiomux.h>
Krishna Kondae9cb4b82012-07-02 14:42:59 -070024#include <mach/socinfo.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080025#include "devices.h"
Jay Chokshi06fa7542011-12-07 13:09:17 -080026
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080027#include "board-8930.h"
Subhash Jadavanibcd435f2012-04-24 18:26:49 +053028#include "board-storage-common-a.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080029
30/* MSM8960 has 5 SDCC controllers */
31enum sdcc_controllers {
32 SDCC1,
33 SDCC2,
34 SDCC3,
35 SDCC4,
36 SDCC5,
37 MAX_SDCC_CONTROLLER
38};
39
40/* All SDCC controllers require VDD/VCC voltage */
41static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = {
42 /* SDCC1 : eMMC card connected */
43 [SDCC1] = {
44 .name = "sdc_vdd",
45 .high_vol_level = 2950000,
46 .low_vol_level = 2950000,
47 .always_on = 1,
48 .lpm_sup = 1,
49 .lpm_uA = 9000,
50 .hpm_uA = 200000, /* 200mA */
51 },
52 /* SDCC3 : External card slot connected */
53 [SDCC3] = {
54 .name = "sdc_vdd",
55 .high_vol_level = 2950000,
56 .low_vol_level = 2950000,
Krishna Konda41b6ab02012-05-16 15:08:03 -070057 /*
58 * Normally this is not an always ON regulator. On this
59 * platform, unfortunately the sd detect line is connected
60 * to this via esd circuit and so turn this off/on while card
61 * is not present causes the sd detect line to toggle
62 * continuously. This is expected to be fixed in the newer
63 * hardware revisions - maybe once that is done, this can be
64 * reverted.
65 */
66 .always_on = 1,
67 .lpm_sup = 1,
Krishna Kondad4f88122012-02-17 18:43:52 -080068 .hpm_uA = 800000, /* 800mA */
Krishna Konda41b6ab02012-05-16 15:08:03 -070069 .lpm_uA = 9000,
Krishna Konda3c4142d2012-06-27 11:01:56 -070070 .reset_at_init = true,
71 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080072};
73
Subhash Jadavani937c7502012-06-01 15:34:46 +053074/* All SDCC controllers may require voting for VDD PAD voltage */
75static struct msm_mmc_reg_data mmc_vdd_io_reg_data[MAX_SDCC_CONTROLLER] = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080076 /* SDCC1 : eMMC card connected */
77 [SDCC1] = {
Subhash Jadavani937c7502012-06-01 15:34:46 +053078 .name = "sdc_vdd_io",
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080079 .always_on = 1,
80 .high_vol_level = 1800000,
81 .low_vol_level = 1800000,
82 .hpm_uA = 200000, /* 200mA */
Subhash Jadavani937c7502012-06-01 15:34:46 +053083 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080084 /* SDCC3 : External card slot connected */
85 [SDCC3] = {
Subhash Jadavani937c7502012-06-01 15:34:46 +053086 .name = "sdc_vdd_io",
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080087 .high_vol_level = 2950000,
88 .low_vol_level = 1850000,
89 .always_on = 1,
90 .lpm_sup = 1,
91 /* Max. Active current required is 16 mA */
92 .hpm_uA = 16000,
93 /*
94 * Sleep current required is ~300 uA. But min. vote can be
95 * in terms of mA (min. 1 mA). So let's vote for 2 mA
96 * during sleep.
97 */
98 .lpm_uA = 2000,
99 }
100};
101
102static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = {
103 /* SDCC1 : eMMC card connected */
104 [SDCC1] = {
105 .vdd_data = &mmc_vdd_reg_data[SDCC1],
Subhash Jadavani937c7502012-06-01 15:34:46 +0530106 .vdd_io_data = &mmc_vdd_io_reg_data[SDCC1],
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800107 },
108 /* SDCC3 : External card slot connected */
109 [SDCC3] = {
110 .vdd_data = &mmc_vdd_reg_data[SDCC3],
Subhash Jadavani937c7502012-06-01 15:34:46 +0530111 .vdd_io_data = &mmc_vdd_io_reg_data[SDCC3],
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800112 }
113};
114
115/* SDC1 pad data */
116static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = {
117 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA},
118 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA},
119 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA}
120};
121
122static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = {
123 {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA},
124 {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA},
125 {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA}
126};
127
128static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = {
129 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
130 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
131 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
132};
133
134static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = {
135 {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
Krishna Kondacf10b9f2012-02-17 19:22:39 -0800136 {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
137 {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800138};
139
140/* SDC3 pad data */
141static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = {
142 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA},
143 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA},
144 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA}
145};
146
147static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = {
148 {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA},
149 {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA},
150 {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA}
151};
152
153static struct msm_mmc_pad_pull sdc3_pad_pull_on_cfg[] = {
154 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
155 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
156 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
157};
158
159static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = {
160 {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
161 /*
162 * SDC3 CMD line should be PULLed UP otherwise fluid platform will
163 * see transitions (1 -> 0 and 0 -> 1) on card detection line,
164 * which would result in false card detection interrupts.
165 */
166 {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
167 /*
168 * Keeping DATA lines status to PULL UP will make sure that
169 * there is no current leak during sleep if external pull up
170 * is connected to DATA lines.
171 */
172 {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
173};
174
175static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = {
176 [SDCC1] = {
177 .on = sdc1_pad_pull_on_cfg,
178 .off = sdc1_pad_pull_off_cfg,
179 .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg)
180 },
181 [SDCC3] = {
182 .on = sdc3_pad_pull_on_cfg,
183 .off = sdc3_pad_pull_off_cfg,
184 .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg)
185 },
186};
187
188static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = {
189 [SDCC1] = {
190 .on = sdc1_pad_drv_on_cfg,
191 .off = sdc1_pad_drv_off_cfg,
192 .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg)
193 },
194 [SDCC3] = {
195 .on = sdc3_pad_drv_on_cfg,
196 .off = sdc3_pad_drv_off_cfg,
197 .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg)
198 },
199};
200
201static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = {
202 [SDCC1] = {
203 .pull = &mmc_pad_pull_data[SDCC1],
204 .drv = &mmc_pad_drv_data[SDCC1]
205 },
206 [SDCC3] = {
207 .pull = &mmc_pad_pull_data[SDCC3],
208 .drv = &mmc_pad_drv_data[SDCC3]
209 },
210};
211
212static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = {
213 [SDCC1] = {
214 .pad_data = &mmc_pad_data[SDCC1],
215 },
216 [SDCC3] = {
217 .pad_data = &mmc_pad_data[SDCC3],
218 },
219};
220
Subhash Jadavani55e188e2012-04-13 11:31:08 +0530221#define MSM_MPM_PIN_SDC1_DAT1 17
222#define MSM_MPM_PIN_SDC3_DAT1 21
223
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800224static unsigned int sdc1_sup_clk_rates[] = {
Subhash Jadavani871b1a82012-06-14 16:08:38 +0530225 400000, 24000000, 48000000, 96000000
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800226};
227
Terence Hampson2e1705f2012-04-11 19:55:29 -0400228#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800229static unsigned int sdc3_sup_clk_rates[] = {
Krishna Kondad4f88122012-02-17 18:43:52 -0800230 400000, 24000000, 48000000, 96000000, 192000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800231};
Terence Hampson2e1705f2012-04-11 19:55:29 -0400232#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800233
234#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
235static struct mmc_platform_data msm8960_sdc1_data = {
236 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
237#ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT
238 .mmc_bus_width = MMC_CAP_8_BIT_DATA,
239#else
240 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
241#endif
242 .sup_clk_table = sdc1_sup_clk_rates,
243 .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800244 .nonremovable = 1,
245 .vreg_data = &mmc_slot_vreg_data[SDCC1],
Subhash Jadavani55e188e2012-04-13 11:31:08 +0530246 .pin_data = &mmc_slot_pin_data[SDCC1],
247 .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
Subhash Jadavanibcd435f2012-04-24 18:26:49 +0530248 .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
Subhash Jadavanicb6f9ce2012-06-26 11:57:10 +0530249 .uhs_caps2 = MMC_CAP2_HS200_1_8V_SDR,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800250};
251#endif
252
253#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
254static struct mmc_platform_data msm8960_sdc3_data = {
255 .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
256 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
257 .sup_clk_table = sdc3_sup_clk_rates,
258 .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800259#ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT
Jay Chokshi06fa7542011-12-07 13:09:17 -0800260/*TODO: Insert right replacement for PM8038 */
261#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800262 .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16),
Krishna Konda40ec7e92011-12-20 19:28:25 -0800263#else
264 .wpswitch_gpio = 66,
Sujit Reddy Thumma8f912ea2012-06-22 16:18:43 +0530265 .is_wpswitch_active_low = true,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800266#endif
Jay Chokshi06fa7542011-12-07 13:09:17 -0800267#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800268 .vreg_data = &mmc_slot_vreg_data[SDCC3],
269 .pin_data = &mmc_slot_pin_data[SDCC3],
Jay Chokshi06fa7542011-12-07 13:09:17 -0800270/*TODO: Insert right replacement for PM8038 */
271#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800272 .status_gpio = PM8921_GPIO_PM_TO_SYS(26),
273 .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26),
Krishna Konda40ec7e92011-12-20 19:28:25 -0800274#else
275 .status_gpio = 94,
276 .status_irq = MSM_GPIO_TO_INT(94),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800277#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800278 .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
Krishna Konda941604a2012-01-10 17:46:34 -0800279 .is_status_gpio_active_low = true,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800280 .xpc_cap = 1,
281 .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
282 MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
Krishna Kondad4f88122012-02-17 18:43:52 -0800283 MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_800),
Subhash Jadavani55e188e2012-04-13 11:31:08 +0530284 .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
Subhash Jadavanibcd435f2012-04-24 18:26:49 +0530285 .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800286};
287#endif
288
289void __init msm8930_init_mmc(void)
290{
291#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
Subhash Jadavani871b1a82012-06-14 16:08:38 +0530292 /*
293 * When eMMC runs in DDR mode on CDP platform, we have
294 * seen instability due to DATA CRC errors. These errors are
295 * attributed to long physical path between MSM and eMMC on CDP.
296 * So let's not enable the DDR mode on CDP platform but let other
297 * platforms take advantage of eMMC DDR mode.
298 */
299 if (!machine_is_msm8930_cdp())
300 msm8960_sdc1_data.uhs_caps |= (MMC_CAP_1_8V_DDR |
301 MMC_CAP_UHS_DDR50);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800302 /* SDC1 : eMMC card connected */
303 msm_add_sdcc(1, &msm8960_sdc1_data);
304#endif
305#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
Krishna Kondae9cb4b82012-07-02 14:42:59 -0700306 /*
307 * All 8930 platform boards using the 1.2 SoC have been reworked so that
308 * the sd card detect line's esd circuit is no longer powered by the sd
309 * card's voltage regulator. So this means we can turn the regulator off
310 * to save power without affecting the sd card detect functionality.
311 * This change to the boards will be true for newer versions of the SoC
312 * as well.
313 */
314 if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) >= 1 &&
315 SOCINFO_VERSION_MINOR(socinfo_get_version()) >= 2) ||
316 machine_is_msm8930_cdp()) {
317 msm8960_sdc3_data.vreg_data->vdd_data->always_on = false;
318 msm8960_sdc3_data.vreg_data->vdd_data->reset_at_init = false;
319 }
320
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800321 /* SDC3: External card slot */
Krishna Kondafb2b1982012-05-15 20:32:26 -0700322 if (!machine_is_msm8930_cdp()) {
323 msm8960_sdc3_data.wpswitch_gpio = 0;
Sujit Reddy Thumma8f912ea2012-06-22 16:18:43 +0530324 msm8960_sdc3_data.is_wpswitch_active_low = false;
Krishna Kondafb2b1982012-05-15 20:32:26 -0700325 }
Krishna Kondae9cb4b82012-07-02 14:42:59 -0700326
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800327 msm_add_sdcc(3, &msm8960_sdc3_data);
328#endif
329}