blob: 3648950cf5a3fc39cb736b01eafa1b82308ff14c [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 Glass394dfc02016-06-12 23:30:22 -060056#ifndef CONFIG_DM_MMC_OPS
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
Simon Glass394dfc02016-06-12 23:30:22 -0600152#ifndef CONFIG_DM_MMC_OPS
Simon Glassb23d96e2016-06-12 23:30:20 -0600153int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
154{
155 int ret;
156
157 mmmc_trace_before_send(mmc, cmd);
158 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
159 mmmc_trace_after_send(mmc, cmd, ret);
160
Marek Vasutdccb6082012-03-15 18:41:35 +0000161 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500162}
Simon Glass394dfc02016-06-12 23:30:22 -0600163#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500164
Paul Burton8d30cc92013-09-09 15:30:26 +0100165int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000166{
167 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000168 int err, retries = 5;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000169
170 cmd.cmdidx = MMC_CMD_SEND_STATUS;
171 cmd.resp_type = MMC_RSP_R1;
Marek Vasutc4427392011-08-10 09:24:48 +0200172 if (!mmc_host_is_spi(mmc))
173 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000174
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500175 while (1) {
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000176 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-02-05 22:29:12 +0000177 if (!err) {
178 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
179 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
180 MMC_STATE_PRG)
181 break;
182 else if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100183#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzke31789322012-02-05 22:29:12 +0000184 printf("Status Error: 0x%08X\n",
185 cmd.response[0]);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100186#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +0900187 return -ECOMM;
Jan Kloetzke31789322012-02-05 22:29:12 +0000188 }
189 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000190 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000191
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500192 if (timeout-- <= 0)
193 break;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000194
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500195 udelay(1000);
196 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000197
Simon Glassb23d96e2016-06-12 23:30:20 -0600198 mmc_trace_state(mmc, &cmd);
Jongman Heo1be00d92012-06-03 21:32:13 +0000199 if (timeout <= 0) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100200#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000201 printf("Timeout waiting card ready\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100202#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +0900203 return -ETIMEDOUT;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000204 }
205
206 return 0;
207}
208
Paul Burton8d30cc92013-09-09 15:30:26 +0100209int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Flemingad347bb2008-10-30 16:41:01 -0500210{
211 struct mmc_cmd cmd;
212
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -0600213 if (mmc->ddr_mode)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900214 return 0;
215
Andy Flemingad347bb2008-10-30 16:41:01 -0500216 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
217 cmd.resp_type = MMC_RSP_R1;
218 cmd.cmdarg = len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500219
220 return mmc_send_cmd(mmc, &cmd, NULL);
221}
222
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200223static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillips87ea3892012-10-29 13:34:43 +0000224 lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500225{
226 struct mmc_cmd cmd;
227 struct mmc_data data;
228
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700229 if (blkcnt > 1)
230 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
231 else
232 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500233
234 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700235 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500236 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700237 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500238
239 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500240
241 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700242 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500243 data.blocksize = mmc->read_bl_len;
244 data.flags = MMC_DATA_READ;
245
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700246 if (mmc_send_cmd(mmc, &cmd, &data))
247 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500248
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700249 if (blkcnt > 1) {
250 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
251 cmd.cmdarg = 0;
252 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700253 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100254#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700255 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100256#endif
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700257 return 0;
258 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500259 }
260
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700261 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500262}
263
Simon Glass59bc6f22016-05-01 13:52:41 -0600264#ifdef CONFIG_BLK
Simon Glass62e293a2016-06-12 23:30:15 -0600265ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
Simon Glass59bc6f22016-05-01 13:52:41 -0600266#else
Simon Glass62e293a2016-06-12 23:30:15 -0600267ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
268 void *dst)
Simon Glass59bc6f22016-05-01 13:52:41 -0600269#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500270{
Simon Glass59bc6f22016-05-01 13:52:41 -0600271#ifdef CONFIG_BLK
272 struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
273#endif
Simon Glass2f26fff2016-02-29 15:25:51 -0700274 int dev_num = block_dev->devnum;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700275 int err;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700276 lbaint_t cur, blocks_todo = blkcnt;
277
278 if (blkcnt == 0)
279 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500280
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700281 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500282 if (!mmc)
283 return 0;
284
Marek Vasutf537e392016-12-01 02:06:33 +0100285 if (CONFIG_IS_ENABLED(MMC_TINY))
286 err = mmc_switch_part(mmc, block_dev->hwpart);
287 else
288 err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
289
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700290 if (err < 0)
291 return 0;
292
Simon Glasse5db1152016-05-01 13:52:35 -0600293 if ((start + blkcnt) > block_dev->lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100294#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200295 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Simon Glasse5db1152016-05-01 13:52:35 -0600296 start + blkcnt, block_dev->lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100297#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800298 return 0;
299 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500300
Simon Glassa4343c42015-06-23 15:38:50 -0600301 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
302 debug("%s: Failed to set blocklen\n", __func__);
Andy Flemingad347bb2008-10-30 16:41:01 -0500303 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600304 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500305
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700306 do {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200307 cur = (blocks_todo > mmc->cfg->b_max) ?
308 mmc->cfg->b_max : blocks_todo;
Simon Glassa4343c42015-06-23 15:38:50 -0600309 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
310 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700311 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600312 }
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700313 blocks_todo -= cur;
314 start += cur;
315 dst += cur * mmc->read_bl_len;
316 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500317
318 return blkcnt;
319}
320
Kim Phillips87ea3892012-10-29 13:34:43 +0000321static int mmc_go_idle(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500322{
323 struct mmc_cmd cmd;
324 int err;
325
326 udelay(1000);
327
328 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
329 cmd.cmdarg = 0;
330 cmd.resp_type = MMC_RSP_NONE;
Andy Flemingad347bb2008-10-30 16:41:01 -0500331
332 err = mmc_send_cmd(mmc, &cmd, NULL);
333
334 if (err)
335 return err;
336
337 udelay(2000);
338
339 return 0;
340}
341
Kim Phillips87ea3892012-10-29 13:34:43 +0000342static int sd_send_op_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500343{
344 int timeout = 1000;
345 int err;
346 struct mmc_cmd cmd;
347
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500348 while (1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500349 cmd.cmdidx = MMC_CMD_APP_CMD;
350 cmd.resp_type = MMC_RSP_R1;
351 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500352
353 err = mmc_send_cmd(mmc, &cmd, NULL);
354
355 if (err)
356 return err;
357
358 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
359 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100360
361 /*
362 * Most cards do not answer if some reserved bits
363 * in the ocr are set. However, Some controller
364 * can set bit 7 (reserved for low voltages), but
365 * how to manage low voltages SD card is not yet
366 * specified.
367 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000368 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200369 (mmc->cfg->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500370
371 if (mmc->version == SD_VERSION_2)
372 cmd.cmdarg |= OCR_HCS;
373
374 err = mmc_send_cmd(mmc, &cmd, NULL);
375
376 if (err)
377 return err;
378
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500379 if (cmd.response[0] & OCR_BUSY)
380 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500381
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500382 if (timeout-- <= 0)
Jaehoon Chung7825d202016-07-19 16:33:36 +0900383 return -EOPNOTSUPP;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500384
385 udelay(1000);
386 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500387
388 if (mmc->version != SD_VERSION_2)
389 mmc->version = SD_VERSION_1_0;
390
Thomas Chou1254c3d2010-12-24 13:12:21 +0000391 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
392 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
393 cmd.resp_type = MMC_RSP_R3;
394 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000395
396 err = mmc_send_cmd(mmc, &cmd, NULL);
397
398 if (err)
399 return err;
400 }
401
Rabin Vincentb6eed942009-04-05 13:30:56 +0530402 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500403
404 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
405 mmc->rca = 0;
406
407 return 0;
408}
409
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500410static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Flemingad347bb2008-10-30 16:41:01 -0500411{
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500412 struct mmc_cmd cmd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500413 int err;
414
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500415 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
416 cmd.resp_type = MMC_RSP_R3;
417 cmd.cmdarg = 0;
Rob Herring5fd3edd2015-03-23 17:56:59 -0500418 if (use_arg && !mmc_host_is_spi(mmc))
419 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200420 (mmc->cfg->voltages &
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500421 (mmc->ocr & OCR_VOLTAGE_MASK)) |
422 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000423
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500424 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000425 if (err)
426 return err;
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500427 mmc->ocr = cmd.response[0];
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000428 return 0;
429}
430
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200431static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000432{
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000433 int err, i;
434
Andy Flemingad347bb2008-10-30 16:41:01 -0500435 /* Some cards seem to need this */
436 mmc_go_idle(mmc);
437
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000438 /* Asking to the card its capabilities */
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000439 for (i = 0; i < 2; i++) {
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500440 err = mmc_send_op_cond_iter(mmc, i != 0);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000441 if (err)
442 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200443
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000444 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500445 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500446 break;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000447 }
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500448 mmc->op_cond_pending = 1;
449 return 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000450}
Wolfgang Denk80f70212011-05-19 22:21:41 +0200451
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200452static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000453{
454 struct mmc_cmd cmd;
455 int timeout = 1000;
456 uint start;
457 int err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200458
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000459 mmc->op_cond_pending = 0;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500460 if (!(mmc->ocr & OCR_BUSY)) {
Yangbo Lu9c720612016-08-02 15:33:18 +0800461 /* Some cards seem to need this */
462 mmc_go_idle(mmc);
463
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500464 start = get_timer(0);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500465 while (1) {
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500466 err = mmc_send_op_cond_iter(mmc, 1);
467 if (err)
468 return err;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500469 if (mmc->ocr & OCR_BUSY)
470 break;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500471 if (get_timer(start) > timeout)
Jaehoon Chung7825d202016-07-19 16:33:36 +0900472 return -EOPNOTSUPP;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500473 udelay(100);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500474 }
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500475 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500476
Thomas Chou1254c3d2010-12-24 13:12:21 +0000477 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
478 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
479 cmd.resp_type = MMC_RSP_R3;
480 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000481
482 err = mmc_send_cmd(mmc, &cmd, NULL);
483
484 if (err)
485 return err;
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500486
487 mmc->ocr = cmd.response[0];
Thomas Chou1254c3d2010-12-24 13:12:21 +0000488 }
489
Andy Flemingad347bb2008-10-30 16:41:01 -0500490 mmc->version = MMC_VERSION_UNKNOWN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500491
492 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrenf6545f12014-01-30 16:11:12 -0700493 mmc->rca = 1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500494
495 return 0;
496}
497
498
Kim Phillips87ea3892012-10-29 13:34:43 +0000499static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Flemingad347bb2008-10-30 16:41:01 -0500500{
501 struct mmc_cmd cmd;
502 struct mmc_data data;
503 int err;
504
505 /* Get the Card Status Register */
506 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
507 cmd.resp_type = MMC_RSP_R1;
508 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500509
Yoshihiro Shimodaf6bec732012-06-07 19:09:11 +0000510 data.dest = (char *)ext_csd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500511 data.blocks = 1;
Simon Glassa09c2b72013-04-03 08:54:30 +0000512 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500513 data.flags = MMC_DATA_READ;
514
515 err = mmc_send_cmd(mmc, &cmd, &data);
516
517 return err;
518}
519
Simon Glass84f9df92016-06-12 23:30:18 -0600520int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Flemingad347bb2008-10-30 16:41:01 -0500521{
522 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000523 int timeout = 1000;
Maxime Riparde7462aa2016-11-04 16:18:08 +0100524 int retries = 3;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000525 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500526
527 cmd.cmdidx = MMC_CMD_SWITCH;
528 cmd.resp_type = MMC_RSP_R1b;
529 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000530 (index << 16) |
531 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500532
Maxime Riparde7462aa2016-11-04 16:18:08 +0100533 while (retries > 0) {
534 ret = mmc_send_cmd(mmc, &cmd, NULL);
535
536 /* Waiting for the ready status */
537 if (!ret) {
538 ret = mmc_send_status(mmc, timeout);
539 return ret;
540 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000541
Maxime Riparde7462aa2016-11-04 16:18:08 +0100542 retries--;
543 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000544
545 return ret;
546
Andy Flemingad347bb2008-10-30 16:41:01 -0500547}
548
Kim Phillips87ea3892012-10-29 13:34:43 +0000549static int mmc_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500550{
Simon Glassa09c2b72013-04-03 08:54:30 +0000551 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Flemingad347bb2008-10-30 16:41:01 -0500552 char cardtype;
553 int err;
554
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600555 mmc->card_caps = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500556
Thomas Chou1254c3d2010-12-24 13:12:21 +0000557 if (mmc_host_is_spi(mmc))
558 return 0;
559
Andy Flemingad347bb2008-10-30 16:41:01 -0500560 /* Only version 4 supports high-speed */
561 if (mmc->version < MMC_VERSION_4)
562 return 0;
563
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600564 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
565
Andy Flemingad347bb2008-10-30 16:41:01 -0500566 err = mmc_send_ext_csd(mmc, ext_csd);
567
568 if (err)
569 return err;
570
Lei Wen217467f2011-10-03 20:35:10 +0000571 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500572
573 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
574
575 if (err)
Heiko Schocher9016ab92016-06-07 08:31:21 +0200576 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -0500577
578 /* Now check to see that it worked */
579 err = mmc_send_ext_csd(mmc, ext_csd);
580
581 if (err)
582 return err;
583
584 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000585 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500586 return 0;
587
588 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900589 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov95a37132014-12-01 06:59:10 -0600590 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900591 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Flemingad347bb2008-10-30 16:41:01 -0500592 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900593 } else {
Andy Flemingad347bb2008-10-30 16:41:01 -0500594 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900595 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500596
597 return 0;
598}
599
Stephen Warrene315ae82013-06-11 15:14:01 -0600600static int mmc_set_capacity(struct mmc *mmc, int part_num)
601{
602 switch (part_num) {
603 case 0:
604 mmc->capacity = mmc->capacity_user;
605 break;
606 case 1:
607 case 2:
608 mmc->capacity = mmc->capacity_boot;
609 break;
610 case 3:
611 mmc->capacity = mmc->capacity_rpmb;
612 break;
613 case 4:
614 case 5:
615 case 6:
616 case 7:
617 mmc->capacity = mmc->capacity_gp[part_num - 4];
618 break;
619 default:
620 return -1;
621 }
622
Simon Glasse5db1152016-05-01 13:52:35 -0600623 mmc_get_blk_desc(mmc)->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Stephen Warrene315ae82013-06-11 15:14:01 -0600624
625 return 0;
626}
627
Simon Glass62e293a2016-06-12 23:30:15 -0600628int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
Lei Wen31b99802011-05-02 16:26:26 +0000629{
Stephen Warrene315ae82013-06-11 15:14:01 -0600630 int ret;
Lei Wen31b99802011-05-02 16:26:26 +0000631
Stephen Warrene315ae82013-06-11 15:14:01 -0600632 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
633 (mmc->part_config & ~PART_ACCESS_MASK)
634 | (part_num & PART_ACCESS_MASK));
Peter Bigot45fde892014-09-02 18:31:23 -0500635
636 /*
637 * Set the capacity if the switch succeeded or was intended
638 * to return to representing the raw device.
639 */
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700640 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot45fde892014-09-02 18:31:23 -0500641 ret = mmc_set_capacity(mmc, part_num);
Simon Glass984db5d2016-05-01 13:52:37 -0600642 mmc_get_blk_desc(mmc)->hwpart = part_num;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700643 }
Stephen Warrene315ae82013-06-11 15:14:01 -0600644
Peter Bigot45fde892014-09-02 18:31:23 -0500645 return ret;
Lei Wen31b99802011-05-02 16:26:26 +0000646}
647
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100648int mmc_hwpart_config(struct mmc *mmc,
649 const struct mmc_hwpart_conf *conf,
650 enum mmc_hwpart_conf_mode mode)
651{
652 u8 part_attrs = 0;
653 u32 enh_size_mult;
654 u32 enh_start_addr;
655 u32 gp_size_mult[4];
656 u32 max_enh_size_mult;
657 u32 tot_enh_size_mult = 0;
Diego Santa Cruz80200272014-12-23 10:50:31 +0100658 u8 wr_rel_set;
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100659 int i, pidx, err;
660 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
661
662 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
663 return -EINVAL;
664
665 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
666 printf("eMMC >= 4.4 required for enhanced user data area\n");
667 return -EMEDIUMTYPE;
668 }
669
670 if (!(mmc->part_support & PART_SUPPORT)) {
671 printf("Card does not support partitioning\n");
672 return -EMEDIUMTYPE;
673 }
674
675 if (!mmc->hc_wp_grp_size) {
676 printf("Card does not define HC WP group size\n");
677 return -EMEDIUMTYPE;
678 }
679
680 /* check partition alignment and total enhanced size */
681 if (conf->user.enh_size) {
682 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
683 conf->user.enh_start % mmc->hc_wp_grp_size) {
684 printf("User data enhanced area not HC WP group "
685 "size aligned\n");
686 return -EINVAL;
687 }
688 part_attrs |= EXT_CSD_ENH_USR;
689 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
690 if (mmc->high_capacity) {
691 enh_start_addr = conf->user.enh_start;
692 } else {
693 enh_start_addr = (conf->user.enh_start << 9);
694 }
695 } else {
696 enh_size_mult = 0;
697 enh_start_addr = 0;
698 }
699 tot_enh_size_mult += enh_size_mult;
700
701 for (pidx = 0; pidx < 4; pidx++) {
702 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
703 printf("GP%i partition not HC WP group size "
704 "aligned\n", pidx+1);
705 return -EINVAL;
706 }
707 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
708 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
709 part_attrs |= EXT_CSD_ENH_GP(pidx);
710 tot_enh_size_mult += gp_size_mult[pidx];
711 }
712 }
713
714 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
715 printf("Card does not support enhanced attribute\n");
716 return -EMEDIUMTYPE;
717 }
718
719 err = mmc_send_ext_csd(mmc, ext_csd);
720 if (err)
721 return err;
722
723 max_enh_size_mult =
724 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
725 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
726 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
727 if (tot_enh_size_mult > max_enh_size_mult) {
728 printf("Total enhanced size exceeds maximum (%u > %u)\n",
729 tot_enh_size_mult, max_enh_size_mult);
730 return -EMEDIUMTYPE;
731 }
732
Diego Santa Cruz80200272014-12-23 10:50:31 +0100733 /* The default value of EXT_CSD_WR_REL_SET is device
734 * dependent, the values can only be changed if the
735 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
736 * changed only once and before partitioning is completed. */
737 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
738 if (conf->user.wr_rel_change) {
739 if (conf->user.wr_rel_set)
740 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
741 else
742 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
743 }
744 for (pidx = 0; pidx < 4; pidx++) {
745 if (conf->gp_part[pidx].wr_rel_change) {
746 if (conf->gp_part[pidx].wr_rel_set)
747 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
748 else
749 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
750 }
751 }
752
753 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
754 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
755 puts("Card does not support host controlled partition write "
756 "reliability settings\n");
757 return -EMEDIUMTYPE;
758 }
759
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100760 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
761 EXT_CSD_PARTITION_SETTING_COMPLETED) {
762 printf("Card already partitioned\n");
763 return -EPERM;
764 }
765
766 if (mode == MMC_HWPART_CONF_CHECK)
767 return 0;
768
769 /* Partitioning requires high-capacity size definitions */
770 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
771 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
772 EXT_CSD_ERASE_GROUP_DEF, 1);
773
774 if (err)
775 return err;
776
777 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
778
779 /* update erase group size to be high-capacity */
780 mmc->erase_grp_size =
781 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
782
783 }
784
785 /* all OK, write the configuration */
786 for (i = 0; i < 4; i++) {
787 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
788 EXT_CSD_ENH_START_ADDR+i,
789 (enh_start_addr >> (i*8)) & 0xFF);
790 if (err)
791 return err;
792 }
793 for (i = 0; i < 3; i++) {
794 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
795 EXT_CSD_ENH_SIZE_MULT+i,
796 (enh_size_mult >> (i*8)) & 0xFF);
797 if (err)
798 return err;
799 }
800 for (pidx = 0; pidx < 4; pidx++) {
801 for (i = 0; i < 3; i++) {
802 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
803 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
804 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
805 if (err)
806 return err;
807 }
808 }
809 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
810 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
811 if (err)
812 return err;
813
814 if (mode == MMC_HWPART_CONF_SET)
815 return 0;
816
Diego Santa Cruz80200272014-12-23 10:50:31 +0100817 /* The WR_REL_SET is a write-once register but shall be
818 * written before setting PART_SETTING_COMPLETED. As it is
819 * write-once we can only write it when completing the
820 * partitioning. */
821 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
822 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
823 EXT_CSD_WR_REL_SET, wr_rel_set);
824 if (err)
825 return err;
826 }
827
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100828 /* Setting PART_SETTING_COMPLETED confirms the partition
829 * configuration but it only becomes effective after power
830 * cycle, so we do not adjust the partition related settings
831 * in the mmc struct. */
832
833 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
834 EXT_CSD_PARTITION_SETTING,
835 EXT_CSD_PARTITION_SETTING_COMPLETED);
836 if (err)
837 return err;
838
839 return 0;
840}
841
Simon Glass394dfc02016-06-12 23:30:22 -0600842#ifndef CONFIG_DM_MMC_OPS
Thierry Redingb9c8b772012-01-02 01:15:37 +0000843int mmc_getcd(struct mmc *mmc)
844{
845 int cd;
846
847 cd = board_mmc_getcd(mmc);
848
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000849 if (cd < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200850 if (mmc->cfg->ops->getcd)
851 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000852 else
853 cd = 1;
854 }
Thierry Redingb9c8b772012-01-02 01:15:37 +0000855
856 return cd;
857}
Simon Glass394dfc02016-06-12 23:30:22 -0600858#endif
Thierry Redingb9c8b772012-01-02 01:15:37 +0000859
Kim Phillips87ea3892012-10-29 13:34:43 +0000860static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Flemingad347bb2008-10-30 16:41:01 -0500861{
862 struct mmc_cmd cmd;
863 struct mmc_data data;
864
865 /* Switch the frequency */
866 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
867 cmd.resp_type = MMC_RSP_R1;
868 cmd.cmdarg = (mode << 31) | 0xffffff;
869 cmd.cmdarg &= ~(0xf << (group * 4));
870 cmd.cmdarg |= value << (group * 4);
Andy Flemingad347bb2008-10-30 16:41:01 -0500871
872 data.dest = (char *)resp;
873 data.blocksize = 64;
874 data.blocks = 1;
875 data.flags = MMC_DATA_READ;
876
877 return mmc_send_cmd(mmc, &cmd, &data);
878}
879
880
Kim Phillips87ea3892012-10-29 13:34:43 +0000881static int sd_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500882{
883 int err;
884 struct mmc_cmd cmd;
Anton staaf9b00f0d2011-10-03 13:54:59 +0000885 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
886 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500887 struct mmc_data data;
888 int timeout;
889
890 mmc->card_caps = 0;
891
Thomas Chou1254c3d2010-12-24 13:12:21 +0000892 if (mmc_host_is_spi(mmc))
893 return 0;
894
Andy Flemingad347bb2008-10-30 16:41:01 -0500895 /* Read the SCR to find out if this card supports higher speeds */
896 cmd.cmdidx = MMC_CMD_APP_CMD;
897 cmd.resp_type = MMC_RSP_R1;
898 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -0500899
900 err = mmc_send_cmd(mmc, &cmd, NULL);
901
902 if (err)
903 return err;
904
905 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
906 cmd.resp_type = MMC_RSP_R1;
907 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500908
909 timeout = 3;
910
911retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000912 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500913 data.blocksize = 8;
914 data.blocks = 1;
915 data.flags = MMC_DATA_READ;
916
917 err = mmc_send_cmd(mmc, &cmd, &data);
918
919 if (err) {
920 if (timeout--)
921 goto retry_scr;
922
923 return err;
924 }
925
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300926 mmc->scr[0] = __be32_to_cpu(scr[0]);
927 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500928
929 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng4a4ef872016-03-17 21:53:13 -0700930 case 0:
931 mmc->version = SD_VERSION_1_0;
932 break;
933 case 1:
934 mmc->version = SD_VERSION_1_10;
935 break;
936 case 2:
937 mmc->version = SD_VERSION_2;
938 if ((mmc->scr[0] >> 15) & 0x1)
939 mmc->version = SD_VERSION_3;
940 break;
941 default:
942 mmc->version = SD_VERSION_1_0;
943 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500944 }
945
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530946 if (mmc->scr[0] & SD_DATA_4BIT)
947 mmc->card_caps |= MMC_MODE_4BIT;
948
Andy Flemingad347bb2008-10-30 16:41:01 -0500949 /* Version 1.0 doesn't support switching */
950 if (mmc->version == SD_VERSION_1_0)
951 return 0;
952
953 timeout = 4;
954 while (timeout--) {
955 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000956 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500957
958 if (err)
959 return err;
960
961 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300962 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500963 break;
964 }
965
Andy Flemingad347bb2008-10-30 16:41:01 -0500966 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300967 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -0500968 return 0;
969
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000970 /*
971 * If the host doesn't support SD_HIGHSPEED, do not switch card to
972 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
973 * This can avoid furthur problem when the card runs in different
974 * mode between the host.
975 */
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200976 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
977 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000978 return 0;
979
Anton staaf9b00f0d2011-10-03 13:54:59 +0000980 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500981
982 if (err)
983 return err;
984
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300985 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -0500986 mmc->card_caps |= MMC_MODE_HS;
987
988 return 0;
989}
990
Peng Fanb3fcf1e2016-09-01 11:13:38 +0800991static int sd_read_ssr(struct mmc *mmc)
992{
993 int err, i;
994 struct mmc_cmd cmd;
995 ALLOC_CACHE_ALIGN_BUFFER(uint, ssr, 16);
996 struct mmc_data data;
997 int timeout = 3;
998 unsigned int au, eo, et, es;
999
1000 cmd.cmdidx = MMC_CMD_APP_CMD;
1001 cmd.resp_type = MMC_RSP_R1;
1002 cmd.cmdarg = mmc->rca << 16;
1003
1004 err = mmc_send_cmd(mmc, &cmd, NULL);
1005 if (err)
1006 return err;
1007
1008 cmd.cmdidx = SD_CMD_APP_SD_STATUS;
1009 cmd.resp_type = MMC_RSP_R1;
1010 cmd.cmdarg = 0;
1011
1012retry_ssr:
1013 data.dest = (char *)ssr;
1014 data.blocksize = 64;
1015 data.blocks = 1;
1016 data.flags = MMC_DATA_READ;
1017
1018 err = mmc_send_cmd(mmc, &cmd, &data);
1019 if (err) {
1020 if (timeout--)
1021 goto retry_ssr;
1022
1023 return err;
1024 }
1025
1026 for (i = 0; i < 16; i++)
1027 ssr[i] = be32_to_cpu(ssr[i]);
1028
1029 au = (ssr[2] >> 12) & 0xF;
1030 if ((au <= 9) || (mmc->version == SD_VERSION_3)) {
1031 mmc->ssr.au = sd_au_size[au];
1032 es = (ssr[3] >> 24) & 0xFF;
1033 es |= (ssr[2] & 0xFF) << 8;
1034 et = (ssr[3] >> 18) & 0x3F;
1035 if (es && et) {
1036 eo = (ssr[3] >> 16) & 0x3;
1037 mmc->ssr.erase_timeout = (et * 1000) / es;
1038 mmc->ssr.erase_offset = eo * 1000;
1039 }
1040 } else {
1041 debug("Invalid Allocation Unit Size.\n");
1042 }
1043
1044 return 0;
1045}
1046
Andy Flemingad347bb2008-10-30 16:41:01 -05001047/* frequency bases */
1048/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +00001049static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -05001050 10000,
1051 100000,
1052 1000000,
1053 10000000,
1054};
1055
1056/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
1057 * to platforms without floating point.
1058 */
Simon Glass03317cc2016-05-14 14:02:57 -06001059static const u8 multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -05001060 0, /* reserved */
1061 10,
1062 12,
1063 13,
1064 15,
1065 20,
1066 25,
1067 30,
1068 35,
1069 40,
1070 45,
1071 50,
1072 55,
1073 60,
1074 70,
1075 80,
1076};
1077
Simon Glass394dfc02016-06-12 23:30:22 -06001078#ifndef CONFIG_DM_MMC_OPS
Kim Phillips87ea3892012-10-29 13:34:43 +00001079static void mmc_set_ios(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001080{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001081 if (mmc->cfg->ops->set_ios)
1082 mmc->cfg->ops->set_ios(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001083}
Simon Glass394dfc02016-06-12 23:30:22 -06001084#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001085
1086void mmc_set_clock(struct mmc *mmc, uint clock)
1087{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001088 if (clock > mmc->cfg->f_max)
1089 clock = mmc->cfg->f_max;
Andy Flemingad347bb2008-10-30 16:41:01 -05001090
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001091 if (clock < mmc->cfg->f_min)
1092 clock = mmc->cfg->f_min;
Andy Flemingad347bb2008-10-30 16:41:01 -05001093
1094 mmc->clock = clock;
1095
1096 mmc_set_ios(mmc);
1097}
1098
Kim Phillips87ea3892012-10-29 13:34:43 +00001099static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Flemingad347bb2008-10-30 16:41:01 -05001100{
1101 mmc->bus_width = width;
1102
1103 mmc_set_ios(mmc);
1104}
1105
Kim Phillips87ea3892012-10-29 13:34:43 +00001106static int mmc_startup(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001107{
Stephen Warrene315ae82013-06-11 15:14:01 -06001108 int err, i;
Andy Flemingad347bb2008-10-30 16:41:01 -05001109 uint mult, freq;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001110 u64 cmult, csize, capacity;
Andy Flemingad347bb2008-10-30 16:41:01 -05001111 struct mmc_cmd cmd;
Simon Glassa09c2b72013-04-03 08:54:30 +00001112 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1113 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001114 int timeout = 1000;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001115 bool has_parts = false;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001116 bool part_completed;
Simon Glasse5db1152016-05-01 13:52:35 -06001117 struct blk_desc *bdesc;
Andy Flemingad347bb2008-10-30 16:41:01 -05001118
Thomas Chou1254c3d2010-12-24 13:12:21 +00001119#ifdef CONFIG_MMC_SPI_CRC_ON
1120 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1121 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1122 cmd.resp_type = MMC_RSP_R1;
1123 cmd.cmdarg = 1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001124 err = mmc_send_cmd(mmc, &cmd, NULL);
1125
1126 if (err)
1127 return err;
1128 }
1129#endif
1130
Andy Flemingad347bb2008-10-30 16:41:01 -05001131 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001132 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1133 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -05001134 cmd.resp_type = MMC_RSP_R2;
1135 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001136
1137 err = mmc_send_cmd(mmc, &cmd, NULL);
1138
1139 if (err)
1140 return err;
1141
1142 memcpy(mmc->cid, cmd.response, 16);
1143
1144 /*
1145 * For MMC cards, set the Relative Address.
1146 * For SD cards, get the Relatvie Address.
1147 * This also puts the cards into Standby State
1148 */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001149 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1150 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1151 cmd.cmdarg = mmc->rca << 16;
1152 cmd.resp_type = MMC_RSP_R6;
Andy Flemingad347bb2008-10-30 16:41:01 -05001153
Thomas Chou1254c3d2010-12-24 13:12:21 +00001154 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001155
Thomas Chou1254c3d2010-12-24 13:12:21 +00001156 if (err)
1157 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001158
Thomas Chou1254c3d2010-12-24 13:12:21 +00001159 if (IS_SD(mmc))
1160 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1161 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001162
1163 /* Get the Card-Specific Data */
1164 cmd.cmdidx = MMC_CMD_SEND_CSD;
1165 cmd.resp_type = MMC_RSP_R2;
1166 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001167
1168 err = mmc_send_cmd(mmc, &cmd, NULL);
1169
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001170 /* Waiting for the ready status */
1171 mmc_send_status(mmc, timeout);
1172
Andy Flemingad347bb2008-10-30 16:41:01 -05001173 if (err)
1174 return err;
1175
Rabin Vincentb6eed942009-04-05 13:30:56 +05301176 mmc->csd[0] = cmd.response[0];
1177 mmc->csd[1] = cmd.response[1];
1178 mmc->csd[2] = cmd.response[2];
1179 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001180
1181 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301182 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001183
1184 switch (version) {
Bin Meng4a4ef872016-03-17 21:53:13 -07001185 case 0:
1186 mmc->version = MMC_VERSION_1_2;
1187 break;
1188 case 1:
1189 mmc->version = MMC_VERSION_1_4;
1190 break;
1191 case 2:
1192 mmc->version = MMC_VERSION_2_2;
1193 break;
1194 case 3:
1195 mmc->version = MMC_VERSION_3;
1196 break;
1197 case 4:
1198 mmc->version = MMC_VERSION_4;
1199 break;
1200 default:
1201 mmc->version = MMC_VERSION_1_2;
1202 break;
Andy Flemingad347bb2008-10-30 16:41:01 -05001203 }
1204 }
1205
1206 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301207 freq = fbase[(cmd.response[0] & 0x7)];
1208 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001209
1210 mmc->tran_speed = freq * mult;
1211
Markus Niebel03951412013-12-16 13:40:46 +01001212 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincentb6eed942009-04-05 13:30:56 +05301213 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001214
1215 if (IS_SD(mmc))
1216 mmc->write_bl_len = mmc->read_bl_len;
1217 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301218 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001219
1220 if (mmc->high_capacity) {
1221 csize = (mmc->csd[1] & 0x3f) << 16
1222 | (mmc->csd[2] & 0xffff0000) >> 16;
1223 cmult = 8;
1224 } else {
1225 csize = (mmc->csd[1] & 0x3ff) << 2
1226 | (mmc->csd[2] & 0xc0000000) >> 30;
1227 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1228 }
1229
Stephen Warrene315ae82013-06-11 15:14:01 -06001230 mmc->capacity_user = (csize + 1) << (cmult + 2);
1231 mmc->capacity_user *= mmc->read_bl_len;
1232 mmc->capacity_boot = 0;
1233 mmc->capacity_rpmb = 0;
1234 for (i = 0; i < 4; i++)
1235 mmc->capacity_gp[i] = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001236
Simon Glassa09c2b72013-04-03 08:54:30 +00001237 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1238 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001239
Simon Glassa09c2b72013-04-03 08:54:30 +00001240 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1241 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001242
Markus Niebel03951412013-12-16 13:40:46 +01001243 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1244 cmd.cmdidx = MMC_CMD_SET_DSR;
1245 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1246 cmd.resp_type = MMC_RSP_NONE;
1247 if (mmc_send_cmd(mmc, &cmd, NULL))
1248 printf("MMC: SET_DSR failed\n");
1249 }
1250
Andy Flemingad347bb2008-10-30 16:41:01 -05001251 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001252 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1253 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001254 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001255 cmd.cmdarg = mmc->rca << 16;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001256 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001257
Thomas Chou1254c3d2010-12-24 13:12:21 +00001258 if (err)
1259 return err;
1260 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001261
Lei Wenea526762011-06-22 17:03:31 +00001262 /*
1263 * For SD, its erase group is always one sector
1264 */
1265 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001266 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301267 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1268 /* check ext_csd version and capacity */
1269 err = mmc_send_ext_csd(mmc, ext_csd);
Diego Santa Cruzca25e062014-12-23 10:50:28 +01001270 if (err)
1271 return err;
1272 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001273 /*
1274 * According to the JEDEC Standard, the value of
1275 * ext_csd's capacity is valid if the value is more
1276 * than 2GB
1277 */
Lei Wen217467f2011-10-03 20:35:10 +00001278 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1279 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1280 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1281 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glassa09c2b72013-04-03 08:54:30 +00001282 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewski237823e2011-07-05 02:19:44 +00001283 if ((capacity >> 20) > 2 * 1024)
Stephen Warrene315ae82013-06-11 15:14:01 -06001284 mmc->capacity_user = capacity;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301285 }
Lei Wen31b99802011-05-02 16:26:26 +00001286
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001287 switch (ext_csd[EXT_CSD_REV]) {
1288 case 1:
1289 mmc->version = MMC_VERSION_4_1;
1290 break;
1291 case 2:
1292 mmc->version = MMC_VERSION_4_2;
1293 break;
1294 case 3:
1295 mmc->version = MMC_VERSION_4_3;
1296 break;
1297 case 5:
1298 mmc->version = MMC_VERSION_4_41;
1299 break;
1300 case 6:
1301 mmc->version = MMC_VERSION_4_5;
1302 break;
Markus Niebel32f53b62014-11-18 15:13:53 +01001303 case 7:
1304 mmc->version = MMC_VERSION_5_0;
1305 break;
Stefan Wahren1243cd82016-06-16 17:54:06 +00001306 case 8:
1307 mmc->version = MMC_VERSION_5_1;
1308 break;
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001309 }
1310
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001311 /* The partition data may be non-zero but it is only
1312 * effective if PARTITION_SETTING_COMPLETED is set in
1313 * EXT_CSD, so ignore any data if this bit is not set,
1314 * except for enabling the high-capacity group size
1315 * definition (see below). */
1316 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1317 EXT_CSD_PARTITION_SETTING_COMPLETED);
1318
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001319 /* store the partition info of emmc */
1320 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1321 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1322 ext_csd[EXT_CSD_BOOT_MULT])
1323 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001324 if (part_completed &&
1325 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001326 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1327
1328 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1329
1330 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1331
1332 for (i = 0; i < 4; i++) {
1333 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001334 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001335 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001336 if (mult)
1337 has_parts = true;
1338 if (!part_completed)
1339 continue;
1340 mmc->capacity_gp[i] = mult;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001341 mmc->capacity_gp[i] *=
1342 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1343 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruze5a2a3a2014-12-23 10:50:21 +01001344 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001345 }
1346
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001347 if (part_completed) {
1348 mmc->enh_user_size =
1349 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
1350 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
1351 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1352 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1353 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1354 mmc->enh_user_size <<= 19;
1355 mmc->enh_user_start =
1356 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
1357 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
1358 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
1359 ext_csd[EXT_CSD_ENH_START_ADDR];
1360 if (mmc->high_capacity)
1361 mmc->enh_user_start <<= 9;
1362 }
Diego Santa Cruz3b62d842014-12-23 10:50:22 +01001363
Lei Wenea526762011-06-22 17:03:31 +00001364 /*
Oliver Metzb3f14092013-10-01 20:32:07 +02001365 * Host needs to enable ERASE_GRP_DEF bit if device is
1366 * partitioned. This bit will be lost every time after a reset
1367 * or power off. This will affect erase size.
Lei Wenea526762011-06-22 17:03:31 +00001368 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001369 if (part_completed)
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001370 has_parts = true;
Oliver Metzb3f14092013-10-01 20:32:07 +02001371 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001372 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1373 has_parts = true;
1374 if (has_parts) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001375 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1376 EXT_CSD_ERASE_GROUP_DEF, 1);
1377
1378 if (err)
1379 return err;
Hannes Petermaier15e874d2014-08-08 09:47:22 +02001380 else
1381 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001382 }
Oliver Metzb3f14092013-10-01 20:32:07 +02001383
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001384 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001385 /* Read out group size from ext_csd */
Lei Wen217467f2011-10-03 20:35:10 +00001386 mmc->erase_grp_size =
Diego Santa Cruz747f6fa2014-12-23 10:50:24 +01001387 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebel6d398922014-11-18 15:11:42 +01001388 /*
1389 * if high capacity and partition setting completed
1390 * SEC_COUNT is valid even if it is smaller than 2 GiB
1391 * JEDEC Standard JESD84-B45, 6.2.4
1392 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001393 if (mmc->high_capacity && part_completed) {
Markus Niebel6d398922014-11-18 15:11:42 +01001394 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1395 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1396 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1397 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1398 capacity *= MMC_MAX_BLOCK_LEN;
1399 mmc->capacity_user = capacity;
1400 }
Simon Glassa09c2b72013-04-03 08:54:30 +00001401 } else {
Oliver Metzb3f14092013-10-01 20:32:07 +02001402 /* Calculate the group size from the csd value. */
Lei Wenea526762011-06-22 17:03:31 +00001403 int erase_gsz, erase_gmul;
1404 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1405 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1406 mmc->erase_grp_size = (erase_gsz + 1)
1407 * (erase_gmul + 1);
1408 }
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001409
1410 mmc->hc_wp_grp_size = 1024
1411 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1412 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruz37a50b92014-12-23 10:50:33 +01001413
1414 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301415 }
1416
Simon Glasse5db1152016-05-01 13:52:35 -06001417 err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
Stephen Warrene315ae82013-06-11 15:14:01 -06001418 if (err)
1419 return err;
1420
Andy Flemingad347bb2008-10-30 16:41:01 -05001421 if (IS_SD(mmc))
1422 err = sd_change_freq(mmc);
1423 else
1424 err = mmc_change_freq(mmc);
1425
1426 if (err)
1427 return err;
1428
1429 /* Restrict card's capabilities by what the host can do */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001430 mmc->card_caps &= mmc->cfg->host_caps;
Andy Flemingad347bb2008-10-30 16:41:01 -05001431
1432 if (IS_SD(mmc)) {
1433 if (mmc->card_caps & MMC_MODE_4BIT) {
1434 cmd.cmdidx = MMC_CMD_APP_CMD;
1435 cmd.resp_type = MMC_RSP_R1;
1436 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001437
1438 err = mmc_send_cmd(mmc, &cmd, NULL);
1439 if (err)
1440 return err;
1441
1442 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1443 cmd.resp_type = MMC_RSP_R1;
1444 cmd.cmdarg = 2;
Andy Flemingad347bb2008-10-30 16:41:01 -05001445 err = mmc_send_cmd(mmc, &cmd, NULL);
1446 if (err)
1447 return err;
1448
1449 mmc_set_bus_width(mmc, 4);
1450 }
1451
Peng Fanb3fcf1e2016-09-01 11:13:38 +08001452 err = sd_read_ssr(mmc);
1453 if (err)
1454 return err;
1455
Andy Flemingad347bb2008-10-30 16:41:01 -05001456 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001457 mmc->tran_speed = 50000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001458 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001459 mmc->tran_speed = 25000000;
Andrew Gabbasovccb7b042014-12-25 10:22:25 -06001460 } else if (mmc->version >= MMC_VERSION_4) {
1461 /* Only version 4 of MMC supports wider bus widths */
Andy Flemingeb766ad2012-10-31 19:02:38 +00001462 int idx;
1463
1464 /* An array of possible bus widths in order of preference */
1465 static unsigned ext_csd_bits[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001466 EXT_CSD_DDR_BUS_WIDTH_8,
1467 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001468 EXT_CSD_BUS_WIDTH_8,
1469 EXT_CSD_BUS_WIDTH_4,
1470 EXT_CSD_BUS_WIDTH_1,
1471 };
1472
1473 /* An array to map CSD bus widths to host cap bits */
1474 static unsigned ext_to_hostcaps[] = {
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001475 [EXT_CSD_DDR_BUS_WIDTH_4] =
1476 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1477 [EXT_CSD_DDR_BUS_WIDTH_8] =
1478 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001479 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1480 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1481 };
1482
1483 /* An array to map chosen bus width to an integer */
1484 static unsigned widths[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001485 8, 4, 8, 4, 1,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001486 };
1487
1488 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1489 unsigned int extw = ext_csd_bits[idx];
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001490 unsigned int caps = ext_to_hostcaps[extw];
Andy Flemingeb766ad2012-10-31 19:02:38 +00001491
1492 /*
Andrew Gabbasovc1b2cf02014-12-25 10:22:24 -06001493 * If the bus width is still not changed,
1494 * don't try to set the default again.
1495 * Otherwise, recover from switch attempts
1496 * by switching to 1-bit bus width.
1497 */
1498 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1499 mmc->bus_width == 1) {
1500 err = 0;
1501 break;
1502 }
1503
1504 /*
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001505 * Check to make sure the card and controller support
1506 * these capabilities
Andy Flemingeb766ad2012-10-31 19:02:38 +00001507 */
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001508 if ((mmc->card_caps & caps) != caps)
Andy Flemingeb766ad2012-10-31 19:02:38 +00001509 continue;
1510
Andy Flemingad347bb2008-10-30 16:41:01 -05001511 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001512 EXT_CSD_BUS_WIDTH, extw);
Andy Flemingad347bb2008-10-30 16:41:01 -05001513
1514 if (err)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001515 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001516
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001517 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Flemingeb766ad2012-10-31 19:02:38 +00001518 mmc_set_bus_width(mmc, widths[idx]);
Andy Flemingad347bb2008-10-30 16:41:01 -05001519
Lei Wen4f5a6a52011-10-03 20:35:11 +00001520 err = mmc_send_ext_csd(mmc, test_csd);
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001521
1522 if (err)
1523 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001524
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001525 /* Only compare read only fields */
1526 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1527 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1528 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1529 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1530 ext_csd[EXT_CSD_REV]
1531 == test_csd[EXT_CSD_REV] &&
1532 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1533 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1534 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1535 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001536 break;
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001537 else
Jaehoon Chung7825d202016-07-19 16:33:36 +09001538 err = -EBADMSG;
Andy Flemingad347bb2008-10-30 16:41:01 -05001539 }
1540
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001541 if (err)
1542 return err;
1543
Andy Flemingad347bb2008-10-30 16:41:01 -05001544 if (mmc->card_caps & MMC_MODE_HS) {
1545 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001546 mmc->tran_speed = 52000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001547 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001548 mmc->tran_speed = 26000000;
1549 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001550 }
1551
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001552 mmc_set_clock(mmc, mmc->tran_speed);
1553
Andrew Gabbasov532663b2014-12-01 06:59:11 -06001554 /* Fix the block length for DDR mode */
1555 if (mmc->ddr_mode) {
1556 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1557 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1558 }
1559
Andy Flemingad347bb2008-10-30 16:41:01 -05001560 /* fill in device description */
Simon Glasse5db1152016-05-01 13:52:35 -06001561 bdesc = mmc_get_blk_desc(mmc);
1562 bdesc->lun = 0;
1563 bdesc->hwpart = 0;
1564 bdesc->type = 0;
1565 bdesc->blksz = mmc->read_bl_len;
1566 bdesc->log2blksz = LOG2(bdesc->blksz);
1567 bdesc->lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsd67754f2015-12-04 23:27:40 +01001568#if !defined(CONFIG_SPL_BUILD) || \
1569 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1570 !defined(CONFIG_USE_TINY_PRINTF))
Simon Glasse5db1152016-05-01 13:52:35 -06001571 sprintf(bdesc->vendor, "Man %06x Snr %04x%04x",
Taylor Hutt7367ec22012-10-20 17:15:59 +00001572 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1573 (mmc->cid[3] >> 16) & 0xffff);
Simon Glasse5db1152016-05-01 13:52:35 -06001574 sprintf(bdesc->product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
Taylor Hutt7367ec22012-10-20 17:15:59 +00001575 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1576 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1577 (mmc->cid[2] >> 24) & 0xff);
Simon Glasse5db1152016-05-01 13:52:35 -06001578 sprintf(bdesc->revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
Taylor Hutt7367ec22012-10-20 17:15:59 +00001579 (mmc->cid[2] >> 16) & 0xf);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001580#else
Simon Glasse5db1152016-05-01 13:52:35 -06001581 bdesc->vendor[0] = 0;
1582 bdesc->product[0] = 0;
1583 bdesc->revision[0] = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001584#endif
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001585#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glasse5db1152016-05-01 13:52:35 -06001586 part_init(bdesc);
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001587#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001588
1589 return 0;
1590}
1591
Kim Phillips87ea3892012-10-29 13:34:43 +00001592static int mmc_send_if_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001593{
1594 struct mmc_cmd cmd;
1595 int err;
1596
1597 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1598 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001599 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Flemingad347bb2008-10-30 16:41:01 -05001600 cmd.resp_type = MMC_RSP_R7;
Andy Flemingad347bb2008-10-30 16:41:01 -05001601
1602 err = mmc_send_cmd(mmc, &cmd, NULL);
1603
1604 if (err)
1605 return err;
1606
Rabin Vincentb6eed942009-04-05 13:30:56 +05301607 if ((cmd.response[0] & 0xff) != 0xaa)
Jaehoon Chung7825d202016-07-19 16:33:36 +09001608 return -EOPNOTSUPP;
Andy Flemingad347bb2008-10-30 16:41:01 -05001609 else
1610 mmc->version = SD_VERSION_2;
1611
1612 return 0;
1613}
1614
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001615/* board-specific MMC power initializations. */
1616__weak void board_mmc_power_init(void)
1617{
1618}
1619
Peng Fan15305962016-10-11 15:08:43 +08001620static int mmc_power_init(struct mmc *mmc)
1621{
1622 board_mmc_power_init();
1623
1624#if defined(CONFIG_DM_MMC) && defined(CONFIG_DM_REGULATOR) && \
1625 !defined(CONFIG_SPL_BUILD)
1626 struct udevice *vmmc_supply;
1627 int ret;
1628
1629 ret = device_get_supply_regulator(mmc->dev, "vmmc-supply",
1630 &vmmc_supply);
1631 if (ret) {
Jaehoon Chung44462502016-10-24 15:22:22 +09001632 debug("%s: No vmmc supply\n", mmc->dev->name);
Peng Fan15305962016-10-11 15:08:43 +08001633 return 0;
1634 }
1635
1636 ret = regulator_set_enable(vmmc_supply, true);
1637 if (ret) {
1638 puts("Error enabling VMMC supply\n");
1639 return ret;
1640 }
1641#endif
1642 return 0;
1643}
1644
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001645int mmc_start_init(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001646{
Simon Glass394dfc02016-06-12 23:30:22 -06001647 bool no_card;
Macpaul Lin028bde12011-11-14 23:35:39 +00001648 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001649
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001650 /* we pretend there's no card when init is NULL */
Simon Glass394dfc02016-06-12 23:30:22 -06001651 no_card = mmc_getcd(mmc) == 0;
1652#ifndef CONFIG_DM_MMC_OPS
1653 no_card = no_card || (mmc->cfg->ops->init == NULL);
1654#endif
1655 if (no_card) {
Thierry Redingb9c8b772012-01-02 01:15:37 +00001656 mmc->has_init = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001657#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Redingb9c8b772012-01-02 01:15:37 +00001658 printf("MMC: no card present\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001659#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +09001660 return -ENOMEDIUM;
Thierry Redingb9c8b772012-01-02 01:15:37 +00001661 }
1662
Lei Wen31b99802011-05-02 16:26:26 +00001663 if (mmc->has_init)
1664 return 0;
1665
Yangbo Lub124f8a2015-04-22 13:57:00 +08001666#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1667 mmc_adapter_card_type_ident();
1668#endif
Peng Fan15305962016-10-11 15:08:43 +08001669 err = mmc_power_init(mmc);
1670 if (err)
1671 return err;
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001672
Simon Glass394dfc02016-06-12 23:30:22 -06001673#ifdef CONFIG_DM_MMC_OPS
1674 /* The device has already been probed ready for use */
1675#else
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001676 /* made sure it's not NULL earlier */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001677 err = mmc->cfg->ops->init(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001678 if (err)
1679 return err;
Simon Glass394dfc02016-06-12 23:30:22 -06001680#endif
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001681 mmc->ddr_mode = 0;
Ilya Yanok8459aab2009-06-29 17:53:16 +04001682 mmc_set_bus_width(mmc, 1);
1683 mmc_set_clock(mmc, 1);
1684
Andy Flemingad347bb2008-10-30 16:41:01 -05001685 /* Reset the Card */
1686 err = mmc_go_idle(mmc);
1687
1688 if (err)
1689 return err;
1690
Lei Wen31b99802011-05-02 16:26:26 +00001691 /* The internal partition reset to user partition(0) at every CMD0*/
Simon Glasse5db1152016-05-01 13:52:35 -06001692 mmc_get_blk_desc(mmc)->hwpart = 0;
Lei Wen31b99802011-05-02 16:26:26 +00001693
Andy Flemingad347bb2008-10-30 16:41:01 -05001694 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001695 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001696
Andy Flemingad347bb2008-10-30 16:41:01 -05001697 /* Now try to get the SD card's operating condition */
1698 err = sd_send_op_cond(mmc);
1699
1700 /* If the command timed out, we check for an MMC card */
Jaehoon Chung7825d202016-07-19 16:33:36 +09001701 if (err == -ETIMEDOUT) {
Andy Flemingad347bb2008-10-30 16:41:01 -05001702 err = mmc_send_op_cond(mmc);
1703
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001704 if (err) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001705#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001706 printf("Card did not respond to voltage select!\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001707#endif
Jaehoon Chung7825d202016-07-19 16:33:36 +09001708 return -EOPNOTSUPP;
Andy Flemingad347bb2008-10-30 16:41:01 -05001709 }
1710 }
1711
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001712 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001713 mmc->init_in_progress = 1;
1714
1715 return err;
1716}
1717
1718static int mmc_complete_init(struct mmc *mmc)
1719{
1720 int err = 0;
1721
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001722 mmc->init_in_progress = 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001723 if (mmc->op_cond_pending)
1724 err = mmc_complete_op_cond(mmc);
1725
1726 if (!err)
1727 err = mmc_startup(mmc);
Lei Wen31b99802011-05-02 16:26:26 +00001728 if (err)
1729 mmc->has_init = 0;
1730 else
1731 mmc->has_init = 1;
1732 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001733}
1734
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001735int mmc_init(struct mmc *mmc)
1736{
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001737 int err = 0;
Marek Vasut5eecff22016-12-01 02:06:32 +01001738 __maybe_unused unsigned start;
Simon Glass59bc6f22016-05-01 13:52:41 -06001739#ifdef CONFIG_DM_MMC
1740 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001741
Simon Glass59bc6f22016-05-01 13:52:41 -06001742 upriv->mmc = mmc;
1743#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001744 if (mmc->has_init)
1745 return 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001746
1747 start = get_timer(0);
1748
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001749 if (!mmc->init_in_progress)
1750 err = mmc_start_init(mmc);
1751
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001752 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001753 err = mmc_complete_init(mmc);
Jagan Teki9bee2b52017-01-10 11:18:43 +01001754 if (err)
1755 printf("%s: %d, time %lu\n", __func__, err, get_timer(start));
1756
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001757 return err;
1758}
1759
Markus Niebel03951412013-12-16 13:40:46 +01001760int mmc_set_dsr(struct mmc *mmc, u16 val)
1761{
1762 mmc->dsr = val;
1763 return 0;
1764}
1765
Jeroen Hofstee47726302014-07-10 22:46:28 +02001766/* CPU-specific MMC initializations */
1767__weak int cpu_mmc_init(bd_t *bis)
Andy Flemingad347bb2008-10-30 16:41:01 -05001768{
1769 return -1;
1770}
1771
Jeroen Hofstee47726302014-07-10 22:46:28 +02001772/* board-specific MMC initializations. */
1773__weak int board_mmc_init(bd_t *bis)
1774{
1775 return -1;
1776}
Andy Flemingad347bb2008-10-30 16:41:01 -05001777
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001778void mmc_set_preinit(struct mmc *mmc, int preinit)
1779{
1780 mmc->preinit = preinit;
1781}
1782
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001783#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1784static int mmc_probe(bd_t *bis)
1785{
1786 return 0;
1787}
1788#elif defined(CONFIG_DM_MMC)
1789static int mmc_probe(bd_t *bis)
1790{
Simon Glass547cb342015-12-29 05:22:49 -07001791 int ret, i;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001792 struct uclass *uc;
Simon Glass547cb342015-12-29 05:22:49 -07001793 struct udevice *dev;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001794
1795 ret = uclass_get(UCLASS_MMC, &uc);
1796 if (ret)
1797 return ret;
1798
Simon Glass547cb342015-12-29 05:22:49 -07001799 /*
1800 * Try to add them in sequence order. Really with driver model we
1801 * should allow holes, but the current MMC list does not allow that.
1802 * So if we request 0, 1, 3 we will get 0, 1, 2.
1803 */
1804 for (i = 0; ; i++) {
1805 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1806 if (ret == -ENODEV)
1807 break;
1808 }
1809 uclass_foreach_dev(dev, uc) {
1810 ret = device_probe(dev);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001811 if (ret)
Simon Glass547cb342015-12-29 05:22:49 -07001812 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001813 }
1814
1815 return 0;
1816}
1817#else
1818static int mmc_probe(bd_t *bis)
1819{
1820 if (board_mmc_init(bis) < 0)
1821 cpu_mmc_init(bis);
1822
1823 return 0;
1824}
1825#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001826
Andy Flemingad347bb2008-10-30 16:41:01 -05001827int mmc_initialize(bd_t *bis)
1828{
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001829 static int initialized = 0;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001830 int ret;
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001831 if (initialized) /* Avoid initializing mmc multiple times */
1832 return 0;
1833 initialized = 1;
1834
Simon Glasse5db1152016-05-01 13:52:35 -06001835#ifndef CONFIG_BLK
Marek Vasutf537e392016-12-01 02:06:33 +01001836#if !CONFIG_IS_ENABLED(MMC_TINY)
Simon Glasse5db1152016-05-01 13:52:35 -06001837 mmc_list_init();
1838#endif
Marek Vasutf537e392016-12-01 02:06:33 +01001839#endif
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001840 ret = mmc_probe(bis);
1841 if (ret)
1842 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -05001843
Ying Zhang9ff70262013-08-16 15:16:11 +08001844#ifndef CONFIG_SPL_BUILD
Andy Flemingad347bb2008-10-30 16:41:01 -05001845 print_mmc_devices(',');
Ying Zhang9ff70262013-08-16 15:16:11 +08001846#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001847
Simon Glasse5db1152016-05-01 13:52:35 -06001848 mmc_do_preinit();
Andy Flemingad347bb2008-10-30 16:41:01 -05001849 return 0;
1850}
Tomas Melinc17dae52016-11-25 11:01:03 +02001851
1852#ifdef CONFIG_CMD_BKOPS_ENABLE
1853int mmc_set_bkops_enable(struct mmc *mmc)
1854{
1855 int err;
1856 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1857
1858 err = mmc_send_ext_csd(mmc, ext_csd);
1859 if (err) {
1860 puts("Could not get ext_csd register values\n");
1861 return err;
1862 }
1863
1864 if (!(ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1)) {
1865 puts("Background operations not supported on device\n");
1866 return -EMEDIUMTYPE;
1867 }
1868
1869 if (ext_csd[EXT_CSD_BKOPS_EN] & 0x1) {
1870 puts("Background operations already enabled\n");
1871 return 0;
1872 }
1873
1874 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, 1);
1875 if (err) {
1876 puts("Failed to enable manual background operations\n");
1877 return err;
1878 }
1879
1880 puts("Enabled manual background operations\n");
1881
1882 return 0;
1883}
1884#endif