blob: aabfc711e5d6fe40d001c3b6eabec9e37f43000b [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
218static ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
219 void *dst)
220#else
Simon Glass4101f682016-02-29 15:25:34 -0700221static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
Stephen Warren7c4213f2015-12-07 11:38:48 -0700222 lbaint_t blkcnt, void *dst)
Simon Glass33fb2112016-05-01 13:52:41 -0600223#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500224{
Simon Glass33fb2112016-05-01 13:52:41 -0600225#ifdef CONFIG_BLK
226 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
227#endif
Simon Glassbcce53d2016-02-29 15:25:51 -0700228 int dev_num = block_dev->devnum;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700229 int err;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700230 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500231
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700232 if (blkcnt == 0)
233 return 0;
234
235 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500236 if (!mmc)
237 return 0;
238
Simon Glass69f45cd2016-05-01 13:52:29 -0600239 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
Stephen Warren873cc1d2015-12-07 11:38:49 -0700240 if (err < 0)
241 return 0;
242
Simon Glassc40fdca2016-05-01 13:52:35 -0600243 if ((start + blkcnt) > block_dev->lba) {
Paul Burton56196822013-09-04 16:12:25 +0100244#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbeff8fef52013-06-14 13:07:25 +0200245 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glassc40fdca2016-05-01 13:52:35 -0600246 start + blkcnt, block_dev->lba);
Paul Burton56196822013-09-04 16:12:25 +0100247#endif
Lei Wend2bf29e2010-09-13 22:07:27 +0800248 return 0;
249 }
Andy Fleming272cc702008-10-30 16:41:01 -0500250
Simon Glass11692992015-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 Fleming272cc702008-10-30 16:41:01 -0500253 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600254 }
Andy Fleming272cc702008-10-30 16:41:01 -0500255
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700256 do {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200257 cur = (blocks_todo > mmc->cfg->b_max) ?
258 mmc->cfg->b_max : blocks_todo;
Simon Glass11692992015-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 Sankar4a1a06b2010-10-25 07:23:56 -0700261 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600262 }
Alagu Sankar4a1a06b2010-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 Fleming272cc702008-10-30 16:41:01 -0500267
268 return blkcnt;
269}
270
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000271static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-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 Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +0000292static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500293{
294 int timeout = 1000;
295 int err;
296 struct mmc_cmd cmd;
297
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500298 while (1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500299 cmd.cmdidx = MMC_CMD_APP_CMD;
300 cmd.resp_type = MMC_RSP_R1;
301 cmd.cmdarg = 0;
Andy Fleming272cc702008-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 Babic250de122010-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 Choud52ebf12010-12-24 13:12:21 +0000318 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200319 (mmc->cfg->voltages & 0xff8000);
Andy Fleming272cc702008-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 Gabbasov1677eef2015-03-19 07:44:06 -0500329 if (cmd.response[0] & OCR_BUSY)
330 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500331
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500332 if (timeout-- <= 0)
333 return UNUSABLE_ERR;
334
335 udelay(1000);
336 }
Andy Fleming272cc702008-10-30 16:41:01 -0500337
338 if (mmc->version != SD_VERSION_2)
339 mmc->version = SD_VERSION_1_0;
340
Thomas Choud52ebf12010-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 Choud52ebf12010-12-24 13:12:21 +0000345
346 err = mmc_send_cmd(mmc, &cmd, NULL);
347
348 if (err)
349 return err;
350 }
351
Rabin Vincent998be3d2009-04-05 13:30:56 +0530352 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-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 Gabbasov5289b532015-03-19 07:44:04 -0500360static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500361{
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500362 struct mmc_cmd cmd;
Andy Fleming272cc702008-10-30 16:41:01 -0500363 int err;
364
Andrew Gabbasov5289b532015-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 Herring5a203972015-03-23 17:56:59 -0500368 if (use_arg && !mmc_host_is_spi(mmc))
369 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200370 (mmc->cfg->voltages &
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500371 (mmc->ocr & OCR_VOLTAGE_MASK)) |
372 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000373
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500374 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000375 if (err)
376 return err;
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500377 mmc->ocr = cmd.response[0];
Che-Liang Chioue9550442012-11-28 15:21:13 +0000378 return 0;
379}
380
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200381static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000382{
Che-Liang Chioue9550442012-11-28 15:21:13 +0000383 int err, i;
384
Andy Fleming272cc702008-10-30 16:41:01 -0500385 /* Some cards seem to need this */
386 mmc_go_idle(mmc);
387
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000388 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000389 for (i = 0; i < 2; i++) {
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500390 err = mmc_send_op_cond_iter(mmc, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500391 if (err)
392 return err;
393
Che-Liang Chioue9550442012-11-28 15:21:13 +0000394 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500395 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500396 break;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000397 }
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500398 mmc->op_cond_pending = 1;
399 return 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000400}
Andy Fleming272cc702008-10-30 16:41:01 -0500401
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200402static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000403{
404 struct mmc_cmd cmd;
405 int timeout = 1000;
406 uint start;
407 int err;
408
409 mmc->op_cond_pending = 0;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500410 if (!(mmc->ocr & OCR_BUSY)) {
411 start = get_timer(0);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500412 while (1) {
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500413 err = mmc_send_op_cond_iter(mmc, 1);
414 if (err)
415 return err;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500416 if (mmc->ocr & OCR_BUSY)
417 break;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500418 if (get_timer(start) > timeout)
419 return UNUSABLE_ERR;
420 udelay(100);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500421 }
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500422 }
Andy Fleming272cc702008-10-30 16:41:01 -0500423
Thomas Choud52ebf12010-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 Choud52ebf12010-12-24 13:12:21 +0000428
429 err = mmc_send_cmd(mmc, &cmd, NULL);
430
431 if (err)
432 return err;
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500433
434 mmc->ocr = cmd.response[0];
Thomas Choud52ebf12010-12-24 13:12:21 +0000435 }
436
Andy Fleming272cc702008-10-30 16:41:01 -0500437 mmc->version = MMC_VERSION_UNKNOWN;
Andy Fleming272cc702008-10-30 16:41:01 -0500438
439 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrendef816a2014-01-30 16:11:12 -0700440 mmc->rca = 1;
Andy Fleming272cc702008-10-30 16:41:01 -0500441
442 return 0;
443}
444
445
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000446static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-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 Fleming272cc702008-10-30 16:41:01 -0500456
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000457 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500458 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000459 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +0000468static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500469{
470 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000471 int timeout = 1000;
472 int ret;
Andy Fleming272cc702008-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 Recalcati5d4fc8d2011-03-11 02:01:12 +0000477 (index << 16) |
478 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500479
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000480 ret = mmc_send_cmd(mmc, &cmd, NULL);
481
482 /* Waiting for the ready status */
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000483 if (!ret)
484 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000485
486 return ret;
487
Andy Fleming272cc702008-10-30 16:41:01 -0500488}
489
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000490static int mmc_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500491{
Simon Glass8bfa1952013-04-03 08:54:30 +0000492 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Fleming272cc702008-10-30 16:41:01 -0500493 char cardtype;
494 int err;
495
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600496 mmc->card_caps = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500497
Thomas Choud52ebf12010-12-24 13:12:21 +0000498 if (mmc_host_is_spi(mmc))
499 return 0;
500
Andy Fleming272cc702008-10-30 16:41:01 -0500501 /* Only version 4 supports high-speed */
502 if (mmc->version < MMC_VERSION_4)
503 return 0;
504
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600505 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
506
Andy Fleming272cc702008-10-30 16:41:01 -0500507 err = mmc_send_ext_csd(mmc, ext_csd);
508
509 if (err)
510 return err;
511
Lei Wen0560db12011-10-03 20:35:10 +0000512 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-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 Schochera5e27b42016-06-07 08:31:21 +0200517 return err;
Andy Fleming272cc702008-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 Wen0560db12011-10-03 20:35:10 +0000526 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Fleming272cc702008-10-30 16:41:01 -0500527 return 0;
528
529 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900530 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov201d5ac2014-12-01 06:59:10 -0600531 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900532 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Fleming272cc702008-10-30 16:41:01 -0500533 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900534 } else {
Andy Fleming272cc702008-10-30 16:41:01 -0500535 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900536 }
Andy Fleming272cc702008-10-30 16:41:01 -0500537
538 return 0;
539}
540
Stephen Warrenf866a462013-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 Glassc40fdca2016-05-01 13:52:35 -0600564 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrenf866a462013-06-11 15:14:01 -0600565
566 return 0;
567}
568
Simon Glassfdbb1392016-05-01 13:52:37 -0600569static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wenbc897b12011-05-02 16:26:26 +0000570{
Stephen Warrenf866a462013-06-11 15:14:01 -0600571 int ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000572
Stephen Warrenf866a462013-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));
Stephen Warrenf866a462013-06-11 15:14:01 -0600576
Peter Bigot6dc93e72014-09-02 18:31:23 -0500577 /*
578 * Set the capacity if the switch succeeded or was intended
579 * to return to representing the raw device.
580 */
Stephen Warren873cc1d2015-12-07 11:38:49 -0700581 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot6dc93e72014-09-02 18:31:23 -0500582 ret = mmc_set_capacity(mmc, part_num);
Simon Glassfdbb1392016-05-01 13:52:37 -0600583 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700584 }
Peter Bigot6dc93e72014-09-02 18:31:23 -0500585
586 return ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000587}
588
Simon Glass33fb2112016-05-01 13:52:41 -0600589#ifdef CONFIG_BLK
590static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
591{
592 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);
595 int ret;
596
597 if (desc->hwpart == hwpart)
598 return 0;
599
600 if (mmc->part_config == MMCPART_NOAVAILABLE)
601 return -EMEDIUMTYPE;
602
603 ret = mmc_switch_part(mmc, hwpart);
604 if (ret)
605 return ret;
606
607 return 0;
608}
609#else
Simon Glasse17d1142016-05-01 13:52:26 -0600610static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
611{
612 struct mmc *mmc = find_mmc_device(desc->devnum);
613 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 Glassfdbb1392016-05-01 13:52:37 -0600624 ret = mmc_switch_part(mmc, hwpart);
Simon Glasse17d1142016-05-01 13:52:26 -0600625 if (ret)
626 return ret;
627
628 return 0;
629}
Simon Glass33fb2112016-05-01 13:52:41 -0600630#endif
Simon Glassff3882a2016-05-01 13:52:25 -0600631
Diego Santa Cruzac9da0e2014-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 Cruz8dda5b0e2014-12-23 10:50:31 +0100642 u8 wr_rel_set;
Diego Santa Cruzac9da0e2014-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 Cruz8dda5b0e2014-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 Cruzac9da0e2014-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 Cruz8dda5b0e2014-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 Cruzac9da0e2014-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 Reding48972d92012-01-02 01:15:37 +0000826int mmc_getcd(struct mmc *mmc)
827{
828 int cd;
829
830 cd = board_mmc_getcd(mmc);
831
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000832 if (cd < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200833 if (mmc->cfg->ops->getcd)
834 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000835 else
836 cd = 1;
837 }
Thierry Reding48972d92012-01-02 01:15:37 +0000838
839 return cd;
840}
841
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000842static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-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 Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +0000863static int sd_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500864{
865 int err;
866 struct mmc_cmd cmd;
Anton staaff781dd32011-10-03 13:54:59 +0000867 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
868 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500869 struct mmc_data data;
870 int timeout;
871
872 mmc->card_caps = 0;
873
Thomas Choud52ebf12010-12-24 13:12:21 +0000874 if (mmc_host_is_spi(mmc))
875 return 0;
876
Andy Fleming272cc702008-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 Fleming272cc702008-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 Fleming272cc702008-10-30 16:41:01 -0500890
891 timeout = 3;
892
893retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000894 data.dest = (char *)scr;
Andy Fleming272cc702008-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 Kharuzhy4e3d89b2009-05-07 00:43:30 +0300908 mmc->scr[0] = __be32_to_cpu(scr[0]);
909 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500910
911 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng53e8e402016-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 Fleming272cc702008-10-30 16:41:01 -0500926 }
927
Alagu Sankarb44c7082010-05-12 15:08:24 +0530928 if (mmc->scr[0] & SD_DATA_4BIT)
929 mmc->card_caps |= MMC_MODE_4BIT;
930
Andy Fleming272cc702008-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 staaff781dd32011-10-03 13:54:59 +0000938 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500939
940 if (err)
941 return err;
942
943 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300944 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500945 break;
946 }
947
Andy Fleming272cc702008-10-30 16:41:01 -0500948 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300949 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500950 return 0;
951
Macpaul Lin2c3fbf42011-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 Antoniou93bfd612014-03-11 19:34:20 +0200958 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
959 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000960 return 0;
961
Anton staaff781dd32011-10-03 13:54:59 +0000962 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500963
964 if (err)
965 return err;
966
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300967 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-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 Frysinger5f837c22010-10-20 01:15:53 +0000975static const int fbase[] = {
Andy Fleming272cc702008-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 Glass61fe0762016-05-14 14:02:57 -0600985static const u8 multipliers[] = {
Andy Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +00001004static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001005{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001006 if (mmc->cfg->ops->set_ios)
1007 mmc->cfg->ops->set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001008}
1009
1010void mmc_set_clock(struct mmc *mmc, uint clock)
1011{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001012 if (clock > mmc->cfg->f_max)
1013 clock = mmc->cfg->f_max;
Andy Fleming272cc702008-10-30 16:41:01 -05001014
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001015 if (clock < mmc->cfg->f_min)
1016 clock = mmc->cfg->f_min;
Andy Fleming272cc702008-10-30 16:41:01 -05001017
1018 mmc->clock = clock;
1019
1020 mmc_set_ios(mmc);
1021}
1022
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001023static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -05001024{
1025 mmc->bus_width = width;
1026
1027 mmc_set_ios(mmc);
1028}
1029
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001030static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001031{
Stephen Warrenf866a462013-06-11 15:14:01 -06001032 int err, i;
Andy Fleming272cc702008-10-30 16:41:01 -05001033 uint mult, freq;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001034 u64 cmult, csize, capacity;
Andy Fleming272cc702008-10-30 16:41:01 -05001035 struct mmc_cmd cmd;
Simon Glass8bfa1952013-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 Recalcati5d4fc8d2011-03-11 02:01:12 +00001038 int timeout = 1000;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001039 bool has_parts = false;
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001040 bool part_completed;
Simon Glassc40fdca2016-05-01 13:52:35 -06001041 struct blk_desc *bdesc;
Andy Fleming272cc702008-10-30 16:41:01 -05001042
Thomas Choud52ebf12010-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 Choud52ebf12010-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 Fleming272cc702008-10-30 16:41:01 -05001055 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-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 Fleming272cc702008-10-30 16:41:01 -05001058 cmd.resp_type = MMC_RSP_R2;
1059 cmd.cmdarg = 0;
Andy Fleming272cc702008-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 Choud52ebf12010-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 Fleming272cc702008-10-30 16:41:01 -05001077
Thomas Choud52ebf12010-12-24 13:12:21 +00001078 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001079
Thomas Choud52ebf12010-12-24 13:12:21 +00001080 if (err)
1081 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001082
Thomas Choud52ebf12010-12-24 13:12:21 +00001083 if (IS_SD(mmc))
1084 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1085 }
Andy Fleming272cc702008-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 Fleming272cc702008-10-30 16:41:01 -05001091
1092 err = mmc_send_cmd(mmc, &cmd, NULL);
1093
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +00001094 /* Waiting for the ready status */
1095 mmc_send_status(mmc, timeout);
1096
Andy Fleming272cc702008-10-30 16:41:01 -05001097 if (err)
1098 return err;
1099
Rabin Vincent998be3d2009-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 Fleming272cc702008-10-30 16:41:01 -05001104
1105 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301106 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -05001107
1108 switch (version) {
Bin Meng53e8e402016-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 Fleming272cc702008-10-30 16:41:01 -05001127 }
1128 }
1129
1130 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301131 freq = fbase[(cmd.response[0] & 0x7)];
1132 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -05001133
1134 mmc->tran_speed = freq * mult;
1135
Markus Niebelab711882013-12-16 13:40:46 +01001136 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincent998be3d2009-04-05 13:30:56 +05301137 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001138
1139 if (IS_SD(mmc))
1140 mmc->write_bl_len = mmc->read_bl_len;
1141 else
Rabin Vincent998be3d2009-04-05 13:30:56 +05301142 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-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 Warrenf866a462013-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 Fleming272cc702008-10-30 16:41:01 -05001160
Simon Glass8bfa1952013-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 Fleming272cc702008-10-30 16:41:01 -05001163
Simon Glass8bfa1952013-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 Fleming272cc702008-10-30 16:41:01 -05001166
Markus Niebelab711882013-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 Fleming272cc702008-10-30 16:41:01 -05001175 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-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 Bhargavfe8f7062011-10-05 03:13:23 +00001178 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001179 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001180 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001181
Thomas Choud52ebf12010-12-24 13:12:21 +00001182 if (err)
1183 return err;
1184 }
Andy Fleming272cc702008-10-30 16:41:01 -05001185
Lei Wene6f99a52011-06-22 17:03:31 +00001186 /*
1187 * For SD, its erase group is always one sector
1188 */
1189 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001190 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghoraid23e2c02010-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 Cruz9cf199e2014-12-23 10:50:28 +01001194 if (err)
1195 return err;
1196 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda639b7822011-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 Wen0560db12011-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 Glass8bfa1952013-04-03 08:54:30 +00001206 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewskib1f1e8212011-07-05 02:19:44 +00001207 if ((capacity >> 20) > 2 * 1024)
Stephen Warrenf866a462013-06-11 15:14:01 -06001208 mmc->capacity_user = capacity;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301209 }
Lei Wenbc897b12011-05-02 16:26:26 +00001210
Jaehoon Chung64f4a612013-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 Niebeledab7232014-11-18 15:13:53 +01001227 case 7:
1228 mmc->version = MMC_VERSION_5_0;
1229 break;
Stefan Wahren1a3619c2016-06-16 17:54:06 +00001230 case 8:
1231 mmc->version = MMC_VERSION_5_1;
1232 break;
Jaehoon Chung64f4a612013-01-29 19:31:16 +00001233 }
1234
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001235 /* The partition data may be non-zero but it is only
1236 * effective if PARTITION_SETTING_COMPLETED is set in
1237 * EXT_CSD, so ignore any data if this bit is not set,
1238 * except for enabling the high-capacity group size
1239 * definition (see below). */
1240 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1241 EXT_CSD_PARTITION_SETTING_COMPLETED);
1242
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001243 /* store the partition info of emmc */
1244 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1245 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1246 ext_csd[EXT_CSD_BOOT_MULT])
1247 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001248 if (part_completed &&
1249 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001250 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1251
1252 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1253
1254 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1255
1256 for (i = 0; i < 4; i++) {
1257 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001258 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001259 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001260 if (mult)
1261 has_parts = true;
1262 if (!part_completed)
1263 continue;
1264 mmc->capacity_gp[i] = mult;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001265 mmc->capacity_gp[i] *=
1266 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1267 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruzf8e89d62014-12-23 10:50:21 +01001268 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001269 }
1270
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001271 if (part_completed) {
1272 mmc->enh_user_size =
1273 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
1274 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
1275 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1276 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1277 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1278 mmc->enh_user_size <<= 19;
1279 mmc->enh_user_start =
1280 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
1281 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
1282 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
1283 ext_csd[EXT_CSD_ENH_START_ADDR];
1284 if (mmc->high_capacity)
1285 mmc->enh_user_start <<= 9;
1286 }
Diego Santa Cruza7f852b2014-12-23 10:50:22 +01001287
Lei Wene6f99a52011-06-22 17:03:31 +00001288 /*
Oliver Metz1937e5a2013-10-01 20:32:07 +02001289 * Host needs to enable ERASE_GRP_DEF bit if device is
1290 * partitioned. This bit will be lost every time after a reset
1291 * or power off. This will affect erase size.
Lei Wene6f99a52011-06-22 17:03:31 +00001292 */
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001293 if (part_completed)
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001294 has_parts = true;
Oliver Metz1937e5a2013-10-01 20:32:07 +02001295 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001296 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1297 has_parts = true;
1298 if (has_parts) {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001299 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1300 EXT_CSD_ERASE_GROUP_DEF, 1);
1301
1302 if (err)
1303 return err;
Hannes Petermaier021a8052014-08-08 09:47:22 +02001304 else
1305 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001306 }
Oliver Metz1937e5a2013-10-01 20:32:07 +02001307
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001308 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001309 /* Read out group size from ext_csd */
Lei Wen0560db12011-10-03 20:35:10 +00001310 mmc->erase_grp_size =
Diego Santa Cruza4ff9f82014-12-23 10:50:24 +01001311 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebeld7b29122014-11-18 15:11:42 +01001312 /*
1313 * if high capacity and partition setting completed
1314 * SEC_COUNT is valid even if it is smaller than 2 GiB
1315 * JEDEC Standard JESD84-B45, 6.2.4
1316 */
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001317 if (mmc->high_capacity && part_completed) {
Markus Niebeld7b29122014-11-18 15:11:42 +01001318 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1319 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1320 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1321 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1322 capacity *= MMC_MAX_BLOCK_LEN;
1323 mmc->capacity_user = capacity;
1324 }
Simon Glass8bfa1952013-04-03 08:54:30 +00001325 } else {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001326 /* Calculate the group size from the csd value. */
Lei Wene6f99a52011-06-22 17:03:31 +00001327 int erase_gsz, erase_gmul;
1328 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1329 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1330 mmc->erase_grp_size = (erase_gsz + 1)
1331 * (erase_gmul + 1);
1332 }
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001333
1334 mmc->hc_wp_grp_size = 1024
1335 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1336 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruz9e41a002014-12-23 10:50:33 +01001337
1338 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301339 }
1340
Simon Glassc40fdca2016-05-01 13:52:35 -06001341 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrenf866a462013-06-11 15:14:01 -06001342 if (err)
1343 return err;
1344
Andy Fleming272cc702008-10-30 16:41:01 -05001345 if (IS_SD(mmc))
1346 err = sd_change_freq(mmc);
1347 else
1348 err = mmc_change_freq(mmc);
1349
1350 if (err)
1351 return err;
1352
1353 /* Restrict card's capabilities by what the host can do */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001354 mmc->card_caps &= mmc->cfg->host_caps;
Andy Fleming272cc702008-10-30 16:41:01 -05001355
1356 if (IS_SD(mmc)) {
1357 if (mmc->card_caps & MMC_MODE_4BIT) {
1358 cmd.cmdidx = MMC_CMD_APP_CMD;
1359 cmd.resp_type = MMC_RSP_R1;
1360 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -05001361
1362 err = mmc_send_cmd(mmc, &cmd, NULL);
1363 if (err)
1364 return err;
1365
1366 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1367 cmd.resp_type = MMC_RSP_R1;
1368 cmd.cmdarg = 2;
Andy Fleming272cc702008-10-30 16:41:01 -05001369 err = mmc_send_cmd(mmc, &cmd, NULL);
1370 if (err)
1371 return err;
1372
1373 mmc_set_bus_width(mmc, 4);
1374 }
1375
1376 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001377 mmc->tran_speed = 50000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001378 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001379 mmc->tran_speed = 25000000;
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -06001380 } else if (mmc->version >= MMC_VERSION_4) {
1381 /* Only version 4 of MMC supports wider bus widths */
Andy Fleming7798f6d2012-10-31 19:02:38 +00001382 int idx;
1383
1384 /* An array of possible bus widths in order of preference */
1385 static unsigned ext_csd_bits[] = {
Jaehoon Chungd22e3d42014-05-16 13:59:54 +09001386 EXT_CSD_DDR_BUS_WIDTH_8,
1387 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001388 EXT_CSD_BUS_WIDTH_8,
1389 EXT_CSD_BUS_WIDTH_4,
1390 EXT_CSD_BUS_WIDTH_1,
1391 };
1392
1393 /* An array to map CSD bus widths to host cap bits */
1394 static unsigned ext_to_hostcaps[] = {
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001395 [EXT_CSD_DDR_BUS_WIDTH_4] =
1396 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1397 [EXT_CSD_DDR_BUS_WIDTH_8] =
1398 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001399 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1400 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1401 };
1402
1403 /* An array to map chosen bus width to an integer */
1404 static unsigned widths[] = {
Jaehoon Chungd22e3d42014-05-16 13:59:54 +09001405 8, 4, 8, 4, 1,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001406 };
1407
1408 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1409 unsigned int extw = ext_csd_bits[idx];
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001410 unsigned int caps = ext_to_hostcaps[extw];
Andy Fleming7798f6d2012-10-31 19:02:38 +00001411
1412 /*
Andrew Gabbasovbf477072014-12-25 10:22:24 -06001413 * If the bus width is still not changed,
1414 * don't try to set the default again.
1415 * Otherwise, recover from switch attempts
1416 * by switching to 1-bit bus width.
1417 */
1418 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1419 mmc->bus_width == 1) {
1420 err = 0;
1421 break;
1422 }
1423
1424 /*
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001425 * Check to make sure the card and controller support
1426 * these capabilities
Andy Fleming7798f6d2012-10-31 19:02:38 +00001427 */
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001428 if ((mmc->card_caps & caps) != caps)
Andy Fleming7798f6d2012-10-31 19:02:38 +00001429 continue;
1430
Andy Fleming272cc702008-10-30 16:41:01 -05001431 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001432 EXT_CSD_BUS_WIDTH, extw);
Andy Fleming272cc702008-10-30 16:41:01 -05001433
1434 if (err)
Lei Wen41378942011-10-03 20:35:11 +00001435 continue;
Andy Fleming272cc702008-10-30 16:41:01 -05001436
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001437 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Fleming7798f6d2012-10-31 19:02:38 +00001438 mmc_set_bus_width(mmc, widths[idx]);
Andy Fleming272cc702008-10-30 16:41:01 -05001439
Lei Wen41378942011-10-03 20:35:11 +00001440 err = mmc_send_ext_csd(mmc, test_csd);
Andy Fleming272cc702008-10-30 16:41:01 -05001441
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001442 if (err)
1443 continue;
1444
1445 /* Only compare read only fields */
1446 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1447 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1448 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1449 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1450 ext_csd[EXT_CSD_REV]
1451 == test_csd[EXT_CSD_REV] &&
1452 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1453 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1454 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1455 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
Lei Wen41378942011-10-03 20:35:11 +00001456 break;
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001457 else
1458 err = SWITCH_ERR;
Andy Fleming272cc702008-10-30 16:41:01 -05001459 }
1460
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001461 if (err)
1462 return err;
1463
Andy Fleming272cc702008-10-30 16:41:01 -05001464 if (mmc->card_caps & MMC_MODE_HS) {
1465 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001466 mmc->tran_speed = 52000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001467 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001468 mmc->tran_speed = 26000000;
1469 }
Andy Fleming272cc702008-10-30 16:41:01 -05001470 }
1471
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001472 mmc_set_clock(mmc, mmc->tran_speed);
1473
Andrew Gabbasov5af8f452014-12-01 06:59:11 -06001474 /* Fix the block length for DDR mode */
1475 if (mmc->ddr_mode) {
1476 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1477 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1478 }
1479
Andy Fleming272cc702008-10-30 16:41:01 -05001480 /* fill in device description */
Simon Glassc40fdca2016-05-01 13:52:35 -06001481 bdesc = mmc_get_blk_desc(mmc);
1482 bdesc->lun = 0;
1483 bdesc->hwpart = 0;
1484 bdesc->type = 0;
1485 bdesc->blksz = mmc->read_bl_len;
1486 bdesc->log2blksz = LOG2(bdesc->blksz);
1487 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsfc011f62015-12-04 23:27:40 +01001488#if !defined(CONFIG_SPL_BUILD) || \
1489 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1490 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glassc40fdca2016-05-01 13:52:35 -06001491 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Huttbabce5f2012-10-20 17:15:59 +00001492 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1493 (mmc->cid[3] >> 16) & 0xffff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001494 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001495 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1496 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1497 (mmc->cid[2] >> 24) & 0xff);
Simon Glassc40fdca2016-05-01 13:52:35 -06001498 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Huttbabce5f2012-10-20 17:15:59 +00001499 (mmc->cid[2] >> 16) & 0xf);
Paul Burton56196822013-09-04 16:12:25 +01001500#else
Simon Glassc40fdca2016-05-01 13:52:35 -06001501 bdesc->vendor[0] = 0;
1502 bdesc->product[0] = 0;
1503 bdesc->revision[0] = 0;
Paul Burton56196822013-09-04 16:12:25 +01001504#endif
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001505#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glassc40fdca2016-05-01 13:52:35 -06001506 part_init(bdesc);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001507#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001508
1509 return 0;
1510}
1511
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001512static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001513{
1514 struct mmc_cmd cmd;
1515 int err;
1516
1517 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1518 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001519 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Fleming272cc702008-10-30 16:41:01 -05001520 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001521
1522 err = mmc_send_cmd(mmc, &cmd, NULL);
1523
1524 if (err)
1525 return err;
1526
Rabin Vincent998be3d2009-04-05 13:30:56 +05301527 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -05001528 return UNUSABLE_ERR;
1529 else
1530 mmc->version = SD_VERSION_2;
1531
1532 return 0;
1533}
1534
Simon Glassad27dd52016-05-01 13:52:40 -06001535#ifdef CONFIG_BLK
1536int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
1537{
1538 struct blk_desc *bdesc;
1539 struct udevice *bdev;
1540 int ret;
1541
1542 ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC, -1, 512,
1543 0, &bdev);
1544 if (ret) {
1545 debug("Cannot create block device\n");
1546 return ret;
1547 }
1548 bdesc = dev_get_uclass_platdata(bdev);
1549 mmc->cfg = cfg;
1550 mmc->priv = dev;
1551
1552 /* the following chunk was from mmc_register() */
1553
1554 /* Setup dsr related values */
1555 mmc->dsr_imp = 0;
1556 mmc->dsr = 0xffffffff;
1557 /* Setup the universal parts of the block interface just once */
Simon Glassad27dd52016-05-01 13:52:40 -06001558 bdesc->removable = 1;
1559
1560 /* setup initial part type */
Simon Glasse6c28072016-05-14 14:03:10 -06001561 bdesc->part_type = cfg->part_type;
Simon Glassad27dd52016-05-01 13:52:40 -06001562 mmc->dev = dev;
1563
1564 return 0;
1565}
1566
1567int mmc_unbind(struct udevice *dev)
1568{
1569 struct udevice *bdev;
1570
1571 device_find_first_child(dev, &bdev);
1572 if (bdev) {
1573 device_remove(bdev);
1574 device_unbind(bdev);
1575 }
1576
1577 return 0;
1578}
1579
1580#else
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001581struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
1582{
Simon Glassc40fdca2016-05-01 13:52:35 -06001583 struct blk_desc *bdesc;
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001584 struct mmc *mmc;
1585
1586 /* quick validation */
1587 if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1588 cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1589 return NULL;
1590
1591 mmc = calloc(1, sizeof(*mmc));
1592 if (mmc == NULL)
1593 return NULL;
1594
1595 mmc->cfg = cfg;
1596 mmc->priv = priv;
1597
1598 /* the following chunk was mmc_register() */
1599
Markus Niebelab711882013-12-16 13:40:46 +01001600 /* Setup dsr related values */
1601 mmc->dsr_imp = 0;
1602 mmc->dsr = 0xffffffff;
Andy Fleming272cc702008-10-30 16:41:01 -05001603 /* Setup the universal parts of the block interface just once */
Simon Glassc40fdca2016-05-01 13:52:35 -06001604 bdesc = mmc_get_blk_desc(mmc);
1605 bdesc->if_type = IF_TYPE_MMC;
1606 bdesc->removable = 1;
1607 bdesc->devnum = mmc_get_next_devnum();
1608 bdesc->block_read = mmc_bread;
1609 bdesc->block_write = mmc_bwrite;
1610 bdesc->block_erase = mmc_berase;
Andy Fleming272cc702008-10-30 16:41:01 -05001611
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001612 /* setup initial part type */
Simon Glassc40fdca2016-05-01 13:52:35 -06001613 bdesc->part_type = mmc->cfg->part_type;
1614 mmc_list_add(mmc);
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001615
1616 return mmc;
1617}
1618
1619void mmc_destroy(struct mmc *mmc)
1620{
1621 /* only freeing memory for now */
1622 free(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001623}
Simon Glassad27dd52016-05-01 13:52:40 -06001624#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001625
Simon Glass33fb2112016-05-01 13:52:41 -06001626#ifndef CONFIG_BLK
Simon Glass3c457f42016-05-01 11:36:15 -06001627static int mmc_get_dev(int dev, struct blk_desc **descp)
Simon Glass663acab2016-05-01 11:36:07 -06001628{
1629 struct mmc *mmc = find_mmc_device(dev);
1630 int ret;
1631
1632 if (!mmc)
1633 return -ENODEV;
1634 ret = mmc_init(mmc);
1635 if (ret)
1636 return ret;
1637
1638 *descp = &mmc->block_dev;
1639
1640 return 0;
1641}
Simon Glass33fb2112016-05-01 13:52:41 -06001642#endif
Simon Glass663acab2016-05-01 11:36:07 -06001643
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001644/* board-specific MMC power initializations. */
1645__weak void board_mmc_power_init(void)
1646{
1647}
1648
Che-Liang Chioue9550442012-11-28 15:21:13 +00001649int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001650{
Macpaul Linafd59322011-11-14 23:35:39 +00001651 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001652
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001653 /* we pretend there's no card when init is NULL */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001654 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Reding48972d92012-01-02 01:15:37 +00001655 mmc->has_init = 0;
Paul Burton56196822013-09-04 16:12:25 +01001656#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Reding48972d92012-01-02 01:15:37 +00001657 printf("MMC: no card present\n");
Paul Burton56196822013-09-04 16:12:25 +01001658#endif
Thierry Reding48972d92012-01-02 01:15:37 +00001659 return NO_CARD_ERR;
1660 }
1661
Lei Wenbc897b12011-05-02 16:26:26 +00001662 if (mmc->has_init)
1663 return 0;
1664
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001665#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1666 mmc_adapter_card_type_ident();
1667#endif
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001668 board_mmc_power_init();
1669
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001670 /* made sure it's not NULL earlier */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001671 err = mmc->cfg->ops->init(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001672
1673 if (err)
1674 return err;
1675
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001676 mmc->ddr_mode = 0;
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001677 mmc_set_bus_width(mmc, 1);
1678 mmc_set_clock(mmc, 1);
1679
Andy Fleming272cc702008-10-30 16:41:01 -05001680 /* Reset the Card */
1681 err = mmc_go_idle(mmc);
1682
1683 if (err)
1684 return err;
1685
Lei Wenbc897b12011-05-02 16:26:26 +00001686 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glassc40fdca2016-05-01 13:52:35 -06001687 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wenbc897b12011-05-02 16:26:26 +00001688
Andy Fleming272cc702008-10-30 16:41:01 -05001689 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001690 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001691
Andy Fleming272cc702008-10-30 16:41:01 -05001692 /* Now try to get the SD card's operating condition */
1693 err = sd_send_op_cond(mmc);
1694
1695 /* If the command timed out, we check for an MMC card */
1696 if (err == TIMEOUT) {
1697 err = mmc_send_op_cond(mmc);
1698
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001699 if (err) {
Paul Burton56196822013-09-04 16:12:25 +01001700#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001701 printf("Card did not respond to voltage select!\n");
Paul Burton56196822013-09-04 16:12:25 +01001702#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001703 return UNUSABLE_ERR;
1704 }
1705 }
1706
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001707 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001708 mmc->init_in_progress = 1;
1709
1710 return err;
1711}
1712
1713static int mmc_complete_init(struct mmc *mmc)
1714{
1715 int err = 0;
1716
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001717 mmc->init_in_progress = 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001718 if (mmc->op_cond_pending)
1719 err = mmc_complete_op_cond(mmc);
1720
1721 if (!err)
1722 err = mmc_startup(mmc);
Lei Wenbc897b12011-05-02 16:26:26 +00001723 if (err)
1724 mmc->has_init = 0;
1725 else
1726 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001727 return err;
1728}
1729
1730int mmc_init(struct mmc *mmc)
1731{
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001732 int err = 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001733 unsigned start;
Simon Glass33fb2112016-05-01 13:52:41 -06001734#ifdef CONFIG_DM_MMC
1735 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chioue9550442012-11-28 15:21:13 +00001736
Simon Glass33fb2112016-05-01 13:52:41 -06001737 upriv->mmc = mmc;
1738#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00001739 if (mmc->has_init)
1740 return 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001741
1742 start = get_timer(0);
1743
Che-Liang Chioue9550442012-11-28 15:21:13 +00001744 if (!mmc->init_in_progress)
1745 err = mmc_start_init(mmc);
1746
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001747 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001748 err = mmc_complete_init(mmc);
1749 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
Lei Wenbc897b12011-05-02 16:26:26 +00001750 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001751}
1752
Markus Niebelab711882013-12-16 13:40:46 +01001753int mmc_set_dsr(struct mmc *mmc, u16 val)
1754{
1755 mmc->dsr = val;
1756 return 0;
1757}
1758
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02001759/* CPU-specific MMC initializations */
1760__weak int cpu_mmc_init(bd_t *bis)
Andy Fleming272cc702008-10-30 16:41:01 -05001761{
1762 return -1;
1763}
1764
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02001765/* board-specific MMC initializations. */
1766__weak int board_mmc_init(bd_t *bis)
1767{
1768 return -1;
1769}
Andy Fleming272cc702008-10-30 16:41:01 -05001770
Che-Liang Chioue9550442012-11-28 15:21:13 +00001771void mmc_set_preinit(struct mmc *mmc, int preinit)
1772{
1773 mmc->preinit = preinit;
1774}
1775
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001776#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1777static int mmc_probe(bd_t *bis)
1778{
1779 return 0;
1780}
1781#elif defined(CONFIG_DM_MMC)
1782static int mmc_probe(bd_t *bis)
1783{
Simon Glass4a1db6d2015-12-29 05:22:49 -07001784 int ret, i;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001785 struct uclass *uc;
Simon Glass4a1db6d2015-12-29 05:22:49 -07001786 struct udevice *dev;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001787
1788 ret = uclass_get(UCLASS_MMC, &uc);
1789 if (ret)
1790 return ret;
1791
Simon Glass4a1db6d2015-12-29 05:22:49 -07001792 /*
1793 * Try to add them in sequence order. Really with driver model we
1794 * should allow holes, but the current MMC list does not allow that.
1795 * So if we request 0, 1, 3 we will get 0, 1, 2.
1796 */
1797 for (i = 0; ; i++) {
1798 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1799 if (ret == -ENODEV)
1800 break;
1801 }
1802 uclass_foreach_dev(dev, uc) {
1803 ret = device_probe(dev);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001804 if (ret)
Simon Glass4a1db6d2015-12-29 05:22:49 -07001805 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001806 }
1807
1808 return 0;
1809}
1810#else
1811static int mmc_probe(bd_t *bis)
1812{
1813 if (board_mmc_init(bis) < 0)
1814 cpu_mmc_init(bis);
1815
1816 return 0;
1817}
1818#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00001819
Andy Fleming272cc702008-10-30 16:41:01 -05001820int mmc_initialize(bd_t *bis)
1821{
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001822 static int initialized = 0;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001823 int ret;
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001824 if (initialized) /* Avoid initializing mmc multiple times */
1825 return 0;
1826 initialized = 1;
1827
Simon Glassc40fdca2016-05-01 13:52:35 -06001828#ifndef CONFIG_BLK
1829 mmc_list_init();
1830#endif
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001831 ret = mmc_probe(bis);
1832 if (ret)
1833 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05001834
Ying Zhangbb0dc102013-08-16 15:16:11 +08001835#ifndef CONFIG_SPL_BUILD
Andy Fleming272cc702008-10-30 16:41:01 -05001836 print_mmc_devices(',');
Ying Zhangbb0dc102013-08-16 15:16:11 +08001837#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001838
Simon Glassc40fdca2016-05-01 13:52:35 -06001839 mmc_do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05001840 return 0;
1841}
Amar3690d6d2013-04-27 11:42:58 +05301842
1843#ifdef CONFIG_SUPPORT_EMMC_BOOT
1844/*
1845 * This function changes the size of boot partition and the size of rpmb
1846 * partition present on EMMC devices.
1847 *
1848 * Input Parameters:
1849 * struct *mmc: pointer for the mmc device strcuture
1850 * bootsize: size of boot partition
1851 * rpmbsize: size of rpmb partition
1852 *
1853 * Returns 0 on success.
1854 */
1855
1856int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1857 unsigned long rpmbsize)
1858{
1859 int err;
1860 struct mmc_cmd cmd;
1861
1862 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1863 cmd.cmdidx = MMC_CMD_RES_MAN;
1864 cmd.resp_type = MMC_RSP_R1b;
1865 cmd.cmdarg = MMC_CMD62_ARG1;
1866
1867 err = mmc_send_cmd(mmc, &cmd, NULL);
1868 if (err) {
1869 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1870 return err;
1871 }
1872
1873 /* Boot partition changing mode */
1874 cmd.cmdidx = MMC_CMD_RES_MAN;
1875 cmd.resp_type = MMC_RSP_R1b;
1876 cmd.cmdarg = MMC_CMD62_ARG2;
1877
1878 err = mmc_send_cmd(mmc, &cmd, NULL);
1879 if (err) {
1880 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1881 return err;
1882 }
1883 /* boot partition size is multiple of 128KB */
1884 bootsize = (bootsize * 1024) / 128;
1885
1886 /* Arg: boot partition size */
1887 cmd.cmdidx = MMC_CMD_RES_MAN;
1888 cmd.resp_type = MMC_RSP_R1b;
1889 cmd.cmdarg = bootsize;
1890
1891 err = mmc_send_cmd(mmc, &cmd, NULL);
1892 if (err) {
1893 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1894 return err;
1895 }
1896 /* RPMB partition size is multiple of 128KB */
1897 rpmbsize = (rpmbsize * 1024) / 128;
1898 /* Arg: RPMB partition size */
1899 cmd.cmdidx = MMC_CMD_RES_MAN;
1900 cmd.resp_type = MMC_RSP_R1b;
1901 cmd.cmdarg = rpmbsize;
1902
1903 err = mmc_send_cmd(mmc, &cmd, NULL);
1904 if (err) {
1905 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1906 return err;
1907 }
1908 return 0;
1909}
1910
1911/*
Tom Rini5a99b9d2014-02-05 10:24:22 -05001912 * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1913 * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1914 * and BOOT_MODE.
1915 *
1916 * Returns 0 on success.
1917 */
1918int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1919{
1920 int err;
1921
1922 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1923 EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1924 EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1925 EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1926
1927 if (err)
1928 return err;
1929 return 0;
1930}
1931
1932/*
Tom Rini792970b2014-02-05 10:24:21 -05001933 * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1934 * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1935 * PARTITION_ACCESS.
1936 *
1937 * Returns 0 on success.
1938 */
1939int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1940{
1941 int err;
1942
1943 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1944 EXT_CSD_BOOT_ACK(ack) |
1945 EXT_CSD_BOOT_PART_NUM(part_num) |
1946 EXT_CSD_PARTITION_ACCESS(access));
1947
1948 if (err)
1949 return err;
1950 return 0;
1951}
Tom Rini33ace362014-02-07 14:15:20 -05001952
1953/*
1954 * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1955 * for enable. Note that this is a write-once field for non-zero values.
1956 *
1957 * Returns 0 on success.
1958 */
1959int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1960{
1961 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1962 enable);
1963}
Amar3690d6d2013-04-27 11:42:58 +05301964#endif
Simon Glass663acab2016-05-01 11:36:07 -06001965
Simon Glass33fb2112016-05-01 13:52:41 -06001966#ifdef CONFIG_BLK
1967static const struct blk_ops mmc_blk_ops = {
1968 .read = mmc_bread,
1969 .write = mmc_bwrite,
1970 .select_hwpart = mmc_select_hwpart,
1971};
1972
1973U_BOOT_DRIVER(mmc_blk) = {
1974 .name = "mmc_blk",
1975 .id = UCLASS_BLK,
1976 .ops = &mmc_blk_ops,
1977};
1978#else
Simon Glass663acab2016-05-01 11:36:07 -06001979U_BOOT_LEGACY_BLK(mmc) = {
1980 .if_typename = "mmc",
1981 .if_type = IF_TYPE_MMC,
1982 .max_devs = -1,
Simon Glass3c457f42016-05-01 11:36:15 -06001983 .get_dev = mmc_get_dev,
Simon Glasse17d1142016-05-01 13:52:26 -06001984 .select_hwpart = mmc_select_hwpartp,
Simon Glass663acab2016-05-01 11:36:07 -06001985};
Simon Glass33fb2112016-05-01 13:52:41 -06001986#endif