]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/mmc/mmc.c
mmc: Drop dead mmc code for non-generic MMC
[people/ms/u-boot.git] / drivers / mmc / mmc.c
CommitLineData
272cc70b
AF
1/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
1a459660 7 * SPDX-License-Identifier: GPL-2.0+
272cc70b
AF
8 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
8e3332e2
SS
13#include <dm.h>
14#include <dm/device-internal.h>
d4622df3 15#include <errno.h>
272cc70b
AF
16#include <mmc.h>
17#include <part.h>
18#include <malloc.h>
cf92e05c 19#include <memalign.h>
272cc70b 20#include <linux/list.h>
9b1f942c 21#include <div64.h>
da61fa5f 22#include "mmc_private.h"
272cc70b 23
750121c3 24__weak int board_mmc_getwp(struct mmc *mmc)
d23d8d7e
NK
25{
26 return -1;
27}
28
29int mmc_getwp(struct mmc *mmc)
30{
31 int wp;
32
33 wp = board_mmc_getwp(mmc);
34
d4e1da4e 35 if (wp < 0) {
93bfd616
PA
36 if (mmc->cfg->ops->getwp)
37 wp = mmc->cfg->ops->getwp(mmc);
d4e1da4e
PK
38 else
39 wp = 0;
40 }
d23d8d7e
NK
41
42 return wp;
43}
44
cee9ab7c
JH
45__weak int board_mmc_getcd(struct mmc *mmc)
46{
11fdade2
SB
47 return -1;
48}
49
da61fa5f 50int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
272cc70b 51{
5db2fe3a 52 int ret;
8635ff9e 53
8635ff9e 54#ifdef CONFIG_MMC_TRACE
5db2fe3a
RR
55 int i;
56 u8 *ptr;
57
58 printf("CMD_SEND:%d\n", cmd->cmdidx);
59 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
93bfd616 60 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
7863ce58
BM
61 if (ret) {
62 printf("\t\tRET\t\t\t %d\n", ret);
63 } else {
64 switch (cmd->resp_type) {
65 case MMC_RSP_NONE:
66 printf("\t\tMMC_RSP_NONE\n");
67 break;
68 case MMC_RSP_R1:
69 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
70 cmd->response[0]);
71 break;
72 case MMC_RSP_R1b:
73 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
74 cmd->response[0]);
75 break;
76 case MMC_RSP_R2:
77 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
78 cmd->response[0]);
79 printf("\t\t \t\t 0x%08X \n",
80 cmd->response[1]);
81 printf("\t\t \t\t 0x%08X \n",
82 cmd->response[2]);
83 printf("\t\t \t\t 0x%08X \n",
84 cmd->response[3]);
5db2fe3a 85 printf("\n");
7863ce58
BM
86 printf("\t\t\t\t\tDUMPING DATA\n");
87 for (i = 0; i < 4; i++) {
88 int j;
89 printf("\t\t\t\t\t%03d - ", i*4);
90 ptr = (u8 *)&cmd->response[i];
91 ptr += 3;
92 for (j = 0; j < 4; j++)
93 printf("%02X ", *ptr--);
94 printf("\n");
95 }
96 break;
97 case MMC_RSP_R3:
98 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
99 cmd->response[0]);
100 break;
101 default:
102 printf("\t\tERROR MMC rsp not supported\n");
103 break;
53e8e40b 104 }
5db2fe3a 105 }
5db2fe3a 106#else
93bfd616 107 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
5db2fe3a 108#endif
8635ff9e 109 return ret;
272cc70b
AF
110}
111
da61fa5f 112int mmc_send_status(struct mmc *mmc, int timeout)
5d4fc8d9
RR
113{
114 struct mmc_cmd cmd;
d617c426 115 int err, retries = 5;
5d4fc8d9
RR
116#ifdef CONFIG_MMC_TRACE
117 int status;
118#endif
119
120 cmd.cmdidx = MMC_CMD_SEND_STATUS;
121 cmd.resp_type = MMC_RSP_R1;
aaf3d41a
MV
122 if (!mmc_host_is_spi(mmc))
123 cmd.cmdarg = mmc->rca << 16;
5d4fc8d9 124
1677eef4 125 while (1) {
5d4fc8d9 126 err = mmc_send_cmd(mmc, &cmd, NULL);
d617c426
JK
127 if (!err) {
128 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
129 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
130 MMC_STATE_PRG)
131 break;
132 else if (cmd.response[0] & MMC_STATUS_MASK) {
56196826 133#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
d617c426
JK
134 printf("Status Error: 0x%08X\n",
135 cmd.response[0]);
56196826 136#endif
d617c426
JK
137 return COMM_ERR;
138 }
139 } else if (--retries < 0)
5d4fc8d9 140 return err;
5d4fc8d9 141
1677eef4
AG
142 if (timeout-- <= 0)
143 break;
5d4fc8d9 144
1677eef4
AG
145 udelay(1000);
146 }
5d4fc8d9 147
5db2fe3a
RR
148#ifdef CONFIG_MMC_TRACE
149 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
150 printf("CURR STATE:%d\n", status);
151#endif
5b0c942f 152 if (timeout <= 0) {
56196826 153#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
5d4fc8d9 154 printf("Timeout waiting card ready\n");
56196826 155#endif
5d4fc8d9
RR
156 return TIMEOUT;
157 }
6b2221b0
AG
158 if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
159 return SWITCH_ERR;
5d4fc8d9
RR
160
161 return 0;
162}
163
da61fa5f 164int mmc_set_blocklen(struct mmc *mmc, int len)
272cc70b
AF
165{
166 struct mmc_cmd cmd;
167
786e8f81 168 if (mmc->ddr_mode)
d22e3d46
JC
169 return 0;
170
272cc70b
AF
171 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
172 cmd.resp_type = MMC_RSP_R1;
173 cmd.cmdarg = len;
272cc70b
AF
174
175 return mmc_send_cmd(mmc, &cmd, NULL);
176}
177
ff8fef56 178static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
fdbb873e 179 lbaint_t blkcnt)
272cc70b
AF
180{
181 struct mmc_cmd cmd;
182 struct mmc_data data;
183
4a1a06bc
AS
184 if (blkcnt > 1)
185 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
186 else
187 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
272cc70b
AF
188
189 if (mmc->high_capacity)
4a1a06bc 190 cmd.cmdarg = start;
272cc70b 191 else
4a1a06bc 192 cmd.cmdarg = start * mmc->read_bl_len;
272cc70b
AF
193
194 cmd.resp_type = MMC_RSP_R1;
272cc70b
AF
195
196 data.dest = dst;
4a1a06bc 197 data.blocks = blkcnt;
272cc70b
AF
198 data.blocksize = mmc->read_bl_len;
199 data.flags = MMC_DATA_READ;
200
4a1a06bc
AS
201 if (mmc_send_cmd(mmc, &cmd, &data))
202 return 0;
272cc70b 203
4a1a06bc
AS
204 if (blkcnt > 1) {
205 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
206 cmd.cmdarg = 0;
207 cmd.resp_type = MMC_RSP_R1b;
4a1a06bc 208 if (mmc_send_cmd(mmc, &cmd, NULL)) {
56196826 209#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
4a1a06bc 210 printf("mmc fail to send stop cmd\n");
56196826 211#endif
4a1a06bc
AS
212 return 0;
213 }
272cc70b
AF
214 }
215
4a1a06bc 216 return blkcnt;
272cc70b
AF
217}
218
33fb211d
SG
219#ifdef CONFIG_BLK
220static ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
221 void *dst)
222#else
4101f687 223static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
7c4213f6 224 lbaint_t blkcnt, void *dst)
33fb211d 225#endif
272cc70b 226{
33fb211d
SG
227#ifdef CONFIG_BLK
228 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
229#endif
bcce53d0 230 int dev_num = block_dev->devnum;
873cc1d7 231 int err;
4a1a06bc
AS
232 lbaint_t cur, blocks_todo = blkcnt;
233
234 if (blkcnt == 0)
235 return 0;
272cc70b 236
4a1a06bc 237 struct mmc *mmc = find_mmc_device(dev_num);
272cc70b
AF
238 if (!mmc)
239 return 0;
240
69f45cd5 241 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
873cc1d7
SW
242 if (err < 0)
243 return 0;
244
c40fdca6 245 if ((start + blkcnt) > block_dev->lba) {
56196826 246#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
ff8fef56 247 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
c40fdca6 248 start + blkcnt, block_dev->lba);
56196826 249#endif
d2bf29e3
LW
250 return 0;
251 }
272cc70b 252
11692991
SG
253 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
254 debug("%s: Failed to set blocklen\n", __func__);
272cc70b 255 return 0;
11692991 256 }
272cc70b 257
4a1a06bc 258 do {
93bfd616
PA
259 cur = (blocks_todo > mmc->cfg->b_max) ?
260 mmc->cfg->b_max : blocks_todo;
11692991
SG
261 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
262 debug("%s: Failed to read blocks\n", __func__);
4a1a06bc 263 return 0;
11692991 264 }
4a1a06bc
AS
265 blocks_todo -= cur;
266 start += cur;
267 dst += cur * mmc->read_bl_len;
268 } while (blocks_todo > 0);
272cc70b
AF
269
270 return blkcnt;
271}
272
fdbb873e 273static int mmc_go_idle(struct mmc *mmc)
272cc70b
AF
274{
275 struct mmc_cmd cmd;
276 int err;
277
278 udelay(1000);
279
280 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
281 cmd.cmdarg = 0;
282 cmd.resp_type = MMC_RSP_NONE;
272cc70b
AF
283
284 err = mmc_send_cmd(mmc, &cmd, NULL);
285
286 if (err)
287 return err;
288
289 udelay(2000);
290
291 return 0;
292}
293
fdbb873e 294static int sd_send_op_cond(struct mmc *mmc)
272cc70b
AF
295{
296 int timeout = 1000;
297 int err;
298 struct mmc_cmd cmd;
299
1677eef4 300 while (1) {
272cc70b
AF
301 cmd.cmdidx = MMC_CMD_APP_CMD;
302 cmd.resp_type = MMC_RSP_R1;
303 cmd.cmdarg = 0;
272cc70b
AF
304
305 err = mmc_send_cmd(mmc, &cmd, NULL);
306
307 if (err)
308 return err;
309
310 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
311 cmd.resp_type = MMC_RSP_R3;
250de12b
SB
312
313 /*
314 * Most cards do not answer if some reserved bits
315 * in the ocr are set. However, Some controller
316 * can set bit 7 (reserved for low voltages), but
317 * how to manage low voltages SD card is not yet
318 * specified.
319 */
d52ebf10 320 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
93bfd616 321 (mmc->cfg->voltages & 0xff8000);
272cc70b
AF
322
323 if (mmc->version == SD_VERSION_2)
324 cmd.cmdarg |= OCR_HCS;
325
326 err = mmc_send_cmd(mmc, &cmd, NULL);
327
328 if (err)
329 return err;
330
1677eef4
AG
331 if (cmd.response[0] & OCR_BUSY)
332 break;
333
334 if (timeout-- <= 0)
335 return UNUSABLE_ERR;
272cc70b 336
1677eef4
AG
337 udelay(1000);
338 }
272cc70b
AF
339
340 if (mmc->version != SD_VERSION_2)
341 mmc->version = SD_VERSION_1_0;
342
d52ebf10
TC
343 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
344 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
345 cmd.resp_type = MMC_RSP_R3;
346 cmd.cmdarg = 0;
d52ebf10
TC
347
348 err = mmc_send_cmd(mmc, &cmd, NULL);
349
350 if (err)
351 return err;
352 }
353
998be3dd 354 mmc->ocr = cmd.response[0];
272cc70b
AF
355
356 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
357 mmc->rca = 0;
358
359 return 0;
360}
361
5289b535 362static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
272cc70b 363{
5289b535 364 struct mmc_cmd cmd;
272cc70b
AF
365 int err;
366
5289b535
AG
367 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
368 cmd.resp_type = MMC_RSP_R3;
369 cmd.cmdarg = 0;
5a20397b
RH
370 if (use_arg && !mmc_host_is_spi(mmc))
371 cmd.cmdarg = OCR_HCS |
93bfd616 372 (mmc->cfg->voltages &
a626c8d4
AG
373 (mmc->ocr & OCR_VOLTAGE_MASK)) |
374 (mmc->ocr & OCR_ACCESS_MODE);
e9550449 375
5289b535 376 err = mmc_send_cmd(mmc, &cmd, NULL);
e9550449
CLC
377 if (err)
378 return err;
5289b535 379 mmc->ocr = cmd.response[0];
e9550449
CLC
380 return 0;
381}
382
750121c3 383static int mmc_send_op_cond(struct mmc *mmc)
e9550449 384{
e9550449
CLC
385 int err, i;
386
272cc70b
AF
387 /* Some cards seem to need this */
388 mmc_go_idle(mmc);
389
31cacbab 390 /* Asking to the card its capabilities */
e9550449 391 for (i = 0; i < 2; i++) {
5289b535 392 err = mmc_send_op_cond_iter(mmc, i != 0);
e9550449
CLC
393 if (err)
394 return err;
cd6881b5 395
e9550449 396 /* exit if not busy (flag seems to be inverted) */
a626c8d4 397 if (mmc->ocr & OCR_BUSY)
bd47c135 398 break;
e9550449 399 }
bd47c135
AG
400 mmc->op_cond_pending = 1;
401 return 0;
e9550449 402}
cd6881b5 403
750121c3 404static int mmc_complete_op_cond(struct mmc *mmc)
e9550449
CLC
405{
406 struct mmc_cmd cmd;
407 int timeout = 1000;
408 uint start;
409 int err;
cd6881b5 410
e9550449 411 mmc->op_cond_pending = 0;
cc17c01f
AG
412 if (!(mmc->ocr & OCR_BUSY)) {
413 start = get_timer(0);
1677eef4 414 while (1) {
cc17c01f
AG
415 err = mmc_send_op_cond_iter(mmc, 1);
416 if (err)
417 return err;
1677eef4
AG
418 if (mmc->ocr & OCR_BUSY)
419 break;
cc17c01f
AG
420 if (get_timer(start) > timeout)
421 return UNUSABLE_ERR;
422 udelay(100);
1677eef4 423 }
cc17c01f 424 }
272cc70b 425
d52ebf10
TC
426 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
427 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
428 cmd.resp_type = MMC_RSP_R3;
429 cmd.cmdarg = 0;
d52ebf10
TC
430
431 err = mmc_send_cmd(mmc, &cmd, NULL);
432
433 if (err)
434 return err;
a626c8d4
AG
435
436 mmc->ocr = cmd.response[0];
d52ebf10
TC
437 }
438
272cc70b 439 mmc->version = MMC_VERSION_UNKNOWN;
272cc70b
AF
440
441 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
def816a2 442 mmc->rca = 1;
272cc70b
AF
443
444 return 0;
445}
446
447
fdbb873e 448static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
272cc70b
AF
449{
450 struct mmc_cmd cmd;
451 struct mmc_data data;
452 int err;
453
454 /* Get the Card Status Register */
455 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
456 cmd.resp_type = MMC_RSP_R1;
457 cmd.cmdarg = 0;
272cc70b 458
cdfd1ac6 459 data.dest = (char *)ext_csd;
272cc70b 460 data.blocks = 1;
8bfa195e 461 data.blocksize = MMC_MAX_BLOCK_LEN;
272cc70b
AF
462 data.flags = MMC_DATA_READ;
463
464 err = mmc_send_cmd(mmc, &cmd, &data);
465
466 return err;
467}
468
469
fdbb873e 470static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
272cc70b
AF
471{
472 struct mmc_cmd cmd;
5d4fc8d9
RR
473 int timeout = 1000;
474 int ret;
272cc70b
AF
475
476 cmd.cmdidx = MMC_CMD_SWITCH;
477 cmd.resp_type = MMC_RSP_R1b;
478 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
5d4fc8d9
RR
479 (index << 16) |
480 (value << 8);
272cc70b 481
5d4fc8d9
RR
482 ret = mmc_send_cmd(mmc, &cmd, NULL);
483
484 /* Waiting for the ready status */
93ad0d18
JK
485 if (!ret)
486 ret = mmc_send_status(mmc, timeout);
5d4fc8d9
RR
487
488 return ret;
489
272cc70b
AF
490}
491
fdbb873e 492static int mmc_change_freq(struct mmc *mmc)
272cc70b 493{
8bfa195e 494 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
272cc70b
AF
495 char cardtype;
496 int err;
497
fc5b32fb 498 mmc->card_caps = 0;
272cc70b 499
d52ebf10
TC
500 if (mmc_host_is_spi(mmc))
501 return 0;
502
272cc70b
AF
503 /* Only version 4 supports high-speed */
504 if (mmc->version < MMC_VERSION_4)
505 return 0;
506
fc5b32fb
AG
507 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
508
272cc70b
AF
509 err = mmc_send_ext_csd(mmc, ext_csd);
510
511 if (err)
512 return err;
513
0560db18 514 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
272cc70b
AF
515
516 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
517
518 if (err)
6b2221b0 519 return err == SWITCH_ERR ? 0 : err;
272cc70b
AF
520
521 /* Now check to see that it worked */
522 err = mmc_send_ext_csd(mmc, ext_csd);
523
524 if (err)
525 return err;
526
527 /* No high-speed support */
0560db18 528 if (!ext_csd[EXT_CSD_HS_TIMING])
272cc70b
AF
529 return 0;
530
531 /* High Speed is set, there are two types: 52MHz and 26MHz */
d22e3d46 532 if (cardtype & EXT_CSD_CARD_TYPE_52) {
201d5ac4 533 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
d22e3d46 534 mmc->card_caps |= MMC_MODE_DDR_52MHz;
272cc70b 535 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
d22e3d46 536 } else {
272cc70b 537 mmc->card_caps |= MMC_MODE_HS;
d22e3d46 538 }
272cc70b
AF
539
540 return 0;
541}
542
f866a46d
SW
543static int mmc_set_capacity(struct mmc *mmc, int part_num)
544{
545 switch (part_num) {
546 case 0:
547 mmc->capacity = mmc->capacity_user;
548 break;
549 case 1:
550 case 2:
551 mmc->capacity = mmc->capacity_boot;
552 break;
553 case 3:
554 mmc->capacity = mmc->capacity_rpmb;
555 break;
556 case 4:
557 case 5:
558 case 6:
559 case 7:
560 mmc->capacity = mmc->capacity_gp[part_num - 4];
561 break;
562 default:
563 return -1;
564 }
565
c40fdca6 566 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
f866a46d
SW
567
568 return 0;
569}
570
fdbb139f 571static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
bc897b1d 572{
f866a46d 573 int ret;
bc897b1d 574
f866a46d
SW
575 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
576 (mmc->part_config & ~PART_ACCESS_MASK)
577 | (part_num & PART_ACCESS_MASK));
f866a46d 578
6dc93e70
PB
579 /*
580 * Set the capacity if the switch succeeded or was intended
581 * to return to representing the raw device.
582 */
873cc1d7 583 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
6dc93e70 584 ret = mmc_set_capacity(mmc, part_num);
fdbb139f 585 mmc_get_blk_desc(mmc)->hwpart = part_num;
873cc1d7 586 }
6dc93e70
PB
587
588 return ret;
bc897b1d
LW
589}
590
33fb211d
SG
591#ifdef CONFIG_BLK
592static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
e17d1143 593{
33fb211d
SG
594 struct udevice *mmc_dev = dev_get_parent(bdev);
595 struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
596 struct blk_desc *desc = dev_get_uclass_platdata(bdev);
e17d1143
SG
597 int ret;
598
33fb211d 599 if (desc->hwpart == hwpart)
e17d1143
SG
600 return 0;
601
602 if (mmc->part_config == MMCPART_NOAVAILABLE)
603 return -EMEDIUMTYPE;
604
fdbb139f 605 ret = mmc_switch_part(mmc, hwpart);
e17d1143
SG
606 if (ret)
607 return ret;
608
609 return 0;
610}
33fb211d
SG
611#else
612static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
ff3882ac 613{
33fb211d 614 struct mmc *mmc = find_mmc_device(desc->devnum);
ff3882ac
SG
615 int ret;
616
617 if (!mmc)
618 return -ENODEV;
619
620 if (mmc->block_dev.hwpart == hwpart)
621 return 0;
622
623 if (mmc->part_config == MMCPART_NOAVAILABLE)
624 return -EMEDIUMTYPE;
625
fdbb139f 626 ret = mmc_switch_part(mmc, hwpart);
ff3882ac
SG
627 if (ret)
628 return ret;
629
630 return 0;
631}
33fb211d 632#endif
ff3882ac 633
ac9da0e0
DSC
634int mmc_hwpart_config(struct mmc *mmc,
635 const struct mmc_hwpart_conf *conf,
636 enum mmc_hwpart_conf_mode mode)
637{
638 u8 part_attrs = 0;
639 u32 enh_size_mult;
640 u32 enh_start_addr;
641 u32 gp_size_mult[4];
642 u32 max_enh_size_mult;
643 u32 tot_enh_size_mult = 0;
8dda5b0e 644 u8 wr_rel_set;
ac9da0e0
DSC
645 int i, pidx, err;
646 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
647
648 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
649 return -EINVAL;
650
651 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
652 printf("eMMC >= 4.4 required for enhanced user data area\n");
653 return -EMEDIUMTYPE;
654 }
655
656 if (!(mmc->part_support & PART_SUPPORT)) {
657 printf("Card does not support partitioning\n");
658 return -EMEDIUMTYPE;
659 }
660
661 if (!mmc->hc_wp_grp_size) {
662 printf("Card does not define HC WP group size\n");
663 return -EMEDIUMTYPE;
664 }
665
666 /* check partition alignment and total enhanced size */
667 if (conf->user.enh_size) {
668 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
669 conf->user.enh_start % mmc->hc_wp_grp_size) {
670 printf("User data enhanced area not HC WP group "
671 "size aligned\n");
672 return -EINVAL;
673 }
674 part_attrs |= EXT_CSD_ENH_USR;
675 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
676 if (mmc->high_capacity) {
677 enh_start_addr = conf->user.enh_start;
678 } else {
679 enh_start_addr = (conf->user.enh_start << 9);
680 }
681 } else {
682 enh_size_mult = 0;
683 enh_start_addr = 0;
684 }
685 tot_enh_size_mult += enh_size_mult;
686
687 for (pidx = 0; pidx < 4; pidx++) {
688 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
689 printf("GP%i partition not HC WP group size "
690 "aligned\n", pidx+1);
691 return -EINVAL;
692 }
693 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
694 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
695 part_attrs |= EXT_CSD_ENH_GP(pidx);
696 tot_enh_size_mult += gp_size_mult[pidx];
697 }
698 }
699
700 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
701 printf("Card does not support enhanced attribute\n");
702 return -EMEDIUMTYPE;
703 }
704
705 err = mmc_send_ext_csd(mmc, ext_csd);
706 if (err)
707 return err;
708
709 max_enh_size_mult =
710 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
711 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
712 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
713 if (tot_enh_size_mult > max_enh_size_mult) {
714 printf("Total enhanced size exceeds maximum (%u > %u)\n",
715 tot_enh_size_mult, max_enh_size_mult);
716 return -EMEDIUMTYPE;
717 }
718
8dda5b0e
DSC
719 /* The default value of EXT_CSD_WR_REL_SET is device
720 * dependent, the values can only be changed if the
721 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
722 * changed only once and before partitioning is completed. */
723 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
724 if (conf->user.wr_rel_change) {
725 if (conf->user.wr_rel_set)
726 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
727 else
728 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
729 }
730 for (pidx = 0; pidx < 4; pidx++) {
731 if (conf->gp_part[pidx].wr_rel_change) {
732 if (conf->gp_part[pidx].wr_rel_set)
733 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
734 else
735 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
736 }
737 }
738
739 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
740 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
741 puts("Card does not support host controlled partition write "
742 "reliability settings\n");
743 return -EMEDIUMTYPE;
744 }
745
ac9da0e0
DSC
746 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
747 EXT_CSD_PARTITION_SETTING_COMPLETED) {
748 printf("Card already partitioned\n");
749 return -EPERM;
750 }
751
752 if (mode == MMC_HWPART_CONF_CHECK)
753 return 0;
754
755 /* Partitioning requires high-capacity size definitions */
756 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
757 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
758 EXT_CSD_ERASE_GROUP_DEF, 1);
759
760 if (err)
761 return err;
762
763 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
764
765 /* update erase group size to be high-capacity */
766 mmc->erase_grp_size =
767 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
768
769 }
770
771 /* all OK, write the configuration */
772 for (i = 0; i < 4; i++) {
773 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
774 EXT_CSD_ENH_START_ADDR+i,
775 (enh_start_addr >> (i*8)) & 0xFF);
776 if (err)
777 return err;
778 }
779 for (i = 0; i < 3; i++) {
780 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
781 EXT_CSD_ENH_SIZE_MULT+i,
782 (enh_size_mult >> (i*8)) & 0xFF);
783 if (err)
784 return err;
785 }
786 for (pidx = 0; pidx < 4; pidx++) {
787 for (i = 0; i < 3; i++) {
788 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
789 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
790 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
791 if (err)
792 return err;
793 }
794 }
795 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
796 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
797 if (err)
798 return err;
799
800 if (mode == MMC_HWPART_CONF_SET)
801 return 0;
802
8dda5b0e
DSC
803 /* The WR_REL_SET is a write-once register but shall be
804 * written before setting PART_SETTING_COMPLETED. As it is
805 * write-once we can only write it when completing the
806 * partitioning. */
807 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
808 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
809 EXT_CSD_WR_REL_SET, wr_rel_set);
810 if (err)
811 return err;
812 }
813
ac9da0e0
DSC
814 /* Setting PART_SETTING_COMPLETED confirms the partition
815 * configuration but it only becomes effective after power
816 * cycle, so we do not adjust the partition related settings
817 * in the mmc struct. */
818
819 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
820 EXT_CSD_PARTITION_SETTING,
821 EXT_CSD_PARTITION_SETTING_COMPLETED);
822 if (err)
823 return err;
824
825 return 0;
826}
827
48972d90
TR
828int mmc_getcd(struct mmc *mmc)
829{
830 int cd;
831
832 cd = board_mmc_getcd(mmc);
833
d4e1da4e 834 if (cd < 0) {
93bfd616
PA
835 if (mmc->cfg->ops->getcd)
836 cd = mmc->cfg->ops->getcd(mmc);
d4e1da4e
PK
837 else
838 cd = 1;
839 }
48972d90
TR
840
841 return cd;
842}
843
fdbb873e 844static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
272cc70b
AF
845{
846 struct mmc_cmd cmd;
847 struct mmc_data data;
848
849 /* Switch the frequency */
850 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
851 cmd.resp_type = MMC_RSP_R1;
852 cmd.cmdarg = (mode << 31) | 0xffffff;
853 cmd.cmdarg &= ~(0xf << (group * 4));
854 cmd.cmdarg |= value << (group * 4);
272cc70b
AF
855
856 data.dest = (char *)resp;
857 data.blocksize = 64;
858 data.blocks = 1;
859 data.flags = MMC_DATA_READ;
860
861 return mmc_send_cmd(mmc, &cmd, &data);
862}
863
864
fdbb873e 865static int sd_change_freq(struct mmc *mmc)
272cc70b
AF
866{
867 int err;
868 struct mmc_cmd cmd;
f781dd38
A
869 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
870 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
272cc70b
AF
871 struct mmc_data data;
872 int timeout;
873
874 mmc->card_caps = 0;
875
d52ebf10
TC
876 if (mmc_host_is_spi(mmc))
877 return 0;
878
272cc70b
AF
879 /* Read the SCR to find out if this card supports higher speeds */
880 cmd.cmdidx = MMC_CMD_APP_CMD;
881 cmd.resp_type = MMC_RSP_R1;
882 cmd.cmdarg = mmc->rca << 16;
272cc70b
AF
883
884 err = mmc_send_cmd(mmc, &cmd, NULL);
885
886 if (err)
887 return err;
888
889 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
890 cmd.resp_type = MMC_RSP_R1;
891 cmd.cmdarg = 0;
272cc70b
AF
892
893 timeout = 3;
894
895retry_scr:
f781dd38 896 data.dest = (char *)scr;
272cc70b
AF
897 data.blocksize = 8;
898 data.blocks = 1;
899 data.flags = MMC_DATA_READ;
900
901 err = mmc_send_cmd(mmc, &cmd, &data);
902
903 if (err) {
904 if (timeout--)
905 goto retry_scr;
906
907 return err;
908 }
909
4e3d89ba
YK
910 mmc->scr[0] = __be32_to_cpu(scr[0]);
911 mmc->scr[1] = __be32_to_cpu(scr[1]);
272cc70b
AF
912
913 switch ((mmc->scr[0] >> 24) & 0xf) {
53e8e40b
BM
914 case 0:
915 mmc->version = SD_VERSION_1_0;
916 break;
917 case 1:
918 mmc->version = SD_VERSION_1_10;
919 break;
920 case 2:
921 mmc->version = SD_VERSION_2;
922 if ((mmc->scr[0] >> 15) & 0x1)
923 mmc->version = SD_VERSION_3;
924 break;
925 default:
926 mmc->version = SD_VERSION_1_0;
927 break;
272cc70b
AF
928 }
929
b44c7083
AS
930 if (mmc->scr[0] & SD_DATA_4BIT)
931 mmc->card_caps |= MMC_MODE_4BIT;
932
272cc70b
AF
933 /* Version 1.0 doesn't support switching */
934 if (mmc->version == SD_VERSION_1_0)
935 return 0;
936
937 timeout = 4;
938 while (timeout--) {
939 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
f781dd38 940 (u8 *)switch_status);
272cc70b
AF
941
942 if (err)
943 return err;
944
945 /* The high-speed function is busy. Try again */
4e3d89ba 946 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
272cc70b
AF
947 break;
948 }
949
272cc70b 950 /* If high-speed isn't supported, we return */
4e3d89ba 951 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
272cc70b
AF
952 return 0;
953
2c3fbf4c
ML
954 /*
955 * If the host doesn't support SD_HIGHSPEED, do not switch card to
956 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
957 * This can avoid furthur problem when the card runs in different
958 * mode between the host.
959 */
93bfd616
PA
960 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
961 (mmc->cfg->host_caps & MMC_MODE_HS)))
2c3fbf4c
ML
962 return 0;
963
f781dd38 964 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
272cc70b
AF
965
966 if (err)
967 return err;
968
4e3d89ba 969 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
272cc70b
AF
970 mmc->card_caps |= MMC_MODE_HS;
971
972 return 0;
973}
974
975/* frequency bases */
976/* divided by 10 to be nice to platforms without floating point */
5f837c2c 977static const int fbase[] = {
272cc70b
AF
978 10000,
979 100000,
980 1000000,
981 10000000,
982};
983
984/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
985 * to platforms without floating point.
986 */
5f837c2c 987static const int multipliers[] = {
272cc70b
AF
988 0, /* reserved */
989 10,
990 12,
991 13,
992 15,
993 20,
994 25,
995 30,
996 35,
997 40,
998 45,
999 50,
1000 55,
1001 60,
1002 70,
1003 80,
1004};
1005
fdbb873e 1006static void mmc_set_ios(struct mmc *mmc)
272cc70b 1007{
93bfd616
PA
1008 if (mmc->cfg->ops->set_ios)
1009 mmc->cfg->ops->set_ios(mmc);
272cc70b
AF
1010}
1011
1012void mmc_set_clock(struct mmc *mmc, uint clock)
1013{
93bfd616
PA
1014 if (clock > mmc->cfg->f_max)
1015 clock = mmc->cfg->f_max;
272cc70b 1016
93bfd616
PA
1017 if (clock < mmc->cfg->f_min)
1018 clock = mmc->cfg->f_min;
272cc70b
AF
1019
1020 mmc->clock = clock;
1021
1022 mmc_set_ios(mmc);
1023}
1024
fdbb873e 1025static void mmc_set_bus_width(struct mmc *mmc, uint width)
272cc70b
AF
1026{
1027 mmc->bus_width = width;
1028
1029 mmc_set_ios(mmc);
1030}
1031
fdbb873e 1032static int mmc_startup(struct mmc *mmc)
272cc70b 1033{
f866a46d 1034 int err, i;
272cc70b 1035 uint mult, freq;
639b7827 1036 u64 cmult, csize, capacity;
272cc70b 1037 struct mmc_cmd cmd;
8bfa195e
SG
1038 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1039 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
5d4fc8d9 1040 int timeout = 1000;
0c453bb7 1041 bool has_parts = false;
8a0cf490 1042 bool part_completed;
c40fdca6 1043 struct blk_desc *bdesc;
272cc70b 1044
d52ebf10
TC
1045#ifdef CONFIG_MMC_SPI_CRC_ON
1046 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1047 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1048 cmd.resp_type = MMC_RSP_R1;
1049 cmd.cmdarg = 1;
d52ebf10
TC
1050 err = mmc_send_cmd(mmc, &cmd, NULL);
1051
1052 if (err)
1053 return err;
1054 }
1055#endif
1056
272cc70b 1057 /* Put the Card in Identify Mode */
d52ebf10
TC
1058 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1059 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
272cc70b
AF
1060 cmd.resp_type = MMC_RSP_R2;
1061 cmd.cmdarg = 0;
272cc70b
AF
1062
1063 err = mmc_send_cmd(mmc, &cmd, NULL);
1064
1065 if (err)
1066 return err;
1067
1068 memcpy(mmc->cid, cmd.response, 16);
1069
1070 /*
1071 * For MMC cards, set the Relative Address.
1072 * For SD cards, get the Relatvie Address.
1073 * This also puts the cards into Standby State
1074 */
d52ebf10
TC
1075 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1076 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1077 cmd.cmdarg = mmc->rca << 16;
1078 cmd.resp_type = MMC_RSP_R6;
272cc70b 1079
d52ebf10 1080 err = mmc_send_cmd(mmc, &cmd, NULL);
272cc70b 1081
d52ebf10
TC
1082 if (err)
1083 return err;
272cc70b 1084
d52ebf10
TC
1085 if (IS_SD(mmc))
1086 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1087 }
272cc70b
AF
1088
1089 /* Get the Card-Specific Data */
1090 cmd.cmdidx = MMC_CMD_SEND_CSD;
1091 cmd.resp_type = MMC_RSP_R2;
1092 cmd.cmdarg = mmc->rca << 16;
272cc70b
AF
1093
1094 err = mmc_send_cmd(mmc, &cmd, NULL);
1095
5d4fc8d9
RR
1096 /* Waiting for the ready status */
1097 mmc_send_status(mmc, timeout);
1098
272cc70b
AF
1099 if (err)
1100 return err;
1101
998be3dd
RV
1102 mmc->csd[0] = cmd.response[0];
1103 mmc->csd[1] = cmd.response[1];
1104 mmc->csd[2] = cmd.response[2];
1105 mmc->csd[3] = cmd.response[3];
272cc70b
AF
1106
1107 if (mmc->version == MMC_VERSION_UNKNOWN) {
0b453ffe 1108 int version = (cmd.response[0] >> 26) & 0xf;
272cc70b
AF
1109
1110 switch (version) {
53e8e40b
BM
1111 case 0:
1112 mmc->version = MMC_VERSION_1_2;
1113 break;
1114 case 1:
1115 mmc->version = MMC_VERSION_1_4;
1116 break;
1117 case 2:
1118 mmc->version = MMC_VERSION_2_2;
1119 break;
1120 case 3:
1121 mmc->version = MMC_VERSION_3;
1122 break;
1123 case 4:
1124 mmc->version = MMC_VERSION_4;
1125 break;
1126 default:
1127 mmc->version = MMC_VERSION_1_2;
1128 break;
272cc70b
AF
1129 }
1130 }
1131
1132 /* divide frequency by 10, since the mults are 10x bigger */
0b453ffe
RV
1133 freq = fbase[(cmd.response[0] & 0x7)];
1134 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
272cc70b
AF
1135
1136 mmc->tran_speed = freq * mult;
1137
ab71188c 1138 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
998be3dd 1139 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
272cc70b
AF
1140
1141 if (IS_SD(mmc))
1142 mmc->write_bl_len = mmc->read_bl_len;
1143 else
998be3dd 1144 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
272cc70b
AF
1145
1146 if (mmc->high_capacity) {
1147 csize = (mmc->csd[1] & 0x3f) << 16
1148 | (mmc->csd[2] & 0xffff0000) >> 16;
1149 cmult = 8;
1150 } else {
1151 csize = (mmc->csd[1] & 0x3ff) << 2
1152 | (mmc->csd[2] & 0xc0000000) >> 30;
1153 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1154 }
1155
f866a46d
SW
1156 mmc->capacity_user = (csize + 1) << (cmult + 2);
1157 mmc->capacity_user *= mmc->read_bl_len;
1158 mmc->capacity_boot = 0;
1159 mmc->capacity_rpmb = 0;
1160 for (i = 0; i < 4; i++)
1161 mmc->capacity_gp[i] = 0;
272cc70b 1162
8bfa195e
SG
1163 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1164 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
272cc70b 1165
8bfa195e
SG
1166 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1167 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
272cc70b 1168
ab71188c
MN
1169 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1170 cmd.cmdidx = MMC_CMD_SET_DSR;
1171 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1172 cmd.resp_type = MMC_RSP_NONE;
1173 if (mmc_send_cmd(mmc, &cmd, NULL))
1174 printf("MMC: SET_DSR failed\n");
1175 }
1176
272cc70b 1177 /* Select the card, and put it into Transfer Mode */
d52ebf10
TC
1178 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1179 cmd.cmdidx = MMC_CMD_SELECT_CARD;
fe8f7066 1180 cmd.resp_type = MMC_RSP_R1;
d52ebf10 1181 cmd.cmdarg = mmc->rca << 16;
d52ebf10 1182 err = mmc_send_cmd(mmc, &cmd, NULL);
272cc70b 1183
d52ebf10
TC
1184 if (err)
1185 return err;
1186 }
272cc70b 1187
e6f99a56
LW
1188 /*
1189 * For SD, its erase group is always one sector
1190 */
1191 mmc->erase_grp_size = 1;
bc897b1d 1192 mmc->part_config = MMCPART_NOAVAILABLE;
d23e2c09
SG
1193 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1194 /* check ext_csd version and capacity */
1195 err = mmc_send_ext_csd(mmc, ext_csd);
9cf199eb
DSC
1196 if (err)
1197 return err;
1198 if (ext_csd[EXT_CSD_REV] >= 2) {
639b7827
YS
1199 /*
1200 * According to the JEDEC Standard, the value of
1201 * ext_csd's capacity is valid if the value is more
1202 * than 2GB
1203 */
0560db18
LW
1204 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1205 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1206 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1207 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
8bfa195e 1208 capacity *= MMC_MAX_BLOCK_LEN;
b1f1e821 1209 if ((capacity >> 20) > 2 * 1024)
f866a46d 1210 mmc->capacity_user = capacity;
d23e2c09 1211 }
bc897b1d 1212
64f4a619
JC
1213 switch (ext_csd[EXT_CSD_REV]) {
1214 case 1:
1215 mmc->version = MMC_VERSION_4_1;
1216 break;
1217 case 2:
1218 mmc->version = MMC_VERSION_4_2;
1219 break;
1220 case 3:
1221 mmc->version = MMC_VERSION_4_3;
1222 break;
1223 case 5:
1224 mmc->version = MMC_VERSION_4_41;
1225 break;
1226 case 6:
1227 mmc->version = MMC_VERSION_4_5;
1228 break;
edab723b
MN
1229 case 7:
1230 mmc->version = MMC_VERSION_5_0;
1231 break;
64f4a619
JC
1232 }
1233
8a0cf490
DSC
1234 /* The partition data may be non-zero but it is only
1235 * effective if PARTITION_SETTING_COMPLETED is set in
1236 * EXT_CSD, so ignore any data if this bit is not set,
1237 * except for enabling the high-capacity group size
1238 * definition (see below). */
1239 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1240 EXT_CSD_PARTITION_SETTING_COMPLETED);
1241
0c453bb7
DSC
1242 /* store the partition info of emmc */
1243 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1244 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1245 ext_csd[EXT_CSD_BOOT_MULT])
1246 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
8a0cf490
DSC
1247 if (part_completed &&
1248 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
0c453bb7
DSC
1249 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1250
1251 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1252
1253 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1254
1255 for (i = 0; i < 4; i++) {
1256 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
8a0cf490 1257 uint mult = (ext_csd[idx + 2] << 16) +
0c453bb7 1258 (ext_csd[idx + 1] << 8) + ext_csd[idx];
8a0cf490
DSC
1259 if (mult)
1260 has_parts = true;
1261 if (!part_completed)
1262 continue;
1263 mmc->capacity_gp[i] = mult;
0c453bb7
DSC
1264 mmc->capacity_gp[i] *=
1265 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1266 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
f8e89d67 1267 mmc->capacity_gp[i] <<= 19;
0c453bb7
DSC
1268 }
1269
8a0cf490
DSC
1270 if (part_completed) {
1271 mmc->enh_user_size =
1272 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
1273 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
1274 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1275 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1276 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1277 mmc->enh_user_size <<= 19;
1278 mmc->enh_user_start =
1279 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
1280 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
1281 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
1282 ext_csd[EXT_CSD_ENH_START_ADDR];
1283 if (mmc->high_capacity)
1284 mmc->enh_user_start <<= 9;
1285 }
a7f852b6 1286
e6f99a56 1287 /*
1937e5aa
OM
1288 * Host needs to enable ERASE_GRP_DEF bit if device is
1289 * partitioned. This bit will be lost every time after a reset
1290 * or power off. This will affect erase size.
e6f99a56 1291 */
8a0cf490 1292 if (part_completed)
0c453bb7 1293 has_parts = true;
1937e5aa 1294 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
0c453bb7
DSC
1295 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1296 has_parts = true;
1297 if (has_parts) {
1937e5aa
OM
1298 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1299 EXT_CSD_ERASE_GROUP_DEF, 1);
1300
1301 if (err)
1302 return err;
021a8055
HP
1303 else
1304 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
037dc0ab 1305 }
1937e5aa 1306
037dc0ab 1307 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
1937e5aa 1308 /* Read out group size from ext_csd */
0560db18 1309 mmc->erase_grp_size =
a4ff9f83 1310 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
d7b29129
MN
1311 /*
1312 * if high capacity and partition setting completed
1313 * SEC_COUNT is valid even if it is smaller than 2 GiB
1314 * JEDEC Standard JESD84-B45, 6.2.4
1315 */
8a0cf490 1316 if (mmc->high_capacity && part_completed) {
d7b29129
MN
1317 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1318 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1319 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1320 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1321 capacity *= MMC_MAX_BLOCK_LEN;
1322 mmc->capacity_user = capacity;
1323 }
8bfa195e 1324 } else {
1937e5aa 1325 /* Calculate the group size from the csd value. */
e6f99a56
LW
1326 int erase_gsz, erase_gmul;
1327 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1328 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1329 mmc->erase_grp_size = (erase_gsz + 1)
1330 * (erase_gmul + 1);
1331 }
037dc0ab
DSC
1332
1333 mmc->hc_wp_grp_size = 1024
1334 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1335 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
9e41a00b
DSC
1336
1337 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
d23e2c09
SG
1338 }
1339
c40fdca6 1340 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
f866a46d
SW
1341 if (err)
1342 return err;
1343
272cc70b
AF
1344 if (IS_SD(mmc))
1345 err = sd_change_freq(mmc);
1346 else
1347 err = mmc_change_freq(mmc);
1348
1349 if (err)
1350 return err;
1351
1352 /* Restrict card's capabilities by what the host can do */
93bfd616 1353 mmc->card_caps &= mmc->cfg->host_caps;
272cc70b
AF
1354
1355 if (IS_SD(mmc)) {
1356 if (mmc->card_caps & MMC_MODE_4BIT) {
1357 cmd.cmdidx = MMC_CMD_APP_CMD;
1358 cmd.resp_type = MMC_RSP_R1;
1359 cmd.cmdarg = mmc->rca << 16;
272cc70b
AF
1360
1361 err = mmc_send_cmd(mmc, &cmd, NULL);
1362 if (err)
1363 return err;
1364
1365 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1366 cmd.resp_type = MMC_RSP_R1;
1367 cmd.cmdarg = 2;
272cc70b
AF
1368 err = mmc_send_cmd(mmc, &cmd, NULL);
1369 if (err)
1370 return err;
1371
1372 mmc_set_bus_width(mmc, 4);
1373 }
1374
1375 if (mmc->card_caps & MMC_MODE_HS)
ad5fd922 1376 mmc->tran_speed = 50000000;
272cc70b 1377 else
ad5fd922 1378 mmc->tran_speed = 25000000;
fc5b32fb
AG
1379 } else if (mmc->version >= MMC_VERSION_4) {
1380 /* Only version 4 of MMC supports wider bus widths */
7798f6db
AF
1381 int idx;
1382
1383 /* An array of possible bus widths in order of preference */
1384 static unsigned ext_csd_bits[] = {
d22e3d46
JC
1385 EXT_CSD_DDR_BUS_WIDTH_8,
1386 EXT_CSD_DDR_BUS_WIDTH_4,
7798f6db
AF
1387 EXT_CSD_BUS_WIDTH_8,
1388 EXT_CSD_BUS_WIDTH_4,
1389 EXT_CSD_BUS_WIDTH_1,
1390 };
1391
1392 /* An array to map CSD bus widths to host cap bits */
1393 static unsigned ext_to_hostcaps[] = {
786e8f81
AG
1394 [EXT_CSD_DDR_BUS_WIDTH_4] =
1395 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1396 [EXT_CSD_DDR_BUS_WIDTH_8] =
1397 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
7798f6db
AF
1398 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1399 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1400 };
1401
1402 /* An array to map chosen bus width to an integer */
1403 static unsigned widths[] = {
d22e3d46 1404 8, 4, 8, 4, 1,
7798f6db
AF
1405 };
1406
1407 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1408 unsigned int extw = ext_csd_bits[idx];
786e8f81 1409 unsigned int caps = ext_to_hostcaps[extw];
7798f6db 1410
bf477073
AG
1411 /*
1412 * If the bus width is still not changed,
1413 * don't try to set the default again.
1414 * Otherwise, recover from switch attempts
1415 * by switching to 1-bit bus width.
1416 */
1417 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1418 mmc->bus_width == 1) {
1419 err = 0;
1420 break;
1421 }
1422
7798f6db 1423 /*
786e8f81
AG
1424 * Check to make sure the card and controller support
1425 * these capabilities
7798f6db 1426 */
786e8f81 1427 if ((mmc->card_caps & caps) != caps)
7798f6db
AF
1428 continue;
1429
272cc70b 1430 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
7798f6db 1431 EXT_CSD_BUS_WIDTH, extw);
272cc70b
AF
1432
1433 if (err)
4137894e 1434 continue;
272cc70b 1435
786e8f81 1436 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
7798f6db 1437 mmc_set_bus_width(mmc, widths[idx]);
4137894e
LW
1438
1439 err = mmc_send_ext_csd(mmc, test_csd);
786e8f81
AG
1440
1441 if (err)
1442 continue;
1443
786a27b7 1444 /* Only compare read only fields */
786e8f81
AG
1445 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1446 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1447 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1448 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1449 ext_csd[EXT_CSD_REV]
1450 == test_csd[EXT_CSD_REV] &&
1451 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1452 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1453 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1454 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
4137894e 1455 break;
786e8f81
AG
1456 else
1457 err = SWITCH_ERR;
272cc70b
AF
1458 }
1459
786e8f81
AG
1460 if (err)
1461 return err;
1462
272cc70b
AF
1463 if (mmc->card_caps & MMC_MODE_HS) {
1464 if (mmc->card_caps & MMC_MODE_HS_52MHz)
ad5fd922 1465 mmc->tran_speed = 52000000;
272cc70b 1466 else
ad5fd922
JC
1467 mmc->tran_speed = 26000000;
1468 }
272cc70b
AF
1469 }
1470
ad5fd922
JC
1471 mmc_set_clock(mmc, mmc->tran_speed);
1472
5af8f45c
AG
1473 /* Fix the block length for DDR mode */
1474 if (mmc->ddr_mode) {
1475 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1476 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1477 }
1478
272cc70b 1479 /* fill in device description */
c40fdca6
SG
1480 bdesc = mmc_get_blk_desc(mmc);
1481 bdesc->lun = 0;
1482 bdesc->hwpart = 0;
1483 bdesc->type = 0;
1484 bdesc->blksz = mmc->read_bl_len;
1485 bdesc->log2blksz = LOG2(bdesc->blksz);
1486 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
fc011f64
SS
1487#if !defined(CONFIG_SPL_BUILD) || \
1488 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1489 !defined(CONFIG_USE_TINY_PRINTF))
c40fdca6 1490 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
babce5f6
TH
1491 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1492 (mmc->cid[3] >> 16) & 0xffff);
c40fdca6 1493 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
babce5f6
TH
1494 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1495 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1496 (mmc->cid[2] >> 24) & 0xff);
c40fdca6 1497 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
babce5f6 1498 (mmc->cid[2] >> 16) & 0xf);
56196826 1499#else
c40fdca6
SG
1500 bdesc->vendor[0] = 0;
1501 bdesc->product[0] = 0;
1502 bdesc->revision[0] = 0;
56196826 1503#endif
122efd43 1504#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
c40fdca6 1505 part_init(bdesc);
122efd43 1506#endif
272cc70b
AF
1507
1508 return 0;
1509}
1510
fdbb873e 1511static int mmc_send_if_cond(struct mmc *mmc)
272cc70b
AF
1512{
1513 struct mmc_cmd cmd;
1514 int err;
1515
1516 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1517 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
93bfd616 1518 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
272cc70b 1519 cmd.resp_type = MMC_RSP_R7;
272cc70b
AF
1520
1521 err = mmc_send_cmd(mmc, &cmd, NULL);
1522
1523 if (err)
1524 return err;
1525
998be3dd 1526 if ((cmd.response[0] & 0xff) != 0xaa)
272cc70b
AF
1527 return UNUSABLE_ERR;
1528 else
1529 mmc->version = SD_VERSION_2;
1530
1531 return 0;
1532}
1533
ad27dd5e
SG
1534#ifdef CONFIG_BLK
1535int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
1536{
1537 struct blk_desc *bdesc;
1538 struct udevice *bdev;
1539 int ret;
1540
1541 ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC, -1, 512,
1542 0, &bdev);
1543 if (ret) {
1544 debug("Cannot create block device\n");
1545 return ret;
1546 }
1547 bdesc = dev_get_uclass_platdata(bdev);
1548 mmc->cfg = cfg;
1549 mmc->priv = dev;
1550
1551 /* the following chunk was from mmc_register() */
1552
1553 /* Setup dsr related values */
1554 mmc->dsr_imp = 0;
1555 mmc->dsr = 0xffffffff;
1556 /* Setup the universal parts of the block interface just once */
ad27dd5e
SG
1557 bdesc->removable = 1;
1558
1559 /* setup initial part type */
1560 bdesc->part_type = mmc->cfg->part_type;
1561 mmc->dev = dev;
1562
1563 return 0;
1564}
1565
1566int mmc_unbind(struct udevice *dev)
1567{
1568 struct udevice *bdev;
1569
1570 device_find_first_child(dev, &bdev);
1571 if (bdev) {
1572 device_remove(bdev);
1573 device_unbind(bdev);
1574 }
1575
1576 return 0;
1577}
1578
1579#else
93bfd616 1580struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
272cc70b 1581{
c40fdca6 1582 struct blk_desc *bdesc;
93bfd616
PA
1583 struct mmc *mmc;
1584
1585 /* quick validation */
1586 if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1587 cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1588 return NULL;
1589
1590 mmc = calloc(1, sizeof(*mmc));
1591 if (mmc == NULL)
1592 return NULL;
1593
1594 mmc->cfg = cfg;
1595 mmc->priv = priv;
1596
1597 /* the following chunk was mmc_register() */
1598
ab71188c
MN
1599 /* Setup dsr related values */
1600 mmc->dsr_imp = 0;
1601 mmc->dsr = 0xffffffff;
272cc70b 1602 /* Setup the universal parts of the block interface just once */
c40fdca6
SG
1603 bdesc = mmc_get_blk_desc(mmc);
1604 bdesc->if_type = IF_TYPE_MMC;
1605 bdesc->removable = 1;
1606 bdesc->devnum = mmc_get_next_devnum();
1607 bdesc->block_read = mmc_bread;
1608 bdesc->block_write = mmc_bwrite;
1609 bdesc->block_erase = mmc_berase;
272cc70b 1610
93bfd616 1611 /* setup initial part type */
c40fdca6
SG
1612 bdesc->part_type = mmc->cfg->part_type;
1613 mmc_list_add(mmc);
93bfd616
PA
1614
1615 return mmc;
1616}
1617
1618void mmc_destroy(struct mmc *mmc)
1619{
1620 /* only freeing memory for now */
1621 free(mmc);
272cc70b 1622}
ad27dd5e 1623#endif
272cc70b 1624
33fb211d 1625#ifndef CONFIG_BLK
3c457f4d 1626static int mmc_get_dev(int dev, struct blk_desc **descp)
663acabd
SG
1627{
1628 struct mmc *mmc = find_mmc_device(dev);
1629 int ret;
1630
1631 if (!mmc)
1632 return -ENODEV;
1633 ret = mmc_init(mmc);
1634 if (ret)
1635 return ret;
1636
1637 *descp = &mmc->block_dev;
1638
1639 return 0;
1640}
33fb211d 1641#endif
663acabd 1642
95de9ab2
PK
1643/* board-specific MMC power initializations. */
1644__weak void board_mmc_power_init(void)
1645{
1646}
1647
e9550449 1648int mmc_start_init(struct mmc *mmc)
272cc70b 1649{
afd5932b 1650 int err;
272cc70b 1651
ab769f22 1652 /* we pretend there's no card when init is NULL */
93bfd616 1653 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
48972d90 1654 mmc->has_init = 0;
56196826 1655#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
48972d90 1656 printf("MMC: no card present\n");
56196826 1657#endif
48972d90
TR
1658 return NO_CARD_ERR;
1659 }
1660
bc897b1d
LW
1661 if (mmc->has_init)
1662 return 0;
1663
5a8dbdc6
YL
1664#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1665 mmc_adapter_card_type_ident();
1666#endif
95de9ab2
PK
1667 board_mmc_power_init();
1668
ab769f22 1669 /* made sure it's not NULL earlier */
93bfd616 1670 err = mmc->cfg->ops->init(mmc);
272cc70b
AF
1671
1672 if (err)
1673 return err;
1674
786e8f81 1675 mmc->ddr_mode = 0;
b86b85e2
IY
1676 mmc_set_bus_width(mmc, 1);
1677 mmc_set_clock(mmc, 1);
1678
272cc70b
AF
1679 /* Reset the Card */
1680 err = mmc_go_idle(mmc);
1681
1682 if (err)
1683 return err;
1684
bc897b1d 1685 /* The internal partition reset to user partition(0) at every CMD0*/
c40fdca6 1686 mmc_get_blk_desc(mmc)->hwpart = 0;
bc897b1d 1687
272cc70b 1688 /* Test for SD version 2 */
afd5932b 1689 err = mmc_send_if_cond(mmc);
272cc70b 1690
272cc70b
AF
1691 /* Now try to get the SD card's operating condition */
1692 err = sd_send_op_cond(mmc);
1693
1694 /* If the command timed out, we check for an MMC card */
1695 if (err == TIMEOUT) {
1696 err = mmc_send_op_cond(mmc);
1697
bd47c135 1698 if (err) {
56196826 1699#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
272cc70b 1700 printf("Card did not respond to voltage select!\n");
56196826 1701#endif
272cc70b
AF
1702 return UNUSABLE_ERR;
1703 }
1704 }
1705
bd47c135 1706 if (!err)
e9550449
CLC
1707 mmc->init_in_progress = 1;
1708
1709 return err;
1710}
1711
1712static int mmc_complete_init(struct mmc *mmc)
1713{
1714 int err = 0;
1715
bd47c135 1716 mmc->init_in_progress = 0;
e9550449
CLC
1717 if (mmc->op_cond_pending)
1718 err = mmc_complete_op_cond(mmc);
1719
1720 if (!err)
1721 err = mmc_startup(mmc);
bc897b1d
LW
1722 if (err)
1723 mmc->has_init = 0;
1724 else
1725 mmc->has_init = 1;
e9550449
CLC
1726 return err;
1727}
1728
1729int mmc_init(struct mmc *mmc)
1730{
bd47c135 1731 int err = 0;
d803fea5 1732 unsigned start;
33fb211d
SG
1733#ifdef CONFIG_DM_MMC
1734 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
e9550449 1735
33fb211d
SG
1736 upriv->mmc = mmc;
1737#endif
e9550449
CLC
1738 if (mmc->has_init)
1739 return 0;
d803fea5
MZ
1740
1741 start = get_timer(0);
1742
e9550449
CLC
1743 if (!mmc->init_in_progress)
1744 err = mmc_start_init(mmc);
1745
bd47c135 1746 if (!err)
e9550449
CLC
1747 err = mmc_complete_init(mmc);
1748 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
bc897b1d 1749 return err;
272cc70b
AF
1750}
1751
ab71188c
MN
1752int mmc_set_dsr(struct mmc *mmc, u16 val)
1753{
1754 mmc->dsr = val;
1755 return 0;
1756}
1757
cee9ab7c
JH
1758/* CPU-specific MMC initializations */
1759__weak int cpu_mmc_init(bd_t *bis)
272cc70b
AF
1760{
1761 return -1;
1762}
1763
cee9ab7c
JH
1764/* board-specific MMC initializations. */
1765__weak int board_mmc_init(bd_t *bis)
1766{
1767 return -1;
1768}
272cc70b 1769
e9550449
CLC
1770void mmc_set_preinit(struct mmc *mmc, int preinit)
1771{
1772 mmc->preinit = preinit;
1773}
1774
8e3332e2
SS
1775#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1776static int mmc_probe(bd_t *bis)
1777{
1778 return 0;
1779}
1780#elif defined(CONFIG_DM_MMC)
1781static int mmc_probe(bd_t *bis)
1782{
4a1db6d8 1783 int ret, i;
8e3332e2 1784 struct uclass *uc;
4a1db6d8 1785 struct udevice *dev;
8e3332e2
SS
1786
1787 ret = uclass_get(UCLASS_MMC, &uc);
1788 if (ret)
1789 return ret;
1790
4a1db6d8
SG
1791 /*
1792 * Try to add them in sequence order. Really with driver model we
1793 * should allow holes, but the current MMC list does not allow that.
1794 * So if we request 0, 1, 3 we will get 0, 1, 2.
1795 */
1796 for (i = 0; ; i++) {
1797 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1798 if (ret == -ENODEV)
1799 break;
1800 }
1801 uclass_foreach_dev(dev, uc) {
1802 ret = device_probe(dev);
8e3332e2 1803 if (ret)
4a1db6d8 1804 printf("%s - probe failed: %d\n", dev->name, ret);
8e3332e2
SS
1805 }
1806
1807 return 0;
1808}
1809#else
1810static int mmc_probe(bd_t *bis)
1811{
1812 if (board_mmc_init(bis) < 0)
1813 cpu_mmc_init(bis);
1814
1815 return 0;
1816}
1817#endif
e9550449 1818
272cc70b
AF
1819int mmc_initialize(bd_t *bis)
1820{
1b26bab1 1821 static int initialized = 0;
8e3332e2 1822 int ret;
1b26bab1
DK
1823 if (initialized) /* Avoid initializing mmc multiple times */
1824 return 0;
1825 initialized = 1;
1826
c40fdca6
SG
1827#ifndef CONFIG_BLK
1828 mmc_list_init();
1829#endif
8e3332e2
SS
1830 ret = mmc_probe(bis);
1831 if (ret)
1832 return ret;
272cc70b 1833
bb0dc108 1834#ifndef CONFIG_SPL_BUILD
272cc70b 1835 print_mmc_devices(',');
bb0dc108 1836#endif
272cc70b 1837
c40fdca6 1838 mmc_do_preinit();
272cc70b
AF
1839 return 0;
1840}
3690d6d6
A
1841
1842#ifdef CONFIG_SUPPORT_EMMC_BOOT
1843/*
1844 * This function changes the size of boot partition and the size of rpmb
1845 * partition present on EMMC devices.
1846 *
1847 * Input Parameters:
1848 * struct *mmc: pointer for the mmc device strcuture
1849 * bootsize: size of boot partition
1850 * rpmbsize: size of rpmb partition
1851 *
1852 * Returns 0 on success.
1853 */
1854
1855int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1856 unsigned long rpmbsize)
1857{
1858 int err;
1859 struct mmc_cmd cmd;
1860
1861 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1862 cmd.cmdidx = MMC_CMD_RES_MAN;
1863 cmd.resp_type = MMC_RSP_R1b;
1864 cmd.cmdarg = MMC_CMD62_ARG1;
1865
1866 err = mmc_send_cmd(mmc, &cmd, NULL);
1867 if (err) {
1868 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1869 return err;
1870 }
1871
1872 /* Boot partition changing mode */
1873 cmd.cmdidx = MMC_CMD_RES_MAN;
1874 cmd.resp_type = MMC_RSP_R1b;
1875 cmd.cmdarg = MMC_CMD62_ARG2;
1876
1877 err = mmc_send_cmd(mmc, &cmd, NULL);
1878 if (err) {
1879 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1880 return err;
1881 }
1882 /* boot partition size is multiple of 128KB */
1883 bootsize = (bootsize * 1024) / 128;
1884
1885 /* Arg: boot partition size */
1886 cmd.cmdidx = MMC_CMD_RES_MAN;
1887 cmd.resp_type = MMC_RSP_R1b;
1888 cmd.cmdarg = bootsize;
1889
1890 err = mmc_send_cmd(mmc, &cmd, NULL);
1891 if (err) {
1892 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1893 return err;
1894 }
1895 /* RPMB partition size is multiple of 128KB */
1896 rpmbsize = (rpmbsize * 1024) / 128;
1897 /* Arg: RPMB partition size */
1898 cmd.cmdidx = MMC_CMD_RES_MAN;
1899 cmd.resp_type = MMC_RSP_R1b;
1900 cmd.cmdarg = rpmbsize;
1901
1902 err = mmc_send_cmd(mmc, &cmd, NULL);
1903 if (err) {
1904 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1905 return err;
1906 }
1907 return 0;
1908}
1909
5a99b9de
TR
1910/*
1911 * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1912 * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1913 * and BOOT_MODE.
1914 *
1915 * Returns 0 on success.
1916 */
1917int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1918{
1919 int err;
1920
1921 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1922 EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1923 EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1924 EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1925
1926 if (err)
1927 return err;
1928 return 0;
1929}
1930
792970b0
TR
1931/*
1932 * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1933 * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1934 * PARTITION_ACCESS.
1935 *
1936 * Returns 0 on success.
1937 */
1938int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1939{
1940 int err;
1941
1942 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1943 EXT_CSD_BOOT_ACK(ack) |
1944 EXT_CSD_BOOT_PART_NUM(part_num) |
1945 EXT_CSD_PARTITION_ACCESS(access));
1946
1947 if (err)
1948 return err;
1949 return 0;
1950}
33ace362
TR
1951
1952/*
1953 * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1954 * for enable. Note that this is a write-once field for non-zero values.
1955 *
1956 * Returns 0 on success.
1957 */
1958int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1959{
1960 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1961 enable);
1962}
3690d6d6 1963#endif
663acabd 1964
33fb211d
SG
1965#ifdef CONFIG_BLK
1966static const struct blk_ops mmc_blk_ops = {
1967 .read = mmc_bread,
1968 .write = mmc_bwrite,
1969 .select_hwpart = mmc_select_hwpart,
1970};
1971
1972U_BOOT_DRIVER(mmc_blk) = {
1973 .name = "mmc_blk",
1974 .id = UCLASS_BLK,
1975 .ops = &mmc_blk_ops,
1976};
1977#else
663acabd
SG
1978U_BOOT_LEGACY_BLK(mmc) = {
1979 .if_typename = "mmc",
1980 .if_type = IF_TYPE_MMC,
1981 .max_devs = -1,
3c457f4d 1982 .get_dev = mmc_get_dev,
e17d1143 1983 .select_hwpart = mmc_select_hwpartp,
663acabd 1984};
33fb211d 1985#endif