blob: 94afbb105ee50a3e4505715493592646bebf48d9 [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);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000064 switch (cmd->resp_type) {
65 case MMC_RSP_NONE:
66 printf("\t\tMMC_RSP_NONE\n");
67 break;
68 case MMC_RSP_R1:
69 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
70 cmd->response[0]);
71 break;
72 case MMC_RSP_R1b:
73 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
74 cmd->response[0]);
75 break;
76 case MMC_RSP_R2:
77 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
78 cmd->response[0]);
79 printf("\t\t \t\t 0x%08X \n",
80 cmd->response[1]);
81 printf("\t\t \t\t 0x%08X \n",
82 cmd->response[2]);
83 printf("\t\t \t\t 0x%08X \n",
84 cmd->response[3]);
85 printf("\n");
86 printf("\t\t\t\t\tDUMPING DATA\n");
87 for (i = 0; i < 4; i++) {
88 int j;
89 printf("\t\t\t\t\t%03d - ", i*4);
Dirk Behmec9cb4a92012-03-08 02:35:34 +000090 ptr = (u8 *)&cmd->response[i];
Raffaele Recalcati894b1e22011-03-11 02:01:14 +000091 ptr += 3;
92 for (j = 0; j < 4; j++)
93 printf("%02X ", *ptr--);
94 printf("\n");
95 }
96 break;
97 case MMC_RSP_R3:
98 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
99 cmd->response[0]);
100 break;
101 default:
102 printf("\t\tERROR MMC rsp not supported\n");
103 break;
104 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000105#else
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200106 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000107#endif
Marek Vasutdccb6082012-03-15 18:41:35 +0000108 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500109}
110
Paul Burton8d30cc92013-09-09 15:30:26 +0100111int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000112{
113 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000114 int err, retries = 5;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000115#ifdef CONFIG_MMC_TRACE
116 int status;
117#endif
118
119 cmd.cmdidx = MMC_CMD_SEND_STATUS;
120 cmd.resp_type = MMC_RSP_R1;
Marek Vasutc4427392011-08-10 09:24:48 +0200121 if (!mmc_host_is_spi(mmc))
122 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000123
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500124 while (1) {
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000125 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-02-05 22:29:12 +0000126 if (!err) {
127 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
128 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
129 MMC_STATE_PRG)
130 break;
131 else if (cmd.response[0] & MMC_STATUS_MASK) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100132#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzke31789322012-02-05 22:29:12 +0000133 printf("Status Error: 0x%08X\n",
134 cmd.response[0]);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100135#endif
Jan Kloetzke31789322012-02-05 22:29:12 +0000136 return COMM_ERR;
137 }
138 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000139 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000140
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500141 if (timeout-- <= 0)
142 break;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000143
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500144 udelay(1000);
145 }
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000146
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000147#ifdef CONFIG_MMC_TRACE
148 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
149 printf("CURR STATE:%d\n", status);
150#endif
Jongman Heo1be00d92012-06-03 21:32:13 +0000151 if (timeout <= 0) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100152#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000153 printf("Timeout waiting card ready\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100154#endif
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000155 return TIMEOUT;
156 }
Andrew Gabbasove80682f2014-04-03 04:34:32 -0500157 if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
158 return SWITCH_ERR;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000159
160 return 0;
161}
162
Paul Burton8d30cc92013-09-09 15:30:26 +0100163int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Flemingad347bb2008-10-30 16:41:01 -0500164{
165 struct mmc_cmd cmd;
166
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -0600167 if (mmc->ddr_mode)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900168 return 0;
169
Andy Flemingad347bb2008-10-30 16:41:01 -0500170 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
171 cmd.resp_type = MMC_RSP_R1;
172 cmd.cmdarg = len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500173
174 return mmc_send_cmd(mmc, &cmd, NULL);
175}
176
177struct mmc *find_mmc_device(int dev_num)
178{
179 struct mmc *m;
180 struct list_head *entry;
181
182 list_for_each(entry, &mmc_devices) {
183 m = list_entry(entry, struct mmc, link);
184
185 if (m->block_dev.dev == dev_num)
186 return m;
187 }
188
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100189#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -0500190 printf("MMC Device %d not found\n", dev_num);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100191#endif
Andy Flemingad347bb2008-10-30 16:41:01 -0500192
193 return NULL;
194}
195
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200196static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillips87ea3892012-10-29 13:34:43 +0000197 lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500198{
199 struct mmc_cmd cmd;
200 struct mmc_data data;
201
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700202 if (blkcnt > 1)
203 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
204 else
205 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500206
207 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700208 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500209 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700210 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500211
212 cmd.resp_type = MMC_RSP_R1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500213
214 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700215 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500216 data.blocksize = mmc->read_bl_len;
217 data.flags = MMC_DATA_READ;
218
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700219 if (mmc_send_cmd(mmc, &cmd, &data))
220 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500221
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700222 if (blkcnt > 1) {
223 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
224 cmd.cmdarg = 0;
225 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700226 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100227#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700228 printf("mmc fail to send stop cmd\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100229#endif
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700230 return 0;
231 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500232 }
233
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700234 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500235}
236
Simon Glasse3394752016-02-29 15:25:34 -0700237static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
Stephen Warrene73f2962015-12-07 11:38:48 -0700238 lbaint_t blkcnt, void *dst)
Andy Flemingad347bb2008-10-30 16:41:01 -0500239{
Stephen Warrene73f2962015-12-07 11:38:48 -0700240 int dev_num = block_dev->dev;
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700241 int err;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700242 lbaint_t cur, blocks_todo = blkcnt;
243
244 if (blkcnt == 0)
245 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500246
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700247 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500248 if (!mmc)
249 return 0;
250
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700251 err = mmc_select_hwpart(dev_num, block_dev->hwpart);
252 if (err < 0)
253 return 0;
254
Lei Wene1cc9c82010-09-13 22:07:27 +0800255 if ((start + blkcnt) > mmc->block_dev.lba) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100256#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbe4bdf6fd2013-06-14 13:07:25 +0200257 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Lei Wene1cc9c82010-09-13 22:07:27 +0800258 start + blkcnt, mmc->block_dev.lba);
Paul Burton6a7c5ba2013-09-04 16:12:25 +0100259#endif
Lei Wene1cc9c82010-09-13 22:07:27 +0800260 return 0;
261 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500262
Simon Glassa4343c42015-06-23 15:38:50 -0600263 if (mmc_set_blocklen(mmc, mmc->read_bl_len)) {
264 debug("%s: Failed to set blocklen\n", __func__);
Andy Flemingad347bb2008-10-30 16:41:01 -0500265 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600266 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500267
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700268 do {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200269 cur = (blocks_todo > mmc->cfg->b_max) ?
270 mmc->cfg->b_max : blocks_todo;
Simon Glassa4343c42015-06-23 15:38:50 -0600271 if (mmc_read_blocks(mmc, dst, start, cur) != cur) {
272 debug("%s: Failed to read blocks\n", __func__);
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700273 return 0;
Simon Glassa4343c42015-06-23 15:38:50 -0600274 }
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700275 blocks_todo -= cur;
276 start += cur;
277 dst += cur * mmc->read_bl_len;
278 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500279
280 return blkcnt;
281}
282
Kim Phillips87ea3892012-10-29 13:34:43 +0000283static int mmc_go_idle(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500284{
285 struct mmc_cmd cmd;
286 int err;
287
288 udelay(1000);
289
290 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
291 cmd.cmdarg = 0;
292 cmd.resp_type = MMC_RSP_NONE;
Andy Flemingad347bb2008-10-30 16:41:01 -0500293
294 err = mmc_send_cmd(mmc, &cmd, NULL);
295
296 if (err)
297 return err;
298
299 udelay(2000);
300
301 return 0;
302}
303
Kim Phillips87ea3892012-10-29 13:34:43 +0000304static int sd_send_op_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500305{
306 int timeout = 1000;
307 int err;
308 struct mmc_cmd cmd;
309
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500310 while (1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500311 cmd.cmdidx = MMC_CMD_APP_CMD;
312 cmd.resp_type = MMC_RSP_R1;
313 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500314
315 err = mmc_send_cmd(mmc, &cmd, NULL);
316
317 if (err)
318 return err;
319
320 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
321 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100322
323 /*
324 * Most cards do not answer if some reserved bits
325 * in the ocr are set. However, Some controller
326 * can set bit 7 (reserved for low voltages), but
327 * how to manage low voltages SD card is not yet
328 * specified.
329 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000330 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200331 (mmc->cfg->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500332
333 if (mmc->version == SD_VERSION_2)
334 cmd.cmdarg |= OCR_HCS;
335
336 err = mmc_send_cmd(mmc, &cmd, NULL);
337
338 if (err)
339 return err;
340
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500341 if (cmd.response[0] & OCR_BUSY)
342 break;
Andy Flemingad347bb2008-10-30 16:41:01 -0500343
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500344 if (timeout-- <= 0)
345 return UNUSABLE_ERR;
346
347 udelay(1000);
348 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500349
350 if (mmc->version != SD_VERSION_2)
351 mmc->version = SD_VERSION_1_0;
352
Thomas Chou1254c3d2010-12-24 13:12:21 +0000353 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
354 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
355 cmd.resp_type = MMC_RSP_R3;
356 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000357
358 err = mmc_send_cmd(mmc, &cmd, NULL);
359
360 if (err)
361 return err;
362 }
363
Rabin Vincentb6eed942009-04-05 13:30:56 +0530364 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500365
366 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
367 mmc->rca = 0;
368
369 return 0;
370}
371
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500372static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Flemingad347bb2008-10-30 16:41:01 -0500373{
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500374 struct mmc_cmd cmd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500375 int err;
376
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500377 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
378 cmd.resp_type = MMC_RSP_R3;
379 cmd.cmdarg = 0;
Rob Herring5fd3edd2015-03-23 17:56:59 -0500380 if (use_arg && !mmc_host_is_spi(mmc))
381 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200382 (mmc->cfg->voltages &
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500383 (mmc->ocr & OCR_VOLTAGE_MASK)) |
384 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000385
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500386 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000387 if (err)
388 return err;
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500389 mmc->ocr = cmd.response[0];
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000390 return 0;
391}
392
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200393static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000394{
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000395 int err, i;
396
Andy Flemingad347bb2008-10-30 16:41:01 -0500397 /* Some cards seem to need this */
398 mmc_go_idle(mmc);
399
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000400 /* Asking to the card its capabilities */
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000401 for (i = 0; i < 2; i++) {
Andrew Gabbasovfafa6a02015-03-19 07:44:04 -0500402 err = mmc_send_op_cond_iter(mmc, i != 0);
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000403 if (err)
404 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200405
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000406 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500407 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500408 break;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000409 }
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -0500410 mmc->op_cond_pending = 1;
411 return 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000412}
Wolfgang Denk80f70212011-05-19 22:21:41 +0200413
Jeroen Hofsteeaedeeaa2014-07-12 21:24:08 +0200414static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000415{
416 struct mmc_cmd cmd;
417 int timeout = 1000;
418 uint start;
419 int err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200420
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +0000421 mmc->op_cond_pending = 0;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500422 if (!(mmc->ocr & OCR_BUSY)) {
423 start = get_timer(0);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500424 while (1) {
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500425 err = mmc_send_op_cond_iter(mmc, 1);
426 if (err)
427 return err;
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500428 if (mmc->ocr & OCR_BUSY)
429 break;
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500430 if (get_timer(start) > timeout)
431 return UNUSABLE_ERR;
432 udelay(100);
Andrew Gabbasov034857c2015-03-19 07:44:06 -0500433 }
Andrew Gabbasov5a513ca2015-03-19 07:44:05 -0500434 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500435
Thomas Chou1254c3d2010-12-24 13:12:21 +0000436 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
437 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
438 cmd.resp_type = MMC_RSP_R3;
439 cmd.cmdarg = 0;
Thomas Chou1254c3d2010-12-24 13:12:21 +0000440
441 err = mmc_send_cmd(mmc, &cmd, NULL);
442
443 if (err)
444 return err;
Andrew Gabbasovec600d12015-03-19 07:44:03 -0500445
446 mmc->ocr = cmd.response[0];
Thomas Chou1254c3d2010-12-24 13:12:21 +0000447 }
448
Andy Flemingad347bb2008-10-30 16:41:01 -0500449 mmc->version = MMC_VERSION_UNKNOWN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500450
451 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrenf6545f12014-01-30 16:11:12 -0700452 mmc->rca = 1;
Andy Flemingad347bb2008-10-30 16:41:01 -0500453
454 return 0;
455}
456
457
Kim Phillips87ea3892012-10-29 13:34:43 +0000458static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Flemingad347bb2008-10-30 16:41:01 -0500459{
460 struct mmc_cmd cmd;
461 struct mmc_data data;
462 int err;
463
464 /* Get the Card Status Register */
465 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
466 cmd.resp_type = MMC_RSP_R1;
467 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500468
Yoshihiro Shimodaf6bec732012-06-07 19:09:11 +0000469 data.dest = (char *)ext_csd;
Andy Flemingad347bb2008-10-30 16:41:01 -0500470 data.blocks = 1;
Simon Glassa09c2b72013-04-03 08:54:30 +0000471 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -0500472 data.flags = MMC_DATA_READ;
473
474 err = mmc_send_cmd(mmc, &cmd, &data);
475
476 return err;
477}
478
479
Kim Phillips87ea3892012-10-29 13:34:43 +0000480static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Flemingad347bb2008-10-30 16:41:01 -0500481{
482 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000483 int timeout = 1000;
484 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500485
486 cmd.cmdidx = MMC_CMD_SWITCH;
487 cmd.resp_type = MMC_RSP_R1b;
488 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000489 (index << 16) |
490 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500491
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000492 ret = mmc_send_cmd(mmc, &cmd, NULL);
493
494 /* Waiting for the ready status */
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000495 if (!ret)
496 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000497
498 return ret;
499
Andy Flemingad347bb2008-10-30 16:41:01 -0500500}
501
Kim Phillips87ea3892012-10-29 13:34:43 +0000502static int mmc_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500503{
Simon Glassa09c2b72013-04-03 08:54:30 +0000504 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Flemingad347bb2008-10-30 16:41:01 -0500505 char cardtype;
506 int err;
507
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600508 mmc->card_caps = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500509
Thomas Chou1254c3d2010-12-24 13:12:21 +0000510 if (mmc_host_is_spi(mmc))
511 return 0;
512
Andy Flemingad347bb2008-10-30 16:41:01 -0500513 /* Only version 4 supports high-speed */
514 if (mmc->version < MMC_VERSION_4)
515 return 0;
516
Andrew Gabbasovccb7b042014-12-25 10:22:25 -0600517 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
518
Andy Flemingad347bb2008-10-30 16:41:01 -0500519 err = mmc_send_ext_csd(mmc, ext_csd);
520
521 if (err)
522 return err;
523
Lei Wen217467f2011-10-03 20:35:10 +0000524 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500525
526 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
527
528 if (err)
Andrew Gabbasove80682f2014-04-03 04:34:32 -0500529 return err == SWITCH_ERR ? 0 : err;
Andy Flemingad347bb2008-10-30 16:41:01 -0500530
531 /* Now check to see that it worked */
532 err = mmc_send_ext_csd(mmc, ext_csd);
533
534 if (err)
535 return err;
536
537 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000538 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500539 return 0;
540
541 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900542 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov95a37132014-12-01 06:59:10 -0600543 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900544 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Flemingad347bb2008-10-30 16:41:01 -0500545 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900546 } else {
Andy Flemingad347bb2008-10-30 16:41:01 -0500547 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chung38ce30b2014-05-16 13:59:54 +0900548 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500549
550 return 0;
551}
552
Stephen Warrene315ae82013-06-11 15:14:01 -0600553static int mmc_set_capacity(struct mmc *mmc, int part_num)
554{
555 switch (part_num) {
556 case 0:
557 mmc->capacity = mmc->capacity_user;
558 break;
559 case 1:
560 case 2:
561 mmc->capacity = mmc->capacity_boot;
562 break;
563 case 3:
564 mmc->capacity = mmc->capacity_rpmb;
565 break;
566 case 4:
567 case 5:
568 case 6:
569 case 7:
570 mmc->capacity = mmc->capacity_gp[part_num - 4];
571 break;
572 default:
573 return -1;
574 }
575
576 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
577
578 return 0;
579}
580
Stephen Warren52c44e42014-05-07 12:19:02 -0600581int mmc_select_hwpart(int dev_num, int hwpart)
582{
583 struct mmc *mmc = find_mmc_device(dev_num);
584 int ret;
585
586 if (!mmc)
Stephen Warrenbf0c7852014-05-23 12:47:06 -0600587 return -ENODEV;
Stephen Warren52c44e42014-05-07 12:19:02 -0600588
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700589 if (mmc->block_dev.hwpart == hwpart)
Stephen Warren52c44e42014-05-07 12:19:02 -0600590 return 0;
591
592 if (mmc->part_config == MMCPART_NOAVAILABLE) {
593 printf("Card doesn't support part_switch\n");
Stephen Warrenbf0c7852014-05-23 12:47:06 -0600594 return -EMEDIUMTYPE;
Stephen Warren52c44e42014-05-07 12:19:02 -0600595 }
596
597 ret = mmc_switch_part(dev_num, hwpart);
598 if (ret)
Stephen Warrenbf0c7852014-05-23 12:47:06 -0600599 return ret;
Stephen Warren52c44e42014-05-07 12:19:02 -0600600
Stephen Warren52c44e42014-05-07 12:19:02 -0600601 return 0;
602}
603
604
Lei Wen31b99802011-05-02 16:26:26 +0000605int mmc_switch_part(int dev_num, unsigned int part_num)
606{
607 struct mmc *mmc = find_mmc_device(dev_num);
Stephen Warrene315ae82013-06-11 15:14:01 -0600608 int ret;
Lei Wen31b99802011-05-02 16:26:26 +0000609
610 if (!mmc)
611 return -1;
612
Stephen Warrene315ae82013-06-11 15:14:01 -0600613 ret = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
614 (mmc->part_config & ~PART_ACCESS_MASK)
615 | (part_num & PART_ACCESS_MASK));
Peter Bigot45fde892014-09-02 18:31:23 -0500616
617 /*
618 * Set the capacity if the switch succeeded or was intended
619 * to return to representing the raw device.
620 */
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700621 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot45fde892014-09-02 18:31:23 -0500622 ret = mmc_set_capacity(mmc, part_num);
Stephen Warren1e0f92a2015-12-07 11:38:49 -0700623 mmc->block_dev.hwpart = part_num;
624 }
Stephen Warrene315ae82013-06-11 15:14:01 -0600625
Peter Bigot45fde892014-09-02 18:31:23 -0500626 return ret;
Lei Wen31b99802011-05-02 16:26:26 +0000627}
628
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100629int mmc_hwpart_config(struct mmc *mmc,
630 const struct mmc_hwpart_conf *conf,
631 enum mmc_hwpart_conf_mode mode)
632{
633 u8 part_attrs = 0;
634 u32 enh_size_mult;
635 u32 enh_start_addr;
636 u32 gp_size_mult[4];
637 u32 max_enh_size_mult;
638 u32 tot_enh_size_mult = 0;
Diego Santa Cruz80200272014-12-23 10:50:31 +0100639 u8 wr_rel_set;
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100640 int i, pidx, err;
641 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
642
643 if (mode < MMC_HWPART_CONF_CHECK || mode > MMC_HWPART_CONF_COMPLETE)
644 return -EINVAL;
645
646 if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4_41)) {
647 printf("eMMC >= 4.4 required for enhanced user data area\n");
648 return -EMEDIUMTYPE;
649 }
650
651 if (!(mmc->part_support & PART_SUPPORT)) {
652 printf("Card does not support partitioning\n");
653 return -EMEDIUMTYPE;
654 }
655
656 if (!mmc->hc_wp_grp_size) {
657 printf("Card does not define HC WP group size\n");
658 return -EMEDIUMTYPE;
659 }
660
661 /* check partition alignment and total enhanced size */
662 if (conf->user.enh_size) {
663 if (conf->user.enh_size % mmc->hc_wp_grp_size ||
664 conf->user.enh_start % mmc->hc_wp_grp_size) {
665 printf("User data enhanced area not HC WP group "
666 "size aligned\n");
667 return -EINVAL;
668 }
669 part_attrs |= EXT_CSD_ENH_USR;
670 enh_size_mult = conf->user.enh_size / mmc->hc_wp_grp_size;
671 if (mmc->high_capacity) {
672 enh_start_addr = conf->user.enh_start;
673 } else {
674 enh_start_addr = (conf->user.enh_start << 9);
675 }
676 } else {
677 enh_size_mult = 0;
678 enh_start_addr = 0;
679 }
680 tot_enh_size_mult += enh_size_mult;
681
682 for (pidx = 0; pidx < 4; pidx++) {
683 if (conf->gp_part[pidx].size % mmc->hc_wp_grp_size) {
684 printf("GP%i partition not HC WP group size "
685 "aligned\n", pidx+1);
686 return -EINVAL;
687 }
688 gp_size_mult[pidx] = conf->gp_part[pidx].size / mmc->hc_wp_grp_size;
689 if (conf->gp_part[pidx].size && conf->gp_part[pidx].enhanced) {
690 part_attrs |= EXT_CSD_ENH_GP(pidx);
691 tot_enh_size_mult += gp_size_mult[pidx];
692 }
693 }
694
695 if (part_attrs && ! (mmc->part_support & ENHNCD_SUPPORT)) {
696 printf("Card does not support enhanced attribute\n");
697 return -EMEDIUMTYPE;
698 }
699
700 err = mmc_send_ext_csd(mmc, ext_csd);
701 if (err)
702 return err;
703
704 max_enh_size_mult =
705 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+2] << 16) +
706 (ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT+1] << 8) +
707 ext_csd[EXT_CSD_MAX_ENH_SIZE_MULT];
708 if (tot_enh_size_mult > max_enh_size_mult) {
709 printf("Total enhanced size exceeds maximum (%u > %u)\n",
710 tot_enh_size_mult, max_enh_size_mult);
711 return -EMEDIUMTYPE;
712 }
713
Diego Santa Cruz80200272014-12-23 10:50:31 +0100714 /* The default value of EXT_CSD_WR_REL_SET is device
715 * dependent, the values can only be changed if the
716 * EXT_CSD_HS_CTRL_REL bit is set. The values can be
717 * changed only once and before partitioning is completed. */
718 wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
719 if (conf->user.wr_rel_change) {
720 if (conf->user.wr_rel_set)
721 wr_rel_set |= EXT_CSD_WR_DATA_REL_USR;
722 else
723 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_USR;
724 }
725 for (pidx = 0; pidx < 4; pidx++) {
726 if (conf->gp_part[pidx].wr_rel_change) {
727 if (conf->gp_part[pidx].wr_rel_set)
728 wr_rel_set |= EXT_CSD_WR_DATA_REL_GP(pidx);
729 else
730 wr_rel_set &= ~EXT_CSD_WR_DATA_REL_GP(pidx);
731 }
732 }
733
734 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET] &&
735 !(ext_csd[EXT_CSD_WR_REL_PARAM] & EXT_CSD_HS_CTRL_REL)) {
736 puts("Card does not support host controlled partition write "
737 "reliability settings\n");
738 return -EMEDIUMTYPE;
739 }
740
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100741 if (ext_csd[EXT_CSD_PARTITION_SETTING] &
742 EXT_CSD_PARTITION_SETTING_COMPLETED) {
743 printf("Card already partitioned\n");
744 return -EPERM;
745 }
746
747 if (mode == MMC_HWPART_CONF_CHECK)
748 return 0;
749
750 /* Partitioning requires high-capacity size definitions */
751 if (!(ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01)) {
752 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
753 EXT_CSD_ERASE_GROUP_DEF, 1);
754
755 if (err)
756 return err;
757
758 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
759
760 /* update erase group size to be high-capacity */
761 mmc->erase_grp_size =
762 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
763
764 }
765
766 /* all OK, write the configuration */
767 for (i = 0; i < 4; i++) {
768 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
769 EXT_CSD_ENH_START_ADDR+i,
770 (enh_start_addr >> (i*8)) & 0xFF);
771 if (err)
772 return err;
773 }
774 for (i = 0; i < 3; i++) {
775 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
776 EXT_CSD_ENH_SIZE_MULT+i,
777 (enh_size_mult >> (i*8)) & 0xFF);
778 if (err)
779 return err;
780 }
781 for (pidx = 0; pidx < 4; pidx++) {
782 for (i = 0; i < 3; i++) {
783 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
784 EXT_CSD_GP_SIZE_MULT+pidx*3+i,
785 (gp_size_mult[pidx] >> (i*8)) & 0xFF);
786 if (err)
787 return err;
788 }
789 }
790 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
791 EXT_CSD_PARTITIONS_ATTRIBUTE, part_attrs);
792 if (err)
793 return err;
794
795 if (mode == MMC_HWPART_CONF_SET)
796 return 0;
797
Diego Santa Cruz80200272014-12-23 10:50:31 +0100798 /* The WR_REL_SET is a write-once register but shall be
799 * written before setting PART_SETTING_COMPLETED. As it is
800 * write-once we can only write it when completing the
801 * partitioning. */
802 if (wr_rel_set != ext_csd[EXT_CSD_WR_REL_SET]) {
803 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
804 EXT_CSD_WR_REL_SET, wr_rel_set);
805 if (err)
806 return err;
807 }
808
Diego Santa Cruz69eb71a02014-12-23 10:50:29 +0100809 /* Setting PART_SETTING_COMPLETED confirms the partition
810 * configuration but it only becomes effective after power
811 * cycle, so we do not adjust the partition related settings
812 * in the mmc struct. */
813
814 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
815 EXT_CSD_PARTITION_SETTING,
816 EXT_CSD_PARTITION_SETTING_COMPLETED);
817 if (err)
818 return err;
819
820 return 0;
821}
822
Thierry Redingb9c8b772012-01-02 01:15:37 +0000823int mmc_getcd(struct mmc *mmc)
824{
825 int cd;
826
827 cd = board_mmc_getcd(mmc);
828
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000829 if (cd < 0) {
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200830 if (mmc->cfg->ops->getcd)
831 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardf7b15102013-03-21 04:00:03 +0000832 else
833 cd = 1;
834 }
Thierry Redingb9c8b772012-01-02 01:15:37 +0000835
836 return cd;
837}
838
Kim Phillips87ea3892012-10-29 13:34:43 +0000839static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Flemingad347bb2008-10-30 16:41:01 -0500840{
841 struct mmc_cmd cmd;
842 struct mmc_data data;
843
844 /* Switch the frequency */
845 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
846 cmd.resp_type = MMC_RSP_R1;
847 cmd.cmdarg = (mode << 31) | 0xffffff;
848 cmd.cmdarg &= ~(0xf << (group * 4));
849 cmd.cmdarg |= value << (group * 4);
Andy Flemingad347bb2008-10-30 16:41:01 -0500850
851 data.dest = (char *)resp;
852 data.blocksize = 64;
853 data.blocks = 1;
854 data.flags = MMC_DATA_READ;
855
856 return mmc_send_cmd(mmc, &cmd, &data);
857}
858
859
Kim Phillips87ea3892012-10-29 13:34:43 +0000860static int sd_change_freq(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -0500861{
862 int err;
863 struct mmc_cmd cmd;
Anton staaf9b00f0d2011-10-03 13:54:59 +0000864 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
865 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500866 struct mmc_data data;
867 int timeout;
868
869 mmc->card_caps = 0;
870
Thomas Chou1254c3d2010-12-24 13:12:21 +0000871 if (mmc_host_is_spi(mmc))
872 return 0;
873
Andy Flemingad347bb2008-10-30 16:41:01 -0500874 /* Read the SCR to find out if this card supports higher speeds */
875 cmd.cmdidx = MMC_CMD_APP_CMD;
876 cmd.resp_type = MMC_RSP_R1;
877 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -0500878
879 err = mmc_send_cmd(mmc, &cmd, NULL);
880
881 if (err)
882 return err;
883
884 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
885 cmd.resp_type = MMC_RSP_R1;
886 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500887
888 timeout = 3;
889
890retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000891 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500892 data.blocksize = 8;
893 data.blocks = 1;
894 data.flags = MMC_DATA_READ;
895
896 err = mmc_send_cmd(mmc, &cmd, &data);
897
898 if (err) {
899 if (timeout--)
900 goto retry_scr;
901
902 return err;
903 }
904
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300905 mmc->scr[0] = __be32_to_cpu(scr[0]);
906 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500907
908 switch ((mmc->scr[0] >> 24) & 0xf) {
909 case 0:
910 mmc->version = SD_VERSION_1_0;
911 break;
912 case 1:
913 mmc->version = SD_VERSION_1_10;
914 break;
915 case 2:
916 mmc->version = SD_VERSION_2;
Jaehoon Chungd552bd12013-01-29 22:58:16 +0000917 if ((mmc->scr[0] >> 15) & 0x1)
918 mmc->version = SD_VERSION_3;
Andy Flemingad347bb2008-10-30 16:41:01 -0500919 break;
920 default:
921 mmc->version = SD_VERSION_1_0;
922 break;
923 }
924
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530925 if (mmc->scr[0] & SD_DATA_4BIT)
926 mmc->card_caps |= MMC_MODE_4BIT;
927
Andy Flemingad347bb2008-10-30 16:41:01 -0500928 /* Version 1.0 doesn't support switching */
929 if (mmc->version == SD_VERSION_1_0)
930 return 0;
931
932 timeout = 4;
933 while (timeout--) {
934 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000935 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500936
937 if (err)
938 return err;
939
940 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300941 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500942 break;
943 }
944
Andy Flemingad347bb2008-10-30 16:41:01 -0500945 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300946 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -0500947 return 0;
948
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000949 /*
950 * If the host doesn't support SD_HIGHSPEED, do not switch card to
951 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
952 * This can avoid furthur problem when the card runs in different
953 * mode between the host.
954 */
Pantelis Antoniou2c850462014-03-11 19:34:20 +0200955 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
956 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000957 return 0;
958
Anton staaf9b00f0d2011-10-03 13:54:59 +0000959 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500960
961 if (err)
962 return err;
963
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300964 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -0500965 mmc->card_caps |= MMC_MODE_HS;
966
967 return 0;
968}
969
970/* frequency bases */
971/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000972static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500973 10000,
974 100000,
975 1000000,
976 10000000,
977};
978
979/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
980 * to platforms without floating point.
981 */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000982static const int multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500983 0, /* reserved */
984 10,
985 12,
986 13,
987 15,
988 20,
989 25,
990 30,
991 35,
992 40,
993 45,
994 50,
995 55,
996 60,
997 70,
998 80,
999};
1000
Kim Phillips87ea3892012-10-29 13:34:43 +00001001static void mmc_set_ios(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001002{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001003 if (mmc->cfg->ops->set_ios)
1004 mmc->cfg->ops->set_ios(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001005}
1006
1007void mmc_set_clock(struct mmc *mmc, uint clock)
1008{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001009 if (clock > mmc->cfg->f_max)
1010 clock = mmc->cfg->f_max;
Andy Flemingad347bb2008-10-30 16:41:01 -05001011
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001012 if (clock < mmc->cfg->f_min)
1013 clock = mmc->cfg->f_min;
Andy Flemingad347bb2008-10-30 16:41:01 -05001014
1015 mmc->clock = clock;
1016
1017 mmc_set_ios(mmc);
1018}
1019
Kim Phillips87ea3892012-10-29 13:34:43 +00001020static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Flemingad347bb2008-10-30 16:41:01 -05001021{
1022 mmc->bus_width = width;
1023
1024 mmc_set_ios(mmc);
1025}
1026
Kim Phillips87ea3892012-10-29 13:34:43 +00001027static int mmc_startup(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001028{
Stephen Warrene315ae82013-06-11 15:14:01 -06001029 int err, i;
Andy Flemingad347bb2008-10-30 16:41:01 -05001030 uint mult, freq;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001031 u64 cmult, csize, capacity;
Andy Flemingad347bb2008-10-30 16:41:01 -05001032 struct mmc_cmd cmd;
Simon Glassa09c2b72013-04-03 08:54:30 +00001033 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
1034 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001035 int timeout = 1000;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001036 bool has_parts = false;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001037 bool part_completed;
Andy Flemingad347bb2008-10-30 16:41:01 -05001038
Thomas Chou1254c3d2010-12-24 13:12:21 +00001039#ifdef CONFIG_MMC_SPI_CRC_ON
1040 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
1041 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
1042 cmd.resp_type = MMC_RSP_R1;
1043 cmd.cmdarg = 1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001044 err = mmc_send_cmd(mmc, &cmd, NULL);
1045
1046 if (err)
1047 return err;
1048 }
1049#endif
1050
Andy Flemingad347bb2008-10-30 16:41:01 -05001051 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001052 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1053 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -05001054 cmd.resp_type = MMC_RSP_R2;
1055 cmd.cmdarg = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001056
1057 err = mmc_send_cmd(mmc, &cmd, NULL);
1058
1059 if (err)
1060 return err;
1061
1062 memcpy(mmc->cid, cmd.response, 16);
1063
1064 /*
1065 * For MMC cards, set the Relative Address.
1066 * For SD cards, get the Relatvie Address.
1067 * This also puts the cards into Standby State
1068 */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001069 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1070 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1071 cmd.cmdarg = mmc->rca << 16;
1072 cmd.resp_type = MMC_RSP_R6;
Andy Flemingad347bb2008-10-30 16:41:01 -05001073
Thomas Chou1254c3d2010-12-24 13:12:21 +00001074 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001075
Thomas Chou1254c3d2010-12-24 13:12:21 +00001076 if (err)
1077 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001078
Thomas Chou1254c3d2010-12-24 13:12:21 +00001079 if (IS_SD(mmc))
1080 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1081 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001082
1083 /* Get the Card-Specific Data */
1084 cmd.cmdidx = MMC_CMD_SEND_CSD;
1085 cmd.resp_type = MMC_RSP_R2;
1086 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001087
1088 err = mmc_send_cmd(mmc, &cmd, NULL);
1089
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001090 /* Waiting for the ready status */
1091 mmc_send_status(mmc, timeout);
1092
Andy Flemingad347bb2008-10-30 16:41:01 -05001093 if (err)
1094 return err;
1095
Rabin Vincentb6eed942009-04-05 13:30:56 +05301096 mmc->csd[0] = cmd.response[0];
1097 mmc->csd[1] = cmd.response[1];
1098 mmc->csd[2] = cmd.response[2];
1099 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001100
1101 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301102 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001103
1104 switch (version) {
1105 case 0:
1106 mmc->version = MMC_VERSION_1_2;
1107 break;
1108 case 1:
1109 mmc->version = MMC_VERSION_1_4;
1110 break;
1111 case 2:
1112 mmc->version = MMC_VERSION_2_2;
1113 break;
1114 case 3:
1115 mmc->version = MMC_VERSION_3;
1116 break;
1117 case 4:
1118 mmc->version = MMC_VERSION_4;
1119 break;
1120 default:
1121 mmc->version = MMC_VERSION_1_2;
1122 break;
1123 }
1124 }
1125
1126 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301127 freq = fbase[(cmd.response[0] & 0x7)];
1128 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001129
1130 mmc->tran_speed = freq * mult;
1131
Markus Niebel03951412013-12-16 13:40:46 +01001132 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincentb6eed942009-04-05 13:30:56 +05301133 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001134
1135 if (IS_SD(mmc))
1136 mmc->write_bl_len = mmc->read_bl_len;
1137 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301138 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001139
1140 if (mmc->high_capacity) {
1141 csize = (mmc->csd[1] & 0x3f) << 16
1142 | (mmc->csd[2] & 0xffff0000) >> 16;
1143 cmult = 8;
1144 } else {
1145 csize = (mmc->csd[1] & 0x3ff) << 2
1146 | (mmc->csd[2] & 0xc0000000) >> 30;
1147 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1148 }
1149
Stephen Warrene315ae82013-06-11 15:14:01 -06001150 mmc->capacity_user = (csize + 1) << (cmult + 2);
1151 mmc->capacity_user *= mmc->read_bl_len;
1152 mmc->capacity_boot = 0;
1153 mmc->capacity_rpmb = 0;
1154 for (i = 0; i < 4; i++)
1155 mmc->capacity_gp[i] = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001156
Simon Glassa09c2b72013-04-03 08:54:30 +00001157 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1158 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001159
Simon Glassa09c2b72013-04-03 08:54:30 +00001160 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1161 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Flemingad347bb2008-10-30 16:41:01 -05001162
Markus Niebel03951412013-12-16 13:40:46 +01001163 if ((mmc->dsr_imp) && (0xffffffff != mmc->dsr)) {
1164 cmd.cmdidx = MMC_CMD_SET_DSR;
1165 cmd.cmdarg = (mmc->dsr & 0xffff) << 16;
1166 cmd.resp_type = MMC_RSP_NONE;
1167 if (mmc_send_cmd(mmc, &cmd, NULL))
1168 printf("MMC: SET_DSR failed\n");
1169 }
1170
Andy Flemingad347bb2008-10-30 16:41:01 -05001171 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001172 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1173 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001174 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001175 cmd.cmdarg = mmc->rca << 16;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001176 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001177
Thomas Chou1254c3d2010-12-24 13:12:21 +00001178 if (err)
1179 return err;
1180 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001181
Lei Wenea526762011-06-22 17:03:31 +00001182 /*
1183 * For SD, its erase group is always one sector
1184 */
1185 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001186 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301187 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1188 /* check ext_csd version and capacity */
1189 err = mmc_send_ext_csd(mmc, ext_csd);
Diego Santa Cruzca25e062014-12-23 10:50:28 +01001190 if (err)
1191 return err;
1192 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001193 /*
1194 * According to the JEDEC Standard, the value of
1195 * ext_csd's capacity is valid if the value is more
1196 * than 2GB
1197 */
Lei Wen217467f2011-10-03 20:35:10 +00001198 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1199 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1200 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1201 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glassa09c2b72013-04-03 08:54:30 +00001202 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewski237823e2011-07-05 02:19:44 +00001203 if ((capacity >> 20) > 2 * 1024)
Stephen Warrene315ae82013-06-11 15:14:01 -06001204 mmc->capacity_user = capacity;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301205 }
Lei Wen31b99802011-05-02 16:26:26 +00001206
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001207 switch (ext_csd[EXT_CSD_REV]) {
1208 case 1:
1209 mmc->version = MMC_VERSION_4_1;
1210 break;
1211 case 2:
1212 mmc->version = MMC_VERSION_4_2;
1213 break;
1214 case 3:
1215 mmc->version = MMC_VERSION_4_3;
1216 break;
1217 case 5:
1218 mmc->version = MMC_VERSION_4_41;
1219 break;
1220 case 6:
1221 mmc->version = MMC_VERSION_4_5;
1222 break;
Markus Niebel32f53b62014-11-18 15:13:53 +01001223 case 7:
1224 mmc->version = MMC_VERSION_5_0;
1225 break;
Jaehoon Chung6108ef62013-01-29 19:31:16 +00001226 }
1227
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001228 /* The partition data may be non-zero but it is only
1229 * effective if PARTITION_SETTING_COMPLETED is set in
1230 * EXT_CSD, so ignore any data if this bit is not set,
1231 * except for enabling the high-capacity group size
1232 * definition (see below). */
1233 part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
1234 EXT_CSD_PARTITION_SETTING_COMPLETED);
1235
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001236 /* store the partition info of emmc */
1237 mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
1238 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1239 ext_csd[EXT_CSD_BOOT_MULT])
1240 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001241 if (part_completed &&
1242 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001243 mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
1244
1245 mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
1246
1247 mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
1248
1249 for (i = 0; i < 4; i++) {
1250 int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001251 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001252 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001253 if (mult)
1254 has_parts = true;
1255 if (!part_completed)
1256 continue;
1257 mmc->capacity_gp[i] = mult;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001258 mmc->capacity_gp[i] *=
1259 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1260 mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruze5a2a3a2014-12-23 10:50:21 +01001261 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001262 }
1263
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001264 if (part_completed) {
1265 mmc->enh_user_size =
1266 (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
1267 (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
1268 ext_csd[EXT_CSD_ENH_SIZE_MULT];
1269 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
1270 mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
1271 mmc->enh_user_size <<= 19;
1272 mmc->enh_user_start =
1273 (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
1274 (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
1275 (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
1276 ext_csd[EXT_CSD_ENH_START_ADDR];
1277 if (mmc->high_capacity)
1278 mmc->enh_user_start <<= 9;
1279 }
Diego Santa Cruz3b62d842014-12-23 10:50:22 +01001280
Lei Wenea526762011-06-22 17:03:31 +00001281 /*
Oliver Metzb3f14092013-10-01 20:32:07 +02001282 * Host needs to enable ERASE_GRP_DEF bit if device is
1283 * partitioned. This bit will be lost every time after a reset
1284 * or power off. This will affect erase size.
Lei Wenea526762011-06-22 17:03:31 +00001285 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001286 if (part_completed)
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001287 has_parts = true;
Oliver Metzb3f14092013-10-01 20:32:07 +02001288 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruzcea8c5c2014-12-23 10:50:20 +01001289 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1290 has_parts = true;
1291 if (has_parts) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001292 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
1293 EXT_CSD_ERASE_GROUP_DEF, 1);
1294
1295 if (err)
1296 return err;
Hannes Petermaier15e874d2014-08-08 09:47:22 +02001297 else
1298 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001299 }
Oliver Metzb3f14092013-10-01 20:32:07 +02001300
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001301 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metzb3f14092013-10-01 20:32:07 +02001302 /* Read out group size from ext_csd */
Lei Wen217467f2011-10-03 20:35:10 +00001303 mmc->erase_grp_size =
Diego Santa Cruz747f6fa2014-12-23 10:50:24 +01001304 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebel6d398922014-11-18 15:11:42 +01001305 /*
1306 * if high capacity and partition setting completed
1307 * SEC_COUNT is valid even if it is smaller than 2 GiB
1308 * JEDEC Standard JESD84-B45, 6.2.4
1309 */
Diego Santa Cruza7a75992014-12-23 10:50:27 +01001310 if (mmc->high_capacity && part_completed) {
Markus Niebel6d398922014-11-18 15:11:42 +01001311 capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
1312 (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
1313 (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
1314 (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
1315 capacity *= MMC_MAX_BLOCK_LEN;
1316 mmc->capacity_user = capacity;
1317 }
Simon Glassa09c2b72013-04-03 08:54:30 +00001318 } else {
Oliver Metzb3f14092013-10-01 20:32:07 +02001319 /* Calculate the group size from the csd value. */
Lei Wenea526762011-06-22 17:03:31 +00001320 int erase_gsz, erase_gmul;
1321 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1322 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1323 mmc->erase_grp_size = (erase_gsz + 1)
1324 * (erase_gmul + 1);
1325 }
Diego Santa Cruz61b78fe2014-12-23 10:50:25 +01001326
1327 mmc->hc_wp_grp_size = 1024
1328 * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1329 * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
Diego Santa Cruz37a50b92014-12-23 10:50:33 +01001330
1331 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301332 }
1333
Stephen Warren1e0f92a2015-12-07 11:38:49 -07001334 err = mmc_set_capacity(mmc, mmc->block_dev.hwpart);
Stephen Warrene315ae82013-06-11 15:14:01 -06001335 if (err)
1336 return err;
1337
Andy Flemingad347bb2008-10-30 16:41:01 -05001338 if (IS_SD(mmc))
1339 err = sd_change_freq(mmc);
1340 else
1341 err = mmc_change_freq(mmc);
1342
1343 if (err)
1344 return err;
1345
1346 /* Restrict card's capabilities by what the host can do */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001347 mmc->card_caps &= mmc->cfg->host_caps;
Andy Flemingad347bb2008-10-30 16:41:01 -05001348
1349 if (IS_SD(mmc)) {
1350 if (mmc->card_caps & MMC_MODE_4BIT) {
1351 cmd.cmdidx = MMC_CMD_APP_CMD;
1352 cmd.resp_type = MMC_RSP_R1;
1353 cmd.cmdarg = mmc->rca << 16;
Andy Flemingad347bb2008-10-30 16:41:01 -05001354
1355 err = mmc_send_cmd(mmc, &cmd, NULL);
1356 if (err)
1357 return err;
1358
1359 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1360 cmd.resp_type = MMC_RSP_R1;
1361 cmd.cmdarg = 2;
Andy Flemingad347bb2008-10-30 16:41:01 -05001362 err = mmc_send_cmd(mmc, &cmd, NULL);
1363 if (err)
1364 return err;
1365
1366 mmc_set_bus_width(mmc, 4);
1367 }
1368
1369 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001370 mmc->tran_speed = 50000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001371 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001372 mmc->tran_speed = 25000000;
Andrew Gabbasovccb7b042014-12-25 10:22:25 -06001373 } else if (mmc->version >= MMC_VERSION_4) {
1374 /* Only version 4 of MMC supports wider bus widths */
Andy Flemingeb766ad2012-10-31 19:02:38 +00001375 int idx;
1376
1377 /* An array of possible bus widths in order of preference */
1378 static unsigned ext_csd_bits[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001379 EXT_CSD_DDR_BUS_WIDTH_8,
1380 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001381 EXT_CSD_BUS_WIDTH_8,
1382 EXT_CSD_BUS_WIDTH_4,
1383 EXT_CSD_BUS_WIDTH_1,
1384 };
1385
1386 /* An array to map CSD bus widths to host cap bits */
1387 static unsigned ext_to_hostcaps[] = {
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001388 [EXT_CSD_DDR_BUS_WIDTH_4] =
1389 MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
1390 [EXT_CSD_DDR_BUS_WIDTH_8] =
1391 MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001392 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1393 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1394 };
1395
1396 /* An array to map chosen bus width to an integer */
1397 static unsigned widths[] = {
Jaehoon Chung38ce30b2014-05-16 13:59:54 +09001398 8, 4, 8, 4, 1,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001399 };
1400
1401 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1402 unsigned int extw = ext_csd_bits[idx];
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001403 unsigned int caps = ext_to_hostcaps[extw];
Andy Flemingeb766ad2012-10-31 19:02:38 +00001404
1405 /*
Andrew Gabbasovc1b2cf02014-12-25 10:22:24 -06001406 * If the bus width is still not changed,
1407 * don't try to set the default again.
1408 * Otherwise, recover from switch attempts
1409 * by switching to 1-bit bus width.
1410 */
1411 if (extw == EXT_CSD_BUS_WIDTH_1 &&
1412 mmc->bus_width == 1) {
1413 err = 0;
1414 break;
1415 }
1416
1417 /*
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001418 * Check to make sure the card and controller support
1419 * these capabilities
Andy Flemingeb766ad2012-10-31 19:02:38 +00001420 */
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001421 if ((mmc->card_caps & caps) != caps)
Andy Flemingeb766ad2012-10-31 19:02:38 +00001422 continue;
1423
Andy Flemingad347bb2008-10-30 16:41:01 -05001424 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Flemingeb766ad2012-10-31 19:02:38 +00001425 EXT_CSD_BUS_WIDTH, extw);
Andy Flemingad347bb2008-10-30 16:41:01 -05001426
1427 if (err)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001428 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001429
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001430 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Flemingeb766ad2012-10-31 19:02:38 +00001431 mmc_set_bus_width(mmc, widths[idx]);
Andy Flemingad347bb2008-10-30 16:41:01 -05001432
Lei Wen4f5a6a52011-10-03 20:35:11 +00001433 err = mmc_send_ext_csd(mmc, test_csd);
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001434
1435 if (err)
1436 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001437
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001438 /* Only compare read only fields */
1439 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
1440 == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
1441 ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
1442 == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
1443 ext_csd[EXT_CSD_REV]
1444 == test_csd[EXT_CSD_REV] &&
1445 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1446 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
1447 memcmp(&ext_csd[EXT_CSD_SEC_CNT],
1448 &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001449 break;
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001450 else
1451 err = SWITCH_ERR;
Andy Flemingad347bb2008-10-30 16:41:01 -05001452 }
1453
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001454 if (err)
1455 return err;
1456
Andy Flemingad347bb2008-10-30 16:41:01 -05001457 if (mmc->card_caps & MMC_MODE_HS) {
1458 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001459 mmc->tran_speed = 52000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001460 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001461 mmc->tran_speed = 26000000;
1462 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001463 }
1464
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001465 mmc_set_clock(mmc, mmc->tran_speed);
1466
Andrew Gabbasov532663b2014-12-01 06:59:11 -06001467 /* Fix the block length for DDR mode */
1468 if (mmc->ddr_mode) {
1469 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
1470 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
1471 }
1472
Andy Flemingad347bb2008-10-30 16:41:01 -05001473 /* fill in device description */
1474 mmc->block_dev.lun = 0;
Stephen Warren1e0f92a2015-12-07 11:38:49 -07001475 mmc->block_dev.hwpart = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001476 mmc->block_dev.type = 0;
1477 mmc->block_dev.blksz = mmc->read_bl_len;
Egbert Eich2eec2ab2013-04-09 21:11:56 +00001478 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
Rabin Vincent69d4e2c2009-04-05 13:30:54 +05301479 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsd67754f2015-12-04 23:27:40 +01001480#if !defined(CONFIG_SPL_BUILD) || \
1481 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1482 !defined(CONFIG_USE_TINY_PRINTF))
Taylor Hutt7367ec22012-10-20 17:15:59 +00001483 sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1484 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1485 (mmc->cid[3] >> 16) & 0xffff);
1486 sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1487 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1488 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1489 (mmc->cid[2] >> 24) & 0xff);
1490 sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1491 (mmc->cid[2] >> 16) & 0xf);
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001492#else
1493 mmc->block_dev.vendor[0] = 0;
1494 mmc->block_dev.product[0] = 0;
1495 mmc->block_dev.revision[0] = 0;
1496#endif
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001497#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glassb89a8442016-02-29 15:25:48 -07001498 part_init(&mmc->block_dev);
Mikhail Kshevetskiy5cbfa8e7a2012-07-09 08:53:38 +00001499#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001500
1501 return 0;
1502}
1503
Kim Phillips87ea3892012-10-29 13:34:43 +00001504static int mmc_send_if_cond(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001505{
1506 struct mmc_cmd cmd;
1507 int err;
1508
1509 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1510 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001511 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Flemingad347bb2008-10-30 16:41:01 -05001512 cmd.resp_type = MMC_RSP_R7;
Andy Flemingad347bb2008-10-30 16:41:01 -05001513
1514 err = mmc_send_cmd(mmc, &cmd, NULL);
1515
1516 if (err)
1517 return err;
1518
Rabin Vincentb6eed942009-04-05 13:30:56 +05301519 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Flemingad347bb2008-10-30 16:41:01 -05001520 return UNUSABLE_ERR;
1521 else
1522 mmc->version = SD_VERSION_2;
1523
1524 return 0;
1525}
1526
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001527/* not used any more */
1528int __deprecated mmc_register(struct mmc *mmc)
1529{
1530#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1531 printf("%s is deprecated! use mmc_create() instead.\n", __func__);
1532#endif
1533 return -1;
1534}
1535
1536struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
Andy Flemingad347bb2008-10-30 16:41:01 -05001537{
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001538 struct mmc *mmc;
1539
1540 /* quick validation */
1541 if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
1542 cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
1543 return NULL;
1544
1545 mmc = calloc(1, sizeof(*mmc));
1546 if (mmc == NULL)
1547 return NULL;
1548
1549 mmc->cfg = cfg;
1550 mmc->priv = priv;
1551
1552 /* the following chunk was mmc_register() */
1553
Markus Niebel03951412013-12-16 13:40:46 +01001554 /* Setup dsr related values */
1555 mmc->dsr_imp = 0;
1556 mmc->dsr = 0xffffffff;
Andy Flemingad347bb2008-10-30 16:41:01 -05001557 /* Setup the universal parts of the block interface just once */
1558 mmc->block_dev.if_type = IF_TYPE_MMC;
1559 mmc->block_dev.dev = cur_dev_num++;
1560 mmc->block_dev.removable = 1;
1561 mmc->block_dev.block_read = mmc_bread;
1562 mmc->block_dev.block_write = mmc_bwrite;
Lei Wenea526762011-06-22 17:03:31 +00001563 mmc->block_dev.block_erase = mmc_berase;
Andy Flemingad347bb2008-10-30 16:41:01 -05001564
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001565 /* setup initial part type */
1566 mmc->block_dev.part_type = mmc->cfg->part_type;
Andy Flemingad347bb2008-10-30 16:41:01 -05001567
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001568 INIT_LIST_HEAD(&mmc->link);
Andy Flemingad347bb2008-10-30 16:41:01 -05001569
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001570 list_add_tail(&mmc->link, &mmc_devices);
1571
1572 return mmc;
1573}
1574
1575void mmc_destroy(struct mmc *mmc)
1576{
1577 /* only freeing memory for now */
1578 free(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001579}
1580
Matthew McClintock6252b4f2011-05-24 05:31:19 +00001581#ifdef CONFIG_PARTITIONS
Simon Glasse3394752016-02-29 15:25:34 -07001582struct blk_desc *mmc_get_dev(int dev)
Andy Flemingad347bb2008-10-30 16:41:01 -05001583{
1584 struct mmc *mmc = find_mmc_device(dev);
Benoît Thébaudeau6ce8aed2012-08-10 08:59:12 +00001585 if (!mmc || mmc_init(mmc))
Łukasz Majewski65b04cf2012-04-19 02:39:18 +00001586 return NULL;
Andy Flemingad347bb2008-10-30 16:41:01 -05001587
Łukasz Majewski65b04cf2012-04-19 02:39:18 +00001588 return &mmc->block_dev;
Andy Flemingad347bb2008-10-30 16:41:01 -05001589}
Matthew McClintock6252b4f2011-05-24 05:31:19 +00001590#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001591
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001592/* board-specific MMC power initializations. */
1593__weak void board_mmc_power_init(void)
1594{
1595}
1596
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001597int mmc_start_init(struct mmc *mmc)
Andy Flemingad347bb2008-10-30 16:41:01 -05001598{
Macpaul Lin028bde12011-11-14 23:35:39 +00001599 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001600
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001601 /* we pretend there's no card when init is NULL */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001602 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Redingb9c8b772012-01-02 01:15:37 +00001603 mmc->has_init = 0;
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001604#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Redingb9c8b772012-01-02 01:15:37 +00001605 printf("MMC: no card present\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001606#endif
Thierry Redingb9c8b772012-01-02 01:15:37 +00001607 return NO_CARD_ERR;
1608 }
1609
Lei Wen31b99802011-05-02 16:26:26 +00001610 if (mmc->has_init)
1611 return 0;
1612
Yangbo Lub124f8a2015-04-22 13:57:00 +08001613#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1614 mmc_adapter_card_type_ident();
1615#endif
Paul Kocialkowski2439fe92014-11-08 20:55:45 +01001616 board_mmc_power_init();
1617
Pantelis Antoniouc9e75912014-02-26 19:28:45 +02001618 /* made sure it's not NULL earlier */
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001619 err = mmc->cfg->ops->init(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001620
1621 if (err)
1622 return err;
1623
Andrew Gabbasov9fc2a412014-12-01 06:59:09 -06001624 mmc->ddr_mode = 0;
Ilya Yanok8459aab2009-06-29 17:53:16 +04001625 mmc_set_bus_width(mmc, 1);
1626 mmc_set_clock(mmc, 1);
1627
Andy Flemingad347bb2008-10-30 16:41:01 -05001628 /* Reset the Card */
1629 err = mmc_go_idle(mmc);
1630
1631 if (err)
1632 return err;
1633
Lei Wen31b99802011-05-02 16:26:26 +00001634 /* The internal partition reset to user partition(0) at every CMD0*/
Stephen Warren1e0f92a2015-12-07 11:38:49 -07001635 mmc->block_dev.hwpart = 0;
Lei Wen31b99802011-05-02 16:26:26 +00001636
Andy Flemingad347bb2008-10-30 16:41:01 -05001637 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001638 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001639
Andy Flemingad347bb2008-10-30 16:41:01 -05001640 /* Now try to get the SD card's operating condition */
1641 err = sd_send_op_cond(mmc);
1642
1643 /* If the command timed out, we check for an MMC card */
1644 if (err == TIMEOUT) {
1645 err = mmc_send_op_cond(mmc);
1646
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001647 if (err) {
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001648#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Flemingad347bb2008-10-30 16:41:01 -05001649 printf("Card did not respond to voltage select!\n");
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001650#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001651 return UNUSABLE_ERR;
1652 }
1653 }
1654
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001655 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001656 mmc->init_in_progress = 1;
1657
1658 return err;
1659}
1660
1661static int mmc_complete_init(struct mmc *mmc)
1662{
1663 int err = 0;
1664
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001665 mmc->init_in_progress = 0;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001666 if (mmc->op_cond_pending)
1667 err = mmc_complete_op_cond(mmc);
1668
1669 if (!err)
1670 err = mmc_startup(mmc);
Lei Wen31b99802011-05-02 16:26:26 +00001671 if (err)
1672 mmc->has_init = 0;
1673 else
1674 mmc->has_init = 1;
1675 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001676}
1677
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001678int mmc_init(struct mmc *mmc)
1679{
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001680 int err = 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001681 unsigned start;
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001682
1683 if (mmc->has_init)
1684 return 0;
Mateusz Zalegada351782014-04-29 20:15:30 +02001685
1686 start = get_timer(0);
1687
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001688 if (!mmc->init_in_progress)
1689 err = mmc_start_init(mmc);
1690
Andrew Gabbasov3a669bc2015-03-19 07:44:07 -05001691 if (!err)
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001692 err = mmc_complete_init(mmc);
1693 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
1694 return err;
1695}
1696
Markus Niebel03951412013-12-16 13:40:46 +01001697int mmc_set_dsr(struct mmc *mmc, u16 val)
1698{
1699 mmc->dsr = val;
1700 return 0;
1701}
1702
Jeroen Hofstee47726302014-07-10 22:46:28 +02001703/* CPU-specific MMC initializations */
1704__weak int cpu_mmc_init(bd_t *bis)
Andy Flemingad347bb2008-10-30 16:41:01 -05001705{
1706 return -1;
1707}
1708
Jeroen Hofstee47726302014-07-10 22:46:28 +02001709/* board-specific MMC initializations. */
1710__weak int board_mmc_init(bd_t *bis)
1711{
1712 return -1;
1713}
Andy Flemingad347bb2008-10-30 16:41:01 -05001714
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001715#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1716
Andy Flemingad347bb2008-10-30 16:41:01 -05001717void print_mmc_devices(char separator)
1718{
1719 struct mmc *m;
1720 struct list_head *entry;
Przemyslaw Marczak7bc4e302015-02-20 12:29:27 +01001721 char *mmc_type;
Andy Flemingad347bb2008-10-30 16:41:01 -05001722
1723 list_for_each(entry, &mmc_devices) {
1724 m = list_entry(entry, struct mmc, link);
1725
Przemyslaw Marczak7bc4e302015-02-20 12:29:27 +01001726 if (m->has_init)
1727 mmc_type = IS_SD(m) ? "SD" : "eMMC";
1728 else
1729 mmc_type = NULL;
1730
Pantelis Antoniou2c850462014-03-11 19:34:20 +02001731 printf("%s: %d", m->cfg->name, m->block_dev.dev);
Przemyslaw Marczak7bc4e302015-02-20 12:29:27 +01001732 if (mmc_type)
1733 printf(" (%s)", mmc_type);
Andy Flemingad347bb2008-10-30 16:41:01 -05001734
Lubomir Popov456104e2014-11-11 12:25:42 +02001735 if (entry->next != &mmc_devices) {
1736 printf("%c", separator);
1737 if (separator != '\n')
1738 puts (" ");
1739 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001740 }
1741
1742 printf("\n");
1743}
1744
Paul Burton6a7c5ba2013-09-04 16:12:25 +01001745#else
1746void print_mmc_devices(char separator) { }
1747#endif
1748
Lei Wend430d7c2011-05-02 16:26:25 +00001749int get_mmc_num(void)
1750{
1751 return cur_dev_num;
1752}
1753
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001754void mmc_set_preinit(struct mmc *mmc, int preinit)
1755{
1756 mmc->preinit = preinit;
1757}
1758
1759static void do_preinit(void)
1760{
1761 struct mmc *m;
1762 struct list_head *entry;
1763
1764 list_for_each(entry, &mmc_devices) {
1765 m = list_entry(entry, struct mmc, link);
1766
Yangbo Lub124f8a2015-04-22 13:57:00 +08001767#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1768 mmc_set_preinit(m, 1);
1769#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001770 if (m->preinit)
1771 mmc_start_init(m);
1772 }
1773}
1774
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001775#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
1776static int mmc_probe(bd_t *bis)
1777{
1778 return 0;
1779}
1780#elif defined(CONFIG_DM_MMC)
1781static int mmc_probe(bd_t *bis)
1782{
Simon Glass547cb342015-12-29 05:22:49 -07001783 int ret, i;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001784 struct uclass *uc;
Simon Glass547cb342015-12-29 05:22:49 -07001785 struct udevice *dev;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001786
1787 ret = uclass_get(UCLASS_MMC, &uc);
1788 if (ret)
1789 return ret;
1790
Simon Glass547cb342015-12-29 05:22:49 -07001791 /*
1792 * Try to add them in sequence order. Really with driver model we
1793 * should allow holes, but the current MMC list does not allow that.
1794 * So if we request 0, 1, 3 we will get 0, 1, 2.
1795 */
1796 for (i = 0; ; i++) {
1797 ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev);
1798 if (ret == -ENODEV)
1799 break;
1800 }
1801 uclass_foreach_dev(dev, uc) {
1802 ret = device_probe(dev);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001803 if (ret)
Simon Glass547cb342015-12-29 05:22:49 -07001804 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001805 }
1806
1807 return 0;
1808}
1809#else
1810static int mmc_probe(bd_t *bis)
1811{
1812 if (board_mmc_init(bis) < 0)
1813 cpu_mmc_init(bis);
1814
1815 return 0;
1816}
1817#endif
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001818
Andy Flemingad347bb2008-10-30 16:41:01 -05001819int mmc_initialize(bd_t *bis)
1820{
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001821 static int initialized = 0;
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001822 int ret;
Daniel Kochmański13df57b2015-05-29 16:55:43 +02001823 if (initialized) /* Avoid initializing mmc multiple times */
1824 return 0;
1825 initialized = 1;
1826
Andy Flemingad347bb2008-10-30 16:41:01 -05001827 INIT_LIST_HEAD (&mmc_devices);
1828 cur_dev_num = 0;
1829
Sjoerd Simonsdf8aa522015-08-30 16:55:45 -06001830 ret = mmc_probe(bis);
1831 if (ret)
1832 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -05001833
Ying Zhang9ff70262013-08-16 15:16:11 +08001834#ifndef CONFIG_SPL_BUILD
Andy Flemingad347bb2008-10-30 16:41:01 -05001835 print_mmc_devices(',');
Ying Zhang9ff70262013-08-16 15:16:11 +08001836#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001837
Che-Liang Chiou4a2c7d72012-11-28 15:21:13 +00001838 do_preinit();
Andy Flemingad347bb2008-10-30 16:41:01 -05001839 return 0;
1840}
Amar1104e9b2013-04-27 11:42:58 +05301841
1842#ifdef CONFIG_SUPPORT_EMMC_BOOT
1843/*
1844 * This function changes the size of boot partition and the size of rpmb
1845 * partition present on EMMC devices.
1846 *
1847 * Input Parameters:
1848 * struct *mmc: pointer for the mmc device strcuture
1849 * bootsize: size of boot partition
1850 * rpmbsize: size of rpmb partition
1851 *
1852 * Returns 0 on success.
1853 */
1854
1855int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
1856 unsigned long rpmbsize)
1857{
1858 int err;
1859 struct mmc_cmd cmd;
1860
1861 /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
1862 cmd.cmdidx = MMC_CMD_RES_MAN;
1863 cmd.resp_type = MMC_RSP_R1b;
1864 cmd.cmdarg = MMC_CMD62_ARG1;
1865
1866 err = mmc_send_cmd(mmc, &cmd, NULL);
1867 if (err) {
1868 debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
1869 return err;
1870 }
1871
1872 /* Boot partition changing mode */
1873 cmd.cmdidx = MMC_CMD_RES_MAN;
1874 cmd.resp_type = MMC_RSP_R1b;
1875 cmd.cmdarg = MMC_CMD62_ARG2;
1876
1877 err = mmc_send_cmd(mmc, &cmd, NULL);
1878 if (err) {
1879 debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
1880 return err;
1881 }
1882 /* boot partition size is multiple of 128KB */
1883 bootsize = (bootsize * 1024) / 128;
1884
1885 /* Arg: boot partition size */
1886 cmd.cmdidx = MMC_CMD_RES_MAN;
1887 cmd.resp_type = MMC_RSP_R1b;
1888 cmd.cmdarg = bootsize;
1889
1890 err = mmc_send_cmd(mmc, &cmd, NULL);
1891 if (err) {
1892 debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
1893 return err;
1894 }
1895 /* RPMB partition size is multiple of 128KB */
1896 rpmbsize = (rpmbsize * 1024) / 128;
1897 /* Arg: RPMB partition size */
1898 cmd.cmdidx = MMC_CMD_RES_MAN;
1899 cmd.resp_type = MMC_RSP_R1b;
1900 cmd.cmdarg = rpmbsize;
1901
1902 err = mmc_send_cmd(mmc, &cmd, NULL);
1903 if (err) {
1904 debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
1905 return err;
1906 }
1907 return 0;
1908}
1909
1910/*
Tom Rini4cf854c2014-02-05 10:24:22 -05001911 * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
1912 * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
1913 * and BOOT_MODE.
1914 *
1915 * Returns 0 on success.
1916 */
1917int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
1918{
1919 int err;
1920
1921 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
1922 EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
1923 EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
1924 EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
1925
1926 if (err)
1927 return err;
1928 return 0;
1929}
1930
1931/*
Tom Rinif8c6f792014-02-05 10:24:21 -05001932 * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
1933 * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
1934 * PARTITION_ACCESS.
1935 *
1936 * Returns 0 on success.
1937 */
1938int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
1939{
1940 int err;
1941
1942 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
1943 EXT_CSD_BOOT_ACK(ack) |
1944 EXT_CSD_BOOT_PART_NUM(part_num) |
1945 EXT_CSD_PARTITION_ACCESS(access));
1946
1947 if (err)
1948 return err;
1949 return 0;
1950}
Tom Rini35a3ea12014-02-07 14:15:20 -05001951
1952/*
1953 * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
1954 * for enable. Note that this is a write-once field for non-zero values.
1955 *
1956 * Returns 0 on success.
1957 */
1958int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
1959{
1960 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
1961 enable);
1962}
Amar1104e9b2013-04-27 11:42:58 +05301963#endif