mmc.c 18 KB

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