]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/mmc/mmc.c
Merge branch 'master' of git://git.denx.de/u-boot-mpc85xx
[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 <mmc.h>
14 #include <part.h>
15 #include <malloc.h>
16 #include <linux/list.h>
17 #include <div64.h>
18 #include "mmc_private.h"
19
20 /* Set block count limit because of 16 bit register limit on some hardware*/
21 #ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
22 #define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
23 #endif
24
25 static struct list_head mmc_devices;
26 static int cur_dev_num = -1;
27
28 int __weak board_mmc_getwp(struct mmc *mmc)
29 {
30         return -1;
31 }
32
33 int mmc_getwp(struct mmc *mmc)
34 {
35         int wp;
36
37         wp = board_mmc_getwp(mmc);
38
39         if (wp < 0) {
40                 if (mmc->getwp)
41                         wp = mmc->getwp(mmc);
42                 else
43                         wp = 0;
44         }
45
46         return wp;
47 }
48
49 int __board_mmc_getcd(struct mmc *mmc) {
50         return -1;
51 }
52
53 int board_mmc_getcd(struct mmc *mmc)__attribute__((weak,
54         alias("__board_mmc_getcd")));
55
56 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
57 {
58         int ret;
59
60 #ifdef CONFIG_MMC_TRACE
61         int i;
62         u8 *ptr;
63
64         printf("CMD_SEND:%d\n", cmd->cmdidx);
65         printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
66         ret = mmc->send_cmd(mmc, cmd, data);
67         switch (cmd->resp_type) {
68                 case MMC_RSP_NONE:
69                         printf("\t\tMMC_RSP_NONE\n");
70                         break;
71                 case MMC_RSP_R1:
72                         printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
73                                 cmd->response[0]);
74                         break;
75                 case MMC_RSP_R1b:
76                         printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
77                                 cmd->response[0]);
78                         break;
79                 case MMC_RSP_R2:
80                         printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
81                                 cmd->response[0]);
82                         printf("\t\t          \t\t 0x%08X \n",
83                                 cmd->response[1]);
84                         printf("\t\t          \t\t 0x%08X \n",
85                                 cmd->response[2]);
86                         printf("\t\t          \t\t 0x%08X \n",
87                                 cmd->response[3]);
88                         printf("\n");
89                         printf("\t\t\t\t\tDUMPING DATA\n");
90                         for (i = 0; i < 4; i++) {
91                                 int j;
92                                 printf("\t\t\t\t\t%03d - ", i*4);
93                                 ptr = (u8 *)&cmd->response[i];
94                                 ptr += 3;
95                                 for (j = 0; j < 4; j++)
96                                         printf("%02X ", *ptr--);
97                                 printf("\n");
98                         }
99                         break;
100                 case MMC_RSP_R3:
101                         printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
102                                 cmd->response[0]);
103                         break;
104                 default:
105                         printf("\t\tERROR MMC rsp not supported\n");
106                         break;
107         }
108 #else
109         ret = mmc->send_cmd(mmc, cmd, data);
110 #endif
111         return ret;
112 }
113
114 int mmc_send_status(struct mmc *mmc, int timeout)
115 {
116         struct mmc_cmd cmd;
117         int err, retries = 5;
118 #ifdef CONFIG_MMC_TRACE
119         int status;
120 #endif
121
122         cmd.cmdidx = MMC_CMD_SEND_STATUS;
123         cmd.resp_type = MMC_RSP_R1;
124         if (!mmc_host_is_spi(mmc))
125                 cmd.cmdarg = mmc->rca << 16;
126
127         do {
128                 err = mmc_send_cmd(mmc, &cmd, NULL);
129                 if (!err) {
130                         if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
131                             (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
132                              MMC_STATE_PRG)
133                                 break;
134                         else if (cmd.response[0] & MMC_STATUS_MASK) {
135 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
136                                 printf("Status Error: 0x%08X\n",
137                                         cmd.response[0]);
138 #endif
139                                 return COMM_ERR;
140                         }
141                 } else if (--retries < 0)
142                         return err;
143
144                 udelay(1000);
145
146         } while (timeout--);
147
148 #ifdef CONFIG_MMC_TRACE
149         status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
150         printf("CURR STATE:%d\n", status);
151 #endif
152         if (timeout <= 0) {
153 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
154                 printf("Timeout waiting card ready\n");
155 #endif
156                 return TIMEOUT;
157         }
158
159         return 0;
160 }
161
162 int mmc_set_blocklen(struct mmc *mmc, int len)
163 {
164         struct mmc_cmd cmd;
165
166         cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
167         cmd.resp_type = MMC_RSP_R1;
168         cmd.cmdarg = len;
169
170         return mmc_send_cmd(mmc, &cmd, NULL);
171 }
172
173 struct mmc *find_mmc_device(int dev_num)
174 {
175         struct mmc *m;
176         struct list_head *entry;
177
178         list_for_each(entry, &mmc_devices) {
179                 m = list_entry(entry, struct mmc, link);
180
181                 if (m->block_dev.dev == dev_num)
182                         return m;
183         }
184
185 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
186         printf("MMC Device %d not found\n", dev_num);
187 #endif
188
189         return NULL;
190 }
191
192 static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
193                            lbaint_t blkcnt)
194 {
195         struct mmc_cmd cmd;
196         struct mmc_data data;
197
198         if (blkcnt > 1)
199                 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
200         else
201                 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
202
203         if (mmc->high_capacity)
204                 cmd.cmdarg = start;
205         else
206                 cmd.cmdarg = start * mmc->read_bl_len;
207
208         cmd.resp_type = MMC_RSP_R1;
209
210         data.dest = dst;
211         data.blocks = blkcnt;
212         data.blocksize = mmc->read_bl_len;
213         data.flags = MMC_DATA_READ;
214
215         if (mmc_send_cmd(mmc, &cmd, &data))
216                 return 0;
217
218         if (blkcnt > 1) {
219                 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
220                 cmd.cmdarg = 0;
221                 cmd.resp_type = MMC_RSP_R1b;
222                 if (mmc_send_cmd(mmc, &cmd, NULL)) {
223 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
224                         printf("mmc fail to send stop cmd\n");
225 #endif
226                         return 0;
227                 }
228         }
229
230         return blkcnt;
231 }
232
233 static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst)
234 {
235         lbaint_t cur, blocks_todo = blkcnt;
236
237         if (blkcnt == 0)
238                 return 0;
239
240         struct mmc *mmc = find_mmc_device(dev_num);
241         if (!mmc)
242                 return 0;
243
244         if ((start + blkcnt) > mmc->block_dev.lba) {
245 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
246                 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
247                         start + blkcnt, mmc->block_dev.lba);
248 #endif
249                 return 0;
250         }
251
252         if (mmc_set_blocklen(mmc, mmc->read_bl_len))
253                 return 0;
254
255         do {
256                 cur = (blocks_todo > mmc->b_max) ?  mmc->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->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->voltages &
365                         (mmc->op_cond_response & OCR_VOLTAGE_MASK)) |
366                         (mmc->op_cond_response & OCR_ACCESS_MODE);
367
368                 if (mmc->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 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 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;
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 & MMC_HS_52MHZ)
522                 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
523         else
524                 mmc->card_caps |= MMC_MODE_HS;
525
526         return 0;
527 }
528
529 static int mmc_set_capacity(struct mmc *mmc, int part_num)
530 {
531         switch (part_num) {
532         case 0:
533                 mmc->capacity = mmc->capacity_user;
534                 break;
535         case 1:
536         case 2:
537                 mmc->capacity = mmc->capacity_boot;
538                 break;
539         case 3:
540                 mmc->capacity = mmc->capacity_rpmb;
541                 break;
542         case 4:
543         case 5:
544         case 6:
545         case 7:
546                 mmc->capacity = mmc->capacity_gp[part_num - 4];
547                 break;
548         default:
549                 return -1;
550         }
551
552         mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
553
554         return 0;
555 }
556
557 int mmc_switch_part(int dev_num, unsigned int part_num)
558 {
559         struct mmc *mmc = find_mmc_device(dev_num);
560         int ret;
561
562         if (!mmc)
563                 return -1;
564
565         ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
566                          (mmc->part_config & ~PART_ACCESS_MASK)
567                          | (part_num & PART_ACCESS_MASK));
568         if (ret)
569                 return ret;
570
571         return mmc_set_capacity(mmc, part_num);
572 }
573
574 int mmc_getcd(struct mmc *mmc)
575 {
576         int cd;
577
578         cd = board_mmc_getcd(mmc);
579
580         if (cd < 0) {
581                 if (mmc->getcd)
582                         cd = mmc->getcd(mmc);
583                 else
584                         cd = 1;
585         }
586
587         return cd;
588 }
589
590 static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
591 {
592         struct mmc_cmd cmd;
593         struct mmc_data data;
594
595         /* Switch the frequency */
596         cmd.cmdidx = SD_CMD_SWITCH_FUNC;
597         cmd.resp_type = MMC_RSP_R1;
598         cmd.cmdarg = (mode << 31) | 0xffffff;
599         cmd.cmdarg &= ~(0xf << (group * 4));
600         cmd.cmdarg |= value << (group * 4);
601
602         data.dest = (char *)resp;
603         data.blocksize = 64;
604         data.blocks = 1;
605         data.flags = MMC_DATA_READ;
606
607         return mmc_send_cmd(mmc, &cmd, &data);
608 }
609
610
611 static int sd_change_freq(struct mmc *mmc)
612 {
613         int err;
614         struct mmc_cmd cmd;
615         ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
616         ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
617         struct mmc_data data;
618         int timeout;
619
620         mmc->card_caps = 0;
621
622         if (mmc_host_is_spi(mmc))
623                 return 0;
624
625         /* Read the SCR to find out if this card supports higher speeds */
626         cmd.cmdidx = MMC_CMD_APP_CMD;
627         cmd.resp_type = MMC_RSP_R1;
628         cmd.cmdarg = mmc->rca << 16;
629
630         err = mmc_send_cmd(mmc, &cmd, NULL);
631
632         if (err)
633                 return err;
634
635         cmd.cmdidx = SD_CMD_APP_SEND_SCR;
636         cmd.resp_type = MMC_RSP_R1;
637         cmd.cmdarg = 0;
638
639         timeout = 3;
640
641 retry_scr:
642         data.dest = (char *)scr;
643         data.blocksize = 8;
644         data.blocks = 1;
645         data.flags = MMC_DATA_READ;
646
647         err = mmc_send_cmd(mmc, &cmd, &data);
648
649         if (err) {
650                 if (timeout--)
651                         goto retry_scr;
652
653                 return err;
654         }
655
656         mmc->scr[0] = __be32_to_cpu(scr[0]);
657         mmc->scr[1] = __be32_to_cpu(scr[1]);
658
659         switch ((mmc->scr[0] >> 24) & 0xf) {
660                 case 0:
661                         mmc->version = SD_VERSION_1_0;
662                         break;
663                 case 1:
664                         mmc->version = SD_VERSION_1_10;
665                         break;
666                 case 2:
667                         mmc->version = SD_VERSION_2;
668                         if ((mmc->scr[0] >> 15) & 0x1)
669                                 mmc->version = SD_VERSION_3;
670                         break;
671                 default:
672                         mmc->version = SD_VERSION_1_0;
673                         break;
674         }
675
676         if (mmc->scr[0] & SD_DATA_4BIT)
677                 mmc->card_caps |= MMC_MODE_4BIT;
678
679         /* Version 1.0 doesn't support switching */
680         if (mmc->version == SD_VERSION_1_0)
681                 return 0;
682
683         timeout = 4;
684         while (timeout--) {
685                 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
686                                 (u8 *)switch_status);
687
688                 if (err)
689                         return err;
690
691                 /* The high-speed function is busy.  Try again */
692                 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
693                         break;
694         }
695
696         /* If high-speed isn't supported, we return */
697         if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
698                 return 0;
699
700         /*
701          * If the host doesn't support SD_HIGHSPEED, do not switch card to
702          * HIGHSPEED mode even if the card support SD_HIGHSPPED.
703          * This can avoid furthur problem when the card runs in different
704          * mode between the host.
705          */
706         if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
707                 (mmc->host_caps & MMC_MODE_HS)))
708                 return 0;
709
710         err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
711
712         if (err)
713                 return err;
714
715         if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
716                 mmc->card_caps |= MMC_MODE_HS;
717
718         return 0;
719 }
720
721 /* frequency bases */
722 /* divided by 10 to be nice to platforms without floating point */
723 static const int fbase[] = {
724         10000,
725         100000,
726         1000000,
727         10000000,
728 };
729
730 /* Multiplier values for TRAN_SPEED.  Multiplied by 10 to be nice
731  * to platforms without floating point.
732  */
733 static const int multipliers[] = {
734         0,      /* reserved */
735         10,
736         12,
737         13,
738         15,
739         20,
740         25,
741         30,
742         35,
743         40,
744         45,
745         50,
746         55,
747         60,
748         70,
749         80,
750 };
751
752 static void mmc_set_ios(struct mmc *mmc)
753 {
754         mmc->set_ios(mmc);
755 }
756
757 void mmc_set_clock(struct mmc *mmc, uint clock)
758 {
759         if (clock > mmc->f_max)
760                 clock = mmc->f_max;
761
762         if (clock < mmc->f_min)
763                 clock = mmc->f_min;
764
765         mmc->clock = clock;
766
767         mmc_set_ios(mmc);
768 }
769
770 static void mmc_set_bus_width(struct mmc *mmc, uint width)
771 {
772         mmc->bus_width = width;
773
774         mmc_set_ios(mmc);
775 }
776
777 static int mmc_startup(struct mmc *mmc)
778 {
779         int err, i;
780         uint mult, freq;
781         u64 cmult, csize, capacity;
782         struct mmc_cmd cmd;
783         ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
784         ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
785         int timeout = 1000;
786
787 #ifdef CONFIG_MMC_SPI_CRC_ON
788         if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
789                 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
790                 cmd.resp_type = MMC_RSP_R1;
791                 cmd.cmdarg = 1;
792                 err = mmc_send_cmd(mmc, &cmd, NULL);
793
794                 if (err)
795                         return err;
796         }
797 #endif
798
799         /* Put the Card in Identify Mode */
800         cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
801                 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
802         cmd.resp_type = MMC_RSP_R2;
803         cmd.cmdarg = 0;
804
805         err = mmc_send_cmd(mmc, &cmd, NULL);
806
807         if (err)
808                 return err;
809
810         memcpy(mmc->cid, cmd.response, 16);
811
812         /*
813          * For MMC cards, set the Relative Address.
814          * For SD cards, get the Relatvie Address.
815          * This also puts the cards into Standby State
816          */
817         if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
818                 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
819                 cmd.cmdarg = mmc->rca << 16;
820                 cmd.resp_type = MMC_RSP_R6;
821
822                 err = mmc_send_cmd(mmc, &cmd, NULL);
823
824                 if (err)
825                         return err;
826
827                 if (IS_SD(mmc))
828                         mmc->rca = (cmd.response[0] >> 16) & 0xffff;
829         }
830
831         /* Get the Card-Specific Data */
832         cmd.cmdidx = MMC_CMD_SEND_CSD;
833         cmd.resp_type = MMC_RSP_R2;
834         cmd.cmdarg = mmc->rca << 16;
835
836         err = mmc_send_cmd(mmc, &cmd, NULL);
837
838         /* Waiting for the ready status */
839         mmc_send_status(mmc, timeout);
840
841         if (err)
842                 return err;
843
844         mmc->csd[0] = cmd.response[0];
845         mmc->csd[1] = cmd.response[1];
846         mmc->csd[2] = cmd.response[2];
847         mmc->csd[3] = cmd.response[3];
848
849         if (mmc->version == MMC_VERSION_UNKNOWN) {
850                 int version = (cmd.response[0] >> 26) & 0xf;
851
852                 switch (version) {
853                         case 0:
854                                 mmc->version = MMC_VERSION_1_2;
855                                 break;
856                         case 1:
857                                 mmc->version = MMC_VERSION_1_4;
858                                 break;
859                         case 2:
860                                 mmc->version = MMC_VERSION_2_2;
861                                 break;
862                         case 3:
863                                 mmc->version = MMC_VERSION_3;
864                                 break;
865                         case 4:
866                                 mmc->version = MMC_VERSION_4;
867                                 break;
868                         default:
869                                 mmc->version = MMC_VERSION_1_2;
870                                 break;
871                 }
872         }
873
874         /* divide frequency by 10, since the mults are 10x bigger */
875         freq = fbase[(cmd.response[0] & 0x7)];
876         mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
877
878         mmc->tran_speed = freq * mult;
879
880         mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
881         mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
882
883         if (IS_SD(mmc))
884                 mmc->write_bl_len = mmc->read_bl_len;
885         else
886                 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
887
888         if (mmc->high_capacity) {
889                 csize = (mmc->csd[1] & 0x3f) << 16
890                         | (mmc->csd[2] & 0xffff0000) >> 16;
891                 cmult = 8;
892         } else {
893                 csize = (mmc->csd[1] & 0x3ff) << 2
894                         | (mmc->csd[2] & 0xc0000000) >> 30;
895                 cmult = (mmc->csd[2] & 0x00038000) >> 15;
896         }
897
898         mmc->capacity_user = (csize + 1) << (cmult + 2);
899         mmc->capacity_user *= mmc->read_bl_len;
900         mmc->capacity_boot = 0;
901         mmc->capacity_rpmb = 0;
902         for (i = 0; i < 4; i++)
903                 mmc->capacity_gp[i] = 0;
904
905         if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
906                 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
907
908         if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
909                 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
910
911         if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
912                 cmd.cmdidx = MMC_CMD_SET_DSR;
913                 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
914                 cmd.resp_type = MMC_RSP_NONE;
915                 if (mmc_send_cmd(mmc, &cmd, NULL))
916                         printf("MMC: SET_DSR failed\n");
917         }
918
919         /* Select the card, and put it into Transfer Mode */
920         if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
921                 cmd.cmdidx = MMC_CMD_SELECT_CARD;
922                 cmd.resp_type = MMC_RSP_R1;
923                 cmd.cmdarg = mmc->rca << 16;
924                 err = mmc_send_cmd(mmc, &cmd, NULL);
925
926                 if (err)
927                         return err;
928         }
929
930         /*
931          * For SD, its erase group is always one sector
932          */
933         mmc->erase_grp_size = 1;
934         mmc->part_config = MMCPART_NOAVAILABLE;
935         if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
936                 /* check  ext_csd version and capacity */
937                 err = mmc_send_ext_csd(mmc, ext_csd);
938                 if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
939                         /*
940                          * According to the JEDEC Standard, the value of
941                          * ext_csd's capacity is valid if the value is more
942                          * than 2GB
943                          */
944                         capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
945                                         | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
946                                         | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
947                                         | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
948                         capacity *= MMC_MAX_BLOCK_LEN;
949                         if ((capacity >> 20) > 2 * 1024)
950                                 mmc->capacity_user = capacity;
951                 }
952
953                 switch (ext_csd[EXT_CSD_REV]) {
954                 case 1:
955                         mmc->version = MMC_VERSION_4_1;
956                         break;
957                 case 2:
958                         mmc->version = MMC_VERSION_4_2;
959                         break;
960                 case 3:
961                         mmc->version = MMC_VERSION_4_3;
962                         break;
963                 case 5:
964                         mmc->version = MMC_VERSION_4_41;
965                         break;
966                 case 6:
967                         mmc->version = MMC_VERSION_4_5;
968                         break;
969                 }
970
971                 /*
972                  * Host needs to enable ERASE_GRP_DEF bit if device is
973                  * partitioned. This bit will be lost every time after a reset
974                  * or power off. This will affect erase size.
975                  */
976                 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
977                     (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB)) {
978                         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
979                                 EXT_CSD_ERASE_GROUP_DEF, 1);
980
981                         if (err)
982                                 return err;
983
984                         /* Read out group size from ext_csd */
985                         mmc->erase_grp_size =
986                                 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
987                                         MMC_MAX_BLOCK_LEN * 1024;
988                 } else {
989                         /* Calculate the group size from the csd value. */
990                         int erase_gsz, erase_gmul;
991                         erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
992                         erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
993                         mmc->erase_grp_size = (erase_gsz + 1)
994                                 * (erase_gmul + 1);
995                 }
996
997                 /* store the partition info of emmc */
998                 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
999                     ext_csd[EXT_CSD_BOOT_MULT])
1000                         mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
1001
1002                 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1003
1004                 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1005
1006                 for (i = 0; i < 4; i++) {
1007                         int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
1008                         mmc->capacity_gp[i] = (ext_csd[idx + 2] << 16) +
1009                                 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1010                         mmc->capacity_gp[i] *=
1011                                 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1012                         mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1013                 }
1014         }
1015
1016         err = mmc_set_capacity(mmc, mmc->part_num);
1017         if (err)
1018                 return err;
1019
1020         if (IS_SD(mmc))
1021                 err = sd_change_freq(mmc);
1022         else
1023                 err = mmc_change_freq(mmc);
1024
1025         if (err)
1026                 return err;
1027
1028         /* Restrict card's capabilities by what the host can do */
1029         mmc->card_caps &= mmc->host_caps;
1030
1031         if (IS_SD(mmc)) {
1032                 if (mmc->card_caps & MMC_MODE_4BIT) {
1033                         cmd.cmdidx = MMC_CMD_APP_CMD;
1034                         cmd.resp_type = MMC_RSP_R1;
1035                         cmd.cmdarg = mmc->rca << 16;
1036
1037                         err = mmc_send_cmd(mmc, &cmd, NULL);
1038                         if (err)
1039                                 return err;
1040
1041                         cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1042                         cmd.resp_type = MMC_RSP_R1;
1043                         cmd.cmdarg = 2;
1044                         err = mmc_send_cmd(mmc, &cmd, NULL);
1045                         if (err)
1046                                 return err;
1047
1048                         mmc_set_bus_width(mmc, 4);
1049                 }
1050
1051                 if (mmc->card_caps & MMC_MODE_HS)
1052                         mmc->tran_speed = 50000000;
1053                 else
1054                         mmc->tran_speed = 25000000;
1055         } else {
1056                 int idx;
1057
1058                 /* An array of possible bus widths in order of preference */
1059                 static unsigned ext_csd_bits[] = {
1060                         EXT_CSD_BUS_WIDTH_8,
1061                         EXT_CSD_BUS_WIDTH_4,
1062                         EXT_CSD_BUS_WIDTH_1,
1063                 };
1064
1065                 /* An array to map CSD bus widths to host cap bits */
1066                 static unsigned ext_to_hostcaps[] = {
1067                         [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1068                         [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1069                 };
1070
1071                 /* An array to map chosen bus width to an integer */
1072                 static unsigned widths[] = {
1073                         8, 4, 1,
1074                 };
1075
1076                 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1077                         unsigned int extw = ext_csd_bits[idx];
1078
1079                         /*
1080                          * Check to make sure the controller supports
1081                          * this bus width, if it's more than 1
1082                          */
1083                         if (extw != EXT_CSD_BUS_WIDTH_1 &&
1084                                         !(mmc->host_caps & ext_to_hostcaps[extw]))
1085                                 continue;
1086
1087                         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1088                                         EXT_CSD_BUS_WIDTH, extw);
1089
1090                         if (err)
1091                                 continue;
1092
1093                         mmc_set_bus_width(mmc, widths[idx]);
1094
1095                         err = mmc_send_ext_csd(mmc, test_csd);
1096                         if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1097                                     == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1098                                  && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1099                                     == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1100                                  && ext_csd[EXT_CSD_REV] \
1101                                     == test_csd[EXT_CSD_REV]
1102                                  && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1103                                     == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1104                                  && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1105                                         &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
1106
1107                                 mmc->card_caps |= ext_to_hostcaps[extw];
1108                                 break;
1109                         }
1110                 }
1111
1112                 if (mmc->card_caps & MMC_MODE_HS) {
1113                         if (mmc->card_caps & MMC_MODE_HS_52MHz)
1114                                 mmc->tran_speed = 52000000;
1115                         else
1116                                 mmc->tran_speed = 26000000;
1117                 }
1118         }
1119
1120         mmc_set_clock(mmc, mmc->tran_speed);
1121
1122         /* fill in device description */
1123         mmc->block_dev.lun = 0;
1124         mmc->block_dev.type = 0;
1125         mmc->block_dev.blksz = mmc->read_bl_len;
1126         mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
1127         mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
1128 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1129         sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1130                 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1131                 (mmc->cid[3] >> 16) & 0xffff);
1132         sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1133                 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1134                 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1135                 (mmc->cid[2] >> 24) & 0xff);
1136         sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1137                 (mmc->cid[2] >> 16) & 0xf);
1138 #else
1139         mmc->block_dev.vendor[0] = 0;
1140         mmc->block_dev.product[0] = 0;
1141         mmc->block_dev.revision[0] = 0;
1142 #endif
1143 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
1144         init_part(&mmc->block_dev);
1145 #endif
1146
1147         return 0;
1148 }
1149
1150 static int mmc_send_if_cond(struct mmc *mmc)
1151 {
1152         struct mmc_cmd cmd;
1153         int err;
1154
1155         cmd.cmdidx = SD_CMD_SEND_IF_COND;
1156         /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1157         cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
1158         cmd.resp_type = MMC_RSP_R7;
1159
1160         err = mmc_send_cmd(mmc, &cmd, NULL);
1161
1162         if (err)
1163                 return err;
1164
1165         if ((cmd.response[0] & 0xff) != 0xaa)
1166                 return UNUSABLE_ERR;
1167         else
1168                 mmc->version = SD_VERSION_2;
1169
1170         return 0;
1171 }
1172
1173 int mmc_register(struct mmc *mmc)
1174 {
1175         /* Setup dsr related values */
1176         mmc->dsr_imp = 0;
1177         mmc->dsr = 0xffffffff;
1178         /* Setup the universal parts of the block interface just once */
1179         mmc->block_dev.if_type = IF_TYPE_MMC;
1180         mmc->block_dev.dev = cur_dev_num++;
1181         mmc->block_dev.removable = 1;
1182         mmc->block_dev.block_read = mmc_bread;
1183         mmc->block_dev.block_write = mmc_bwrite;
1184         mmc->block_dev.block_erase = mmc_berase;
1185         if (!mmc->b_max)
1186                 mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
1187
1188         INIT_LIST_HEAD (&mmc->link);
1189
1190         list_add_tail (&mmc->link, &mmc_devices);
1191
1192         return 0;
1193 }
1194
1195 #ifdef CONFIG_PARTITIONS
1196 block_dev_desc_t *mmc_get_dev(int dev)
1197 {
1198         struct mmc *mmc = find_mmc_device(dev);
1199         if (!mmc || mmc_init(mmc))
1200                 return NULL;
1201
1202         return &mmc->block_dev;
1203 }
1204 #endif
1205
1206 int mmc_start_init(struct mmc *mmc)
1207 {
1208         int err;
1209
1210         if (mmc_getcd(mmc) == 0) {
1211                 mmc->has_init = 0;
1212 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1213                 printf("MMC: no card present\n");
1214 #endif
1215                 return NO_CARD_ERR;
1216         }
1217
1218         if (mmc->has_init)
1219                 return 0;
1220
1221         err = mmc->init(mmc);
1222
1223         if (err)
1224                 return err;
1225
1226         mmc_set_bus_width(mmc, 1);
1227         mmc_set_clock(mmc, 1);
1228
1229         /* Reset the Card */
1230         err = mmc_go_idle(mmc);
1231
1232         if (err)
1233                 return err;
1234
1235         /* The internal partition reset to user partition(0) at every CMD0*/
1236         mmc->part_num = 0;
1237
1238         /* Test for SD version 2 */
1239         err = mmc_send_if_cond(mmc);
1240
1241         /* Now try to get the SD card's operating condition */
1242         err = sd_send_op_cond(mmc);
1243
1244         /* If the command timed out, we check for an MMC card */
1245         if (err == TIMEOUT) {
1246                 err = mmc_send_op_cond(mmc);
1247
1248                 if (err && err != IN_PROGRESS) {
1249 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1250                         printf("Card did not respond to voltage select!\n");
1251 #endif
1252                         return UNUSABLE_ERR;
1253                 }
1254         }
1255
1256         if (err == IN_PROGRESS)
1257                 mmc->init_in_progress = 1;
1258
1259         return err;
1260 }
1261
1262 static int mmc_complete_init(struct mmc *mmc)
1263 {
1264         int err = 0;
1265
1266         if (mmc->op_cond_pending)
1267                 err = mmc_complete_op_cond(mmc);
1268
1269         if (!err)
1270                 err = mmc_startup(mmc);
1271         if (err)
1272                 mmc->has_init = 0;
1273         else
1274                 mmc->has_init = 1;
1275         mmc->init_in_progress = 0;
1276         return err;
1277 }
1278
1279 int mmc_init(struct mmc *mmc)
1280 {
1281         int err = IN_PROGRESS;
1282         unsigned start = get_timer(0);
1283
1284         if (mmc->has_init)
1285                 return 0;
1286         if (!mmc->init_in_progress)
1287                 err = mmc_start_init(mmc);
1288
1289         if (!err || err == IN_PROGRESS)
1290                 err = mmc_complete_init(mmc);
1291         debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1292         return err;
1293 }
1294
1295 int mmc_set_dsr(struct mmc *mmc, u16 val)
1296 {
1297         mmc->dsr = val;
1298         return 0;
1299 }
1300
1301 /*
1302  * CPU and board-specific MMC initializations.  Aliased function
1303  * signals caller to move on
1304  */
1305 static int __def_mmc_init(bd_t *bis)
1306 {
1307         return -1;
1308 }
1309
1310 int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1311 int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1312
1313 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1314
1315 void print_mmc_devices(char separator)
1316 {
1317         struct mmc *m;
1318         struct list_head *entry;
1319
1320         list_for_each(entry, &mmc_devices) {
1321                 m = list_entry(entry, struct mmc, link);
1322
1323                 printf("%s: %d", m->name, m->block_dev.dev);
1324
1325                 if (entry->next != &mmc_devices)
1326                         printf("%c ", separator);
1327         }
1328
1329         printf("\n");
1330 }
1331
1332 #else
1333 void print_mmc_devices(char separator) { }
1334 #endif
1335
1336 int get_mmc_num(void)
1337 {
1338         return cur_dev_num;
1339 }
1340
1341 void mmc_set_preinit(struct mmc *mmc, int preinit)
1342 {
1343         mmc->preinit = preinit;
1344 }
1345
1346 static void do_preinit(void)
1347 {
1348         struct mmc *m;
1349         struct list_head *entry;
1350
1351         list_for_each(entry, &mmc_devices) {
1352                 m = list_entry(entry, struct mmc, link);
1353
1354                 if (m->preinit)
1355                         mmc_start_init(m);
1356         }
1357 }
1358
1359
1360 int mmc_initialize(bd_t *bis)
1361 {
1362         INIT_LIST_HEAD (&mmc_devices);
1363         cur_dev_num = 0;
1364
1365         if (board_mmc_init(bis) < 0)
1366                 cpu_mmc_init(bis);
1367
1368 #ifndef CONFIG_SPL_BUILD
1369         print_mmc_devices(',');
1370 #endif
1371
1372         do_preinit();
1373         return 0;
1374 }
1375
1376 #ifdef CONFIG_SUPPORT_EMMC_BOOT
1377 /*
1378  * This function changes the size of boot partition and the size of rpmb
1379  * partition present on EMMC devices.
1380  *
1381  * Input Parameters:
1382  * struct *mmc: pointer for the mmc device strcuture
1383  * bootsize: size of boot partition
1384  * rpmbsize: size of rpmb partition
1385  *
1386  * Returns 0 on success.
1387  */
1388
1389 int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1390                                 unsigned long rpmbsize)
1391 {
1392         int err;
1393         struct mmc_cmd cmd;
1394
1395         /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1396         cmd.cmdidx = MMC_CMD_RES_MAN;
1397         cmd.resp_type = MMC_RSP_R1b;
1398         cmd.cmdarg = MMC_CMD62_ARG1;
1399
1400         err = mmc_send_cmd(mmc, &cmd, NULL);
1401         if (err) {
1402                 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1403                 return err;
1404         }
1405
1406         /* Boot partition changing mode */
1407         cmd.cmdidx = MMC_CMD_RES_MAN;
1408         cmd.resp_type = MMC_RSP_R1b;
1409         cmd.cmdarg = MMC_CMD62_ARG2;
1410
1411         err = mmc_send_cmd(mmc, &cmd, NULL);
1412         if (err) {
1413                 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1414                 return err;
1415         }
1416         /* boot partition size is multiple of 128KB */
1417         bootsize = (bootsize * 1024) / 128;
1418
1419         /* Arg: boot partition size */
1420         cmd.cmdidx = MMC_CMD_RES_MAN;
1421         cmd.resp_type = MMC_RSP_R1b;
1422         cmd.cmdarg = bootsize;
1423
1424         err = mmc_send_cmd(mmc, &cmd, NULL);
1425         if (err) {
1426                 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1427                 return err;
1428         }
1429         /* RPMB partition size is multiple of 128KB */
1430         rpmbsize = (rpmbsize * 1024) / 128;
1431         /* Arg: RPMB partition size */
1432         cmd.cmdidx = MMC_CMD_RES_MAN;
1433         cmd.resp_type = MMC_RSP_R1b;
1434         cmd.cmdarg = rpmbsize;
1435
1436         err = mmc_send_cmd(mmc, &cmd, NULL);
1437         if (err) {
1438                 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1439                 return err;
1440         }
1441         return 0;
1442 }
1443
1444 /*
1445  * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1446  * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1447  * and BOOT_MODE.
1448  *
1449  * Returns 0 on success.
1450  */
1451 int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1452 {
1453         int err;
1454
1455         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1456                          EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1457                          EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1458                          EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1459
1460         if (err)
1461                 return err;
1462         return 0;
1463 }
1464
1465 /*
1466  * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1467  * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1468  * PARTITION_ACCESS.
1469  *
1470  * Returns 0 on success.
1471  */
1472 int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1473 {
1474         int err;
1475
1476         err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1477                          EXT_CSD_BOOT_ACK(ack) |
1478                          EXT_CSD_BOOT_PART_NUM(part_num) |
1479                          EXT_CSD_PARTITION_ACCESS(access));
1480
1481         if (err)
1482                 return err;
1483         return 0;
1484 }
1485 #endif