]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/mmc/mmc.c
mmc: fix ERASE_GRP_DEF handling
[karo-tx-uboot.git] / drivers / mmc / mmc.c
1 /*
2  * Copyright 2008, Freescale Semiconductor, Inc
3  * Andy Fleming
4  *
5  * Based vaguely on the Linux code
6  *
7  * SPDX-License-Identifier:     GPL-2.0+
8  */
9
10 #include <config.h>
11 #include <common.h>
12 #include <command.h>
13 #include <errno.h>
14 #include <mmc.h>
15 #include <part.h>
16 #include <malloc.h>
17 #include <linux/list.h>
18 #include <div64.h>
19 #include "mmc_private.h"
20
21 static struct list_head mmc_devices;
22 static int cur_dev_num = -1;
23
24 __weak int board_mmc_getwp(struct mmc *mmc)
25 {
26         return -1;
27 }
28
29 int mmc_getwp(struct mmc *mmc)
30 {
31         int wp;
32
33         wp = board_mmc_getwp(mmc);
34
35         if (wp < 0) {
36                 if (mmc->cfg->ops->getwp)
37                         wp = mmc->cfg->ops->getwp(mmc);
38                 else
39                         wp = 0;
40         }
41
42         return wp;
43 }
44
45 __weak int board_mmc_getcd(struct mmc *mmc)
46 {
47         return -1;
48 }
49
50 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
51 {
52         int ret;
53
54 #ifdef CONFIG_MMC_TRACE
55         int i;
56         u8 *ptr;
57
58         printf("CMD_SEND:%d\n", cmd->cmdidx);
59         printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
60         ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
61         switch (cmd->resp_type) {
62                 case MMC_RSP_NONE:
63                         printf("\t\tMMC_RSP_NONE\n");
64                         break;
65                 case MMC_RSP_R1:
66                         printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
67                                 cmd->response[0]);
68                         break;
69                 case MMC_RSP_R1b:
70                         printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
71                                 cmd->response[0]);
72                         break;
73                 case MMC_RSP_R2:
74                         printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
75                                 cmd->response[0]);
76                         printf("\t\t          \t\t 0x%08X \n",
77                                 cmd->response[1]);
78                         printf("\t\t          \t\t 0x%08X \n",
79                                 cmd->response[2]);
80                         printf("\t\t          \t\t 0x%08X \n",
81                                 cmd->response[3]);
82                         printf("\n");
83                         printf("\t\t\t\t\tDUMPING DATA\n");
84                         for (i = 0; i < 4; i++) {
85                                 int j;
86                                 printf("\t\t\t\t\t%03d - ", i*4);
87                                 ptr = (u8 *)&cmd->response[i];
88                                 ptr += 3;
89                                 for (j = 0; j < 4; j++)
90                                         printf("%02X ", *ptr--);
91                                 printf("\n");
92                         }
93                         break;
94                 case MMC_RSP_R3:
95                         printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
96                                 cmd->response[0]);
97                         break;
98                 default:
99                         printf("\t\tERROR MMC rsp not supported\n");
100                         break;
101         }
102 #else
103         ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
104 #endif
105         return ret;
106 }
107
108 int mmc_send_status(struct mmc *mmc, int timeout)
109 {
110         struct mmc_cmd cmd;
111         int err, retries = 5;
112 #ifdef CONFIG_MMC_TRACE
113         int status;
114 #endif
115
116         cmd.cmdidx = MMC_CMD_SEND_STATUS;
117         cmd.resp_type = MMC_RSP_R1;
118         if (!mmc_host_is_spi(mmc))
119                 cmd.cmdarg = mmc->rca << 16;
120
121         do {
122                 err = mmc_send_cmd(mmc, &cmd, NULL);
123                 if (!err) {
124                         if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
125                             (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
126                              MMC_STATE_PRG)
127                                 break;
128                         else if (cmd.response[0] & MMC_STATUS_MASK) {
129 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
130                                 printf("Status Error: 0x%08X\n",
131                                         cmd.response[0]);
132 #endif
133                                 return COMM_ERR;
134                         }
135                 } else if (--retries < 0)
136                         return err;
137
138                 udelay(1000);
139
140         } while (timeout--);
141
142 #ifdef CONFIG_MMC_TRACE
143         status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
144         printf("CURR STATE:%d\n", status);
145 #endif
146         if (timeout <= 0) {
147 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
148                 printf("Timeout waiting card ready\n");
149 #endif
150                 return TIMEOUT;
151         }
152         if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
153                 return SWITCH_ERR;
154
155         return 0;
156 }
157
158 int mmc_set_blocklen(struct mmc *mmc, int len)
159 {
160         struct mmc_cmd cmd;
161
162         if (mmc->card_caps & MMC_MODE_DDR_52MHz)
163                 return 0;
164
165         cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
166         cmd.resp_type = MMC_RSP_R1;
167         cmd.cmdarg = len;
168
169         return mmc_send_cmd(mmc, &cmd, NULL);
170 }
171
172 struct mmc *find_mmc_device(int dev_num)
173 {
174         struct mmc *m;
175         struct list_head *entry;
176
177         list_for_each(entry, &mmc_devices) {
178                 m = list_entry(entry, struct mmc, link);
179
180                 if (m->block_dev.dev == dev_num)
181                         return m;
182         }
183
184 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
185         printf("MMC Device %d not found\n", dev_num);
186 #endif
187
188         return NULL;
189 }
190
191 static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
192                            lbaint_t blkcnt)
193 {
194         struct mmc_cmd cmd;
195         struct mmc_data data;
196
197         if (blkcnt > 1)
198                 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
199         else
200                 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
201
202         if (mmc->high_capacity)
203                 cmd.cmdarg = start;
204         else
205                 cmd.cmdarg = start * mmc->read_bl_len;
206
207         cmd.resp_type = MMC_RSP_R1;
208
209         data.dest = dst;
210         data.blocks = blkcnt;
211         data.blocksize = mmc->read_bl_len;
212         data.flags = MMC_DATA_READ;
213
214         if (mmc_send_cmd(mmc, &cmd, &data))
215                 return 0;
216
217         if (blkcnt > 1) {
218                 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
219                 cmd.cmdarg = 0;
220                 cmd.resp_type = MMC_RSP_R1b;
221                 if (mmc_send_cmd(mmc, &cmd, NULL)) {
222 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
223                         printf("mmc fail to send stop cmd\n");
224 #endif
225                         return 0;
226                 }
227         }
228
229         return blkcnt;
230 }
231
232 static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst)
233 {
234         lbaint_t cur, blocks_todo = blkcnt;
235
236         if (blkcnt == 0)
237                 return 0;
238
239         struct mmc *mmc = find_mmc_device(dev_num);
240         if (!mmc)
241                 return 0;
242
243         if ((start + blkcnt) > mmc->block_dev.lba) {
244 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
245                 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
246                         start + blkcnt, mmc->block_dev.lba);
247 #endif
248                 return 0;
249         }
250
251         if (mmc_set_blocklen(mmc, mmc->read_bl_len))
252                 return 0;
253
254         do {
255                 cur = (blocks_todo > mmc->cfg->b_max) ?
256                         mmc->cfg->b_max : blocks_todo;
257                 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
258                         return 0;
259                 blocks_todo -= cur;
260                 start += cur;
261                 dst += cur * mmc->read_bl_len;
262         } while (blocks_todo > 0);
263
264         return blkcnt;
265 }
266
267 static int mmc_go_idle(struct mmc *mmc)
268 {
269         struct mmc_cmd cmd;
270         int err;
271
272         udelay(1000);
273
274         cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
275         cmd.cmdarg = 0;
276         cmd.resp_type = MMC_RSP_NONE;
277
278         err = mmc_send_cmd(mmc, &cmd, NULL);
279
280         if (err)
281                 return err;
282
283         udelay(2000);
284
285         return 0;
286 }
287
288 static int sd_send_op_cond(struct mmc *mmc)
289 {
290         int timeout = 1000;
291         int err;
292         struct mmc_cmd cmd;
293
294         do {
295                 cmd.cmdidx = MMC_CMD_APP_CMD;
296                 cmd.resp_type = MMC_RSP_R1;
297                 cmd.cmdarg = 0;
298
299                 err = mmc_send_cmd(mmc, &cmd, NULL);
300
301                 if (err)
302                         return err;
303
304                 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
305                 cmd.resp_type = MMC_RSP_R3;
306
307                 /*
308                  * Most cards do not answer if some reserved bits
309                  * in the ocr are set. However, Some controller
310                  * can set bit 7 (reserved for low voltages), but
311                  * how to manage low voltages SD card is not yet
312                  * specified.
313                  */
314                 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
315                         (mmc->cfg->voltages & 0xff8000);
316
317                 if (mmc->version == SD_VERSION_2)
318                         cmd.cmdarg |= OCR_HCS;
319
320                 err = mmc_send_cmd(mmc, &cmd, NULL);
321
322                 if (err)
323                         return err;
324
325                 udelay(1000);
326         } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
327
328         if (timeout <= 0)
329                 return UNUSABLE_ERR;
330
331         if (mmc->version != SD_VERSION_2)
332                 mmc->version = SD_VERSION_1_0;
333
334         if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
335                 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
336                 cmd.resp_type = MMC_RSP_R3;
337                 cmd.cmdarg = 0;
338
339                 err = mmc_send_cmd(mmc, &cmd, NULL);
340
341                 if (err)
342                         return err;
343         }
344
345         mmc->ocr = cmd.response[0];
346
347         mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
348         mmc->rca = 0;
349
350         return 0;
351 }
352
353 /* We pass in the cmd since otherwise the init seems to fail */
354 static int mmc_send_op_cond_iter(struct mmc *mmc, struct mmc_cmd *cmd,
355                 int use_arg)
356 {
357         int err;
358
359         cmd->cmdidx = MMC_CMD_SEND_OP_COND;
360         cmd->resp_type = MMC_RSP_R3;
361         cmd->cmdarg = 0;
362         if (use_arg && !mmc_host_is_spi(mmc)) {
363                 cmd->cmdarg =
364                         (mmc->cfg->voltages &
365                         (mmc->op_cond_response & OCR_VOLTAGE_MASK)) |
366                         (mmc->op_cond_response & OCR_ACCESS_MODE);
367
368                 if (mmc->cfg->host_caps & MMC_MODE_HC)
369                         cmd->cmdarg |= OCR_HCS;
370         }
371         err = mmc_send_cmd(mmc, cmd, NULL);
372         if (err)
373                 return err;
374         mmc->op_cond_response = cmd->response[0];
375         return 0;
376 }
377
378 static int mmc_send_op_cond(struct mmc *mmc)
379 {
380         struct mmc_cmd cmd;
381         int err, i;
382
383         /* Some cards seem to need this */
384         mmc_go_idle(mmc);
385
386         /* Asking to the card its capabilities */
387         mmc->op_cond_pending = 1;
388         for (i = 0; i < 2; i++) {
389                 err = mmc_send_op_cond_iter(mmc, &cmd, i != 0);
390                 if (err)
391                         return err;
392
393                 /* exit if not busy (flag seems to be inverted) */
394                 if (mmc->op_cond_response & OCR_BUSY)
395                         return 0;
396         }
397         return IN_PROGRESS;
398 }
399
400 static int mmc_complete_op_cond(struct mmc *mmc)
401 {
402         struct mmc_cmd cmd;
403         int timeout = 1000;
404         uint start;
405         int err;
406
407         mmc->op_cond_pending = 0;
408         start = get_timer(0);
409         do {
410                 err = mmc_send_op_cond_iter(mmc, &cmd, 1);
411                 if (err)
412                         return err;
413                 if (get_timer(start) > timeout)
414                         return UNUSABLE_ERR;
415                 udelay(100);
416         } while (!(mmc->op_cond_response & OCR_BUSY));
417
418         if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
419                 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
420                 cmd.resp_type = MMC_RSP_R3;
421                 cmd.cmdarg = 0;
422
423                 err = mmc_send_cmd(mmc, &cmd, NULL);
424
425                 if (err)
426                         return err;
427         }
428
429         mmc->version = MMC_VERSION_UNKNOWN;
430         mmc->ocr = cmd.response[0];
431
432         mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
433         mmc->rca = 1;
434
435         return 0;
436 }
437
438
439 static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
440 {
441         struct mmc_cmd cmd;
442         struct mmc_data data;
443         int err;
444
445         /* Get the Card Status Register */
446         cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
447         cmd.resp_type = MMC_RSP_R1;
448         cmd.cmdarg = 0;
449
450         data.dest = (char *)ext_csd;
451         data.blocks = 1;
452         data.blocksize = MMC_MAX_BLOCK_LEN;
453         data.flags = MMC_DATA_READ;
454
455         err = mmc_send_cmd(mmc, &cmd, &data);
456
457         return err;
458 }
459
460
461 static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
462 {
463         struct mmc_cmd cmd;
464         int timeout = 1000;
465         int ret;
466
467         cmd.cmdidx = MMC_CMD_SWITCH;
468         cmd.resp_type = MMC_RSP_R1b;
469         cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
470                                  (index << 16) |
471                                  (value << 8);
472
473         ret = mmc_send_cmd(mmc, &cmd, NULL);
474
475         /* Waiting for the ready status */
476         if (!ret)
477                 ret = mmc_send_status(mmc, timeout);
478
479         return ret;
480
481 }
482
483 static int mmc_change_freq(struct mmc *mmc)
484 {
485         ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
486         char cardtype;
487         int err;
488
489         mmc->card_caps = 0;
490
491         if (mmc_host_is_spi(mmc))
492                 return 0;
493
494         /* Only version 4 supports high-speed */
495         if (mmc->version < MMC_VERSION_4)
496                 return 0;
497
498         err = mmc_send_ext_csd(mmc, ext_csd);
499
500         if (err)
501                 return err;
502
503         cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
504
505         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
506
507         if (err)
508                 return err == SWITCH_ERR ? 0 : err;
509
510         /* Now check to see that it worked */
511         err = mmc_send_ext_csd(mmc, ext_csd);
512
513         if (err)
514                 return err;
515
516         /* No high-speed support */
517         if (!ext_csd[EXT_CSD_HS_TIMING])
518                 return 0;
519
520         /* High Speed is set, there are two types: 52MHz and 26MHz */
521         if (cardtype & EXT_CSD_CARD_TYPE_52) {
522                 if (cardtype & EXT_CSD_CARD_TYPE_DDR_52)
523                         mmc->card_caps |= MMC_MODE_DDR_52MHz;
524                 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
525         } else {
526                 mmc->card_caps |= MMC_MODE_HS;
527         }
528
529         return 0;
530 }
531
532 static int mmc_set_capacity(struct mmc *mmc, int part_num)
533 {
534         switch (part_num) {
535         case 0:
536                 mmc->capacity = mmc->capacity_user;
537                 break;
538         case 1:
539         case 2:
540                 mmc->capacity = mmc->capacity_boot;
541                 break;
542         case 3:
543                 mmc->capacity = mmc->capacity_rpmb;
544                 break;
545         case 4:
546         case 5:
547         case 6:
548         case 7:
549                 mmc->capacity = mmc->capacity_gp[part_num - 4];
550                 break;
551         default:
552                 return -1;
553         }
554
555         mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
556
557         return 0;
558 }
559
560 int mmc_select_hwpart(int dev_num, int hwpart)
561 {
562         struct mmc *mmc = find_mmc_device(dev_num);
563         int ret;
564
565         if (!mmc)
566                 return -ENODEV;
567
568         if (mmc->part_num == hwpart)
569                 return 0;
570
571         if (mmc->part_config == MMCPART_NOAVAILABLE) {
572                 printf("Card doesn't support part_switch\n");
573                 return -EMEDIUMTYPE;
574         }
575
576         ret = mmc_switch_part(dev_num, hwpart);
577         if (ret)
578                 return ret;
579
580         mmc->part_num = hwpart;
581
582         return 0;
583 }
584
585
586 int mmc_switch_part(int dev_num, unsigned int part_num)
587 {
588         struct mmc *mmc = find_mmc_device(dev_num);
589         int ret;
590
591         if (!mmc)
592                 return -1;
593
594         ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
595                          (mmc->part_config & ~PART_ACCESS_MASK)
596                          | (part_num & PART_ACCESS_MASK));
597         if (ret)
598                 return ret;
599
600         return mmc_set_capacity(mmc, part_num);
601 }
602
603 int mmc_getcd(struct mmc *mmc)
604 {
605         int cd;
606
607         cd = board_mmc_getcd(mmc);
608
609         if (cd < 0) {
610                 if (mmc->cfg->ops->getcd)
611                         cd = mmc->cfg->ops->getcd(mmc);
612                 else
613                         cd = 1;
614         }
615
616         return cd;
617 }
618
619 static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
620 {
621         struct mmc_cmd cmd;
622         struct mmc_data data;
623
624         /* Switch the frequency */
625         cmd.cmdidx = SD_CMD_SWITCH_FUNC;
626         cmd.resp_type = MMC_RSP_R1;
627         cmd.cmdarg = (mode << 31) | 0xffffff;
628         cmd.cmdarg &= ~(0xf << (group * 4));
629         cmd.cmdarg |= value << (group * 4);
630
631         data.dest = (char *)resp;
632         data.blocksize = 64;
633         data.blocks = 1;
634         data.flags = MMC_DATA_READ;
635
636         return mmc_send_cmd(mmc, &cmd, &data);
637 }
638
639
640 static int sd_change_freq(struct mmc *mmc)
641 {
642         int err;
643         struct mmc_cmd cmd;
644         ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
645         ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
646         struct mmc_data data;
647         int timeout;
648
649         mmc->card_caps = 0;
650
651         if (mmc_host_is_spi(mmc))
652                 return 0;
653
654         /* Read the SCR to find out if this card supports higher speeds */
655         cmd.cmdidx = MMC_CMD_APP_CMD;
656         cmd.resp_type = MMC_RSP_R1;
657         cmd.cmdarg = mmc->rca << 16;
658
659         err = mmc_send_cmd(mmc, &cmd, NULL);
660
661         if (err)
662                 return err;
663
664         cmd.cmdidx = SD_CMD_APP_SEND_SCR;
665         cmd.resp_type = MMC_RSP_R1;
666         cmd.cmdarg = 0;
667
668         timeout = 3;
669
670 retry_scr:
671         data.dest = (char *)scr;
672         data.blocksize = 8;
673         data.blocks = 1;
674         data.flags = MMC_DATA_READ;
675
676         err = mmc_send_cmd(mmc, &cmd, &data);
677
678         if (err) {
679                 if (timeout--)
680                         goto retry_scr;
681
682                 return err;
683         }
684
685         mmc->scr[0] = __be32_to_cpu(scr[0]);
686         mmc->scr[1] = __be32_to_cpu(scr[1]);
687
688         switch ((mmc->scr[0] >> 24) & 0xf) {
689                 case 0:
690                         mmc->version = SD_VERSION_1_0;
691                         break;
692                 case 1:
693                         mmc->version = SD_VERSION_1_10;
694                         break;
695                 case 2:
696                         mmc->version = SD_VERSION_2;
697                         if ((mmc->scr[0] >> 15) & 0x1)
698                                 mmc->version = SD_VERSION_3;
699                         break;
700                 default:
701                         mmc->version = SD_VERSION_1_0;
702                         break;
703         }
704
705         if (mmc->scr[0] & SD_DATA_4BIT)
706                 mmc->card_caps |= MMC_MODE_4BIT;
707
708         /* Version 1.0 doesn't support switching */
709         if (mmc->version == SD_VERSION_1_0)
710                 return 0;
711
712         timeout = 4;
713         while (timeout--) {
714                 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
715                                 (u8 *)switch_status);
716
717                 if (err)
718                         return err;
719
720                 /* The high-speed function is busy.  Try again */
721                 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
722                         break;
723         }
724
725         /* If high-speed isn't supported, we return */
726         if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
727                 return 0;
728
729         /*
730          * If the host doesn't support SD_HIGHSPEED, do not switch card to
731          * HIGHSPEED mode even if the card support SD_HIGHSPPED.
732          * This can avoid furthur problem when the card runs in different
733          * mode between the host.
734          */
735         if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
736                 (mmc->cfg->host_caps & MMC_MODE_HS)))
737                 return 0;
738
739         err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
740
741         if (err)
742                 return err;
743
744         if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
745                 mmc->card_caps |= MMC_MODE_HS;
746
747         return 0;
748 }
749
750 /* frequency bases */
751 /* divided by 10 to be nice to platforms without floating point */
752 static const int fbase[] = {
753         10000,
754         100000,
755         1000000,
756         10000000,
757 };
758
759 /* Multiplier values for TRAN_SPEED.  Multiplied by 10 to be nice
760  * to platforms without floating point.
761  */
762 static const int multipliers[] = {
763         0,      /* reserved */
764         10,
765         12,
766         13,
767         15,
768         20,
769         25,
770         30,
771         35,
772         40,
773         45,
774         50,
775         55,
776         60,
777         70,
778         80,
779 };
780
781 static void mmc_set_ios(struct mmc *mmc)
782 {
783         if (mmc->cfg->ops->set_ios)
784                 mmc->cfg->ops->set_ios(mmc);
785 }
786
787 void mmc_set_clock(struct mmc *mmc, uint clock)
788 {
789         if (clock > mmc->cfg->f_max)
790                 clock = mmc->cfg->f_max;
791
792         if (clock < mmc->cfg->f_min)
793                 clock = mmc->cfg->f_min;
794
795         mmc->clock = clock;
796
797         mmc_set_ios(mmc);
798 }
799
800 static void mmc_set_bus_width(struct mmc *mmc, uint width)
801 {
802         mmc->bus_width = width;
803
804         mmc_set_ios(mmc);
805 }
806
807 static int mmc_startup(struct mmc *mmc)
808 {
809         int err, i;
810         uint mult, freq;
811         u64 cmult, csize, capacity;
812         struct mmc_cmd cmd;
813         ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
814         ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
815         int timeout = 1000;
816
817 #ifdef CONFIG_MMC_SPI_CRC_ON
818         if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
819                 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
820                 cmd.resp_type = MMC_RSP_R1;
821                 cmd.cmdarg = 1;
822                 err = mmc_send_cmd(mmc, &cmd, NULL);
823
824                 if (err)
825                         return err;
826         }
827 #endif
828
829         /* Put the Card in Identify Mode */
830         cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
831                 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
832         cmd.resp_type = MMC_RSP_R2;
833         cmd.cmdarg = 0;
834
835         err = mmc_send_cmd(mmc, &cmd, NULL);
836
837         if (err)
838                 return err;
839
840         memcpy(mmc->cid, cmd.response, 16);
841
842         /*
843          * For MMC cards, set the Relative Address.
844          * For SD cards, get the Relatvie Address.
845          * This also puts the cards into Standby State
846          */
847         if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
848                 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
849                 cmd.cmdarg = mmc->rca << 16;
850                 cmd.resp_type = MMC_RSP_R6;
851
852                 err = mmc_send_cmd(mmc, &cmd, NULL);
853
854                 if (err)
855                         return err;
856
857                 if (IS_SD(mmc))
858                         mmc->rca = (cmd.response[0] >> 16) & 0xffff;
859         }
860
861         /* Get the Card-Specific Data */
862         cmd.cmdidx = MMC_CMD_SEND_CSD;
863         cmd.resp_type = MMC_RSP_R2;
864         cmd.cmdarg = mmc->rca << 16;
865
866         err = mmc_send_cmd(mmc, &cmd, NULL);
867
868         /* Waiting for the ready status */
869         mmc_send_status(mmc, timeout);
870
871         if (err)
872                 return err;
873
874         mmc->csd[0] = cmd.response[0];
875         mmc->csd[1] = cmd.response[1];
876         mmc->csd[2] = cmd.response[2];
877         mmc->csd[3] = cmd.response[3];
878
879         if (mmc->version == MMC_VERSION_UNKNOWN) {
880                 int version = (cmd.response[0] >> 26) & 0xf;
881
882                 switch (version) {
883                         case 0:
884                                 mmc->version = MMC_VERSION_1_2;
885                                 break;
886                         case 1:
887                                 mmc->version = MMC_VERSION_1_4;
888                                 break;
889                         case 2:
890                                 mmc->version = MMC_VERSION_2_2;
891                                 break;
892                         case 3:
893                                 mmc->version = MMC_VERSION_3;
894                                 break;
895                         case 4:
896                                 mmc->version = MMC_VERSION_4;
897                                 break;
898                         default:
899                                 mmc->version = MMC_VERSION_1_2;
900                                 break;
901                 }
902         }
903
904         /* divide frequency by 10, since the mults are 10x bigger */
905         freq = fbase[(cmd.response[0] & 0x7)];
906         mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
907
908         mmc->tran_speed = freq * mult;
909
910         mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
911         mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
912
913         if (IS_SD(mmc))
914                 mmc->write_bl_len = mmc->read_bl_len;
915         else
916                 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
917
918         if (mmc->high_capacity) {
919                 csize = (mmc->csd[1] & 0x3f) << 16
920                         | (mmc->csd[2] & 0xffff0000) >> 16;
921                 cmult = 8;
922         } else {
923                 csize = (mmc->csd[1] & 0x3ff) << 2
924                         | (mmc->csd[2] & 0xc0000000) >> 30;
925                 cmult = (mmc->csd[2] & 0x00038000) >> 15;
926         }
927
928         mmc->capacity_user = (csize + 1) << (cmult + 2);
929         mmc->capacity_user *= mmc->read_bl_len;
930         mmc->capacity_boot = 0;
931         mmc->capacity_rpmb = 0;
932         for (i = 0; i < 4; i++)
933                 mmc->capacity_gp[i] = 0;
934
935         if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
936                 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
937
938         if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
939                 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
940
941         if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
942                 cmd.cmdidx = MMC_CMD_SET_DSR;
943                 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
944                 cmd.resp_type = MMC_RSP_NONE;
945                 if (mmc_send_cmd(mmc, &cmd, NULL))
946                         printf("MMC: SET_DSR failed\n");
947         }
948
949         /* Select the card, and put it into Transfer Mode */
950         if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
951                 cmd.cmdidx = MMC_CMD_SELECT_CARD;
952                 cmd.resp_type = MMC_RSP_R1;
953                 cmd.cmdarg = mmc->rca << 16;
954                 err = mmc_send_cmd(mmc, &cmd, NULL);
955
956                 if (err)
957                         return err;
958         }
959
960         /*
961          * For SD, its erase group is always one sector
962          */
963         mmc->erase_grp_size = 1;
964         mmc->part_config = MMCPART_NOAVAILABLE;
965         if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
966                 /* check  ext_csd version and capacity */
967                 err = mmc_send_ext_csd(mmc, ext_csd);
968                 if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
969                         /*
970                          * According to the JEDEC Standard, the value of
971                          * ext_csd's capacity is valid if the value is more
972                          * than 2GB
973                          */
974                         capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
975                                         | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
976                                         | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
977                                         | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
978                         capacity *= MMC_MAX_BLOCK_LEN;
979                         if ((capacity >> 20) > 2 * 1024)
980                                 mmc->capacity_user = capacity;
981                 }
982
983                 switch (ext_csd[EXT_CSD_REV]) {
984                 case 1:
985                         mmc->version = MMC_VERSION_4_1;
986                         break;
987                 case 2:
988                         mmc->version = MMC_VERSION_4_2;
989                         break;
990                 case 3:
991                         mmc->version = MMC_VERSION_4_3;
992                         break;
993                 case 5:
994                         mmc->version = MMC_VERSION_4_41;
995                         break;
996                 case 6:
997                         mmc->version = MMC_VERSION_4_5;
998                         break;
999                 }
1000
1001                 /*
1002                  * Host needs to enable ERASE_GRP_DEF bit if device is
1003                  * partitioned. This bit will be lost every time after a reset
1004                  * or power off. This will affect erase size.
1005                  */
1006                 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
1007                     (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) {
1008                         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1009                                 EXT_CSD_ERASE_GROUP_DEF, 1);
1010
1011                         if (err)
1012                                 return err;
1013                         else
1014                                 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
1015
1016                         /* Read out group size from ext_csd */
1017                         mmc->erase_grp_size =
1018                                 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
1019                                         MMC_MAX_BLOCK_LEN * 1024;
1020                 } else {
1021                         /* Calculate the group size from the csd value. */
1022                         int erase_gsz, erase_gmul;
1023                         erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1024                         erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1025                         mmc->erase_grp_size = (erase_gsz + 1)
1026                                 * (erase_gmul + 1);
1027                 }
1028
1029                 /* store the partition info of emmc */
1030                 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1031                     ext_csd[EXT_CSD_BOOT_MULT])
1032                         mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
1033
1034                 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1035
1036                 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1037
1038                 for (i = 0; i < 4; i++) {
1039                         int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
1040                         mmc->capacity_gp[i] = (ext_csd[idx + 2] << 16) +
1041                                 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1042                         mmc->capacity_gp[i] *=
1043                                 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1044                         mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1045                 }
1046         }
1047
1048         err = mmc_set_capacity(mmc, mmc->part_num);
1049         if (err)
1050                 return err;
1051
1052         if (IS_SD(mmc))
1053                 err = sd_change_freq(mmc);
1054         else
1055                 err = mmc_change_freq(mmc);
1056
1057         if (err)
1058                 return err;
1059
1060         /* Restrict card's capabilities by what the host can do */
1061         mmc->card_caps &= mmc->cfg->host_caps;
1062
1063         if (IS_SD(mmc)) {
1064                 if (mmc->card_caps & MMC_MODE_4BIT) {
1065                         cmd.cmdidx = MMC_CMD_APP_CMD;
1066                         cmd.resp_type = MMC_RSP_R1;
1067                         cmd.cmdarg = mmc->rca << 16;
1068
1069                         err = mmc_send_cmd(mmc, &cmd, NULL);
1070                         if (err)
1071                                 return err;
1072
1073                         cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1074                         cmd.resp_type = MMC_RSP_R1;
1075                         cmd.cmdarg = 2;
1076                         err = mmc_send_cmd(mmc, &cmd, NULL);
1077                         if (err)
1078                                 return err;
1079
1080                         mmc_set_bus_width(mmc, 4);
1081                 }
1082
1083                 if (mmc->card_caps & MMC_MODE_HS)
1084                         mmc->tran_speed = 50000000;
1085                 else
1086                         mmc->tran_speed = 25000000;
1087         } else {
1088                 int idx;
1089
1090                 /* An array of possible bus widths in order of preference */
1091                 static unsigned ext_csd_bits[] = {
1092                         EXT_CSD_DDR_BUS_WIDTH_8,
1093                         EXT_CSD_DDR_BUS_WIDTH_4,
1094                         EXT_CSD_BUS_WIDTH_8,
1095                         EXT_CSD_BUS_WIDTH_4,
1096                         EXT_CSD_BUS_WIDTH_1,
1097                 };
1098
1099                 /* An array to map CSD bus widths to host cap bits */
1100                 static unsigned ext_to_hostcaps[] = {
1101                         [EXT_CSD_DDR_BUS_WIDTH_4] = MMC_MODE_DDR_52MHz,
1102                         [EXT_CSD_DDR_BUS_WIDTH_8] = MMC_MODE_DDR_52MHz,
1103                         [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1104                         [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1105                 };
1106
1107                 /* An array to map chosen bus width to an integer */
1108                 static unsigned widths[] = {
1109                         8, 4, 8, 4, 1,
1110                 };
1111
1112                 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1113                         unsigned int extw = ext_csd_bits[idx];
1114
1115                         /*
1116                          * Check to make sure the controller supports
1117                          * this bus width, if it's more than 1
1118                          */
1119                         if (extw != EXT_CSD_BUS_WIDTH_1 &&
1120                                         !(mmc->cfg->host_caps & ext_to_hostcaps[extw]))
1121                                 continue;
1122
1123                         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1124                                         EXT_CSD_BUS_WIDTH, extw);
1125
1126                         if (err)
1127                                 continue;
1128
1129                         mmc_set_bus_width(mmc, widths[idx]);
1130
1131                         err = mmc_send_ext_csd(mmc, test_csd);
1132                         if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1133                                     == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1134                                  && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1135                                     == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1136                                  && ext_csd[EXT_CSD_REV] \
1137                                     == test_csd[EXT_CSD_REV]
1138                                  && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1139                                     == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1140                                  && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1141                                         &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
1142
1143                                 mmc->card_caps |= ext_to_hostcaps[extw];
1144                                 break;
1145                         }
1146                 }
1147
1148                 if (mmc->card_caps & MMC_MODE_HS) {
1149                         if (mmc->card_caps & MMC_MODE_HS_52MHz)
1150                                 mmc->tran_speed = 52000000;
1151                         else
1152                                 mmc->tran_speed = 26000000;
1153                 }
1154         }
1155
1156         mmc_set_clock(mmc, mmc->tran_speed);
1157
1158         /* fill in device description */
1159         mmc->block_dev.lun = 0;
1160         mmc->block_dev.type = 0;
1161         mmc->block_dev.blksz = mmc->read_bl_len;
1162         mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
1163         mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
1164 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1165         sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1166                 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1167                 (mmc->cid[3] >> 16) & 0xffff);
1168         sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1169                 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1170                 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1171                 (mmc->cid[2] >> 24) & 0xff);
1172         sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1173                 (mmc->cid[2] >> 16) & 0xf);
1174 #else
1175         mmc->block_dev.vendor[0] = 0;
1176         mmc->block_dev.product[0] = 0;
1177         mmc->block_dev.revision[0] = 0;
1178 #endif
1179 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
1180         init_part(&mmc->block_dev);
1181 #endif
1182
1183         return 0;
1184 }
1185
1186 static int mmc_send_if_cond(struct mmc *mmc)
1187 {
1188         struct mmc_cmd cmd;
1189         int err;
1190
1191         cmd.cmdidx = SD_CMD_SEND_IF_COND;
1192         /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1193         cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
1194         cmd.resp_type = MMC_RSP_R7;
1195
1196         err = mmc_send_cmd(mmc, &cmd, NULL);
1197
1198         if (err)
1199                 return err;
1200
1201         if ((cmd.response[0] & 0xff) != 0xaa)
1202                 return UNUSABLE_ERR;
1203         else
1204                 mmc->version = SD_VERSION_2;
1205
1206         return 0;
1207 }
1208
1209 /* not used any more */
1210 int __deprecated mmc_register(struct mmc *mmc)
1211 {
1212 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1213         printf("%s is deprecated! use mmc_create() instead.\n", __func__);
1214 #endif
1215         return -1;
1216 }
1217
1218 struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
1219 {
1220         struct mmc *mmc;
1221
1222         /* quick validation */
1223         if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1224                         cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1225                 return NULL;
1226
1227         mmc = calloc(1, sizeof(*mmc));
1228         if (mmc == NULL)
1229                 return NULL;
1230
1231         mmc->cfg = cfg;
1232         mmc->priv = priv;
1233
1234         /* the following chunk was mmc_register() */
1235
1236         /* Setup dsr related values */
1237         mmc->dsr_imp = 0;
1238         mmc->dsr = 0xffffffff;
1239         /* Setup the universal parts of the block interface just once */
1240         mmc->block_dev.if_type = IF_TYPE_MMC;
1241         mmc->block_dev.dev = cur_dev_num++;
1242         mmc->block_dev.removable = 1;
1243         mmc->block_dev.block_read = mmc_bread;
1244         mmc->block_dev.block_write = mmc_bwrite;
1245         mmc->block_dev.block_erase = mmc_berase;
1246
1247         /* setup initial part type */
1248         mmc->block_dev.part_type = mmc->cfg->part_type;
1249
1250         INIT_LIST_HEAD(&mmc->link);
1251
1252         list_add_tail(&mmc->link, &mmc_devices);
1253
1254         return mmc;
1255 }
1256
1257 void mmc_destroy(struct mmc *mmc)
1258 {
1259         /* only freeing memory for now */
1260         free(mmc);
1261 }
1262
1263 #ifdef CONFIG_PARTITIONS
1264 block_dev_desc_t *mmc_get_dev(int dev)
1265 {
1266         struct mmc *mmc = find_mmc_device(dev);
1267         if (!mmc || mmc_init(mmc))
1268                 return NULL;
1269
1270         return &mmc->block_dev;
1271 }
1272 #endif
1273
1274 int mmc_start_init(struct mmc *mmc)
1275 {
1276         int err;
1277
1278         /* we pretend there's no card when init is NULL */
1279         if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
1280                 mmc->has_init = 0;
1281 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1282                 printf("MMC: no card present\n");
1283 #endif
1284                 return NO_CARD_ERR;
1285         }
1286
1287         if (mmc->has_init)
1288                 return 0;
1289
1290         /* made sure it's not NULL earlier */
1291         err = mmc->cfg->ops->init(mmc);
1292
1293         if (err)
1294                 return err;
1295
1296         mmc_set_bus_width(mmc, 1);
1297         mmc_set_clock(mmc, 1);
1298
1299         /* Reset the Card */
1300         err = mmc_go_idle(mmc);
1301
1302         if (err)
1303                 return err;
1304
1305         /* The internal partition reset to user partition(0) at every CMD0*/
1306         mmc->part_num = 0;
1307
1308         /* Test for SD version 2 */
1309         err = mmc_send_if_cond(mmc);
1310
1311         /* Now try to get the SD card's operating condition */
1312         err = sd_send_op_cond(mmc);
1313
1314         /* If the command timed out, we check for an MMC card */
1315         if (err == TIMEOUT) {
1316                 err = mmc_send_op_cond(mmc);
1317
1318                 if (err && err != IN_PROGRESS) {
1319 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1320                         printf("Card did not respond to voltage select!\n");
1321 #endif
1322                         return UNUSABLE_ERR;
1323                 }
1324         }
1325
1326         if (err == IN_PROGRESS)
1327                 mmc->init_in_progress = 1;
1328
1329         return err;
1330 }
1331
1332 static int mmc_complete_init(struct mmc *mmc)
1333 {
1334         int err = 0;
1335
1336         if (mmc->op_cond_pending)
1337                 err = mmc_complete_op_cond(mmc);
1338
1339         if (!err)
1340                 err = mmc_startup(mmc);
1341         if (err)
1342                 mmc->has_init = 0;
1343         else
1344                 mmc->has_init = 1;
1345         mmc->init_in_progress = 0;
1346         return err;
1347 }
1348
1349 int mmc_init(struct mmc *mmc)
1350 {
1351         int err = IN_PROGRESS;
1352         unsigned start;
1353
1354         if (mmc->has_init)
1355                 return 0;
1356
1357         start = get_timer(0);
1358
1359         if (!mmc->init_in_progress)
1360                 err = mmc_start_init(mmc);
1361
1362         if (!err || err == IN_PROGRESS)
1363                 err = mmc_complete_init(mmc);
1364         debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1365         return err;
1366 }
1367
1368 int mmc_set_dsr(struct mmc *mmc, u16 val)
1369 {
1370         mmc->dsr = val;
1371         return 0;
1372 }
1373
1374 /* CPU-specific MMC initializations */
1375 __weak int cpu_mmc_init(bd_t *bis)
1376 {
1377         return -1;
1378 }
1379
1380 /* board-specific MMC initializations. */
1381 __weak int board_mmc_init(bd_t *bis)
1382 {
1383         return -1;
1384 }
1385
1386 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1387
1388 void print_mmc_devices(char separator)
1389 {
1390         struct mmc *m;
1391         struct list_head *entry;
1392
1393         list_for_each(entry, &mmc_devices) {
1394                 m = list_entry(entry, struct mmc, link);
1395
1396                 printf("%s: %d", m->cfg->name, m->block_dev.dev);
1397
1398                 if (entry->next != &mmc_devices)
1399                         printf("%c ", separator);
1400         }
1401
1402         printf("\n");
1403 }
1404
1405 #else
1406 void print_mmc_devices(char separator) { }
1407 #endif
1408
1409 int get_mmc_num(void)
1410 {
1411         return cur_dev_num;
1412 }
1413
1414 void mmc_set_preinit(struct mmc *mmc, int preinit)
1415 {
1416         mmc->preinit = preinit;
1417 }
1418
1419 static void do_preinit(void)
1420 {
1421         struct mmc *m;
1422         struct list_head *entry;
1423
1424         list_for_each(entry, &mmc_devices) {
1425                 m = list_entry(entry, struct mmc, link);
1426
1427                 if (m->preinit)
1428                         mmc_start_init(m);
1429         }
1430 }
1431
1432
1433 int mmc_initialize(bd_t *bis)
1434 {
1435         INIT_LIST_HEAD (&mmc_devices);
1436         cur_dev_num = 0;
1437
1438         if (board_mmc_init(bis) < 0)
1439                 cpu_mmc_init(bis);
1440
1441 #ifndef CONFIG_SPL_BUILD
1442         print_mmc_devices(',');
1443 #endif
1444
1445         do_preinit();
1446         return 0;
1447 }
1448
1449 #ifdef CONFIG_SUPPORT_EMMC_BOOT
1450 /*
1451  * This function changes the size of boot partition and the size of rpmb
1452  * partition present on EMMC devices.
1453  *
1454  * Input Parameters:
1455  * struct *mmc: pointer for the mmc device strcuture
1456  * bootsize: size of boot partition
1457  * rpmbsize: size of rpmb partition
1458  *
1459  * Returns 0 on success.
1460  */
1461
1462 int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1463                                 unsigned long rpmbsize)
1464 {
1465         int err;
1466         struct mmc_cmd cmd;
1467
1468         /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1469         cmd.cmdidx = MMC_CMD_RES_MAN;
1470         cmd.resp_type = MMC_RSP_R1b;
1471         cmd.cmdarg = MMC_CMD62_ARG1;
1472
1473         err = mmc_send_cmd(mmc, &cmd, NULL);
1474         if (err) {
1475                 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1476                 return err;
1477         }
1478
1479         /* Boot partition changing mode */
1480         cmd.cmdidx = MMC_CMD_RES_MAN;
1481         cmd.resp_type = MMC_RSP_R1b;
1482         cmd.cmdarg = MMC_CMD62_ARG2;
1483
1484         err = mmc_send_cmd(mmc, &cmd, NULL);
1485         if (err) {
1486                 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1487                 return err;
1488         }
1489         /* boot partition size is multiple of 128KB */
1490         bootsize = (bootsize * 1024) / 128;
1491
1492         /* Arg: boot partition size */
1493         cmd.cmdidx = MMC_CMD_RES_MAN;
1494         cmd.resp_type = MMC_RSP_R1b;
1495         cmd.cmdarg = bootsize;
1496
1497         err = mmc_send_cmd(mmc, &cmd, NULL);
1498         if (err) {
1499                 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1500                 return err;
1501         }
1502         /* RPMB partition size is multiple of 128KB */
1503         rpmbsize = (rpmbsize * 1024) / 128;
1504         /* Arg: RPMB partition size */
1505         cmd.cmdidx = MMC_CMD_RES_MAN;
1506         cmd.resp_type = MMC_RSP_R1b;
1507         cmd.cmdarg = rpmbsize;
1508
1509         err = mmc_send_cmd(mmc, &cmd, NULL);
1510         if (err) {
1511                 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1512                 return err;
1513         }
1514         return 0;
1515 }
1516
1517 /*
1518  * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1519  * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1520  * and BOOT_MODE.
1521  *
1522  * Returns 0 on success.
1523  */
1524 int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1525 {
1526         int err;
1527
1528         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1529                          EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1530                          EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1531                          EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1532
1533         if (err)
1534                 return err;
1535         return 0;
1536 }
1537
1538 /*
1539  * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1540  * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1541  * PARTITION_ACCESS.
1542  *
1543  * Returns 0 on success.
1544  */
1545 int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1546 {
1547         int err;
1548
1549         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1550                          EXT_CSD_BOOT_ACK(ack) |
1551                          EXT_CSD_BOOT_PART_NUM(part_num) |
1552                          EXT_CSD_PARTITION_ACCESS(access));
1553
1554         if (err)
1555                 return err;
1556         return 0;
1557 }
1558
1559 /*
1560  * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1561  * for enable.  Note that this is a write-once field for non-zero values.
1562  *
1563  * Returns 0 on success.
1564  */
1565 int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1566 {
1567         return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1568                           enable);
1569 }
1570 #endif