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