blob: 185d7b2a8e3a6a58a97b9d5c8628ef2db40a9c10 [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
24static struct list_head mmc_devices;
25static int cur_dev_num = -1;
26
Jeroen Hofstee750121c2014-07-12 21:24:08 +020027__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000028{
29 return -1;
30}
31
32int mmc_getwp(struct mmc *mmc)
33{
34 int wp;
35
36 wp = board_mmc_getwp(mmc);
37
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000038 if (wp < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020039 if (mmc->cfg->ops->getwp)
40 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000041 else
42 wp = 0;
43 }
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000044
45 return wp;
46}
47
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +020048__weak int board_mmc_getcd(struct mmc *mmc)
49{
Stefano Babic11fdade2010-02-05 15:04:43 +010050 return -1;
51}
52
Paul Burtonda61fa52013-09-09 15:30:26 +010053int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
Andy Fleming272cc702008-10-30 16:41:01 -050054{
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000055 int ret;
Marek Vasut8635ff92012-03-15 18:41:35 +000056
Marek Vasut8635ff92012-03-15 18:41:35 +000057#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000058 int i;
59 u8 *ptr;
60
61 printf("CMD_SEND:%d\n", cmd->cmdidx);
62 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020063 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Bin Meng7863ce52016-03-17 21:53:14 -070064 if (ret) {
65 printf("\t\tRET\t\t\t %d\n", ret);
66 } else {
67 switch (cmd->resp_type) {
68 case MMC_RSP_NONE:
69 printf("\t\tMMC_RSP_NONE\n");
70 break;
71 case MMC_RSP_R1:
72 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
73 cmd->response[0]);
74 break;
75 case MMC_RSP_R1b:
76 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
77 cmd->response[0]);
78 break;
79 case MMC_RSP_R2:
80 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
81 cmd->response[0]);
82 printf("\t\t \t\t 0x%08X \n",
83 cmd->response[1]);
84 printf("\t\t \t\t 0x%08X \n",
85 cmd->response[2]);
86 printf("\t\t \t\t 0x%08X \n",
87 cmd->response[3]);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000088 printf("\n");
Bin Meng7863ce52016-03-17 21:53:14 -070089 printf("\t\t\t\t\tDUMPING DATA\n");
90 for (i = 0; i < 4; i++) {
91 int j;
92 printf("\t\t\t\t\t%03d - ", i*4);
93 ptr = (u8 *)&cmd->response[i];
94 ptr += 3;
95 for (j = 0; j < 4; j++)
96 printf("%02X ", *ptr--);
97 printf("\n");
98 }
99 break;
100 case MMC_RSP_R3:
101 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
102 cmd->response[0]);
103 break;
104 default:
105 printf("\t\tERROR MMC rsp not supported\n");
106 break;
Bin Meng53e8e402016-03-17 21:53:13 -0700107 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000108 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000109#else
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200110 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000111#endif
Marek Vasut8635ff92012-03-15 18:41:35 +0000112 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500113}
114
Paul Burtonda61fa52013-09-09 15:30:26 +0100115int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000116{
117 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000118 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000119#ifdef CONFIG_MMC_TRACE
120 int status;
121#endif
122
123 cmd.cmdidx = MMC_CMD_SEND_STATUS;
124 cmd.resp_type = MMC_RSP_R1;
Marek Vasutaaf3d412011-08-10 09:24:48 +0200125 if (!mmc_host_is_spi(mmc))
126 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000127
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500128 while (1) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000129 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-02-05 22:29:12 +0000130 if (!err) {
131 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
132 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
133 MMC_STATE_PRG)
134 break;
135 else if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton56196822013-09-04 16:12:25 +0100136#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzked617c422012-02-05 22:29:12 +0000137 printf("Status Error: 0x%08X\n",
138 cmd.response[0]);
Paul Burton56196822013-09-04 16:12:25 +0100139#endif
Jan Kloetzked617c422012-02-05 22:29:12 +0000140 return COMM_ERR;
141 }
142 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000143 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000144
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500145 if (timeout-- <= 0)
146 break;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000147
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500148 udelay(1000);
149 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000150
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000151#ifdef CONFIG_MMC_TRACE
152 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
153 printf("CURR STATE:%d\n", status);
154#endif
Jongman Heo5b0c9422012-06-03 21:32:13 +0000155 if (timeout <= 0) {
Paul Burton56196822013-09-04 16:12:25 +0100156#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000157 printf("Timeout waiting card ready\n");
Paul Burton56196822013-09-04 16:12:25 +0100158#endif
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000159 return TIMEOUT;
160 }
Andrew Gabbasov6b2221b2014-04-03 04:34:32 -0500161 if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
162 return SWITCH_ERR;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000163
164 return 0;
165}
166
Paul Burtonda61fa52013-09-09 15:30:26 +0100167int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500168{
169 struct mmc_cmd cmd;
170
Andrew Gabbasov786e8f82014-12-01 06:59:09 -0600171 if (mmc->ddr_mode)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900172 return 0;
173
Andy Fleming272cc702008-10-30 16:41:01 -0500174 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
175 cmd.resp_type = MMC_RSP_R1;
176 cmd.cmdarg = len;
Andy Fleming272cc702008-10-30 16:41:01 -0500177
178 return mmc_send_cmd(mmc, &cmd, NULL);
179}
180
181struct mmc *find_mmc_device(int dev_num)
182{
183 struct mmc *m;
184 struct list_head *entry;
185
186 list_for_each(entry, &mmc_devices) {
187 m = list_entry(entry, struct mmc, link);
188
Simon Glassbcce53d2016-02-29 15:25:51 -0700189 if (m->block_dev.devnum == dev_num)
Andy Fleming272cc702008-10-30 16:41:01 -0500190 return m;
191 }
192
Paul Burton56196822013-09-04 16:12:25 +0100193#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -0500194 printf("MMC Device %d not found\n", dev_num);
Paul Burton56196822013-09-04 16:12:25 +0100195#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500196
197 return NULL;
198}
199
Sascha Silbeff8fef52013-06-14 13:07:25 +0200200static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000201 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500202{
203 struct mmc_cmd cmd;
204 struct mmc_data data;
205
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700206 if (blkcnt > 1)
207 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
208 else
209 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500210
211 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700212 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500213 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700214 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500215
216 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500217
218 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700219 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500220 data.blocksize = mmc->read_bl_len;
221 data.flags = MMC_DATA_READ;
222
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700223 if (mmc_send_cmd(mmc, &cmd, &data))
224 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500225
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700226 if (blkcnt > 1) {
227 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
228 cmd.cmdarg = 0;
229 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700230 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton56196822013-09-04 16:12:25 +0100231#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700232 printf("mmc fail to send stop cmd\n");
Paul Burton56196822013-09-04 16:12:25 +0100233#endif
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700234 return 0;
235 }
Andy Fleming272cc702008-10-30 16:41:01 -0500236 }
237
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700238 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500239}
240
Simon Glass4101f682016-02-29 15:25:34 -0700241static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
Stephen Warren7c4213f2015-12-07 11:38:48 -0700242 lbaint_t blkcnt, void *dst)
Andy Fleming272cc702008-10-30 16:41:01 -0500243{
Simon Glassbcce53d2016-02-29 15:25:51 -0700244 int dev_num = block_dev->devnum;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700245 int err;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700246 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500247
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700248 if (blkcnt == 0)
249 return 0;
250
251 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500252 if (!mmc)
253 return 0;
254
Stephen Warren873cc1d2015-12-07 11:38:49 -0700255 err = mmc_select_hwpart(dev_num, block_dev->hwpart);
256 if (err < 0)
257 return 0;
258
Lei Wend2bf29e2010-09-13 22:07:27 +0800259 if ((start + blkcnt) > mmc->block_dev.lba) {
Paul Burton56196822013-09-04 16:12:25 +0100260#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbeff8fef52013-06-14 13:07:25 +0200261 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800262 start + blkcnt, mmc->block_dev.lba);
Paul Burton56196822013-09-04 16:12:25 +0100263#endif
Lei Wend2bf29e2010-09-13 22:07:27 +0800264 return 0;
265 }
Andy Fleming272cc702008-10-30 16:41:01 -0500266
Simon Glass11692992015-06-23 15:38:50 -0600267 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
268 debug("%s: Failed to set blocklen\n", __func__);
Andy Fleming272cc702008-10-30 16:41:01 -0500269 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600270 }
Andy Fleming272cc702008-10-30 16:41:01 -0500271
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700272 do {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200273 cur = (blocks_todo > mmc->cfg->b_max) ?
274 mmc->cfg->b_max : blocks_todo;
Simon Glass11692992015-06-23 15:38:50 -0600275 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
276 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700277 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600278 }
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700279 blocks_todo -= cur;
280 start += cur;
281 dst += cur * mmc->read_bl_len;
282 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500283
284 return blkcnt;
285}
286
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000287static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500288{
289 struct mmc_cmd cmd;
290 int err;
291
292 udelay(1000);
293
294 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
295 cmd.cmdarg = 0;
296 cmd.resp_type = MMC_RSP_NONE;
Andy Fleming272cc702008-10-30 16:41:01 -0500297
298 err = mmc_send_cmd(mmc, &cmd, NULL);
299
300 if (err)
301 return err;
302
303 udelay(2000);
304
305 return 0;
306}
307
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000308static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500309{
310 int timeout = 1000;
311 int err;
312 struct mmc_cmd cmd;
313
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500314 while (1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500315 cmd.cmdidx = MMC_CMD_APP_CMD;
316 cmd.resp_type = MMC_RSP_R1;
317 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500318
319 err = mmc_send_cmd(mmc, &cmd, NULL);
320
321 if (err)
322 return err;
323
324 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
325 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100326
327 /*
328 * Most cards do not answer if some reserved bits
329 * in the ocr are set. However, Some controller
330 * can set bit 7 (reserved for low voltages), but
331 * how to manage low voltages SD card is not yet
332 * specified.
333 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000334 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200335 (mmc->cfg->voltages & 0xff8000);
Andy Fleming272cc702008-10-30 16:41:01 -0500336
337 if (mmc->version == SD_VERSION_2)
338 cmd.cmdarg |= OCR_HCS;
339
340 err = mmc_send_cmd(mmc, &cmd, NULL);
341
342 if (err)
343 return err;
344
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500345 if (cmd.response[0] & OCR_BUSY)
346 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500347
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500348 if (timeout-- <= 0)
349 return UNUSABLE_ERR;
350
351 udelay(1000);
352 }
Andy Fleming272cc702008-10-30 16:41:01 -0500353
354 if (mmc->version != SD_VERSION_2)
355 mmc->version = SD_VERSION_1_0;
356
Thomas Choud52ebf12010-12-24 13:12:21 +0000357 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
358 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
359 cmd.resp_type = MMC_RSP_R3;
360 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000361
362 err = mmc_send_cmd(mmc, &cmd, NULL);
363
364 if (err)
365 return err;
366 }
367
Rabin Vincent998be3d2009-04-05 13:30:56 +0530368 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500369
370 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
371 mmc->rca = 0;
372
373 return 0;
374}
375
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500376static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500377{
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500378 struct mmc_cmd cmd;
Andy Fleming272cc702008-10-30 16:41:01 -0500379 int err;
380
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500381 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
382 cmd.resp_type = MMC_RSP_R3;
383 cmd.cmdarg = 0;
Rob Herring5a203972015-03-23 17:56:59 -0500384 if (use_arg && !mmc_host_is_spi(mmc))
385 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200386 (mmc->cfg->voltages &
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500387 (mmc->ocr & OCR_VOLTAGE_MASK)) |
388 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000389
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500390 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000391 if (err)
392 return err;
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500393 mmc->ocr = cmd.response[0];
Che-Liang Chioue9550442012-11-28 15:21:13 +0000394 return 0;
395}
396
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200397static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000398{
Che-Liang Chioue9550442012-11-28 15:21:13 +0000399 int err, i;
400
Andy Fleming272cc702008-10-30 16:41:01 -0500401 /* Some cards seem to need this */
402 mmc_go_idle(mmc);
403
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000404 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000405 for (i = 0; i < 2; i++) {
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500406 err = mmc_send_op_cond_iter(mmc, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500407 if (err)
408 return err;
409
Che-Liang Chioue9550442012-11-28 15:21:13 +0000410 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500411 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500412 break;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000413 }
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500414 mmc->op_cond_pending = 1;
415 return 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000416}
Andy Fleming272cc702008-10-30 16:41:01 -0500417
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200418static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000419{
420 struct mmc_cmd cmd;
421 int timeout = 1000;
422 uint start;
423 int err;
424
425 mmc->op_cond_pending = 0;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500426 if (!(mmc->ocr & OCR_BUSY)) {
427 start = get_timer(0);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500428 while (1) {
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500429 err = mmc_send_op_cond_iter(mmc, 1);
430 if (err)
431 return err;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500432 if (mmc->ocr & OCR_BUSY)
433 break;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500434 if (get_timer(start) > timeout)
435 return UNUSABLE_ERR;
436 udelay(100);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500437 }
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500438 }
Andy Fleming272cc702008-10-30 16:41:01 -0500439
Thomas Choud52ebf12010-12-24 13:12:21 +0000440 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
441 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
442 cmd.resp_type = MMC_RSP_R3;
443 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000444
445 err = mmc_send_cmd(mmc, &cmd, NULL);
446
447 if (err)
448 return err;
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500449
450 mmc->ocr = cmd.response[0];
Thomas Choud52ebf12010-12-24 13:12:21 +0000451 }
452
Andy Fleming272cc702008-10-30 16:41:01 -0500453 mmc->version = MMC_VERSION_UNKNOWN;
Andy Fleming272cc702008-10-30 16:41:01 -0500454
455 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrendef816a2014-01-30 16:11:12 -0700456 mmc->rca = 1;
Andy Fleming272cc702008-10-30 16:41:01 -0500457
458 return 0;
459}
460
461
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000462static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-10-30 16:41:01 -0500463{
464 struct mmc_cmd cmd;
465 struct mmc_data data;
466 int err;
467
468 /* Get the Card Status Register */
469 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
470 cmd.resp_type = MMC_RSP_R1;
471 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500472
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000473 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500474 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000475 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -0500476 data.flags = MMC_DATA_READ;
477
478 err = mmc_send_cmd(mmc, &cmd, &data);
479
480 return err;
481}
482
483
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000484static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500485{
486 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000487 int timeout = 1000;
488 int ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500489
490 cmd.cmdidx = MMC_CMD_SWITCH;
491 cmd.resp_type = MMC_RSP_R1b;
492 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000493 (index << 16) |
494 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500495
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000496 ret = mmc_send_cmd(mmc, &cmd, NULL);
497
498 /* Waiting for the ready status */
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000499 if (!ret)
500 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000501
502 return ret;
503
Andy Fleming272cc702008-10-30 16:41:01 -0500504}
505
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000506static int mmc_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500507{
Simon Glass8bfa1952013-04-03 08:54:30 +0000508 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Fleming272cc702008-10-30 16:41:01 -0500509 char cardtype;
510 int err;
511
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600512 mmc->card_caps = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500513
Thomas Choud52ebf12010-12-24 13:12:21 +0000514 if (mmc_host_is_spi(mmc))
515 return 0;
516
Andy Fleming272cc702008-10-30 16:41:01 -0500517 /* Only version 4 supports high-speed */
518 if (mmc->version < MMC_VERSION_4)
519 return 0;
520
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600521 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
522
Andy Fleming272cc702008-10-30 16:41:01 -0500523 err = mmc_send_ext_csd(mmc, ext_csd);
524
525 if (err)
526 return err;
527
Lei Wen0560db12011-10-03 20:35:10 +0000528 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500529
530 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
531
532 if (err)
Andrew Gabbasov6b2221b2014-04-03 04:34:32 -0500533 return err == SWITCH_ERR ? 0 : err;
Andy Fleming272cc702008-10-30 16:41:01 -0500534
535 /* Now check to see that it worked */
536 err = mmc_send_ext_csd(mmc, ext_csd);
537
538 if (err)
539 return err;
540
541 /* No high-speed support */
Lei Wen0560db12011-10-03 20:35:10 +0000542 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Fleming272cc702008-10-30 16:41:01 -0500543 return 0;
544
545 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900546 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov201d5ac2014-12-01 06:59:10 -0600547 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900548 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Fleming272cc702008-10-30 16:41:01 -0500549 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900550 } else {
Andy Fleming272cc702008-10-30 16:41:01 -0500551 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900552 }
Andy Fleming272cc702008-10-30 16:41:01 -0500553
554 return 0;
555}
556
Stephen Warrenf866a462013-06-11 15:14:01 -0600557static int mmc_set_capacity(struct mmc *mmc, int part_num)
558{
559 switch (part_num) {
560 case 0:
561 mmc->capacity = mmc->capacity_user;
562 break;
563 case 1:
564 case 2:
565 mmc->capacity = mmc->capacity_boot;
566 break;
567 case 3:
568 mmc->capacity = mmc->capacity_rpmb;
569 break;
570 case 4:
571 case 5:
572 case 6:
573 case 7:
574 mmc->capacity = mmc->capacity_gp[part_num - 4];
575 break;
576 default:
577 return -1;
578 }
579
580 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
581
582 return 0;
583}
584
Stephen Warrend2356282014-05-07 12:19:02 -0600585int mmc_select_hwpart(int dev_num, int hwpart)
586{
587 struct mmc *mmc = find_mmc_device(dev_num);
588 int ret;
589
590 if (!mmc)
Stephen Warrend4622df2014-05-23 12:47:06 -0600591 return -ENODEV;
Stephen Warrend2356282014-05-07 12:19:02 -0600592
Stephen Warren873cc1d2015-12-07 11:38:49 -0700593 if (mmc->block_dev.hwpart == hwpart)
Stephen Warrend2356282014-05-07 12:19:02 -0600594 return 0;
595
596 if (mmc->part_config == MMCPART_NOAVAILABLE) {
597 printf("Card doesn't support part_switch\n");
Stephen Warrend4622df2014-05-23 12:47:06 -0600598 return -EMEDIUMTYPE;
Stephen Warrend2356282014-05-07 12:19:02 -0600599 }
600
601 ret = mmc_switch_part(dev_num, hwpart);
602 if (ret)
Stephen Warrend4622df2014-05-23 12:47:06 -0600603 return ret;
Stephen Warrend2356282014-05-07 12:19:02 -0600604
Stephen Warrend2356282014-05-07 12:19:02 -0600605 return 0;
606}
607
608
Lei Wenbc897b12011-05-02 16:26:26 +0000609int mmc_switch_part(int dev_num, unsigned int part_num)
610{
611 struct mmc *mmc = find_mmc_device(dev_num);
Stephen Warrenf866a462013-06-11 15:14:01 -0600612 int ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000613
614 if (!mmc)
615 return -1;
616
Stephen Warrenf866a462013-06-11 15:14:01 -0600617 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
618 (mmc->part_config & ~PART_ACCESS_MASK)
619 | (part_num & PART_ACCESS_MASK));
Stephen Warrenf866a462013-06-11 15:14:01 -0600620
Peter Bigot6dc93e72014-09-02 18:31:23 -0500621 /*
622 * Set the capacity if the switch succeeded or was intended
623 * to return to representing the raw device.
624 */
Stephen Warren873cc1d2015-12-07 11:38:49 -0700625 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot6dc93e72014-09-02 18:31:23 -0500626 ret = mmc_set_capacity(mmc, part_num);
Stephen Warren873cc1d2015-12-07 11:38:49 -0700627 mmc->block_dev.hwpart = part_num;
628 }
Peter Bigot6dc93e72014-09-02 18:31:23 -0500629
630 return ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000631}
632
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100633int mmc_hwpart_config(struct mmc *mmc,
634 const struct mmc_hwpart_conf *conf,
635 enum mmc_hwpart_conf_mode mode)
636{
637 u8 part_attrs = 0;
638 u32 enh_size_mult;
639 u32 enh_start_addr;
640 u32 gp_size_mult[4];
641 u32 max_enh_size_mult;
642 u32 tot_enh_size_mult = 0;
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100643 u8 wr_rel_set;
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100644 int i, pidx, err;
645 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
646
647 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
648 return -EINVAL;
649
650 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
651 printf("eMMC >= 4.4 required for enhanced user data area\n");
652 return -EMEDIUMTYPE;
653 }
654
655 if (!(mmc->part_support & PART_SUPPORT)) {
656 printf("Card does not support partitioning\n");
657 return -EMEDIUMTYPE;
658 }
659
660 if (!mmc->hc_wp_grp_size) {
661 printf("Card does not define HC WP group size\n");
662 return -EMEDIUMTYPE;
663 }
664
665 /* check partition alignment and total enhanced size */
666 if (conf->user.enh_size) {
667 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
668 conf->user.enh_start % mmc->hc_wp_grp_size) {
669 printf("User data enhanced area not HC WP group "
670 "size aligned\n");
671 return -EINVAL;
672 }
673 part_attrs |= EXT_CSD_ENH_USR;
674 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
675 if (mmc->high_capacity) {
676 enh_start_addr = conf->user.enh_start;
677 } else {
678 enh_start_addr = (conf->user.enh_start << 9);
679 }
680 } else {
681 enh_size_mult = 0;
682 enh_start_addr = 0;
683 }
684 tot_enh_size_mult += enh_size_mult;
685
686 for (pidx = 0; pidx < 4; pidx++) {
687 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
688 printf("GP%i partition not HC WP group size "
689 "aligned\n", pidx+1);
690 return -EINVAL;
691 }
692 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
693 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
694 part_attrs |= EXT_CSD_ENH_GP(pidx);
695 tot_enh_size_mult += gp_size_mult[pidx];
696 }
697 }
698
699 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
700 printf("Card does not support enhanced attribute\n");
701 return -EMEDIUMTYPE;
702 }
703
704 err = mmc_send_ext_csd(mmc, ext_csd);
705 if (err)
706 return err;
707
708 max_enh_size_mult =
709 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
710 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
711 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
712 if (tot_enh_size_mult > max_enh_size_mult) {
713 printf("Total enhanced size exceeds maximum (%u > %u)\n",
714 tot_enh_size_mult, max_enh_size_mult);
715 return -EMEDIUMTYPE;
716 }
717
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100718 /* The default value of EXT_CSD_WR_REL_SET is device
719 * dependent, the values can only be changed if the
720 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
721 * changed only once and before partitioning is completed. */
722 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
723 if (conf->user.wr_rel_change) {
724 if (conf->user.wr_rel_set)
725 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
726 else
727 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
728 }
729 for (pidx = 0; pidx < 4; pidx++) {
730 if (conf->gp_part[pidx].wr_rel_change) {
731 if (conf->gp_part[pidx].wr_rel_set)
732 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
733 else
734 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
735 }
736 }
737
738 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
739 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
740 puts("Card does not support host controlled partition write "
741 "reliability settings\n");
742 return -EMEDIUMTYPE;
743 }
744
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100745 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
746 EXT_CSD_PARTITION_SETTING_COMPLETED) {
747 printf("Card already partitioned\n");
748 return -EPERM;
749 }
750
751 if (mode == MMC_HWPART_CONF_CHECK)
752 return 0;
753
754 /* Partitioning requires high-capacity size definitions */
755 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
756 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
757 EXT_CSD_ERASE_GROUP_DEF, 1);
758
759 if (err)
760 return err;
761
762 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
763
764 /* update erase group size to be high-capacity */
765 mmc->erase_grp_size =
766 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
767
768 }
769
770 /* all OK, write the configuration */
771 for (i = 0; i < 4; i++) {
772 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
773 EXT_CSD_ENH_START_ADDR+i,
774 (enh_start_addr >> (i*8)) & 0xFF);
775 if (err)
776 return err;
777 }
778 for (i = 0; i < 3; i++) {
779 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
780 EXT_CSD_ENH_SIZE_MULT+i,
781 (enh_size_mult >> (i*8)) & 0xFF);
782 if (err)
783 return err;
784 }
785 for (pidx = 0; pidx < 4; pidx++) {
786 for (i = 0; i < 3; i++) {
787 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
788 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
789 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
790 if (err)
791 return err;
792 }
793 }
794 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
795 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
796 if (err)
797 return err;
798
799 if (mode == MMC_HWPART_CONF_SET)
800 return 0;
801
Diego Santa Cruz8dda5b0e2014-12-23 10:50:31 +0100802 /* The WR_REL_SET is a write-once register but shall be
803 * written before setting PART_SETTING_COMPLETED. As it is
804 * write-once we can only write it when completing the
805 * partitioning. */
806 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
807 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
808 EXT_CSD_WR_REL_SET, wr_rel_set);
809 if (err)
810 return err;
811 }
812
Diego Santa Cruzac9da0e2014-12-23 10:50:29 +0100813 /* Setting PART_SETTING_COMPLETED confirms the partition
814 * configuration but it only becomes effective after power
815 * cycle, so we do not adjust the partition related settings
816 * in the mmc struct. */
817
818 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
819 EXT_CSD_PARTITION_SETTING,
820 EXT_CSD_PARTITION_SETTING_COMPLETED);
821 if (err)
822 return err;
823
824 return 0;
825}
826
Thierry Reding48972d92012-01-02 01:15:37 +0000827int mmc_getcd(struct mmc *mmc)
828{
829 int cd;
830
831 cd = board_mmc_getcd(mmc);
832
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000833 if (cd < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200834 if (mmc->cfg->ops->getcd)
835 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000836 else
837 cd = 1;
838 }
Thierry Reding48972d92012-01-02 01:15:37 +0000839
840 return cd;
841}
842
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000843static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-10-30 16:41:01 -0500844{
845 struct mmc_cmd cmd;
846 struct mmc_data data;
847
848 /* Switch the frequency */
849 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
850 cmd.resp_type = MMC_RSP_R1;
851 cmd.cmdarg = (mode << 31) | 0xffffff;
852 cmd.cmdarg &= ~(0xf << (group * 4));
853 cmd.cmdarg |= value << (group * 4);
Andy Fleming272cc702008-10-30 16:41:01 -0500854
855 data.dest = (char *)resp;
856 data.blocksize = 64;
857 data.blocks = 1;
858 data.flags = MMC_DATA_READ;
859
860 return mmc_send_cmd(mmc, &cmd, &data);
861}
862
863
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000864static int sd_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500865{
866 int err;
867 struct mmc_cmd cmd;
Anton staaff781dd32011-10-03 13:54:59 +0000868 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
869 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500870 struct mmc_data data;
871 int timeout;
872
873 mmc->card_caps = 0;
874
Thomas Choud52ebf12010-12-24 13:12:21 +0000875 if (mmc_host_is_spi(mmc))
876 return 0;
877
Andy Fleming272cc702008-10-30 16:41:01 -0500878 /* Read the SCR to find out if this card supports higher speeds */
879 cmd.cmdidx = MMC_CMD_APP_CMD;
880 cmd.resp_type = MMC_RSP_R1;
881 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500882
883 err = mmc_send_cmd(mmc, &cmd, NULL);
884
885 if (err)
886 return err;
887
888 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
889 cmd.resp_type = MMC_RSP_R1;
890 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500891
892 timeout = 3;
893
894retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000895 data.dest = (char *)scr;
Andy Fleming272cc702008-10-30 16:41:01 -0500896 data.blocksize = 8;
897 data.blocks = 1;
898 data.flags = MMC_DATA_READ;
899
900 err = mmc_send_cmd(mmc, &cmd, &data);
901
902 if (err) {
903 if (timeout--)
904 goto retry_scr;
905
906 return err;
907 }
908
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300909 mmc->scr[0] = __be32_to_cpu(scr[0]);
910 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500911
912 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng53e8e402016-03-17 21:53:13 -0700913 case 0:
914 mmc->version = SD_VERSION_1_0;
915 break;
916 case 1:
917 mmc->version = SD_VERSION_1_10;
918 break;
919 case 2:
920 mmc->version = SD_VERSION_2;
921 if ((mmc->scr[0] >> 15) & 0x1)
922 mmc->version = SD_VERSION_3;
923 break;
924 default:
925 mmc->version = SD_VERSION_1_0;
926 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500927 }
928
Alagu Sankarb44c7082010-05-12 15:08:24 +0530929 if (mmc->scr[0] & SD_DATA_4BIT)
930 mmc->card_caps |= MMC_MODE_4BIT;
931
Andy Fleming272cc702008-10-30 16:41:01 -0500932 /* Version 1.0 doesn't support switching */
933 if (mmc->version == SD_VERSION_1_0)
934 return 0;
935
936 timeout = 4;
937 while (timeout--) {
938 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaff781dd32011-10-03 13:54:59 +0000939 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500940
941 if (err)
942 return err;
943
944 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300945 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500946 break;
947 }
948
Andy Fleming272cc702008-10-30 16:41:01 -0500949 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300950 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500951 return 0;
952
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000953 /*
954 * If the host doesn't support SD_HIGHSPEED, do not switch card to
955 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
956 * This can avoid furthur problem when the card runs in different
957 * mode between the host.
958 */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200959 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
960 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000961 return 0;
962
Anton staaff781dd32011-10-03 13:54:59 +0000963 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500964
965 if (err)
966 return err;
967
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300968 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-10-30 16:41:01 -0500969 mmc->card_caps |= MMC_MODE_HS;
970
971 return 0;
972}
973
974/* frequency bases */
975/* divided by 10 to be nice to platforms without floating point */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000976static const int fbase[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500977 10000,
978 100000,
979 1000000,
980 10000000,
981};
982
983/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
984 * to platforms without floating point.
985 */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000986static const int multipliers[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500987 0, /* reserved */
988 10,
989 12,
990 13,
991 15,
992 20,
993 25,
994 30,
995 35,
996 40,
997 45,
998 50,
999 55,
1000 60,
1001 70,
1002 80,
1003};
1004
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001005static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001006{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001007 if (mmc->cfg->ops->set_ios)
1008 mmc->cfg->ops->set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001009}
1010
1011void mmc_set_clock(struct mmc *mmc, uint clock)
1012{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001013 if (clock > mmc->cfg->f_max)
1014 clock = mmc->cfg->f_max;
Andy Fleming272cc702008-10-30 16:41:01 -05001015
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001016 if (clock < mmc->cfg->f_min)
1017 clock = mmc->cfg->f_min;
Andy Fleming272cc702008-10-30 16:41:01 -05001018
1019 mmc->clock = clock;
1020
1021 mmc_set_ios(mmc);
1022}
1023
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001024static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -05001025{
1026 mmc->bus_width = width;
1027
1028 mmc_set_ios(mmc);
1029}
1030
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001031static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001032{
Stephen Warrenf866a462013-06-11 15:14:01 -06001033 int err, i;
Andy Fleming272cc702008-10-30 16:41:01 -05001034 uint mult, freq;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001035 u64 cmult, csize, capacity;
Andy Fleming272cc702008-10-30 16:41:01 -05001036 struct mmc_cmd cmd;
Simon Glass8bfa1952013-04-03 08:54:30 +00001037 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1038 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +00001039 int timeout = 1000;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001040 bool has_parts = false;
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001041 bool part_completed;
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;
Jaehoon Chung64f4a612013-01-29 19:31:16 +00001230 }
1231
Diego Santa Cruz8a0cf492014-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 Cruz0c453bb2014-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 Cruz8a0cf492014-12-23 10:50:27 +01001245 if (part_completed &&
1246 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruz0c453bb2014-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 Cruz8a0cf492014-12-23 10:50:27 +01001255 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001256 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruz8a0cf492014-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 Cruz0c453bb2014-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 Cruzf8e89d62014-12-23 10:50:21 +01001265 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001266 }
1267
Diego Santa Cruz8a0cf492014-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 Cruza7f852b2014-12-23 10:50:22 +01001284
Lei Wene6f99a52011-06-22 17:03:31 +00001285 /*
Oliver Metz1937e5a2013-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 Wene6f99a52011-06-22 17:03:31 +00001289 */
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001290 if (part_completed)
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001291 has_parts = true;
Oliver Metz1937e5a2013-10-01 20:32:07 +02001292 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001293 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1294 has_parts = true;
1295 if (has_parts) {
Oliver Metz1937e5a2013-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 Petermaier021a8052014-08-08 09:47:22 +02001301 else
1302 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001303 }
Oliver Metz1937e5a2013-10-01 20:32:07 +02001304
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001305 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001306 /* Read out group size from ext_csd */
Lei Wen0560db12011-10-03 20:35:10 +00001307 mmc->erase_grp_size =
Diego Santa Cruza4ff9f82014-12-23 10:50:24 +01001308 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebeld7b29122014-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 Cruz8a0cf492014-12-23 10:50:27 +01001314 if (mmc->high_capacity && part_completed) {
Markus Niebeld7b29122014-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 Glass8bfa1952013-04-03 08:54:30 +00001322 } else {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001323 /* Calculate the group size from the csd value. */
Lei Wene6f99a52011-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 Cruz037dc0a2014-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 Cruz9e41a002014-12-23 10:50:33 +01001334
1335 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301336 }
1337
Stephen Warren873cc1d2015-12-07 11:38:49 -07001338 err = mmc_set_capacity(mmc, mmc->block_dev.hwpart);
Stephen Warrenf866a462013-06-11 15:14:01 -06001339 if (err)
1340 return err;
1341
Andy Fleming272cc702008-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 Antoniou93bfd612014-03-11 19:34:20 +02001351 mmc->card_caps &= mmc->cfg->host_caps;
Andy Fleming272cc702008-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 Fleming272cc702008-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 Fleming272cc702008-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 Chungad5fd922012-03-26 21:16:03 +00001374 mmc->tran_speed = 50000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001375 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001376 mmc->tran_speed = 25000000;
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -06001377 } else if (mmc->version >= MMC_VERSION_4) {
1378 /* Only version 4 of MMC supports wider bus widths */
Andy Fleming7798f6d2012-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 Chungd22e3d42014-05-16 13:59:54 +09001383 EXT_CSD_DDR_BUS_WIDTH_8,
1384 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Fleming7798f6d2012-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 Gabbasov786e8f82014-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 Fleming7798f6d2012-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 Chungd22e3d42014-05-16 13:59:54 +09001402 8, 4, 8, 4, 1,
Andy Fleming7798f6d2012-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 Gabbasov786e8f82014-12-01 06:59:09 -06001407 unsigned int caps = ext_to_hostcaps[extw];
Andy Fleming7798f6d2012-10-31 19:02:38 +00001408
1409 /*
Andrew Gabbasovbf477072014-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 Gabbasov786e8f82014-12-01 06:59:09 -06001422 * Check to make sure the card and controller support
1423 * these capabilities
Andy Fleming7798f6d2012-10-31 19:02:38 +00001424 */
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001425 if ((mmc->card_caps & caps) != caps)
Andy Fleming7798f6d2012-10-31 19:02:38 +00001426 continue;
1427
Andy Fleming272cc702008-10-30 16:41:01 -05001428 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001429 EXT_CSD_BUS_WIDTH, extw);
Andy Fleming272cc702008-10-30 16:41:01 -05001430
1431 if (err)
Lei Wen41378942011-10-03 20:35:11 +00001432 continue;
Andy Fleming272cc702008-10-30 16:41:01 -05001433
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001434 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Fleming7798f6d2012-10-31 19:02:38 +00001435 mmc_set_bus_width(mmc, widths[idx]);
Andy Fleming272cc702008-10-30 16:41:01 -05001436
Lei Wen41378942011-10-03 20:35:11 +00001437 err = mmc_send_ext_csd(mmc, test_csd);
Andy Fleming272cc702008-10-30 16:41:01 -05001438
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001439 if (err)
1440 continue;
1441
1442 /* 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 Wen41378942011-10-03 20:35:11 +00001453 break;
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001454 else
1455 err = SWITCH_ERR;
Andy Fleming272cc702008-10-30 16:41:01 -05001456 }
1457
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001458 if (err)
1459 return err;
1460
Andy Fleming272cc702008-10-30 16:41:01 -05001461 if (mmc->card_caps & MMC_MODE_HS) {
1462 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001463 mmc->tran_speed = 52000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001464 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001465 mmc->tran_speed = 26000000;
1466 }
Andy Fleming272cc702008-10-30 16:41:01 -05001467 }
1468
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001469 mmc_set_clock(mmc, mmc->tran_speed);
1470
Andrew Gabbasov5af8f452014-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 Fleming272cc702008-10-30 16:41:01 -05001477 /* fill in device description */
1478 mmc->block_dev.lun = 0;
Stephen Warren873cc1d2015-12-07 11:38:49 -07001479 mmc->block_dev.hwpart = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001480 mmc->block_dev.type = 0;
1481 mmc->block_dev.blksz = mmc->read_bl_len;
Egbert Eich0472fbf2013-04-09 21:11:56 +00001482 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
Rabin Vincent9b1f9422009-04-05 13:30:54 +05301483 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsfc011f62015-12-04 23:27:40 +01001484#if !defined(CONFIG_SPL_BUILD) || \
1485 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1486 !defined(CONFIG_USE_TINY_PRINTF))
Taylor Huttbabce5f2012-10-20 17:15:59 +00001487 sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1488 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1489 (mmc->cid[3] >> 16) & 0xffff);
1490 sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1491 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1492 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1493 (mmc->cid[2] >> 24) & 0xff);
1494 sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1495 (mmc->cid[2] >> 16) & 0xf);
Paul Burton56196822013-09-04 16:12:25 +01001496#else
1497 mmc->block_dev.vendor[0] = 0;
1498 mmc->block_dev.product[0] = 0;
1499 mmc->block_dev.revision[0] = 0;
1500#endif
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001501#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glass3e8bd462016-02-29 15:25:48 -07001502 part_init(&mmc->block_dev);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001503#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001504
1505 return 0;
1506}
1507
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001508static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001509{
1510 struct mmc_cmd cmd;
1511 int err;
1512
1513 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1514 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001515 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Fleming272cc702008-10-30 16:41:01 -05001516 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001517
1518 err = mmc_send_cmd(mmc, &cmd, NULL);
1519
1520 if (err)
1521 return err;
1522
Rabin Vincent998be3d2009-04-05 13:30:56 +05301523 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -05001524 return UNUSABLE_ERR;
1525 else
1526 mmc->version = SD_VERSION_2;
1527
1528 return 0;
1529}
1530
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001531/* not used any more */
1532int __deprecated mmc_register(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001533{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001534#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1535 printf("%s is deprecated! use mmc_create() instead.\n", __func__);
1536#endif
1537 return -1;
1538}
1539
1540struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
1541{
1542 struct mmc *mmc;
1543
1544 /* quick validation */
1545 if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1546 cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1547 return NULL;
1548
1549 mmc = calloc(1, sizeof(*mmc));
1550 if (mmc == NULL)
1551 return NULL;
1552
1553 mmc->cfg = cfg;
1554 mmc->priv = priv;
1555
1556 /* the following chunk was mmc_register() */
1557
Markus Niebelab711882013-12-16 13:40:46 +01001558 /* Setup dsr related values */
1559 mmc->dsr_imp = 0;
1560 mmc->dsr = 0xffffffff;
Andy Fleming272cc702008-10-30 16:41:01 -05001561 /* Setup the universal parts of the block interface just once */
1562 mmc->block_dev.if_type = IF_TYPE_MMC;
Simon Glassbcce53d2016-02-29 15:25:51 -07001563 mmc->block_dev.devnum = cur_dev_num++;
Andy Fleming272cc702008-10-30 16:41:01 -05001564 mmc->block_dev.removable = 1;
1565 mmc->block_dev.block_read = mmc_bread;
1566 mmc->block_dev.block_write = mmc_bwrite;
Lei Wene6f99a52011-06-22 17:03:31 +00001567 mmc->block_dev.block_erase = mmc_berase;
Andy Fleming272cc702008-10-30 16:41:01 -05001568
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001569 /* setup initial part type */
1570 mmc->block_dev.part_type = mmc->cfg->part_type;
Andy Fleming272cc702008-10-30 16:41:01 -05001571
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001572 INIT_LIST_HEAD(&mmc->link);
Andy Fleming272cc702008-10-30 16:41:01 -05001573
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001574 list_add_tail(&mmc->link, &mmc_devices);
1575
1576 return mmc;
1577}
1578
1579void mmc_destroy(struct mmc *mmc)
1580{
1581 /* only freeing memory for now */
1582 free(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001583}
1584
Simon Glass3c457f42016-05-01 11:36:15 -06001585static int mmc_get_dev(int dev, struct blk_desc **descp)
Simon Glass663acab2016-05-01 11:36:07 -06001586{
1587 struct mmc *mmc = find_mmc_device(dev);
1588 int ret;
1589
1590 if (!mmc)
1591 return -ENODEV;
1592 ret = mmc_init(mmc);
1593 if (ret)
1594 return ret;
1595
1596 *descp = &mmc->block_dev;
1597
1598 return 0;
1599}
1600
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001601/* board-specific MMC power initializations. */
1602__weak void board_mmc_power_init(void)
1603{
1604}
1605
Che-Liang Chioue9550442012-11-28 15:21:13 +00001606int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001607{
Macpaul Linafd59322011-11-14 23:35:39 +00001608 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001609
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001610 /* we pretend there's no card when init is NULL */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001611 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Reding48972d92012-01-02 01:15:37 +00001612 mmc->has_init = 0;
Paul Burton56196822013-09-04 16:12:25 +01001613#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Reding48972d92012-01-02 01:15:37 +00001614 printf("MMC: no card present\n");
Paul Burton56196822013-09-04 16:12:25 +01001615#endif
Thierry Reding48972d92012-01-02 01:15:37 +00001616 return NO_CARD_ERR;
1617 }
1618
Lei Wenbc897b12011-05-02 16:26:26 +00001619 if (mmc->has_init)
1620 return 0;
1621
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001622#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1623 mmc_adapter_card_type_ident();
1624#endif
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001625 board_mmc_power_init();
1626
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001627 /* made sure it's not NULL earlier */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001628 err = mmc->cfg->ops->init(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001629
1630 if (err)
1631 return err;
1632
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001633 mmc->ddr_mode = 0;
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001634 mmc_set_bus_width(mmc, 1);
1635 mmc_set_clock(mmc, 1);
1636
Andy Fleming272cc702008-10-30 16:41:01 -05001637 /* Reset the Card */
1638 err = mmc_go_idle(mmc);
1639
1640 if (err)
1641 return err;
1642
Lei Wenbc897b12011-05-02 16:26:26 +00001643 /* The internal partition reset to user partition(0) at every CMD0*/
Stephen Warren873cc1d2015-12-07 11:38:49 -07001644 mmc->block_dev.hwpart = 0;
Lei Wenbc897b12011-05-02 16:26:26 +00001645
Andy Fleming272cc702008-10-30 16:41:01 -05001646 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001647 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001648
Andy Fleming272cc702008-10-30 16:41:01 -05001649 /* Now try to get the SD card's operating condition */
1650 err = sd_send_op_cond(mmc);
1651
1652 /* If the command timed out, we check for an MMC card */
1653 if (err == TIMEOUT) {
1654 err = mmc_send_op_cond(mmc);
1655
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001656 if (err) {
Paul Burton56196822013-09-04 16:12:25 +01001657#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001658 printf("Card did not respond to voltage select!\n");
Paul Burton56196822013-09-04 16:12:25 +01001659#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001660 return UNUSABLE_ERR;
1661 }
1662 }
1663
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001664 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001665 mmc->init_in_progress = 1;
1666
1667 return err;
1668}
1669
1670static int mmc_complete_init(struct mmc *mmc)
1671{
1672 int err = 0;
1673
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001674 mmc->init_in_progress = 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001675 if (mmc->op_cond_pending)
1676 err = mmc_complete_op_cond(mmc);
1677
1678 if (!err)
1679 err = mmc_startup(mmc);
Lei Wenbc897b12011-05-02 16:26:26 +00001680 if (err)
1681 mmc->has_init = 0;
1682 else
1683 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001684 return err;
1685}
1686
1687int mmc_init(struct mmc *mmc)
1688{
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001689 int err = 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001690 unsigned start;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001691
1692 if (mmc->has_init)
1693 return 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001694
1695 start = get_timer(0);
1696
Che-Liang Chioue9550442012-11-28 15:21:13 +00001697 if (!mmc->init_in_progress)
1698 err = mmc_start_init(mmc);
1699
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001700 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001701 err = mmc_complete_init(mmc);
1702 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
Lei Wenbc897b12011-05-02 16:26:26 +00001703 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001704}
1705
Markus Niebelab711882013-12-16 13:40:46 +01001706int mmc_set_dsr(struct mmc *mmc, u16 val)
1707{
1708 mmc->dsr = val;
1709 return 0;
1710}
1711
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02001712/* CPU-specific MMC initializations */
1713__weak int cpu_mmc_init(bd_t *bis)
Andy Fleming272cc702008-10-30 16:41:01 -05001714{
1715 return -1;
1716}
1717
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +02001718/* board-specific MMC initializations. */
1719__weak int board_mmc_init(bd_t *bis)
1720{
1721 return -1;
1722}
Andy Fleming272cc702008-10-30 16:41:01 -05001723
Paul Burton56196822013-09-04 16:12:25 +01001724#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1725
Andy Fleming272cc702008-10-30 16:41:01 -05001726void print_mmc_devices(char separator)
1727{
1728 struct mmc *m;
1729 struct list_head *entry;
Przemyslaw Marczak34dd9282015-02-20 12:29:27 +01001730 char *mmc_type;
Andy Fleming272cc702008-10-30 16:41:01 -05001731
1732 list_for_each(entry, &mmc_devices) {
1733 m = list_entry(entry, struct mmc, link);
1734
Przemyslaw Marczak34dd9282015-02-20 12:29:27 +01001735 if (m->has_init)
1736 mmc_type = IS_SD(m) ? "SD" : "eMMC";
1737 else
1738 mmc_type = NULL;
1739
Simon Glassbcce53d2016-02-29 15:25:51 -07001740 printf("%s: %d", m->cfg->name, m->block_dev.devnum);
Przemyslaw Marczak34dd9282015-02-20 12:29:27 +01001741 if (mmc_type)
1742 printf(" (%s)", mmc_type);
Andy Fleming272cc702008-10-30 16:41:01 -05001743
Lubomir Popove75eaf12014-11-11 12:25:42 +02001744 if (entry->next != &mmc_devices) {
1745 printf("%c", separator);
1746 if (separator != '\n')
1747 puts (" ");
1748 }
Andy Fleming272cc702008-10-30 16:41:01 -05001749 }
1750
1751 printf("\n");
1752}
1753
Paul Burton56196822013-09-04 16:12:25 +01001754#else
1755void print_mmc_devices(char separator) { }
1756#endif
1757
Lei Wenea6ebe22011-05-02 16:26:25 +00001758int get_mmc_num(void)
1759{
1760 return cur_dev_num;
1761}
1762
Che-Liang Chioue9550442012-11-28 15:21:13 +00001763void mmc_set_preinit(struct mmc *mmc, int preinit)
1764{
1765 mmc->preinit = preinit;
1766}
1767
1768static void do_preinit(void)
1769{
1770 struct mmc *m;
1771 struct list_head *entry;
1772
1773 list_for_each(entry, &mmc_devices) {
1774 m = list_entry(entry, struct mmc, link);
1775
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001776#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1777 mmc_set_preinit(m, 1);
1778#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00001779 if (m->preinit)
1780 mmc_start_init(m);
1781 }
1782}
1783
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001784#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1785static int mmc_probe(bd_t *bis)
1786{
1787 return 0;
1788}
1789#elif defined(CONFIG_DM_MMC)
1790static int mmc_probe(bd_t *bis)
1791{
Simon Glass4a1db6d2015-12-29 05:22:49 -07001792 int ret, i;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001793 struct uclass *uc;
Simon Glass4a1db6d2015-12-29 05:22:49 -07001794 struct udevice *dev;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001795
1796 ret = uclass_get(UCLASS_MMC, &uc);
1797 if (ret)
1798 return ret;
1799
Simon Glass4a1db6d2015-12-29 05:22:49 -07001800 /*
1801 * Try to add them in sequence order. Really with driver model we
1802 * should allow holes, but the current MMC list does not allow that.
1803 * So if we request 0, 1, 3 we will get 0, 1, 2.
1804 */
1805 for (i = 0; ; i++) {
1806 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1807 if (ret == -ENODEV)
1808 break;
1809 }
1810 uclass_foreach_dev(dev, uc) {
1811 ret = device_probe(dev);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001812 if (ret)
Simon Glass4a1db6d2015-12-29 05:22:49 -07001813 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001814 }
1815
1816 return 0;
1817}
1818#else
1819static int mmc_probe(bd_t *bis)
1820{
1821 if (board_mmc_init(bis) < 0)
1822 cpu_mmc_init(bis);
1823
1824 return 0;
1825}
1826#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00001827
Andy Fleming272cc702008-10-30 16:41:01 -05001828int mmc_initialize(bd_t *bis)
1829{
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001830 static int initialized = 0;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001831 int ret;
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001832 if (initialized) /* Avoid initializing mmc multiple times */
1833 return 0;
1834 initialized = 1;
1835
Andy Fleming272cc702008-10-30 16:41:01 -05001836 INIT_LIST_HEAD (&mmc_devices);
1837 cur_dev_num = 0;
1838
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001839 ret = mmc_probe(bis);
1840 if (ret)
1841 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05001842
Ying Zhangbb0dc102013-08-16 15:16:11 +08001843#ifndef CONFIG_SPL_BUILD
Andy Fleming272cc702008-10-30 16:41:01 -05001844 print_mmc_devices(',');
Ying Zhangbb0dc102013-08-16 15:16:11 +08001845#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001846
Che-Liang Chioue9550442012-11-28 15:21:13 +00001847 do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05001848 return 0;
1849}
Amar3690d6d2013-04-27 11:42:58 +05301850
1851#ifdef CONFIG_SUPPORT_EMMC_BOOT
1852/*
1853 * This function changes the size of boot partition and the size of rpmb
1854 * partition present on EMMC devices.
1855 *
1856 * Input Parameters:
1857 * struct *mmc: pointer for the mmc device strcuture
1858 * bootsize: size of boot partition
1859 * rpmbsize: size of rpmb partition
1860 *
1861 * Returns 0 on success.
1862 */
1863
1864int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1865 unsigned long rpmbsize)
1866{
1867 int err;
1868 struct mmc_cmd cmd;
1869
1870 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1871 cmd.cmdidx = MMC_CMD_RES_MAN;
1872 cmd.resp_type = MMC_RSP_R1b;
1873 cmd.cmdarg = MMC_CMD62_ARG1;
1874
1875 err = mmc_send_cmd(mmc, &cmd, NULL);
1876 if (err) {
1877 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1878 return err;
1879 }
1880
1881 /* Boot partition changing mode */
1882 cmd.cmdidx = MMC_CMD_RES_MAN;
1883 cmd.resp_type = MMC_RSP_R1b;
1884 cmd.cmdarg = MMC_CMD62_ARG2;
1885
1886 err = mmc_send_cmd(mmc, &cmd, NULL);
1887 if (err) {
1888 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1889 return err;
1890 }
1891 /* boot partition size is multiple of 128KB */
1892 bootsize = (bootsize * 1024) / 128;
1893
1894 /* Arg: boot partition size */
1895 cmd.cmdidx = MMC_CMD_RES_MAN;
1896 cmd.resp_type = MMC_RSP_R1b;
1897 cmd.cmdarg = bootsize;
1898
1899 err = mmc_send_cmd(mmc, &cmd, NULL);
1900 if (err) {
1901 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1902 return err;
1903 }
1904 /* RPMB partition size is multiple of 128KB */
1905 rpmbsize = (rpmbsize * 1024) / 128;
1906 /* Arg: RPMB partition size */
1907 cmd.cmdidx = MMC_CMD_RES_MAN;
1908 cmd.resp_type = MMC_RSP_R1b;
1909 cmd.cmdarg = rpmbsize;
1910
1911 err = mmc_send_cmd(mmc, &cmd, NULL);
1912 if (err) {
1913 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1914 return err;
1915 }
1916 return 0;
1917}
1918
1919/*
Tom Rini5a99b9d2014-02-05 10:24:22 -05001920 * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1921 * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1922 * and BOOT_MODE.
1923 *
1924 * Returns 0 on success.
1925 */
1926int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1927{
1928 int err;
1929
1930 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1931 EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1932 EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1933 EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1934
1935 if (err)
1936 return err;
1937 return 0;
1938}
1939
1940/*
Tom Rini792970b2014-02-05 10:24:21 -05001941 * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1942 * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1943 * PARTITION_ACCESS.
1944 *
1945 * Returns 0 on success.
1946 */
1947int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1948{
1949 int err;
1950
1951 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1952 EXT_CSD_BOOT_ACK(ack) |
1953 EXT_CSD_BOOT_PART_NUM(part_num) |
1954 EXT_CSD_PARTITION_ACCESS(access));
1955
1956 if (err)
1957 return err;
1958 return 0;
1959}
Tom Rini33ace362014-02-07 14:15:20 -05001960
1961/*
1962 * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1963 * for enable. Note that this is a write-once field for non-zero values.
1964 *
1965 * Returns 0 on success.
1966 */
1967int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1968{
1969 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1970 enable);
1971}
Amar3690d6d2013-04-27 11:42:58 +05301972#endif
Simon Glass663acab2016-05-01 11:36:07 -06001973
1974U_BOOT_LEGACY_BLK(mmc) = {
1975 .if_typename = "mmc",
1976 .if_type = IF_TYPE_MMC,
1977 .max_devs = -1,
Simon Glass3c457f42016-05-01 11:36:15 -06001978 .get_dev = mmc_get_dev,
Simon Glass663acab2016-05-01 11:36:07 -06001979};