board-8960-storage.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. /* Copyright (c) 2011-2012, The Linux Foundation. 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/init.h>
  14. #include <linux/ioport.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/bootmem.h>
  17. #include <linux/gpio.h>
  18. #include <asm/mach-types.h>
  19. #include <asm/mach/mmc.h>
  20. #include <mach/board.h>
  21. #include <mach/gpiomux.h>
  22. #include "devices.h"
  23. #include "board-8960.h"
  24. #include "board-storage-common-a.h"
  25. /* MSM8960 has 5 SDCC controllers */
  26. enum sdcc_controllers {
  27. SDCC1,
  28. SDCC2,
  29. SDCC3,
  30. SDCC4,
  31. SDCC5,
  32. MAX_SDCC_CONTROLLER
  33. };
  34. /* All SDCC controllers require VDD/VCC voltage */
  35. static struct msm_mmc_reg_data mmc_vdd_reg_data[MAX_SDCC_CONTROLLER] = {
  36. /* SDCC1 : eMMC card connected */
  37. [SDCC1] = {
  38. .name = "sdc_vdd",
  39. .high_vol_level = 2950000,
  40. .low_vol_level = 2950000,
  41. .always_on = 1,
  42. .lpm_sup = 1,
  43. .lpm_uA = 9000,
  44. .hpm_uA = 200000, /* 200mA */
  45. },
  46. /* SDCC2 : SDIO slot connected */
  47. [SDCC2] = {
  48. .name = "sdc_vdd",
  49. .high_vol_level = 1800000,
  50. .low_vol_level = 1800000,
  51. .always_on = 1,
  52. .lpm_sup = 1,
  53. .lpm_uA = 9000,
  54. .hpm_uA = 200000, /* 200mA */
  55. },
  56. /* SDCC3 : External card slot connected */
  57. [SDCC3] = {
  58. .name = "sdc_vdd",
  59. .high_vol_level = 2950000,
  60. .low_vol_level = 2950000,
  61. .hpm_uA = 600000, /* 600mA */
  62. }
  63. };
  64. /* SDCC controllers may require voting for IO operating voltage */
  65. static struct msm_mmc_reg_data mmc_vdd_io_reg_data[MAX_SDCC_CONTROLLER] = {
  66. /* SDCC1 : eMMC card connected */
  67. [SDCC1] = {
  68. .name = "sdc_vdd_io",
  69. .always_on = 1,
  70. .high_vol_level = 1800000,
  71. .low_vol_level = 1800000,
  72. .hpm_uA = 200000, /* 200mA */
  73. },
  74. /* SDCC3 : External card slot connected */
  75. [SDCC3] = {
  76. .name = "sdc_vdd_io",
  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. /* SDCC4 : SDIO slot connected */
  91. [SDCC4] = {
  92. .name = "sdc_vdd_io",
  93. .high_vol_level = 1800000,
  94. .low_vol_level = 1800000,
  95. .always_on = 1,
  96. .lpm_sup = 1,
  97. .hpm_uA = 200000, /* 200mA */
  98. .lpm_uA = 2000,
  99. },
  100. };
  101. static struct msm_mmc_slot_reg_data mmc_slot_vreg_data[MAX_SDCC_CONTROLLER] = {
  102. /* SDCC1 : eMMC card connected */
  103. [SDCC1] = {
  104. .vdd_data = &mmc_vdd_reg_data[SDCC1],
  105. .vdd_io_data = &mmc_vdd_io_reg_data[SDCC1],
  106. },
  107. /* SDCC2 : SDIO card slot connected */
  108. [SDCC2] = {
  109. .vdd_data = &mmc_vdd_reg_data[SDCC2],
  110. },
  111. /* SDCC3 : External card slot connected */
  112. [SDCC3] = {
  113. .vdd_data = &mmc_vdd_reg_data[SDCC3],
  114. .vdd_io_data = &mmc_vdd_io_reg_data[SDCC3],
  115. },
  116. /* SDCC4 : SDIO card slot connected */
  117. [SDCC4] = {
  118. .vdd_io_data = &mmc_vdd_io_reg_data[SDCC4],
  119. },
  120. };
  121. /* SDC1 pad data */
  122. static struct msm_mmc_pad_drv sdc1_pad_drv_on_cfg[] = {
  123. {TLMM_HDRV_SDC1_CLK, GPIO_CFG_16MA},
  124. {TLMM_HDRV_SDC1_CMD, GPIO_CFG_10MA},
  125. {TLMM_HDRV_SDC1_DATA, GPIO_CFG_10MA}
  126. };
  127. static struct msm_mmc_pad_drv sdc1_pad_drv_off_cfg[] = {
  128. {TLMM_HDRV_SDC1_CLK, GPIO_CFG_2MA},
  129. {TLMM_HDRV_SDC1_CMD, GPIO_CFG_2MA},
  130. {TLMM_HDRV_SDC1_DATA, GPIO_CFG_2MA}
  131. };
  132. static struct msm_mmc_pad_pull sdc1_pad_pull_on_cfg[] = {
  133. {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
  134. {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
  135. {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
  136. };
  137. static struct msm_mmc_pad_pull sdc1_pad_pull_off_cfg[] = {
  138. {TLMM_PULL_SDC1_CLK, GPIO_CFG_NO_PULL},
  139. {TLMM_PULL_SDC1_CMD, GPIO_CFG_PULL_UP},
  140. {TLMM_PULL_SDC1_DATA, GPIO_CFG_PULL_UP}
  141. };
  142. /* SDC3 pad data */
  143. static struct msm_mmc_pad_drv sdc3_pad_drv_on_cfg[] = {
  144. {TLMM_HDRV_SDC3_CLK, GPIO_CFG_8MA},
  145. {TLMM_HDRV_SDC3_CMD, GPIO_CFG_8MA},
  146. {TLMM_HDRV_SDC3_DATA, GPIO_CFG_8MA}
  147. };
  148. static struct msm_mmc_pad_drv sdc3_pad_drv_off_cfg[] = {
  149. {TLMM_HDRV_SDC3_CLK, GPIO_CFG_2MA},
  150. {TLMM_HDRV_SDC3_CMD, GPIO_CFG_2MA},
  151. {TLMM_HDRV_SDC3_DATA, GPIO_CFG_2MA}
  152. };
  153. static 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. static struct msm_mmc_pad_pull sdc3_pad_pull_off_cfg[] = {
  159. {TLMM_PULL_SDC3_CLK, GPIO_CFG_NO_PULL},
  160. /*
  161. * SDC3 CMD line should be PULLed UP otherwise fluid platform will
  162. * see transitions (1 -> 0 and 0 -> 1) on card detection line,
  163. * which would result in false card detection interrupts.
  164. */
  165. {TLMM_PULL_SDC3_CMD, GPIO_CFG_PULL_UP},
  166. /*
  167. * Keeping DATA lines status to PULL UP will make sure that
  168. * there is no current leak during sleep if external pull up
  169. * is connected to DATA lines.
  170. */
  171. {TLMM_PULL_SDC3_DATA, GPIO_CFG_PULL_UP}
  172. };
  173. static struct msm_mmc_pad_pull_data mmc_pad_pull_data[MAX_SDCC_CONTROLLER] = {
  174. [SDCC1] = {
  175. .on = sdc1_pad_pull_on_cfg,
  176. .off = sdc1_pad_pull_off_cfg,
  177. .size = ARRAY_SIZE(sdc1_pad_pull_on_cfg)
  178. },
  179. [SDCC3] = {
  180. .on = sdc3_pad_pull_on_cfg,
  181. .off = sdc3_pad_pull_off_cfg,
  182. .size = ARRAY_SIZE(sdc3_pad_pull_on_cfg)
  183. },
  184. };
  185. static struct msm_mmc_pad_drv_data mmc_pad_drv_data[MAX_SDCC_CONTROLLER] = {
  186. [SDCC1] = {
  187. .on = sdc1_pad_drv_on_cfg,
  188. .off = sdc1_pad_drv_off_cfg,
  189. .size = ARRAY_SIZE(sdc1_pad_drv_on_cfg)
  190. },
  191. [SDCC3] = {
  192. .on = sdc3_pad_drv_on_cfg,
  193. .off = sdc3_pad_drv_off_cfg,
  194. .size = ARRAY_SIZE(sdc3_pad_drv_on_cfg)
  195. },
  196. };
  197. struct msm_mmc_gpio sdc2_gpio[] = {
  198. {92, "sdc2_dat_3"},
  199. {91, "sdc2_dat_2"},
  200. {90, "sdc2_dat_1"},
  201. {89, "sdc2_dat_0"},
  202. {97, "sdc2_cmd"},
  203. {98, "sdc2_clk"}
  204. };
  205. struct msm_mmc_gpio sdc4_gpio[] = {
  206. {83, "sdc4_dat_3"},
  207. {84, "sdc4_dat_2"},
  208. {85, "sdc4_dat_1"},
  209. {86, "sdc4_dat_0"},
  210. {87, "sdc4_cmd"},
  211. {88, "sdc4_clk"}
  212. };
  213. struct msm_mmc_gpio_data mmc_gpio_data[MAX_SDCC_CONTROLLER] = {
  214. [SDCC2] = {
  215. .gpio = sdc2_gpio,
  216. .size = ARRAY_SIZE(sdc2_gpio),
  217. },
  218. [SDCC4] = {
  219. .gpio = sdc4_gpio,
  220. .size = ARRAY_SIZE(sdc4_gpio),
  221. },
  222. };
  223. static struct msm_mmc_pad_data mmc_pad_data[MAX_SDCC_CONTROLLER] = {
  224. [SDCC1] = {
  225. .pull = &mmc_pad_pull_data[SDCC1],
  226. .drv = &mmc_pad_drv_data[SDCC1]
  227. },
  228. [SDCC3] = {
  229. .pull = &mmc_pad_pull_data[SDCC3],
  230. .drv = &mmc_pad_drv_data[SDCC3]
  231. },
  232. };
  233. static struct msm_mmc_pin_data mmc_slot_pin_data[MAX_SDCC_CONTROLLER] = {
  234. [SDCC1] = {
  235. .pad_data = &mmc_pad_data[SDCC1],
  236. },
  237. [SDCC2] = {
  238. .is_gpio = 1,
  239. .gpio_data = &mmc_gpio_data[SDCC2],
  240. },
  241. [SDCC3] = {
  242. .pad_data = &mmc_pad_data[SDCC3],
  243. },
  244. [SDCC4] = {
  245. .is_gpio = 1,
  246. .gpio_data = &mmc_gpio_data[SDCC4],
  247. },
  248. };
  249. #define MSM_MPM_PIN_SDC1_DAT1 17
  250. #define MSM_MPM_PIN_SDC3_DAT1 21
  251. static unsigned int sdc1_sup_clk_rates[] = {
  252. 400000, 24000000, 48000000, 96000000
  253. };
  254. #ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
  255. static unsigned int sdc3_sup_clk_rates[] = {
  256. 400000, 24000000, 48000000, 96000000, 192000000
  257. };
  258. #endif
  259. #ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
  260. static struct mmc_platform_data msm8960_sdc1_data = {
  261. .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
  262. #ifdef CONFIG_MMC_MSM_SDC1_8_BIT_SUPPORT
  263. .mmc_bus_width = MMC_CAP_8_BIT_DATA,
  264. #else
  265. .mmc_bus_width = MMC_CAP_4_BIT_DATA,
  266. #endif
  267. .sup_clk_table = sdc1_sup_clk_rates,
  268. .sup_clk_cnt = ARRAY_SIZE(sdc1_sup_clk_rates),
  269. .nonremovable = 1,
  270. .vreg_data = &mmc_slot_vreg_data[SDCC1],
  271. .pin_data = &mmc_slot_pin_data[SDCC1],
  272. .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC1_DAT1,
  273. .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
  274. .uhs_caps2 = MMC_CAP2_HS200_1_8V_SDR,
  275. };
  276. #endif
  277. #ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
  278. static unsigned int sdc2_sup_clk_rates[] = {
  279. 400000, 24000000, 48000000
  280. };
  281. static struct mmc_platform_data msm8960_sdc2_data = {
  282. .ocr_mask = MMC_VDD_165_195,
  283. .mmc_bus_width = MMC_CAP_4_BIT_DATA,
  284. .sup_clk_table = sdc2_sup_clk_rates,
  285. .sup_clk_cnt = ARRAY_SIZE(sdc2_sup_clk_rates),
  286. .vreg_data = &mmc_slot_vreg_data[SDCC2],
  287. .pin_data = &mmc_slot_pin_data[SDCC2],
  288. .sdiowakeup_irq = MSM_GPIO_TO_INT(90),
  289. .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
  290. };
  291. #endif
  292. #ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
  293. static struct mmc_platform_data msm8960_sdc3_data = {
  294. .ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
  295. .mmc_bus_width = MMC_CAP_4_BIT_DATA,
  296. .sup_clk_table = sdc3_sup_clk_rates,
  297. .sup_clk_cnt = ARRAY_SIZE(sdc3_sup_clk_rates),
  298. #ifdef CONFIG_MMC_MSM_SDC3_WP_SUPPORT
  299. .wpswitch_gpio = PM8921_GPIO_PM_TO_SYS(16),
  300. #endif
  301. .vreg_data = &mmc_slot_vreg_data[SDCC3],
  302. .pin_data = &mmc_slot_pin_data[SDCC3],
  303. #ifndef CONFIG_MMC_MSM_SDC3_POLLING
  304. .status_gpio = PM8921_GPIO_PM_TO_SYS(26),
  305. .status_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, 26),
  306. .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
  307. #endif
  308. .is_status_gpio_active_low = true,
  309. .xpc_cap = 1,
  310. .uhs_caps = (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 |
  311. MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50 |
  312. MMC_CAP_UHS_SDR104 | MMC_CAP_MAX_CURRENT_600),
  313. .mpm_sdiowakeup_int = MSM_MPM_PIN_SDC3_DAT1,
  314. .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
  315. };
  316. #endif
  317. #ifdef CONFIG_MMC_MSM_SDC4_SUPPORT
  318. static unsigned int sdc4_sup_clk_rates[] = {
  319. 400000, 24000000, 48000000
  320. };
  321. static struct mmc_platform_data msm8960_sdc4_data = {
  322. .ocr_mask = MMC_VDD_165_195,
  323. .mmc_bus_width = MMC_CAP_4_BIT_DATA,
  324. .sup_clk_table = sdc4_sup_clk_rates,
  325. .sup_clk_cnt = ARRAY_SIZE(sdc4_sup_clk_rates),
  326. .vreg_data = &mmc_slot_vreg_data[SDCC4],
  327. .pin_data = &mmc_slot_pin_data[SDCC4],
  328. .sdiowakeup_irq = MSM_GPIO_TO_INT(85),
  329. .msm_bus_voting_data = &sps_to_ddr_bus_voting_data,
  330. };
  331. #endif
  332. void __init msm8960_init_mmc(void)
  333. {
  334. #ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
  335. /*
  336. * When eMMC runs in DDR mode on CDP platform, we have
  337. * seen instability due to DATA CRC errors. These errors are
  338. * attributed to long physical path between MSM and eMMC on CDP.
  339. * So let's not enable the DDR mode on CDP platform but let other
  340. * platforms take advantage of eMMC DDR mode.
  341. */
  342. if (!machine_is_msm8960_cdp())
  343. msm8960_sdc1_data.uhs_caps |= (MMC_CAP_1_8V_DDR |
  344. MMC_CAP_UHS_DDR50);
  345. /* SDC1 : eMMC card connected */
  346. msm_add_sdcc(1, &msm8960_sdc1_data);
  347. #endif
  348. #ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
  349. /* SDC2: SDIO slot for WLAN*/
  350. msm_add_sdcc(2, &msm8960_sdc2_data);
  351. #endif
  352. #ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
  353. /* SDC3: External card slot */
  354. msm_add_sdcc(3, &msm8960_sdc3_data);
  355. #endif
  356. #ifdef CONFIG_MMC_MSM_SDC4_SUPPORT
  357. /* SDC4: SDIO slot for WLAN */
  358. msm_add_sdcc(4, &msm8960_sdc4_data);
  359. #endif
  360. }