blob: 4bfc6bf441aef9255aa543225b389e8dac4522df [file] [log] [blame]
Andy Flemingad347bb2008-10-30 16:41:01 -05001/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Flemingad347bb2008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -060013#include <dm.h>
14#include <dm/device-internal.h>
Stephen Warrenbf0c7852014-05-23 12:47:06 -060015#include <errno.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050016#include <mmc.h>
17#include <part.h>
Peng Fan15305962016-10-11 15:08:43 +080018#include <power/regulator.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050019#include <malloc.h>
Simon Glass2dd337a2015-09-02 17:24:58 -060020#include <memalign.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050021#include <linux/list.h>
Rabin Vincent69d4e2c2009-04-05 13:30:54 +053022#include <div64.h>
Paul Burton8d30cc92013-09-09 15:30:26 +010023#include "mmc_private.h"
Andy Flemingad347bb2008-10-30 16:41:01 -050024
Peng Fanb3fcf1e2016-09-01 11:13:38 +080025static const unsigned int sd_au_size[] = {
26 0, SZ_16K / 512, SZ_32K / 512,
27 SZ_64K / 512, SZ_128K / 512, SZ_256K / 512,
28 SZ_512K / 512, SZ_1M / 512, SZ_2M / 512,
29 SZ_4M / 512, SZ_8M / 512, (SZ_8M + SZ_4M) / 512,
30 SZ_16M / 512, (SZ_16M + SZ_8M) / 512, SZ_32M / 512, SZ_64M / 512,
31};
32
Marek Vasutf537e392016-12-01 02:06:33 +010033#if CONFIG_IS_ENABLED(MMC_TINY)
34static struct mmc mmc_static;
35struct mmc *find_mmc_device(int dev_num)
36{
37 return &mmc_static;
38}
39
40void mmc_do_preinit(void)
41{
42 struct mmc *m = &mmc_static;
43#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
44 mmc_set_preinit(m, 1);
45#endif
46 if (m->preinit)
47 mmc_start_init(m);
48}
49
50struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
51{
52 return &mmc->block_dev;
53}
54#endif
55
Simon Glasseba48f92017-07-29 11:35:31 -060056#if !CONFIG_IS_ENABLED(DM_MMC)
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +020057__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanov020f2612012-12-03 02:19:46 +000058{
59 return -1;
60}
61
62int mmc_getwp(struct mmc *mmc)
63{
64 int wp;
65
66 wp = board_mmc_getwp(mmc);
67
Peter Korsgaardf7b15102013-03-21 04:00:03 +000068 if (wp < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +020069 if (mmc->cfg->ops->getwp)
70 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +000071 else
72 wp = 0;
73 }
Nikita Kiryanov020f2612012-12-03 02:19:46 +000074
75 return wp;
76}
77
Jeroen Hofstee47726302014-07-10 22:46:28 +020078__weak int board_mmc_getcd(struct mmc *mmc)
79{
Stefano Babic6e00edf2010-02-05 15:04:43 +010080 return -1;
81}
Simon Glass394dfc02016-06-12 23:30:22 -060082#endif
Stefano Babic6e00edf2010-02-05 15:04:43 +010083
Simon Glassb23d96e2016-06-12 23:30:20 -060084#ifdef CONFIG_MMC_TRACE
85void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
Andy Flemingad347bb2008-10-30 16:41:01 -050086{
Simon Glassb23d96e2016-06-12 23:30:20 -060087 printf("CMD_SEND:%d\n", cmd->cmdidx);
88 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
89}
Marek Vasutdccb6082012-03-15 18:41:35 +000090
Simon Glassb23d96e2016-06-12 23:30:20 -060091void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
92{
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000093 int i;
94 u8 *ptr;
95
Bin Meng8d1ad1e2016-03-17 21:53:14 -070096 if (ret) {
97 printf("\t\tRET\t\t\t %d\n", ret);
98 } else {
99 switch (cmd->resp_type) {
100 case MMC_RSP_NONE:
101 printf("\t\tMMC_RSP_NONE\n");
102 break;
103 case MMC_RSP_R1:
104 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
105 cmd->response[0]);
106 break;
107 case MMC_RSP_R1b:
108 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
109 cmd->response[0]);
110 break;
111 case MMC_RSP_R2:
112 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
113 cmd->response[0]);
114 printf("\t\t \t\t 0x%08X \n",
115 cmd->response[1]);
116 printf("\t\t \t\t 0x%08X \n",
117 cmd->response[2]);
118 printf("\t\t \t\t 0x%08X \n",
119 cmd->response[3]);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000120 printf("\n");
Bin Meng8d1ad1e2016-03-17 21:53:14 -0700121 printf("\t\t\t\t\tDUMPING DATA\n");
122 for (i = 0; i < 4; i++) {
123 int j;
124 printf("\t\t\t\t\t%03d - ", i*4);
125 ptr = (u8 *)&cmd->response[i];
126 ptr += 3;
127 for (j = 0; j < 4; j++)
128 printf("%02X ", *ptr--);
129 printf("\n");
130 }
131 break;
132 case MMC_RSP_R3:
133 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
134 cmd->response[0]);
135 break;
136 default:
137 printf("\t\tERROR MMC rsp not supported\n");
138 break;
Bin Meng4a4ef872016-03-17 21:53:13 -0700139 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000140 }
Simon Glassb23d96e2016-06-12 23:30:20 -0600141}
142
143void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
144{
145 int status;
146
147 status = (cmd->response[0] & MMC_STATUS_CURR_STATE) >> 9;
148 printf("CURR STATE:%d\n", status);
149}
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000150#endif
Simon Glassb23d96e2016-06-12 23:30:20 -0600151
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +0200152#if CONFIG_IS_ENABLED(MMC_VERBOSE) || defined(DEBUG)
153const char *mmc_mode_name(enum bus_mode mode)
154{
155 static const char *const names[] = {
156 [MMC_LEGACY] = "MMC legacy",
157 [SD_LEGACY] = "SD Legacy",
158 [MMC_HS] = "MMC High Speed (26MHz)",
159 [SD_HS] = "SD High Speed (50MHz)",
160 [UHS_SDR12] = "UHS SDR12 (25MHz)",
161 [UHS_SDR25] = "UHS SDR25 (50MHz)",
162 [UHS_SDR50] = "UHS SDR50 (100MHz)",
163 [UHS_SDR104] = "UHS SDR104 (208MHz)",
164 [UHS_DDR50] = "UHS DDR50 (50MHz)",
165 [MMC_HS_52] = "MMC High Speed (52MHz)",
166 [MMC_DDR_52] = "MMC DDR52 (52MHz)",
167 [MMC_HS_200] = "HS200 (200MHz)",
168 };
169
170 if (mode >= MMC_MODES_END)
171 return "Unknown mode";
172 else
173 return names[mode];
174}
175#endif
176
177static int mmc_select_mode(struct mmc *mmc, enum bus_mode mode)
178{
179 mmc->selected_mode = mode;
180 debug("selecting mode %s (freq : %d MHz)\n", mmc_mode_name(mode),
181 mmc->tran_speed / 1000000);
182 return 0;
183}
184
Simon Glasseba48f92017-07-29 11:35:31 -0600185#if !CONFIG_IS_ENABLED(DM_MMC)
Simon Glassb23d96e2016-06-12 23:30:20 -0600186int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
187{
188 int ret;
189
190 mmmc_trace_before_send(mmc, cmd);
191 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
192 mmmc_trace_after_send(mmc, cmd, ret);
193
Marek Vasutdccb6082012-03-15 18:41:35 +0000194 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500195}
Simon Glass394dfc02016-06-12 23:30:22 -0600196#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500197
Paul Burton8d30cc92013-09-09 15:30:26 +0100198int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000199{
200 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000201 int err, retries = 5;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000202
203 cmd.cmdidx = MMC_CMD_SEND_STATUS;
204 cmd.resp_type = MMC_RSP_R1;
Marek Vasutc4427392011-08-10 09:24:48 +0200205 if (!mmc_host_is_spi(mmc))
206 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000207
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500208 while (1) {
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000209 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-02-05 22:29:12 +0000210 if (!err) {
211 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
212 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
213 MMC_STATE_PRG)
214 break;
215 else if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100216#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzke31789322012-02-05 22:29:12 +0000217 printf("Status Error: 0x%08X\n",
218 cmd.response[0]);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100219#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +0900220 return -ECOMM;
Jan Kloetzke31789322012-02-05 22:29:12 +0000221 }
222 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000223 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000224
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500225 if (timeout-- <= 0)
226 break;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000227
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500228 udelay(1000);
229 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000230
Simon Glassb23d96e2016-06-12 23:30:20 -0600231 mmc_trace_state(mmc, &cmd);
Jongman Heo1be00d92012-06-03 21:32:13 +0000232 if (timeout <= 0) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100233#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000234 printf("Timeout waiting card ready\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100235#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +0900236 return -ETIMEDOUT;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000237 }
238
239 return 0;
240}
241
Paul Burton8d30cc92013-09-09 15:30:26 +0100242int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Flemingad347bb2008-10-30 16:41:01 -0500243{
244 struct mmc_cmd cmd;
245
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -0600246 if (mmc->ddr_mode)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900247 return 0;
248
Andy Flemingad347bb2008-10-30 16:41:01 -0500249 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
250 cmd.resp_type = MMC_RSP_R1;
251 cmd.cmdarg = len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500252
253 return mmc_send_cmd(mmc, &cmd, NULL);
254}
255
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200256static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillips87ea3892012-10-29 13:34:43 +0000257 lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500258{
259 struct mmc_cmd cmd;
260 struct mmc_data data;
261
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700262 if (blkcnt > 1)
263 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
264 else
265 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500266
267 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700268 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500269 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700270 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500271
272 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500273
274 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700275 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500276 data.blocksize = mmc->read_bl_len;
277 data.flags = MMC_DATA_READ;
278
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700279 if (mmc_send_cmd(mmc, &cmd, &data))
280 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500281
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700282 if (blkcnt > 1) {
283 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
284 cmd.cmdarg = 0;
285 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700286 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100287#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700288 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100289#endif
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700290 return 0;
291 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500292 }
293
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700294 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500295}
296
Simon Glass5f4bd8c2017-07-04 13:31:19 -0600297#if CONFIG_IS_ENABLED(BLK)
Simon Glass62e293a2016-06-12 23:30:15 -0600298ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
Simon Glass59bc6f22016-05-01 13:52:41 -0600299#else
Simon Glass62e293a2016-06-12 23:30:15 -0600300ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
301 void *dst)
Simon Glass59bc6f22016-05-01 13:52:41 -0600302#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500303{
Simon Glass5f4bd8c2017-07-04 13:31:19 -0600304#if CONFIG_IS_ENABLED(BLK)
Simon Glass59bc6f22016-05-01 13:52:41 -0600305 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
306#endif
Simon Glass2f26fff2016-02-29 15:25:51 -0700307 int dev_num = block_dev->devnum;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700308 int err;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700309 lbaint_t cur, blocks_todo = blkcnt;
310
311 if (blkcnt == 0)
312 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500313
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700314 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500315 if (!mmc)
316 return 0;
317
Marek Vasutf537e392016-12-01 02:06:33 +0100318 if (CONFIG_IS_ENABLED(MMC_TINY))
319 err = mmc_switch_part(mmc, block_dev->hwpart);
320 else
321 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
322
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700323 if (err < 0)
324 return 0;
325
Simon Glasse5db1152016-05-01 13:52:35 -0600326 if ((start + blkcnt) > block_dev->lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100327#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200328 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glasse5db1152016-05-01 13:52:35 -0600329 start + blkcnt, block_dev->lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100330#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800331 return 0;
332 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500333
Simon Glassa4343c42015-06-23 15:38:50 -0600334 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
335 debug("%s: Failed to set blocklen\n", __func__);
Andy Flemingad347bb2008-10-30 16:41:01 -0500336 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600337 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500338
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700339 do {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200340 cur = (blocks_todo > mmc->cfg->b_max) ?
341 mmc->cfg->b_max : blocks_todo;
Simon Glassa4343c42015-06-23 15:38:50 -0600342 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
343 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700344 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600345 }
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700346 blocks_todo -= cur;
347 start += cur;
348 dst += cur * mmc->read_bl_len;
349 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500350
351 return blkcnt;
352}
353
Kim Phillips87ea3892012-10-29 13:34:43 +0000354static int mmc_go_idle(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500355{
356 struct mmc_cmd cmd;
357 int err;
358
359 udelay(1000);
360
361 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
362 cmd.cmdarg = 0;
363 cmd.resp_type = MMC_RSP_NONE;
Andy Flemingad347bb2008-10-30 16:41:01 -0500364
365 err = mmc_send_cmd(mmc, &cmd, NULL);
366
367 if (err)
368 return err;
369
370 udelay(2000);
371
372 return 0;
373}
374
Kim Phillips87ea3892012-10-29 13:34:43 +0000375static int sd_send_op_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500376{
377 int timeout = 1000;
378 int err;
379 struct mmc_cmd cmd;
380
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500381 while (1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500382 cmd.cmdidx = MMC_CMD_APP_CMD;
383 cmd.resp_type = MMC_RSP_R1;
384 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500385
386 err = mmc_send_cmd(mmc, &cmd, NULL);
387
388 if (err)
389 return err;
390
391 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
392 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100393
394 /*
395 * Most cards do not answer if some reserved bits
396 * in the ocr are set. However, Some controller
397 * can set bit 7 (reserved for low voltages), but
398 * how to manage low voltages SD card is not yet
399 * specified.
400 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000401 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200402 (mmc->cfg->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500403
404 if (mmc->version == SD_VERSION_2)
405 cmd.cmdarg |= OCR_HCS;
406
407 err = mmc_send_cmd(mmc, &cmd, NULL);
408
409 if (err)
410 return err;
411
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500412 if (cmd.response[0] & OCR_BUSY)
413 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500414
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500415 if (timeout-- <= 0)
Jaehoon Chung7825d202016-07-19 16:33:36 +0900416 return -EOPNOTSUPP;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500417
418 udelay(1000);
419 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500420
421 if (mmc->version != SD_VERSION_2)
422 mmc->version = SD_VERSION_1_0;
423
Thomas Chou1254c3d2010-12-24 13:12:21 +0000424 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
425 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
426 cmd.resp_type = MMC_RSP_R3;
427 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000428
429 err = mmc_send_cmd(mmc, &cmd, NULL);
430
431 if (err)
432 return err;
433 }
434
Rabin Vincentb6eed942009-04-05 13:30:56 +0530435 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500436
437 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
438 mmc->rca = 0;
439
440 return 0;
441}
442
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500443static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Flemingad347bb2008-10-30 16:41:01 -0500444{
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500445 struct mmc_cmd cmd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500446 int err;
447
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500448 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
449 cmd.resp_type = MMC_RSP_R3;
450 cmd.cmdarg = 0;
Rob Herring5fd3edd2015-03-23 17:56:59 -0500451 if (use_arg && !mmc_host_is_spi(mmc))
452 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200453 (mmc->cfg->voltages &
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500454 (mmc->ocr & OCR_VOLTAGE_MASK)) |
455 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000456
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500457 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000458 if (err)
459 return err;
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500460 mmc->ocr = cmd.response[0];
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000461 return 0;
462}
463
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200464static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000465{
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000466 int err, i;
467
Andy Flemingad347bb2008-10-30 16:41:01 -0500468 /* Some cards seem to need this */
469 mmc_go_idle(mmc);
470
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000471 /* Asking to the card its capabilities */
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000472 for (i = 0; i < 2; i++) {
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500473 err = mmc_send_op_cond_iter(mmc, i != 0);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000474 if (err)
475 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200476
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000477 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500478 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500479 break;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000480 }
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500481 mmc->op_cond_pending = 1;
482 return 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000483}
Wolfgang Denk80f70212011-05-19 22:21:41 +0200484
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200485static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000486{
487 struct mmc_cmd cmd;
488 int timeout = 1000;
489 uint start;
490 int err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200491
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000492 mmc->op_cond_pending = 0;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500493 if (!(mmc->ocr & OCR_BUSY)) {
Yangbo Lu9c720612016-08-02 15:33:18 +0800494 /* Some cards seem to need this */
495 mmc_go_idle(mmc);
496
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500497 start = get_timer(0);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500498 while (1) {
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500499 err = mmc_send_op_cond_iter(mmc, 1);
500 if (err)
501 return err;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500502 if (mmc->ocr & OCR_BUSY)
503 break;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500504 if (get_timer(start) > timeout)
Jaehoon Chung7825d202016-07-19 16:33:36 +0900505 return -EOPNOTSUPP;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500506 udelay(100);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500507 }
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500508 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500509
Thomas Chou1254c3d2010-12-24 13:12:21 +0000510 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
511 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
512 cmd.resp_type = MMC_RSP_R3;
513 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000514
515 err = mmc_send_cmd(mmc, &cmd, NULL);
516
517 if (err)
518 return err;
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500519
520 mmc->ocr = cmd.response[0];
Thomas Chou1254c3d2010-12-24 13:12:21 +0000521 }
522
Andy Flemingad347bb2008-10-30 16:41:01 -0500523 mmc->version = MMC_VERSION_UNKNOWN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500524
525 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrenf6545f12014-01-30 16:11:12 -0700526 mmc->rca = 1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500527
528 return 0;
529}
530
531
Kim Phillips87ea3892012-10-29 13:34:43 +0000532static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Flemingad347bb2008-10-30 16:41:01 -0500533{
534 struct mmc_cmd cmd;
535 struct mmc_data data;
536 int err;
537
538 /* Get the Card Status Register */
539 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
540 cmd.resp_type = MMC_RSP_R1;
541 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500542
Yoshihiro Shimodaf6bec732012-06-07 19:09:11 +0000543 data.dest = (char *)ext_csd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500544 data.blocks = 1;
Simon Glassa09c2b72013-04-03 08:54:30 +0000545 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500546 data.flags = MMC_DATA_READ;
547
548 err = mmc_send_cmd(mmc, &cmd, &data);
549
550 return err;
551}
552
Simon Glass84f9df92016-06-12 23:30:18 -0600553int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Flemingad347bb2008-10-30 16:41:01 -0500554{
555 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000556 int timeout = 1000;
Maxime Riparde7462aa2016-11-04 16:18:08 +0100557 int retries = 3;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000558 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500559
560 cmd.cmdidx = MMC_CMD_SWITCH;
561 cmd.resp_type = MMC_RSP_R1b;
562 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000563 (index << 16) |
564 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500565
Maxime Riparde7462aa2016-11-04 16:18:08 +0100566 while (retries > 0) {
567 ret = mmc_send_cmd(mmc, &cmd, NULL);
568
569 /* Waiting for the ready status */
570 if (!ret) {
571 ret = mmc_send_status(mmc, timeout);
572 return ret;
573 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000574
Maxime Riparde7462aa2016-11-04 16:18:08 +0100575 retries--;
576 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000577
578 return ret;
579
Andy Flemingad347bb2008-10-30 16:41:01 -0500580}
581
Kim Phillips87ea3892012-10-29 13:34:43 +0000582static int mmc_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500583{
Simon Glassa09c2b72013-04-03 08:54:30 +0000584 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Flemingad347bb2008-10-30 16:41:01 -0500585 char cardtype;
586 int err;
587
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600588 mmc->card_caps = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500589
Thomas Chou1254c3d2010-12-24 13:12:21 +0000590 if (mmc_host_is_spi(mmc))
591 return 0;
592
Andy Flemingad347bb2008-10-30 16:41:01 -0500593 /* Only version 4 supports high-speed */
594 if (mmc->version < MMC_VERSION_4)
595 return 0;
596
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600597 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
598
Andy Flemingad347bb2008-10-30 16:41:01 -0500599 err = mmc_send_ext_csd(mmc, ext_csd);
600
601 if (err)
602 return err;
603
Lei Wen217467f2011-10-03 20:35:10 +0000604 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500605
606 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
607
608 if (err)
Heiko Schocher9016ab92016-06-07 08:31:21 +0200609 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -0500610
611 /* Now check to see that it worked */
612 err = mmc_send_ext_csd(mmc, ext_csd);
613
614 if (err)
615 return err;
616
617 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000618 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500619 return 0;
620
621 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900622 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov95a37132014-12-01 06:59:10 -0600623 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900624 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Flemingad347bb2008-10-30 16:41:01 -0500625 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900626 } else {
Andy Flemingad347bb2008-10-30 16:41:01 -0500627 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900628 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500629
630 return 0;
631}
632
Stephen Warrene315ae82013-06-11 15:14:01 -0600633static int mmc_set_capacity(struct mmc *mmc, int part_num)
634{
635 switch (part_num) {
636 case 0:
637 mmc->capacity = mmc->capacity_user;
638 break;
639 case 1:
640 case 2:
641 mmc->capacity = mmc->capacity_boot;
642 break;
643 case 3:
644 mmc->capacity = mmc->capacity_rpmb;
645 break;
646 case 4:
647 case 5:
648 case 6:
649 case 7:
650 mmc->capacity = mmc->capacity_gp[part_num - 4];
651 break;
652 default:
653 return -1;
654 }
655
Simon Glasse5db1152016-05-01 13:52:35 -0600656 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrene315ae82013-06-11 15:14:01 -0600657
658 return 0;
659}
660
Simon Glass62e293a2016-06-12 23:30:15 -0600661int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wen31b99802011-05-02 16:26:26 +0000662{
Stephen Warrene315ae82013-06-11 15:14:01 -0600663 int ret;
Lei Wen31b99802011-05-02 16:26:26 +0000664
Stephen Warrene315ae82013-06-11 15:14:01 -0600665 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
666 (mmc->part_config & ~PART_ACCESS_MASK)
667 | (part_num & PART_ACCESS_MASK));
Peter Bigot45fde892014-09-02 18:31:23 -0500668
669 /*
670 * Set the capacity if the switch succeeded or was intended
671 * to return to representing the raw device.
672 */
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700673 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot45fde892014-09-02 18:31:23 -0500674 ret = mmc_set_capacity(mmc, part_num);
Simon Glass984db5d2016-05-01 13:52:37 -0600675 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700676 }
Stephen Warrene315ae82013-06-11 15:14:01 -0600677
Peter Bigot45fde892014-09-02 18:31:23 -0500678 return ret;
Lei Wen31b99802011-05-02 16:26:26 +0000679}
680
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100681int mmc_hwpart_config(struct mmc *mmc,
682 const struct mmc_hwpart_conf *conf,
683 enum mmc_hwpart_conf_mode mode)
684{
685 u8 part_attrs = 0;
686 u32 enh_size_mult;
687 u32 enh_start_addr;
688 u32 gp_size_mult[4];
689 u32 max_enh_size_mult;
690 u32 tot_enh_size_mult = 0;
Diego Santa Cruz80200272014-12-23 10:50:31 +0100691 u8 wr_rel_set;
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100692 int i, pidx, err;
693 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
694
695 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
696 return -EINVAL;
697
698 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
699 printf("eMMC >= 4.4 required for enhanced user data area\n");
700 return -EMEDIUMTYPE;
701 }
702
703 if (!(mmc->part_support & PART_SUPPORT)) {
704 printf("Card does not support partitioning\n");
705 return -EMEDIUMTYPE;
706 }
707
708 if (!mmc->hc_wp_grp_size) {
709 printf("Card does not define HC WP group size\n");
710 return -EMEDIUMTYPE;
711 }
712
713 /* check partition alignment and total enhanced size */
714 if (conf->user.enh_size) {
715 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
716 conf->user.enh_start % mmc->hc_wp_grp_size) {
717 printf("User data enhanced area not HC WP group "
718 "size aligned\n");
719 return -EINVAL;
720 }
721 part_attrs |= EXT_CSD_ENH_USR;
722 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
723 if (mmc->high_capacity) {
724 enh_start_addr = conf->user.enh_start;
725 } else {
726 enh_start_addr = (conf->user.enh_start << 9);
727 }
728 } else {
729 enh_size_mult = 0;
730 enh_start_addr = 0;
731 }
732 tot_enh_size_mult += enh_size_mult;
733
734 for (pidx = 0; pidx < 4; pidx++) {
735 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
736 printf("GP%i partition not HC WP group size "
737 "aligned\n", pidx+1);
738 return -EINVAL;
739 }
740 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
741 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
742 part_attrs |= EXT_CSD_ENH_GP(pidx);
743 tot_enh_size_mult += gp_size_mult[pidx];
744 }
745 }
746
747 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
748 printf("Card does not support enhanced attribute\n");
749 return -EMEDIUMTYPE;
750 }
751
752 err = mmc_send_ext_csd(mmc, ext_csd);
753 if (err)
754 return err;
755
756 max_enh_size_mult =
757 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
758 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
759 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
760 if (tot_enh_size_mult > max_enh_size_mult) {
761 printf("Total enhanced size exceeds maximum (%u > %u)\n",
762 tot_enh_size_mult, max_enh_size_mult);
763 return -EMEDIUMTYPE;
764 }
765
Diego Santa Cruz80200272014-12-23 10:50:31 +0100766 /* The default value of EXT_CSD_WR_REL_SET is device
767 * dependent, the values can only be changed if the
768 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
769 * changed only once and before partitioning is completed. */
770 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
771 if (conf->user.wr_rel_change) {
772 if (conf->user.wr_rel_set)
773 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
774 else
775 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
776 }
777 for (pidx = 0; pidx < 4; pidx++) {
778 if (conf->gp_part[pidx].wr_rel_change) {
779 if (conf->gp_part[pidx].wr_rel_set)
780 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
781 else
782 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
783 }
784 }
785
786 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
787 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
788 puts("Card does not support host controlled partition write "
789 "reliability settings\n");
790 return -EMEDIUMTYPE;
791 }
792
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100793 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
794 EXT_CSD_PARTITION_SETTING_COMPLETED) {
795 printf("Card already partitioned\n");
796 return -EPERM;
797 }
798
799 if (mode == MMC_HWPART_CONF_CHECK)
800 return 0;
801
802 /* Partitioning requires high-capacity size definitions */
803 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
804 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
805 EXT_CSD_ERASE_GROUP_DEF, 1);
806
807 if (err)
808 return err;
809
810 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
811
812 /* update erase group size to be high-capacity */
813 mmc->erase_grp_size =
814 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
815
816 }
817
818 /* all OK, write the configuration */
819 for (i = 0; i < 4; i++) {
820 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
821 EXT_CSD_ENH_START_ADDR+i,
822 (enh_start_addr >> (i*8)) & 0xFF);
823 if (err)
824 return err;
825 }
826 for (i = 0; i < 3; i++) {
827 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
828 EXT_CSD_ENH_SIZE_MULT+i,
829 (enh_size_mult >> (i*8)) & 0xFF);
830 if (err)
831 return err;
832 }
833 for (pidx = 0; pidx < 4; pidx++) {
834 for (i = 0; i < 3; i++) {
835 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
836 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
837 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
838 if (err)
839 return err;
840 }
841 }
842 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
843 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
844 if (err)
845 return err;
846
847 if (mode == MMC_HWPART_CONF_SET)
848 return 0;
849
Diego Santa Cruz80200272014-12-23 10:50:31 +0100850 /* The WR_REL_SET is a write-once register but shall be
851 * written before setting PART_SETTING_COMPLETED. As it is
852 * write-once we can only write it when completing the
853 * partitioning. */
854 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
855 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
856 EXT_CSD_WR_REL_SET, wr_rel_set);
857 if (err)
858 return err;
859 }
860
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100861 /* Setting PART_SETTING_COMPLETED confirms the partition
862 * configuration but it only becomes effective after power
863 * cycle, so we do not adjust the partition related settings
864 * in the mmc struct. */
865
866 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
867 EXT_CSD_PARTITION_SETTING,
868 EXT_CSD_PARTITION_SETTING_COMPLETED);
869 if (err)
870 return err;
871
872 return 0;
873}
874
Simon Glasseba48f92017-07-29 11:35:31 -0600875#if !CONFIG_IS_ENABLED(DM_MMC)
Thierry Redingb9c8b772012-01-02 01:15:37 +0000876int mmc_getcd(struct mmc *mmc)
877{
878 int cd;
879
880 cd = board_mmc_getcd(mmc);
881
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000882 if (cd < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200883 if (mmc->cfg->ops->getcd)
884 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000885 else
886 cd = 1;
887 }
Thierry Redingb9c8b772012-01-02 01:15:37 +0000888
889 return cd;
890}
Simon Glass394dfc02016-06-12 23:30:22 -0600891#endif
Thierry Redingb9c8b772012-01-02 01:15:37 +0000892
Kim Phillips87ea3892012-10-29 13:34:43 +0000893static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Flemingad347bb2008-10-30 16:41:01 -0500894{
895 struct mmc_cmd cmd;
896 struct mmc_data data;
897
898 /* Switch the frequency */
899 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
900 cmd.resp_type = MMC_RSP_R1;
901 cmd.cmdarg = (mode << 31) | 0xffffff;
902 cmd.cmdarg &= ~(0xf << (group * 4));
903 cmd.cmdarg |= value << (group * 4);
Andy Flemingad347bb2008-10-30 16:41:01 -0500904
905 data.dest = (char *)resp;
906 data.blocksize = 64;
907 data.blocks = 1;
908 data.flags = MMC_DATA_READ;
909
910 return mmc_send_cmd(mmc, &cmd, &data);
911}
912
913
Kim Phillips87ea3892012-10-29 13:34:43 +0000914static int sd_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500915{
916 int err;
917 struct mmc_cmd cmd;
Suniel Mahesh2f423da2017-10-05 11:32:00 +0530918 ALLOC_CACHE_ALIGN_BUFFER(__be32, scr, 2);
919 ALLOC_CACHE_ALIGN_BUFFER(__be32, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500920 struct mmc_data data;
921 int timeout;
922
923 mmc->card_caps = 0;
924
Thomas Chou1254c3d2010-12-24 13:12:21 +0000925 if (mmc_host_is_spi(mmc))
926 return 0;
927
Andy Flemingad347bb2008-10-30 16:41:01 -0500928 /* Read the SCR to find out if this card supports higher speeds */
929 cmd.cmdidx = MMC_CMD_APP_CMD;
930 cmd.resp_type = MMC_RSP_R1;
931 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -0500932
933 err = mmc_send_cmd(mmc, &cmd, NULL);
934
935 if (err)
936 return err;
937
938 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
939 cmd.resp_type = MMC_RSP_R1;
940 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500941
942 timeout = 3;
943
944retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000945 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500946 data.blocksize = 8;
947 data.blocks = 1;
948 data.flags = MMC_DATA_READ;
949
950 err = mmc_send_cmd(mmc, &cmd, &data);
951
952 if (err) {
953 if (timeout--)
954 goto retry_scr;
955
956 return err;
957 }
958
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300959 mmc->scr[0] = __be32_to_cpu(scr[0]);
960 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500961
962 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng4a4ef872016-03-17 21:53:13 -0700963 case 0:
964 mmc->version = SD_VERSION_1_0;
965 break;
966 case 1:
967 mmc->version = SD_VERSION_1_10;
968 break;
969 case 2:
970 mmc->version = SD_VERSION_2;
971 if ((mmc->scr[0] >> 15) & 0x1)
972 mmc->version = SD_VERSION_3;
973 break;
974 default:
975 mmc->version = SD_VERSION_1_0;
976 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500977 }
978
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530979 if (mmc->scr[0] & SD_DATA_4BIT)
980 mmc->card_caps |= MMC_MODE_4BIT;
981
Andy Flemingad347bb2008-10-30 16:41:01 -0500982 /* Version 1.0 doesn't support switching */
983 if (mmc->version == SD_VERSION_1_0)
984 return 0;
985
986 timeout = 4;
987 while (timeout--) {
988 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000989 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500990
991 if (err)
992 return err;
993
994 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300995 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500996 break;
997 }
998
Andy Flemingad347bb2008-10-30 16:41:01 -0500999 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +03001000 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -05001001 return 0;
1002
Macpaul Lin24e92ec2011-11-28 16:31:09 +00001003 /*
1004 * If the host doesn't support SD_HIGHSPEED, do not switch card to
1005 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
1006 * This can avoid furthur problem when the card runs in different
1007 * mode between the host.
1008 */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001009 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
1010 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin24e92ec2011-11-28 16:31:09 +00001011 return 0;
1012
Anton staaf9b00f0d2011-10-03 13:54:59 +00001013 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -05001014
1015 if (err)
1016 return err;
1017
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +03001018 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -05001019 mmc->card_caps |= MMC_MODE_HS;
1020
1021 return 0;
1022}
1023
Peng Fanb3fcf1e2016-09-01 11:13:38 +08001024static int sd_read_ssr(struct mmc *mmc)
1025{
1026 int err, i;
1027 struct mmc_cmd cmd;
1028 ALLOC_CACHE_ALIGN_BUFFER(uint, ssr, 16);
1029 struct mmc_data data;
1030 int timeout = 3;
1031 unsigned int au, eo, et, es;
1032
1033 cmd.cmdidx = MMC_CMD_APP_CMD;
1034 cmd.resp_type = MMC_RSP_R1;
1035 cmd.cmdarg = mmc->rca << 16;
1036
1037 err = mmc_send_cmd(mmc, &cmd, NULL);
1038 if (err)
1039 return err;
1040
1041 cmd.cmdidx = SD_CMD_APP_SD_STATUS;
1042 cmd.resp_type = MMC_RSP_R1;
1043 cmd.cmdarg = 0;
1044
1045retry_ssr:
1046 data.dest = (char *)ssr;
1047 data.blocksize = 64;
1048 data.blocks = 1;
1049 data.flags = MMC_DATA_READ;
1050
1051 err = mmc_send_cmd(mmc, &cmd, &data);
1052 if (err) {
1053 if (timeout--)
1054 goto retry_ssr;
1055
1056 return err;
1057 }
1058
1059 for (i = 0; i < 16; i++)
1060 ssr[i] = be32_to_cpu(ssr[i]);
1061
1062 au = (ssr[2] >> 12) & 0xF;
1063 if ((au <= 9) || (mmc->version == SD_VERSION_3)) {
1064 mmc->ssr.au = sd_au_size[au];
1065 es = (ssr[3] >> 24) & 0xFF;
1066 es |= (ssr[2] & 0xFF) << 8;
1067 et = (ssr[3] >> 18) & 0x3F;
1068 if (es && et) {
1069 eo = (ssr[3] >> 16) & 0x3;
1070 mmc->ssr.erase_timeout = (et * 1000) / es;
1071 mmc->ssr.erase_offset = eo * 1000;
1072 }
1073 } else {
1074 debug("Invalid Allocation Unit Size.\n");
1075 }
1076
1077 return 0;
1078}
1079
Andy Flemingad347bb2008-10-30 16:41:01 -05001080/* frequency bases */
1081/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +00001082static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -05001083 10000,
1084 100000,
1085 1000000,
1086 10000000,
1087};
1088
1089/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
1090 * to platforms without floating point.
1091 */
Simon Glass03317cc2016-05-14 14:02:57 -06001092static const u8 multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -05001093 0, /* reserved */
1094 10,
1095 12,
1096 13,
1097 15,
1098 20,
1099 25,
1100 30,
1101 35,
1102 40,
1103 45,
1104 50,
1105 55,
1106 60,
1107 70,
1108 80,
1109};
1110
Simon Glasseba48f92017-07-29 11:35:31 -06001111#if !CONFIG_IS_ENABLED(DM_MMC)
Kim Phillips87ea3892012-10-29 13:34:43 +00001112static void mmc_set_ios(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001113{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001114 if (mmc->cfg->ops->set_ios)
1115 mmc->cfg->ops->set_ios(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001116}
Simon Glass394dfc02016-06-12 23:30:22 -06001117#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001118
1119void mmc_set_clock(struct mmc *mmc, uint clock)
1120{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001121 if (clock > mmc->cfg->f_max)
1122 clock = mmc->cfg->f_max;
Andy Flemingad347bb2008-10-30 16:41:01 -05001123
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001124 if (clock < mmc->cfg->f_min)
1125 clock = mmc->cfg->f_min;
Andy Flemingad347bb2008-10-30 16:41:01 -05001126
1127 mmc->clock = clock;
1128
1129 mmc_set_ios(mmc);
1130}
1131
Kim Phillips87ea3892012-10-29 13:34:43 +00001132static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Flemingad347bb2008-10-30 16:41:01 -05001133{
1134 mmc->bus_width = width;
1135
1136 mmc_set_ios(mmc);
1137}
1138
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001139static int sd_select_bus_freq_width(struct mmc *mmc)
1140{
1141 int err;
1142 struct mmc_cmd cmd;
1143
1144 err = sd_change_freq(mmc);
1145 if (err)
1146 return err;
1147
1148 /* Restrict card's capabilities by what the host can do */
1149 mmc->card_caps &= mmc->cfg->host_caps;
1150
1151 if (mmc->card_caps & MMC_MODE_4BIT) {
1152 cmd.cmdidx = MMC_CMD_APP_CMD;
1153 cmd.resp_type = MMC_RSP_R1;
1154 cmd.cmdarg = mmc->rca << 16;
1155
1156 err = mmc_send_cmd(mmc, &cmd, NULL);
1157 if (err)
1158 return err;
1159
1160 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1161 cmd.resp_type = MMC_RSP_R1;
1162 cmd.cmdarg = 2;
1163 err = mmc_send_cmd(mmc, &cmd, NULL);
1164 if (err)
1165 return err;
1166
1167 mmc_set_bus_width(mmc, 4);
1168 }
1169
1170 err = sd_read_ssr(mmc);
1171 if (err)
1172 return err;
1173
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +02001174 if (mmc->card_caps & MMC_MODE_HS) {
1175 mmc_select_mode(mmc, SD_HS);
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001176 mmc->tran_speed = 50000000;
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +02001177 } else {
1178 mmc_select_mode(mmc, SD_LEGACY);
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001179 mmc->tran_speed = 25000000;
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +02001180 }
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001181
1182 return 0;
1183}
1184
Jean-Jacques Hiblot933d1262017-09-21 16:29:52 +02001185/*
1186 * read the compare the part of ext csd that is constant.
1187 * This can be used to check that the transfer is working
1188 * as expected.
1189 */
1190static int mmc_read_and_compare_ext_csd(struct mmc *mmc)
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001191{
Jean-Jacques Hiblot933d1262017-09-21 16:29:52 +02001192 int err;
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001193 const u8 *ext_csd = mmc->ext_csd;
Jean-Jacques Hiblot933d1262017-09-21 16:29:52 +02001194 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
1195
1196 err = mmc_send_ext_csd(mmc, test_csd);
1197 if (err)
1198 return err;
1199
1200 /* Only compare read only fields */
1201 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1202 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1203 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1204 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1205 ext_csd[EXT_CSD_REV]
1206 == test_csd[EXT_CSD_REV] &&
1207 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1208 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1209 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1210 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
1211 return 0;
1212
1213 return -EBADMSG;
1214}
1215
1216static int mmc_select_bus_freq_width(struct mmc *mmc)
1217{
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001218 /* An array of possible bus widths in order of preference */
1219 static const unsigned int ext_csd_bits[] = {
1220 EXT_CSD_DDR_BUS_WIDTH_8,
1221 EXT_CSD_DDR_BUS_WIDTH_4,
1222 EXT_CSD_BUS_WIDTH_8,
1223 EXT_CSD_BUS_WIDTH_4,
1224 EXT_CSD_BUS_WIDTH_1,
1225 };
1226 /* An array to map CSD bus widths to host cap bits */
1227 static const unsigned int ext_to_hostcaps[] = {
1228 [EXT_CSD_DDR_BUS_WIDTH_4] =
1229 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1230 [EXT_CSD_DDR_BUS_WIDTH_8] =
1231 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
1232 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1233 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1234 };
1235 /* An array to map chosen bus width to an integer */
1236 static const unsigned int widths[] = {
1237 8, 4, 8, 4, 1,
1238 };
1239 int err;
1240 int idx;
1241
1242 err = mmc_change_freq(mmc);
1243 if (err)
1244 return err;
1245
1246 /* Restrict card's capabilities by what the host can do */
1247 mmc->card_caps &= mmc->cfg->host_caps;
1248
1249 /* Only version 4 of MMC supports wider bus widths */
1250 if (mmc->version < MMC_VERSION_4)
1251 return 0;
1252
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001253 if (!mmc->ext_csd) {
1254 debug("No ext_csd found!\n"); /* this should enver happen */
1255 return -ENOTSUPP;
1256 }
1257
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001258 for (idx = 0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1259 unsigned int extw = ext_csd_bits[idx];
1260 unsigned int caps = ext_to_hostcaps[extw];
1261 /*
1262 * If the bus width is still not changed,
1263 * don't try to set the default again.
1264 * Otherwise, recover from switch attempts
1265 * by switching to 1-bit bus width.
1266 */
1267 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1268 mmc->bus_width == 1) {
1269 err = 0;
1270 break;
1271 }
1272
1273 /*
1274 * Check to make sure the card and controller support
1275 * these capabilities
1276 */
1277 if ((mmc->card_caps & caps) != caps)
1278 continue;
1279
1280 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1281 EXT_CSD_BUS_WIDTH, extw);
1282
1283 if (err)
1284 continue;
1285
1286 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
1287 mmc_set_bus_width(mmc, widths[idx]);
1288
Jean-Jacques Hiblot933d1262017-09-21 16:29:52 +02001289 err = mmc_read_and_compare_ext_csd(mmc);
1290 if (!err)
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001291 break;
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001292 }
1293
1294 if (err)
1295 return err;
1296
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +02001297 if (mmc->card_caps & MMC_MODE_HS_52MHz) {
1298 if (mmc->ddr_mode)
1299 mmc_select_mode(mmc, MMC_DDR_52);
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001300 else
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +02001301 mmc_select_mode(mmc, MMC_HS_52);
1302 mmc->tran_speed = 52000000;
1303 } else if (mmc->card_caps & MMC_MODE_HS) {
1304 mmc_select_mode(mmc, MMC_HS);
1305 mmc->tran_speed = 26000000;
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001306 }
1307
1308 return err;
1309}
1310
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001311static int mmc_startup_v4(struct mmc *mmc)
Jean-Jacques Hiblote84459c2017-09-21 16:29:50 +02001312{
1313 int err, i;
1314 u64 capacity;
1315 bool has_parts = false;
1316 bool part_completed;
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001317 u8 *ext_csd;
Jean-Jacques Hiblote84459c2017-09-21 16:29:50 +02001318
1319 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4))
1320 return 0;
1321
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001322 ext_csd = malloc_cache_aligned(MMC_MAX_BLOCK_LEN);
1323 if (!ext_csd)
1324 return -ENOMEM;
1325
1326 mmc->ext_csd = ext_csd;
1327
Jean-Jacques Hiblote84459c2017-09-21 16:29:50 +02001328 /* check ext_csd version and capacity */
1329 err = mmc_send_ext_csd(mmc, ext_csd);
1330 if (err)
1331 return err;
1332 if (ext_csd[EXT_CSD_REV] >= 2) {
1333 /*
1334 * According to the JEDEC Standard, the value of
1335 * ext_csd's capacity is valid if the value is more
1336 * than 2GB
1337 */
1338 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1339 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1340 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1341 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
1342 capacity *= MMC_MAX_BLOCK_LEN;
1343 if ((capacity >> 20) > 2 * 1024)
1344 mmc->capacity_user = capacity;
1345 }
1346
1347 switch (ext_csd[EXT_CSD_REV]) {
1348 case 1:
1349 mmc->version = MMC_VERSION_4_1;
1350 break;
1351 case 2:
1352 mmc->version = MMC_VERSION_4_2;
1353 break;
1354 case 3:
1355 mmc->version = MMC_VERSION_4_3;
1356 break;
1357 case 5:
1358 mmc->version = MMC_VERSION_4_41;
1359 break;
1360 case 6:
1361 mmc->version = MMC_VERSION_4_5;
1362 break;
1363 case 7:
1364 mmc->version = MMC_VERSION_5_0;
1365 break;
1366 case 8:
1367 mmc->version = MMC_VERSION_5_1;
1368 break;
1369 }
1370
1371 /* The partition data may be non-zero but it is only
1372 * effective if PARTITION_SETTING_COMPLETED is set in
1373 * EXT_CSD, so ignore any data if this bit is not set,
1374 * except for enabling the high-capacity group size
1375 * definition (see below).
1376 */
1377 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1378 EXT_CSD_PARTITION_SETTING_COMPLETED);
1379
1380 /* store the partition info of emmc */
1381 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1382 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1383 ext_csd[EXT_CSD_BOOT_MULT])
1384 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
1385 if (part_completed &&
1386 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
1387 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1388
1389 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1390
1391 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1392
1393 for (i = 0; i < 4; i++) {
1394 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
1395 uint mult = (ext_csd[idx + 2] << 16) +
1396 (ext_csd[idx + 1] << 8) + ext_csd[idx];
1397 if (mult)
1398 has_parts = true;
1399 if (!part_completed)
1400 continue;
1401 mmc->capacity_gp[i] = mult;
1402 mmc->capacity_gp[i] *=
1403 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1404 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1405 mmc->capacity_gp[i] <<= 19;
1406 }
1407
1408 if (part_completed) {
1409 mmc->enh_user_size =
1410 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) +
1411 (ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8) +
1412 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1413 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1414 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1415 mmc->enh_user_size <<= 19;
1416 mmc->enh_user_start =
1417 (ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24) +
1418 (ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16) +
1419 (ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8) +
1420 ext_csd[EXT_CSD_ENH_START_ADDR];
1421 if (mmc->high_capacity)
1422 mmc->enh_user_start <<= 9;
1423 }
1424
1425 /*
1426 * Host needs to enable ERASE_GRP_DEF bit if device is
1427 * partitioned. This bit will be lost every time after a reset
1428 * or power off. This will affect erase size.
1429 */
1430 if (part_completed)
1431 has_parts = true;
1432 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
1433 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1434 has_parts = true;
1435 if (has_parts) {
1436 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1437 EXT_CSD_ERASE_GROUP_DEF, 1);
1438
1439 if (err)
1440 return err;
1441
1442 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
1443 }
1444
1445 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
1446 /* Read out group size from ext_csd */
1447 mmc->erase_grp_size =
1448 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
1449 /*
1450 * if high capacity and partition setting completed
1451 * SEC_COUNT is valid even if it is smaller than 2 GiB
1452 * JEDEC Standard JESD84-B45, 6.2.4
1453 */
1454 if (mmc->high_capacity && part_completed) {
1455 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1456 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1457 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1458 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1459 capacity *= MMC_MAX_BLOCK_LEN;
1460 mmc->capacity_user = capacity;
1461 }
1462 } else {
1463 /* Calculate the group size from the csd value. */
1464 int erase_gsz, erase_gmul;
1465
1466 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1467 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1468 mmc->erase_grp_size = (erase_gsz + 1)
1469 * (erase_gmul + 1);
1470 }
1471
1472 mmc->hc_wp_grp_size = 1024
1473 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1474 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1475
1476 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
1477
1478 return 0;
1479}
1480
Kim Phillips87ea3892012-10-29 13:34:43 +00001481static int mmc_startup(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001482{
Stephen Warrene315ae82013-06-11 15:14:01 -06001483 int err, i;
Andy Flemingad347bb2008-10-30 16:41:01 -05001484 uint mult, freq;
Jean-Jacques Hiblote84459c2017-09-21 16:29:50 +02001485 u64 cmult, csize;
Andy Flemingad347bb2008-10-30 16:41:01 -05001486 struct mmc_cmd cmd;
Simon Glasse5db1152016-05-01 13:52:35 -06001487 struct blk_desc *bdesc;
Andy Flemingad347bb2008-10-30 16:41:01 -05001488
Thomas Chou1254c3d2010-12-24 13:12:21 +00001489#ifdef CONFIG_MMC_SPI_CRC_ON
1490 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1491 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1492 cmd.resp_type = MMC_RSP_R1;
1493 cmd.cmdarg = 1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001494 err = mmc_send_cmd(mmc, &cmd, NULL);
1495
1496 if (err)
1497 return err;
1498 }
1499#endif
1500
Andy Flemingad347bb2008-10-30 16:41:01 -05001501 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001502 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1503 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -05001504 cmd.resp_type = MMC_RSP_R2;
1505 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001506
1507 err = mmc_send_cmd(mmc, &cmd, NULL);
1508
1509 if (err)
1510 return err;
1511
1512 memcpy(mmc->cid, cmd.response, 16);
1513
1514 /*
1515 * For MMC cards, set the Relative Address.
1516 * For SD cards, get the Relatvie Address.
1517 * This also puts the cards into Standby State
1518 */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001519 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1520 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1521 cmd.cmdarg = mmc->rca << 16;
1522 cmd.resp_type = MMC_RSP_R6;
Andy Flemingad347bb2008-10-30 16:41:01 -05001523
Thomas Chou1254c3d2010-12-24 13:12:21 +00001524 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001525
Thomas Chou1254c3d2010-12-24 13:12:21 +00001526 if (err)
1527 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001528
Thomas Chou1254c3d2010-12-24 13:12:21 +00001529 if (IS_SD(mmc))
1530 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1531 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001532
1533 /* Get the Card-Specific Data */
1534 cmd.cmdidx = MMC_CMD_SEND_CSD;
1535 cmd.resp_type = MMC_RSP_R2;
1536 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001537
1538 err = mmc_send_cmd(mmc, &cmd, NULL);
1539
1540 if (err)
1541 return err;
1542
Rabin Vincentb6eed942009-04-05 13:30:56 +05301543 mmc->csd[0] = cmd.response[0];
1544 mmc->csd[1] = cmd.response[1];
1545 mmc->csd[2] = cmd.response[2];
1546 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001547
1548 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301549 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001550
1551 switch (version) {
Bin Meng4a4ef872016-03-17 21:53:13 -07001552 case 0:
1553 mmc->version = MMC_VERSION_1_2;
1554 break;
1555 case 1:
1556 mmc->version = MMC_VERSION_1_4;
1557 break;
1558 case 2:
1559 mmc->version = MMC_VERSION_2_2;
1560 break;
1561 case 3:
1562 mmc->version = MMC_VERSION_3;
1563 break;
1564 case 4:
1565 mmc->version = MMC_VERSION_4;
1566 break;
1567 default:
1568 mmc->version = MMC_VERSION_1_2;
1569 break;
Andy Flemingad347bb2008-10-30 16:41:01 -05001570 }
1571 }
1572
1573 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301574 freq = fbase[(cmd.response[0] & 0x7)];
1575 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001576
Jean-Jacques Hiblota94fb412017-09-21 16:29:53 +02001577 mmc->legacy_speed = freq * mult;
1578 mmc->tran_speed = mmc->legacy_speed;
1579 mmc_select_mode(mmc, MMC_LEGACY);
Andy Flemingad347bb2008-10-30 16:41:01 -05001580
Markus Niebel03951412013-12-16 13:40:46 +01001581 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincentb6eed942009-04-05 13:30:56 +05301582 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001583
1584 if (IS_SD(mmc))
1585 mmc->write_bl_len = mmc->read_bl_len;
1586 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301587 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001588
1589 if (mmc->high_capacity) {
1590 csize = (mmc->csd[1] & 0x3f) << 16
1591 | (mmc->csd[2] & 0xffff0000) >> 16;
1592 cmult = 8;
1593 } else {
1594 csize = (mmc->csd[1] & 0x3ff) << 2
1595 | (mmc->csd[2] & 0xc0000000) >> 30;
1596 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1597 }
1598
Stephen Warrene315ae82013-06-11 15:14:01 -06001599 mmc->capacity_user = (csize + 1) << (cmult + 2);
1600 mmc->capacity_user *= mmc->read_bl_len;
1601 mmc->capacity_boot = 0;
1602 mmc->capacity_rpmb = 0;
1603 for (i = 0; i < 4; i++)
1604 mmc->capacity_gp[i] = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001605
Simon Glassa09c2b72013-04-03 08:54:30 +00001606 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1607 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001608
Simon Glassa09c2b72013-04-03 08:54:30 +00001609 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1610 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001611
Markus Niebel03951412013-12-16 13:40:46 +01001612 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1613 cmd.cmdidx = MMC_CMD_SET_DSR;
1614 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1615 cmd.resp_type = MMC_RSP_NONE;
1616 if (mmc_send_cmd(mmc, &cmd, NULL))
1617 printf("MMC: SET_DSR failed\n");
1618 }
1619
Andy Flemingad347bb2008-10-30 16:41:01 -05001620 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001621 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1622 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001623 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001624 cmd.cmdarg = mmc->rca << 16;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001625 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001626
Thomas Chou1254c3d2010-12-24 13:12:21 +00001627 if (err)
1628 return err;
1629 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001630
Lei Wenea526762011-06-22 17:03:31 +00001631 /*
1632 * For SD, its erase group is always one sector
1633 */
1634 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001635 mmc->part_config = MMCPART_NOAVAILABLE;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001636
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001637 err = mmc_startup_v4(mmc);
Jean-Jacques Hiblote84459c2017-09-21 16:29:50 +02001638 if (err)
1639 return err;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301640
Simon Glasse5db1152016-05-01 13:52:35 -06001641 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrene315ae82013-06-11 15:14:01 -06001642 if (err)
1643 return err;
1644
Andy Flemingad347bb2008-10-30 16:41:01 -05001645 if (IS_SD(mmc))
Jean-Jacques Hiblot31e7cf32017-09-21 16:29:49 +02001646 err = sd_select_bus_freq_width(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001647 else
Jean-Jacques Hibloted9506b2017-09-21 16:29:51 +02001648 err = mmc_select_bus_freq_width(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001649
1650 if (err)
1651 return err;
1652
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001653 mmc_set_clock(mmc, mmc->tran_speed);
1654
Andrew Gabbasov532663b2014-12-01 06:59:11 -06001655 /* Fix the block length for DDR mode */
1656 if (mmc->ddr_mode) {
1657 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1658 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1659 }
1660
Andy Flemingad347bb2008-10-30 16:41:01 -05001661 /* fill in device description */
Simon Glasse5db1152016-05-01 13:52:35 -06001662 bdesc = mmc_get_blk_desc(mmc);
1663 bdesc->lun = 0;
1664 bdesc->hwpart = 0;
1665 bdesc->type = 0;
1666 bdesc->blksz = mmc->read_bl_len;
1667 bdesc->log2blksz = LOG2(bdesc->blksz);
1668 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsd67754f2015-12-04 23:27:40 +01001669#if !defined(CONFIG_SPL_BUILD) || \
1670 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1671 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glasse5db1152016-05-01 13:52:35 -06001672 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Hutt7367ec22012-10-20 17:15:59 +00001673 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1674 (mmc->cid[3] >> 16) & 0xffff);
Simon Glasse5db1152016-05-01 13:52:35 -06001675 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Hutt7367ec22012-10-20 17:15:59 +00001676 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1677 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1678 (mmc->cid[2] >> 24) & 0xff);
Simon Glasse5db1152016-05-01 13:52:35 -06001679 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Hutt7367ec22012-10-20 17:15:59 +00001680 (mmc->cid[2] >> 16) & 0xf);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001681#else
Simon Glasse5db1152016-05-01 13:52:35 -06001682 bdesc->vendor[0] = 0;
1683 bdesc->product[0] = 0;
1684 bdesc->revision[0] = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001685#endif
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001686#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glasse5db1152016-05-01 13:52:35 -06001687 part_init(bdesc);
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001688#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001689
1690 return 0;
1691}
1692
Kim Phillips87ea3892012-10-29 13:34:43 +00001693static int mmc_send_if_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001694{
1695 struct mmc_cmd cmd;
1696 int err;
1697
1698 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1699 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001700 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Flemingad347bb2008-10-30 16:41:01 -05001701 cmd.resp_type = MMC_RSP_R7;
Andy Flemingad347bb2008-10-30 16:41:01 -05001702
1703 err = mmc_send_cmd(mmc, &cmd, NULL);
1704
1705 if (err)
1706 return err;
1707
Rabin Vincentb6eed942009-04-05 13:30:56 +05301708 if ((cmd.response[0] & 0xff) != 0xaa)
Jaehoon Chung7825d202016-07-19 16:33:36 +09001709 return -EOPNOTSUPP;
Andy Flemingad347bb2008-10-30 16:41:01 -05001710 else
1711 mmc->version = SD_VERSION_2;
1712
1713 return 0;
1714}
1715
Simon Glass5f4bd8c2017-07-04 13:31:19 -06001716#if !CONFIG_IS_ENABLED(DM_MMC)
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001717/* board-specific MMC power initializations. */
1718__weak void board_mmc_power_init(void)
1719{
1720}
Simon Glass833b80d2017-04-22 19:10:56 -06001721#endif
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001722
Peng Fan15305962016-10-11 15:08:43 +08001723static int mmc_power_init(struct mmc *mmc)
1724{
Simon Glass5f4bd8c2017-07-04 13:31:19 -06001725#if CONFIG_IS_ENABLED(DM_MMC)
Jean-Jacques Hiblota49ffa12017-09-21 16:29:48 +02001726#if CONFIG_IS_ENABLED(DM_REGULATOR)
Peng Fan15305962016-10-11 15:08:43 +08001727 int ret;
1728
1729 ret = device_get_supply_regulator(mmc->dev, "vmmc-supply",
Jean-Jacques Hiblota49ffa12017-09-21 16:29:48 +02001730 &mmc->vmmc_supply);
1731 if (ret)
Jaehoon Chung44462502016-10-24 15:22:22 +09001732 debug("%s: No vmmc supply\n", mmc->dev->name);
Jean-Jacques Hiblota49ffa12017-09-21 16:29:48 +02001733
1734 ret = device_get_supply_regulator(mmc->dev, "vqmmc-supply",
1735 &mmc->vqmmc_supply);
1736 if (ret)
1737 debug("%s: No vqmmc supply\n", mmc->dev->name);
Peng Fan15305962016-10-11 15:08:43 +08001738
Jean-Jacques Hiblota49ffa12017-09-21 16:29:48 +02001739 if (mmc->vmmc_supply) {
1740 ret = regulator_set_enable(mmc->vmmc_supply, true);
1741 if (ret) {
1742 puts("Error enabling VMMC supply\n");
1743 return ret;
1744 }
Peng Fan15305962016-10-11 15:08:43 +08001745 }
1746#endif
Simon Glass833b80d2017-04-22 19:10:56 -06001747#else /* !CONFIG_DM_MMC */
1748 /*
1749 * Driver model should use a regulator, as above, rather than calling
1750 * out to board code.
1751 */
1752 board_mmc_power_init();
1753#endif
Peng Fan15305962016-10-11 15:08:43 +08001754 return 0;
1755}
1756
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001757int mmc_start_init(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001758{
Simon Glass394dfc02016-06-12 23:30:22 -06001759 bool no_card;
Macpaul Lin028bde12011-11-14 23:35:39 +00001760 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001761
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001762 /* we pretend there's no card when init is NULL */
Simon Glass394dfc02016-06-12 23:30:22 -06001763 no_card = mmc_getcd(mmc) == 0;
Simon Glasseba48f92017-07-29 11:35:31 -06001764#if !CONFIG_IS_ENABLED(DM_MMC)
Simon Glass394dfc02016-06-12 23:30:22 -06001765 no_card = no_card || (mmc->cfg->ops->init == NULL);
1766#endif
1767 if (no_card) {
Thierry Redingb9c8b772012-01-02 01:15:37 +00001768 mmc->has_init = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001769#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Redingb9c8b772012-01-02 01:15:37 +00001770 printf("MMC: no card present\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001771#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +09001772 return -ENOMEDIUM;
Thierry Redingb9c8b772012-01-02 01:15:37 +00001773 }
1774
Lei Wen31b99802011-05-02 16:26:26 +00001775 if (mmc->has_init)
1776 return 0;
1777
Yangbo Lub124f8a2015-04-22 13:57:00 +08001778#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1779 mmc_adapter_card_type_ident();
1780#endif
Peng Fan15305962016-10-11 15:08:43 +08001781 err = mmc_power_init(mmc);
1782 if (err)
1783 return err;
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001784
Simon Glasseba48f92017-07-29 11:35:31 -06001785#if CONFIG_IS_ENABLED(DM_MMC)
Simon Glass394dfc02016-06-12 23:30:22 -06001786 /* The device has already been probed ready for use */
1787#else
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001788 /* made sure it's not NULL earlier */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001789 err = mmc->cfg->ops->init(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001790 if (err)
1791 return err;
Simon Glass394dfc02016-06-12 23:30:22 -06001792#endif
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001793 mmc->ddr_mode = 0;
Ilya Yanok8459aab2009-06-29 17:53:16 +04001794 mmc_set_bus_width(mmc, 1);
1795 mmc_set_clock(mmc, 1);
1796
Andy Flemingad347bb2008-10-30 16:41:01 -05001797 /* Reset the Card */
1798 err = mmc_go_idle(mmc);
1799
1800 if (err)
1801 return err;
1802
Lei Wen31b99802011-05-02 16:26:26 +00001803 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glasse5db1152016-05-01 13:52:35 -06001804 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wen31b99802011-05-02 16:26:26 +00001805
Andy Flemingad347bb2008-10-30 16:41:01 -05001806 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001807 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001808
Andy Flemingad347bb2008-10-30 16:41:01 -05001809 /* Now try to get the SD card's operating condition */
1810 err = sd_send_op_cond(mmc);
1811
1812 /* If the command timed out, we check for an MMC card */
Jaehoon Chung7825d202016-07-19 16:33:36 +09001813 if (err == -ETIMEDOUT) {
Andy Flemingad347bb2008-10-30 16:41:01 -05001814 err = mmc_send_op_cond(mmc);
1815
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001816 if (err) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001817#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001818 printf("Card did not respond to voltage select!\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001819#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +09001820 return -EOPNOTSUPP;
Andy Flemingad347bb2008-10-30 16:41:01 -05001821 }
1822 }
1823
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001824 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001825 mmc->init_in_progress = 1;
1826
1827 return err;
1828}
1829
1830static int mmc_complete_init(struct mmc *mmc)
1831{
1832 int err = 0;
1833
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001834 mmc->init_in_progress = 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001835 if (mmc->op_cond_pending)
1836 err = mmc_complete_op_cond(mmc);
1837
1838 if (!err)
1839 err = mmc_startup(mmc);
Lei Wen31b99802011-05-02 16:26:26 +00001840 if (err)
1841 mmc->has_init = 0;
1842 else
1843 mmc->has_init = 1;
1844 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001845}
1846
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001847int mmc_init(struct mmc *mmc)
1848{
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001849 int err = 0;
Marek Vasut5eecff22016-12-01 02:06:32 +01001850 __maybe_unused unsigned start;
Simon Glass5f4bd8c2017-07-04 13:31:19 -06001851#if CONFIG_IS_ENABLED(DM_MMC)
Simon Glass59bc6f22016-05-01 13:52:41 -06001852 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001853
Simon Glass59bc6f22016-05-01 13:52:41 -06001854 upriv->mmc = mmc;
1855#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001856 if (mmc->has_init)
1857 return 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001858
1859 start = get_timer(0);
1860
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001861 if (!mmc->init_in_progress)
1862 err = mmc_start_init(mmc);
1863
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001864 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001865 err = mmc_complete_init(mmc);
Jagan Teki9bee2b52017-01-10 11:18:43 +01001866 if (err)
1867 printf("%s: %d, time %lu\n", __func__, err, get_timer(start));
1868
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001869 return err;
1870}
1871
Markus Niebel03951412013-12-16 13:40:46 +01001872int mmc_set_dsr(struct mmc *mmc, u16 val)
1873{
1874 mmc->dsr = val;
1875 return 0;
1876}
1877
Jeroen Hofstee47726302014-07-10 22:46:28 +02001878/* CPU-specific MMC initializations */
1879__weak int cpu_mmc_init(bd_t *bis)
Andy Flemingad347bb2008-10-30 16:41:01 -05001880{
1881 return -1;
1882}
1883
Jeroen Hofstee47726302014-07-10 22:46:28 +02001884/* board-specific MMC initializations. */
1885__weak int board_mmc_init(bd_t *bis)
1886{
1887 return -1;
1888}
Andy Flemingad347bb2008-10-30 16:41:01 -05001889
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001890void mmc_set_preinit(struct mmc *mmc, int preinit)
1891{
1892 mmc->preinit = preinit;
1893}
1894
Simon Glass5f4bd8c2017-07-04 13:31:19 -06001895#if CONFIG_IS_ENABLED(DM_MMC) && defined(CONFIG_SPL_BUILD)
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001896static int mmc_probe(bd_t *bis)
1897{
1898 return 0;
1899}
Simon Glass5f4bd8c2017-07-04 13:31:19 -06001900#elif CONFIG_IS_ENABLED(DM_MMC)
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001901static int mmc_probe(bd_t *bis)
1902{
Simon Glass547cb342015-12-29 05:22:49 -07001903 int ret, i;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001904 struct uclass *uc;
Simon Glass547cb342015-12-29 05:22:49 -07001905 struct udevice *dev;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001906
1907 ret = uclass_get(UCLASS_MMC, &uc);
1908 if (ret)
1909 return ret;
1910
Simon Glass547cb342015-12-29 05:22:49 -07001911 /*
1912 * Try to add them in sequence order. Really with driver model we
1913 * should allow holes, but the current MMC list does not allow that.
1914 * So if we request 0, 1, 3 we will get 0, 1, 2.
1915 */
1916 for (i = 0; ; i++) {
1917 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1918 if (ret == -ENODEV)
1919 break;
1920 }
1921 uclass_foreach_dev(dev, uc) {
1922 ret = device_probe(dev);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001923 if (ret)
Simon Glass547cb342015-12-29 05:22:49 -07001924 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001925 }
1926
1927 return 0;
1928}
1929#else
1930static int mmc_probe(bd_t *bis)
1931{
1932 if (board_mmc_init(bis) < 0)
1933 cpu_mmc_init(bis);
1934
1935 return 0;
1936}
1937#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001938
Andy Flemingad347bb2008-10-30 16:41:01 -05001939int mmc_initialize(bd_t *bis)
1940{
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001941 static int initialized = 0;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001942 int ret;
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001943 if (initialized) /* Avoid initializing mmc multiple times */
1944 return 0;
1945 initialized = 1;
1946
Simon Glass5f4bd8c2017-07-04 13:31:19 -06001947#if !CONFIG_IS_ENABLED(BLK)
Marek Vasutf537e392016-12-01 02:06:33 +01001948#if !CONFIG_IS_ENABLED(MMC_TINY)
Simon Glasse5db1152016-05-01 13:52:35 -06001949 mmc_list_init();
1950#endif
Marek Vasutf537e392016-12-01 02:06:33 +01001951#endif
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001952 ret = mmc_probe(bis);
1953 if (ret)
1954 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -05001955
Ying Zhang9ff70262013-08-16 15:16:11 +08001956#ifndef CONFIG_SPL_BUILD
Andy Flemingad347bb2008-10-30 16:41:01 -05001957 print_mmc_devices(',');
Ying Zhang9ff70262013-08-16 15:16:11 +08001958#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001959
Simon Glasse5db1152016-05-01 13:52:35 -06001960 mmc_do_preinit();
Andy Flemingad347bb2008-10-30 16:41:01 -05001961 return 0;
1962}
Tomas Melinc17dae52016-11-25 11:01:03 +02001963
1964#ifdef CONFIG_CMD_BKOPS_ENABLE
1965int mmc_set_bkops_enable(struct mmc *mmc)
1966{
1967 int err;
1968 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1969
1970 err = mmc_send_ext_csd(mmc, ext_csd);
1971 if (err) {
1972 puts("Could not get ext_csd register values\n");
1973 return err;
1974 }
1975
1976 if (!(ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1)) {
1977 puts("Background operations not supported on device\n");
1978 return -EMEDIUMTYPE;
1979 }
1980
1981 if (ext_csd[EXT_CSD_BKOPS_EN] & 0x1) {
1982 puts("Background operations already enabled\n");
1983 return 0;
1984 }
1985
1986 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, 1);
1987 if (err) {
1988 puts("Failed to enable manual background operations\n");
1989 return err;
1990 }
1991
1992 puts("Enabled manual background operations\n");
1993
1994 return 0;
1995}
1996#endif