mmc-twl4030.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /*
  2. * linux/arch/arm/mach-omap2/mmc-twl4030.c
  3. *
  4. * Copyright (C) 2007-2008 Texas Instruments
  5. * Copyright (C) 2008 Nokia Corporation
  6. * Author: Texas Instruments
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/err.h>
  13. #include <linux/io.h>
  14. #include <linux/module.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/delay.h>
  18. #include <linux/gpio.h>
  19. #include <linux/i2c/twl4030.h>
  20. #include <mach/hardware.h>
  21. #include <mach/control.h>
  22. #include <mach/mmc.h>
  23. #include <mach/board.h>
  24. #include "mmc-twl4030.h"
  25. #if defined(CONFIG_TWL4030_CORE) && \
  26. (defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE))
  27. #define LDO_CLR 0x00
  28. #define VSEL_S2_CLR 0x40
  29. #define VMMC1_DEV_GRP 0x27
  30. #define VMMC1_CLR 0x00
  31. #define VMMC1_315V 0x03
  32. #define VMMC1_300V 0x02
  33. #define VMMC1_285V 0x01
  34. #define VMMC1_185V 0x00
  35. #define VMMC1_DEDICATED 0x2A
  36. #define VMMC2_DEV_GRP 0x2B
  37. #define VMMC2_CLR 0x40
  38. #define VMMC2_315V 0x0c
  39. #define VMMC2_300V 0x0b
  40. #define VMMC2_285V 0x0a
  41. #define VMMC2_260V 0x08
  42. #define VMMC2_185V 0x06
  43. #define VMMC2_DEDICATED 0x2E
  44. #define VMMC_DEV_GRP_P1 0x20
  45. static u16 control_pbias_offset;
  46. static u16 control_devconf1_offset;
  47. #define HSMMC_NAME_LEN 9
  48. static struct twl_mmc_controller {
  49. struct omap_mmc_platform_data *mmc;
  50. u8 twl_vmmc_dev_grp;
  51. u8 twl_mmc_dedicated;
  52. char name[HSMMC_NAME_LEN];
  53. } hsmmc[] = {
  54. {
  55. .twl_vmmc_dev_grp = VMMC1_DEV_GRP,
  56. .twl_mmc_dedicated = VMMC1_DEDICATED,
  57. },
  58. {
  59. .twl_vmmc_dev_grp = VMMC2_DEV_GRP,
  60. .twl_mmc_dedicated = VMMC2_DEDICATED,
  61. },
  62. };
  63. static int twl_mmc_card_detect(int irq)
  64. {
  65. unsigned i;
  66. for (i = 0; i < ARRAY_SIZE(hsmmc); i++) {
  67. struct omap_mmc_platform_data *mmc;
  68. mmc = hsmmc[i].mmc;
  69. if (!mmc)
  70. continue;
  71. if (irq != mmc->slots[0].card_detect_irq)
  72. continue;
  73. /* NOTE: assumes card detect signal is active-low */
  74. return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
  75. }
  76. return -ENOSYS;
  77. }
  78. static int twl_mmc_get_ro(struct device *dev, int slot)
  79. {
  80. struct omap_mmc_platform_data *mmc = dev->platform_data;
  81. /* NOTE: assumes write protect signal is active-high */
  82. return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
  83. }
  84. /*
  85. * MMC Slot Initialization.
  86. */
  87. static int twl_mmc_late_init(struct device *dev)
  88. {
  89. struct omap_mmc_platform_data *mmc = dev->platform_data;
  90. int ret = 0;
  91. int i;
  92. ret = gpio_request(mmc->slots[0].switch_pin, "mmc_cd");
  93. if (ret)
  94. goto done;
  95. ret = gpio_direction_input(mmc->slots[0].switch_pin);
  96. if (ret)
  97. goto err;
  98. for (i = 0; i < ARRAY_SIZE(hsmmc); i++) {
  99. if (hsmmc[i].name == mmc->slots[0].name) {
  100. hsmmc[i].mmc = mmc;
  101. break;
  102. }
  103. }
  104. return 0;
  105. err:
  106. gpio_free(mmc->slots[0].switch_pin);
  107. done:
  108. mmc->slots[0].card_detect_irq = 0;
  109. mmc->slots[0].card_detect = NULL;
  110. dev_err(dev, "err %d configuring card detect\n", ret);
  111. return ret;
  112. }
  113. static void twl_mmc_cleanup(struct device *dev)
  114. {
  115. struct omap_mmc_platform_data *mmc = dev->platform_data;
  116. gpio_free(mmc->slots[0].switch_pin);
  117. }
  118. #ifdef CONFIG_PM
  119. static int twl_mmc_suspend(struct device *dev, int slot)
  120. {
  121. struct omap_mmc_platform_data *mmc = dev->platform_data;
  122. disable_irq(mmc->slots[0].card_detect_irq);
  123. return 0;
  124. }
  125. static int twl_mmc_resume(struct device *dev, int slot)
  126. {
  127. struct omap_mmc_platform_data *mmc = dev->platform_data;
  128. enable_irq(mmc->slots[0].card_detect_irq);
  129. return 0;
  130. }
  131. #else
  132. #define twl_mmc_suspend NULL
  133. #define twl_mmc_resume NULL
  134. #endif
  135. /*
  136. * Sets the MMC voltage in twl4030
  137. */
  138. static int twl_mmc_set_voltage(struct twl_mmc_controller *c, int vdd)
  139. {
  140. int ret;
  141. u8 vmmc, dev_grp_val;
  142. switch (1 << vdd) {
  143. case MMC_VDD_35_36:
  144. case MMC_VDD_34_35:
  145. case MMC_VDD_33_34:
  146. case MMC_VDD_32_33:
  147. case MMC_VDD_31_32:
  148. case MMC_VDD_30_31:
  149. if (c->twl_vmmc_dev_grp == VMMC1_DEV_GRP)
  150. vmmc = VMMC1_315V;
  151. else
  152. vmmc = VMMC2_315V;
  153. break;
  154. case MMC_VDD_29_30:
  155. if (c->twl_vmmc_dev_grp == VMMC1_DEV_GRP)
  156. vmmc = VMMC1_315V;
  157. else
  158. vmmc = VMMC2_300V;
  159. break;
  160. case MMC_VDD_27_28:
  161. case MMC_VDD_26_27:
  162. if (c->twl_vmmc_dev_grp == VMMC1_DEV_GRP)
  163. vmmc = VMMC1_285V;
  164. else
  165. vmmc = VMMC2_285V;
  166. break;
  167. case MMC_VDD_25_26:
  168. case MMC_VDD_24_25:
  169. case MMC_VDD_23_24:
  170. case MMC_VDD_22_23:
  171. case MMC_VDD_21_22:
  172. case MMC_VDD_20_21:
  173. if (c->twl_vmmc_dev_grp == VMMC1_DEV_GRP)
  174. vmmc = VMMC1_285V;
  175. else
  176. vmmc = VMMC2_260V;
  177. break;
  178. case MMC_VDD_165_195:
  179. if (c->twl_vmmc_dev_grp == VMMC1_DEV_GRP)
  180. vmmc = VMMC1_185V;
  181. else
  182. vmmc = VMMC2_185V;
  183. break;
  184. default:
  185. vmmc = 0;
  186. break;
  187. }
  188. if (vmmc)
  189. dev_grp_val = VMMC_DEV_GRP_P1; /* Power up */
  190. else
  191. dev_grp_val = LDO_CLR; /* Power down */
  192. ret = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
  193. dev_grp_val, c->twl_vmmc_dev_grp);
  194. if (ret)
  195. return ret;
  196. ret = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
  197. vmmc, c->twl_mmc_dedicated);
  198. return ret;
  199. }
  200. static int twl_mmc1_set_power(struct device *dev, int slot, int power_on,
  201. int vdd)
  202. {
  203. u32 reg;
  204. int ret = 0;
  205. struct twl_mmc_controller *c = &hsmmc[0];
  206. struct omap_mmc_platform_data *mmc = dev->platform_data;
  207. if (power_on) {
  208. if (cpu_is_omap2430()) {
  209. reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
  210. if ((1 << vdd) >= MMC_VDD_30_31)
  211. reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
  212. else
  213. reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
  214. omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
  215. }
  216. if (mmc->slots[0].internal_clock) {
  217. reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
  218. reg |= OMAP2_MMCSDIO1ADPCLKISEL;
  219. omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
  220. }
  221. reg = omap_ctrl_readl(control_pbias_offset);
  222. reg |= OMAP2_PBIASSPEEDCTRL0;
  223. reg &= ~OMAP2_PBIASLITEPWRDNZ0;
  224. omap_ctrl_writel(reg, control_pbias_offset);
  225. ret = twl_mmc_set_voltage(c, vdd);
  226. /* 100ms delay required for PBIAS configuration */
  227. msleep(100);
  228. reg = omap_ctrl_readl(control_pbias_offset);
  229. reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
  230. if ((1 << vdd) <= MMC_VDD_165_195)
  231. reg &= ~OMAP2_PBIASLITEVMODE0;
  232. else
  233. reg |= OMAP2_PBIASLITEVMODE0;
  234. omap_ctrl_writel(reg, control_pbias_offset);
  235. } else {
  236. reg = omap_ctrl_readl(control_pbias_offset);
  237. reg &= ~OMAP2_PBIASLITEPWRDNZ0;
  238. omap_ctrl_writel(reg, control_pbias_offset);
  239. ret = twl_mmc_set_voltage(c, 0);
  240. /* 100ms delay required for PBIAS configuration */
  241. msleep(100);
  242. reg = omap_ctrl_readl(control_pbias_offset);
  243. reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
  244. OMAP2_PBIASLITEVMODE0);
  245. omap_ctrl_writel(reg, control_pbias_offset);
  246. }
  247. return ret;
  248. }
  249. static int twl_mmc2_set_power(struct device *dev, int slot, int power_on, int vdd)
  250. {
  251. int ret;
  252. struct twl_mmc_controller *c = &hsmmc[1];
  253. struct omap_mmc_platform_data *mmc = dev->platform_data;
  254. if (power_on) {
  255. if (mmc->slots[0].internal_clock) {
  256. u32 reg;
  257. reg = omap_ctrl_readl(control_devconf1_offset);
  258. reg |= OMAP2_MMCSDIO2ADPCLKISEL;
  259. omap_ctrl_writel(reg, control_devconf1_offset);
  260. }
  261. ret = twl_mmc_set_voltage(c, vdd);
  262. } else {
  263. ret = twl_mmc_set_voltage(c, 0);
  264. }
  265. return ret;
  266. }
  267. static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
  268. void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
  269. {
  270. struct twl4030_hsmmc_info *c;
  271. int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
  272. if (cpu_is_omap2430()) {
  273. control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
  274. control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
  275. nr_hsmmc = 2;
  276. } else {
  277. control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
  278. control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
  279. }
  280. for (c = controllers; c->mmc; c++) {
  281. struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
  282. struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
  283. if (!c->mmc || c->mmc > nr_hsmmc) {
  284. pr_debug("MMC%d: no such controller\n", c->mmc);
  285. continue;
  286. }
  287. if (mmc) {
  288. pr_debug("MMC%d: already configured\n", c->mmc);
  289. continue;
  290. }
  291. mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
  292. if (!mmc) {
  293. pr_err("Cannot allocate memory for mmc device!\n");
  294. return;
  295. }
  296. sprintf(twl->name, "mmc%islot%i", c->mmc, 1);
  297. mmc->slots[0].name = twl->name;
  298. mmc->nr_slots = 1;
  299. mmc->slots[0].ocr_mask = MMC_VDD_165_195 |
  300. MMC_VDD_26_27 | MMC_VDD_27_28 |
  301. MMC_VDD_29_30 |
  302. MMC_VDD_30_31 | MMC_VDD_31_32;
  303. mmc->slots[0].wires = c->wires;
  304. mmc->slots[0].internal_clock = !c->ext_clock;
  305. mmc->dma_mask = 0xffffffff;
  306. /* note: twl4030 card detect GPIOs normally switch VMMCx ... */
  307. if (gpio_is_valid(c->gpio_cd)) {
  308. mmc->init = twl_mmc_late_init;
  309. mmc->cleanup = twl_mmc_cleanup;
  310. mmc->suspend = twl_mmc_suspend;
  311. mmc->resume = twl_mmc_resume;
  312. mmc->slots[0].switch_pin = c->gpio_cd;
  313. mmc->slots[0].card_detect_irq = gpio_to_irq(c->gpio_cd);
  314. mmc->slots[0].card_detect = twl_mmc_card_detect;
  315. } else
  316. mmc->slots[0].switch_pin = -EINVAL;
  317. /* write protect normally uses an OMAP gpio */
  318. if (gpio_is_valid(c->gpio_wp)) {
  319. gpio_request(c->gpio_wp, "mmc_wp");
  320. gpio_direction_input(c->gpio_wp);
  321. mmc->slots[0].gpio_wp = c->gpio_wp;
  322. mmc->slots[0].get_ro = twl_mmc_get_ro;
  323. } else
  324. mmc->slots[0].gpio_wp = -EINVAL;
  325. /* NOTE: we assume OMAP's MMC1 and MMC2 use
  326. * the TWL4030's VMMC1 and VMMC2, respectively;
  327. * and that OMAP's MMC3 isn't used.
  328. */
  329. switch (c->mmc) {
  330. case 1:
  331. mmc->slots[0].set_power = twl_mmc1_set_power;
  332. break;
  333. case 2:
  334. mmc->slots[0].set_power = twl_mmc2_set_power;
  335. break;
  336. default:
  337. pr_err("MMC%d configuration not supported!\n", c->mmc);
  338. continue;
  339. }
  340. hsmmc_data[c->mmc - 1] = mmc;
  341. }
  342. omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
  343. }
  344. #endif