blob: fe83934b92c7f93eedc94eed3abecea332cfc172 [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 *
7 * See file CREDITS for list of people who contributed to this
8 * project.
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 * MA 02111-1307 USA
24 */
25
26#include <config.h>
27#include <common.h>
28#include <command.h>
29#include <mmc.h>
30#include <part.h>
31#include <malloc.h>
32#include <linux/list.h>
Rabin Vincent9b1f9422009-04-05 13:30:54 +053033#include <div64.h>
Andy Fleming272cc702008-10-30 16:41:01 -050034
Matt Waddelce0fbcd2011-02-24 16:35:23 +000035/* Set block count limit because of 16 bit register limit on some hardware*/
36#ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
37#define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
38#endif
39
Andy Fleming272cc702008-10-30 16:41:01 -050040static struct list_head mmc_devices;
41static int cur_dev_num = -1;
42
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000043int __weak board_mmc_getwp(struct mmc *mmc)
44{
45 return -1;
46}
47
48int mmc_getwp(struct mmc *mmc)
49{
50 int wp;
51
52 wp = board_mmc_getwp(mmc);
53
Peter Korsgaardd4e1da42013-03-21 04:00:03 +000054 if (wp < 0) {
55 if (mmc->getwp)
56 wp = mmc->getwp(mmc);
57 else
58 wp = 0;
59 }
Nikita Kiryanovd23d8d72012-12-03 02:19:46 +000060
61 return wp;
62}
63
Thierry Reding314284b2012-01-02 01:15:36 +000064int __board_mmc_getcd(struct mmc *mmc) {
Stefano Babic11fdade2010-02-05 15:04:43 +010065 return -1;
66}
67
Thierry Reding314284b2012-01-02 01:15:36 +000068int board_mmc_getcd(struct mmc *mmc)__attribute__((weak,
Stefano Babic11fdade2010-02-05 15:04:43 +010069 alias("__board_mmc_getcd")));
70
Kim Phillipsfdbb8732012-10-29 13:34:43 +000071static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
72 struct mmc_data *data)
Andy Fleming272cc702008-10-30 16:41:01 -050073{
Marek Vasut8635ff92012-03-15 18:41:35 +000074 struct mmc_data backup;
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000075 int ret;
Marek Vasut8635ff92012-03-15 18:41:35 +000076
77 memset(&backup, 0, sizeof(backup));
78
Marek Vasut8635ff92012-03-15 18:41:35 +000079#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000080 int i;
81 u8 *ptr;
82
83 printf("CMD_SEND:%d\n", cmd->cmdidx);
84 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000085 ret = mmc->send_cmd(mmc, cmd, data);
86 switch (cmd->resp_type) {
87 case MMC_RSP_NONE:
88 printf("\t\tMMC_RSP_NONE\n");
89 break;
90 case MMC_RSP_R1:
91 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
92 cmd->response[0]);
93 break;
94 case MMC_RSP_R1b:
95 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
96 cmd->response[0]);
97 break;
98 case MMC_RSP_R2:
99 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
100 cmd->response[0]);
101 printf("\t\t \t\t 0x%08X \n",
102 cmd->response[1]);
103 printf("\t\t \t\t 0x%08X \n",
104 cmd->response[2]);
105 printf("\t\t \t\t 0x%08X \n",
106 cmd->response[3]);
107 printf("\n");
108 printf("\t\t\t\t\tDUMPING DATA\n");
109 for (i = 0; i < 4; i++) {
110 int j;
111 printf("\t\t\t\t\t%03d - ", i*4);
Dirk Behme146bec72012-03-08 02:35:34 +0000112 ptr = (u8 *)&cmd->response[i];
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000113 ptr += 3;
114 for (j = 0; j < 4; j++)
115 printf("%02X ", *ptr--);
116 printf("\n");
117 }
118 break;
119 case MMC_RSP_R3:
120 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
121 cmd->response[0]);
122 break;
123 default:
124 printf("\t\tERROR MMC rsp not supported\n");
125 break;
126 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000127#else
Marek Vasut8635ff92012-03-15 18:41:35 +0000128 ret = mmc->send_cmd(mmc, cmd, data);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000129#endif
Marek Vasut8635ff92012-03-15 18:41:35 +0000130 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500131}
132
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000133static int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000134{
135 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000136 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000137#ifdef CONFIG_MMC_TRACE
138 int status;
139#endif
140
141 cmd.cmdidx = MMC_CMD_SEND_STATUS;
142 cmd.resp_type = MMC_RSP_R1;
Marek Vasutaaf3d412011-08-10 09:24:48 +0200143 if (!mmc_host_is_spi(mmc))
144 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000145
146 do {
147 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-02-05 22:29:12 +0000148 if (!err) {
149 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
150 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
151 MMC_STATE_PRG)
152 break;
153 else if (cmd.response[0] & MMC_STATUS_MASK) {
154 printf("Status Error: 0x%08X\n",
155 cmd.response[0]);
156 return COMM_ERR;
157 }
158 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000159 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000160
161 udelay(1000);
162
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000163 } while (timeout--);
164
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000165#ifdef CONFIG_MMC_TRACE
166 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
167 printf("CURR STATE:%d\n", status);
168#endif
Jongman Heo5b0c9422012-06-03 21:32:13 +0000169 if (timeout <= 0) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000170 printf("Timeout waiting card ready\n");
171 return TIMEOUT;
172 }
173
174 return 0;
175}
176
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000177static int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500178{
179 struct mmc_cmd cmd;
180
181 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
182 cmd.resp_type = MMC_RSP_R1;
183 cmd.cmdarg = len;
Andy Fleming272cc702008-10-30 16:41:01 -0500184
185 return mmc_send_cmd(mmc, &cmd, NULL);
186}
187
188struct mmc *find_mmc_device(int dev_num)
189{
190 struct mmc *m;
191 struct list_head *entry;
192
193 list_for_each(entry, &mmc_devices) {
194 m = list_entry(entry, struct mmc, link);
195
196 if (m->block_dev.dev == dev_num)
197 return m;
198 }
199
200 printf("MMC Device %d not found\n", dev_num);
201
202 return NULL;
203}
204
Lei Wene6f99a52011-06-22 17:03:31 +0000205static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
206{
207 struct mmc_cmd cmd;
208 ulong end;
209 int err, start_cmd, end_cmd;
210
211 if (mmc->high_capacity)
212 end = start + blkcnt - 1;
213 else {
214 end = (start + blkcnt - 1) * mmc->write_bl_len;
215 start *= mmc->write_bl_len;
216 }
217
218 if (IS_SD(mmc)) {
219 start_cmd = SD_CMD_ERASE_WR_BLK_START;
220 end_cmd = SD_CMD_ERASE_WR_BLK_END;
221 } else {
222 start_cmd = MMC_CMD_ERASE_GROUP_START;
223 end_cmd = MMC_CMD_ERASE_GROUP_END;
224 }
225
226 cmd.cmdidx = start_cmd;
227 cmd.cmdarg = start;
228 cmd.resp_type = MMC_RSP_R1;
Lei Wene6f99a52011-06-22 17:03:31 +0000229
230 err = mmc_send_cmd(mmc, &cmd, NULL);
231 if (err)
232 goto err_out;
233
234 cmd.cmdidx = end_cmd;
235 cmd.cmdarg = end;
236
237 err = mmc_send_cmd(mmc, &cmd, NULL);
238 if (err)
239 goto err_out;
240
241 cmd.cmdidx = MMC_CMD_ERASE;
242 cmd.cmdarg = SECURE_ERASE;
243 cmd.resp_type = MMC_RSP_R1b;
244
245 err = mmc_send_cmd(mmc, &cmd, NULL);
246 if (err)
247 goto err_out;
248
249 return 0;
250
251err_out:
252 puts("mmc erase failed\n");
253 return err;
254}
255
256static unsigned long
257mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
258{
259 int err = 0;
260 struct mmc *mmc = find_mmc_device(dev_num);
261 lbaint_t blk = 0, blk_r = 0;
Jerry Huangd2d8afa2012-05-17 23:00:51 +0000262 int timeout = 1000;
Lei Wene6f99a52011-06-22 17:03:31 +0000263
264 if (!mmc)
265 return -1;
266
267 if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size))
268 printf("\n\nCaution! Your devices Erase group is 0x%x\n"
269 "The erase range would be change to 0x%lx~0x%lx\n\n",
270 mmc->erase_grp_size, start & ~(mmc->erase_grp_size - 1),
271 ((start + blkcnt + mmc->erase_grp_size)
272 & ~(mmc->erase_grp_size - 1)) - 1);
273
274 while (blk < blkcnt) {
275 blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
276 mmc->erase_grp_size : (blkcnt - blk);
277 err = mmc_erase_t(mmc, start + blk, blk_r);
278 if (err)
279 break;
280
281 blk += blk_r;
Jerry Huangd2d8afa2012-05-17 23:00:51 +0000282
283 /* Waiting for the ready status */
284 if (mmc_send_status(mmc, timeout))
285 return 0;
Lei Wene6f99a52011-06-22 17:03:31 +0000286 }
287
288 return blk;
289}
290
Andy Fleming272cc702008-10-30 16:41:01 -0500291static ulong
Lei Wen01581262010-10-14 13:38:11 +0800292mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
Andy Fleming272cc702008-10-30 16:41:01 -0500293{
294 struct mmc_cmd cmd;
295 struct mmc_data data;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000296 int timeout = 1000;
Andy Fleming272cc702008-10-30 16:41:01 -0500297
Lei Wend2bf29e2010-09-13 22:07:27 +0800298 if ((start + blkcnt) > mmc->block_dev.lba) {
Steve Sakomandef412b2010-10-28 09:00:26 -0700299 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800300 start + blkcnt, mmc->block_dev.lba);
301 return 0;
302 }
Andy Fleming272cc702008-10-30 16:41:01 -0500303
Ruud Commandeura586c0a2013-05-22 13:19:43 +0200304 if (blkcnt == 0)
305 return 0;
306 else if (blkcnt == 1)
Andy Fleming272cc702008-10-30 16:41:01 -0500307 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
Ruud Commandeura586c0a2013-05-22 13:19:43 +0200308 else
309 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500310
311 if (mmc->high_capacity)
312 cmd.cmdarg = start;
313 else
Steve Sakomandef412b2010-10-28 09:00:26 -0700314 cmd.cmdarg = start * mmc->write_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500315
316 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500317
318 data.src = src;
319 data.blocks = blkcnt;
Steve Sakomandef412b2010-10-28 09:00:26 -0700320 data.blocksize = mmc->write_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500321 data.flags = MMC_DATA_WRITE;
322
Steve Sakomandef412b2010-10-28 09:00:26 -0700323 if (mmc_send_cmd(mmc, &cmd, &data)) {
324 printf("mmc write failed\n");
325 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500326 }
327
Thomas Choud52ebf12010-12-24 13:12:21 +0000328 /* SPI multiblock writes terminate using a special
329 * token, not a STOP_TRANSMISSION request.
330 */
331 if (!mmc_host_is_spi(mmc) && blkcnt > 1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500332 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
333 cmd.cmdarg = 0;
334 cmd.resp_type = MMC_RSP_R1b;
Steve Sakomandef412b2010-10-28 09:00:26 -0700335 if (mmc_send_cmd(mmc, &cmd, NULL)) {
336 printf("mmc fail to send stop cmd\n");
337 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800338 }
Andy Fleming272cc702008-10-30 16:41:01 -0500339 }
340
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000341 /* Waiting for the ready status */
342 if (mmc_send_status(mmc, timeout))
343 return 0;
344
Andy Fleming272cc702008-10-30 16:41:01 -0500345 return blkcnt;
346}
347
Lei Wen01581262010-10-14 13:38:11 +0800348static ulong
349mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
350{
Lei Wen01581262010-10-14 13:38:11 +0800351 lbaint_t cur, blocks_todo = blkcnt;
352
Steve Sakomandef412b2010-10-28 09:00:26 -0700353 struct mmc *mmc = find_mmc_device(dev_num);
Lei Wen01581262010-10-14 13:38:11 +0800354 if (!mmc)
Steve Sakomandef412b2010-10-28 09:00:26 -0700355 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800356
Steve Sakomandef412b2010-10-28 09:00:26 -0700357 if (mmc_set_blocklen(mmc, mmc->write_bl_len))
358 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800359
360 do {
John Rigby8feafcc2011-04-18 05:50:08 +0000361 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Lei Wen01581262010-10-14 13:38:11 +0800362 if(mmc_write_blocks(mmc, start, cur, src) != cur)
Steve Sakomandef412b2010-10-28 09:00:26 -0700363 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800364 blocks_todo -= cur;
365 start += cur;
366 src += cur * mmc->write_bl_len;
367 } while (blocks_todo > 0);
368
369 return blkcnt;
370}
371
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000372static int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start,
373 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500374{
375 struct mmc_cmd cmd;
376 struct mmc_data data;
377
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700378 if (blkcnt > 1)
379 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
380 else
381 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500382
383 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700384 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500385 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700386 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500387
388 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500389
390 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700391 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500392 data.blocksize = mmc->read_bl_len;
393 data.flags = MMC_DATA_READ;
394
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700395 if (mmc_send_cmd(mmc, &cmd, &data))
396 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500397
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700398 if (blkcnt > 1) {
399 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
400 cmd.cmdarg = 0;
401 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700402 if (mmc_send_cmd(mmc, &cmd, NULL)) {
403 printf("mmc fail to send stop cmd\n");
404 return 0;
405 }
Andy Fleming272cc702008-10-30 16:41:01 -0500406 }
407
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700408 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500409}
410
411static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
412{
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700413 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500414
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700415 if (blkcnt == 0)
416 return 0;
417
418 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500419 if (!mmc)
420 return 0;
421
Lei Wend2bf29e2010-09-13 22:07:27 +0800422 if ((start + blkcnt) > mmc->block_dev.lba) {
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700423 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800424 start + blkcnt, mmc->block_dev.lba);
425 return 0;
426 }
Andy Fleming272cc702008-10-30 16:41:01 -0500427
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700428 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
Andy Fleming272cc702008-10-30 16:41:01 -0500429 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500430
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700431 do {
John Rigby8feafcc2011-04-18 05:50:08 +0000432 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700433 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
434 return 0;
435 blocks_todo -= cur;
436 start += cur;
437 dst += cur * mmc->read_bl_len;
438 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500439
440 return blkcnt;
441}
442
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000443static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500444{
445 struct mmc_cmd cmd;
446 int err;
447
448 udelay(1000);
449
450 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
451 cmd.cmdarg = 0;
452 cmd.resp_type = MMC_RSP_NONE;
Andy Fleming272cc702008-10-30 16:41:01 -0500453
454 err = mmc_send_cmd(mmc, &cmd, NULL);
455
456 if (err)
457 return err;
458
459 udelay(2000);
460
461 return 0;
462}
463
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000464static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500465{
466 int timeout = 1000;
467 int err;
468 struct mmc_cmd cmd;
469
470 do {
471 cmd.cmdidx = MMC_CMD_APP_CMD;
472 cmd.resp_type = MMC_RSP_R1;
473 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500474
475 err = mmc_send_cmd(mmc, &cmd, NULL);
476
477 if (err)
478 return err;
479
480 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
481 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100482
483 /*
484 * Most cards do not answer if some reserved bits
485 * in the ocr are set. However, Some controller
486 * can set bit 7 (reserved for low voltages), but
487 * how to manage low voltages SD card is not yet
488 * specified.
489 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000490 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
491 (mmc->voltages & 0xff8000);
Andy Fleming272cc702008-10-30 16:41:01 -0500492
493 if (mmc->version == SD_VERSION_2)
494 cmd.cmdarg |= OCR_HCS;
495
496 err = mmc_send_cmd(mmc, &cmd, NULL);
497
498 if (err)
499 return err;
500
501 udelay(1000);
502 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
503
504 if (timeout <= 0)
505 return UNUSABLE_ERR;
506
507 if (mmc->version != SD_VERSION_2)
508 mmc->version = SD_VERSION_1_0;
509
Thomas Choud52ebf12010-12-24 13:12:21 +0000510 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
511 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
512 cmd.resp_type = MMC_RSP_R3;
513 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000514
515 err = mmc_send_cmd(mmc, &cmd, NULL);
516
517 if (err)
518 return err;
519 }
520
Rabin Vincent998be3d2009-04-05 13:30:56 +0530521 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500522
523 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
524 mmc->rca = 0;
525
526 return 0;
527}
528
Che-Liang Chioue9550442012-11-28 15:21:13 +0000529/* We pass in the cmd since otherwise the init seems to fail */
530static int mmc_send_op_cond_iter(struct mmc *mmc, struct mmc_cmd *cmd,
531 int use_arg)
Andy Fleming272cc702008-10-30 16:41:01 -0500532{
Andy Fleming272cc702008-10-30 16:41:01 -0500533 int err;
534
Che-Liang Chioue9550442012-11-28 15:21:13 +0000535 cmd->cmdidx = MMC_CMD_SEND_OP_COND;
536 cmd->resp_type = MMC_RSP_R3;
537 cmd->cmdarg = 0;
538 if (use_arg && !mmc_host_is_spi(mmc)) {
539 cmd->cmdarg =
540 (mmc->voltages &
541 (mmc->op_cond_response & OCR_VOLTAGE_MASK)) |
542 (mmc->op_cond_response & OCR_ACCESS_MODE);
543
544 if (mmc->host_caps & MMC_MODE_HC)
545 cmd->cmdarg |= OCR_HCS;
546 }
547 err = mmc_send_cmd(mmc, cmd, NULL);
548 if (err)
549 return err;
550 mmc->op_cond_response = cmd->response[0];
551 return 0;
552}
553
554int mmc_send_op_cond(struct mmc *mmc)
555{
556 struct mmc_cmd cmd;
557 int err, i;
558
Andy Fleming272cc702008-10-30 16:41:01 -0500559 /* Some cards seem to need this */
560 mmc_go_idle(mmc);
561
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000562 /* Asking to the card its capabilities */
Che-Liang Chioue9550442012-11-28 15:21:13 +0000563 mmc->op_cond_pending = 1;
564 for (i = 0; i < 2; i++) {
565 err = mmc_send_op_cond_iter(mmc, &cmd, i != 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500566 if (err)
567 return err;
568
Che-Liang Chioue9550442012-11-28 15:21:13 +0000569 /* exit if not busy (flag seems to be inverted) */
570 if (mmc->op_cond_response & OCR_BUSY)
571 return 0;
572 }
573 return IN_PROGRESS;
574}
Andy Fleming272cc702008-10-30 16:41:01 -0500575
Che-Liang Chioue9550442012-11-28 15:21:13 +0000576int mmc_complete_op_cond(struct mmc *mmc)
577{
578 struct mmc_cmd cmd;
579 int timeout = 1000;
580 uint start;
581 int err;
582
583 mmc->op_cond_pending = 0;
584 start = get_timer(0);
585 do {
586 err = mmc_send_op_cond_iter(mmc, &cmd, 1);
587 if (err)
588 return err;
589 if (get_timer(start) > timeout)
590 return UNUSABLE_ERR;
591 udelay(100);
592 } while (!(mmc->op_cond_response & OCR_BUSY));
Andy Fleming272cc702008-10-30 16:41:01 -0500593
Thomas Choud52ebf12010-12-24 13:12:21 +0000594 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
595 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
596 cmd.resp_type = MMC_RSP_R3;
597 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000598
599 err = mmc_send_cmd(mmc, &cmd, NULL);
600
601 if (err)
602 return err;
603 }
604
Andy Fleming272cc702008-10-30 16:41:01 -0500605 mmc->version = MMC_VERSION_UNKNOWN;
Rabin Vincent998be3d2009-04-05 13:30:56 +0530606 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500607
608 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
609 mmc->rca = 0;
610
611 return 0;
612}
613
614
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000615static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-10-30 16:41:01 -0500616{
617 struct mmc_cmd cmd;
618 struct mmc_data data;
619 int err;
620
621 /* Get the Card Status Register */
622 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
623 cmd.resp_type = MMC_RSP_R1;
624 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500625
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000626 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500627 data.blocks = 1;
Simon Glass8bfa1952013-04-03 08:54:30 +0000628 data.blocksize = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -0500629 data.flags = MMC_DATA_READ;
630
631 err = mmc_send_cmd(mmc, &cmd, &data);
632
633 return err;
634}
635
636
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000637static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500638{
639 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000640 int timeout = 1000;
641 int ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500642
643 cmd.cmdidx = MMC_CMD_SWITCH;
644 cmd.resp_type = MMC_RSP_R1b;
645 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000646 (index << 16) |
647 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500648
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000649 ret = mmc_send_cmd(mmc, &cmd, NULL);
650
651 /* Waiting for the ready status */
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000652 if (!ret)
653 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000654
655 return ret;
656
Andy Fleming272cc702008-10-30 16:41:01 -0500657}
658
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000659static int mmc_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500660{
Simon Glass8bfa1952013-04-03 08:54:30 +0000661 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
Andy Fleming272cc702008-10-30 16:41:01 -0500662 char cardtype;
663 int err;
664
665 mmc->card_caps = 0;
666
Thomas Choud52ebf12010-12-24 13:12:21 +0000667 if (mmc_host_is_spi(mmc))
668 return 0;
669
Andy Fleming272cc702008-10-30 16:41:01 -0500670 /* Only version 4 supports high-speed */
671 if (mmc->version < MMC_VERSION_4)
672 return 0;
673
Andy Fleming272cc702008-10-30 16:41:01 -0500674 err = mmc_send_ext_csd(mmc, ext_csd);
675
676 if (err)
677 return err;
678
Lei Wen0560db12011-10-03 20:35:10 +0000679 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500680
681 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
682
683 if (err)
684 return err;
685
686 /* Now check to see that it worked */
687 err = mmc_send_ext_csd(mmc, ext_csd);
688
689 if (err)
690 return err;
691
692 /* No high-speed support */
Lei Wen0560db12011-10-03 20:35:10 +0000693 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Fleming272cc702008-10-30 16:41:01 -0500694 return 0;
695
696 /* High Speed is set, there are two types: 52MHz and 26MHz */
697 if (cardtype & MMC_HS_52MHZ)
698 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
699 else
700 mmc->card_caps |= MMC_MODE_HS;
701
702 return 0;
703}
704
Lei Wenbc897b12011-05-02 16:26:26 +0000705int mmc_switch_part(int dev_num, unsigned int part_num)
706{
707 struct mmc *mmc = find_mmc_device(dev_num);
708
709 if (!mmc)
710 return -1;
711
712 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
713 (mmc->part_config & ~PART_ACCESS_MASK)
714 | (part_num & PART_ACCESS_MASK));
715}
716
Thierry Reding48972d92012-01-02 01:15:37 +0000717int mmc_getcd(struct mmc *mmc)
718{
719 int cd;
720
721 cd = board_mmc_getcd(mmc);
722
Peter Korsgaardd4e1da42013-03-21 04:00:03 +0000723 if (cd < 0) {
724 if (mmc->getcd)
725 cd = mmc->getcd(mmc);
726 else
727 cd = 1;
728 }
Thierry Reding48972d92012-01-02 01:15:37 +0000729
730 return cd;
731}
732
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000733static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-10-30 16:41:01 -0500734{
735 struct mmc_cmd cmd;
736 struct mmc_data data;
737
738 /* Switch the frequency */
739 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
740 cmd.resp_type = MMC_RSP_R1;
741 cmd.cmdarg = (mode << 31) | 0xffffff;
742 cmd.cmdarg &= ~(0xf << (group * 4));
743 cmd.cmdarg |= value << (group * 4);
Andy Fleming272cc702008-10-30 16:41:01 -0500744
745 data.dest = (char *)resp;
746 data.blocksize = 64;
747 data.blocks = 1;
748 data.flags = MMC_DATA_READ;
749
750 return mmc_send_cmd(mmc, &cmd, &data);
751}
752
753
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000754static int sd_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500755{
756 int err;
757 struct mmc_cmd cmd;
Anton staaff781dd32011-10-03 13:54:59 +0000758 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
759 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500760 struct mmc_data data;
761 int timeout;
762
763 mmc->card_caps = 0;
764
Thomas Choud52ebf12010-12-24 13:12:21 +0000765 if (mmc_host_is_spi(mmc))
766 return 0;
767
Andy Fleming272cc702008-10-30 16:41:01 -0500768 /* Read the SCR to find out if this card supports higher speeds */
769 cmd.cmdidx = MMC_CMD_APP_CMD;
770 cmd.resp_type = MMC_RSP_R1;
771 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500772
773 err = mmc_send_cmd(mmc, &cmd, NULL);
774
775 if (err)
776 return err;
777
778 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
779 cmd.resp_type = MMC_RSP_R1;
780 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500781
782 timeout = 3;
783
784retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000785 data.dest = (char *)scr;
Andy Fleming272cc702008-10-30 16:41:01 -0500786 data.blocksize = 8;
787 data.blocks = 1;
788 data.flags = MMC_DATA_READ;
789
790 err = mmc_send_cmd(mmc, &cmd, &data);
791
792 if (err) {
793 if (timeout--)
794 goto retry_scr;
795
796 return err;
797 }
798
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300799 mmc->scr[0] = __be32_to_cpu(scr[0]);
800 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500801
802 switch ((mmc->scr[0] >> 24) & 0xf) {
803 case 0:
804 mmc->version = SD_VERSION_1_0;
805 break;
806 case 1:
807 mmc->version = SD_VERSION_1_10;
808 break;
809 case 2:
810 mmc->version = SD_VERSION_2;
Jaehoon Chung1741c642013-01-29 22:58:16 +0000811 if ((mmc->scr[0] >> 15) & 0x1)
812 mmc->version = SD_VERSION_3;
Andy Fleming272cc702008-10-30 16:41:01 -0500813 break;
814 default:
815 mmc->version = SD_VERSION_1_0;
816 break;
817 }
818
Alagu Sankarb44c7082010-05-12 15:08:24 +0530819 if (mmc->scr[0] & SD_DATA_4BIT)
820 mmc->card_caps |= MMC_MODE_4BIT;
821
Andy Fleming272cc702008-10-30 16:41:01 -0500822 /* Version 1.0 doesn't support switching */
823 if (mmc->version == SD_VERSION_1_0)
824 return 0;
825
826 timeout = 4;
827 while (timeout--) {
828 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaff781dd32011-10-03 13:54:59 +0000829 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500830
831 if (err)
832 return err;
833
834 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300835 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500836 break;
837 }
838
Andy Fleming272cc702008-10-30 16:41:01 -0500839 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300840 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500841 return 0;
842
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000843 /*
844 * If the host doesn't support SD_HIGHSPEED, do not switch card to
845 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
846 * This can avoid furthur problem when the card runs in different
847 * mode between the host.
848 */
849 if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
850 (mmc->host_caps & MMC_MODE_HS)))
851 return 0;
852
Anton staaff781dd32011-10-03 13:54:59 +0000853 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500854
855 if (err)
856 return err;
857
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300858 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-10-30 16:41:01 -0500859 mmc->card_caps |= MMC_MODE_HS;
860
861 return 0;
862}
863
864/* frequency bases */
865/* divided by 10 to be nice to platforms without floating point */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000866static const int fbase[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500867 10000,
868 100000,
869 1000000,
870 10000000,
871};
872
873/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
874 * to platforms without floating point.
875 */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000876static const int multipliers[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500877 0, /* reserved */
878 10,
879 12,
880 13,
881 15,
882 20,
883 25,
884 30,
885 35,
886 40,
887 45,
888 50,
889 55,
890 60,
891 70,
892 80,
893};
894
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000895static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500896{
897 mmc->set_ios(mmc);
898}
899
900void mmc_set_clock(struct mmc *mmc, uint clock)
901{
902 if (clock > mmc->f_max)
903 clock = mmc->f_max;
904
905 if (clock < mmc->f_min)
906 clock = mmc->f_min;
907
908 mmc->clock = clock;
909
910 mmc_set_ios(mmc);
911}
912
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000913static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -0500914{
915 mmc->bus_width = width;
916
917 mmc_set_ios(mmc);
918}
919
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000920static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500921{
Andy Fleming7798f6d2012-10-31 19:02:38 +0000922 int err;
Andy Fleming272cc702008-10-30 16:41:01 -0500923 uint mult, freq;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +0000924 u64 cmult, csize, capacity;
Andy Fleming272cc702008-10-30 16:41:01 -0500925 struct mmc_cmd cmd;
Simon Glass8bfa1952013-04-03 08:54:30 +0000926 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
927 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000928 int timeout = 1000;
Andy Fleming272cc702008-10-30 16:41:01 -0500929
Thomas Choud52ebf12010-12-24 13:12:21 +0000930#ifdef CONFIG_MMC_SPI_CRC_ON
931 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
932 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
933 cmd.resp_type = MMC_RSP_R1;
934 cmd.cmdarg = 1;
Thomas Choud52ebf12010-12-24 13:12:21 +0000935 err = mmc_send_cmd(mmc, &cmd, NULL);
936
937 if (err)
938 return err;
939 }
940#endif
941
Andy Fleming272cc702008-10-30 16:41:01 -0500942 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +0000943 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
944 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Fleming272cc702008-10-30 16:41:01 -0500945 cmd.resp_type = MMC_RSP_R2;
946 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500947
948 err = mmc_send_cmd(mmc, &cmd, NULL);
949
950 if (err)
951 return err;
952
953 memcpy(mmc->cid, cmd.response, 16);
954
955 /*
956 * For MMC cards, set the Relative Address.
957 * For SD cards, get the Relatvie Address.
958 * This also puts the cards into Standby State
959 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000960 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
961 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
962 cmd.cmdarg = mmc->rca << 16;
963 cmd.resp_type = MMC_RSP_R6;
Andy Fleming272cc702008-10-30 16:41:01 -0500964
Thomas Choud52ebf12010-12-24 13:12:21 +0000965 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -0500966
Thomas Choud52ebf12010-12-24 13:12:21 +0000967 if (err)
968 return err;
Andy Fleming272cc702008-10-30 16:41:01 -0500969
Thomas Choud52ebf12010-12-24 13:12:21 +0000970 if (IS_SD(mmc))
971 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
972 }
Andy Fleming272cc702008-10-30 16:41:01 -0500973
974 /* Get the Card-Specific Data */
975 cmd.cmdidx = MMC_CMD_SEND_CSD;
976 cmd.resp_type = MMC_RSP_R2;
977 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500978
979 err = mmc_send_cmd(mmc, &cmd, NULL);
980
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000981 /* Waiting for the ready status */
982 mmc_send_status(mmc, timeout);
983
Andy Fleming272cc702008-10-30 16:41:01 -0500984 if (err)
985 return err;
986
Rabin Vincent998be3d2009-04-05 13:30:56 +0530987 mmc->csd[0] = cmd.response[0];
988 mmc->csd[1] = cmd.response[1];
989 mmc->csd[2] = cmd.response[2];
990 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -0500991
992 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530993 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500994
995 switch (version) {
996 case 0:
997 mmc->version = MMC_VERSION_1_2;
998 break;
999 case 1:
1000 mmc->version = MMC_VERSION_1_4;
1001 break;
1002 case 2:
1003 mmc->version = MMC_VERSION_2_2;
1004 break;
1005 case 3:
1006 mmc->version = MMC_VERSION_3;
1007 break;
1008 case 4:
1009 mmc->version = MMC_VERSION_4;
1010 break;
1011 default:
1012 mmc->version = MMC_VERSION_1_2;
1013 break;
1014 }
1015 }
1016
1017 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301018 freq = fbase[(cmd.response[0] & 0x7)];
1019 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -05001020
1021 mmc->tran_speed = freq * mult;
1022
Rabin Vincent998be3d2009-04-05 13:30:56 +05301023 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001024
1025 if (IS_SD(mmc))
1026 mmc->write_bl_len = mmc->read_bl_len;
1027 else
Rabin Vincent998be3d2009-04-05 13:30:56 +05301028 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -05001029
1030 if (mmc->high_capacity) {
1031 csize = (mmc->csd[1] & 0x3f) << 16
1032 | (mmc->csd[2] & 0xffff0000) >> 16;
1033 cmult = 8;
1034 } else {
1035 csize = (mmc->csd[1] & 0x3ff) << 2
1036 | (mmc->csd[2] & 0xc0000000) >> 30;
1037 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1038 }
1039
1040 mmc->capacity = (csize + 1) << (cmult + 2);
1041 mmc->capacity *= mmc->read_bl_len;
1042
Simon Glass8bfa1952013-04-03 08:54:30 +00001043 if (mmc->read_bl_len > MMC_MAX_BLOCK_LEN)
1044 mmc->read_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001045
Simon Glass8bfa1952013-04-03 08:54:30 +00001046 if (mmc->write_bl_len > MMC_MAX_BLOCK_LEN)
1047 mmc->write_bl_len = MMC_MAX_BLOCK_LEN;
Andy Fleming272cc702008-10-30 16:41:01 -05001048
1049 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +00001050 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1051 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargavfe8f7062011-10-05 03:13:23 +00001052 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001053 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001054 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001055
Thomas Choud52ebf12010-12-24 13:12:21 +00001056 if (err)
1057 return err;
1058 }
Andy Fleming272cc702008-10-30 16:41:01 -05001059
Lei Wene6f99a52011-06-22 17:03:31 +00001060 /*
1061 * For SD, its erase group is always one sector
1062 */
1063 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001064 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301065 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1066 /* check ext_csd version and capacity */
1067 err = mmc_send_ext_csd(mmc, ext_csd);
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001068 if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001069 /*
1070 * According to the JEDEC Standard, the value of
1071 * ext_csd's capacity is valid if the value is more
1072 * than 2GB
1073 */
Lei Wen0560db12011-10-03 20:35:10 +00001074 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1075 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1076 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1077 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Simon Glass8bfa1952013-04-03 08:54:30 +00001078 capacity *= MMC_MAX_BLOCK_LEN;
Łukasz Majewskib1f1e8212011-07-05 02:19:44 +00001079 if ((capacity >> 20) > 2 * 1024)
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001080 mmc->capacity = capacity;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301081 }
Lei Wenbc897b12011-05-02 16:26:26 +00001082
Jaehoon Chung64f4a612013-01-29 19:31:16 +00001083 switch (ext_csd[EXT_CSD_REV]) {
1084 case 1:
1085 mmc->version = MMC_VERSION_4_1;
1086 break;
1087 case 2:
1088 mmc->version = MMC_VERSION_4_2;
1089 break;
1090 case 3:
1091 mmc->version = MMC_VERSION_4_3;
1092 break;
1093 case 5:
1094 mmc->version = MMC_VERSION_4_41;
1095 break;
1096 case 6:
1097 mmc->version = MMC_VERSION_4_5;
1098 break;
1099 }
1100
Lei Wene6f99a52011-06-22 17:03:31 +00001101 /*
1102 * Check whether GROUP_DEF is set, if yes, read out
1103 * group size from ext_csd directly, or calculate
1104 * the group size from the csd value.
1105 */
Simon Glass8bfa1952013-04-03 08:54:30 +00001106 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF]) {
Lei Wen0560db12011-10-03 20:35:10 +00001107 mmc->erase_grp_size =
Simon Glass8bfa1952013-04-03 08:54:30 +00001108 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] *
1109 MMC_MAX_BLOCK_LEN * 1024;
1110 } else {
Lei Wene6f99a52011-06-22 17:03:31 +00001111 int erase_gsz, erase_gmul;
1112 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1113 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1114 mmc->erase_grp_size = (erase_gsz + 1)
1115 * (erase_gmul + 1);
1116 }
1117
Lei Wenbc897b12011-05-02 16:26:26 +00001118 /* store the partition info of emmc */
Stephen Warren8948ea82012-07-30 10:55:43 +00001119 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1120 ext_csd[EXT_CSD_BOOT_MULT])
Lei Wen0560db12011-10-03 20:35:10 +00001121 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301122 }
1123
Andy Fleming272cc702008-10-30 16:41:01 -05001124 if (IS_SD(mmc))
1125 err = sd_change_freq(mmc);
1126 else
1127 err = mmc_change_freq(mmc);
1128
1129 if (err)
1130 return err;
1131
1132 /* Restrict card's capabilities by what the host can do */
1133 mmc->card_caps &= mmc->host_caps;
1134
1135 if (IS_SD(mmc)) {
1136 if (mmc->card_caps & MMC_MODE_4BIT) {
1137 cmd.cmdidx = MMC_CMD_APP_CMD;
1138 cmd.resp_type = MMC_RSP_R1;
1139 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -05001140
1141 err = mmc_send_cmd(mmc, &cmd, NULL);
1142 if (err)
1143 return err;
1144
1145 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1146 cmd.resp_type = MMC_RSP_R1;
1147 cmd.cmdarg = 2;
Andy Fleming272cc702008-10-30 16:41:01 -05001148 err = mmc_send_cmd(mmc, &cmd, NULL);
1149 if (err)
1150 return err;
1151
1152 mmc_set_bus_width(mmc, 4);
1153 }
1154
1155 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001156 mmc->tran_speed = 50000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001157 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001158 mmc->tran_speed = 25000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001159 } else {
Andy Fleming7798f6d2012-10-31 19:02:38 +00001160 int idx;
1161
1162 /* An array of possible bus widths in order of preference */
1163 static unsigned ext_csd_bits[] = {
1164 EXT_CSD_BUS_WIDTH_8,
1165 EXT_CSD_BUS_WIDTH_4,
1166 EXT_CSD_BUS_WIDTH_1,
1167 };
1168
1169 /* An array to map CSD bus widths to host cap bits */
1170 static unsigned ext_to_hostcaps[] = {
1171 [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
1172 [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
1173 };
1174
1175 /* An array to map chosen bus width to an integer */
1176 static unsigned widths[] = {
1177 8, 4, 1,
1178 };
1179
1180 for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
1181 unsigned int extw = ext_csd_bits[idx];
1182
1183 /*
1184 * Check to make sure the controller supports
1185 * this bus width, if it's more than 1
1186 */
1187 if (extw != EXT_CSD_BUS_WIDTH_1 &&
1188 !(mmc->host_caps & ext_to_hostcaps[extw]))
1189 continue;
1190
Andy Fleming272cc702008-10-30 16:41:01 -05001191 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Andy Fleming7798f6d2012-10-31 19:02:38 +00001192 EXT_CSD_BUS_WIDTH, extw);
Andy Fleming272cc702008-10-30 16:41:01 -05001193
1194 if (err)
Lei Wen41378942011-10-03 20:35:11 +00001195 continue;
Andy Fleming272cc702008-10-30 16:41:01 -05001196
Andy Fleming7798f6d2012-10-31 19:02:38 +00001197 mmc_set_bus_width(mmc, widths[idx]);
Andy Fleming272cc702008-10-30 16:41:01 -05001198
Lei Wen41378942011-10-03 20:35:11 +00001199 err = mmc_send_ext_csd(mmc, test_csd);
1200 if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1201 == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1202 && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1203 == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1204 && ext_csd[EXT_CSD_REV] \
1205 == test_csd[EXT_CSD_REV]
1206 && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1207 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1208 && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1209 &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
Andy Fleming272cc702008-10-30 16:41:01 -05001210
Andy Fleming7798f6d2012-10-31 19:02:38 +00001211 mmc->card_caps |= ext_to_hostcaps[extw];
Lei Wen41378942011-10-03 20:35:11 +00001212 break;
1213 }
Andy Fleming272cc702008-10-30 16:41:01 -05001214 }
1215
1216 if (mmc->card_caps & MMC_MODE_HS) {
1217 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001218 mmc->tran_speed = 52000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001219 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001220 mmc->tran_speed = 26000000;
1221 }
Andy Fleming272cc702008-10-30 16:41:01 -05001222 }
1223
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001224 mmc_set_clock(mmc, mmc->tran_speed);
1225
Andy Fleming272cc702008-10-30 16:41:01 -05001226 /* fill in device description */
1227 mmc->block_dev.lun = 0;
1228 mmc->block_dev.type = 0;
1229 mmc->block_dev.blksz = mmc->read_bl_len;
Egbert Eich0472fbf2013-04-09 21:11:56 +00001230 mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
Rabin Vincent9b1f9422009-04-05 13:30:54 +05301231 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Taylor Huttbabce5f2012-10-20 17:15:59 +00001232 sprintf(mmc->block_dev.vendor, "Man %06x Snr %04x%04x",
1233 mmc->cid[0] >> 24, (mmc->cid[2] & 0xffff),
1234 (mmc->cid[3] >> 16) & 0xffff);
1235 sprintf(mmc->block_dev.product, "%c%c%c%c%c%c", mmc->cid[0] & 0xff,
1236 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1237 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff,
1238 (mmc->cid[2] >> 24) & 0xff);
1239 sprintf(mmc->block_dev.revision, "%d.%d", (mmc->cid[2] >> 20) & 0xf,
1240 (mmc->cid[2] >> 16) & 0xf);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001241#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001242 init_part(&mmc->block_dev);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001243#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001244
1245 return 0;
1246}
1247
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001248static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001249{
1250 struct mmc_cmd cmd;
1251 int err;
1252
1253 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1254 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1255 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
1256 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001257
1258 err = mmc_send_cmd(mmc, &cmd, NULL);
1259
1260 if (err)
1261 return err;
1262
Rabin Vincent998be3d2009-04-05 13:30:56 +05301263 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -05001264 return UNUSABLE_ERR;
1265 else
1266 mmc->version = SD_VERSION_2;
1267
1268 return 0;
1269}
1270
1271int mmc_register(struct mmc *mmc)
1272{
1273 /* Setup the universal parts of the block interface just once */
1274 mmc->block_dev.if_type = IF_TYPE_MMC;
1275 mmc->block_dev.dev = cur_dev_num++;
1276 mmc->block_dev.removable = 1;
1277 mmc->block_dev.block_read = mmc_bread;
1278 mmc->block_dev.block_write = mmc_bwrite;
Lei Wene6f99a52011-06-22 17:03:31 +00001279 mmc->block_dev.block_erase = mmc_berase;
John Rigby8feafcc2011-04-18 05:50:08 +00001280 if (!mmc->b_max)
1281 mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
Andy Fleming272cc702008-10-30 16:41:01 -05001282
1283 INIT_LIST_HEAD (&mmc->link);
1284
1285 list_add_tail (&mmc->link, &mmc_devices);
1286
1287 return 0;
1288}
1289
Matthew McClintockdf3fc522011-05-24 05:31:19 +00001290#ifdef CONFIG_PARTITIONS
Andy Fleming272cc702008-10-30 16:41:01 -05001291block_dev_desc_t *mmc_get_dev(int dev)
1292{
1293 struct mmc *mmc = find_mmc_device(dev);
Benoît Thébaudeau6bb4b4b2012-08-10 08:59:12 +00001294 if (!mmc || mmc_init(mmc))
Łukasz Majewski40242bc2012-04-19 02:39:18 +00001295 return NULL;
Andy Fleming272cc702008-10-30 16:41:01 -05001296
Łukasz Majewski40242bc2012-04-19 02:39:18 +00001297 return &mmc->block_dev;
Andy Fleming272cc702008-10-30 16:41:01 -05001298}
Matthew McClintockdf3fc522011-05-24 05:31:19 +00001299#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001300
Che-Liang Chioue9550442012-11-28 15:21:13 +00001301int mmc_start_init(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001302{
Macpaul Linafd59322011-11-14 23:35:39 +00001303 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001304
Thierry Reding48972d92012-01-02 01:15:37 +00001305 if (mmc_getcd(mmc) == 0) {
1306 mmc->has_init = 0;
1307 printf("MMC: no card present\n");
1308 return NO_CARD_ERR;
1309 }
1310
Lei Wenbc897b12011-05-02 16:26:26 +00001311 if (mmc->has_init)
1312 return 0;
1313
Andy Fleming272cc702008-10-30 16:41:01 -05001314 err = mmc->init(mmc);
1315
1316 if (err)
1317 return err;
1318
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001319 mmc_set_bus_width(mmc, 1);
1320 mmc_set_clock(mmc, 1);
1321
Andy Fleming272cc702008-10-30 16:41:01 -05001322 /* Reset the Card */
1323 err = mmc_go_idle(mmc);
1324
1325 if (err)
1326 return err;
1327
Lei Wenbc897b12011-05-02 16:26:26 +00001328 /* The internal partition reset to user partition(0) at every CMD0*/
1329 mmc->part_num = 0;
1330
Andy Fleming272cc702008-10-30 16:41:01 -05001331 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001332 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001333
Andy Fleming272cc702008-10-30 16:41:01 -05001334 /* Now try to get the SD card's operating condition */
1335 err = sd_send_op_cond(mmc);
1336
1337 /* If the command timed out, we check for an MMC card */
1338 if (err == TIMEOUT) {
1339 err = mmc_send_op_cond(mmc);
1340
Che-Liang Chioue9550442012-11-28 15:21:13 +00001341 if (err && err != IN_PROGRESS) {
Andy Fleming272cc702008-10-30 16:41:01 -05001342 printf("Card did not respond to voltage select!\n");
1343 return UNUSABLE_ERR;
1344 }
1345 }
1346
Che-Liang Chioue9550442012-11-28 15:21:13 +00001347 if (err == IN_PROGRESS)
1348 mmc->init_in_progress = 1;
1349
1350 return err;
1351}
1352
1353static int mmc_complete_init(struct mmc *mmc)
1354{
1355 int err = 0;
1356
1357 if (mmc->op_cond_pending)
1358 err = mmc_complete_op_cond(mmc);
1359
1360 if (!err)
1361 err = mmc_startup(mmc);
Lei Wenbc897b12011-05-02 16:26:26 +00001362 if (err)
1363 mmc->has_init = 0;
1364 else
1365 mmc->has_init = 1;
Che-Liang Chioue9550442012-11-28 15:21:13 +00001366 mmc->init_in_progress = 0;
1367 return err;
1368}
1369
1370int mmc_init(struct mmc *mmc)
1371{
1372 int err = IN_PROGRESS;
1373 unsigned start = get_timer(0);
1374
1375 if (mmc->has_init)
1376 return 0;
1377 if (!mmc->init_in_progress)
1378 err = mmc_start_init(mmc);
1379
1380 if (!err || err == IN_PROGRESS)
1381 err = mmc_complete_init(mmc);
1382 debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
Lei Wenbc897b12011-05-02 16:26:26 +00001383 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001384}
1385
1386/*
1387 * CPU and board-specific MMC initializations. Aliased function
1388 * signals caller to move on
1389 */
1390static int __def_mmc_init(bd_t *bis)
1391{
1392 return -1;
1393}
1394
Peter Tyserf9a109b2009-04-20 11:08:46 -05001395int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1396int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
Andy Fleming272cc702008-10-30 16:41:01 -05001397
1398void print_mmc_devices(char separator)
1399{
1400 struct mmc *m;
1401 struct list_head *entry;
1402
1403 list_for_each(entry, &mmc_devices) {
1404 m = list_entry(entry, struct mmc, link);
1405
1406 printf("%s: %d", m->name, m->block_dev.dev);
1407
1408 if (entry->next != &mmc_devices)
1409 printf("%c ", separator);
1410 }
1411
1412 printf("\n");
1413}
1414
Lei Wenea6ebe22011-05-02 16:26:25 +00001415int get_mmc_num(void)
1416{
1417 return cur_dev_num;
1418}
1419
Che-Liang Chioue9550442012-11-28 15:21:13 +00001420void mmc_set_preinit(struct mmc *mmc, int preinit)
1421{
1422 mmc->preinit = preinit;
1423}
1424
1425static void do_preinit(void)
1426{
1427 struct mmc *m;
1428 struct list_head *entry;
1429
1430 list_for_each(entry, &mmc_devices) {
1431 m = list_entry(entry, struct mmc, link);
1432
1433 if (m->preinit)
1434 mmc_start_init(m);
1435 }
1436}
1437
1438
Andy Fleming272cc702008-10-30 16:41:01 -05001439int mmc_initialize(bd_t *bis)
1440{
1441 INIT_LIST_HEAD (&mmc_devices);
1442 cur_dev_num = 0;
1443
1444 if (board_mmc_init(bis) < 0)
1445 cpu_mmc_init(bis);
1446
1447 print_mmc_devices(',');
1448
Che-Liang Chioue9550442012-11-28 15:21:13 +00001449 do_preinit();
Andy Fleming272cc702008-10-30 16:41:01 -05001450 return 0;
1451}