mmc.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. /*
  2. * Copyright 2008, Freescale Semiconductor, Inc
  3. * Andy Fleming
  4. *
  5. * Based vaguely on the Linux code
  6. *
  7. * See file CREDITS for list of people who contributed to this
  8. * project.
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License as
  12. * published by the Free Software Foundation; either version 2 of
  13. * the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  23. * MA 02111-1307 USA
  24. */
  25. #include <config.h>
  26. #include <common.h>
  27. #include <command.h>
  28. #include <mmc.h>
  29. #include <part.h>
  30. #include <malloc.h>
  31. #include <linux/list.h>
  32. #include <div64.h>
  33. /* Set block count limit because of 16 bit register limit on some hardware*/
  34. #ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
  35. #define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
  36. #endif
  37. static struct list_head mmc_devices;
  38. static int cur_dev_num = -1;
  39. int __board_mmc_getcd(u8 *cd, struct mmc *mmc) {
  40. return -1;
  41. }
  42. int board_mmc_getcd(u8 *cd, struct mmc *mmc)__attribute__((weak,
  43. alias("__board_mmc_getcd")));
  44. int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
  45. {
  46. return mmc->send_cmd(mmc, cmd, data);
  47. }
  48. int mmc_set_blocklen(struct mmc *mmc, int len)
  49. {
  50. struct mmc_cmd cmd;
  51. cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
  52. cmd.resp_type = MMC_RSP_R1;
  53. cmd.cmdarg = len;
  54. cmd.flags = 0;
  55. return mmc_send_cmd(mmc, &cmd, NULL);
  56. }
  57. struct mmc *find_mmc_device(int dev_num)
  58. {
  59. struct mmc *m;
  60. struct list_head *entry;
  61. list_for_each(entry, &mmc_devices) {
  62. m = list_entry(entry, struct mmc, link);
  63. if (m->block_dev.dev == dev_num)
  64. return m;
  65. }
  66. printf("MMC Device %d not found\n", dev_num);
  67. return NULL;
  68. }
  69. static ulong
  70. mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
  71. {
  72. struct mmc_cmd cmd;
  73. struct mmc_data data;
  74. if ((start + blkcnt) > mmc->block_dev.lba) {
  75. printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
  76. start + blkcnt, mmc->block_dev.lba);
  77. return 0;
  78. }
  79. if (blkcnt > 1)
  80. cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
  81. else
  82. cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
  83. if (mmc->high_capacity)
  84. cmd.cmdarg = start;
  85. else
  86. cmd.cmdarg = start * mmc->write_bl_len;
  87. cmd.resp_type = MMC_RSP_R1;
  88. cmd.flags = 0;
  89. data.src = src;
  90. data.blocks = blkcnt;
  91. data.blocksize = mmc->write_bl_len;
  92. data.flags = MMC_DATA_WRITE;
  93. if (mmc_send_cmd(mmc, &cmd, &data)) {
  94. printf("mmc write failed\n");
  95. return 0;
  96. }
  97. /* SPI multiblock writes terminate using a special
  98. * token, not a STOP_TRANSMISSION request.
  99. */
  100. if (!mmc_host_is_spi(mmc) && blkcnt > 1) {
  101. cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
  102. cmd.cmdarg = 0;
  103. cmd.resp_type = MMC_RSP_R1b;
  104. cmd.flags = 0;
  105. if (mmc_send_cmd(mmc, &cmd, NULL)) {
  106. printf("mmc fail to send stop cmd\n");
  107. return 0;
  108. }
  109. }
  110. return blkcnt;
  111. }
  112. static ulong
  113. mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
  114. {
  115. lbaint_t cur, blocks_todo = blkcnt;
  116. struct mmc *mmc = find_mmc_device(dev_num);
  117. if (!mmc)
  118. return 0;
  119. if (mmc_set_blocklen(mmc, mmc->write_bl_len))
  120. return 0;
  121. do {
  122. cur = (blocks_todo > CONFIG_SYS_MMC_MAX_BLK_COUNT) ?
  123. CONFIG_SYS_MMC_MAX_BLK_COUNT : blocks_todo;
  124. if(mmc_write_blocks(mmc, start, cur, src) != cur)
  125. return 0;
  126. blocks_todo -= cur;
  127. start += cur;
  128. src += cur * mmc->write_bl_len;
  129. } while (blocks_todo > 0);
  130. return blkcnt;
  131. }
  132. int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
  133. {
  134. struct mmc_cmd cmd;
  135. struct mmc_data data;
  136. if (blkcnt > 1)
  137. cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
  138. else
  139. cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
  140. if (mmc->high_capacity)
  141. cmd.cmdarg = start;
  142. else
  143. cmd.cmdarg = start * mmc->read_bl_len;
  144. cmd.resp_type = MMC_RSP_R1;
  145. cmd.flags = 0;
  146. data.dest = dst;
  147. data.blocks = blkcnt;
  148. data.blocksize = mmc->read_bl_len;
  149. data.flags = MMC_DATA_READ;
  150. if (mmc_send_cmd(mmc, &cmd, &data))
  151. return 0;
  152. if (blkcnt > 1) {
  153. cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
  154. cmd.cmdarg = 0;
  155. cmd.resp_type = MMC_RSP_R1b;
  156. cmd.flags = 0;
  157. if (mmc_send_cmd(mmc, &cmd, NULL)) {
  158. printf("mmc fail to send stop cmd\n");
  159. return 0;
  160. }
  161. }
  162. return blkcnt;
  163. }
  164. static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
  165. {
  166. lbaint_t cur, blocks_todo = blkcnt;
  167. if (blkcnt == 0)
  168. return 0;
  169. struct mmc *mmc = find_mmc_device(dev_num);
  170. if (!mmc)
  171. return 0;
  172. if ((start + blkcnt) > mmc->block_dev.lba) {
  173. printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
  174. start + blkcnt, mmc->block_dev.lba);
  175. return 0;
  176. }
  177. if (mmc_set_blocklen(mmc, mmc->read_bl_len))
  178. return 0;
  179. do {
  180. cur = (blocks_todo > CONFIG_SYS_MMC_MAX_BLK_COUNT) ?
  181. CONFIG_SYS_MMC_MAX_BLK_COUNT : blocks_todo;
  182. if(mmc_read_blocks(mmc, dst, start, cur) != cur)
  183. return 0;
  184. blocks_todo -= cur;
  185. start += cur;
  186. dst += cur * mmc->read_bl_len;
  187. } while (blocks_todo > 0);
  188. return blkcnt;
  189. }
  190. int mmc_go_idle(struct mmc* mmc)
  191. {
  192. struct mmc_cmd cmd;
  193. int err;
  194. udelay(1000);
  195. cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
  196. cmd.cmdarg = 0;
  197. cmd.resp_type = MMC_RSP_NONE;
  198. cmd.flags = 0;
  199. err = mmc_send_cmd(mmc, &cmd, NULL);
  200. if (err)
  201. return err;
  202. udelay(2000);
  203. return 0;
  204. }
  205. int
  206. sd_send_op_cond(struct mmc *mmc)
  207. {
  208. int timeout = 1000;
  209. int err;
  210. struct mmc_cmd cmd;
  211. do {
  212. cmd.cmdidx = MMC_CMD_APP_CMD;
  213. cmd.resp_type = MMC_RSP_R1;
  214. cmd.cmdarg = 0;
  215. cmd.flags = 0;
  216. err = mmc_send_cmd(mmc, &cmd, NULL);
  217. if (err)
  218. return err;
  219. cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
  220. cmd.resp_type = MMC_RSP_R3;
  221. /*
  222. * Most cards do not answer if some reserved bits
  223. * in the ocr are set. However, Some controller
  224. * can set bit 7 (reserved for low voltages), but
  225. * how to manage low voltages SD card is not yet
  226. * specified.
  227. */
  228. cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
  229. (mmc->voltages & 0xff8000);
  230. if (mmc->version == SD_VERSION_2)
  231. cmd.cmdarg |= OCR_HCS;
  232. err = mmc_send_cmd(mmc, &cmd, NULL);
  233. if (err)
  234. return err;
  235. udelay(1000);
  236. } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
  237. if (timeout <= 0)
  238. return UNUSABLE_ERR;
  239. if (mmc->version != SD_VERSION_2)
  240. mmc->version = SD_VERSION_1_0;
  241. if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
  242. cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
  243. cmd.resp_type = MMC_RSP_R3;
  244. cmd.cmdarg = 0;
  245. cmd.flags = 0;
  246. err = mmc_send_cmd(mmc, &cmd, NULL);
  247. if (err)
  248. return err;
  249. }
  250. mmc->ocr = cmd.response[0];
  251. mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
  252. mmc->rca = 0;
  253. return 0;
  254. }
  255. int mmc_send_op_cond(struct mmc *mmc)
  256. {
  257. int timeout = 1000;
  258. struct mmc_cmd cmd;
  259. int err;
  260. /* Some cards seem to need this */
  261. mmc_go_idle(mmc);
  262. do {
  263. cmd.cmdidx = MMC_CMD_SEND_OP_COND;
  264. cmd.resp_type = MMC_RSP_R3;
  265. cmd.cmdarg = OCR_HCS | (mmc_host_is_spi(mmc) ? 0 :
  266. mmc->voltages);
  267. cmd.flags = 0;
  268. err = mmc_send_cmd(mmc, &cmd, NULL);
  269. if (err)
  270. return err;
  271. udelay(1000);
  272. } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
  273. if (timeout <= 0)
  274. return UNUSABLE_ERR;
  275. if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
  276. cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
  277. cmd.resp_type = MMC_RSP_R3;
  278. cmd.cmdarg = 0;
  279. cmd.flags = 0;
  280. err = mmc_send_cmd(mmc, &cmd, NULL);
  281. if (err)
  282. return err;
  283. }
  284. mmc->version = MMC_VERSION_UNKNOWN;
  285. mmc->ocr = cmd.response[0];
  286. mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
  287. mmc->rca = 0;
  288. return 0;
  289. }
  290. int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
  291. {
  292. struct mmc_cmd cmd;
  293. struct mmc_data data;
  294. int err;
  295. /* Get the Card Status Register */
  296. cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
  297. cmd.resp_type = MMC_RSP_R1;
  298. cmd.cmdarg = 0;
  299. cmd.flags = 0;
  300. data.dest = ext_csd;
  301. data.blocks = 1;
  302. data.blocksize = 512;
  303. data.flags = MMC_DATA_READ;
  304. err = mmc_send_cmd(mmc, &cmd, &data);
  305. return err;
  306. }
  307. int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
  308. {
  309. struct mmc_cmd cmd;
  310. cmd.cmdidx = MMC_CMD_SWITCH;
  311. cmd.resp_type = MMC_RSP_R1b;
  312. cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
  313. (index << 16) |
  314. (value << 8);
  315. cmd.flags = 0;
  316. return mmc_send_cmd(mmc, &cmd, NULL);
  317. }
  318. int mmc_change_freq(struct mmc *mmc)
  319. {
  320. char ext_csd[512];
  321. char cardtype;
  322. int err;
  323. mmc->card_caps = 0;
  324. if (mmc_host_is_spi(mmc))
  325. return 0;
  326. /* Only version 4 supports high-speed */
  327. if (mmc->version < MMC_VERSION_4)
  328. return 0;
  329. mmc->card_caps |= MMC_MODE_4BIT;
  330. err = mmc_send_ext_csd(mmc, ext_csd);
  331. if (err)
  332. return err;
  333. if (ext_csd[212] || ext_csd[213] || ext_csd[214] || ext_csd[215])
  334. mmc->high_capacity = 1;
  335. cardtype = ext_csd[196] & 0xf;
  336. err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
  337. if (err)
  338. return err;
  339. /* Now check to see that it worked */
  340. err = mmc_send_ext_csd(mmc, ext_csd);
  341. if (err)
  342. return err;
  343. /* No high-speed support */
  344. if (!ext_csd[185])
  345. return 0;
  346. /* High Speed is set, there are two types: 52MHz and 26MHz */
  347. if (cardtype & MMC_HS_52MHZ)
  348. mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
  349. else
  350. mmc->card_caps |= MMC_MODE_HS;
  351. return 0;
  352. }
  353. int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
  354. {
  355. struct mmc_cmd cmd;
  356. struct mmc_data data;
  357. /* Switch the frequency */
  358. cmd.cmdidx = SD_CMD_SWITCH_FUNC;
  359. cmd.resp_type = MMC_RSP_R1;
  360. cmd.cmdarg = (mode << 31) | 0xffffff;
  361. cmd.cmdarg &= ~(0xf << (group * 4));
  362. cmd.cmdarg |= value << (group * 4);
  363. cmd.flags = 0;
  364. data.dest = (char *)resp;
  365. data.blocksize = 64;
  366. data.blocks = 1;
  367. data.flags = MMC_DATA_READ;
  368. return mmc_send_cmd(mmc, &cmd, &data);
  369. }
  370. int sd_change_freq(struct mmc *mmc)
  371. {
  372. int err;
  373. struct mmc_cmd cmd;
  374. uint scr[2];
  375. uint switch_status[16];
  376. struct mmc_data data;
  377. int timeout;
  378. mmc->card_caps = 0;
  379. if (mmc_host_is_spi(mmc))
  380. return 0;
  381. /* Read the SCR to find out if this card supports higher speeds */
  382. cmd.cmdidx = MMC_CMD_APP_CMD;
  383. cmd.resp_type = MMC_RSP_R1;
  384. cmd.cmdarg = mmc->rca << 16;
  385. cmd.flags = 0;
  386. err = mmc_send_cmd(mmc, &cmd, NULL);
  387. if (err)
  388. return err;
  389. cmd.cmdidx = SD_CMD_APP_SEND_SCR;
  390. cmd.resp_type = MMC_RSP_R1;
  391. cmd.cmdarg = 0;
  392. cmd.flags = 0;
  393. timeout = 3;
  394. retry_scr:
  395. data.dest = (char *)&scr;
  396. data.blocksize = 8;
  397. data.blocks = 1;
  398. data.flags = MMC_DATA_READ;
  399. err = mmc_send_cmd(mmc, &cmd, &data);
  400. if (err) {
  401. if (timeout--)
  402. goto retry_scr;
  403. return err;
  404. }
  405. mmc->scr[0] = __be32_to_cpu(scr[0]);
  406. mmc->scr[1] = __be32_to_cpu(scr[1]);
  407. switch ((mmc->scr[0] >> 24) & 0xf) {
  408. case 0:
  409. mmc->version = SD_VERSION_1_0;
  410. break;
  411. case 1:
  412. mmc->version = SD_VERSION_1_10;
  413. break;
  414. case 2:
  415. mmc->version = SD_VERSION_2;
  416. break;
  417. default:
  418. mmc->version = SD_VERSION_1_0;
  419. break;
  420. }
  421. if (mmc->scr[0] & SD_DATA_4BIT)
  422. mmc->card_caps |= MMC_MODE_4BIT;
  423. /* Version 1.0 doesn't support switching */
  424. if (mmc->version == SD_VERSION_1_0)
  425. return 0;
  426. timeout = 4;
  427. while (timeout--) {
  428. err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
  429. (u8 *)&switch_status);
  430. if (err)
  431. return err;
  432. /* The high-speed function is busy. Try again */
  433. if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
  434. break;
  435. }
  436. /* If high-speed isn't supported, we return */
  437. if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
  438. return 0;
  439. err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)&switch_status);
  440. if (err)
  441. return err;
  442. if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
  443. mmc->card_caps |= MMC_MODE_HS;
  444. return 0;
  445. }
  446. /* frequency bases */
  447. /* divided by 10 to be nice to platforms without floating point */
  448. static const int fbase[] = {
  449. 10000,
  450. 100000,
  451. 1000000,
  452. 10000000,
  453. };
  454. /* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
  455. * to platforms without floating point.
  456. */
  457. static const int multipliers[] = {
  458. 0, /* reserved */
  459. 10,
  460. 12,
  461. 13,
  462. 15,
  463. 20,
  464. 25,
  465. 30,
  466. 35,
  467. 40,
  468. 45,
  469. 50,
  470. 55,
  471. 60,
  472. 70,
  473. 80,
  474. };
  475. void mmc_set_ios(struct mmc *mmc)
  476. {
  477. mmc->set_ios(mmc);
  478. }
  479. void mmc_set_clock(struct mmc *mmc, uint clock)
  480. {
  481. if (clock > mmc->f_max)
  482. clock = mmc->f_max;
  483. if (clock < mmc->f_min)
  484. clock = mmc->f_min;
  485. mmc->clock = clock;
  486. mmc_set_ios(mmc);
  487. }
  488. void mmc_set_bus_width(struct mmc *mmc, uint width)
  489. {
  490. mmc->bus_width = width;
  491. mmc_set_ios(mmc);
  492. }
  493. int mmc_startup(struct mmc *mmc)
  494. {
  495. int err;
  496. uint mult, freq;
  497. u64 cmult, csize;
  498. struct mmc_cmd cmd;
  499. char ext_csd[512];
  500. #ifdef CONFIG_MMC_SPI_CRC_ON
  501. if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
  502. cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
  503. cmd.resp_type = MMC_RSP_R1;
  504. cmd.cmdarg = 1;
  505. cmd.flags = 0;
  506. err = mmc_send_cmd(mmc, &cmd, NULL);
  507. if (err)
  508. return err;
  509. }
  510. #endif
  511. /* Put the Card in Identify Mode */
  512. cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
  513. MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
  514. cmd.resp_type = MMC_RSP_R2;
  515. cmd.cmdarg = 0;
  516. cmd.flags = 0;
  517. err = mmc_send_cmd(mmc, &cmd, NULL);
  518. if (err)
  519. return err;
  520. memcpy(mmc->cid, cmd.response, 16);
  521. /*
  522. * For MMC cards, set the Relative Address.
  523. * For SD cards, get the Relatvie Address.
  524. * This also puts the cards into Standby State
  525. */
  526. if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
  527. cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
  528. cmd.cmdarg = mmc->rca << 16;
  529. cmd.resp_type = MMC_RSP_R6;
  530. cmd.flags = 0;
  531. err = mmc_send_cmd(mmc, &cmd, NULL);
  532. if (err)
  533. return err;
  534. if (IS_SD(mmc))
  535. mmc->rca = (cmd.response[0] >> 16) & 0xffff;
  536. }
  537. /* Get the Card-Specific Data */
  538. cmd.cmdidx = MMC_CMD_SEND_CSD;
  539. cmd.resp_type = MMC_RSP_R2;
  540. cmd.cmdarg = mmc->rca << 16;
  541. cmd.flags = 0;
  542. err = mmc_send_cmd(mmc, &cmd, NULL);
  543. if (err)
  544. return err;
  545. mmc->csd[0] = cmd.response[0];
  546. mmc->csd[1] = cmd.response[1];
  547. mmc->csd[2] = cmd.response[2];
  548. mmc->csd[3] = cmd.response[3];
  549. if (mmc->version == MMC_VERSION_UNKNOWN) {
  550. int version = (cmd.response[0] >> 26) & 0xf;
  551. switch (version) {
  552. case 0:
  553. mmc->version = MMC_VERSION_1_2;
  554. break;
  555. case 1:
  556. mmc->version = MMC_VERSION_1_4;
  557. break;
  558. case 2:
  559. mmc->version = MMC_VERSION_2_2;
  560. break;
  561. case 3:
  562. mmc->version = MMC_VERSION_3;
  563. break;
  564. case 4:
  565. mmc->version = MMC_VERSION_4;
  566. break;
  567. default:
  568. mmc->version = MMC_VERSION_1_2;
  569. break;
  570. }
  571. }
  572. /* divide frequency by 10, since the mults are 10x bigger */
  573. freq = fbase[(cmd.response[0] & 0x7)];
  574. mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
  575. mmc->tran_speed = freq * mult;
  576. mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
  577. if (IS_SD(mmc))
  578. mmc->write_bl_len = mmc->read_bl_len;
  579. else
  580. mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
  581. if (mmc->high_capacity) {
  582. csize = (mmc->csd[1] & 0x3f) << 16
  583. | (mmc->csd[2] & 0xffff0000) >> 16;
  584. cmult = 8;
  585. } else {
  586. csize = (mmc->csd[1] & 0x3ff) << 2
  587. | (mmc->csd[2] & 0xc0000000) >> 30;
  588. cmult = (mmc->csd[2] & 0x00038000) >> 15;
  589. }
  590. mmc->capacity = (csize + 1) << (cmult + 2);
  591. mmc->capacity *= mmc->read_bl_len;
  592. if (mmc->read_bl_len > 512)
  593. mmc->read_bl_len = 512;
  594. if (mmc->write_bl_len > 512)
  595. mmc->write_bl_len = 512;
  596. /* Select the card, and put it into Transfer Mode */
  597. if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
  598. cmd.cmdidx = MMC_CMD_SELECT_CARD;
  599. cmd.resp_type = MMC_RSP_R1b;
  600. cmd.cmdarg = mmc->rca << 16;
  601. cmd.flags = 0;
  602. err = mmc_send_cmd(mmc, &cmd, NULL);
  603. if (err)
  604. return err;
  605. }
  606. if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
  607. /* check ext_csd version and capacity */
  608. err = mmc_send_ext_csd(mmc, ext_csd);
  609. if (!err & (ext_csd[192] >= 2)) {
  610. mmc->capacity = ext_csd[212] << 0 | ext_csd[213] << 8 |
  611. ext_csd[214] << 16 | ext_csd[215] << 24;
  612. mmc->capacity *= 512;
  613. }
  614. }
  615. if (IS_SD(mmc))
  616. err = sd_change_freq(mmc);
  617. else
  618. err = mmc_change_freq(mmc);
  619. if (err)
  620. return err;
  621. /* Restrict card's capabilities by what the host can do */
  622. mmc->card_caps &= mmc->host_caps;
  623. if (IS_SD(mmc)) {
  624. if (mmc->card_caps & MMC_MODE_4BIT) {
  625. cmd.cmdidx = MMC_CMD_APP_CMD;
  626. cmd.resp_type = MMC_RSP_R1;
  627. cmd.cmdarg = mmc->rca << 16;
  628. cmd.flags = 0;
  629. err = mmc_send_cmd(mmc, &cmd, NULL);
  630. if (err)
  631. return err;
  632. cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
  633. cmd.resp_type = MMC_RSP_R1;
  634. cmd.cmdarg = 2;
  635. cmd.flags = 0;
  636. err = mmc_send_cmd(mmc, &cmd, NULL);
  637. if (err)
  638. return err;
  639. mmc_set_bus_width(mmc, 4);
  640. }
  641. if (mmc->card_caps & MMC_MODE_HS)
  642. mmc_set_clock(mmc, 50000000);
  643. else
  644. mmc_set_clock(mmc, 25000000);
  645. } else {
  646. if (mmc->card_caps & MMC_MODE_4BIT) {
  647. /* Set the card to use 4 bit*/
  648. err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
  649. EXT_CSD_BUS_WIDTH,
  650. EXT_CSD_BUS_WIDTH_4);
  651. if (err)
  652. return err;
  653. mmc_set_bus_width(mmc, 4);
  654. } else if (mmc->card_caps & MMC_MODE_8BIT) {
  655. /* Set the card to use 8 bit*/
  656. err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
  657. EXT_CSD_BUS_WIDTH,
  658. EXT_CSD_BUS_WIDTH_8);
  659. if (err)
  660. return err;
  661. mmc_set_bus_width(mmc, 8);
  662. }
  663. if (mmc->card_caps & MMC_MODE_HS) {
  664. if (mmc->card_caps & MMC_MODE_HS_52MHz)
  665. mmc_set_clock(mmc, 52000000);
  666. else
  667. mmc_set_clock(mmc, 26000000);
  668. } else
  669. mmc_set_clock(mmc, 20000000);
  670. }
  671. /* fill in device description */
  672. mmc->block_dev.lun = 0;
  673. mmc->block_dev.type = 0;
  674. mmc->block_dev.blksz = mmc->read_bl_len;
  675. mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
  676. sprintf(mmc->block_dev.vendor, "Man %06x Snr %08x", mmc->cid[0] >> 8,
  677. (mmc->cid[2] << 8) | (mmc->cid[3] >> 24));
  678. sprintf(mmc->block_dev.product, "%c%c%c%c%c", mmc->cid[0] & 0xff,
  679. (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
  680. (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
  681. sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
  682. (mmc->cid[2] >> 24) & 0xf);
  683. init_part(&mmc->block_dev);
  684. return 0;
  685. }
  686. int mmc_send_if_cond(struct mmc *mmc)
  687. {
  688. struct mmc_cmd cmd;
  689. int err;
  690. cmd.cmdidx = SD_CMD_SEND_IF_COND;
  691. /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
  692. cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
  693. cmd.resp_type = MMC_RSP_R7;
  694. cmd.flags = 0;
  695. err = mmc_send_cmd(mmc, &cmd, NULL);
  696. if (err)
  697. return err;
  698. if ((cmd.response[0] & 0xff) != 0xaa)
  699. return UNUSABLE_ERR;
  700. else
  701. mmc->version = SD_VERSION_2;
  702. return 0;
  703. }
  704. int mmc_register(struct mmc *mmc)
  705. {
  706. /* Setup the universal parts of the block interface just once */
  707. mmc->block_dev.if_type = IF_TYPE_MMC;
  708. mmc->block_dev.dev = cur_dev_num++;
  709. mmc->block_dev.removable = 1;
  710. mmc->block_dev.block_read = mmc_bread;
  711. mmc->block_dev.block_write = mmc_bwrite;
  712. INIT_LIST_HEAD (&mmc->link);
  713. list_add_tail (&mmc->link, &mmc_devices);
  714. return 0;
  715. }
  716. block_dev_desc_t *mmc_get_dev(int dev)
  717. {
  718. struct mmc *mmc = find_mmc_device(dev);
  719. return mmc ? &mmc->block_dev : NULL;
  720. }
  721. int mmc_init(struct mmc *mmc)
  722. {
  723. int err;
  724. err = mmc->init(mmc);
  725. if (err)
  726. return err;
  727. mmc_set_bus_width(mmc, 1);
  728. mmc_set_clock(mmc, 1);
  729. /* Reset the Card */
  730. err = mmc_go_idle(mmc);
  731. if (err)
  732. return err;
  733. /* Test for SD version 2 */
  734. err = mmc_send_if_cond(mmc);
  735. /* Now try to get the SD card's operating condition */
  736. err = sd_send_op_cond(mmc);
  737. /* If the command timed out, we check for an MMC card */
  738. if (err == TIMEOUT) {
  739. err = mmc_send_op_cond(mmc);
  740. if (err) {
  741. printf("Card did not respond to voltage select!\n");
  742. return UNUSABLE_ERR;
  743. }
  744. }
  745. return mmc_startup(mmc);
  746. }
  747. /*
  748. * CPU and board-specific MMC initializations. Aliased function
  749. * signals caller to move on
  750. */
  751. static int __def_mmc_init(bd_t *bis)
  752. {
  753. return -1;
  754. }
  755. int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
  756. int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
  757. void print_mmc_devices(char separator)
  758. {
  759. struct mmc *m;
  760. struct list_head *entry;
  761. list_for_each(entry, &mmc_devices) {
  762. m = list_entry(entry, struct mmc, link);
  763. printf("%s: %d", m->name, m->block_dev.dev);
  764. if (entry->next != &mmc_devices)
  765. printf("%c ", separator);
  766. }
  767. printf("\n");
  768. }
  769. int mmc_initialize(bd_t *bis)
  770. {
  771. INIT_LIST_HEAD (&mmc_devices);
  772. cur_dev_num = 0;
  773. if (board_mmc_init(bis) < 0)
  774. cpu_mmc_init(bis);
  775. print_mmc_devices(',');
  776. return 0;
  777. }