blob: 8b2e6069ea012b6a6e419e1e42a807e647697089 [file] [log] [blame]
Andy Fleming272cc702008-10-30 16:41:01 -05001/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02007 * SPDX-License-Identifier: GPL-2.0+
Andy Fleming272cc702008-10-30 16:41:01 -05008 */
9
10#include <config.h>
11#include <common.h>
12#include <command.h>
Sjoerd Simons8e3332e2015-08-30 16:55:45 -060013#include <dm.h>
14#include <dm/device-internal.h>
Stephen Warrend4622df2014-05-23 12:47:06 -060015#include <errno.h>
Andy Fleming272cc702008-10-30 16:41:01 -050016#include <mmc.h>
17#include <part.h>
18#include <malloc.h>
Simon Glasscf92e052015-09-02 17:24:58 -060019#include <memalign.h>
Andy Fleming272cc702008-10-30 16:41:01 -050020#include <linux/list.h>
Rabin Vincent9b1f9422009-04-05 13:30:54 +053021#include <div64.h>
Paul Burtonda61fa52013-09-09 15:30:26 +010022#include "mmc_private.h"
Andy Fleming272cc702008-10-30 16:41:01 -050023
24static struct list_head mmc_devices;
25static int cur_dev_num = -1;
26
Jeroen Hofstee750121c2014-07-12 21:24:08 +020027__weak int board_mmc_getwp(struct mmc *mmc)
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000028{
29 return -1;
30}
31
32int mmc_getwp(struct mmc *mmc)
33{
34 int wp;
35
36 wp = board_mmc_getwp(mmc);
37
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000038 if (wp < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020039 if (mmc->cfg->ops->getwp)
40 wp = mmc->cfg->ops->getwp(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000041 else
42 wp = 0;
43 }
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000044
45 return wp;
46}
47
Jeroen Hofsteecee9ab72014-07-10 22:46:28 +020048__weak int board_mmc_getcd(struct mmc *mmc)
49{
Stefano Babic11fdade2010-02-05 15:04:43 +010050 return -1;
51}
52
Paul Burtonda61fa52013-09-09 15:30:26 +010053int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
Andy Fleming272cc702008-10-30 16:41:01 -050054{
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000055 int ret;
Marek Vasut8635ff92012-03-15 18:41:35 +000056
Marek Vasut8635ff92012-03-15 18:41:35 +000057#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000058 int i;
59 u8 *ptr;
60
61 printf("CMD_SEND:%d\n", cmd->cmdidx);
62 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
Pantelis Antoniou93bfd612014-03-11 19:34:20 +020063 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati5db2fe32011-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 Behme146bec72012-03-08 02:35:34 +000090 ptr = (u8 *)&cmd->response[i];
Raffaele Recalcati5db2fe32011-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 Recalcati5db2fe32011-03-11 02:01:14 +0000105#else
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200106 ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000107#endif
Marek Vasut8635ff92012-03-15 18:41:35 +0000108 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500109}
110
Paul Burtonda61fa52013-09-09 15:30:26 +0100111int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000112{
113 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000114 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-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 Vasutaaf3d412011-08-10 09:24:48 +0200121 if (!mmc_host_is_spi(mmc))
122 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000123
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500124 while (1) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000125 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-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 Burton56196822013-09-04 16:12:25 +0100132#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Jan Kloetzked617c422012-02-05 22:29:12 +0000133 printf("Status Error: 0x%08X\n",
134 cmd.response[0]);
Paul Burton56196822013-09-04 16:12:25 +0100135#endif
Jan Kloetzked617c422012-02-05 22:29:12 +0000136 return COMM_ERR;
137 }
138 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000139 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000140
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500141 if (timeout-- <= 0)
142 break;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000143
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500144 udelay(1000);
145 }
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000146
Raffaele Recalcati5db2fe32011-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 Heo5b0c9422012-06-03 21:32:13 +0000151 if (timeout <= 0) {
Paul Burton56196822013-09-04 16:12:25 +0100152#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000153 printf("Timeout waiting card ready\n");
Paul Burton56196822013-09-04 16:12:25 +0100154#endif
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000155 return TIMEOUT;
156 }
Andrew Gabbasov6b2221b2014-04-03 04:34:32 -0500157 if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
158 return SWITCH_ERR;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000159
160 return 0;
161}
162
Paul Burtonda61fa52013-09-09 15:30:26 +0100163int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500164{
165 struct mmc_cmd cmd;
166
Andrew Gabbasov786e8f82014-12-01 06:59:09 -0600167 if (mmc->ddr_mode)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900168 return 0;
169
Andy Fleming272cc702008-10-30 16:41:01 -0500170 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
171 cmd.resp_type = MMC_RSP_R1;
172 cmd.cmdarg = len;
Andy Fleming272cc702008-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
Simon Glassbcce53d2016-02-29 15:25:51 -0700185 if (m->block_dev.devnum == dev_num)
Andy Fleming272cc702008-10-30 16:41:01 -0500186 return m;
187 }
188
Paul Burton56196822013-09-04 16:12:25 +0100189#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -0500190 printf("MMC Device %d not found\n", dev_num);
Paul Burton56196822013-09-04 16:12:25 +0100191#endif
Andy Fleming272cc702008-10-30 16:41:01 -0500192
193 return NULL;
194}
195
Sascha Silbeff8fef52013-06-14 13:07:25 +0200196static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000197 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500198{
199 struct mmc_cmd cmd;
200 struct mmc_data data;
201
Alagu Sankar4a1a06b2010-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 Fleming272cc702008-10-30 16:41:01 -0500206
207 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700208 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500209 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700210 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500211
212 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500213
214 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700215 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500216 data.blocksize = mmc->read_bl_len;
217 data.flags = MMC_DATA_READ;
218
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700219 if (mmc_send_cmd(mmc, &cmd, &data))
220 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500221
Alagu Sankar4a1a06b2010-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 Sankar4a1a06b2010-10-25 07:23:56 -0700226 if (mmc_send_cmd(mmc, &cmd, NULL)) {
Paul Burton56196822013-09-04 16:12:25 +0100227#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700228 printf("mmc fail to send stop cmd\n");
Paul Burton56196822013-09-04 16:12:25 +0100229#endif
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700230 return 0;
231 }
Andy Fleming272cc702008-10-30 16:41:01 -0500232 }
233
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700234 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500235}
236
Simon Glass4101f682016-02-29 15:25:34 -0700237static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
Stephen Warren7c4213f2015-12-07 11:38:48 -0700238 lbaint_t blkcnt, void *dst)
Andy Fleming272cc702008-10-30 16:41:01 -0500239{
Simon Glassbcce53d2016-02-29 15:25:51 -0700240 int dev_num = block_dev->devnum;
Stephen Warren873cc1d2015-12-07 11:38:49 -0700241 int err;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700242 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500243
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700244 if (blkcnt == 0)
245 return 0;
246
247 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500248 if (!mmc)
249 return 0;
250
Stephen Warren873cc1d2015-12-07 11:38:49 -0700251 err = mmc_select_hwpart(dev_num, block_dev->hwpart);
252 if (err < 0)
253 return 0;
254
Lei Wend2bf29e2010-09-13 22:07:27 +0800255 if ((start + blkcnt) > mmc->block_dev.lba) {
Paul Burton56196822013-09-04 16:12:25 +0100256#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Sascha Silbeff8fef52013-06-14 13:07:25 +0200257 printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800258 start + blkcnt, mmc->block_dev.lba);
Paul Burton56196822013-09-04 16:12:25 +0100259#endif
Lei Wend2bf29e2010-09-13 22:07:27 +0800260 return 0;
261 }
Andy Fleming272cc702008-10-30 16:41:01 -0500262
Simon Glass11692992015-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 Fleming272cc702008-10-30 16:41:01 -0500265 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600266 }
Andy Fleming272cc702008-10-30 16:41:01 -0500267
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700268 do {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200269 cur = (blocks_todo > mmc->cfg->b_max) ?
270 mmc->cfg->b_max : blocks_todo;
Simon Glass11692992015-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 Sankar4a1a06b2010-10-25 07:23:56 -0700273 return 0;
Simon Glass11692992015-06-23 15:38:50 -0600274 }
Alagu Sankar4a1a06b2010-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 Fleming272cc702008-10-30 16:41:01 -0500279
280 return blkcnt;
281}
282
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000283static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-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 Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +0000304static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500305{
306 int timeout = 1000;
307 int err;
308 struct mmc_cmd cmd;
309
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500310 while (1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500311 cmd.cmdidx = MMC_CMD_APP_CMD;
312 cmd.resp_type = MMC_RSP_R1;
313 cmd.cmdarg = 0;
Andy Fleming272cc702008-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 Babic250de122010-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 Choud52ebf12010-12-24 13:12:21 +0000330 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200331 (mmc->cfg->voltages & 0xff8000);
Andy Fleming272cc702008-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 Gabbasov1677eef2015-03-19 07:44:06 -0500341 if (cmd.response[0] & OCR_BUSY)
342 break;
Andy Fleming272cc702008-10-30 16:41:01 -0500343
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500344 if (timeout-- <= 0)
345 return UNUSABLE_ERR;
346
347 udelay(1000);
348 }
Andy Fleming272cc702008-10-30 16:41:01 -0500349
350 if (mmc->version != SD_VERSION_2)
351 mmc->version = SD_VERSION_1_0;
352
Thomas Choud52ebf12010-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 Choud52ebf12010-12-24 13:12:21 +0000357
358 err = mmc_send_cmd(mmc, &cmd, NULL);
359
360 if (err)
361 return err;
362 }
363
Rabin Vincent998be3d2009-04-05 13:30:56 +0530364 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-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 Gabbasov5289b532015-03-19 07:44:04 -0500372static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500373{
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500374 struct mmc_cmd cmd;
Andy Fleming272cc702008-10-30 16:41:01 -0500375 int err;
376
Andrew Gabbasov5289b532015-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 Herring5a203972015-03-23 17:56:59 -0500380 if (use_arg && !mmc_host_is_spi(mmc))
381 cmd.cmdarg = OCR_HCS |
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200382 (mmc->cfg->voltages &
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500383 (mmc->ocr & OCR_VOLTAGE_MASK)) |
384 (mmc->ocr & OCR_ACCESS_MODE);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000385
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500386 err = mmc_send_cmd(mmc, &cmd, NULL);
Che-Liang Chioue9550442012-11-28 15:21:13 +0000387 if (err)
388 return err;
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500389 mmc->ocr = cmd.response[0];
Che-Liang Chioue9550442012-11-28 15:21:13 +0000390 return 0;
391}
392
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200393static int mmc_send_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000394{
Che-Liang Chioue9550442012-11-28 15:21:13 +0000395 int err, i;
396
Andy Fleming272cc702008-10-30 16:41:01 -0500397 /* Some cards seem to need this */
398 mmc_go_idle(mmc);
399
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000400 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000401 for (i = 0; i < 2; i++) {
Andrew Gabbasov5289b532015-03-19 07:44:04 -0500402 err = mmc_send_op_cond_iter(mmc, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500403 if (err)
404 return err;
405
Che-Liang Chioue9550442012-11-28 15:21:13 +0000406 /* exit if not busy (flag seems to be inverted) */
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500407 if (mmc->ocr & OCR_BUSY)
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500408 break;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000409 }
Andrew Gabbasovbd47c132015-03-19 07:44:07 -0500410 mmc->op_cond_pending = 1;
411 return 0;
Che-Liang Chioue9550442012-11-28 15:21:13 +0000412}
Andy Fleming272cc702008-10-30 16:41:01 -0500413
Jeroen Hofstee750121c2014-07-12 21:24:08 +0200414static int mmc_complete_op_cond(struct mmc *mmc)
Che-Liang Chioue9550442012-11-28 15:21:13 +0000415{
416 struct mmc_cmd cmd;
417 int timeout = 1000;
418 uint start;
419 int err;
420
421 mmc->op_cond_pending = 0;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500422 if (!(mmc->ocr & OCR_BUSY)) {
423 start = get_timer(0);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500424 while (1) {
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500425 err = mmc_send_op_cond_iter(mmc, 1);
426 if (err)
427 return err;
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500428 if (mmc->ocr & OCR_BUSY)
429 break;
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500430 if (get_timer(start) > timeout)
431 return UNUSABLE_ERR;
432 udelay(100);
Andrew Gabbasov1677eef2015-03-19 07:44:06 -0500433 }
Andrew Gabbasovcc17c012015-03-19 07:44:05 -0500434 }
Andy Fleming272cc702008-10-30 16:41:01 -0500435
Thomas Choud52ebf12010-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 Choud52ebf12010-12-24 13:12:21 +0000440
441 err = mmc_send_cmd(mmc, &cmd, NULL);
442
443 if (err)
444 return err;
Andrew Gabbasova626c8d2015-03-19 07:44:03 -0500445
446 mmc->ocr = cmd.response[0];
Thomas Choud52ebf12010-12-24 13:12:21 +0000447 }
448
Andy Fleming272cc702008-10-30 16:41:01 -0500449 mmc->version = MMC_VERSION_UNKNOWN;
Andy Fleming272cc702008-10-30 16:41:01 -0500450
451 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
Stephen Warrendef816a2014-01-30 16:11:12 -0700452 mmc->rca = 1;
Andy Fleming272cc702008-10-30 16:41:01 -0500453
454 return 0;
455}
456
457
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000458static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-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 Fleming272cc702008-10-30 16:41:01 -0500468
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000469 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500470 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000471 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +0000480static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500481{
482 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000483 int timeout = 1000;
484 int ret;
Andy Fleming272cc702008-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 Recalcati5d4fc8d2011-03-11 02:01:12 +0000489 (index << 16) |
490 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500491
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000492 ret = mmc_send_cmd(mmc, &cmd, NULL);
493
494 /* Waiting for the ready status */
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000495 if (!ret)
496 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000497
498 return ret;
499
Andy Fleming272cc702008-10-30 16:41:01 -0500500}
501
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000502static int mmc_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500503{
Simon Glass8bfa1952013-04-03 08:54:30 +0000504 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Fleming272cc702008-10-30 16:41:01 -0500505 char cardtype;
506 int err;
507
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600508 mmc->card_caps = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500509
Thomas Choud52ebf12010-12-24 13:12:21 +0000510 if (mmc_host_is_spi(mmc))
511 return 0;
512
Andy Fleming272cc702008-10-30 16:41:01 -0500513 /* Only version 4 supports high-speed */
514 if (mmc->version < MMC_VERSION_4)
515 return 0;
516
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -0600517 mmc->card_caps |= MMC_MODE_4BIT | MMC_MODE_8BIT;
518
Andy Fleming272cc702008-10-30 16:41:01 -0500519 err = mmc_send_ext_csd(mmc, ext_csd);
520
521 if (err)
522 return err;
523
Lei Wen0560db12011-10-03 20:35:10 +0000524 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-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 Gabbasov6b2221b2014-04-03 04:34:32 -0500529 return err == SWITCH_ERR ? 0 : err;
Andy Fleming272cc702008-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 Wen0560db12011-10-03 20:35:10 +0000538 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Fleming272cc702008-10-30 16:41:01 -0500539 return 0;
540
541 /* High Speed is set, there are two types: 52MHz and 26MHz */
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900542 if (cardtype & EXT_CSD_CARD_TYPE_52) {
Andrew Gabbasov201d5ac2014-12-01 06:59:10 -0600543 if (cardtype & EXT_CSD_CARD_TYPE_DDR_1_8V)
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900544 mmc->card_caps |= MMC_MODE_DDR_52MHz;
Andy Fleming272cc702008-10-30 16:41:01 -0500545 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900546 } else {
Andy Fleming272cc702008-10-30 16:41:01 -0500547 mmc->card_caps |= MMC_MODE_HS;
Jaehoon Chungd22e3d42014-05-16 13:59:54 +0900548 }
Andy Fleming272cc702008-10-30 16:41:01 -0500549
550 return 0;
551}
552
Stephen Warrenf866a462013-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 Warrend2356282014-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 Warrend4622df2014-05-23 12:47:06 -0600587 return -ENODEV;
Stephen Warrend2356282014-05-07 12:19:02 -0600588
Stephen Warren873cc1d2015-12-07 11:38:49 -0700589 if (mmc->block_dev.hwpart == hwpart)
Stephen Warrend2356282014-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 Warrend4622df2014-05-23 12:47:06 -0600594 return -EMEDIUMTYPE;
Stephen Warrend2356282014-05-07 12:19:02 -0600595 }
596
597 ret = mmc_switch_part(dev_num, hwpart);
598 if (ret)
Stephen Warrend4622df2014-05-23 12:47:06 -0600599 return ret;
Stephen Warrend2356282014-05-07 12:19:02 -0600600
Stephen Warrend2356282014-05-07 12:19:02 -0600601 return 0;
602}
603
604
Lei Wenbc897b12011-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 Warrenf866a462013-06-11 15:14:01 -0600608 int ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000609
610 if (!mmc)
611 return -1;
612
Stephen Warrenf866a462013-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));
Stephen Warrenf866a462013-06-11 15:14:01 -0600616
Peter Bigot6dc93e72014-09-02 18:31:23 -0500617 /*
618 * Set the capacity if the switch succeeded or was intended
619 * to return to representing the raw device.
620 */
Stephen Warren873cc1d2015-12-07 11:38:49 -0700621 if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {
Peter Bigot6dc93e72014-09-02 18:31:23 -0500622 ret = mmc_set_capacity(mmc, part_num);
Stephen Warren873cc1d2015-12-07 11:38:49 -0700623 mmc->block_dev.hwpart = part_num;
624 }
Peter Bigot6dc93e72014-09-02 18:31:23 -0500625
626 return ret;
Lei Wenbc897b12011-05-02 16:26:26 +0000627}
628
Diego Santa Cruzac9da0e2014-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 Cruz8dda5b0e2014-12-23 10:50:31 +0100639 u8 wr_rel_set;
Diego Santa Cruzac9da0e2014-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 Cruz8dda5b0e2014-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 Cruzac9da0e2014-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 Cruz8dda5b0e2014-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 Cruzac9da0e2014-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 Reding48972d92012-01-02 01:15:37 +0000823int mmc_getcd(struct mmc *mmc)
824{
825 int cd;
826
827 cd = board_mmc_getcd(mmc);
828
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000829 if (cd < 0) {
Pantelis Antoniou93bfd612014-03-11 19:34:20 +0200830 if (mmc->cfg->ops->getcd)
831 cd = mmc->cfg->ops->getcd(mmc);
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000832 else
833 cd = 1;
834 }
Thierry Reding48972d92012-01-02 01:15:37 +0000835
836 return cd;
837}
838
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000839static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-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 Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +0000860static int sd_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500861{
862 int err;
863 struct mmc_cmd cmd;
Anton staaff781dd32011-10-03 13:54:59 +0000864 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
865 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500866 struct mmc_data data;
867 int timeout;
868
869 mmc->card_caps = 0;
870
Thomas Choud52ebf12010-12-24 13:12:21 +0000871 if (mmc_host_is_spi(mmc))
872 return 0;
873
Andy Fleming272cc702008-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 Fleming272cc702008-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 Fleming272cc702008-10-30 16:41:01 -0500887
888 timeout = 3;
889
890retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000891 data.dest = (char *)scr;
Andy Fleming272cc702008-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 Kharuzhy4e3d89b2009-05-07 00:43:30 +0300905 mmc->scr[0] = __be32_to_cpu(scr[0]);
906 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-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 Chung1741c642013-01-29 22:58:16 +0000917 if ((mmc->scr[0] >> 15) & 0x1)
918 mmc->version = SD_VERSION_3;
Andy Fleming272cc702008-10-30 16:41:01 -0500919 break;
920 default:
921 mmc->version = SD_VERSION_1_0;
922 break;
923 }
924
Alagu Sankarb44c7082010-05-12 15:08:24 +0530925 if (mmc->scr[0] & SD_DATA_4BIT)
926 mmc->card_caps |= MMC_MODE_4BIT;
927
Andy Fleming272cc702008-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 staaff781dd32011-10-03 13:54:59 +0000935 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500936
937 if (err)
938 return err;
939
940 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300941 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500942 break;
943 }
944
Andy Fleming272cc702008-10-30 16:41:01 -0500945 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300946 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500947 return 0;
948
Macpaul Lin2c3fbf42011-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 Antoniou93bfd612014-03-11 19:34:20 +0200955 if (!((mmc->cfg->host_caps & MMC_MODE_HS_52MHz) &&
956 (mmc->cfg->host_caps & MMC_MODE_HS)))
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000957 return 0;
958
Anton staaff781dd32011-10-03 13:54:59 +0000959 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500960
961 if (err)
962 return err;
963
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300964 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-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 Frysinger5f837c22010-10-20 01:15:53 +0000972static const int fbase[] = {
Andy Fleming272cc702008-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 Frysinger5f837c22010-10-20 01:15:53 +0000982static const int multipliers[] = {
Andy Fleming272cc702008-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 Phillipsfdbb8732012-10-29 13:34:43 +00001001static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001002{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001003 if (mmc->cfg->ops->set_ios)
1004 mmc->cfg->ops->set_ios(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001005}
1006
1007void mmc_set_clock(struct mmc *mmc, uint clock)
1008{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001009 if (clock > mmc->cfg->f_max)
1010 clock = mmc->cfg->f_max;
Andy Fleming272cc702008-10-30 16:41:01 -05001011
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001012 if (clock < mmc->cfg->f_min)
1013 clock = mmc->cfg->f_min;
Andy Fleming272cc702008-10-30 16:41:01 -05001014
1015 mmc->clock = clock;
1016
1017 mmc_set_ios(mmc);
1018}
1019
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001020static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -05001021{
1022 mmc->bus_width = width;
1023
1024 mmc_set_ios(mmc);
1025}
1026
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001027static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001028{
Stephen Warrenf866a462013-06-11 15:14:01 -06001029 int err, i;
Andy Fleming272cc702008-10-30 16:41:01 -05001030 uint mult, freq;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001031 u64 cmult, csize, capacity;
Andy Fleming272cc702008-10-30 16:41:01 -05001032 struct mmc_cmd cmd;
Simon Glass8bfa1952013-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 Recalcati5d4fc8d2011-03-11 02:01:12 +00001035 int timeout = 1000;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001036 bool has_parts = false;
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001037 bool part_completed;
Andy Fleming272cc702008-10-30 16:41:01 -05001038
Thomas Choud52ebf12010-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 Choud52ebf12010-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 Fleming272cc702008-10-30 16:41:01 -05001051 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-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 Fleming272cc702008-10-30 16:41:01 -05001054 cmd.resp_type = MMC_RSP_R2;
1055 cmd.cmdarg = 0;
Andy Fleming272cc702008-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 Choud52ebf12010-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 Fleming272cc702008-10-30 16:41:01 -05001073
Thomas Choud52ebf12010-12-24 13:12:21 +00001074 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001075
Thomas Choud52ebf12010-12-24 13:12:21 +00001076 if (err)
1077 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001078
Thomas Choud52ebf12010-12-24 13:12:21 +00001079 if (IS_SD(mmc))
1080 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1081 }
Andy Fleming272cc702008-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 Fleming272cc702008-10-30 16:41:01 -05001087
1088 err = mmc_send_cmd(mmc, &cmd, NULL);
1089
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +00001090 /* Waiting for the ready status */
1091 mmc_send_status(mmc, timeout);
1092
Andy Fleming272cc702008-10-30 16:41:01 -05001093 if (err)
1094 return err;
1095
Rabin Vincent998be3d2009-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 Fleming272cc702008-10-30 16:41:01 -05001100
1101 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301102 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-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 Vincent0b453ff2009-04-05 13:30:55 +05301127 freq = fbase[(cmd.response[0] & 0x7)];
1128 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -05001129
1130 mmc->tran_speed = freq * mult;
1131
Markus Niebelab711882013-12-16 13:40:46 +01001132 mmc->dsr_imp = ((cmd.response[1] >> 12) & 0x1);
Rabin Vincent998be3d2009-04-05 13:30:56 +05301133 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001134
1135 if (IS_SD(mmc))
1136 mmc->write_bl_len = mmc->read_bl_len;
1137 else
Rabin Vincent998be3d2009-04-05 13:30:56 +05301138 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-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 Warrenf866a462013-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 Fleming272cc702008-10-30 16:41:01 -05001156
Simon Glass8bfa1952013-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 Fleming272cc702008-10-30 16:41:01 -05001159
Simon Glass8bfa1952013-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 Fleming272cc702008-10-30 16:41:01 -05001162
Markus Niebelab711882013-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 Fleming272cc702008-10-30 16:41:01 -05001171 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-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 Bhargavfe8f7062011-10-05 03:13:23 +00001174 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001175 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001176 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001177
Thomas Choud52ebf12010-12-24 13:12:21 +00001178 if (err)
1179 return err;
1180 }
Andy Fleming272cc702008-10-30 16:41:01 -05001181
Lei Wene6f99a52011-06-22 17:03:31 +00001182 /*
1183 * For SD, its erase group is always one sector
1184 */
1185 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001186 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghoraid23e2c02010-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 Cruz9cf199e2014-12-23 10:50:28 +01001190 if (err)
1191 return err;
1192 if (ext_csd[EXT_CSD_REV] >= 2) {
Yoshihiro Shimoda639b7822011-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 Wen0560db12011-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 Glass8bfa1952013-04-03 08:54:30 +00001202 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewskib1f1e8212011-07-05 02:19:44 +00001203 if ((capacity >> 20) > 2 * 1024)
Stephen Warrenf866a462013-06-11 15:14:01 -06001204 mmc->capacity_user = capacity;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301205 }
Lei Wenbc897b12011-05-02 16:26:26 +00001206
Jaehoon Chung64f4a612013-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 Niebeledab7232014-11-18 15:13:53 +01001223 case 7:
1224 mmc->version = MMC_VERSION_5_0;
1225 break;
Jaehoon Chung64f4a612013-01-29 19:31:16 +00001226 }
1227
Diego Santa Cruz8a0cf492014-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 Cruz0c453bb2014-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 Cruz8a0cf492014-12-23 10:50:27 +01001241 if (part_completed &&
1242 (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
Diego Santa Cruz0c453bb2014-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 Cruz8a0cf492014-12-23 10:50:27 +01001251 uint mult = (ext_csd[idx + 2] << 16) +
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001252 (ext_csd[idx + 1] << 8) + ext_csd[idx];
Diego Santa Cruz8a0cf492014-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 Cruz0c453bb2014-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 Cruzf8e89d62014-12-23 10:50:21 +01001261 mmc->capacity_gp[i] <<= 19;
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001262 }
1263
Diego Santa Cruz8a0cf492014-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 Cruza7f852b2014-12-23 10:50:22 +01001280
Lei Wene6f99a52011-06-22 17:03:31 +00001281 /*
Oliver Metz1937e5a2013-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 Wene6f99a52011-06-22 17:03:31 +00001285 */
Diego Santa Cruz8a0cf492014-12-23 10:50:27 +01001286 if (part_completed)
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001287 has_parts = true;
Oliver Metz1937e5a2013-10-01 20:32:07 +02001288 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
Diego Santa Cruz0c453bb2014-12-23 10:50:20 +01001289 (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
1290 has_parts = true;
1291 if (has_parts) {
Oliver Metz1937e5a2013-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 Petermaier021a8052014-08-08 09:47:22 +02001297 else
1298 ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001299 }
Oliver Metz1937e5a2013-10-01 20:32:07 +02001300
Diego Santa Cruz037dc0a2014-12-23 10:50:25 +01001301 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001302 /* Read out group size from ext_csd */
Lei Wen0560db12011-10-03 20:35:10 +00001303 mmc->erase_grp_size =
Diego Santa Cruza4ff9f82014-12-23 10:50:24 +01001304 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
Markus Niebeld7b29122014-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 Cruz8a0cf492014-12-23 10:50:27 +01001310 if (mmc->high_capacity && part_completed) {
Markus Niebeld7b29122014-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 Glass8bfa1952013-04-03 08:54:30 +00001318 } else {
Oliver Metz1937e5a2013-10-01 20:32:07 +02001319 /* Calculate the group size from the csd value. */
Lei Wene6f99a52011-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 Cruz037dc0a2014-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 Cruz9e41a002014-12-23 10:50:33 +01001330
1331 mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301332 }
1333
Stephen Warren873cc1d2015-12-07 11:38:49 -07001334 err = mmc_set_capacity(mmc, mmc->block_dev.hwpart);
Stephen Warrenf866a462013-06-11 15:14:01 -06001335 if (err)
1336 return err;
1337
Andy Fleming272cc702008-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 Antoniou93bfd612014-03-11 19:34:20 +02001347 mmc->card_caps &= mmc->cfg->host_caps;
Andy Fleming272cc702008-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 Fleming272cc702008-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 Fleming272cc702008-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 Chungad5fd922012-03-26 21:16:03 +00001370 mmc->tran_speed = 50000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001371 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001372 mmc->tran_speed = 25000000;
Andrew Gabbasovfc5b32f2014-12-25 10:22:25 -06001373 } else if (mmc->version >= MMC_VERSION_4) {
1374 /* Only version 4 of MMC supports wider bus widths */
Andy Fleming7798f6d2012-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 Chungd22e3d42014-05-16 13:59:54 +09001379 EXT_CSD_DDR_BUS_WIDTH_8,
1380 EXT_CSD_DDR_BUS_WIDTH_4,
Andy Fleming7798f6d2012-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 Gabbasov786e8f82014-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 Fleming7798f6d2012-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 Chungd22e3d42014-05-16 13:59:54 +09001398 8, 4, 8, 4, 1,
Andy Fleming7798f6d2012-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 Gabbasov786e8f82014-12-01 06:59:09 -06001403 unsigned int caps = ext_to_hostcaps[extw];
Andy Fleming7798f6d2012-10-31 19:02:38 +00001404
1405 /*
Andrew Gabbasovbf477072014-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 Gabbasov786e8f82014-12-01 06:59:09 -06001418 * Check to make sure the card and controller support
1419 * these capabilities
Andy Fleming7798f6d2012-10-31 19:02:38 +00001420 */
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001421 if ((mmc->card_caps & caps) != caps)
Andy Fleming7798f6d2012-10-31 19:02:38 +00001422 continue;
1423
Andy Fleming272cc702008-10-30 16:41:01 -05001424 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001425 EXT_CSD_BUS_WIDTH, extw);
Andy Fleming272cc702008-10-30 16:41:01 -05001426
1427 if (err)
Lei Wen41378942011-10-03 20:35:11 +00001428 continue;
Andy Fleming272cc702008-10-30 16:41:01 -05001429
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001430 mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
Andy Fleming7798f6d2012-10-31 19:02:38 +00001431 mmc_set_bus_width(mmc, widths[idx]);
Andy Fleming272cc702008-10-30 16:41:01 -05001432
Lei Wen41378942011-10-03 20:35:11 +00001433 err = mmc_send_ext_csd(mmc, test_csd);
Andy Fleming272cc702008-10-30 16:41:01 -05001434
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001435 if (err)
1436 continue;
1437
1438 /* 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 Wen41378942011-10-03 20:35:11 +00001449 break;
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001450 else
1451 err = SWITCH_ERR;
Andy Fleming272cc702008-10-30 16:41:01 -05001452 }
1453
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001454 if (err)
1455 return err;
1456
Andy Fleming272cc702008-10-30 16:41:01 -05001457 if (mmc->card_caps & MMC_MODE_HS) {
1458 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001459 mmc->tran_speed = 52000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001460 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001461 mmc->tran_speed = 26000000;
1462 }
Andy Fleming272cc702008-10-30 16:41:01 -05001463 }
1464
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001465 mmc_set_clock(mmc, mmc->tran_speed);
1466
Andrew Gabbasov5af8f452014-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 Fleming272cc702008-10-30 16:41:01 -05001473 /* fill in device description */
1474 mmc->block_dev.lun = 0;
Stephen Warren873cc1d2015-12-07 11:38:49 -07001475 mmc->block_dev.hwpart = 0;
Andy Fleming272cc702008-10-30 16:41:01 -05001476 mmc->block_dev.type = 0;
1477 mmc->block_dev.blksz = mmc->read_bl_len;
Egbert Eich0472fbf2013-04-09 21:11:56 +00001478 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
Rabin Vincent9b1f9422009-04-05 13:30:54 +05301479 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Sjoerd Simonsfc011f62015-12-04 23:27:40 +01001480#if !defined(CONFIG_SPL_BUILD) || \
1481 (defined(CONFIG_SPL_LIBCOMMON_SUPPORT) && \
1482 !defined(CONFIG_USE_TINY_PRINTF))
Taylor Huttbabce5f2012-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 Burton56196822013-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 Kshevetskiy122efd42012-07-09 08:53:38 +00001497#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Simon Glass3e8bd462016-02-29 15:25:48 -07001498 part_init(&mmc->block_dev);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001499#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001500
1501 return 0;
1502}
1503
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001504static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-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 Antoniou93bfd612014-03-11 19:34:20 +02001511 cmd.cmdarg = ((mmc->cfg->voltages & 0xff8000) != 0) << 8 | 0xaa;
Andy Fleming272cc702008-10-30 16:41:01 -05001512 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001513
1514 err = mmc_send_cmd(mmc, &cmd, NULL);
1515
1516 if (err)
1517 return err;
1518
Rabin Vincent998be3d2009-04-05 13:30:56 +05301519 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -05001520 return UNUSABLE_ERR;
1521 else
1522 mmc->version = SD_VERSION_2;
1523
1524 return 0;
1525}
1526
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001527/* not used any more */
1528int __deprecated mmc_register(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001529{
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001530#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)
1537{
1538 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 Niebelab711882013-12-16 13:40:46 +01001554 /* Setup dsr related values */
1555 mmc->dsr_imp = 0;
1556 mmc->dsr = 0xffffffff;
Andy Fleming272cc702008-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;
Simon Glassbcce53d2016-02-29 15:25:51 -07001559 mmc->block_dev.devnum = cur_dev_num++;
Andy Fleming272cc702008-10-30 16:41:01 -05001560 mmc->block_dev.removable = 1;
1561 mmc->block_dev.block_read = mmc_bread;
1562 mmc->block_dev.block_write = mmc_bwrite;
Lei Wene6f99a52011-06-22 17:03:31 +00001563 mmc->block_dev.block_erase = mmc_berase;
Andy Fleming272cc702008-10-30 16:41:01 -05001564
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001565 /* setup initial part type */
1566 mmc->block_dev.part_type = mmc->cfg->part_type;
Andy Fleming272cc702008-10-30 16:41:01 -05001567
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001568 INIT_LIST_HEAD(&mmc->link);
Andy Fleming272cc702008-10-30 16:41:01 -05001569
Pantelis Antoniou93bfd612014-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 Fleming272cc702008-10-30 16:41:01 -05001579}
1580
Matthew McClintockdf3fc522011-05-24 05:31:19 +00001581#ifdef CONFIG_PARTITIONS
Simon Glass4101f682016-02-29 15:25:34 -07001582struct blk_desc *mmc_get_dev(int dev)
Andy Fleming272cc702008-10-30 16:41:01 -05001583{
1584 struct mmc *mmc = find_mmc_device(dev);
Benoît Thébaudeau6bb4b4b2012-08-10 08:59:12 +00001585 if (!mmc || mmc_init(mmc))
Łukasz Majewski40242bc2012-04-19 02:39:18 +00001586 return NULL;
Andy Fleming272cc702008-10-30 16:41:01 -05001587
Łukasz Majewski40242bc2012-04-19 02:39:18 +00001588 return &mmc->block_dev;
Andy Fleming272cc702008-10-30 16:41:01 -05001589}
Matthew McClintockdf3fc522011-05-24 05:31:19 +00001590#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001591
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001592/* board-specific MMC power initializations. */
1593__weak void board_mmc_power_init(void)
1594{
1595}
1596
Che-Liang Chioue9550442012-11-28 15:21:13 +00001597int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001598{
Macpaul Linafd59322011-11-14 23:35:39 +00001599 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001600
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001601 /* we pretend there's no card when init is NULL */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001602 if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
Thierry Reding48972d92012-01-02 01:15:37 +00001603 mmc->has_init = 0;
Paul Burton56196822013-09-04 16:12:25 +01001604#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Thierry Reding48972d92012-01-02 01:15:37 +00001605 printf("MMC: no card present\n");
Paul Burton56196822013-09-04 16:12:25 +01001606#endif
Thierry Reding48972d92012-01-02 01:15:37 +00001607 return NO_CARD_ERR;
1608 }
1609
Lei Wenbc897b12011-05-02 16:26:26 +00001610 if (mmc->has_init)
1611 return 0;
1612
Yangbo Lu5a8dbdc2015-04-22 13:57:00 +08001613#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1614 mmc_adapter_card_type_ident();
1615#endif
Paul Kocialkowski95de9ab2014-11-08 20:55:45 +01001616 board_mmc_power_init();
1617
Pantelis Antoniouab769f22014-02-26 19:28:45 +02001618 /* made sure it's not NULL earlier */
Pantelis Antoniou93bfd612014-03-11 19:34:20 +02001619 err = mmc->cfg->ops->init(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001620
1621 if (err)
1622 return err;
1623
Andrew Gabbasov786e8f82014-12-01 06:59:09 -06001624 mmc->ddr_mode = 0;
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001625 mmc_set_bus_width(mmc, 1);
1626 mmc_set_clock(mmc, 1);
1627
Andy Fleming272cc702008-10-30 16:41:01 -05001628 /* Reset the Card */
1629 err = mmc_go_idle(mmc);
1630
1631 if (err)
1632 return err;
1633
Lei Wenbc897b12011-05-02 16:26:26 +00001634 /* The internal partition reset to user partition(0) at every CMD0*/
Stephen Warren873cc1d2015-12-07 11:38:49 -07001635 mmc->block_dev.hwpart = 0;
Lei Wenbc897b12011-05-02 16:26:26 +00001636
Andy Fleming272cc702008-10-30 16:41:01 -05001637 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001638 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001639
Andy Fleming272cc702008-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 Gabbasovbd47c132015-03-19 07:44:07 -05001647 if (err) {
Paul Burton56196822013-09-04 16:12:25 +01001648#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001649 printf("Card did not respond to voltage select!\n");
Paul Burton56196822013-09-04 16:12:25 +01001650#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001651 return UNUSABLE_ERR;
1652 }
1653 }
1654
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001655 if (!err)
Che-Liang Chioue9550442012-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 Gabbasovbd47c132015-03-19 07:44:07 -05001665 mmc->init_in_progress = 0;
Che-Liang Chioue9550442012-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 Wenbc897b12011-05-02 16:26:26 +00001671 if (err)
1672 mmc->has_init = 0;
1673 else
1674 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001675 return err;
1676}
1677
1678int mmc_init(struct mmc *mmc)
1679{
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001680 int err = 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001681 unsigned start;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001682
1683 if (mmc->has_init)
1684 return 0;
Mateusz Zalegad803fea2014-04-29 20:15:30 +02001685
1686 start = get_timer(0);
1687
Che-Liang Chioue9550442012-11-28 15:21:13 +00001688 if (!mmc->init_in_progress)
1689 err = mmc_start_init(mmc);
1690
Andrew Gabbasovbd47c132015-03-19 07:44:07 -05001691 if (!err)
Che-Liang Chioue9550442012-11-28 15:21:13 +00001692 err = mmc_complete_init(mmc);
1693 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
Lei Wenbc897b12011-05-02 16:26:26 +00001694 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001695}
1696
Markus Niebelab711882013-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 Hofsteecee9ab72014-07-10 22:46:28 +02001703/* CPU-specific MMC initializations */
1704__weak int cpu_mmc_init(bd_t *bis)
Andy Fleming272cc702008-10-30 16:41:01 -05001705{
1706 return -1;
1707}
1708
Jeroen Hofsteecee9ab72014-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 Fleming272cc702008-10-30 16:41:01 -05001714
Paul Burton56196822013-09-04 16:12:25 +01001715#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
1716
Andy Fleming272cc702008-10-30 16:41:01 -05001717void print_mmc_devices(char separator)
1718{
1719 struct mmc *m;
1720 struct list_head *entry;
Przemyslaw Marczak34dd9282015-02-20 12:29:27 +01001721 char *mmc_type;
Andy Fleming272cc702008-10-30 16:41:01 -05001722
1723 list_for_each(entry, &mmc_devices) {
1724 m = list_entry(entry, struct mmc, link);
1725
Przemyslaw Marczak34dd9282015-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
Simon Glassbcce53d2016-02-29 15:25:51 -07001731 printf("%s: %d", m->cfg->name, m->block_dev.devnum);
Przemyslaw Marczak34dd9282015-02-20 12:29:27 +01001732 if (mmc_type)
1733 printf(" (%s)", mmc_type);
Andy Fleming272cc702008-10-30 16:41:01 -05001734
Lubomir Popove75eaf12014-11-11 12:25:42 +02001735 if (entry->next != &mmc_devices) {
1736 printf("%c", separator);
1737 if (separator != '\n')
1738 puts (" ");
1739 }
Andy Fleming272cc702008-10-30 16:41:01 -05001740 }
1741
1742 printf("\n");
1743}
1744
Paul Burton56196822013-09-04 16:12:25 +01001745#else
1746void print_mmc_devices(char separator) { }
1747#endif
1748
Lei Wenea6ebe22011-05-02 16:26:25 +00001749int get_mmc_num(void)
1750{
1751 return cur_dev_num;
1752}
1753
Che-Liang Chioue9550442012-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 Lu5a8dbdc2015-04-22 13:57:00 +08001767#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
1768 mmc_set_preinit(m, 1);
1769#endif
Che-Liang Chioue9550442012-11-28 15:21:13 +00001770 if (m->preinit)
1771 mmc_start_init(m);
1772 }
1773}
1774
Sjoerd Simons8e3332e2015-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 Glass4a1db6d2015-12-29 05:22:49 -07001783 int ret, i;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001784 struct uclass *uc;
Simon Glass4a1db6d2015-12-29 05:22:49 -07001785 struct udevice *dev;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001786
1787 ret = uclass_get(UCLASS_MMC, &uc);
1788 if (ret)
1789 return ret;
1790
Simon Glass4a1db6d2015-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 Simons8e3332e2015-08-30 16:55:45 -06001803 if (ret)
Simon Glass4a1db6d2015-12-29 05:22:49 -07001804 printf("%s - probe failed: %d\n", dev->name, ret);
Sjoerd Simons8e3332e2015-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 Chioue9550442012-11-28 15:21:13 +00001818
Andy Fleming272cc702008-10-30 16:41:01 -05001819int mmc_initialize(bd_t *bis)
1820{
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001821 static int initialized = 0;
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001822 int ret;
Daniel Kochmański1b26bab2015-05-29 16:55:43 +02001823 if (initialized) /* Avoid initializing mmc multiple times */
1824 return 0;
1825 initialized = 1;
1826
Andy Fleming272cc702008-10-30 16:41:01 -05001827 INIT_LIST_HEAD (&mmc_devices);
1828 cur_dev_num = 0;
1829
Sjoerd Simons8e3332e2015-08-30 16:55:45 -06001830 ret = mmc_probe(bis);
1831 if (ret)
1832 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -05001833
Ying Zhangbb0dc102013-08-16 15:16:11 +08001834#ifndef CONFIG_SPL_BUILD
Andy Fleming272cc702008-10-30 16:41:01 -05001835 print_mmc_devices(',');
Ying Zhangbb0dc102013-08-16 15:16:11 +08001836#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001837
Che-Liang Chioue9550442012-11-28 15:21:13 +00001838 do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05001839 return 0;
1840}
Amar3690d6d2013-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 Rini5a99b9d2014-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 Rini792970b2014-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 Rini33ace362014-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}
Amar3690d6d2013-04-27 11:42:58 +05301963#endif