blob: 9988cb1f242de1c7322b8e861f1a55ed1fb5b542 [file] [log] [blame]
Andy Fleming272cc702008-10-30 16:41:01 -05001/*
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
26#include <config.h>
27#include <common.h>
28#include <command.h>
29#include <mmc.h>
30#include <part.h>
31#include <malloc.h>
32#include <linux/list.h>
33#include <mmc.h>
Rabin Vincent9b1f9422009-04-05 13:30:54 +053034#include <div64.h>
Andy Fleming272cc702008-10-30 16:41:01 -050035
36static struct list_head mmc_devices;
37static int cur_dev_num = -1;
38
Stefano Babic11fdade2010-02-05 15:04:43 +010039int __board_mmc_getcd(u8 *cd, struct mmc *mmc) {
40 return -1;
41}
42
43int board_mmc_getcd(u8 *cd, struct mmc *mmc)__attribute__((weak,
44 alias("__board_mmc_getcd")));
45
Andy Fleming272cc702008-10-30 16:41:01 -050046int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
47{
48 return mmc->send_cmd(mmc, cmd, data);
49}
50
51int mmc_set_blocklen(struct mmc *mmc, int len)
52{
53 struct mmc_cmd cmd;
54
55 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
56 cmd.resp_type = MMC_RSP_R1;
57 cmd.cmdarg = len;
58 cmd.flags = 0;
59
60 return mmc_send_cmd(mmc, &cmd, NULL);
61}
62
63struct mmc *find_mmc_device(int dev_num)
64{
65 struct mmc *m;
66 struct list_head *entry;
67
68 list_for_each(entry, &mmc_devices) {
69 m = list_entry(entry, struct mmc, link);
70
71 if (m->block_dev.dev == dev_num)
72 return m;
73 }
74
75 printf("MMC Device %d not found\n", dev_num);
76
77 return NULL;
78}
79
80static ulong
Lei Wen01581262010-10-14 13:38:11 +080081mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
Andy Fleming272cc702008-10-30 16:41:01 -050082{
83 struct mmc_cmd cmd;
84 struct mmc_data data;
Andy Fleming272cc702008-10-30 16:41:01 -050085
Lei Wend2bf29e2010-09-13 22:07:27 +080086 if ((start + blkcnt) > mmc->block_dev.lba) {
Steve Sakomandef412b2010-10-28 09:00:26 -070087 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wend2bf29e2010-09-13 22:07:27 +080088 start + blkcnt, mmc->block_dev.lba);
89 return 0;
90 }
Andy Fleming272cc702008-10-30 16:41:01 -050091
92 if (blkcnt > 1)
93 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
94 else
95 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
96
97 if (mmc->high_capacity)
98 cmd.cmdarg = start;
99 else
Steve Sakomandef412b2010-10-28 09:00:26 -0700100 cmd.cmdarg = start * mmc->write_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500101
102 cmd.resp_type = MMC_RSP_R1;
103 cmd.flags = 0;
104
105 data.src = src;
106 data.blocks = blkcnt;
Steve Sakomandef412b2010-10-28 09:00:26 -0700107 data.blocksize = mmc->write_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500108 data.flags = MMC_DATA_WRITE;
109
Steve Sakomandef412b2010-10-28 09:00:26 -0700110 if (mmc_send_cmd(mmc, &cmd, &data)) {
111 printf("mmc write failed\n");
112 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500113 }
114
115 if (blkcnt > 1) {
116 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
117 cmd.cmdarg = 0;
118 cmd.resp_type = MMC_RSP_R1b;
119 cmd.flags = 0;
Steve Sakomandef412b2010-10-28 09:00:26 -0700120 if (mmc_send_cmd(mmc, &cmd, NULL)) {
121 printf("mmc fail to send stop cmd\n");
122 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800123 }
Andy Fleming272cc702008-10-30 16:41:01 -0500124 }
125
126 return blkcnt;
127}
128
Lei Wen01581262010-10-14 13:38:11 +0800129static ulong
130mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
131{
Lei Wen01581262010-10-14 13:38:11 +0800132 lbaint_t cur, blocks_todo = blkcnt;
133
Steve Sakomandef412b2010-10-28 09:00:26 -0700134 struct mmc *mmc = find_mmc_device(dev_num);
Lei Wen01581262010-10-14 13:38:11 +0800135 if (!mmc)
Steve Sakomandef412b2010-10-28 09:00:26 -0700136 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800137
Steve Sakomandef412b2010-10-28 09:00:26 -0700138 if (mmc_set_blocklen(mmc, mmc->write_bl_len))
139 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800140
141 do {
142 /*
143 * The 65535 constraint comes from some hardware has
144 * only 16 bit width block number counter
145 */
146 cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
147 if(mmc_write_blocks(mmc, start, cur, src) != cur)
Steve Sakomandef412b2010-10-28 09:00:26 -0700148 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800149 blocks_todo -= cur;
150 start += cur;
151 src += cur * mmc->write_bl_len;
152 } while (blocks_todo > 0);
153
154 return blkcnt;
155}
156
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700157int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500158{
159 struct mmc_cmd cmd;
160 struct mmc_data data;
161
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700162 if (blkcnt > 1)
163 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
164 else
165 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500166
167 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700168 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500169 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700170 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500171
172 cmd.resp_type = MMC_RSP_R1;
173 cmd.flags = 0;
174
175 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700176 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500177 data.blocksize = mmc->read_bl_len;
178 data.flags = MMC_DATA_READ;
179
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700180 if (mmc_send_cmd(mmc, &cmd, &data))
181 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500182
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700183 if (blkcnt > 1) {
184 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
185 cmd.cmdarg = 0;
186 cmd.resp_type = MMC_RSP_R1b;
187 cmd.flags = 0;
188 if (mmc_send_cmd(mmc, &cmd, NULL)) {
189 printf("mmc fail to send stop cmd\n");
190 return 0;
191 }
Andy Fleming272cc702008-10-30 16:41:01 -0500192 }
193
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700194 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500195}
196
197static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
198{
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700199 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500200
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700201 if (blkcnt == 0)
202 return 0;
203
204 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500205 if (!mmc)
206 return 0;
207
Lei Wend2bf29e2010-09-13 22:07:27 +0800208 if ((start + blkcnt) > mmc->block_dev.lba) {
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700209 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800210 start + blkcnt, mmc->block_dev.lba);
211 return 0;
212 }
Andy Fleming272cc702008-10-30 16:41:01 -0500213
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700214 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
Andy Fleming272cc702008-10-30 16:41:01 -0500215 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500216
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700217 do {
218 /*
219 * The 65535 constraint comes from some hardware has
220 * only 16 bit width block number counter
221 */
222 cur = (blocks_todo > 65535) ? 65535 : blocks_todo;
223 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
224 return 0;
225 blocks_todo -= cur;
226 start += cur;
227 dst += cur * mmc->read_bl_len;
228 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500229
230 return blkcnt;
231}
232
233int mmc_go_idle(struct mmc* mmc)
234{
235 struct mmc_cmd cmd;
236 int err;
237
238 udelay(1000);
239
240 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
241 cmd.cmdarg = 0;
242 cmd.resp_type = MMC_RSP_NONE;
243 cmd.flags = 0;
244
245 err = mmc_send_cmd(mmc, &cmd, NULL);
246
247 if (err)
248 return err;
249
250 udelay(2000);
251
252 return 0;
253}
254
255int
256sd_send_op_cond(struct mmc *mmc)
257{
258 int timeout = 1000;
259 int err;
260 struct mmc_cmd cmd;
261
262 do {
263 cmd.cmdidx = MMC_CMD_APP_CMD;
264 cmd.resp_type = MMC_RSP_R1;
265 cmd.cmdarg = 0;
266 cmd.flags = 0;
267
268 err = mmc_send_cmd(mmc, &cmd, NULL);
269
270 if (err)
271 return err;
272
273 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
274 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100275
276 /*
277 * Most cards do not answer if some reserved bits
278 * in the ocr are set. However, Some controller
279 * can set bit 7 (reserved for low voltages), but
280 * how to manage low voltages SD card is not yet
281 * specified.
282 */
283 cmd.cmdarg = mmc->voltages & 0xff8000;
Andy Fleming272cc702008-10-30 16:41:01 -0500284
285 if (mmc->version == SD_VERSION_2)
286 cmd.cmdarg |= OCR_HCS;
287
288 err = mmc_send_cmd(mmc, &cmd, NULL);
289
290 if (err)
291 return err;
292
293 udelay(1000);
294 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
295
296 if (timeout <= 0)
297 return UNUSABLE_ERR;
298
299 if (mmc->version != SD_VERSION_2)
300 mmc->version = SD_VERSION_1_0;
301
Rabin Vincent998be3d2009-04-05 13:30:56 +0530302 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500303
304 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
305 mmc->rca = 0;
306
307 return 0;
308}
309
310int mmc_send_op_cond(struct mmc *mmc)
311{
312 int timeout = 1000;
313 struct mmc_cmd cmd;
314 int err;
315
316 /* Some cards seem to need this */
317 mmc_go_idle(mmc);
318
319 do {
320 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
321 cmd.resp_type = MMC_RSP_R3;
322 cmd.cmdarg = OCR_HCS | mmc->voltages;
323 cmd.flags = 0;
324
325 err = mmc_send_cmd(mmc, &cmd, NULL);
326
327 if (err)
328 return err;
329
330 udelay(1000);
331 } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
332
333 if (timeout <= 0)
334 return UNUSABLE_ERR;
335
336 mmc->version = MMC_VERSION_UNKNOWN;
Rabin Vincent998be3d2009-04-05 13:30:56 +0530337 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500338
339 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
340 mmc->rca = 0;
341
342 return 0;
343}
344
345
346int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
347{
348 struct mmc_cmd cmd;
349 struct mmc_data data;
350 int err;
351
352 /* Get the Card Status Register */
353 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
354 cmd.resp_type = MMC_RSP_R1;
355 cmd.cmdarg = 0;
356 cmd.flags = 0;
357
358 data.dest = ext_csd;
359 data.blocks = 1;
360 data.blocksize = 512;
361 data.flags = MMC_DATA_READ;
362
363 err = mmc_send_cmd(mmc, &cmd, &data);
364
365 return err;
366}
367
368
369int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
370{
371 struct mmc_cmd cmd;
372
373 cmd.cmdidx = MMC_CMD_SWITCH;
374 cmd.resp_type = MMC_RSP_R1b;
375 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
376 (index << 16) |
377 (value << 8);
378 cmd.flags = 0;
379
380 return mmc_send_cmd(mmc, &cmd, NULL);
381}
382
383int mmc_change_freq(struct mmc *mmc)
384{
385 char ext_csd[512];
386 char cardtype;
387 int err;
388
389 mmc->card_caps = 0;
390
391 /* Only version 4 supports high-speed */
392 if (mmc->version < MMC_VERSION_4)
393 return 0;
394
395 mmc->card_caps |= MMC_MODE_4BIT;
396
397 err = mmc_send_ext_csd(mmc, ext_csd);
398
399 if (err)
400 return err;
401
402 if (ext_csd[212] || ext_csd[213] || ext_csd[214] || ext_csd[215])
403 mmc->high_capacity = 1;
404
405 cardtype = ext_csd[196] & 0xf;
406
407 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
408
409 if (err)
410 return err;
411
412 /* Now check to see that it worked */
413 err = mmc_send_ext_csd(mmc, ext_csd);
414
415 if (err)
416 return err;
417
418 /* No high-speed support */
419 if (!ext_csd[185])
420 return 0;
421
422 /* High Speed is set, there are two types: 52MHz and 26MHz */
423 if (cardtype & MMC_HS_52MHZ)
424 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
425 else
426 mmc->card_caps |= MMC_MODE_HS;
427
428 return 0;
429}
430
431int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
432{
433 struct mmc_cmd cmd;
434 struct mmc_data data;
435
436 /* Switch the frequency */
437 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
438 cmd.resp_type = MMC_RSP_R1;
439 cmd.cmdarg = (mode << 31) | 0xffffff;
440 cmd.cmdarg &= ~(0xf << (group * 4));
441 cmd.cmdarg |= value << (group * 4);
442 cmd.flags = 0;
443
444 data.dest = (char *)resp;
445 data.blocksize = 64;
446 data.blocks = 1;
447 data.flags = MMC_DATA_READ;
448
449 return mmc_send_cmd(mmc, &cmd, &data);
450}
451
452
453int sd_change_freq(struct mmc *mmc)
454{
455 int err;
456 struct mmc_cmd cmd;
457 uint scr[2];
458 uint switch_status[16];
459 struct mmc_data data;
460 int timeout;
461
462 mmc->card_caps = 0;
463
464 /* Read the SCR to find out if this card supports higher speeds */
465 cmd.cmdidx = MMC_CMD_APP_CMD;
466 cmd.resp_type = MMC_RSP_R1;
467 cmd.cmdarg = mmc->rca << 16;
468 cmd.flags = 0;
469
470 err = mmc_send_cmd(mmc, &cmd, NULL);
471
472 if (err)
473 return err;
474
475 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
476 cmd.resp_type = MMC_RSP_R1;
477 cmd.cmdarg = 0;
478 cmd.flags = 0;
479
480 timeout = 3;
481
482retry_scr:
483 data.dest = (char *)&scr;
484 data.blocksize = 8;
485 data.blocks = 1;
486 data.flags = MMC_DATA_READ;
487
488 err = mmc_send_cmd(mmc, &cmd, &data);
489
490 if (err) {
491 if (timeout--)
492 goto retry_scr;
493
494 return err;
495 }
496
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300497 mmc->scr[0] = __be32_to_cpu(scr[0]);
498 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500499
500 switch ((mmc->scr[0] >> 24) & 0xf) {
501 case 0:
502 mmc->version = SD_VERSION_1_0;
503 break;
504 case 1:
505 mmc->version = SD_VERSION_1_10;
506 break;
507 case 2:
508 mmc->version = SD_VERSION_2;
509 break;
510 default:
511 mmc->version = SD_VERSION_1_0;
512 break;
513 }
514
Alagu Sankarb44c7082010-05-12 15:08:24 +0530515 if (mmc->scr[0] & SD_DATA_4BIT)
516 mmc->card_caps |= MMC_MODE_4BIT;
517
Andy Fleming272cc702008-10-30 16:41:01 -0500518 /* Version 1.0 doesn't support switching */
519 if (mmc->version == SD_VERSION_1_0)
520 return 0;
521
522 timeout = 4;
523 while (timeout--) {
524 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
525 (u8 *)&switch_status);
526
527 if (err)
528 return err;
529
530 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300531 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500532 break;
533 }
534
Andy Fleming272cc702008-10-30 16:41:01 -0500535 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300536 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500537 return 0;
538
539 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)&switch_status);
540
541 if (err)
542 return err;
543
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300544 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-10-30 16:41:01 -0500545 mmc->card_caps |= MMC_MODE_HS;
546
547 return 0;
548}
549
550/* frequency bases */
551/* divided by 10 to be nice to platforms without floating point */
552int fbase[] = {
553 10000,
554 100000,
555 1000000,
556 10000000,
557};
558
559/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
560 * to platforms without floating point.
561 */
562int multipliers[] = {
563 0, /* reserved */
564 10,
565 12,
566 13,
567 15,
568 20,
569 25,
570 30,
571 35,
572 40,
573 45,
574 50,
575 55,
576 60,
577 70,
578 80,
579};
580
581void mmc_set_ios(struct mmc *mmc)
582{
583 mmc->set_ios(mmc);
584}
585
586void mmc_set_clock(struct mmc *mmc, uint clock)
587{
588 if (clock > mmc->f_max)
589 clock = mmc->f_max;
590
591 if (clock < mmc->f_min)
592 clock = mmc->f_min;
593
594 mmc->clock = clock;
595
596 mmc_set_ios(mmc);
597}
598
599void mmc_set_bus_width(struct mmc *mmc, uint width)
600{
601 mmc->bus_width = width;
602
603 mmc_set_ios(mmc);
604}
605
606int mmc_startup(struct mmc *mmc)
607{
608 int err;
609 uint mult, freq;
610 u64 cmult, csize;
611 struct mmc_cmd cmd;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +0530612 char ext_csd[512];
Andy Fleming272cc702008-10-30 16:41:01 -0500613
614 /* Put the Card in Identify Mode */
615 cmd.cmdidx = MMC_CMD_ALL_SEND_CID;
616 cmd.resp_type = MMC_RSP_R2;
617 cmd.cmdarg = 0;
618 cmd.flags = 0;
619
620 err = mmc_send_cmd(mmc, &cmd, NULL);
621
622 if (err)
623 return err;
624
625 memcpy(mmc->cid, cmd.response, 16);
626
627 /*
628 * For MMC cards, set the Relative Address.
629 * For SD cards, get the Relatvie Address.
630 * This also puts the cards into Standby State
631 */
632 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
633 cmd.cmdarg = mmc->rca << 16;
634 cmd.resp_type = MMC_RSP_R6;
635 cmd.flags = 0;
636
637 err = mmc_send_cmd(mmc, &cmd, NULL);
638
639 if (err)
640 return err;
641
642 if (IS_SD(mmc))
Rabin Vincent998be3d2009-04-05 13:30:56 +0530643 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
Andy Fleming272cc702008-10-30 16:41:01 -0500644
645 /* Get the Card-Specific Data */
646 cmd.cmdidx = MMC_CMD_SEND_CSD;
647 cmd.resp_type = MMC_RSP_R2;
648 cmd.cmdarg = mmc->rca << 16;
649 cmd.flags = 0;
650
651 err = mmc_send_cmd(mmc, &cmd, NULL);
652
653 if (err)
654 return err;
655
Rabin Vincent998be3d2009-04-05 13:30:56 +0530656 mmc->csd[0] = cmd.response[0];
657 mmc->csd[1] = cmd.response[1];
658 mmc->csd[2] = cmd.response[2];
659 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -0500660
661 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530662 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500663
664 switch (version) {
665 case 0:
666 mmc->version = MMC_VERSION_1_2;
667 break;
668 case 1:
669 mmc->version = MMC_VERSION_1_4;
670 break;
671 case 2:
672 mmc->version = MMC_VERSION_2_2;
673 break;
674 case 3:
675 mmc->version = MMC_VERSION_3;
676 break;
677 case 4:
678 mmc->version = MMC_VERSION_4;
679 break;
680 default:
681 mmc->version = MMC_VERSION_1_2;
682 break;
683 }
684 }
685
686 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530687 freq = fbase[(cmd.response[0] & 0x7)];
688 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -0500689
690 mmc->tran_speed = freq * mult;
691
Rabin Vincent998be3d2009-04-05 13:30:56 +0530692 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500693
694 if (IS_SD(mmc))
695 mmc->write_bl_len = mmc->read_bl_len;
696 else
Rabin Vincent998be3d2009-04-05 13:30:56 +0530697 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500698
699 if (mmc->high_capacity) {
700 csize = (mmc->csd[1] & 0x3f) << 16
701 | (mmc->csd[2] & 0xffff0000) >> 16;
702 cmult = 8;
703 } else {
704 csize = (mmc->csd[1] & 0x3ff) << 2
705 | (mmc->csd[2] & 0xc0000000) >> 30;
706 cmult = (mmc->csd[2] & 0x00038000) >> 15;
707 }
708
709 mmc->capacity = (csize + 1) << (cmult + 2);
710 mmc->capacity *= mmc->read_bl_len;
711
712 if (mmc->read_bl_len > 512)
713 mmc->read_bl_len = 512;
714
715 if (mmc->write_bl_len > 512)
716 mmc->write_bl_len = 512;
717
718 /* Select the card, and put it into Transfer Mode */
719 cmd.cmdidx = MMC_CMD_SELECT_CARD;
720 cmd.resp_type = MMC_RSP_R1b;
721 cmd.cmdarg = mmc->rca << 16;
722 cmd.flags = 0;
723 err = mmc_send_cmd(mmc, &cmd, NULL);
724
725 if (err)
726 return err;
727
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +0530728 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
729 /* check ext_csd version and capacity */
730 err = mmc_send_ext_csd(mmc, ext_csd);
731 if (!err & (ext_csd[192] >= 2)) {
732 mmc->capacity = ext_csd[212] << 0 | ext_csd[213] << 8 |
733 ext_csd[214] << 16 | ext_csd[215] << 24;
734 mmc->capacity *= 512;
735 }
736 }
737
Andy Fleming272cc702008-10-30 16:41:01 -0500738 if (IS_SD(mmc))
739 err = sd_change_freq(mmc);
740 else
741 err = mmc_change_freq(mmc);
742
743 if (err)
744 return err;
745
746 /* Restrict card's capabilities by what the host can do */
747 mmc->card_caps &= mmc->host_caps;
748
749 if (IS_SD(mmc)) {
750 if (mmc->card_caps & MMC_MODE_4BIT) {
751 cmd.cmdidx = MMC_CMD_APP_CMD;
752 cmd.resp_type = MMC_RSP_R1;
753 cmd.cmdarg = mmc->rca << 16;
754 cmd.flags = 0;
755
756 err = mmc_send_cmd(mmc, &cmd, NULL);
757 if (err)
758 return err;
759
760 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
761 cmd.resp_type = MMC_RSP_R1;
762 cmd.cmdarg = 2;
763 cmd.flags = 0;
764 err = mmc_send_cmd(mmc, &cmd, NULL);
765 if (err)
766 return err;
767
768 mmc_set_bus_width(mmc, 4);
769 }
770
771 if (mmc->card_caps & MMC_MODE_HS)
772 mmc_set_clock(mmc, 50000000);
773 else
774 mmc_set_clock(mmc, 25000000);
775 } else {
776 if (mmc->card_caps & MMC_MODE_4BIT) {
777 /* Set the card to use 4 bit*/
778 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
779 EXT_CSD_BUS_WIDTH,
780 EXT_CSD_BUS_WIDTH_4);
781
782 if (err)
783 return err;
784
785 mmc_set_bus_width(mmc, 4);
786 } else if (mmc->card_caps & MMC_MODE_8BIT) {
787 /* Set the card to use 8 bit*/
788 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
789 EXT_CSD_BUS_WIDTH,
790 EXT_CSD_BUS_WIDTH_8);
791
792 if (err)
793 return err;
794
795 mmc_set_bus_width(mmc, 8);
796 }
797
798 if (mmc->card_caps & MMC_MODE_HS) {
799 if (mmc->card_caps & MMC_MODE_HS_52MHz)
800 mmc_set_clock(mmc, 52000000);
801 else
802 mmc_set_clock(mmc, 26000000);
803 } else
804 mmc_set_clock(mmc, 20000000);
805 }
806
807 /* fill in device description */
808 mmc->block_dev.lun = 0;
809 mmc->block_dev.type = 0;
810 mmc->block_dev.blksz = mmc->read_bl_len;
Rabin Vincent9b1f9422009-04-05 13:30:54 +0530811 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530812 sprintf(mmc->block_dev.vendor, "Man %06x Snr %08x", mmc->cid[0] >> 8,
813 (mmc->cid[2] << 8) | (mmc->cid[3] >> 24));
814 sprintf(mmc->block_dev.product, "%c%c%c%c%c", mmc->cid[0] & 0xff,
815 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
816 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
817 sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
818 (mmc->cid[2] >> 24) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500819 init_part(&mmc->block_dev);
820
821 return 0;
822}
823
824int mmc_send_if_cond(struct mmc *mmc)
825{
826 struct mmc_cmd cmd;
827 int err;
828
829 cmd.cmdidx = SD_CMD_SEND_IF_COND;
830 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
831 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
832 cmd.resp_type = MMC_RSP_R7;
833 cmd.flags = 0;
834
835 err = mmc_send_cmd(mmc, &cmd, NULL);
836
837 if (err)
838 return err;
839
Rabin Vincent998be3d2009-04-05 13:30:56 +0530840 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -0500841 return UNUSABLE_ERR;
842 else
843 mmc->version = SD_VERSION_2;
844
845 return 0;
846}
847
848int mmc_register(struct mmc *mmc)
849{
850 /* Setup the universal parts of the block interface just once */
851 mmc->block_dev.if_type = IF_TYPE_MMC;
852 mmc->block_dev.dev = cur_dev_num++;
853 mmc->block_dev.removable = 1;
854 mmc->block_dev.block_read = mmc_bread;
855 mmc->block_dev.block_write = mmc_bwrite;
856
857 INIT_LIST_HEAD (&mmc->link);
858
859 list_add_tail (&mmc->link, &mmc_devices);
860
861 return 0;
862}
863
864block_dev_desc_t *mmc_get_dev(int dev)
865{
866 struct mmc *mmc = find_mmc_device(dev);
867
Rabin Vincente85649c2009-04-05 13:30:53 +0530868 return mmc ? &mmc->block_dev : NULL;
Andy Fleming272cc702008-10-30 16:41:01 -0500869}
870
871int mmc_init(struct mmc *mmc)
872{
873 int err;
874
875 err = mmc->init(mmc);
876
877 if (err)
878 return err;
879
Ilya Yanokb86b85e2009-06-29 17:53:16 +0400880 mmc_set_bus_width(mmc, 1);
881 mmc_set_clock(mmc, 1);
882
Andy Fleming272cc702008-10-30 16:41:01 -0500883 /* Reset the Card */
884 err = mmc_go_idle(mmc);
885
886 if (err)
887 return err;
888
889 /* Test for SD version 2 */
890 err = mmc_send_if_cond(mmc);
891
Andy Fleming272cc702008-10-30 16:41:01 -0500892 /* Now try to get the SD card's operating condition */
893 err = sd_send_op_cond(mmc);
894
895 /* If the command timed out, we check for an MMC card */
896 if (err == TIMEOUT) {
897 err = mmc_send_op_cond(mmc);
898
899 if (err) {
900 printf("Card did not respond to voltage select!\n");
901 return UNUSABLE_ERR;
902 }
903 }
904
905 return mmc_startup(mmc);
906}
907
908/*
909 * CPU and board-specific MMC initializations. Aliased function
910 * signals caller to move on
911 */
912static int __def_mmc_init(bd_t *bis)
913{
914 return -1;
915}
916
Peter Tyserf9a109b2009-04-20 11:08:46 -0500917int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
918int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
Andy Fleming272cc702008-10-30 16:41:01 -0500919
920void print_mmc_devices(char separator)
921{
922 struct mmc *m;
923 struct list_head *entry;
924
925 list_for_each(entry, &mmc_devices) {
926 m = list_entry(entry, struct mmc, link);
927
928 printf("%s: %d", m->name, m->block_dev.dev);
929
930 if (entry->next != &mmc_devices)
931 printf("%c ", separator);
932 }
933
934 printf("\n");
935}
936
937int mmc_initialize(bd_t *bis)
938{
939 INIT_LIST_HEAD (&mmc_devices);
940 cur_dev_num = 0;
941
942 if (board_mmc_init(bis) < 0)
943 cpu_mmc_init(bis);
944
945 print_mmc_devices(',');
946
947 return 0;
948}