blob: 2211ac6d9948ea900262c50bd8ac50ad1f503d19 [file] [log] [blame]
Andy Flemingad347bb2008-10-30 16:41:01 -05001/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Flemingad347bb2008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -060013#include <dm.h>
14#include <dm/device-internal.h>
Stephen Warrenbf0c7852014-05-23 12:47:06 -060015#include <errno.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050016#include <mmc.h>
17#include <part.h>
18#include <malloc.h>
Simon Glass2dd337a2015-09-02 17:24:58 -060019#include <memalign.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050020#include <linux/list.h>
Rabin Vincent69d4e2c2009-04-05 13:30:54 +053021#include <div64.h>
Paul Burton8d30cc92013-09-09 15:30:26 +010022#include "mmc_private.h"
Andy Flemingad347bb2008-10-30 16:41:01 -050023
24static struct list_head mmc_devices;
25static int cur_dev_num = -1;
26
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +020027__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanov020f2612012-12-03 02:19:46 +000028{
29 return -1;
30}
31
32int mmc_getwp(struct mmc *mmc)
33{
34 int wp;
35
36 wp = board_mmc_getwp(mmc);
37
Peter Korsgaardf7b15102013-03-21 04:00:03 +000038 if (wp < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +020039 if (mmc->cfg->ops->getwp)
40 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +000041 else
42 wp = 0;
43 }
Nikita Kiryanov020f2612012-12-03 02:19:46 +000044
45 return wp;
46}
47
Jeroen Hofstee47726302014-07-10 22:46:28 +020048__weak int board_mmc_getcd(struct mmc *mmc)
49{
Stefano Babic6e00edf2010-02-05 15:04:43 +010050 return -1;
51}
52
Paul Burton8d30cc92013-09-09 15:30:26 +010053int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
Andy Flemingad347bb2008-10-30 16:41:01 -050054{
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000055 int ret;
Marek Vasutdccb6082012-03-15 18:41:35 +000056
Marek Vasutdccb6082012-03-15 18:41:35 +000057#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000058 int i;
59 u8 *ptr;
60
61 printf("CMD_SEND:%d\n", cmd->cmdidx);
62 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
Pantelis Antoniou2c850462014-03-11 19:34:20 +020063 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Bin Meng8d1ad1e2016-03-17 21:53:14 -070064 if (ret) {
65 printf("\t\tRET\t\t\t %d\n", ret);
66 } else {
67 switch (cmd->resp_type) {
68 case MMC_RSP_NONE:
69 printf("\t\tMMC_RSP_NONE\n");
70 break;
71 case MMC_RSP_R1:
72 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
73 cmd->response[0]);
74 break;
75 case MMC_RSP_R1b:
76 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
77 cmd->response[0]);
78 break;
79 case MMC_RSP_R2:
80 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
81 cmd->response[0]);
82 printf("\t\t \t\t 0x%08X \n",
83 cmd->response[1]);
84 printf("\t\t \t\t 0x%08X \n",
85 cmd->response[2]);
86 printf("\t\t \t\t 0x%08X \n",
87 cmd->response[3]);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000088 printf("\n");
Bin Meng8d1ad1e2016-03-17 21:53:14 -070089 printf("\t\t\t\t\tDUMPING DATA\n");
90 for (i = 0; i < 4; i++) {
91 int j;
92 printf("\t\t\t\t\t%03d - ", i*4);
93 ptr = (u8 *)&cmd->response[i];
94 ptr += 3;
95 for (j = 0; j < 4; j++)
96 printf("%02X ", *ptr--);
97 printf("\n");
98 }
99 break;
100 case MMC_RSP_R3:
101 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
102 cmd->response[0]);
103 break;
104 default:
105 printf("\t\tERROR MMC rsp not supported\n");
106 break;
Bin Meng4a4ef872016-03-17 21:53:13 -0700107 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000108 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000109#else
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200110 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000111#endif
Marek Vasutdccb6082012-03-15 18:41:35 +0000112 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500113}
114
Paul Burton8d30cc92013-09-09 15:30:26 +0100115int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000116{
117 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000118 int err, retries = 5;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000119#ifdef CONFIG_MMC_TRACE
120 int status;
121#endif
122
123 cmd.cmdidx = MMC_CMD_SEND_STATUS;
124 cmd.resp_type = MMC_RSP_R1;
Marek Vasutc4427392011-08-10 09:24:48 +0200125 if (!mmc_host_is_spi(mmc))
126 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000127
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500128 while (1) {
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000129 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-02-05 22:29:12 +0000130 if (!err) {
131 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
132 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
133 MMC_STATE_PRG)
134 break;
135 else if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100136#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzke31789322012-02-05 22:29:12 +0000137 printf("Status Error: 0x%08X\n",
138 cmd.response[0]);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100139#endif
Jan Kloetzke31789322012-02-05 22:29:12 +0000140 return COMM_ERR;
141 }
142 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000143 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000144
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500145 if (timeout-- <= 0)
146 break;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000147
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500148 udelay(1000);
149 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000150
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000151#ifdef CONFIG_MMC_TRACE
152 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
153 printf("CURR STATE:%d\n", status);
154#endif
Jongman Heo1be00d92012-06-03 21:32:13 +0000155 if (timeout <= 0) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100156#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000157 printf("Timeout waiting card ready\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100158#endif
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000159 return TIMEOUT;
160 }
Andrew Gabbasove80682f2014-04-03 04:34:32 -0500161 if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
162 return SWITCH_ERR;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000163
164 return 0;
165}
166
Paul Burton8d30cc92013-09-09 15:30:26 +0100167int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Flemingad347bb2008-10-30 16:41:01 -0500168{
169 struct mmc_cmd cmd;
170
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -0600171 if (mmc->ddr_mode)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900172 return 0;
173
Andy Flemingad347bb2008-10-30 16:41:01 -0500174 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
175 cmd.resp_type = MMC_RSP_R1;
176 cmd.cmdarg = len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500177
178 return mmc_send_cmd(mmc, &cmd, NULL);
179}
180
181struct mmc *find_mmc_device(int dev_num)
182{
183 struct mmc *m;
184 struct list_head *entry;
185
186 list_for_each(entry, &mmc_devices) {
187 m = list_entry(entry, struct mmc, link);
188
Simon Glass2f26fff2016-02-29 15:25:51 -0700189 if (m->block_dev.devnum == dev_num)
Andy Flemingad347bb2008-10-30 16:41:01 -0500190 return m;
191 }
192
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100193#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -0500194 printf("MMC Device %d not found\n", dev_num);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100195#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500196
197 return NULL;
198}
199
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200200static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillips87ea3892012-10-29 13:34:43 +0000201 lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500202{
203 struct mmc_cmd cmd;
204 struct mmc_data data;
205
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700206 if (blkcnt > 1)
207 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
208 else
209 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500210
211 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700212 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500213 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700214 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500215
216 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500217
218 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700219 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500220 data.blocksize = mmc->read_bl_len;
221 data.flags = MMC_DATA_READ;
222
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700223 if (mmc_send_cmd(mmc, &cmd, &data))
224 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500225
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700226 if (blkcnt > 1) {
227 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
228 cmd.cmdarg = 0;
229 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700230 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100231#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700232 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100233#endif
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700234 return 0;
235 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500236 }
237
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700238 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500239}
240
Simon Glasse3394752016-02-29 15:25:34 -0700241static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
Stephen Warrene73f2962015-12-07 11:38:48 -0700242 lbaint_t blkcnt, void *dst)
Andy Flemingad347bb2008-10-30 16:41:01 -0500243{
Simon Glass2f26fff2016-02-29 15:25:51 -0700244 int dev_num = block_dev->devnum;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700245 int err;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700246 lbaint_t cur, blocks_todo = blkcnt;
247
248 if (blkcnt == 0)
249 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500250
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700251 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500252 if (!mmc)
253 return 0;
254
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700255 err = mmc_select_hwpart(dev_num, block_dev->hwpart);
256 if (err < 0)
257 return 0;
258
Lei Wene1cc9c82010-09-13 22:07:27 +0800259 if ((start + blkcnt) > mmc->block_dev.lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100260#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200261 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Lei Wene1cc9c82010-09-13 22:07:27 +0800262 start + blkcnt, mmc->block_dev.lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100263#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800264 return 0;
265 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500266
Simon Glassa4343c42015-06-23 15:38:50 -0600267 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
268 debug("%s: Failed to set blocklen\n", __func__);
Andy Flemingad347bb2008-10-30 16:41:01 -0500269 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600270 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500271
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700272 do {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200273 cur = (blocks_todo > mmc->cfg->b_max) ?
274 mmc->cfg->b_max : blocks_todo;
Simon Glassa4343c42015-06-23 15:38:50 -0600275 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
276 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700277 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600278 }
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700279 blocks_todo -= cur;
280 start += cur;
281 dst += cur * mmc->read_bl_len;
282 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500283
284 return blkcnt;
285}
286
Kim Phillips87ea3892012-10-29 13:34:43 +0000287static int mmc_go_idle(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500288{
289 struct mmc_cmd cmd;
290 int err;
291
292 udelay(1000);
293
294 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
295 cmd.cmdarg = 0;
296 cmd.resp_type = MMC_RSP_NONE;
Andy Flemingad347bb2008-10-30 16:41:01 -0500297
298 err = mmc_send_cmd(mmc, &cmd, NULL);
299
300 if (err)
301 return err;
302
303 udelay(2000);
304
305 return 0;
306}
307
Kim Phillips87ea3892012-10-29 13:34:43 +0000308static int sd_send_op_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500309{
310 int timeout = 1000;
311 int err;
312 struct mmc_cmd cmd;
313
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500314 while (1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500315 cmd.cmdidx = MMC_CMD_APP_CMD;
316 cmd.resp_type = MMC_RSP_R1;
317 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500318
319 err = mmc_send_cmd(mmc, &cmd, NULL);
320
321 if (err)
322 return err;
323
324 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
325 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100326
327 /*
328 * Most cards do not answer if some reserved bits
329 * in the ocr are set. However, Some controller
330 * can set bit 7 (reserved for low voltages), but
331 * how to manage low voltages SD card is not yet
332 * specified.
333 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000334 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200335 (mmc->cfg->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500336
337 if (mmc->version == SD_VERSION_2)
338 cmd.cmdarg |= OCR_HCS;
339
340 err = mmc_send_cmd(mmc, &cmd, NULL);
341
342 if (err)
343 return err;
344
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500345 if (cmd.response[0] & OCR_BUSY)
346 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500347
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500348 if (timeout-- <= 0)
349 return UNUSABLE_ERR;
350
351 udelay(1000);
352 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500353
354 if (mmc->version != SD_VERSION_2)
355 mmc->version = SD_VERSION_1_0;
356
Thomas Chou1254c3d2010-12-24 13:12:21 +0000357 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
358 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
359 cmd.resp_type = MMC_RSP_R3;
360 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000361
362 err = mmc_send_cmd(mmc, &cmd, NULL);
363
364 if (err)
365 return err;
366 }
367
Rabin Vincentb6eed942009-04-05 13:30:56 +0530368 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500369
370 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
371 mmc->rca = 0;
372
373 return 0;
374}
375
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500376static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Flemingad347bb2008-10-30 16:41:01 -0500377{
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500378 struct mmc_cmd cmd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500379 int err;
380
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500381 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
382 cmd.resp_type = MMC_RSP_R3;
383 cmd.cmdarg = 0;
Rob Herring5fd3edd2015-03-23 17:56:59 -0500384 if (use_arg && !mmc_host_is_spi(mmc))
385 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200386 (mmc->cfg->voltages &
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500387 (mmc->ocr & OCR_VOLTAGE_MASK)) |
388 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000389
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500390 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000391 if (err)
392 return err;
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500393 mmc->ocr = cmd.response[0];
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000394 return 0;
395}
396
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200397static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000398{
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000399 int err, i;
400
Andy Flemingad347bb2008-10-30 16:41:01 -0500401 /* Some cards seem to need this */
402 mmc_go_idle(mmc);
403
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000404 /* Asking to the card its capabilities */
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000405 for (i = 0; i < 2; i++) {
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500406 err = mmc_send_op_cond_iter(mmc, i != 0);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000407 if (err)
408 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200409
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000410 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500411 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500412 break;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000413 }
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500414 mmc->op_cond_pending = 1;
415 return 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000416}
Wolfgang Denk80f70212011-05-19 22:21:41 +0200417
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200418static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000419{
420 struct mmc_cmd cmd;
421 int timeout = 1000;
422 uint start;
423 int err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200424
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000425 mmc->op_cond_pending = 0;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500426 if (!(mmc->ocr & OCR_BUSY)) {
427 start = get_timer(0);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500428 while (1) {
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500429 err = mmc_send_op_cond_iter(mmc, 1);
430 if (err)
431 return err;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500432 if (mmc->ocr & OCR_BUSY)
433 break;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500434 if (get_timer(start) > timeout)
435 return UNUSABLE_ERR;
436 udelay(100);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500437 }
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500438 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500439
Thomas Chou1254c3d2010-12-24 13:12:21 +0000440 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
441 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
442 cmd.resp_type = MMC_RSP_R3;
443 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000444
445 err = mmc_send_cmd(mmc, &cmd, NULL);
446
447 if (err)
448 return err;
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500449
450 mmc->ocr = cmd.response[0];
Thomas Chou1254c3d2010-12-24 13:12:21 +0000451 }
452
Andy Flemingad347bb2008-10-30 16:41:01 -0500453 mmc->version = MMC_VERSION_UNKNOWN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500454
455 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrenf6545f12014-01-30 16:11:12 -0700456 mmc->rca = 1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500457
458 return 0;
459}
460
461
Kim Phillips87ea3892012-10-29 13:34:43 +0000462static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Flemingad347bb2008-10-30 16:41:01 -0500463{
464 struct mmc_cmd cmd;
465 struct mmc_data data;
466 int err;
467
468 /* Get the Card Status Register */
469 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
470 cmd.resp_type = MMC_RSP_R1;
471 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500472
Yoshihiro Shimodaf6bec732012-06-07 19:09:11 +0000473 data.dest = (char *)ext_csd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500474 data.blocks = 1;
Simon Glassa09c2b72013-04-03 08:54:30 +0000475 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500476 data.flags = MMC_DATA_READ;
477
478 err = mmc_send_cmd(mmc, &cmd, &data);
479
480 return err;
481}
482
483
Kim Phillips87ea3892012-10-29 13:34:43 +0000484static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Flemingad347bb2008-10-30 16:41:01 -0500485{
486 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000487 int timeout = 1000;
488 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500489
490 cmd.cmdidx = MMC_CMD_SWITCH;
491 cmd.resp_type = MMC_RSP_R1b;
492 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000493 (index << 16) |
494 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500495
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000496 ret = mmc_send_cmd(mmc, &cmd, NULL);
497
498 /* Waiting for the ready status */
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000499 if (!ret)
500 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000501
502 return ret;
503
Andy Flemingad347bb2008-10-30 16:41:01 -0500504}
505
Kim Phillips87ea3892012-10-29 13:34:43 +0000506static int mmc_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500507{
Simon Glassa09c2b72013-04-03 08:54:30 +0000508 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Flemingad347bb2008-10-30 16:41:01 -0500509 char cardtype;
510 int err;
511
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600512 mmc->card_caps = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500513
Thomas Chou1254c3d2010-12-24 13:12:21 +0000514 if (mmc_host_is_spi(mmc))
515 return 0;
516
Andy Flemingad347bb2008-10-30 16:41:01 -0500517 /* Only version 4 supports high-speed */
518 if (mmc->version < MMC_VERSION_4)
519 return 0;
520
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600521 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
522
Andy Flemingad347bb2008-10-30 16:41:01 -0500523 err = mmc_send_ext_csd(mmc, ext_csd);
524
525 if (err)
526 return err;
527
Lei Wen217467f2011-10-03 20:35:10 +0000528 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500529
530 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
531
532 if (err)
Andrew Gabbasove80682f2014-04-03 04:34:32 -0500533 return err == SWITCH_ERR ? 0 : err;
Andy Flemingad347bb2008-10-30 16:41:01 -0500534
535 /* Now check to see that it worked */
536 err = mmc_send_ext_csd(mmc, ext_csd);
537
538 if (err)
539 return err;
540
541 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000542 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500543 return 0;
544
545 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900546 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov95a37132014-12-01 06:59:10 -0600547 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900548 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Flemingad347bb2008-10-30 16:41:01 -0500549 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900550 } else {
Andy Flemingad347bb2008-10-30 16:41:01 -0500551 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900552 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500553
554 return 0;
555}
556
Stephen Warrene315ae82013-06-11 15:14:01 -0600557static int mmc_set_capacity(struct mmc *mmc, int part_num)
558{
559 switch (part_num) {
560 case 0:
561 mmc->capacity = mmc->capacity_user;
562 break;
563 case 1:
564 case 2:
565 mmc->capacity = mmc->capacity_boot;
566 break;
567 case 3:
568 mmc->capacity = mmc->capacity_rpmb;
569 break;
570 case 4:
571 case 5:
572 case 6:
573 case 7:
574 mmc->capacity = mmc->capacity_gp[part_num - 4];
575 break;
576 default:
577 return -1;
578 }
579
580 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
581
582 return 0;
583}
584
Lei Wen31b99802011-05-02 16:26:26 +0000585int mmc_switch_part(int dev_num, unsigned int part_num)
586{
587 struct mmc *mmc = find_mmc_device(dev_num);
Stephen Warrene315ae82013-06-11 15:14:01 -0600588 int ret;
Lei Wen31b99802011-05-02 16:26:26 +0000589
590 if (!mmc)
591 return -1;
592
Stephen Warrene315ae82013-06-11 15:14:01 -0600593 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
594 (mmc->part_config & ~PART_ACCESS_MASK)
595 | (part_num & PART_ACCESS_MASK));
Peter Bigot45fde892014-09-02 18:31:23 -0500596
597 /*
598 * Set the capacity if the switch succeeded or was intended
599 * to return to representing the raw device.
600 */
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700601 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot45fde892014-09-02 18:31:23 -0500602 ret = mmc_set_capacity(mmc, part_num);
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700603 mmc->block_dev.hwpart = part_num;
604 }
Stephen Warrene315ae82013-06-11 15:14:01 -0600605
Peter Bigot45fde892014-09-02 18:31:23 -0500606 return ret;
Lei Wen31b99802011-05-02 16:26:26 +0000607}
608
Simon Glasse774fd42016-05-01 13:52:25 -0600609int mmc_select_hwpart(int dev_num, int hwpart)
610{
611 struct mmc *mmc = find_mmc_device(dev_num);
612 int ret;
613
614 if (!mmc)
615 return -ENODEV;
616
617 if (mmc->block_dev.hwpart == hwpart)
618 return 0;
619
620 if (mmc->part_config == MMCPART_NOAVAILABLE)
621 return -EMEDIUMTYPE;
622
623 ret = mmc_switch_part(dev_num, hwpart);
624 if (ret)
625 return ret;
626
627 return 0;
628}
629
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100630int mmc_hwpart_config(struct mmc *mmc,
631 const struct mmc_hwpart_conf *conf,
632 enum mmc_hwpart_conf_mode mode)
633{
634 u8 part_attrs = 0;
635 u32 enh_size_mult;
636 u32 enh_start_addr;
637 u32 gp_size_mult[4];
638 u32 max_enh_size_mult;
639 u32 tot_enh_size_mult = 0;
Diego Santa Cruz80200272014-12-23 10:50:31 +0100640 u8 wr_rel_set;
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100641 int i, pidx, err;
642 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
643
644 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
645 return -EINVAL;
646
647 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
648 printf("eMMC >= 4.4 required for enhanced user data area\n");
649 return -EMEDIUMTYPE;
650 }
651
652 if (!(mmc->part_support & PART_SUPPORT)) {
653 printf("Card does not support partitioning\n");
654 return -EMEDIUMTYPE;
655 }
656
657 if (!mmc->hc_wp_grp_size) {
658 printf("Card does not define HC WP group size\n");
659 return -EMEDIUMTYPE;
660 }
661
662 /* check partition alignment and total enhanced size */
663 if (conf->user.enh_size) {
664 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
665 conf->user.enh_start % mmc->hc_wp_grp_size) {
666 printf("User data enhanced area not HC WP group "
667 "size aligned\n");
668 return -EINVAL;
669 }
670 part_attrs |= EXT_CSD_ENH_USR;
671 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
672 if (mmc->high_capacity) {
673 enh_start_addr = conf->user.enh_start;
674 } else {
675 enh_start_addr = (conf->user.enh_start << 9);
676 }
677 } else {
678 enh_size_mult = 0;
679 enh_start_addr = 0;
680 }
681 tot_enh_size_mult += enh_size_mult;
682
683 for (pidx = 0; pidx < 4; pidx++) {
684 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
685 printf("GP%i partition not HC WP group size "
686 "aligned\n", pidx+1);
687 return -EINVAL;
688 }
689 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
690 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
691 part_attrs |= EXT_CSD_ENH_GP(pidx);
692 tot_enh_size_mult += gp_size_mult[pidx];
693 }
694 }
695
696 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
697 printf("Card does not support enhanced attribute\n");
698 return -EMEDIUMTYPE;
699 }
700
701 err = mmc_send_ext_csd(mmc, ext_csd);
702 if (err)
703 return err;
704
705 max_enh_size_mult =
706 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
707 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
708 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
709 if (tot_enh_size_mult > max_enh_size_mult) {
710 printf("Total enhanced size exceeds maximum (%u > %u)\n",
711 tot_enh_size_mult, max_enh_size_mult);
712 return -EMEDIUMTYPE;
713 }
714
Diego Santa Cruz80200272014-12-23 10:50:31 +0100715 /* The default value of EXT_CSD_WR_REL_SET is device
716 * dependent, the values can only be changed if the
717 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
718 * changed only once and before partitioning is completed. */
719 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
720 if (conf->user.wr_rel_change) {
721 if (conf->user.wr_rel_set)
722 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
723 else
724 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
725 }
726 for (pidx = 0; pidx < 4; pidx++) {
727 if (conf->gp_part[pidx].wr_rel_change) {
728 if (conf->gp_part[pidx].wr_rel_set)
729 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
730 else
731 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
732 }
733 }
734
735 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
736 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
737 puts("Card does not support host controlled partition write "
738 "reliability settings\n");
739 return -EMEDIUMTYPE;
740 }
741
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100742 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
743 EXT_CSD_PARTITION_SETTING_COMPLETED) {
744 printf("Card already partitioned\n");
745 return -EPERM;
746 }
747
748 if (mode == MMC_HWPART_CONF_CHECK)
749 return 0;
750
751 /* Partitioning requires high-capacity size definitions */
752 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
753 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
754 EXT_CSD_ERASE_GROUP_DEF, 1);
755
756 if (err)
757 return err;
758
759 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
760
761 /* update erase group size to be high-capacity */
762 mmc->erase_grp_size =
763 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
764
765 }
766
767 /* all OK, write the configuration */
768 for (i = 0; i < 4; i++) {
769 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
770 EXT_CSD_ENH_START_ADDR+i,
771 (enh_start_addr >> (i*8)) & 0xFF);
772 if (err)
773 return err;
774 }
775 for (i = 0; i < 3; i++) {
776 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
777 EXT_CSD_ENH_SIZE_MULT+i,
778 (enh_size_mult >> (i*8)) & 0xFF);
779 if (err)
780 return err;
781 }
782 for (pidx = 0; pidx < 4; pidx++) {
783 for (i = 0; i < 3; i++) {
784 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
785 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
786 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
787 if (err)
788 return err;
789 }
790 }
791 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
792 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
793 if (err)
794 return err;
795
796 if (mode == MMC_HWPART_CONF_SET)
797 return 0;
798
Diego Santa Cruz80200272014-12-23 10:50:31 +0100799 /* The WR_REL_SET is a write-once register but shall be
800 * written before setting PART_SETTING_COMPLETED. As it is
801 * write-once we can only write it when completing the
802 * partitioning. */
803 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
804 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
805 EXT_CSD_WR_REL_SET, wr_rel_set);
806 if (err)
807 return err;
808 }
809
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100810 /* Setting PART_SETTING_COMPLETED confirms the partition
811 * configuration but it only becomes effective after power
812 * cycle, so we do not adjust the partition related settings
813 * in the mmc struct. */
814
815 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
816 EXT_CSD_PARTITION_SETTING,
817 EXT_CSD_PARTITION_SETTING_COMPLETED);
818 if (err)
819 return err;
820
821 return 0;
822}
823
Thierry Redingb9c8b772012-01-02 01:15:37 +0000824int mmc_getcd(struct mmc *mmc)
825{
826 int cd;
827
828 cd = board_mmc_getcd(mmc);
829
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000830 if (cd < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200831 if (mmc->cfg->ops->getcd)
832 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000833 else
834 cd = 1;
835 }
Thierry Redingb9c8b772012-01-02 01:15:37 +0000836
837 return cd;
838}
839
Kim Phillips87ea3892012-10-29 13:34:43 +0000840static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Flemingad347bb2008-10-30 16:41:01 -0500841{
842 struct mmc_cmd cmd;
843 struct mmc_data data;
844
845 /* Switch the frequency */
846 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
847 cmd.resp_type = MMC_RSP_R1;
848 cmd.cmdarg = (mode << 31) | 0xffffff;
849 cmd.cmdarg &= ~(0xf << (group * 4));
850 cmd.cmdarg |= value << (group * 4);
Andy Flemingad347bb2008-10-30 16:41:01 -0500851
852 data.dest = (char *)resp;
853 data.blocksize = 64;
854 data.blocks = 1;
855 data.flags = MMC_DATA_READ;
856
857 return mmc_send_cmd(mmc, &cmd, &data);
858}
859
860
Kim Phillips87ea3892012-10-29 13:34:43 +0000861static int sd_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500862{
863 int err;
864 struct mmc_cmd cmd;
Anton staaf9b00f0d2011-10-03 13:54:59 +0000865 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
866 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500867 struct mmc_data data;
868 int timeout;
869
870 mmc->card_caps = 0;
871
Thomas Chou1254c3d2010-12-24 13:12:21 +0000872 if (mmc_host_is_spi(mmc))
873 return 0;
874
Andy Flemingad347bb2008-10-30 16:41:01 -0500875 /* Read the SCR to find out if this card supports higher speeds */
876 cmd.cmdidx = MMC_CMD_APP_CMD;
877 cmd.resp_type = MMC_RSP_R1;
878 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -0500879
880 err = mmc_send_cmd(mmc, &cmd, NULL);
881
882 if (err)
883 return err;
884
885 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
886 cmd.resp_type = MMC_RSP_R1;
887 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500888
889 timeout = 3;
890
891retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000892 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500893 data.blocksize = 8;
894 data.blocks = 1;
895 data.flags = MMC_DATA_READ;
896
897 err = mmc_send_cmd(mmc, &cmd, &data);
898
899 if (err) {
900 if (timeout--)
901 goto retry_scr;
902
903 return err;
904 }
905
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300906 mmc->scr[0] = __be32_to_cpu(scr[0]);
907 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500908
909 switch ((mmc->scr[0] >> 24) & 0xf) {
Bin Meng4a4ef872016-03-17 21:53:13 -0700910 case 0:
911 mmc->version = SD_VERSION_1_0;
912 break;
913 case 1:
914 mmc->version = SD_VERSION_1_10;
915 break;
916 case 2:
917 mmc->version = SD_VERSION_2;
918 if ((mmc->scr[0] >> 15) & 0x1)
919 mmc->version = SD_VERSION_3;
920 break;
921 default:
922 mmc->version = SD_VERSION_1_0;
923 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500924 }
925
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530926 if (mmc->scr[0] & SD_DATA_4BIT)
927 mmc->card_caps |= MMC_MODE_4BIT;
928
Andy Flemingad347bb2008-10-30 16:41:01 -0500929 /* Version 1.0 doesn't support switching */
930 if (mmc->version == SD_VERSION_1_0)
931 return 0;
932
933 timeout = 4;
934 while (timeout--) {
935 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000936 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500937
938 if (err)
939 return err;
940
941 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300942 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500943 break;
944 }
945
Andy Flemingad347bb2008-10-30 16:41:01 -0500946 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300947 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -0500948 return 0;
949
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000950 /*
951 * If the host doesn't support SD_HIGHSPEED, do not switch card to
952 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
953 * This can avoid furthur problem when the card runs in different
954 * mode between the host.
955 */
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200956 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
957 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000958 return 0;
959
Anton staaf9b00f0d2011-10-03 13:54:59 +0000960 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500961
962 if (err)
963 return err;
964
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300965 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -0500966 mmc->card_caps |= MMC_MODE_HS;
967
968 return 0;
969}
970
971/* frequency bases */
972/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000973static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500974 10000,
975 100000,
976 1000000,
977 10000000,
978};
979
980/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
981 * to platforms without floating point.
982 */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000983static const int multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500984 0, /* reserved */
985 10,
986 12,
987 13,
988 15,
989 20,
990 25,
991 30,
992 35,
993 40,
994 45,
995 50,
996 55,
997 60,
998 70,
999 80,
1000};
1001
Kim Phillips87ea3892012-10-29 13:34:43 +00001002static void mmc_set_ios(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001003{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001004 if (mmc->cfg->ops->set_ios)
1005 mmc->cfg->ops->set_ios(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001006}
1007
1008void mmc_set_clock(struct mmc *mmc, uint clock)
1009{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001010 if (clock > mmc->cfg->f_max)
1011 clock = mmc->cfg->f_max;
Andy Flemingad347bb2008-10-30 16:41:01 -05001012
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001013 if (clock < mmc->cfg->f_min)
1014 clock = mmc->cfg->f_min;
Andy Flemingad347bb2008-10-30 16:41:01 -05001015
1016 mmc->clock = clock;
1017
1018 mmc_set_ios(mmc);
1019}
1020
Kim Phillips87ea3892012-10-29 13:34:43 +00001021static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Flemingad347bb2008-10-30 16:41:01 -05001022{
1023 mmc->bus_width = width;
1024
1025 mmc_set_ios(mmc);
1026}
1027
Kim Phillips87ea3892012-10-29 13:34:43 +00001028static int mmc_startup(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001029{
Stephen Warrene315ae82013-06-11 15:14:01 -06001030 int err, i;
Andy Flemingad347bb2008-10-30 16:41:01 -05001031 uint mult, freq;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001032 u64 cmult, csize, capacity;
Andy Flemingad347bb2008-10-30 16:41:01 -05001033 struct mmc_cmd cmd;
Simon Glassa09c2b72013-04-03 08:54:30 +00001034 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1035 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001036 int timeout = 1000;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001037 bool has_parts = false;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001038 bool part_completed;
Andy Flemingad347bb2008-10-30 16:41:01 -05001039
Thomas Chou1254c3d2010-12-24 13:12:21 +00001040#ifdef CONFIG_MMC_SPI_CRC_ON
1041 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1042 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1043 cmd.resp_type = MMC_RSP_R1;
1044 cmd.cmdarg = 1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001045 err = mmc_send_cmd(mmc, &cmd, NULL);
1046
1047 if (err)
1048 return err;
1049 }
1050#endif
1051
Andy Flemingad347bb2008-10-30 16:41:01 -05001052 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001053 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1054 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -05001055 cmd.resp_type = MMC_RSP_R2;
1056 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001057
1058 err = mmc_send_cmd(mmc, &cmd, NULL);
1059
1060 if (err)
1061 return err;
1062
1063 memcpy(mmc->cid, cmd.response, 16);
1064
1065 /*
1066 * For MMC cards, set the Relative Address.
1067 * For SD cards, get the Relatvie Address.
1068 * This also puts the cards into Standby State
1069 */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001070 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1071 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1072 cmd.cmdarg = mmc->rca << 16;
1073 cmd.resp_type = MMC_RSP_R6;
Andy Flemingad347bb2008-10-30 16:41:01 -05001074
Thomas Chou1254c3d2010-12-24 13:12:21 +00001075 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001076
Thomas Chou1254c3d2010-12-24 13:12:21 +00001077 if (err)
1078 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001079
Thomas Chou1254c3d2010-12-24 13:12:21 +00001080 if (IS_SD(mmc))
1081 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1082 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001083
1084 /* Get the Card-Specific Data */
1085 cmd.cmdidx = MMC_CMD_SEND_CSD;
1086 cmd.resp_type = MMC_RSP_R2;
1087 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001088
1089 err = mmc_send_cmd(mmc, &cmd, NULL);
1090
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001091 /* Waiting for the ready status */
1092 mmc_send_status(mmc, timeout);
1093
Andy Flemingad347bb2008-10-30 16:41:01 -05001094 if (err)
1095 return err;
1096
Rabin Vincentb6eed942009-04-05 13:30:56 +05301097 mmc->csd[0] = cmd.response[0];
1098 mmc->csd[1] = cmd.response[1];
1099 mmc->csd[2] = cmd.response[2];
1100 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001101
1102 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301103 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001104
1105 switch (version) {
Bin Meng4a4ef872016-03-17 21:53:13 -07001106 case 0:
1107 mmc->version = MMC_VERSION_1_2;
1108 break;
1109 case 1:
1110 mmc->version = MMC_VERSION_1_4;
1111 break;
1112 case 2:
1113 mmc->version = MMC_VERSION_2_2;
1114 break;
1115 case 3:
1116 mmc->version = MMC_VERSION_3;
1117 break;
1118 case 4:
1119 mmc->version = MMC_VERSION_4;
1120 break;
1121 default:
1122 mmc->version = MMC_VERSION_1_2;
1123 break;
Andy Flemingad347bb2008-10-30 16:41:01 -05001124 }
1125 }
1126
1127 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301128 freq = fbase[(cmd.response[0] & 0x7)];
1129 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001130
1131 mmc->tran_speed = freq * mult;
1132
Markus Niebel03951412013-12-16 13:40:46 +01001133 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincentb6eed942009-04-05 13:30:56 +05301134 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001135
1136 if (IS_SD(mmc))
1137 mmc->write_bl_len = mmc->read_bl_len;
1138 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301139 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001140
1141 if (mmc->high_capacity) {
1142 csize = (mmc->csd[1] & 0x3f) << 16
1143 | (mmc->csd[2] & 0xffff0000) >> 16;
1144 cmult = 8;
1145 } else {
1146 csize = (mmc->csd[1] & 0x3ff) << 2
1147 | (mmc->csd[2] & 0xc0000000) >> 30;
1148 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1149 }
1150
Stephen Warrene315ae82013-06-11 15:14:01 -06001151 mmc->capacity_user = (csize + 1) << (cmult + 2);
1152 mmc->capacity_user *= mmc->read_bl_len;
1153 mmc->capacity_boot = 0;
1154 mmc->capacity_rpmb = 0;
1155 for (i = 0; i < 4; i++)
1156 mmc->capacity_gp[i] = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001157
Simon Glassa09c2b72013-04-03 08:54:30 +00001158 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1159 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001160
Simon Glassa09c2b72013-04-03 08:54:30 +00001161 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1162 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001163
Markus Niebel03951412013-12-16 13:40:46 +01001164 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1165 cmd.cmdidx = MMC_CMD_SET_DSR;
1166 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1167 cmd.resp_type = MMC_RSP_NONE;
1168 if (mmc_send_cmd(mmc, &cmd, NULL))
1169 printf("MMC: SET_DSR failed\n");
1170 }
1171
Andy Flemingad347bb2008-10-30 16:41:01 -05001172 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001173 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1174 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001175 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001176 cmd.cmdarg = mmc->rca << 16;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001177 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001178
Thomas Chou1254c3d2010-12-24 13:12:21 +00001179 if (err)
1180 return err;
1181 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001182
Lei Wenea526762011-06-22 17:03:31 +00001183 /*
1184 * For SD, its erase group is always one sector
1185 */
1186 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001187 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301188 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1189 /* check ext_csd version and capacity */
1190 err = mmc_send_ext_csd(mmc, ext_csd);
Diego Santa Cruzca25e062014-12-23 10:50:28 +01001191 if (err)
1192 return err;
1193 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001194 /*
1195 * According to the JEDEC Standard, the value of
1196 * ext_csd's capacity is valid if the value is more
1197 * than 2GB
1198 */
Lei Wen217467f2011-10-03 20:35:10 +00001199 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1200 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1201 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1202 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glassa09c2b72013-04-03 08:54:30 +00001203 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewski237823e2011-07-05 02:19:44 +00001204 if ((capacity >> 20) > 2 * 1024)
Stephen Warrene315ae82013-06-11 15:14:01 -06001205 mmc->capacity_user = capacity;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301206 }
Lei Wen31b99802011-05-02 16:26:26 +00001207
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001208 switch (ext_csd[EXT_CSD_REV]) {
1209 case 1:
1210 mmc->version = MMC_VERSION_4_1;
1211 break;
1212 case 2:
1213 mmc->version = MMC_VERSION_4_2;
1214 break;
1215 case 3:
1216 mmc->version = MMC_VERSION_4_3;
1217 break;
1218 case 5:
1219 mmc->version = MMC_VERSION_4_41;
1220 break;
1221 case 6:
1222 mmc->version = MMC_VERSION_4_5;
1223 break;
Markus Niebel32f53b62014-11-18 15:13:53 +01001224 case 7:
1225 mmc->version = MMC_VERSION_5_0;
1226 break;
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001227 }
1228
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001229 /* The partition data may be non-zero but it is only
1230 * effective if PARTITION_SETTING_COMPLETED is set in
1231 * EXT_CSD, so ignore any data if this bit is not set,
1232 * except for enabling the high-capacity group size
1233 * definition (see below). */
1234 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1235 EXT_CSD_PARTITION_SETTING_COMPLETED);
1236
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001237 /* store the partition info of emmc */
1238 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1239 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1240 ext_csd[EXT_CSD_BOOT_MULT])
1241 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001242 if (part_completed &&
1243 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001244 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1245
1246 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1247
1248 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1249
1250 for (i = 0; i < 4; i++) {
1251 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001252 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001253 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001254 if (mult)
1255 has_parts = true;
1256 if (!part_completed)
1257 continue;
1258 mmc->capacity_gp[i] = mult;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001259 mmc->capacity_gp[i] *=
1260 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1261 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruze5a2a3a2014-12-23 10:50:21 +01001262 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001263 }
1264
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001265 if (part_completed) {
1266 mmc->enh_user_size =
1267 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
1268 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
1269 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1270 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1271 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1272 mmc->enh_user_size <<= 19;
1273 mmc->enh_user_start =
1274 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
1275 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
1276 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
1277 ext_csd[EXT_CSD_ENH_START_ADDR];
1278 if (mmc->high_capacity)
1279 mmc->enh_user_start <<= 9;
1280 }
Diego Santa Cruz3b62d842014-12-23 10:50:22 +01001281
Lei Wenea526762011-06-22 17:03:31 +00001282 /*
Oliver Metzb3f14092013-10-01 20:32:07 +02001283 * Host needs to enable ERASE_GRP_DEF bit if device is
1284 * partitioned. This bit will be lost every time after a reset
1285 * or power off. This will affect erase size.
Lei Wenea526762011-06-22 17:03:31 +00001286 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001287 if (part_completed)
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001288 has_parts = true;
Oliver Metzb3f14092013-10-01 20:32:07 +02001289 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001290 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1291 has_parts = true;
1292 if (has_parts) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001293 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1294 EXT_CSD_ERASE_GROUP_DEF, 1);
1295
1296 if (err)
1297 return err;
Hannes Petermaier15e874d2014-08-08 09:47:22 +02001298 else
1299 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001300 }
Oliver Metzb3f14092013-10-01 20:32:07 +02001301
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001302 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001303 /* Read out group size from ext_csd */
Lei Wen217467f2011-10-03 20:35:10 +00001304 mmc->erase_grp_size =
Diego Santa Cruz747f6fa2014-12-23 10:50:24 +01001305 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebel6d398922014-11-18 15:11:42 +01001306 /*
1307 * if high capacity and partition setting completed
1308 * SEC_COUNT is valid even if it is smaller than 2 GiB
1309 * JEDEC Standard JESD84-B45, 6.2.4
1310 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001311 if (mmc->high_capacity && part_completed) {
Markus Niebel6d398922014-11-18 15:11:42 +01001312 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1313 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1314 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1315 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1316 capacity *= MMC_MAX_BLOCK_LEN;
1317 mmc->capacity_user = capacity;
1318 }
Simon Glassa09c2b72013-04-03 08:54:30 +00001319 } else {
Oliver Metzb3f14092013-10-01 20:32:07 +02001320 /* Calculate the group size from the csd value. */
Lei Wenea526762011-06-22 17:03:31 +00001321 int erase_gsz, erase_gmul;
1322 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1323 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1324 mmc->erase_grp_size = (erase_gsz + 1)
1325 * (erase_gmul + 1);
1326 }
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001327
1328 mmc->hc_wp_grp_size = 1024
1329 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1330 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruz37a50b92014-12-23 10:50:33 +01001331
1332 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301333 }
1334
Stephen Warren1e0f92a2015-12-07 11:38:49 -07001335 err = mmc_set_capacity(mmc, mmc->block_dev.hwpart);
Stephen Warrene315ae82013-06-11 15:14:01 -06001336 if (err)
1337 return err;
1338
Andy Flemingad347bb2008-10-30 16:41:01 -05001339 if (IS_SD(mmc))
1340 err = sd_change_freq(mmc);
1341 else
1342 err = mmc_change_freq(mmc);
1343
1344 if (err)
1345 return err;
1346
1347 /* Restrict card's capabilities by what the host can do */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001348 mmc->card_caps &= mmc->cfg->host_caps;
Andy Flemingad347bb2008-10-30 16:41:01 -05001349
1350 if (IS_SD(mmc)) {
1351 if (mmc->card_caps & MMC_MODE_4BIT) {
1352 cmd.cmdidx = MMC_CMD_APP_CMD;
1353 cmd.resp_type = MMC_RSP_R1;
1354 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001355
1356 err = mmc_send_cmd(mmc, &cmd, NULL);
1357 if (err)
1358 return err;
1359
1360 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1361 cmd.resp_type = MMC_RSP_R1;
1362 cmd.cmdarg = 2;
Andy Flemingad347bb2008-10-30 16:41:01 -05001363 err = mmc_send_cmd(mmc, &cmd, NULL);
1364 if (err)
1365 return err;
1366
1367 mmc_set_bus_width(mmc, 4);
1368 }
1369
1370 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001371 mmc->tran_speed = 50000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001372 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001373 mmc->tran_speed = 25000000;
Andrew Gabbasovccb7b042014-12-25 10:22:25 -06001374 } else if (mmc->version >= MMC_VERSION_4) {
1375 /* Only version 4 of MMC supports wider bus widths */
Andy Flemingeb766ad2012-10-31 19:02:38 +00001376 int idx;
1377
1378 /* An array of possible bus widths in order of preference */
1379 static unsigned ext_csd_bits[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001380 EXT_CSD_DDR_BUS_WIDTH_8,
1381 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001382 EXT_CSD_BUS_WIDTH_8,
1383 EXT_CSD_BUS_WIDTH_4,
1384 EXT_CSD_BUS_WIDTH_1,
1385 };
1386
1387 /* An array to map CSD bus widths to host cap bits */
1388 static unsigned ext_to_hostcaps[] = {
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001389 [EXT_CSD_DDR_BUS_WIDTH_4] =
1390 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1391 [EXT_CSD_DDR_BUS_WIDTH_8] =
1392 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001393 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1394 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1395 };
1396
1397 /* An array to map chosen bus width to an integer */
1398 static unsigned widths[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001399 8, 4, 8, 4, 1,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001400 };
1401
1402 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1403 unsigned int extw = ext_csd_bits[idx];
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001404 unsigned int caps = ext_to_hostcaps[extw];
Andy Flemingeb766ad2012-10-31 19:02:38 +00001405
1406 /*
Andrew Gabbasovc1b2cf02014-12-25 10:22:24 -06001407 * If the bus width is still not changed,
1408 * don't try to set the default again.
1409 * Otherwise, recover from switch attempts
1410 * by switching to 1-bit bus width.
1411 */
1412 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1413 mmc->bus_width == 1) {
1414 err = 0;
1415 break;
1416 }
1417
1418 /*
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001419 * Check to make sure the card and controller support
1420 * these capabilities
Andy Flemingeb766ad2012-10-31 19:02:38 +00001421 */
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001422 if ((mmc->card_caps & caps) != caps)
Andy Flemingeb766ad2012-10-31 19:02:38 +00001423 continue;
1424
Andy Flemingad347bb2008-10-30 16:41:01 -05001425 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001426 EXT_CSD_BUS_WIDTH, extw);
Andy Flemingad347bb2008-10-30 16:41:01 -05001427
1428 if (err)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001429 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001430
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001431 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Flemingeb766ad2012-10-31 19:02:38 +00001432 mmc_set_bus_width(mmc, widths[idx]);
Andy Flemingad347bb2008-10-30 16:41:01 -05001433
Lei Wen4f5a6a52011-10-03 20:35:11 +00001434 err = mmc_send_ext_csd(mmc, test_csd);
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001435
1436 if (err)
1437 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001438
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001439 /* Only compare read only fields */
1440 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1441 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1442 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1443 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1444 ext_csd[EXT_CSD_REV]
1445 == test_csd[EXT_CSD_REV] &&
1446 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1447 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1448 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1449 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001450 break;
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001451 else
1452 err = SWITCH_ERR;
Andy Flemingad347bb2008-10-30 16:41:01 -05001453 }
1454
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001455 if (err)
1456 return err;
1457
Andy Flemingad347bb2008-10-30 16:41:01 -05001458 if (mmc->card_caps & MMC_MODE_HS) {
1459 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001460 mmc->tran_speed = 52000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001461 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001462 mmc->tran_speed = 26000000;
1463 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001464 }
1465
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001466 mmc_set_clock(mmc, mmc->tran_speed);
1467
Andrew Gabbasov532663b2014-12-01 06:59:11 -06001468 /* Fix the block length for DDR mode */
1469 if (mmc->ddr_mode) {
1470 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1471 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1472 }
1473
Andy Flemingad347bb2008-10-30 16:41:01 -05001474 /* fill in device description */
1475 mmc->block_dev.lun = 0;
Stephen Warren1e0f92a2015-12-07 11:38:49 -07001476 mmc->block_dev.hwpart = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001477 mmc->block_dev.type = 0;
1478 mmc->block_dev.blksz = mmc->read_bl_len;
Egbert Eich2eec2ab2013-04-09 21:11:56 +00001479 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
Rabin Vincent69d4e2c2009-04-05 13:30:54 +05301480 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsd67754f2015-12-04 23:27:40 +01001481#if !defined(CONFIG_SPL_BUILD) || \
1482 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1483 !defined(CONFIG_USE_TINY_PRINTF))
Taylor Hutt7367ec22012-10-20 17:15:59 +00001484 sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1485 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1486 (mmc->cid[3] >> 16) & 0xffff);
1487 sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1488 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1489 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1490 (mmc->cid[2] >> 24) & 0xff);
1491 sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1492 (mmc->cid[2] >> 16) & 0xf);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001493#else
1494 mmc->block_dev.vendor[0] = 0;
1495 mmc->block_dev.product[0] = 0;
1496 mmc->block_dev.revision[0] = 0;
1497#endif
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001498#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glassb89a8442016-02-29 15:25:48 -07001499 part_init(&mmc->block_dev);
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001500#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001501
1502 return 0;
1503}
1504
Kim Phillips87ea3892012-10-29 13:34:43 +00001505static int mmc_send_if_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001506{
1507 struct mmc_cmd cmd;
1508 int err;
1509
1510 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1511 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001512 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Flemingad347bb2008-10-30 16:41:01 -05001513 cmd.resp_type = MMC_RSP_R7;
Andy Flemingad347bb2008-10-30 16:41:01 -05001514
1515 err = mmc_send_cmd(mmc, &cmd, NULL);
1516
1517 if (err)
1518 return err;
1519
Rabin Vincentb6eed942009-04-05 13:30:56 +05301520 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Flemingad347bb2008-10-30 16:41:01 -05001521 return UNUSABLE_ERR;
1522 else
1523 mmc->version = SD_VERSION_2;
1524
1525 return 0;
1526}
1527
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001528/* not used any more */
1529int __deprecated mmc_register(struct mmc *mmc)
1530{
1531#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1532 printf("%s is deprecated! use mmc_create() instead.\n", __func__);
1533#endif
1534 return -1;
1535}
1536
1537struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
Andy Flemingad347bb2008-10-30 16:41:01 -05001538{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001539 struct mmc *mmc;
1540
1541 /* quick validation */
1542 if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1543 cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1544 return NULL;
1545
1546 mmc = calloc(1, sizeof(*mmc));
1547 if (mmc == NULL)
1548 return NULL;
1549
1550 mmc->cfg = cfg;
1551 mmc->priv = priv;
1552
1553 /* the following chunk was mmc_register() */
1554
Markus Niebel03951412013-12-16 13:40:46 +01001555 /* Setup dsr related values */
1556 mmc->dsr_imp = 0;
1557 mmc->dsr = 0xffffffff;
Andy Flemingad347bb2008-10-30 16:41:01 -05001558 /* Setup the universal parts of the block interface just once */
1559 mmc->block_dev.if_type = IF_TYPE_MMC;
Simon Glass2f26fff2016-02-29 15:25:51 -07001560 mmc->block_dev.devnum = cur_dev_num++;
Andy Flemingad347bb2008-10-30 16:41:01 -05001561 mmc->block_dev.removable = 1;
1562 mmc->block_dev.block_read = mmc_bread;
1563 mmc->block_dev.block_write = mmc_bwrite;
Lei Wenea526762011-06-22 17:03:31 +00001564 mmc->block_dev.block_erase = mmc_berase;
Andy Flemingad347bb2008-10-30 16:41:01 -05001565
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001566 /* setup initial part type */
1567 mmc->block_dev.part_type = mmc->cfg->part_type;
Andy Flemingad347bb2008-10-30 16:41:01 -05001568
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001569 INIT_LIST_HEAD(&mmc->link);
Andy Flemingad347bb2008-10-30 16:41:01 -05001570
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001571 list_add_tail(&mmc->link, &mmc_devices);
1572
1573 return mmc;
1574}
1575
1576void mmc_destroy(struct mmc *mmc)
1577{
1578 /* only freeing memory for now */
1579 free(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001580}
1581
Simon Glassfa255112016-05-01 11:36:15 -06001582static int mmc_get_dev(int dev, struct blk_desc **descp)
Simon Glass4f7011a2016-05-01 11:36:07 -06001583{
1584 struct mmc *mmc = find_mmc_device(dev);
1585 int ret;
1586
1587 if (!mmc)
1588 return -ENODEV;
1589 ret = mmc_init(mmc);
1590 if (ret)
1591 return ret;
1592
1593 *descp = &mmc->block_dev;
1594
1595 return 0;
1596}
1597
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001598/* board-specific MMC power initializations. */
1599__weak void board_mmc_power_init(void)
1600{
1601}
1602
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001603int mmc_start_init(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001604{
Macpaul Lin028bde12011-11-14 23:35:39 +00001605 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001606
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001607 /* we pretend there's no card when init is NULL */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001608 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Redingb9c8b772012-01-02 01:15:37 +00001609 mmc->has_init = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001610#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Redingb9c8b772012-01-02 01:15:37 +00001611 printf("MMC: no card present\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001612#endif
Thierry Redingb9c8b772012-01-02 01:15:37 +00001613 return NO_CARD_ERR;
1614 }
1615
Lei Wen31b99802011-05-02 16:26:26 +00001616 if (mmc->has_init)
1617 return 0;
1618
Yangbo Lub124f8a2015-04-22 13:57:00 +08001619#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1620 mmc_adapter_card_type_ident();
1621#endif
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001622 board_mmc_power_init();
1623
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001624 /* made sure it's not NULL earlier */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001625 err = mmc->cfg->ops->init(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001626
1627 if (err)
1628 return err;
1629
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001630 mmc->ddr_mode = 0;
Ilya Yanok8459aab2009-06-29 17:53:16 +04001631 mmc_set_bus_width(mmc, 1);
1632 mmc_set_clock(mmc, 1);
1633
Andy Flemingad347bb2008-10-30 16:41:01 -05001634 /* Reset the Card */
1635 err = mmc_go_idle(mmc);
1636
1637 if (err)
1638 return err;
1639
Lei Wen31b99802011-05-02 16:26:26 +00001640 /* The internal partition reset to user partition(0) at every CMD0*/
Stephen Warren1e0f92a2015-12-07 11:38:49 -07001641 mmc->block_dev.hwpart = 0;
Lei Wen31b99802011-05-02 16:26:26 +00001642
Andy Flemingad347bb2008-10-30 16:41:01 -05001643 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001644 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001645
Andy Flemingad347bb2008-10-30 16:41:01 -05001646 /* Now try to get the SD card's operating condition */
1647 err = sd_send_op_cond(mmc);
1648
1649 /* If the command timed out, we check for an MMC card */
1650 if (err == TIMEOUT) {
1651 err = mmc_send_op_cond(mmc);
1652
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001653 if (err) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001654#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001655 printf("Card did not respond to voltage select!\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001656#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001657 return UNUSABLE_ERR;
1658 }
1659 }
1660
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001661 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001662 mmc->init_in_progress = 1;
1663
1664 return err;
1665}
1666
1667static int mmc_complete_init(struct mmc *mmc)
1668{
1669 int err = 0;
1670
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001671 mmc->init_in_progress = 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001672 if (mmc->op_cond_pending)
1673 err = mmc_complete_op_cond(mmc);
1674
1675 if (!err)
1676 err = mmc_startup(mmc);
Lei Wen31b99802011-05-02 16:26:26 +00001677 if (err)
1678 mmc->has_init = 0;
1679 else
1680 mmc->has_init = 1;
1681 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001682}
1683
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001684int mmc_init(struct mmc *mmc)
1685{
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001686 int err = 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001687 unsigned start;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001688
1689 if (mmc->has_init)
1690 return 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001691
1692 start = get_timer(0);
1693
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001694 if (!mmc->init_in_progress)
1695 err = mmc_start_init(mmc);
1696
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001697 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001698 err = mmc_complete_init(mmc);
1699 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1700 return err;
1701}
1702
Markus Niebel03951412013-12-16 13:40:46 +01001703int mmc_set_dsr(struct mmc *mmc, u16 val)
1704{
1705 mmc->dsr = val;
1706 return 0;
1707}
1708
Jeroen Hofstee47726302014-07-10 22:46:28 +02001709/* CPU-specific MMC initializations */
1710__weak int cpu_mmc_init(bd_t *bis)
Andy Flemingad347bb2008-10-30 16:41:01 -05001711{
1712 return -1;
1713}
1714
Jeroen Hofstee47726302014-07-10 22:46:28 +02001715/* board-specific MMC initializations. */
1716__weak int board_mmc_init(bd_t *bis)
1717{
1718 return -1;
1719}
Andy Flemingad347bb2008-10-30 16:41:01 -05001720
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001721#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1722
Andy Flemingad347bb2008-10-30 16:41:01 -05001723void print_mmc_devices(char separator)
1724{
1725 struct mmc *m;
1726 struct list_head *entry;
Przemyslaw Marczak7bc4e302015-02-20 12:29:27 +01001727 char *mmc_type;
Andy Flemingad347bb2008-10-30 16:41:01 -05001728
1729 list_for_each(entry, &mmc_devices) {
1730 m = list_entry(entry, struct mmc, link);
1731
Przemyslaw Marczak7bc4e302015-02-20 12:29:27 +01001732 if (m->has_init)
1733 mmc_type = IS_SD(m) ? "SD" : "eMMC";
1734 else
1735 mmc_type = NULL;
1736
Simon Glass2f26fff2016-02-29 15:25:51 -07001737 printf("%s: %d", m->cfg->name, m->block_dev.devnum);
Przemyslaw Marczak7bc4e302015-02-20 12:29:27 +01001738 if (mmc_type)
1739 printf(" (%s)", mmc_type);
Andy Flemingad347bb2008-10-30 16:41:01 -05001740
Lubomir Popov456104e2014-11-11 12:25:42 +02001741 if (entry->next != &mmc_devices) {
1742 printf("%c", separator);
1743 if (separator != '\n')
1744 puts (" ");
1745 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001746 }
1747
1748 printf("\n");
1749}
1750
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001751#else
1752void print_mmc_devices(char separator) { }
1753#endif
1754
Lei Wend430d7c2011-05-02 16:26:25 +00001755int get_mmc_num(void)
1756{
1757 return cur_dev_num;
1758}
1759
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001760void mmc_set_preinit(struct mmc *mmc, int preinit)
1761{
1762 mmc->preinit = preinit;
1763}
1764
1765static void do_preinit(void)
1766{
1767 struct mmc *m;
1768 struct list_head *entry;
1769
1770 list_for_each(entry, &mmc_devices) {
1771 m = list_entry(entry, struct mmc, link);
1772
Yangbo Lub124f8a2015-04-22 13:57:00 +08001773#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1774 mmc_set_preinit(m, 1);
1775#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001776 if (m->preinit)
1777 mmc_start_init(m);
1778 }
1779}
1780
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001781#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1782static int mmc_probe(bd_t *bis)
1783{
1784 return 0;
1785}
1786#elif defined(CONFIG_DM_MMC)
1787static int mmc_probe(bd_t *bis)
1788{
Simon Glass547cb342015-12-29 05:22:49 -07001789 int ret, i;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001790 struct uclass *uc;
Simon Glass547cb342015-12-29 05:22:49 -07001791 struct udevice *dev;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001792
1793 ret = uclass_get(UCLASS_MMC, &uc);
1794 if (ret)
1795 return ret;
1796
Simon Glass547cb342015-12-29 05:22:49 -07001797 /*
1798 * Try to add them in sequence order. Really with driver model we
1799 * should allow holes, but the current MMC list does not allow that.
1800 * So if we request 0, 1, 3 we will get 0, 1, 2.
1801 */
1802 for (i = 0; ; i++) {
1803 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1804 if (ret == -ENODEV)
1805 break;
1806 }
1807 uclass_foreach_dev(dev, uc) {
1808 ret = device_probe(dev);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001809 if (ret)
Simon Glass547cb342015-12-29 05:22:49 -07001810 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001811 }
1812
1813 return 0;
1814}
1815#else
1816static int mmc_probe(bd_t *bis)
1817{
1818 if (board_mmc_init(bis) < 0)
1819 cpu_mmc_init(bis);
1820
1821 return 0;
1822}
1823#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001824
Andy Flemingad347bb2008-10-30 16:41:01 -05001825int mmc_initialize(bd_t *bis)
1826{
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001827 static int initialized = 0;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001828 int ret;
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001829 if (initialized) /* Avoid initializing mmc multiple times */
1830 return 0;
1831 initialized = 1;
1832
Andy Flemingad347bb2008-10-30 16:41:01 -05001833 INIT_LIST_HEAD (&mmc_devices);
1834 cur_dev_num = 0;
1835
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001836 ret = mmc_probe(bis);
1837 if (ret)
1838 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -05001839
Ying Zhang9ff70262013-08-16 15:16:11 +08001840#ifndef CONFIG_SPL_BUILD
Andy Flemingad347bb2008-10-30 16:41:01 -05001841 print_mmc_devices(',');
Ying Zhang9ff70262013-08-16 15:16:11 +08001842#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001843
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001844 do_preinit();
Andy Flemingad347bb2008-10-30 16:41:01 -05001845 return 0;
1846}
Amar1104e9b2013-04-27 11:42:58 +05301847
1848#ifdef CONFIG_SUPPORT_EMMC_BOOT
1849/*
1850 * This function changes the size of boot partition and the size of rpmb
1851 * partition present on EMMC devices.
1852 *
1853 * Input Parameters:
1854 * struct *mmc: pointer for the mmc device strcuture
1855 * bootsize: size of boot partition
1856 * rpmbsize: size of rpmb partition
1857 *
1858 * Returns 0 on success.
1859 */
1860
1861int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1862 unsigned long rpmbsize)
1863{
1864 int err;
1865 struct mmc_cmd cmd;
1866
1867 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1868 cmd.cmdidx = MMC_CMD_RES_MAN;
1869 cmd.resp_type = MMC_RSP_R1b;
1870 cmd.cmdarg = MMC_CMD62_ARG1;
1871
1872 err = mmc_send_cmd(mmc, &cmd, NULL);
1873 if (err) {
1874 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1875 return err;
1876 }
1877
1878 /* Boot partition changing mode */
1879 cmd.cmdidx = MMC_CMD_RES_MAN;
1880 cmd.resp_type = MMC_RSP_R1b;
1881 cmd.cmdarg = MMC_CMD62_ARG2;
1882
1883 err = mmc_send_cmd(mmc, &cmd, NULL);
1884 if (err) {
1885 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1886 return err;
1887 }
1888 /* boot partition size is multiple of 128KB */
1889 bootsize = (bootsize * 1024) / 128;
1890
1891 /* Arg: boot partition size */
1892 cmd.cmdidx = MMC_CMD_RES_MAN;
1893 cmd.resp_type = MMC_RSP_R1b;
1894 cmd.cmdarg = bootsize;
1895
1896 err = mmc_send_cmd(mmc, &cmd, NULL);
1897 if (err) {
1898 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1899 return err;
1900 }
1901 /* RPMB partition size is multiple of 128KB */
1902 rpmbsize = (rpmbsize * 1024) / 128;
1903 /* Arg: RPMB partition size */
1904 cmd.cmdidx = MMC_CMD_RES_MAN;
1905 cmd.resp_type = MMC_RSP_R1b;
1906 cmd.cmdarg = rpmbsize;
1907
1908 err = mmc_send_cmd(mmc, &cmd, NULL);
1909 if (err) {
1910 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1911 return err;
1912 }
1913 return 0;
1914}
1915
1916/*
Tom Rini4cf854c2014-02-05 10:24:22 -05001917 * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1918 * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1919 * and BOOT_MODE.
1920 *
1921 * Returns 0 on success.
1922 */
1923int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1924{
1925 int err;
1926
1927 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1928 EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1929 EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1930 EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1931
1932 if (err)
1933 return err;
1934 return 0;
1935}
1936
1937/*
Tom Rinif8c6f792014-02-05 10:24:21 -05001938 * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1939 * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1940 * PARTITION_ACCESS.
1941 *
1942 * Returns 0 on success.
1943 */
1944int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1945{
1946 int err;
1947
1948 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1949 EXT_CSD_BOOT_ACK(ack) |
1950 EXT_CSD_BOOT_PART_NUM(part_num) |
1951 EXT_CSD_PARTITION_ACCESS(access));
1952
1953 if (err)
1954 return err;
1955 return 0;
1956}
Tom Rini35a3ea12014-02-07 14:15:20 -05001957
1958/*
1959 * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1960 * for enable. Note that this is a write-once field for non-zero values.
1961 *
1962 * Returns 0 on success.
1963 */
1964int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1965{
1966 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1967 enable);
1968}
Amar1104e9b2013-04-27 11:42:58 +05301969#endif
Simon Glass4f7011a2016-05-01 11:36:07 -06001970
1971U_BOOT_LEGACY_BLK(mmc) = {
1972 .if_typename = "mmc",
1973 .if_type = IF_TYPE_MMC,
1974 .max_devs = -1,
Simon Glassfa255112016-05-01 11:36:15 -06001975 .get_dev = mmc_get_dev,
Simon Glass4f7011a2016-05-01 11:36:07 -06001976};