blob: 758655850bb10ae38266e14b57c52bc08a89dda4 [file] [log] [blame]
Andy Flemingad347bb2008-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 Denkd79de1d2013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Flemingad347bb2008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -060013#include <dm.h>
14#include <dm/device-internal.h>
Stephen Warrenbf0c7852014-05-23 12:47:06 -060015#include <errno.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050016#include <mmc.h>
17#include <part.h>
18#include <malloc.h>
Simon Glass2dd337a2015-09-02 17:24:58 -060019#include <memalign.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050020#include <linux/list.h>
Rabin Vincent69d4e2c2009-04-05 13:30:54 +053021#include <div64.h>
Paul Burton8d30cc92013-09-09 15:30:26 +010022#include "mmc_private.h"
Andy Flemingad347bb2008-10-30 16:41:01 -050023
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +020024__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanov020f2612012-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 Korsgaardf7b15102013-03-21 04:00:03 +000035 if (wp < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +020036 if (mmc->cfg->ops->getwp)
37 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +000038 else
39 wp = 0;
40 }
Nikita Kiryanov020f2612012-12-03 02:19:46 +000041
42 return wp;
43}
44
Jeroen Hofstee47726302014-07-10 22:46:28 +020045__weak int board_mmc_getcd(struct mmc *mmc)
46{
Stefano Babic6e00edf2010-02-05 15:04:43 +010047 return -1;
48}
49
Paul Burton8d30cc92013-09-09 15:30:26 +010050int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
Andy Flemingad347bb2008-10-30 16:41:01 -050051{
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000052 int ret;
Marek Vasutdccb6082012-03-15 18:41:35 +000053
Marek Vasutdccb6082012-03-15 18:41:35 +000054#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati894b1e22011-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 Antoniou2c850462014-03-11 19:34:20 +020060 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Bin Meng8d1ad1e2016-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 Recalcati894b1e22011-03-11 02:01:14 +000085 printf("\n");
Bin Meng8d1ad1e2016-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 Meng4a4ef872016-03-17 21:53:13 -0700104 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000105 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000106#else
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200107 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000108#endif
Marek Vasutdccb6082012-03-15 18:41:35 +0000109 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500110}
111
Paul Burton8d30cc92013-09-09 15:30:26 +0100112int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000113{
114 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000115 int err, retries = 5;
Raffaele Recalcati01a0dc62011-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 Vasutc4427392011-08-10 09:24:48 +0200122 if (!mmc_host_is_spi(mmc))
123 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000124
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500125 while (1) {
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000126 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-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 Burton6a7c5ba2013-09-04 16:12:25 +0100133#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzke31789322012-02-05 22:29:12 +0000134 printf("Status Error: 0x%08X\n",
135 cmd.response[0]);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100136#endif
Jan Kloetzke31789322012-02-05 22:29:12 +0000137 return COMM_ERR;
138 }
139 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000140 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000141
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500142 if (timeout-- <= 0)
143 break;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000144
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500145 udelay(1000);
146 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000147
Raffaele Recalcati894b1e22011-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 Heo1be00d92012-06-03 21:32:13 +0000152 if (timeout <= 0) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100153#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000154 printf("Timeout waiting card ready\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100155#endif
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000156 return TIMEOUT;
157 }
158
159 return 0;
160}
161
Paul Burton8d30cc92013-09-09 15:30:26 +0100162int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Flemingad347bb2008-10-30 16:41:01 -0500163{
164 struct mmc_cmd cmd;
165
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -0600166 if (mmc->ddr_mode)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900167 return 0;
168
Andy Flemingad347bb2008-10-30 16:41:01 -0500169 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
170 cmd.resp_type = MMC_RSP_R1;
171 cmd.cmdarg = len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500172
173 return mmc_send_cmd(mmc, &cmd, NULL);
174}
175
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200176static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillips87ea3892012-10-29 13:34:43 +0000177 lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500178{
179 struct mmc_cmd cmd;
180 struct mmc_data data;
181
Alagu Sankarc25d1b92010-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 Flemingad347bb2008-10-30 16:41:01 -0500186
187 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700188 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500189 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700190 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500191
192 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500193
194 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700195 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500196 data.blocksize = mmc->read_bl_len;
197 data.flags = MMC_DATA_READ;
198
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700199 if (mmc_send_cmd(mmc, &cmd, &data))
200 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500201
Alagu Sankarc25d1b92010-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 Sankarc25d1b92010-10-25 07:23:56 -0700206 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100207#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700208 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100209#endif
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700210 return 0;
211 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500212 }
213
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700214 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500215}
216
Simon Glass59bc6f22016-05-01 13:52:41 -0600217#ifdef CONFIG_BLK
218static ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
219 void *dst)
220#else
Simon Glasse3394752016-02-29 15:25:34 -0700221static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
Stephen Warrene73f2962015-12-07 11:38:48 -0700222 lbaint_t blkcnt, void *dst)
Simon Glass59bc6f22016-05-01 13:52:41 -0600223#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500224{
Simon Glass59bc6f22016-05-01 13:52:41 -0600225#ifdef CONFIG_BLK
226 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
227#endif
Simon Glass2f26fff2016-02-29 15:25:51 -0700228 int dev_num = block_dev->devnum;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700229 int err;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700230 lbaint_t cur, blocks_todo = blkcnt;
231
232 if (blkcnt == 0)
233 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500234
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700235 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500236 if (!mmc)
237 return 0;
238
Simon Glass11f2bb62016-05-01 13:52:29 -0600239 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700240 if (err < 0)
241 return 0;
242
Simon Glasse5db1152016-05-01 13:52:35 -0600243 if ((start + blkcnt) > block_dev->lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100244#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200245 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glasse5db1152016-05-01 13:52:35 -0600246 start + blkcnt, block_dev->lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100247#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800248 return 0;
249 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500250
Simon Glassa4343c42015-06-23 15:38:50 -0600251 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
252 debug("%s: Failed to set blocklen\n", __func__);
Andy Flemingad347bb2008-10-30 16:41:01 -0500253 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600254 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500255
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700256 do {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200257 cur = (blocks_todo > mmc->cfg->b_max) ?
258 mmc->cfg->b_max : blocks_todo;
Simon Glassa4343c42015-06-23 15:38:50 -0600259 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
260 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700261 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600262 }
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700263 blocks_todo -= cur;
264 start += cur;
265 dst += cur * mmc->read_bl_len;
266 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500267
268 return blkcnt;
269}
270
Kim Phillips87ea3892012-10-29 13:34:43 +0000271static int mmc_go_idle(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500272{
273 struct mmc_cmd cmd;
274 int err;
275
276 udelay(1000);
277
278 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
279 cmd.cmdarg = 0;
280 cmd.resp_type = MMC_RSP_NONE;
Andy Flemingad347bb2008-10-30 16:41:01 -0500281
282 err = mmc_send_cmd(mmc, &cmd, NULL);
283
284 if (err)
285 return err;
286
287 udelay(2000);
288
289 return 0;
290}
291
Kim Phillips87ea3892012-10-29 13:34:43 +0000292static int sd_send_op_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500293{
294 int timeout = 1000;
295 int err;
296 struct mmc_cmd cmd;
297
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500298 while (1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500299 cmd.cmdidx = MMC_CMD_APP_CMD;
300 cmd.resp_type = MMC_RSP_R1;
301 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500302
303 err = mmc_send_cmd(mmc, &cmd, NULL);
304
305 if (err)
306 return err;
307
308 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
309 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100310
311 /*
312 * Most cards do not answer if some reserved bits
313 * in the ocr are set. However, Some controller
314 * can set bit 7 (reserved for low voltages), but
315 * how to manage low voltages SD card is not yet
316 * specified.
317 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000318 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200319 (mmc->cfg->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500320
321 if (mmc->version == SD_VERSION_2)
322 cmd.cmdarg |= OCR_HCS;
323
324 err = mmc_send_cmd(mmc, &cmd, NULL);
325
326 if (err)
327 return err;
328
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500329 if (cmd.response[0] & OCR_BUSY)
330 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500331
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500332 if (timeout-- <= 0)
333 return UNUSABLE_ERR;
334
335 udelay(1000);
336 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500337
338 if (mmc->version != SD_VERSION_2)
339 mmc->version = SD_VERSION_1_0;
340
Thomas Chou1254c3d2010-12-24 13:12:21 +0000341 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
342 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
343 cmd.resp_type = MMC_RSP_R3;
344 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000345
346 err = mmc_send_cmd(mmc, &cmd, NULL);
347
348 if (err)
349 return err;
350 }
351
Rabin Vincentb6eed942009-04-05 13:30:56 +0530352 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500353
354 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
355 mmc->rca = 0;
356
357 return 0;
358}
359
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500360static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Flemingad347bb2008-10-30 16:41:01 -0500361{
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500362 struct mmc_cmd cmd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500363 int err;
364
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500365 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
366 cmd.resp_type = MMC_RSP_R3;
367 cmd.cmdarg = 0;
Rob Herring5fd3edd2015-03-23 17:56:59 -0500368 if (use_arg && !mmc_host_is_spi(mmc))
369 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200370 (mmc->cfg->voltages &
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500371 (mmc->ocr & OCR_VOLTAGE_MASK)) |
372 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000373
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500374 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000375 if (err)
376 return err;
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500377 mmc->ocr = cmd.response[0];
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000378 return 0;
379}
380
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200381static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000382{
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000383 int err, i;
384
Andy Flemingad347bb2008-10-30 16:41:01 -0500385 /* Some cards seem to need this */
386 mmc_go_idle(mmc);
387
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000388 /* Asking to the card its capabilities */
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000389 for (i = 0; i < 2; i++) {
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500390 err = mmc_send_op_cond_iter(mmc, i != 0);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000391 if (err)
392 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200393
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000394 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500395 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500396 break;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000397 }
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500398 mmc->op_cond_pending = 1;
399 return 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000400}
Wolfgang Denk80f70212011-05-19 22:21:41 +0200401
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200402static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000403{
404 struct mmc_cmd cmd;
405 int timeout = 1000;
406 uint start;
407 int err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200408
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000409 mmc->op_cond_pending = 0;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500410 if (!(mmc->ocr & OCR_BUSY)) {
411 start = get_timer(0);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500412 while (1) {
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500413 err = mmc_send_op_cond_iter(mmc, 1);
414 if (err)
415 return err;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500416 if (mmc->ocr & OCR_BUSY)
417 break;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500418 if (get_timer(start) > timeout)
419 return UNUSABLE_ERR;
420 udelay(100);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500421 }
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500422 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500423
Thomas Chou1254c3d2010-12-24 13:12:21 +0000424 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
425 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
426 cmd.resp_type = MMC_RSP_R3;
427 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000428
429 err = mmc_send_cmd(mmc, &cmd, NULL);
430
431 if (err)
432 return err;
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500433
434 mmc->ocr = cmd.response[0];
Thomas Chou1254c3d2010-12-24 13:12:21 +0000435 }
436
Andy Flemingad347bb2008-10-30 16:41:01 -0500437 mmc->version = MMC_VERSION_UNKNOWN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500438
439 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrenf6545f12014-01-30 16:11:12 -0700440 mmc->rca = 1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500441
442 return 0;
443}
444
445
Kim Phillips87ea3892012-10-29 13:34:43 +0000446static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Flemingad347bb2008-10-30 16:41:01 -0500447{
448 struct mmc_cmd cmd;
449 struct mmc_data data;
450 int err;
451
452 /* Get the Card Status Register */
453 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
454 cmd.resp_type = MMC_RSP_R1;
455 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500456
Yoshihiro Shimodaf6bec732012-06-07 19:09:11 +0000457 data.dest = (char *)ext_csd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500458 data.blocks = 1;
Simon Glassa09c2b72013-04-03 08:54:30 +0000459 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500460 data.flags = MMC_DATA_READ;
461
462 err = mmc_send_cmd(mmc, &cmd, &data);
463
464 return err;
465}
466
467
Kim Phillips87ea3892012-10-29 13:34:43 +0000468static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Flemingad347bb2008-10-30 16:41:01 -0500469{
470 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000471 int timeout = 1000;
472 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500473
474 cmd.cmdidx = MMC_CMD_SWITCH;
475 cmd.resp_type = MMC_RSP_R1b;
476 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000477 (index << 16) |
478 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500479
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000480 ret = mmc_send_cmd(mmc, &cmd, NULL);
481
482 /* Waiting for the ready status */
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000483 if (!ret)
484 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000485
486 return ret;
487
Andy Flemingad347bb2008-10-30 16:41:01 -0500488}
489
Kim Phillips87ea3892012-10-29 13:34:43 +0000490static int mmc_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500491{
Simon Glassa09c2b72013-04-03 08:54:30 +0000492 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Flemingad347bb2008-10-30 16:41:01 -0500493 char cardtype;
494 int err;
495
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600496 mmc->card_caps = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500497
Thomas Chou1254c3d2010-12-24 13:12:21 +0000498 if (mmc_host_is_spi(mmc))
499 return 0;
500
Andy Flemingad347bb2008-10-30 16:41:01 -0500501 /* Only version 4 supports high-speed */
502 if (mmc->version < MMC_VERSION_4)
503 return 0;
504
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600505 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
506
Andy Flemingad347bb2008-10-30 16:41:01 -0500507 err = mmc_send_ext_csd(mmc, ext_csd);
508
509 if (err)
510 return err;
511
Lei Wen217467f2011-10-03 20:35:10 +0000512 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500513
514 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
515
516 if (err)
Heiko Schocher9016ab92016-06-07 08:31:21 +0200517 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -0500518
519 /* Now check to see that it worked */
520 err = mmc_send_ext_csd(mmc, ext_csd);
521
522 if (err)
523 return err;
524
525 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000526 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500527 return 0;
528
529 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900530 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov95a37132014-12-01 06:59:10 -0600531 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900532 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Flemingad347bb2008-10-30 16:41:01 -0500533 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900534 } else {
Andy Flemingad347bb2008-10-30 16:41:01 -0500535 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900536 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500537
538 return 0;
539}
540
Stephen Warrene315ae82013-06-11 15:14:01 -0600541static int mmc_set_capacity(struct mmc *mmc, int part_num)
542{
543 switch (part_num) {
544 case 0:
545 mmc->capacity = mmc->capacity_user;
546 break;
547 case 1:
548 case 2:
549 mmc->capacity = mmc->capacity_boot;
550 break;
551 case 3:
552 mmc->capacity = mmc->capacity_rpmb;
553 break;
554 case 4:
555 case 5:
556 case 6:
557 case 7:
558 mmc->capacity = mmc->capacity_gp[part_num - 4];
559 break;
560 default:
561 return -1;
562 }
563
Simon Glasse5db1152016-05-01 13:52:35 -0600564 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrene315ae82013-06-11 15:14:01 -0600565
566 return 0;
567}
568
Simon Glass984db5d2016-05-01 13:52:37 -0600569static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wen31b99802011-05-02 16:26:26 +0000570{
Stephen Warrene315ae82013-06-11 15:14:01 -0600571 int ret;
Lei Wen31b99802011-05-02 16:26:26 +0000572
Stephen Warrene315ae82013-06-11 15:14:01 -0600573 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
574 (mmc->part_config & ~PART_ACCESS_MASK)
575 | (part_num & PART_ACCESS_MASK));
Peter Bigot45fde892014-09-02 18:31:23 -0500576
577 /*
578 * Set the capacity if the switch succeeded or was intended
579 * to return to representing the raw device.
580 */
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700581 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot45fde892014-09-02 18:31:23 -0500582 ret = mmc_set_capacity(mmc, part_num);
Simon Glass984db5d2016-05-01 13:52:37 -0600583 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700584 }
Stephen Warrene315ae82013-06-11 15:14:01 -0600585
Peter Bigot45fde892014-09-02 18:31:23 -0500586 return ret;
Lei Wen31b99802011-05-02 16:26:26 +0000587}
588
Simon Glass59bc6f22016-05-01 13:52:41 -0600589#ifdef CONFIG_BLK
590static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
Simon Glass518a8962016-05-01 13:52:26 -0600591{
Simon Glass59bc6f22016-05-01 13:52:41 -0600592 struct udevice *mmc_dev = dev_get_parent(bdev);
593 struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
594 struct blk_desc *desc = dev_get_uclass_platdata(bdev);
Simon Glass518a8962016-05-01 13:52:26 -0600595 int ret;
596
Simon Glass59bc6f22016-05-01 13:52:41 -0600597 if (desc->hwpart == hwpart)
Simon Glass518a8962016-05-01 13:52:26 -0600598 return 0;
599
600 if (mmc->part_config == MMCPART_NOAVAILABLE)
601 return -EMEDIUMTYPE;
602
Simon Glass984db5d2016-05-01 13:52:37 -0600603 ret = mmc_switch_part(mmc, hwpart);
Simon Glass518a8962016-05-01 13:52:26 -0600604 if (ret)
605 return ret;
606
607 return 0;
608}
Simon Glass59bc6f22016-05-01 13:52:41 -0600609#else
610static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
Simon Glasse774fd42016-05-01 13:52:25 -0600611{
Simon Glass59bc6f22016-05-01 13:52:41 -0600612 struct mmc *mmc = find_mmc_device(desc->devnum);
Simon Glasse774fd42016-05-01 13:52:25 -0600613 int ret;
614
615 if (!mmc)
616 return -ENODEV;
617
618 if (mmc->block_dev.hwpart == hwpart)
619 return 0;
620
621 if (mmc->part_config == MMCPART_NOAVAILABLE)
622 return -EMEDIUMTYPE;
623
Simon Glass984db5d2016-05-01 13:52:37 -0600624 ret = mmc_switch_part(mmc, hwpart);
Simon Glasse774fd42016-05-01 13:52:25 -0600625 if (ret)
626 return ret;
627
628 return 0;
629}
Simon Glass59bc6f22016-05-01 13:52:41 -0600630#endif
Simon Glasse774fd42016-05-01 13:52:25 -0600631
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100632int mmc_hwpart_config(struct mmc *mmc,
633 const struct mmc_hwpart_conf *conf,
634 enum mmc_hwpart_conf_mode mode)
635{
636 u8 part_attrs = 0;
637 u32 enh_size_mult;
638 u32 enh_start_addr;
639 u32 gp_size_mult[4];
640 u32 max_enh_size_mult;
641 u32 tot_enh_size_mult = 0;
Diego Santa Cruz80200272014-12-23 10:50:31 +0100642 u8 wr_rel_set;
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100643 int i, pidx, err;
644 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
645
646 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
647 return -EINVAL;
648
649 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
650 printf("eMMC >= 4.4 required for enhanced user data area\n");
651 return -EMEDIUMTYPE;
652 }
653
654 if (!(mmc->part_support & PART_SUPPORT)) {
655 printf("Card does not support partitioning\n");
656 return -EMEDIUMTYPE;
657 }
658
659 if (!mmc->hc_wp_grp_size) {
660 printf("Card does not define HC WP group size\n");
661 return -EMEDIUMTYPE;
662 }
663
664 /* check partition alignment and total enhanced size */
665 if (conf->user.enh_size) {
666 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
667 conf->user.enh_start % mmc->hc_wp_grp_size) {
668 printf("User data enhanced area not HC WP group "
669 "size aligned\n");
670 return -EINVAL;
671 }
672 part_attrs |= EXT_CSD_ENH_USR;
673 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
674 if (mmc->high_capacity) {
675 enh_start_addr = conf->user.enh_start;
676 } else {
677 enh_start_addr = (conf->user.enh_start << 9);
678 }
679 } else {
680 enh_size_mult = 0;
681 enh_start_addr = 0;
682 }
683 tot_enh_size_mult += enh_size_mult;
684
685 for (pidx = 0; pidx < 4; pidx++) {
686 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
687 printf("GP%i partition not HC WP group size "
688 "aligned\n", pidx+1);
689 return -EINVAL;
690 }
691 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
692 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
693 part_attrs |= EXT_CSD_ENH_GP(pidx);
694 tot_enh_size_mult += gp_size_mult[pidx];
695 }
696 }
697
698 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
699 printf("Card does not support enhanced attribute\n");
700 return -EMEDIUMTYPE;
701 }
702
703 err = mmc_send_ext_csd(mmc, ext_csd);
704 if (err)
705 return err;
706
707 max_enh_size_mult =
708 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
709 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
710 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
711 if (tot_enh_size_mult > max_enh_size_mult) {
712 printf("Total enhanced size exceeds maximum (%u > %u)\n",
713 tot_enh_size_mult, max_enh_size_mult);
714 return -EMEDIUMTYPE;
715 }
716
Diego Santa Cruz80200272014-12-23 10:50:31 +0100717 /* The default value of EXT_CSD_WR_REL_SET is device
718 * dependent, the values can only be changed if the
719 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
720 * changed only once and before partitioning is completed. */
721 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
722 if (conf->user.wr_rel_change) {
723 if (conf->user.wr_rel_set)
724 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
725 else
726 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
727 }
728 for (pidx = 0; pidx < 4; pidx++) {
729 if (conf->gp_part[pidx].wr_rel_change) {
730 if (conf->gp_part[pidx].wr_rel_set)
731 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
732 else
733 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
734 }
735 }
736
737 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
738 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
739 puts("Card does not support host controlled partition write "
740 "reliability settings\n");
741 return -EMEDIUMTYPE;
742 }
743
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100744 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
745 EXT_CSD_PARTITION_SETTING_COMPLETED) {
746 printf("Card already partitioned\n");
747 return -EPERM;
748 }
749
750 if (mode == MMC_HWPART_CONF_CHECK)
751 return 0;
752
753 /* Partitioning requires high-capacity size definitions */
754 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
755 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
756 EXT_CSD_ERASE_GROUP_DEF, 1);
757
758 if (err)
759 return err;
760
761 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
762
763 /* update erase group size to be high-capacity */
764 mmc->erase_grp_size =
765 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
766
767 }
768
769 /* all OK, write the configuration */
770 for (i = 0; i < 4; i++) {
771 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
772 EXT_CSD_ENH_START_ADDR+i,
773 (enh_start_addr >> (i*8)) & 0xFF);
774 if (err)
775 return err;
776 }
777 for (i = 0; i < 3; i++) {
778 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
779 EXT_CSD_ENH_SIZE_MULT+i,
780 (enh_size_mult >> (i*8)) & 0xFF);
781 if (err)
782 return err;
783 }
784 for (pidx = 0; pidx < 4; pidx++) {
785 for (i = 0; i < 3; i++) {
786 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
787 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
788 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
789 if (err)
790 return err;
791 }
792 }
793 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
794 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
795 if (err)
796 return err;
797
798 if (mode == MMC_HWPART_CONF_SET)
799 return 0;
800
Diego Santa Cruz80200272014-12-23 10:50:31 +0100801 /* The WR_REL_SET is a write-once register but shall be
802 * written before setting PART_SETTING_COMPLETED. As it is
803 * write-once we can only write it when completing the
804 * partitioning. */
805 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
806 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
807 EXT_CSD_WR_REL_SET, wr_rel_set);
808 if (err)
809 return err;
810 }
811
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100812 /* Setting PART_SETTING_COMPLETED confirms the partition
813 * configuration but it only becomes effective after power
814 * cycle, so we do not adjust the partition related settings
815 * in the mmc struct. */
816
817 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
818 EXT_CSD_PARTITION_SETTING,
819 EXT_CSD_PARTITION_SETTING_COMPLETED);
820 if (err)
821 return err;
822
823 return 0;
824}
825
Thierry Redingb9c8b772012-01-02 01:15:37 +0000826int mmc_getcd(struct mmc *mmc)
827{
828 int cd;
829
830 cd = board_mmc_getcd(mmc);
831
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000832 if (cd < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200833 if (mmc->cfg->ops->getcd)
834 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000835 else
836 cd = 1;
837 }
Thierry Redingb9c8b772012-01-02 01:15:37 +0000838
839 return cd;
840}
841
Kim Phillips87ea3892012-10-29 13:34:43 +0000842static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Flemingad347bb2008-10-30 16:41:01 -0500843{
844 struct mmc_cmd cmd;
845 struct mmc_data data;
846
847 /* Switch the frequency */
848 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
849 cmd.resp_type = MMC_RSP_R1;
850 cmd.cmdarg = (mode << 31) | 0xffffff;
851 cmd.cmdarg &= ~(0xf << (group * 4));
852 cmd.cmdarg |= value << (group * 4);
Andy Flemingad347bb2008-10-30 16:41:01 -0500853
854 data.dest = (char *)resp;
855 data.blocksize = 64;
856 data.blocks = 1;
857 data.flags = MMC_DATA_READ;
858
859 return mmc_send_cmd(mmc, &cmd, &data);
860}
861
862
Kim Phillips87ea3892012-10-29 13:34:43 +0000863static int sd_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500864{
865 int err;
866 struct mmc_cmd cmd;
Anton staaf9b00f0d2011-10-03 13:54:59 +0000867 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
868 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500869 struct mmc_data data;
870 int timeout;
871
872 mmc->card_caps = 0;
873
Thomas Chou1254c3d2010-12-24 13:12:21 +0000874 if (mmc_host_is_spi(mmc))
875 return 0;
876
Andy Flemingad347bb2008-10-30 16:41:01 -0500877 /* Read the SCR to find out if this card supports higher speeds */
878 cmd.cmdidx = MMC_CMD_APP_CMD;
879 cmd.resp_type = MMC_RSP_R1;
880 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -0500881
882 err = mmc_send_cmd(mmc, &cmd, NULL);
883
884 if (err)
885 return err;
886
887 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
888 cmd.resp_type = MMC_RSP_R1;
889 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500890
891 timeout = 3;
892
893retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000894 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500895 data.blocksize = 8;
896 data.blocks = 1;
897 data.flags = MMC_DATA_READ;
898
899 err = mmc_send_cmd(mmc, &cmd, &data);
900
901 if (err) {
902 if (timeout--)
903 goto retry_scr;
904
905 return err;
906 }
907
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300908 mmc->scr[0] = __be32_to_cpu(scr[0]);
909 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500910
911 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng4a4ef872016-03-17 21:53:13 -0700912 case 0:
913 mmc->version = SD_VERSION_1_0;
914 break;
915 case 1:
916 mmc->version = SD_VERSION_1_10;
917 break;
918 case 2:
919 mmc->version = SD_VERSION_2;
920 if ((mmc->scr[0] >> 15) & 0x1)
921 mmc->version = SD_VERSION_3;
922 break;
923 default:
924 mmc->version = SD_VERSION_1_0;
925 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500926 }
927
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530928 if (mmc->scr[0] & SD_DATA_4BIT)
929 mmc->card_caps |= MMC_MODE_4BIT;
930
Andy Flemingad347bb2008-10-30 16:41:01 -0500931 /* Version 1.0 doesn't support switching */
932 if (mmc->version == SD_VERSION_1_0)
933 return 0;
934
935 timeout = 4;
936 while (timeout--) {
937 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000938 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500939
940 if (err)
941 return err;
942
943 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300944 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500945 break;
946 }
947
Andy Flemingad347bb2008-10-30 16:41:01 -0500948 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300949 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -0500950 return 0;
951
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000952 /*
953 * If the host doesn't support SD_HIGHSPEED, do not switch card to
954 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
955 * This can avoid furthur problem when the card runs in different
956 * mode between the host.
957 */
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200958 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
959 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000960 return 0;
961
Anton staaf9b00f0d2011-10-03 13:54:59 +0000962 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500963
964 if (err)
965 return err;
966
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300967 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -0500968 mmc->card_caps |= MMC_MODE_HS;
969
970 return 0;
971}
972
973/* frequency bases */
974/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000975static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500976 10000,
977 100000,
978 1000000,
979 10000000,
980};
981
982/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
983 * to platforms without floating point.
984 */
Simon Glass03317cc2016-05-14 14:02:57 -0600985static const u8 multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500986 0, /* reserved */
987 10,
988 12,
989 13,
990 15,
991 20,
992 25,
993 30,
994 35,
995 40,
996 45,
997 50,
998 55,
999 60,
1000 70,
1001 80,
1002};
1003
Kim Phillips87ea3892012-10-29 13:34:43 +00001004static void mmc_set_ios(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001005{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001006 if (mmc->cfg->ops->set_ios)
1007 mmc->cfg->ops->set_ios(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001008}
1009
1010void mmc_set_clock(struct mmc *mmc, uint clock)
1011{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001012 if (clock > mmc->cfg->f_max)
1013 clock = mmc->cfg->f_max;
Andy Flemingad347bb2008-10-30 16:41:01 -05001014
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001015 if (clock < mmc->cfg->f_min)
1016 clock = mmc->cfg->f_min;
Andy Flemingad347bb2008-10-30 16:41:01 -05001017
1018 mmc->clock = clock;
1019
1020 mmc_set_ios(mmc);
1021}
1022
Kim Phillips87ea3892012-10-29 13:34:43 +00001023static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Flemingad347bb2008-10-30 16:41:01 -05001024{
1025 mmc->bus_width = width;
1026
1027 mmc_set_ios(mmc);
1028}
1029
Kim Phillips87ea3892012-10-29 13:34:43 +00001030static int mmc_startup(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001031{
Stephen Warrene315ae82013-06-11 15:14:01 -06001032 int err, i;
Andy Flemingad347bb2008-10-30 16:41:01 -05001033 uint mult, freq;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001034 u64 cmult, csize, capacity;
Andy Flemingad347bb2008-10-30 16:41:01 -05001035 struct mmc_cmd cmd;
Simon Glassa09c2b72013-04-03 08:54:30 +00001036 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1037 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001038 int timeout = 1000;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001039 bool has_parts = false;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001040 bool part_completed;
Simon Glasse5db1152016-05-01 13:52:35 -06001041 struct blk_desc *bdesc;
Andy Flemingad347bb2008-10-30 16:41:01 -05001042
Thomas Chou1254c3d2010-12-24 13:12:21 +00001043#ifdef CONFIG_MMC_SPI_CRC_ON
1044 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1045 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1046 cmd.resp_type = MMC_RSP_R1;
1047 cmd.cmdarg = 1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001048 err = mmc_send_cmd(mmc, &cmd, NULL);
1049
1050 if (err)
1051 return err;
1052 }
1053#endif
1054
Andy Flemingad347bb2008-10-30 16:41:01 -05001055 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001056 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1057 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -05001058 cmd.resp_type = MMC_RSP_R2;
1059 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001060
1061 err = mmc_send_cmd(mmc, &cmd, NULL);
1062
1063 if (err)
1064 return err;
1065
1066 memcpy(mmc->cid, cmd.response, 16);
1067
1068 /*
1069 * For MMC cards, set the Relative Address.
1070 * For SD cards, get the Relatvie Address.
1071 * This also puts the cards into Standby State
1072 */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001073 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1074 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1075 cmd.cmdarg = mmc->rca << 16;
1076 cmd.resp_type = MMC_RSP_R6;
Andy Flemingad347bb2008-10-30 16:41:01 -05001077
Thomas Chou1254c3d2010-12-24 13:12:21 +00001078 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001079
Thomas Chou1254c3d2010-12-24 13:12:21 +00001080 if (err)
1081 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001082
Thomas Chou1254c3d2010-12-24 13:12:21 +00001083 if (IS_SD(mmc))
1084 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1085 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001086
1087 /* Get the Card-Specific Data */
1088 cmd.cmdidx = MMC_CMD_SEND_CSD;
1089 cmd.resp_type = MMC_RSP_R2;
1090 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001091
1092 err = mmc_send_cmd(mmc, &cmd, NULL);
1093
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001094 /* Waiting for the ready status */
1095 mmc_send_status(mmc, timeout);
1096
Andy Flemingad347bb2008-10-30 16:41:01 -05001097 if (err)
1098 return err;
1099
Rabin Vincentb6eed942009-04-05 13:30:56 +05301100 mmc->csd[0] = cmd.response[0];
1101 mmc->csd[1] = cmd.response[1];
1102 mmc->csd[2] = cmd.response[2];
1103 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001104
1105 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301106 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001107
1108 switch (version) {
Bin Meng4a4ef872016-03-17 21:53:13 -07001109 case 0:
1110 mmc->version = MMC_VERSION_1_2;
1111 break;
1112 case 1:
1113 mmc->version = MMC_VERSION_1_4;
1114 break;
1115 case 2:
1116 mmc->version = MMC_VERSION_2_2;
1117 break;
1118 case 3:
1119 mmc->version = MMC_VERSION_3;
1120 break;
1121 case 4:
1122 mmc->version = MMC_VERSION_4;
1123 break;
1124 default:
1125 mmc->version = MMC_VERSION_1_2;
1126 break;
Andy Flemingad347bb2008-10-30 16:41:01 -05001127 }
1128 }
1129
1130 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301131 freq = fbase[(cmd.response[0] & 0x7)];
1132 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001133
1134 mmc->tran_speed = freq * mult;
1135
Markus Niebel03951412013-12-16 13:40:46 +01001136 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincentb6eed942009-04-05 13:30:56 +05301137 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001138
1139 if (IS_SD(mmc))
1140 mmc->write_bl_len = mmc->read_bl_len;
1141 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301142 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001143
1144 if (mmc->high_capacity) {
1145 csize = (mmc->csd[1] & 0x3f) << 16
1146 | (mmc->csd[2] & 0xffff0000) >> 16;
1147 cmult = 8;
1148 } else {
1149 csize = (mmc->csd[1] & 0x3ff) << 2
1150 | (mmc->csd[2] & 0xc0000000) >> 30;
1151 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1152 }
1153
Stephen Warrene315ae82013-06-11 15:14:01 -06001154 mmc->capacity_user = (csize + 1) << (cmult + 2);
1155 mmc->capacity_user *= mmc->read_bl_len;
1156 mmc->capacity_boot = 0;
1157 mmc->capacity_rpmb = 0;
1158 for (i = 0; i < 4; i++)
1159 mmc->capacity_gp[i] = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001160
Simon Glassa09c2b72013-04-03 08:54:30 +00001161 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1162 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001163
Simon Glassa09c2b72013-04-03 08:54:30 +00001164 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1165 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001166
Markus Niebel03951412013-12-16 13:40:46 +01001167 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1168 cmd.cmdidx = MMC_CMD_SET_DSR;
1169 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1170 cmd.resp_type = MMC_RSP_NONE;
1171 if (mmc_send_cmd(mmc, &cmd, NULL))
1172 printf("MMC: SET_DSR failed\n");
1173 }
1174
Andy Flemingad347bb2008-10-30 16:41:01 -05001175 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001176 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1177 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001178 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001179 cmd.cmdarg = mmc->rca << 16;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001180 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001181
Thomas Chou1254c3d2010-12-24 13:12:21 +00001182 if (err)
1183 return err;
1184 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001185
Lei Wenea526762011-06-22 17:03:31 +00001186 /*
1187 * For SD, its erase group is always one sector
1188 */
1189 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001190 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301191 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1192 /* check ext_csd version and capacity */
1193 err = mmc_send_ext_csd(mmc, ext_csd);
Diego Santa Cruzca25e062014-12-23 10:50:28 +01001194 if (err)
1195 return err;
1196 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001197 /*
1198 * According to the JEDEC Standard, the value of
1199 * ext_csd's capacity is valid if the value is more
1200 * than 2GB
1201 */
Lei Wen217467f2011-10-03 20:35:10 +00001202 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1203 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1204 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1205 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glassa09c2b72013-04-03 08:54:30 +00001206 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewski237823e2011-07-05 02:19:44 +00001207 if ((capacity >> 20) > 2 * 1024)
Stephen Warrene315ae82013-06-11 15:14:01 -06001208 mmc->capacity_user = capacity;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301209 }
Lei Wen31b99802011-05-02 16:26:26 +00001210
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001211 switch (ext_csd[EXT_CSD_REV]) {
1212 case 1:
1213 mmc->version = MMC_VERSION_4_1;
1214 break;
1215 case 2:
1216 mmc->version = MMC_VERSION_4_2;
1217 break;
1218 case 3:
1219 mmc->version = MMC_VERSION_4_3;
1220 break;
1221 case 5:
1222 mmc->version = MMC_VERSION_4_41;
1223 break;
1224 case 6:
1225 mmc->version = MMC_VERSION_4_5;
1226 break;
Markus Niebel32f53b62014-11-18 15:13:53 +01001227 case 7:
1228 mmc->version = MMC_VERSION_5_0;
1229 break;
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001230 }
1231
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001232 /* The partition data may be non-zero but it is only
1233 * effective if PARTITION_SETTING_COMPLETED is set in
1234 * EXT_CSD, so ignore any data if this bit is not set,
1235 * except for enabling the high-capacity group size
1236 * definition (see below). */
1237 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1238 EXT_CSD_PARTITION_SETTING_COMPLETED);
1239
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001240 /* store the partition info of emmc */
1241 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1242 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1243 ext_csd[EXT_CSD_BOOT_MULT])
1244 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001245 if (part_completed &&
1246 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001247 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1248
1249 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1250
1251 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1252
1253 for (i = 0; i < 4; i++) {
1254 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001255 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001256 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001257 if (mult)
1258 has_parts = true;
1259 if (!part_completed)
1260 continue;
1261 mmc->capacity_gp[i] = mult;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001262 mmc->capacity_gp[i] *=
1263 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1264 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruze5a2a3a2014-12-23 10:50:21 +01001265 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001266 }
1267
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001268 if (part_completed) {
1269 mmc->enh_user_size =
1270 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
1271 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
1272 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1273 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1274 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1275 mmc->enh_user_size <<= 19;
1276 mmc->enh_user_start =
1277 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
1278 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
1279 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
1280 ext_csd[EXT_CSD_ENH_START_ADDR];
1281 if (mmc->high_capacity)
1282 mmc->enh_user_start <<= 9;
1283 }
Diego Santa Cruz3b62d842014-12-23 10:50:22 +01001284
Lei Wenea526762011-06-22 17:03:31 +00001285 /*
Oliver Metzb3f14092013-10-01 20:32:07 +02001286 * Host needs to enable ERASE_GRP_DEF bit if device is
1287 * partitioned. This bit will be lost every time after a reset
1288 * or power off. This will affect erase size.
Lei Wenea526762011-06-22 17:03:31 +00001289 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001290 if (part_completed)
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001291 has_parts = true;
Oliver Metzb3f14092013-10-01 20:32:07 +02001292 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001293 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1294 has_parts = true;
1295 if (has_parts) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001296 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1297 EXT_CSD_ERASE_GROUP_DEF, 1);
1298
1299 if (err)
1300 return err;
Hannes Petermaier15e874d2014-08-08 09:47:22 +02001301 else
1302 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001303 }
Oliver Metzb3f14092013-10-01 20:32:07 +02001304
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001305 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001306 /* Read out group size from ext_csd */
Lei Wen217467f2011-10-03 20:35:10 +00001307 mmc->erase_grp_size =
Diego Santa Cruz747f6fa2014-12-23 10:50:24 +01001308 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebel6d398922014-11-18 15:11:42 +01001309 /*
1310 * if high capacity and partition setting completed
1311 * SEC_COUNT is valid even if it is smaller than 2 GiB
1312 * JEDEC Standard JESD84-B45, 6.2.4
1313 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001314 if (mmc->high_capacity && part_completed) {
Markus Niebel6d398922014-11-18 15:11:42 +01001315 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1316 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1317 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1318 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1319 capacity *= MMC_MAX_BLOCK_LEN;
1320 mmc->capacity_user = capacity;
1321 }
Simon Glassa09c2b72013-04-03 08:54:30 +00001322 } else {
Oliver Metzb3f14092013-10-01 20:32:07 +02001323 /* Calculate the group size from the csd value. */
Lei Wenea526762011-06-22 17:03:31 +00001324 int erase_gsz, erase_gmul;
1325 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1326 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1327 mmc->erase_grp_size = (erase_gsz + 1)
1328 * (erase_gmul + 1);
1329 }
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001330
1331 mmc->hc_wp_grp_size = 1024
1332 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1333 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruz37a50b92014-12-23 10:50:33 +01001334
1335 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301336 }
1337
Simon Glasse5db1152016-05-01 13:52:35 -06001338 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrene315ae82013-06-11 15:14:01 -06001339 if (err)
1340 return err;
1341
Andy Flemingad347bb2008-10-30 16:41:01 -05001342 if (IS_SD(mmc))
1343 err = sd_change_freq(mmc);
1344 else
1345 err = mmc_change_freq(mmc);
1346
1347 if (err)
1348 return err;
1349
1350 /* Restrict card's capabilities by what the host can do */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001351 mmc->card_caps &= mmc->cfg->host_caps;
Andy Flemingad347bb2008-10-30 16:41:01 -05001352
1353 if (IS_SD(mmc)) {
1354 if (mmc->card_caps & MMC_MODE_4BIT) {
1355 cmd.cmdidx = MMC_CMD_APP_CMD;
1356 cmd.resp_type = MMC_RSP_R1;
1357 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001358
1359 err = mmc_send_cmd(mmc, &cmd, NULL);
1360 if (err)
1361 return err;
1362
1363 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1364 cmd.resp_type = MMC_RSP_R1;
1365 cmd.cmdarg = 2;
Andy Flemingad347bb2008-10-30 16:41:01 -05001366 err = mmc_send_cmd(mmc, &cmd, NULL);
1367 if (err)
1368 return err;
1369
1370 mmc_set_bus_width(mmc, 4);
1371 }
1372
1373 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001374 mmc->tran_speed = 50000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001375 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001376 mmc->tran_speed = 25000000;
Andrew Gabbasovccb7b042014-12-25 10:22:25 -06001377 } else if (mmc->version >= MMC_VERSION_4) {
1378 /* Only version 4 of MMC supports wider bus widths */
Andy Flemingeb766ad2012-10-31 19:02:38 +00001379 int idx;
1380
1381 /* An array of possible bus widths in order of preference */
1382 static unsigned ext_csd_bits[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001383 EXT_CSD_DDR_BUS_WIDTH_8,
1384 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001385 EXT_CSD_BUS_WIDTH_8,
1386 EXT_CSD_BUS_WIDTH_4,
1387 EXT_CSD_BUS_WIDTH_1,
1388 };
1389
1390 /* An array to map CSD bus widths to host cap bits */
1391 static unsigned ext_to_hostcaps[] = {
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001392 [EXT_CSD_DDR_BUS_WIDTH_4] =
1393 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1394 [EXT_CSD_DDR_BUS_WIDTH_8] =
1395 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001396 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1397 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1398 };
1399
1400 /* An array to map chosen bus width to an integer */
1401 static unsigned widths[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001402 8, 4, 8, 4, 1,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001403 };
1404
1405 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1406 unsigned int extw = ext_csd_bits[idx];
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001407 unsigned int caps = ext_to_hostcaps[extw];
Andy Flemingeb766ad2012-10-31 19:02:38 +00001408
1409 /*
Andrew Gabbasovc1b2cf02014-12-25 10:22:24 -06001410 * If the bus width is still not changed,
1411 * don't try to set the default again.
1412 * Otherwise, recover from switch attempts
1413 * by switching to 1-bit bus width.
1414 */
1415 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1416 mmc->bus_width == 1) {
1417 err = 0;
1418 break;
1419 }
1420
1421 /*
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001422 * Check to make sure the card and controller support
1423 * these capabilities
Andy Flemingeb766ad2012-10-31 19:02:38 +00001424 */
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001425 if ((mmc->card_caps & caps) != caps)
Andy Flemingeb766ad2012-10-31 19:02:38 +00001426 continue;
1427
Andy Flemingad347bb2008-10-30 16:41:01 -05001428 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001429 EXT_CSD_BUS_WIDTH, extw);
Andy Flemingad347bb2008-10-30 16:41:01 -05001430
1431 if (err)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001432 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001433
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001434 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Flemingeb766ad2012-10-31 19:02:38 +00001435 mmc_set_bus_width(mmc, widths[idx]);
Andy Flemingad347bb2008-10-30 16:41:01 -05001436
Lei Wen4f5a6a52011-10-03 20:35:11 +00001437 err = mmc_send_ext_csd(mmc, test_csd);
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001438
1439 if (err)
1440 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001441
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001442 /* Only compare read only fields */
1443 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1444 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1445 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1446 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1447 ext_csd[EXT_CSD_REV]
1448 == test_csd[EXT_CSD_REV] &&
1449 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1450 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1451 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1452 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001453 break;
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001454 else
1455 err = SWITCH_ERR;
Andy Flemingad347bb2008-10-30 16:41:01 -05001456 }
1457
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001458 if (err)
1459 return err;
1460
Andy Flemingad347bb2008-10-30 16:41:01 -05001461 if (mmc->card_caps & MMC_MODE_HS) {
1462 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001463 mmc->tran_speed = 52000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001464 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001465 mmc->tran_speed = 26000000;
1466 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001467 }
1468
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001469 mmc_set_clock(mmc, mmc->tran_speed);
1470
Andrew Gabbasov532663b2014-12-01 06:59:11 -06001471 /* Fix the block length for DDR mode */
1472 if (mmc->ddr_mode) {
1473 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1474 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1475 }
1476
Andy Flemingad347bb2008-10-30 16:41:01 -05001477 /* fill in device description */
Simon Glasse5db1152016-05-01 13:52:35 -06001478 bdesc = mmc_get_blk_desc(mmc);
1479 bdesc->lun = 0;
1480 bdesc->hwpart = 0;
1481 bdesc->type = 0;
1482 bdesc->blksz = mmc->read_bl_len;
1483 bdesc->log2blksz = LOG2(bdesc->blksz);
1484 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsd67754f2015-12-04 23:27:40 +01001485#if !defined(CONFIG_SPL_BUILD) || \
1486 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1487 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glasse5db1152016-05-01 13:52:35 -06001488 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Hutt7367ec22012-10-20 17:15:59 +00001489 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1490 (mmc->cid[3] >> 16) & 0xffff);
Simon Glasse5db1152016-05-01 13:52:35 -06001491 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Hutt7367ec22012-10-20 17:15:59 +00001492 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1493 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1494 (mmc->cid[2] >> 24) & 0xff);
Simon Glasse5db1152016-05-01 13:52:35 -06001495 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Hutt7367ec22012-10-20 17:15:59 +00001496 (mmc->cid[2] >> 16) & 0xf);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001497#else
Simon Glasse5db1152016-05-01 13:52:35 -06001498 bdesc->vendor[0] = 0;
1499 bdesc->product[0] = 0;
1500 bdesc->revision[0] = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001501#endif
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001502#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glasse5db1152016-05-01 13:52:35 -06001503 part_init(bdesc);
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001504#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001505
1506 return 0;
1507}
1508
Kim Phillips87ea3892012-10-29 13:34:43 +00001509static int mmc_send_if_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001510{
1511 struct mmc_cmd cmd;
1512 int err;
1513
1514 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1515 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001516 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Flemingad347bb2008-10-30 16:41:01 -05001517 cmd.resp_type = MMC_RSP_R7;
Andy Flemingad347bb2008-10-30 16:41:01 -05001518
1519 err = mmc_send_cmd(mmc, &cmd, NULL);
1520
1521 if (err)
1522 return err;
1523
Rabin Vincentb6eed942009-04-05 13:30:56 +05301524 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Flemingad347bb2008-10-30 16:41:01 -05001525 return UNUSABLE_ERR;
1526 else
1527 mmc->version = SD_VERSION_2;
1528
1529 return 0;
1530}
1531
Simon Glassa70a1462016-05-01 13:52:40 -06001532#ifdef CONFIG_BLK
1533int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
1534{
1535 struct blk_desc *bdesc;
1536 struct udevice *bdev;
1537 int ret;
1538
1539 ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC, -1, 512,
1540 0, &bdev);
1541 if (ret) {
1542 debug("Cannot create block device\n");
1543 return ret;
1544 }
1545 bdesc = dev_get_uclass_platdata(bdev);
1546 mmc->cfg = cfg;
1547 mmc->priv = dev;
1548
1549 /* the following chunk was from mmc_register() */
1550
1551 /* Setup dsr related values */
1552 mmc->dsr_imp = 0;
1553 mmc->dsr = 0xffffffff;
1554 /* Setup the universal parts of the block interface just once */
Simon Glassa70a1462016-05-01 13:52:40 -06001555 bdesc->removable = 1;
1556
1557 /* setup initial part type */
Simon Glass434c4872016-05-14 14:03:10 -06001558 bdesc->part_type = cfg->part_type;
Simon Glassa70a1462016-05-01 13:52:40 -06001559 mmc->dev = dev;
1560
1561 return 0;
1562}
1563
1564int mmc_unbind(struct udevice *dev)
1565{
1566 struct udevice *bdev;
1567
1568 device_find_first_child(dev, &bdev);
1569 if (bdev) {
1570 device_remove(bdev);
1571 device_unbind(bdev);
1572 }
1573
1574 return 0;
1575}
1576
1577#else
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001578struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
Andy Flemingad347bb2008-10-30 16:41:01 -05001579{
Simon Glasse5db1152016-05-01 13:52:35 -06001580 struct blk_desc *bdesc;
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001581 struct mmc *mmc;
1582
1583 /* quick validation */
1584 if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1585 cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1586 return NULL;
1587
1588 mmc = calloc(1, sizeof(*mmc));
1589 if (mmc == NULL)
1590 return NULL;
1591
1592 mmc->cfg = cfg;
1593 mmc->priv = priv;
1594
1595 /* the following chunk was mmc_register() */
1596
Markus Niebel03951412013-12-16 13:40:46 +01001597 /* Setup dsr related values */
1598 mmc->dsr_imp = 0;
1599 mmc->dsr = 0xffffffff;
Andy Flemingad347bb2008-10-30 16:41:01 -05001600 /* Setup the universal parts of the block interface just once */
Simon Glasse5db1152016-05-01 13:52:35 -06001601 bdesc = mmc_get_blk_desc(mmc);
1602 bdesc->if_type = IF_TYPE_MMC;
1603 bdesc->removable = 1;
1604 bdesc->devnum = mmc_get_next_devnum();
1605 bdesc->block_read = mmc_bread;
1606 bdesc->block_write = mmc_bwrite;
1607 bdesc->block_erase = mmc_berase;
Andy Flemingad347bb2008-10-30 16:41:01 -05001608
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001609 /* setup initial part type */
Simon Glasse5db1152016-05-01 13:52:35 -06001610 bdesc->part_type = mmc->cfg->part_type;
1611 mmc_list_add(mmc);
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001612
1613 return mmc;
1614}
1615
1616void mmc_destroy(struct mmc *mmc)
1617{
1618 /* only freeing memory for now */
1619 free(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001620}
Simon Glassa70a1462016-05-01 13:52:40 -06001621#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001622
Simon Glass59bc6f22016-05-01 13:52:41 -06001623#ifndef CONFIG_BLK
Simon Glassfa255112016-05-01 11:36:15 -06001624static int mmc_get_dev(int dev, struct blk_desc **descp)
Simon Glass4f7011a2016-05-01 11:36:07 -06001625{
1626 struct mmc *mmc = find_mmc_device(dev);
1627 int ret;
1628
1629 if (!mmc)
1630 return -ENODEV;
1631 ret = mmc_init(mmc);
1632 if (ret)
1633 return ret;
1634
1635 *descp = &mmc->block_dev;
1636
1637 return 0;
1638}
Simon Glass59bc6f22016-05-01 13:52:41 -06001639#endif
Simon Glass4f7011a2016-05-01 11:36:07 -06001640
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001641/* board-specific MMC power initializations. */
1642__weak void board_mmc_power_init(void)
1643{
1644}
1645
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001646int mmc_start_init(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001647{
Macpaul Lin028bde12011-11-14 23:35:39 +00001648 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001649
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001650 /* we pretend there's no card when init is NULL */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001651 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Redingb9c8b772012-01-02 01:15:37 +00001652 mmc->has_init = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001653#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Redingb9c8b772012-01-02 01:15:37 +00001654 printf("MMC: no card present\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001655#endif
Thierry Redingb9c8b772012-01-02 01:15:37 +00001656 return NO_CARD_ERR;
1657 }
1658
Lei Wen31b99802011-05-02 16:26:26 +00001659 if (mmc->has_init)
1660 return 0;
1661
Yangbo Lub124f8a2015-04-22 13:57:00 +08001662#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1663 mmc_adapter_card_type_ident();
1664#endif
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001665 board_mmc_power_init();
1666
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001667 /* made sure it's not NULL earlier */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001668 err = mmc->cfg->ops->init(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001669
1670 if (err)
1671 return err;
1672
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001673 mmc->ddr_mode = 0;
Ilya Yanok8459aab2009-06-29 17:53:16 +04001674 mmc_set_bus_width(mmc, 1);
1675 mmc_set_clock(mmc, 1);
1676
Andy Flemingad347bb2008-10-30 16:41:01 -05001677 /* Reset the Card */
1678 err = mmc_go_idle(mmc);
1679
1680 if (err)
1681 return err;
1682
Lei Wen31b99802011-05-02 16:26:26 +00001683 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glasse5db1152016-05-01 13:52:35 -06001684 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wen31b99802011-05-02 16:26:26 +00001685
Andy Flemingad347bb2008-10-30 16:41:01 -05001686 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001687 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001688
Andy Flemingad347bb2008-10-30 16:41:01 -05001689 /* Now try to get the SD card's operating condition */
1690 err = sd_send_op_cond(mmc);
1691
1692 /* If the command timed out, we check for an MMC card */
1693 if (err == TIMEOUT) {
1694 err = mmc_send_op_cond(mmc);
1695
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001696 if (err) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001697#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001698 printf("Card did not respond to voltage select!\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001699#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001700 return UNUSABLE_ERR;
1701 }
1702 }
1703
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001704 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001705 mmc->init_in_progress = 1;
1706
1707 return err;
1708}
1709
1710static int mmc_complete_init(struct mmc *mmc)
1711{
1712 int err = 0;
1713
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001714 mmc->init_in_progress = 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001715 if (mmc->op_cond_pending)
1716 err = mmc_complete_op_cond(mmc);
1717
1718 if (!err)
1719 err = mmc_startup(mmc);
Lei Wen31b99802011-05-02 16:26:26 +00001720 if (err)
1721 mmc->has_init = 0;
1722 else
1723 mmc->has_init = 1;
1724 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001725}
1726
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001727int mmc_init(struct mmc *mmc)
1728{
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001729 int err = 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001730 unsigned start;
Simon Glass59bc6f22016-05-01 13:52:41 -06001731#ifdef CONFIG_DM_MMC
1732 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001733
Simon Glass59bc6f22016-05-01 13:52:41 -06001734 upriv->mmc = mmc;
1735#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001736 if (mmc->has_init)
1737 return 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001738
1739 start = get_timer(0);
1740
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001741 if (!mmc->init_in_progress)
1742 err = mmc_start_init(mmc);
1743
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001744 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001745 err = mmc_complete_init(mmc);
1746 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1747 return err;
1748}
1749
Markus Niebel03951412013-12-16 13:40:46 +01001750int mmc_set_dsr(struct mmc *mmc, u16 val)
1751{
1752 mmc->dsr = val;
1753 return 0;
1754}
1755
Jeroen Hofstee47726302014-07-10 22:46:28 +02001756/* CPU-specific MMC initializations */
1757__weak int cpu_mmc_init(bd_t *bis)
Andy Flemingad347bb2008-10-30 16:41:01 -05001758{
1759 return -1;
1760}
1761
Jeroen Hofstee47726302014-07-10 22:46:28 +02001762/* board-specific MMC initializations. */
1763__weak int board_mmc_init(bd_t *bis)
1764{
1765 return -1;
1766}
Andy Flemingad347bb2008-10-30 16:41:01 -05001767
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001768void mmc_set_preinit(struct mmc *mmc, int preinit)
1769{
1770 mmc->preinit = preinit;
1771}
1772
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001773#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1774static int mmc_probe(bd_t *bis)
1775{
1776 return 0;
1777}
1778#elif defined(CONFIG_DM_MMC)
1779static int mmc_probe(bd_t *bis)
1780{
Simon Glass547cb342015-12-29 05:22:49 -07001781 int ret, i;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001782 struct uclass *uc;
Simon Glass547cb342015-12-29 05:22:49 -07001783 struct udevice *dev;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001784
1785 ret = uclass_get(UCLASS_MMC, &uc);
1786 if (ret)
1787 return ret;
1788
Simon Glass547cb342015-12-29 05:22:49 -07001789 /*
1790 * Try to add them in sequence order. Really with driver model we
1791 * should allow holes, but the current MMC list does not allow that.
1792 * So if we request 0, 1, 3 we will get 0, 1, 2.
1793 */
1794 for (i = 0; ; i++) {
1795 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1796 if (ret == -ENODEV)
1797 break;
1798 }
1799 uclass_foreach_dev(dev, uc) {
1800 ret = device_probe(dev);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001801 if (ret)
Simon Glass547cb342015-12-29 05:22:49 -07001802 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001803 }
1804
1805 return 0;
1806}
1807#else
1808static int mmc_probe(bd_t *bis)
1809{
1810 if (board_mmc_init(bis) < 0)
1811 cpu_mmc_init(bis);
1812
1813 return 0;
1814}
1815#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001816
Andy Flemingad347bb2008-10-30 16:41:01 -05001817int mmc_initialize(bd_t *bis)
1818{
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001819 static int initialized = 0;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001820 int ret;
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001821 if (initialized) /* Avoid initializing mmc multiple times */
1822 return 0;
1823 initialized = 1;
1824
Simon Glasse5db1152016-05-01 13:52:35 -06001825#ifndef CONFIG_BLK
1826 mmc_list_init();
1827#endif
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001828 ret = mmc_probe(bis);
1829 if (ret)
1830 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -05001831
Ying Zhang9ff70262013-08-16 15:16:11 +08001832#ifndef CONFIG_SPL_BUILD
Andy Flemingad347bb2008-10-30 16:41:01 -05001833 print_mmc_devices(',');
Ying Zhang9ff70262013-08-16 15:16:11 +08001834#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001835
Simon Glasse5db1152016-05-01 13:52:35 -06001836 mmc_do_preinit();
Andy Flemingad347bb2008-10-30 16:41:01 -05001837 return 0;
1838}
Amar1104e9b2013-04-27 11:42:58 +05301839
1840#ifdef CONFIG_SUPPORT_EMMC_BOOT
1841/*
1842 * This function changes the size of boot partition and the size of rpmb
1843 * partition present on EMMC devices.
1844 *
1845 * Input Parameters:
1846 * struct *mmc: pointer for the mmc device strcuture
1847 * bootsize: size of boot partition
1848 * rpmbsize: size of rpmb partition
1849 *
1850 * Returns 0 on success.
1851 */
1852
1853int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1854 unsigned long rpmbsize)
1855{
1856 int err;
1857 struct mmc_cmd cmd;
1858
1859 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1860 cmd.cmdidx = MMC_CMD_RES_MAN;
1861 cmd.resp_type = MMC_RSP_R1b;
1862 cmd.cmdarg = MMC_CMD62_ARG1;
1863
1864 err = mmc_send_cmd(mmc, &cmd, NULL);
1865 if (err) {
1866 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1867 return err;
1868 }
1869
1870 /* Boot partition changing mode */
1871 cmd.cmdidx = MMC_CMD_RES_MAN;
1872 cmd.resp_type = MMC_RSP_R1b;
1873 cmd.cmdarg = MMC_CMD62_ARG2;
1874
1875 err = mmc_send_cmd(mmc, &cmd, NULL);
1876 if (err) {
1877 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1878 return err;
1879 }
1880 /* boot partition size is multiple of 128KB */
1881 bootsize = (bootsize * 1024) / 128;
1882
1883 /* Arg: boot partition size */
1884 cmd.cmdidx = MMC_CMD_RES_MAN;
1885 cmd.resp_type = MMC_RSP_R1b;
1886 cmd.cmdarg = bootsize;
1887
1888 err = mmc_send_cmd(mmc, &cmd, NULL);
1889 if (err) {
1890 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1891 return err;
1892 }
1893 /* RPMB partition size is multiple of 128KB */
1894 rpmbsize = (rpmbsize * 1024) / 128;
1895 /* Arg: RPMB partition size */
1896 cmd.cmdidx = MMC_CMD_RES_MAN;
1897 cmd.resp_type = MMC_RSP_R1b;
1898 cmd.cmdarg = rpmbsize;
1899
1900 err = mmc_send_cmd(mmc, &cmd, NULL);
1901 if (err) {
1902 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1903 return err;
1904 }
1905 return 0;
1906}
1907
1908/*
Tom Rini4cf854c2014-02-05 10:24:22 -05001909 * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1910 * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1911 * and BOOT_MODE.
1912 *
1913 * Returns 0 on success.
1914 */
1915int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1916{
1917 int err;
1918
1919 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1920 EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1921 EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1922 EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1923
1924 if (err)
1925 return err;
1926 return 0;
1927}
1928
1929/*
Tom Rinif8c6f792014-02-05 10:24:21 -05001930 * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1931 * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1932 * PARTITION_ACCESS.
1933 *
1934 * Returns 0 on success.
1935 */
1936int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1937{
1938 int err;
1939
1940 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1941 EXT_CSD_BOOT_ACK(ack) |
1942 EXT_CSD_BOOT_PART_NUM(part_num) |
1943 EXT_CSD_PARTITION_ACCESS(access));
1944
1945 if (err)
1946 return err;
1947 return 0;
1948}
Tom Rini35a3ea12014-02-07 14:15:20 -05001949
1950/*
1951 * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1952 * for enable. Note that this is a write-once field for non-zero values.
1953 *
1954 * Returns 0 on success.
1955 */
1956int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1957{
1958 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1959 enable);
1960}
Amar1104e9b2013-04-27 11:42:58 +05301961#endif
Simon Glass4f7011a2016-05-01 11:36:07 -06001962
Simon Glass59bc6f22016-05-01 13:52:41 -06001963#ifdef CONFIG_BLK
1964static const struct blk_ops mmc_blk_ops = {
1965 .read = mmc_bread,
1966 .write = mmc_bwrite,
1967 .select_hwpart = mmc_select_hwpart,
1968};
1969
1970U_BOOT_DRIVER(mmc_blk) = {
1971 .name = "mmc_blk",
1972 .id = UCLASS_BLK,
1973 .ops = &mmc_blk_ops,
1974};
1975#else
Simon Glass4f7011a2016-05-01 11:36:07 -06001976U_BOOT_LEGACY_BLK(mmc) = {
1977 .if_typename = "mmc",
1978 .if_type = IF_TYPE_MMC,
1979 .max_devs = -1,
Simon Glassfa255112016-05-01 11:36:15 -06001980 .get_dev = mmc_get_dev,
Simon Glass518a8962016-05-01 13:52:26 -06001981 .select_hwpart = mmc_select_hwpartp,
Simon Glass4f7011a2016-05-01 11:36:07 -06001982};
Simon Glass59bc6f22016-05-01 13:52:41 -06001983#endif