blob: a27fcb4311c446711a2fe5d4706b91c4cd0cc301 [file] [log] [blame]
Andy Fleming272cc702008-10-30 16:41:01 -05001/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Fleming272cc702008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
Sjoerd Simons8e3332e2015-08-30 16:55:45 -060013#include <dm.h>
14#include <dm/device-internal.h>
Stephen Warrend4622df2014-05-23 12:47:06 -060015#include <errno.h>
Andy Fleming272cc702008-10-30 16:41:01 -050016#include <mmc.h>
17#include <part.h>
18#include <malloc.h>
Simon Glasscf92e052015-09-02 17:24:58 -060019#include <memalign.h>
Andy Fleming272cc702008-10-30 16:41:01 -050020#include <linux/list.h>
Rabin Vincent9b1f9422009-04-05 13:30:54 +053021#include <div64.h>
Paul Burtonda61fa52013-09-09 15:30:26 +010022#include "mmc_private.h"
Andy Fleming272cc702008-10-30 16:41:01 -050023
Jeroen Hofstee750121c2014-07-12 21:24:08 +020024__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000025{
26 return -1;
27}
28
29int mmc_getwp(struct mmc *mmc)
30{
31 int wp;
32
33 wp = board_mmc_getwp(mmc);
34
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000035 if (wp < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020036 if (mmc->cfg->ops->getwp)
37 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000038 else
39 wp = 0;
40 }
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000041
42 return wp;
43}
44
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +020045__weak int board_mmc_getcd(struct mmc *mmc)
46{
Stefano Babic11fdade2010-02-05 15:04:43 +010047 return -1;
48}
49
Paul Burtonda61fa52013-09-09 15:30:26 +010050int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
Andy Fleming272cc702008-10-30 16:41:01 -050051{
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000052 int ret;
Marek Vasut8635ff92012-03-15 18:41:35 +000053
Marek Vasut8635ff92012-03-15 18:41:35 +000054#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000055 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);
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020060 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Bin Meng7863ce52016-03-17 21:53:14 -070061 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]);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000085 printf("\n");
Bin Meng7863ce52016-03-17 21:53:14 -070086 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;
Bin Meng53e8e402016-03-17 21:53:13 -0700104 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000105 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000106#else
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200107 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000108#endif
Marek Vasut8635ff92012-03-15 18:41:35 +0000109 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500110}
111
Paul Burtonda61fa52013-09-09 15:30:26 +0100112int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000113{
114 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000115 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000116#ifdef CONFIG_MMC_TRACE
117 int status;
118#endif
119
120 cmd.cmdidx = MMC_CMD_SEND_STATUS;
121 cmd.resp_type = MMC_RSP_R1;
Marek Vasutaaf3d412011-08-10 09:24:48 +0200122 if (!mmc_host_is_spi(mmc))
123 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000124
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500125 while (1) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000126 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-02-05 22:29:12 +0000127 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) {
Paul Burton56196822013-09-04 16:12:25 +0100133#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzked617c422012-02-05 22:29:12 +0000134 printf("Status Error: 0x%08X\n",
135 cmd.response[0]);
Paul Burton56196822013-09-04 16:12:25 +0100136#endif
Jan Kloetzked617c422012-02-05 22:29:12 +0000137 return COMM_ERR;
138 }
139 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000140 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000141
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500142 if (timeout-- <= 0)
143 break;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000144
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500145 udelay(1000);
146 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000147
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000148#ifdef CONFIG_MMC_TRACE
149 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
150 printf("CURR STATE:%d\n", status);
151#endif
Jongman Heo5b0c9422012-06-03 21:32:13 +0000152 if (timeout <= 0) {
Paul Burton56196822013-09-04 16:12:25 +0100153#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000154 printf("Timeout waiting card ready\n");
Paul Burton56196822013-09-04 16:12:25 +0100155#endif
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000156 return TIMEOUT;
157 }
158
159 return 0;
160}
161
Paul Burtonda61fa52013-09-09 15:30:26 +0100162int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500163{
164 struct mmc_cmd cmd;
165
Andrew Gabbasov786e8f82014-12-01 06:59:09 -0600166 if (mmc->ddr_mode)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900167 return 0;
168
Andy Fleming272cc702008-10-30 16:41:01 -0500169 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
170 cmd.resp_type = MMC_RSP_R1;
171 cmd.cmdarg = len;
Andy Fleming272cc702008-10-30 16:41:01 -0500172
173 return mmc_send_cmd(mmc, &cmd, NULL);
174}
175
Sascha Silbeff8fef52013-06-14 13:07:25 +0200176static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000177 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500178{
179 struct mmc_cmd cmd;
180 struct mmc_data data;
181
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700182 if (blkcnt > 1)
183 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
184 else
185 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500186
187 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700188 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500189 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700190 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500191
192 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500193
194 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700195 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500196 data.blocksize = mmc->read_bl_len;
197 data.flags = MMC_DATA_READ;
198
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700199 if (mmc_send_cmd(mmc, &cmd, &data))
200 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500201
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700202 if (blkcnt > 1) {
203 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
204 cmd.cmdarg = 0;
205 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700206 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton56196822013-09-04 16:12:25 +0100207#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700208 printf("mmc fail to send stop cmd\n");
Paul Burton56196822013-09-04 16:12:25 +0100209#endif
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700210 return 0;
211 }
Andy Fleming272cc702008-10-30 16:41:01 -0500212 }
213
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700214 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500215}
216
Simon Glass33fb2112016-05-01 13:52:41 -0600217#ifdef CONFIG_BLK
Simon Glass7dba0b92016-06-12 23:30:15 -0600218ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600219#else
Simon Glass7dba0b92016-06-12 23:30:15 -0600220ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
221 void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600222#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500223{
Simon Glass33fb2112016-05-01 13:52:41 -0600224#ifdef CONFIG_BLK
225 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
226#endif
Simon Glassbcce53d2016-02-29 15:25:51 -0700227 int dev_num = block_dev->devnum;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700228 int err;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700229 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500230
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700231 if (blkcnt == 0)
232 return 0;
233
234 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500235 if (!mmc)
236 return 0;
237
Simon Glass69f45cd2016-05-01 13:52:29 -0600238 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
Stephen Warren873cc1d2015-12-07 11:38:49 -0700239 if (err < 0)
240 return 0;
241
Simon Glassc40fdca2016-05-01 13:52:35 -0600242 if ((start + blkcnt) > block_dev->lba) {
Paul Burton56196822013-09-04 16:12:25 +0100243#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbeff8fef52013-06-14 13:07:25 +0200244 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glassc40fdca2016-05-01 13:52:35 -0600245 start + blkcnt, block_dev->lba);
Paul Burton56196822013-09-04 16:12:25 +0100246#endif
Lei Wend2bf29e2010-09-13 22:07:27 +0800247 return 0;
248 }
Andy Fleming272cc702008-10-30 16:41:01 -0500249
Simon Glass11692992015-06-23 15:38:50 -0600250 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
251 debug("%s: Failed to set blocklen\n", __func__);
Andy Fleming272cc702008-10-30 16:41:01 -0500252 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600253 }
Andy Fleming272cc702008-10-30 16:41:01 -0500254
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700255 do {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200256 cur = (blocks_todo > mmc->cfg->b_max) ?
257 mmc->cfg->b_max : blocks_todo;
Simon Glass11692992015-06-23 15:38:50 -0600258 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
259 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700260 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600261 }
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700262 blocks_todo -= cur;
263 start += cur;
264 dst += cur * mmc->read_bl_len;
265 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500266
267 return blkcnt;
268}
269
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000270static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500271{
272 struct mmc_cmd cmd;
273 int err;
274
275 udelay(1000);
276
277 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
278 cmd.cmdarg = 0;
279 cmd.resp_type = MMC_RSP_NONE;
Andy Fleming272cc702008-10-30 16:41:01 -0500280
281 err = mmc_send_cmd(mmc, &cmd, NULL);
282
283 if (err)
284 return err;
285
286 udelay(2000);
287
288 return 0;
289}
290
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000291static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500292{
293 int timeout = 1000;
294 int err;
295 struct mmc_cmd cmd;
296
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500297 while (1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500298 cmd.cmdidx = MMC_CMD_APP_CMD;
299 cmd.resp_type = MMC_RSP_R1;
300 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500301
302 err = mmc_send_cmd(mmc, &cmd, NULL);
303
304 if (err)
305 return err;
306
307 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
308 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100309
310 /*
311 * Most cards do not answer if some reserved bits
312 * in the ocr are set. However, Some controller
313 * can set bit 7 (reserved for low voltages), but
314 * how to manage low voltages SD card is not yet
315 * specified.
316 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000317 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200318 (mmc->cfg->voltages & 0xff8000);
Andy Fleming272cc702008-10-30 16:41:01 -0500319
320 if (mmc->version == SD_VERSION_2)
321 cmd.cmdarg |= OCR_HCS;
322
323 err = mmc_send_cmd(mmc, &cmd, NULL);
324
325 if (err)
326 return err;
327
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500328 if (cmd.response[0] & OCR_BUSY)
329 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500330
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500331 if (timeout-- <= 0)
332 return UNUSABLE_ERR;
333
334 udelay(1000);
335 }
Andy Fleming272cc702008-10-30 16:41:01 -0500336
337 if (mmc->version != SD_VERSION_2)
338 mmc->version = SD_VERSION_1_0;
339
Thomas Choud52ebf12010-12-24 13:12:21 +0000340 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
341 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
342 cmd.resp_type = MMC_RSP_R3;
343 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000344
345 err = mmc_send_cmd(mmc, &cmd, NULL);
346
347 if (err)
348 return err;
349 }
350
Rabin Vincent998be3d2009-04-05 13:30:56 +0530351 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500352
353 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
354 mmc->rca = 0;
355
356 return 0;
357}
358
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500359static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500360{
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500361 struct mmc_cmd cmd;
Andy Fleming272cc702008-10-30 16:41:01 -0500362 int err;
363
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500364 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
365 cmd.resp_type = MMC_RSP_R3;
366 cmd.cmdarg = 0;
Rob Herring5a203972015-03-23 17:56:59 -0500367 if (use_arg && !mmc_host_is_spi(mmc))
368 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200369 (mmc->cfg->voltages &
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500370 (mmc->ocr & OCR_VOLTAGE_MASK)) |
371 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000372
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500373 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000374 if (err)
375 return err;
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500376 mmc->ocr = cmd.response[0];
Che-Liang Chioue9550442012-11-28 15:21:13 +0000377 return 0;
378}
379
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200380static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000381{
Che-Liang Chioue9550442012-11-28 15:21:13 +0000382 int err, i;
383
Andy Fleming272cc702008-10-30 16:41:01 -0500384 /* Some cards seem to need this */
385 mmc_go_idle(mmc);
386
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000387 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000388 for (i = 0; i < 2; i++) {
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500389 err = mmc_send_op_cond_iter(mmc, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500390 if (err)
391 return err;
392
Che-Liang Chioue9550442012-11-28 15:21:13 +0000393 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500394 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500395 break;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000396 }
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500397 mmc->op_cond_pending = 1;
398 return 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000399}
Andy Fleming272cc702008-10-30 16:41:01 -0500400
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200401static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000402{
403 struct mmc_cmd cmd;
404 int timeout = 1000;
405 uint start;
406 int err;
407
408 mmc->op_cond_pending = 0;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500409 if (!(mmc->ocr & OCR_BUSY)) {
410 start = get_timer(0);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500411 while (1) {
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500412 err = mmc_send_op_cond_iter(mmc, 1);
413 if (err)
414 return err;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500415 if (mmc->ocr & OCR_BUSY)
416 break;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500417 if (get_timer(start) > timeout)
418 return UNUSABLE_ERR;
419 udelay(100);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500420 }
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500421 }
Andy Fleming272cc702008-10-30 16:41:01 -0500422
Thomas Choud52ebf12010-12-24 13:12:21 +0000423 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
424 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
425 cmd.resp_type = MMC_RSP_R3;
426 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000427
428 err = mmc_send_cmd(mmc, &cmd, NULL);
429
430 if (err)
431 return err;
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500432
433 mmc->ocr = cmd.response[0];
Thomas Choud52ebf12010-12-24 13:12:21 +0000434 }
435
Andy Fleming272cc702008-10-30 16:41:01 -0500436 mmc->version = MMC_VERSION_UNKNOWN;
Andy Fleming272cc702008-10-30 16:41:01 -0500437
438 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrendef816a2014-01-30 16:11:12 -0700439 mmc->rca = 1;
Andy Fleming272cc702008-10-30 16:41:01 -0500440
441 return 0;
442}
443
444
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000445static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-10-30 16:41:01 -0500446{
447 struct mmc_cmd cmd;
448 struct mmc_data data;
449 int err;
450
451 /* Get the Card Status Register */
452 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
453 cmd.resp_type = MMC_RSP_R1;
454 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500455
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000456 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500457 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000458 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -0500459 data.flags = MMC_DATA_READ;
460
461 err = mmc_send_cmd(mmc, &cmd, &data);
462
463 return err;
464}
465
466
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000467static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500468{
469 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000470 int timeout = 1000;
471 int ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500472
473 cmd.cmdidx = MMC_CMD_SWITCH;
474 cmd.resp_type = MMC_RSP_R1b;
475 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000476 (index << 16) |
477 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500478
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000479 ret = mmc_send_cmd(mmc, &cmd, NULL);
480
481 /* Waiting for the ready status */
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000482 if (!ret)
483 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000484
485 return ret;
486
Andy Fleming272cc702008-10-30 16:41:01 -0500487}
488
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000489static int mmc_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500490{
Simon Glass8bfa1952013-04-03 08:54:30 +0000491 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Fleming272cc702008-10-30 16:41:01 -0500492 char cardtype;
493 int err;
494
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600495 mmc->card_caps = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500496
Thomas Choud52ebf12010-12-24 13:12:21 +0000497 if (mmc_host_is_spi(mmc))
498 return 0;
499
Andy Fleming272cc702008-10-30 16:41:01 -0500500 /* Only version 4 supports high-speed */
501 if (mmc->version < MMC_VERSION_4)
502 return 0;
503
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600504 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
505
Andy Fleming272cc702008-10-30 16:41:01 -0500506 err = mmc_send_ext_csd(mmc, ext_csd);
507
508 if (err)
509 return err;
510
Lei Wen0560db12011-10-03 20:35:10 +0000511 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500512
513 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
514
515 if (err)
Heiko Schochera5e27b42016-06-07 08:31:21 +0200516 return err;
Andy Fleming272cc702008-10-30 16:41:01 -0500517
518 /* Now check to see that it worked */
519 err = mmc_send_ext_csd(mmc, ext_csd);
520
521 if (err)
522 return err;
523
524 /* No high-speed support */
Lei Wen0560db12011-10-03 20:35:10 +0000525 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Fleming272cc702008-10-30 16:41:01 -0500526 return 0;
527
528 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900529 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov201d5ac2014-12-01 06:59:10 -0600530 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900531 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Fleming272cc702008-10-30 16:41:01 -0500532 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900533 } else {
Andy Fleming272cc702008-10-30 16:41:01 -0500534 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900535 }
Andy Fleming272cc702008-10-30 16:41:01 -0500536
537 return 0;
538}
539
Stephen Warrenf866a462013-06-11 15:14:01 -0600540static int mmc_set_capacity(struct mmc *mmc, int part_num)
541{
542 switch (part_num) {
543 case 0:
544 mmc->capacity = mmc->capacity_user;
545 break;
546 case 1:
547 case 2:
548 mmc->capacity = mmc->capacity_boot;
549 break;
550 case 3:
551 mmc->capacity = mmc->capacity_rpmb;
552 break;
553 case 4:
554 case 5:
555 case 6:
556 case 7:
557 mmc->capacity = mmc->capacity_gp[part_num - 4];
558 break;
559 default:
560 return -1;
561 }
562
Simon Glassc40fdca2016-05-01 13:52:35 -0600563 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrenf866a462013-06-11 15:14:01 -0600564
565 return 0;
566}
567
Simon Glass7dba0b92016-06-12 23:30:15 -0600568int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wenbc897b12011-05-02 16:26:26 +0000569{
Stephen Warrenf866a462013-06-11 15:14:01 -0600570 int ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000571
Stephen Warrenf866a462013-06-11 15:14:01 -0600572 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
573 (mmc->part_config & ~PART_ACCESS_MASK)
574 | (part_num & PART_ACCESS_MASK));
Stephen Warrenf866a462013-06-11 15:14:01 -0600575
Peter Bigot6dc93e72014-09-02 18:31:23 -0500576 /*
577 * Set the capacity if the switch succeeded or was intended
578 * to return to representing the raw device.
579 */
Stephen Warren873cc1d2015-12-07 11:38:49 -0700580 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot6dc93e72014-09-02 18:31:23 -0500581 ret = mmc_set_capacity(mmc, part_num);
Simon Glassfdbb1392016-05-01 13:52:37 -0600582 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700583 }
Peter Bigot6dc93e72014-09-02 18:31:23 -0500584
585 return ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000586}
587
Simon Glass33fb2112016-05-01 13:52:41 -0600588#ifdef CONFIG_BLK
589static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
590{
591 struct udevice *mmc_dev = dev_get_parent(bdev);
592 struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
593 struct blk_desc *desc = dev_get_uclass_platdata(bdev);
594 int ret;
595
596 if (desc->hwpart == hwpart)
597 return 0;
598
599 if (mmc->part_config == MMCPART_NOAVAILABLE)
600 return -EMEDIUMTYPE;
601
602 ret = mmc_switch_part(mmc, hwpart);
603 if (ret)
604 return ret;
605
606 return 0;
607}
608#else
Simon Glasse17d1142016-05-01 13:52:26 -0600609static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
610{
611 struct mmc *mmc = find_mmc_device(desc->devnum);
612 int ret;
613
614 if (!mmc)
615 return -ENODEV;
616
617 if (mmc->block_dev.hwpart == hwpart)
618 return 0;
619
620 if (mmc->part_config == MMCPART_NOAVAILABLE)
621 return -EMEDIUMTYPE;
622
Simon Glassfdbb1392016-05-01 13:52:37 -0600623 ret = mmc_switch_part(mmc, hwpart);
Simon Glasse17d1142016-05-01 13:52:26 -0600624 if (ret)
625 return ret;
626
627 return 0;
628}
Simon Glass33fb2112016-05-01 13:52:41 -0600629#endif
Simon Glassff3882a2016-05-01 13:52:25 -0600630
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100631int mmc_hwpart_config(struct mmc *mmc,
632 const struct mmc_hwpart_conf *conf,
633 enum mmc_hwpart_conf_mode mode)
634{
635 u8 part_attrs = 0;
636 u32 enh_size_mult;
637 u32 enh_start_addr;
638 u32 gp_size_mult[4];
639 u32 max_enh_size_mult;
640 u32 tot_enh_size_mult = 0;
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100641 u8 wr_rel_set;
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100642 int i, pidx, err;
643 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
644
645 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
646 return -EINVAL;
647
648 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
649 printf("eMMC >= 4.4 required for enhanced user data area\n");
650 return -EMEDIUMTYPE;
651 }
652
653 if (!(mmc->part_support & PART_SUPPORT)) {
654 printf("Card does not support partitioning\n");
655 return -EMEDIUMTYPE;
656 }
657
658 if (!mmc->hc_wp_grp_size) {
659 printf("Card does not define HC WP group size\n");
660 return -EMEDIUMTYPE;
661 }
662
663 /* check partition alignment and total enhanced size */
664 if (conf->user.enh_size) {
665 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
666 conf->user.enh_start % mmc->hc_wp_grp_size) {
667 printf("User data enhanced area not HC WP group "
668 "size aligned\n");
669 return -EINVAL;
670 }
671 part_attrs |= EXT_CSD_ENH_USR;
672 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
673 if (mmc->high_capacity) {
674 enh_start_addr = conf->user.enh_start;
675 } else {
676 enh_start_addr = (conf->user.enh_start << 9);
677 }
678 } else {
679 enh_size_mult = 0;
680 enh_start_addr = 0;
681 }
682 tot_enh_size_mult += enh_size_mult;
683
684 for (pidx = 0; pidx < 4; pidx++) {
685 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
686 printf("GP%i partition not HC WP group size "
687 "aligned\n", pidx+1);
688 return -EINVAL;
689 }
690 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
691 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
692 part_attrs |= EXT_CSD_ENH_GP(pidx);
693 tot_enh_size_mult += gp_size_mult[pidx];
694 }
695 }
696
697 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
698 printf("Card does not support enhanced attribute\n");
699 return -EMEDIUMTYPE;
700 }
701
702 err = mmc_send_ext_csd(mmc, ext_csd);
703 if (err)
704 return err;
705
706 max_enh_size_mult =
707 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
708 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
709 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
710 if (tot_enh_size_mult > max_enh_size_mult) {
711 printf("Total enhanced size exceeds maximum (%u > %u)\n",
712 tot_enh_size_mult, max_enh_size_mult);
713 return -EMEDIUMTYPE;
714 }
715
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100716 /* The default value of EXT_CSD_WR_REL_SET is device
717 * dependent, the values can only be changed if the
718 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
719 * changed only once and before partitioning is completed. */
720 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
721 if (conf->user.wr_rel_change) {
722 if (conf->user.wr_rel_set)
723 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
724 else
725 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
726 }
727 for (pidx = 0; pidx < 4; pidx++) {
728 if (conf->gp_part[pidx].wr_rel_change) {
729 if (conf->gp_part[pidx].wr_rel_set)
730 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
731 else
732 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
733 }
734 }
735
736 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
737 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
738 puts("Card does not support host controlled partition write "
739 "reliability settings\n");
740 return -EMEDIUMTYPE;
741 }
742
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100743 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
744 EXT_CSD_PARTITION_SETTING_COMPLETED) {
745 printf("Card already partitioned\n");
746 return -EPERM;
747 }
748
749 if (mode == MMC_HWPART_CONF_CHECK)
750 return 0;
751
752 /* Partitioning requires high-capacity size definitions */
753 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
754 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
755 EXT_CSD_ERASE_GROUP_DEF, 1);
756
757 if (err)
758 return err;
759
760 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
761
762 /* update erase group size to be high-capacity */
763 mmc->erase_grp_size =
764 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
765
766 }
767
768 /* all OK, write the configuration */
769 for (i = 0; i < 4; i++) {
770 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
771 EXT_CSD_ENH_START_ADDR+i,
772 (enh_start_addr >> (i*8)) & 0xFF);
773 if (err)
774 return err;
775 }
776 for (i = 0; i < 3; i++) {
777 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
778 EXT_CSD_ENH_SIZE_MULT+i,
779 (enh_size_mult >> (i*8)) & 0xFF);
780 if (err)
781 return err;
782 }
783 for (pidx = 0; pidx < 4; pidx++) {
784 for (i = 0; i < 3; i++) {
785 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
786 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
787 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
788 if (err)
789 return err;
790 }
791 }
792 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
793 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
794 if (err)
795 return err;
796
797 if (mode == MMC_HWPART_CONF_SET)
798 return 0;
799
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100800 /* The WR_REL_SET is a write-once register but shall be
801 * written before setting PART_SETTING_COMPLETED. As it is
802 * write-once we can only write it when completing the
803 * partitioning. */
804 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
805 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
806 EXT_CSD_WR_REL_SET, wr_rel_set);
807 if (err)
808 return err;
809 }
810
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100811 /* Setting PART_SETTING_COMPLETED confirms the partition
812 * configuration but it only becomes effective after power
813 * cycle, so we do not adjust the partition related settings
814 * in the mmc struct. */
815
816 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
817 EXT_CSD_PARTITION_SETTING,
818 EXT_CSD_PARTITION_SETTING_COMPLETED);
819 if (err)
820 return err;
821
822 return 0;
823}
824
Thierry Reding48972d92012-01-02 01:15:37 +0000825int mmc_getcd(struct mmc *mmc)
826{
827 int cd;
828
829 cd = board_mmc_getcd(mmc);
830
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000831 if (cd < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200832 if (mmc->cfg->ops->getcd)
833 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000834 else
835 cd = 1;
836 }
Thierry Reding48972d92012-01-02 01:15:37 +0000837
838 return cd;
839}
840
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000841static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-10-30 16:41:01 -0500842{
843 struct mmc_cmd cmd;
844 struct mmc_data data;
845
846 /* Switch the frequency */
847 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
848 cmd.resp_type = MMC_RSP_R1;
849 cmd.cmdarg = (mode << 31) | 0xffffff;
850 cmd.cmdarg &= ~(0xf << (group * 4));
851 cmd.cmdarg |= value << (group * 4);
Andy Fleming272cc702008-10-30 16:41:01 -0500852
853 data.dest = (char *)resp;
854 data.blocksize = 64;
855 data.blocks = 1;
856 data.flags = MMC_DATA_READ;
857
858 return mmc_send_cmd(mmc, &cmd, &data);
859}
860
861
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000862static int sd_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500863{
864 int err;
865 struct mmc_cmd cmd;
Anton staaff781dd32011-10-03 13:54:59 +0000866 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
867 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500868 struct mmc_data data;
869 int timeout;
870
871 mmc->card_caps = 0;
872
Thomas Choud52ebf12010-12-24 13:12:21 +0000873 if (mmc_host_is_spi(mmc))
874 return 0;
875
Andy Fleming272cc702008-10-30 16:41:01 -0500876 /* Read the SCR to find out if this card supports higher speeds */
877 cmd.cmdidx = MMC_CMD_APP_CMD;
878 cmd.resp_type = MMC_RSP_R1;
879 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500880
881 err = mmc_send_cmd(mmc, &cmd, NULL);
882
883 if (err)
884 return err;
885
886 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
887 cmd.resp_type = MMC_RSP_R1;
888 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500889
890 timeout = 3;
891
892retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000893 data.dest = (char *)scr;
Andy Fleming272cc702008-10-30 16:41:01 -0500894 data.blocksize = 8;
895 data.blocks = 1;
896 data.flags = MMC_DATA_READ;
897
898 err = mmc_send_cmd(mmc, &cmd, &data);
899
900 if (err) {
901 if (timeout--)
902 goto retry_scr;
903
904 return err;
905 }
906
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300907 mmc->scr[0] = __be32_to_cpu(scr[0]);
908 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500909
910 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng53e8e402016-03-17 21:53:13 -0700911 case 0:
912 mmc->version = SD_VERSION_1_0;
913 break;
914 case 1:
915 mmc->version = SD_VERSION_1_10;
916 break;
917 case 2:
918 mmc->version = SD_VERSION_2;
919 if ((mmc->scr[0] >> 15) & 0x1)
920 mmc->version = SD_VERSION_3;
921 break;
922 default:
923 mmc->version = SD_VERSION_1_0;
924 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500925 }
926
Alagu Sankarb44c7082010-05-12 15:08:24 +0530927 if (mmc->scr[0] & SD_DATA_4BIT)
928 mmc->card_caps |= MMC_MODE_4BIT;
929
Andy Fleming272cc702008-10-30 16:41:01 -0500930 /* Version 1.0 doesn't support switching */
931 if (mmc->version == SD_VERSION_1_0)
932 return 0;
933
934 timeout = 4;
935 while (timeout--) {
936 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaff781dd32011-10-03 13:54:59 +0000937 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500938
939 if (err)
940 return err;
941
942 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300943 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500944 break;
945 }
946
Andy Fleming272cc702008-10-30 16:41:01 -0500947 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300948 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500949 return 0;
950
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000951 /*
952 * If the host doesn't support SD_HIGHSPEED, do not switch card to
953 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
954 * This can avoid furthur problem when the card runs in different
955 * mode between the host.
956 */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200957 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
958 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000959 return 0;
960
Anton staaff781dd32011-10-03 13:54:59 +0000961 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500962
963 if (err)
964 return err;
965
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300966 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-10-30 16:41:01 -0500967 mmc->card_caps |= MMC_MODE_HS;
968
969 return 0;
970}
971
972/* frequency bases */
973/* divided by 10 to be nice to platforms without floating point */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000974static const int fbase[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500975 10000,
976 100000,
977 1000000,
978 10000000,
979};
980
981/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
982 * to platforms without floating point.
983 */
Simon Glass61fe0762016-05-14 14:02:57 -0600984static const u8 multipliers[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500985 0, /* reserved */
986 10,
987 12,
988 13,
989 15,
990 20,
991 25,
992 30,
993 35,
994 40,
995 45,
996 50,
997 55,
998 60,
999 70,
1000 80,
1001};
1002
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001003static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001004{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001005 if (mmc->cfg->ops->set_ios)
1006 mmc->cfg->ops->set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001007}
1008
1009void mmc_set_clock(struct mmc *mmc, uint clock)
1010{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001011 if (clock > mmc->cfg->f_max)
1012 clock = mmc->cfg->f_max;
Andy Fleming272cc702008-10-30 16:41:01 -05001013
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001014 if (clock < mmc->cfg->f_min)
1015 clock = mmc->cfg->f_min;
Andy Fleming272cc702008-10-30 16:41:01 -05001016
1017 mmc->clock = clock;
1018
1019 mmc_set_ios(mmc);
1020}
1021
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001022static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -05001023{
1024 mmc->bus_width = width;
1025
1026 mmc_set_ios(mmc);
1027}
1028
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001029static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001030{
Stephen Warrenf866a462013-06-11 15:14:01 -06001031 int err, i;
Andy Fleming272cc702008-10-30 16:41:01 -05001032 uint mult, freq;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001033 u64 cmult, csize, capacity;
Andy Fleming272cc702008-10-30 16:41:01 -05001034 struct mmc_cmd cmd;
Simon Glass8bfa1952013-04-03 08:54:30 +00001035 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1036 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +00001037 int timeout = 1000;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001038 bool has_parts = false;
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001039 bool part_completed;
Simon Glassc40fdca2016-05-01 13:52:35 -06001040 struct blk_desc *bdesc;
Andy Fleming272cc702008-10-30 16:41:01 -05001041
Thomas Choud52ebf12010-12-24 13:12:21 +00001042#ifdef CONFIG_MMC_SPI_CRC_ON
1043 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1044 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1045 cmd.resp_type = MMC_RSP_R1;
1046 cmd.cmdarg = 1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001047 err = mmc_send_cmd(mmc, &cmd, NULL);
1048
1049 if (err)
1050 return err;
1051 }
1052#endif
1053
Andy Fleming272cc702008-10-30 16:41:01 -05001054 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001055 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1056 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Fleming272cc702008-10-30 16:41:01 -05001057 cmd.resp_type = MMC_RSP_R2;
1058 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001059
1060 err = mmc_send_cmd(mmc, &cmd, NULL);
1061
1062 if (err)
1063 return err;
1064
1065 memcpy(mmc->cid, cmd.response, 16);
1066
1067 /*
1068 * For MMC cards, set the Relative Address.
1069 * For SD cards, get the Relatvie Address.
1070 * This also puts the cards into Standby State
1071 */
Thomas Choud52ebf12010-12-24 13:12:21 +00001072 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1073 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1074 cmd.cmdarg = mmc->rca << 16;
1075 cmd.resp_type = MMC_RSP_R6;
Andy Fleming272cc702008-10-30 16:41:01 -05001076
Thomas Choud52ebf12010-12-24 13:12:21 +00001077 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001078
Thomas Choud52ebf12010-12-24 13:12:21 +00001079 if (err)
1080 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001081
Thomas Choud52ebf12010-12-24 13:12:21 +00001082 if (IS_SD(mmc))
1083 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1084 }
Andy Fleming272cc702008-10-30 16:41:01 -05001085
1086 /* Get the Card-Specific Data */
1087 cmd.cmdidx = MMC_CMD_SEND_CSD;
1088 cmd.resp_type = MMC_RSP_R2;
1089 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -05001090
1091 err = mmc_send_cmd(mmc, &cmd, NULL);
1092
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +00001093 /* Waiting for the ready status */
1094 mmc_send_status(mmc, timeout);
1095
Andy Fleming272cc702008-10-30 16:41:01 -05001096 if (err)
1097 return err;
1098
Rabin Vincent998be3d2009-04-05 13:30:56 +05301099 mmc->csd[0] = cmd.response[0];
1100 mmc->csd[1] = cmd.response[1];
1101 mmc->csd[2] = cmd.response[2];
1102 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -05001103
1104 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301105 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -05001106
1107 switch (version) {
Bin Meng53e8e402016-03-17 21:53:13 -07001108 case 0:
1109 mmc->version = MMC_VERSION_1_2;
1110 break;
1111 case 1:
1112 mmc->version = MMC_VERSION_1_4;
1113 break;
1114 case 2:
1115 mmc->version = MMC_VERSION_2_2;
1116 break;
1117 case 3:
1118 mmc->version = MMC_VERSION_3;
1119 break;
1120 case 4:
1121 mmc->version = MMC_VERSION_4;
1122 break;
1123 default:
1124 mmc->version = MMC_VERSION_1_2;
1125 break;
Andy Fleming272cc702008-10-30 16:41:01 -05001126 }
1127 }
1128
1129 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301130 freq = fbase[(cmd.response[0] & 0x7)];
1131 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -05001132
1133 mmc->tran_speed = freq * mult;
1134
Markus Niebelab711882013-12-16 13:40:46 +01001135 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincent998be3d2009-04-05 13:30:56 +05301136 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001137
1138 if (IS_SD(mmc))
1139 mmc->write_bl_len = mmc->read_bl_len;
1140 else
Rabin Vincent998be3d2009-04-05 13:30:56 +05301141 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001142
1143 if (mmc->high_capacity) {
1144 csize = (mmc->csd[1] & 0x3f) << 16
1145 | (mmc->csd[2] & 0xffff0000) >> 16;
1146 cmult = 8;
1147 } else {
1148 csize = (mmc->csd[1] & 0x3ff) << 2
1149 | (mmc->csd[2] & 0xc0000000) >> 30;
1150 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1151 }
1152
Stephen Warrenf866a462013-06-11 15:14:01 -06001153 mmc->capacity_user = (csize + 1) << (cmult + 2);
1154 mmc->capacity_user *= mmc->read_bl_len;
1155 mmc->capacity_boot = 0;
1156 mmc->capacity_rpmb = 0;
1157 for (i = 0; i < 4; i++)
1158 mmc->capacity_gp[i] = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001159
Simon Glass8bfa1952013-04-03 08:54:30 +00001160 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1161 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001162
Simon Glass8bfa1952013-04-03 08:54:30 +00001163 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1164 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001165
Markus Niebelab711882013-12-16 13:40:46 +01001166 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1167 cmd.cmdidx = MMC_CMD_SET_DSR;
1168 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1169 cmd.resp_type = MMC_RSP_NONE;
1170 if (mmc_send_cmd(mmc, &cmd, NULL))
1171 printf("MMC: SET_DSR failed\n");
1172 }
1173
Andy Fleming272cc702008-10-30 16:41:01 -05001174 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001175 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1176 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargavfe8f7062011-10-05 03:13:23 +00001177 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001178 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001179 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001180
Thomas Choud52ebf12010-12-24 13:12:21 +00001181 if (err)
1182 return err;
1183 }
Andy Fleming272cc702008-10-30 16:41:01 -05001184
Lei Wene6f99a52011-06-22 17:03:31 +00001185 /*
1186 * For SD, its erase group is always one sector
1187 */
1188 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001189 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301190 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1191 /* check ext_csd version and capacity */
1192 err = mmc_send_ext_csd(mmc, ext_csd);
Diego Santa Cruz9cf199e2014-12-23 10:50:28 +01001193 if (err)
1194 return err;
1195 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001196 /*
1197 * According to the JEDEC Standard, the value of
1198 * ext_csd's capacity is valid if the value is more
1199 * than 2GB
1200 */
Lei Wen0560db12011-10-03 20:35:10 +00001201 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1202 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1203 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1204 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glass8bfa1952013-04-03 08:54:30 +00001205 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewskib1f1e8212011-07-05 02:19:44 +00001206 if ((capacity >> 20) > 2 * 1024)
Stephen Warrenf866a462013-06-11 15:14:01 -06001207 mmc->capacity_user = capacity;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301208 }
Lei Wenbc897b12011-05-02 16:26:26 +00001209
Jaehoon Chung64f4a612013-01-29 19:31:16 +00001210 switch (ext_csd[EXT_CSD_REV]) {
1211 case 1:
1212 mmc->version = MMC_VERSION_4_1;
1213 break;
1214 case 2:
1215 mmc->version = MMC_VERSION_4_2;
1216 break;
1217 case 3:
1218 mmc->version = MMC_VERSION_4_3;
1219 break;
1220 case 5:
1221 mmc->version = MMC_VERSION_4_41;
1222 break;
1223 case 6:
1224 mmc->version = MMC_VERSION_4_5;
1225 break;
Markus Niebeledab7232014-11-18 15:13:53 +01001226 case 7:
1227 mmc->version = MMC_VERSION_5_0;
1228 break;
Stefan Wahren1a3619c2016-06-16 17:54:06 +00001229 case 8:
1230 mmc->version = MMC_VERSION_5_1;
1231 break;
Jaehoon Chung64f4a612013-01-29 19:31:16 +00001232 }
1233
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001234 /* 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
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001242 /* 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];
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001247 if (part_completed &&
1248 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001249 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;
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001257 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001258 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001259 if (mult)
1260 has_parts = true;
1261 if (!part_completed)
1262 continue;
1263 mmc->capacity_gp[i] = mult;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001264 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];
Diego Santa Cruzf8e89d62014-12-23 10:50:21 +01001267 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001268 }
1269
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001270 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 }
Diego Santa Cruza7f852b2014-12-23 10:50:22 +01001286
Lei Wene6f99a52011-06-22 17:03:31 +00001287 /*
Oliver Metz1937e5a2013-10-01 20:32:07 +02001288 * 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.
Lei Wene6f99a52011-06-22 17:03:31 +00001291 */
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001292 if (part_completed)
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001293 has_parts = true;
Oliver Metz1937e5a2013-10-01 20:32:07 +02001294 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001295 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1296 has_parts = true;
1297 if (has_parts) {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001298 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1299 EXT_CSD_ERASE_GROUP_DEF, 1);
1300
1301 if (err)
1302 return err;
Hannes Petermaier021a8052014-08-08 09:47:22 +02001303 else
1304 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001305 }
Oliver Metz1937e5a2013-10-01 20:32:07 +02001306
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001307 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001308 /* Read out group size from ext_csd */
Lei Wen0560db12011-10-03 20:35:10 +00001309 mmc->erase_grp_size =
Diego Santa Cruza4ff9f82014-12-23 10:50:24 +01001310 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebeld7b29122014-11-18 15:11:42 +01001311 /*
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 */
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001316 if (mmc->high_capacity && part_completed) {
Markus Niebeld7b29122014-11-18 15:11:42 +01001317 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 }
Simon Glass8bfa1952013-04-03 08:54:30 +00001324 } else {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001325 /* Calculate the group size from the csd value. */
Lei Wene6f99a52011-06-22 17:03:31 +00001326 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 }
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001332
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];
Diego Santa Cruz9e41a002014-12-23 10:50:33 +01001336
1337 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301338 }
1339
Simon Glassc40fdca2016-05-01 13:52:35 -06001340 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrenf866a462013-06-11 15:14:01 -06001341 if (err)
1342 return err;
1343
Andy Fleming272cc702008-10-30 16:41:01 -05001344 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 */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001353 mmc->card_caps &= mmc->cfg->host_caps;
Andy Fleming272cc702008-10-30 16:41:01 -05001354
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;
Andy Fleming272cc702008-10-30 16:41:01 -05001360
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;
Andy Fleming272cc702008-10-30 16:41:01 -05001368 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)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001376 mmc->tran_speed = 50000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001377 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001378 mmc->tran_speed = 25000000;
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -06001379 } else if (mmc->version >= MMC_VERSION_4) {
1380 /* Only version 4 of MMC supports wider bus widths */
Andy Fleming7798f6d2012-10-31 19:02:38 +00001381 int idx;
1382
1383 /* An array of possible bus widths in order of preference */
1384 static unsigned ext_csd_bits[] = {
Jaehoon Chungd22e3d42014-05-16 13:59:54 +09001385 EXT_CSD_DDR_BUS_WIDTH_8,
1386 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001387 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[] = {
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001394 [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,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001398 [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[] = {
Jaehoon Chungd22e3d42014-05-16 13:59:54 +09001404 8, 4, 8, 4, 1,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001405 };
1406
1407 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1408 unsigned int extw = ext_csd_bits[idx];
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001409 unsigned int caps = ext_to_hostcaps[extw];
Andy Fleming7798f6d2012-10-31 19:02:38 +00001410
1411 /*
Andrew Gabbasovbf477072014-12-25 10:22:24 -06001412 * 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
1423 /*
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001424 * Check to make sure the card and controller support
1425 * these capabilities
Andy Fleming7798f6d2012-10-31 19:02:38 +00001426 */
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001427 if ((mmc->card_caps & caps) != caps)
Andy Fleming7798f6d2012-10-31 19:02:38 +00001428 continue;
1429
Andy Fleming272cc702008-10-30 16:41:01 -05001430 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001431 EXT_CSD_BUS_WIDTH, extw);
Andy Fleming272cc702008-10-30 16:41:01 -05001432
1433 if (err)
Lei Wen41378942011-10-03 20:35:11 +00001434 continue;
Andy Fleming272cc702008-10-30 16:41:01 -05001435
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001436 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Fleming7798f6d2012-10-31 19:02:38 +00001437 mmc_set_bus_width(mmc, widths[idx]);
Andy Fleming272cc702008-10-30 16:41:01 -05001438
Lei Wen41378942011-10-03 20:35:11 +00001439 err = mmc_send_ext_csd(mmc, test_csd);
Andy Fleming272cc702008-10-30 16:41:01 -05001440
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001441 if (err)
1442 continue;
1443
1444 /* Only compare read only fields */
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)
Lei Wen41378942011-10-03 20:35:11 +00001455 break;
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001456 else
1457 err = SWITCH_ERR;
Andy Fleming272cc702008-10-30 16:41:01 -05001458 }
1459
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001460 if (err)
1461 return err;
1462
Andy Fleming272cc702008-10-30 16:41:01 -05001463 if (mmc->card_caps & MMC_MODE_HS) {
1464 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001465 mmc->tran_speed = 52000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001466 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001467 mmc->tran_speed = 26000000;
1468 }
Andy Fleming272cc702008-10-30 16:41:01 -05001469 }
1470
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001471 mmc_set_clock(mmc, mmc->tran_speed);
1472
Andrew Gabbasov5af8f452014-12-01 06:59:11 -06001473 /* 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
Andy Fleming272cc702008-10-30 16:41:01 -05001479 /* fill in device description */
Simon Glassc40fdca2016-05-01 13:52:35 -06001480 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);
Sjoerd Simonsfc011f62015-12-04 23:27:40 +01001487#if !defined(CONFIG_SPL_BUILD) || \
1488 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1489 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glassc40fdca2016-05-01 13:52:35 -06001490 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Huttbabce5f2012-10-20 17:15:59 +00001491 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1492 (mmc->cid[3] >> 16) & 0xffff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001493 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001494 (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);
Simon Glassc40fdca2016-05-01 13:52:35 -06001497 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001498 (mmc->cid[2] >> 16) & 0xf);
Paul Burton56196822013-09-04 16:12:25 +01001499#else
Simon Glassc40fdca2016-05-01 13:52:35 -06001500 bdesc->vendor[0] = 0;
1501 bdesc->product[0] = 0;
1502 bdesc->revision[0] = 0;
Paul Burton56196822013-09-04 16:12:25 +01001503#endif
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001504#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glassc40fdca2016-05-01 13:52:35 -06001505 part_init(bdesc);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001506#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001507
1508 return 0;
1509}
1510
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001511static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001512{
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 */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001518 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Fleming272cc702008-10-30 16:41:01 -05001519 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001520
1521 err = mmc_send_cmd(mmc, &cmd, NULL);
1522
1523 if (err)
1524 return err;
1525
Rabin Vincent998be3d2009-04-05 13:30:56 +05301526 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -05001527 return UNUSABLE_ERR;
1528 else
1529 mmc->version = SD_VERSION_2;
1530
1531 return 0;
1532}
1533
Simon Glassad27dd52016-05-01 13:52:40 -06001534#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 */
Simon Glassad27dd52016-05-01 13:52:40 -06001557 bdesc->removable = 1;
1558
1559 /* setup initial part type */
Simon Glasse6c28072016-05-14 14:03:10 -06001560 bdesc->part_type = cfg->part_type;
Simon Glassad27dd52016-05-01 13:52:40 -06001561 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
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001580struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
1581{
Simon Glassc40fdca2016-05-01 13:52:35 -06001582 struct blk_desc *bdesc;
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001583 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
Markus Niebelab711882013-12-16 13:40:46 +01001599 /* Setup dsr related values */
1600 mmc->dsr_imp = 0;
1601 mmc->dsr = 0xffffffff;
Andy Fleming272cc702008-10-30 16:41:01 -05001602 /* Setup the universal parts of the block interface just once */
Simon Glassc40fdca2016-05-01 13:52:35 -06001603 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;
Andy Fleming272cc702008-10-30 16:41:01 -05001610
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001611 /* setup initial part type */
Simon Glassc40fdca2016-05-01 13:52:35 -06001612 bdesc->part_type = mmc->cfg->part_type;
1613 mmc_list_add(mmc);
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001614
1615 return mmc;
1616}
1617
1618void mmc_destroy(struct mmc *mmc)
1619{
1620 /* only freeing memory for now */
1621 free(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001622}
Simon Glassad27dd52016-05-01 13:52:40 -06001623#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001624
Simon Glass33fb2112016-05-01 13:52:41 -06001625#ifndef CONFIG_BLK
Simon Glass3c457f42016-05-01 11:36:15 -06001626static int mmc_get_dev(int dev, struct blk_desc **descp)
Simon Glass663acab2016-05-01 11:36:07 -06001627{
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}
Simon Glass33fb2112016-05-01 13:52:41 -06001641#endif
Simon Glass663acab2016-05-01 11:36:07 -06001642
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001643/* board-specific MMC power initializations. */
1644__weak void board_mmc_power_init(void)
1645{
1646}
1647
Che-Liang Chioue9550442012-11-28 15:21:13 +00001648int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001649{
Macpaul Linafd59322011-11-14 23:35:39 +00001650 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001651
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001652 /* we pretend there's no card when init is NULL */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001653 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Reding48972d92012-01-02 01:15:37 +00001654 mmc->has_init = 0;
Paul Burton56196822013-09-04 16:12:25 +01001655#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Reding48972d92012-01-02 01:15:37 +00001656 printf("MMC: no card present\n");
Paul Burton56196822013-09-04 16:12:25 +01001657#endif
Thierry Reding48972d92012-01-02 01:15:37 +00001658 return NO_CARD_ERR;
1659 }
1660
Lei Wenbc897b12011-05-02 16:26:26 +00001661 if (mmc->has_init)
1662 return 0;
1663
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001664#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1665 mmc_adapter_card_type_ident();
1666#endif
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001667 board_mmc_power_init();
1668
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001669 /* made sure it's not NULL earlier */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001670 err = mmc->cfg->ops->init(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001671
1672 if (err)
1673 return err;
1674
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001675 mmc->ddr_mode = 0;
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001676 mmc_set_bus_width(mmc, 1);
1677 mmc_set_clock(mmc, 1);
1678
Andy Fleming272cc702008-10-30 16:41:01 -05001679 /* Reset the Card */
1680 err = mmc_go_idle(mmc);
1681
1682 if (err)
1683 return err;
1684
Lei Wenbc897b12011-05-02 16:26:26 +00001685 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glassc40fdca2016-05-01 13:52:35 -06001686 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wenbc897b12011-05-02 16:26:26 +00001687
Andy Fleming272cc702008-10-30 16:41:01 -05001688 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001689 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001690
Andy Fleming272cc702008-10-30 16:41:01 -05001691 /* 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
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001698 if (err) {
Paul Burton56196822013-09-04 16:12:25 +01001699#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001700 printf("Card did not respond to voltage select!\n");
Paul Burton56196822013-09-04 16:12:25 +01001701#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001702 return UNUSABLE_ERR;
1703 }
1704 }
1705
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001706 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001707 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
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001716 mmc->init_in_progress = 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001717 if (mmc->op_cond_pending)
1718 err = mmc_complete_op_cond(mmc);
1719
1720 if (!err)
1721 err = mmc_startup(mmc);
Lei Wenbc897b12011-05-02 16:26:26 +00001722 if (err)
1723 mmc->has_init = 0;
1724 else
1725 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001726 return err;
1727}
1728
1729int mmc_init(struct mmc *mmc)
1730{
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001731 int err = 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001732 unsigned start;
Simon Glass33fb2112016-05-01 13:52:41 -06001733#ifdef CONFIG_DM_MMC
1734 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chioue9550442012-11-28 15:21:13 +00001735
Simon Glass33fb2112016-05-01 13:52:41 -06001736 upriv->mmc = mmc;
1737#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00001738 if (mmc->has_init)
1739 return 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001740
1741 start = get_timer(0);
1742
Che-Liang Chioue9550442012-11-28 15:21:13 +00001743 if (!mmc->init_in_progress)
1744 err = mmc_start_init(mmc);
1745
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001746 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001747 err = mmc_complete_init(mmc);
1748 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
Lei Wenbc897b12011-05-02 16:26:26 +00001749 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001750}
1751
Markus Niebelab711882013-12-16 13:40:46 +01001752int mmc_set_dsr(struct mmc *mmc, u16 val)
1753{
1754 mmc->dsr = val;
1755 return 0;
1756}
1757
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02001758/* CPU-specific MMC initializations */
1759__weak int cpu_mmc_init(bd_t *bis)
Andy Fleming272cc702008-10-30 16:41:01 -05001760{
1761 return -1;
1762}
1763
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02001764/* board-specific MMC initializations. */
1765__weak int board_mmc_init(bd_t *bis)
1766{
1767 return -1;
1768}
Andy Fleming272cc702008-10-30 16:41:01 -05001769
Che-Liang Chioue9550442012-11-28 15:21:13 +00001770void mmc_set_preinit(struct mmc *mmc, int preinit)
1771{
1772 mmc->preinit = preinit;
1773}
1774
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001775#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{
Simon Glass4a1db6d2015-12-29 05:22:49 -07001783 int ret, i;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001784 struct uclass *uc;
Simon Glass4a1db6d2015-12-29 05:22:49 -07001785 struct udevice *dev;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001786
1787 ret = uclass_get(UCLASS_MMC, &uc);
1788 if (ret)
1789 return ret;
1790
Simon Glass4a1db6d2015-12-29 05:22:49 -07001791 /*
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);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001803 if (ret)
Simon Glass4a1db6d2015-12-29 05:22:49 -07001804 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001805 }
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
Che-Liang Chioue9550442012-11-28 15:21:13 +00001818
Andy Fleming272cc702008-10-30 16:41:01 -05001819int mmc_initialize(bd_t *bis)
1820{
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001821 static int initialized = 0;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001822 int ret;
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001823 if (initialized) /* Avoid initializing mmc multiple times */
1824 return 0;
1825 initialized = 1;
1826
Simon Glassc40fdca2016-05-01 13:52:35 -06001827#ifndef CONFIG_BLK
1828 mmc_list_init();
1829#endif
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001830 ret = mmc_probe(bis);
1831 if (ret)
1832 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05001833
Ying Zhangbb0dc102013-08-16 15:16:11 +08001834#ifndef CONFIG_SPL_BUILD
Andy Fleming272cc702008-10-30 16:41:01 -05001835 print_mmc_devices(',');
Ying Zhangbb0dc102013-08-16 15:16:11 +08001836#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001837
Simon Glassc40fdca2016-05-01 13:52:35 -06001838 mmc_do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05001839 return 0;
1840}
Amar3690d6d2013-04-27 11:42:58 +05301841
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
1910/*
Tom Rini5a99b9d2014-02-05 10:24:22 -05001911 * 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
1931/*
Tom Rini792970b2014-02-05 10:24:21 -05001932 * 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}
Tom Rini33ace362014-02-07 14:15:20 -05001951
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}
Amar3690d6d2013-04-27 11:42:58 +05301963#endif
Simon Glass663acab2016-05-01 11:36:07 -06001964
Simon Glass33fb2112016-05-01 13:52:41 -06001965#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
Simon Glass663acab2016-05-01 11:36:07 -06001978U_BOOT_LEGACY_BLK(mmc) = {
1979 .if_typename = "mmc",
1980 .if_type = IF_TYPE_MMC,
1981 .max_devs = -1,
Simon Glass3c457f42016-05-01 11:36:15 -06001982 .get_dev = mmc_get_dev,
Simon Glasse17d1142016-05-01 13:52:26 -06001983 .select_hwpart = mmc_select_hwpartp,
Simon Glass663acab2016-05-01 11:36:07 -06001984};
Simon Glass33fb2112016-05-01 13:52:41 -06001985#endif