blob: c1c2862986432cd3a7be6d0600d6cb094ba0f004 [file] [log] [blame]
Andy Flemingad347bb2008-10-30 16:41:01 -05001/*
2 * Copyright 2008, Freescale Semiconductor, Inc
3 * Andy Fleming
4 *
5 * Based vaguely on the Linux code
6 *
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 Vincent69d4e2c2009-04-05 13:30:54 +053033#include <div64.h>
Andy Flemingad347bb2008-10-30 16:41:01 -050034
Matt Waddeld0e3c802011-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 Flemingad347bb2008-10-30 16:41:01 -050040static struct list_head mmc_devices;
41static int cur_dev_num = -1;
42
Thierry Redingd7aebf42012-01-02 01:15:36 +000043int __board_mmc_getcd(struct mmc *mmc) {
Stefano Babic6e00edf2010-02-05 15:04:43 +010044 return -1;
45}
46
Thierry Redingd7aebf42012-01-02 01:15:36 +000047int board_mmc_getcd(struct mmc *mmc)__attribute__((weak,
Stefano Babic6e00edf2010-02-05 15:04:43 +010048 alias("__board_mmc_getcd")));
49
Marek Vasutdccb6082012-03-15 18:41:35 +000050#ifdef CONFIG_MMC_BOUNCE_BUFFER
51static int mmc_bounce_need_bounce(struct mmc_data *orig)
52{
53 ulong addr, len;
54
55 if (orig->flags & MMC_DATA_READ)
56 addr = (ulong)orig->dest;
57 else
58 addr = (ulong)orig->src;
59
60 if (addr % ARCH_DMA_MINALIGN) {
61 debug("MMC: Unaligned data destination address %08lx!\n", addr);
62 return 1;
63 }
64
65 len = (ulong)(orig->blocksize * orig->blocks);
66 if (len % ARCH_DMA_MINALIGN) {
67 debug("MMC: Unaligned data destination length %08lx!\n", len);
68 return 1;
69 }
70
71 return 0;
72}
73
74static int mmc_bounce_buffer_start(struct mmc_data *backup,
75 struct mmc_data *orig)
76{
77 ulong origlen, len;
78 void *buffer;
79
80 if (!orig)
81 return 0;
82
83 if (!mmc_bounce_need_bounce(orig))
84 return 0;
85
86 memcpy(backup, orig, sizeof(struct mmc_data));
87
88 origlen = orig->blocksize * orig->blocks;
89 len = roundup(origlen, ARCH_DMA_MINALIGN);
90 buffer = memalign(ARCH_DMA_MINALIGN, len);
91 if (!buffer) {
92 puts("MMC: Error allocating MMC bounce buffer!\n");
93 return 1;
94 }
95
96 if (orig->flags & MMC_DATA_READ) {
97 orig->dest = buffer;
98 } else {
99 memcpy(buffer, orig->src, origlen);
100 orig->src = buffer;
101 }
102
103 return 0;
104}
105
106static void mmc_bounce_buffer_stop(struct mmc_data *backup,
107 struct mmc_data *orig)
108{
109 ulong len;
110
111 if (!orig)
112 return;
113
114 if (!mmc_bounce_need_bounce(backup))
115 return;
116
117 if (backup->flags & MMC_DATA_READ) {
118 len = backup->blocksize * backup->blocks;
119 memcpy(backup->dest, orig->dest, len);
120 free(orig->dest);
121 orig->dest = backup->dest;
122 } else {
123 free((void *)orig->src);
124 orig->src = backup->src;
125 }
126
127 return;
128
129}
130#else
131static inline int mmc_bounce_buffer_start(struct mmc_data *backup,
Anatolij Gustschindfad56c2012-03-28 21:24:32 +0000132 struct mmc_data *orig) { return 0; }
Marek Vasutdccb6082012-03-15 18:41:35 +0000133static inline void mmc_bounce_buffer_stop(struct mmc_data *backup,
134 struct mmc_data *orig) { }
135#endif
136
Andy Flemingad347bb2008-10-30 16:41:01 -0500137int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
138{
Marek Vasutdccb6082012-03-15 18:41:35 +0000139 struct mmc_data backup;
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000140 int ret;
Marek Vasutdccb6082012-03-15 18:41:35 +0000141
142 memset(&backup, 0, sizeof(backup));
143
144 ret = mmc_bounce_buffer_start(&backup, data);
145 if (ret)
146 return ret;
147
148#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000149 int i;
150 u8 *ptr;
151
152 printf("CMD_SEND:%d\n", cmd->cmdidx);
153 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
154 printf("\t\tFLAG\t\t\t %d\n", cmd->flags);
155 ret = mmc->send_cmd(mmc, cmd, data);
156 switch (cmd->resp_type) {
157 case MMC_RSP_NONE:
158 printf("\t\tMMC_RSP_NONE\n");
159 break;
160 case MMC_RSP_R1:
161 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
162 cmd->response[0]);
163 break;
164 case MMC_RSP_R1b:
165 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
166 cmd->response[0]);
167 break;
168 case MMC_RSP_R2:
169 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
170 cmd->response[0]);
171 printf("\t\t \t\t 0x%08X \n",
172 cmd->response[1]);
173 printf("\t\t \t\t 0x%08X \n",
174 cmd->response[2]);
175 printf("\t\t \t\t 0x%08X \n",
176 cmd->response[3]);
177 printf("\n");
178 printf("\t\t\t\t\tDUMPING DATA\n");
179 for (i = 0; i < 4; i++) {
180 int j;
181 printf("\t\t\t\t\t%03d - ", i*4);
Dirk Behmec9cb4a92012-03-08 02:35:34 +0000182 ptr = (u8 *)&cmd->response[i];
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000183 ptr += 3;
184 for (j = 0; j < 4; j++)
185 printf("%02X ", *ptr--);
186 printf("\n");
187 }
188 break;
189 case MMC_RSP_R3:
190 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
191 cmd->response[0]);
192 break;
193 default:
194 printf("\t\tERROR MMC rsp not supported\n");
195 break;
196 }
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000197#else
Marek Vasutdccb6082012-03-15 18:41:35 +0000198 ret = mmc->send_cmd(mmc, cmd, data);
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000199#endif
Marek Vasutdccb6082012-03-15 18:41:35 +0000200 mmc_bounce_buffer_stop(&backup, data);
201 return ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500202}
203
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000204int mmc_send_status(struct mmc *mmc, int timeout)
205{
206 struct mmc_cmd cmd;
Jan Kloetzke31789322012-02-05 22:29:12 +0000207 int err, retries = 5;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000208#ifdef CONFIG_MMC_TRACE
209 int status;
210#endif
211
212 cmd.cmdidx = MMC_CMD_SEND_STATUS;
213 cmd.resp_type = MMC_RSP_R1;
Marek Vasutc4427392011-08-10 09:24:48 +0200214 if (!mmc_host_is_spi(mmc))
215 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000216 cmd.flags = 0;
217
218 do {
219 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzke31789322012-02-05 22:29:12 +0000220 if (!err) {
221 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
222 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
223 MMC_STATE_PRG)
224 break;
225 else if (cmd.response[0] & MMC_STATUS_MASK) {
226 printf("Status Error: 0x%08X\n",
227 cmd.response[0]);
228 return COMM_ERR;
229 }
230 } else if (--retries < 0)
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000231 return err;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000232
233 udelay(1000);
234
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000235 } while (timeout--);
236
Raffaele Recalcati894b1e22011-03-11 02:01:14 +0000237#ifdef CONFIG_MMC_TRACE
238 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
239 printf("CURR STATE:%d\n", status);
240#endif
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000241 if (!timeout) {
242 printf("Timeout waiting card ready\n");
243 return TIMEOUT;
244 }
245
246 return 0;
247}
248
Andy Flemingad347bb2008-10-30 16:41:01 -0500249int mmc_set_blocklen(struct mmc *mmc, int len)
250{
251 struct mmc_cmd cmd;
252
253 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
254 cmd.resp_type = MMC_RSP_R1;
255 cmd.cmdarg = len;
256 cmd.flags = 0;
257
258 return mmc_send_cmd(mmc, &cmd, NULL);
259}
260
261struct mmc *find_mmc_device(int dev_num)
262{
263 struct mmc *m;
264 struct list_head *entry;
265
266 list_for_each(entry, &mmc_devices) {
267 m = list_entry(entry, struct mmc, link);
268
269 if (m->block_dev.dev == dev_num)
270 return m;
271 }
272
273 printf("MMC Device %d not found\n", dev_num);
274
275 return NULL;
276}
277
Lei Wenea526762011-06-22 17:03:31 +0000278static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
279{
280 struct mmc_cmd cmd;
281 ulong end;
282 int err, start_cmd, end_cmd;
283
284 if (mmc->high_capacity)
285 end = start + blkcnt - 1;
286 else {
287 end = (start + blkcnt - 1) * mmc->write_bl_len;
288 start *= mmc->write_bl_len;
289 }
290
291 if (IS_SD(mmc)) {
292 start_cmd = SD_CMD_ERASE_WR_BLK_START;
293 end_cmd = SD_CMD_ERASE_WR_BLK_END;
294 } else {
295 start_cmd = MMC_CMD_ERASE_GROUP_START;
296 end_cmd = MMC_CMD_ERASE_GROUP_END;
297 }
298
299 cmd.cmdidx = start_cmd;
300 cmd.cmdarg = start;
301 cmd.resp_type = MMC_RSP_R1;
302 cmd.flags = 0;
303
304 err = mmc_send_cmd(mmc, &cmd, NULL);
305 if (err)
306 goto err_out;
307
308 cmd.cmdidx = end_cmd;
309 cmd.cmdarg = end;
310
311 err = mmc_send_cmd(mmc, &cmd, NULL);
312 if (err)
313 goto err_out;
314
315 cmd.cmdidx = MMC_CMD_ERASE;
316 cmd.cmdarg = SECURE_ERASE;
317 cmd.resp_type = MMC_RSP_R1b;
318
319 err = mmc_send_cmd(mmc, &cmd, NULL);
320 if (err)
321 goto err_out;
322
323 return 0;
324
325err_out:
326 puts("mmc erase failed\n");
327 return err;
328}
329
330static unsigned long
331mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
332{
333 int err = 0;
334 struct mmc *mmc = find_mmc_device(dev_num);
335 lbaint_t blk = 0, blk_r = 0;
Jerry Huang15c9ad92012-05-17 23:00:51 +0000336 int timeout = 1000;
Lei Wenea526762011-06-22 17:03:31 +0000337
338 if (!mmc)
339 return -1;
340
341 if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size))
342 printf("\n\nCaution! Your devices Erase group is 0x%x\n"
343 "The erase range would be change to 0x%lx~0x%lx\n\n",
344 mmc->erase_grp_size, start & ~(mmc->erase_grp_size - 1),
345 ((start + blkcnt + mmc->erase_grp_size)
346 & ~(mmc->erase_grp_size - 1)) - 1);
347
348 while (blk < blkcnt) {
349 blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
350 mmc->erase_grp_size : (blkcnt - blk);
351 err = mmc_erase_t(mmc, start + blk, blk_r);
352 if (err)
353 break;
354
355 blk += blk_r;
Jerry Huang15c9ad92012-05-17 23:00:51 +0000356
357 /* Waiting for the ready status */
358 if (mmc_send_status(mmc, timeout))
359 return 0;
Lei Wenea526762011-06-22 17:03:31 +0000360 }
361
362 return blk;
363}
364
Andy Flemingad347bb2008-10-30 16:41:01 -0500365static ulong
Lei Wen6b405b72010-10-14 13:38:11 +0800366mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
Andy Flemingad347bb2008-10-30 16:41:01 -0500367{
368 struct mmc_cmd cmd;
369 struct mmc_data data;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000370 int timeout = 1000;
Andy Flemingad347bb2008-10-30 16:41:01 -0500371
Lei Wene1cc9c82010-09-13 22:07:27 +0800372 if ((start + blkcnt) > mmc->block_dev.lba) {
Steve Sakomaneb288862010-10-28 09:00:26 -0700373 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wene1cc9c82010-09-13 22:07:27 +0800374 start + blkcnt, mmc->block_dev.lba);
375 return 0;
376 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500377
378 if (blkcnt > 1)
379 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
380 else
381 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
382
383 if (mmc->high_capacity)
384 cmd.cmdarg = start;
385 else
Steve Sakomaneb288862010-10-28 09:00:26 -0700386 cmd.cmdarg = start * mmc->write_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500387
388 cmd.resp_type = MMC_RSP_R1;
389 cmd.flags = 0;
390
391 data.src = src;
392 data.blocks = blkcnt;
Steve Sakomaneb288862010-10-28 09:00:26 -0700393 data.blocksize = mmc->write_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500394 data.flags = MMC_DATA_WRITE;
395
Steve Sakomaneb288862010-10-28 09:00:26 -0700396 if (mmc_send_cmd(mmc, &cmd, &data)) {
397 printf("mmc write failed\n");
398 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500399 }
400
Thomas Chou1254c3d2010-12-24 13:12:21 +0000401 /* SPI multiblock writes terminate using a special
402 * token, not a STOP_TRANSMISSION request.
403 */
404 if (!mmc_host_is_spi(mmc) && blkcnt > 1) {
Andy Flemingad347bb2008-10-30 16:41:01 -0500405 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
406 cmd.cmdarg = 0;
407 cmd.resp_type = MMC_RSP_R1b;
408 cmd.flags = 0;
Steve Sakomaneb288862010-10-28 09:00:26 -0700409 if (mmc_send_cmd(mmc, &cmd, NULL)) {
410 printf("mmc fail to send stop cmd\n");
411 return 0;
Lei Wen6b405b72010-10-14 13:38:11 +0800412 }
413 }
414
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000415 /* Waiting for the ready status */
416 if (mmc_send_status(mmc, timeout))
417 return 0;
418
Lei Wen6b405b72010-10-14 13:38:11 +0800419 return blkcnt;
420}
421
422static ulong
423mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
424{
Lei Wen6b405b72010-10-14 13:38:11 +0800425 lbaint_t cur, blocks_todo = blkcnt;
426
Steve Sakomaneb288862010-10-28 09:00:26 -0700427 struct mmc *mmc = find_mmc_device(dev_num);
Lei Wen6b405b72010-10-14 13:38:11 +0800428 if (!mmc)
Steve Sakomaneb288862010-10-28 09:00:26 -0700429 return 0;
Lei Wen6b405b72010-10-14 13:38:11 +0800430
Steve Sakomaneb288862010-10-28 09:00:26 -0700431 if (mmc_set_blocklen(mmc, mmc->write_bl_len))
432 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500433
Lei Wen6b405b72010-10-14 13:38:11 +0800434 do {
John Rigbyf2f43662011-04-18 05:50:08 +0000435 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Lei Wen6b405b72010-10-14 13:38:11 +0800436 if(mmc_write_blocks(mmc, start, cur, src) != cur)
Steve Sakomaneb288862010-10-28 09:00:26 -0700437 return 0;
Lei Wen6b405b72010-10-14 13:38:11 +0800438 blocks_todo -= cur;
439 start += cur;
440 src += cur * mmc->write_bl_len;
441 } while (blocks_todo > 0);
442
Andy Flemingad347bb2008-10-30 16:41:01 -0500443 return blkcnt;
444}
445
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700446int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
Andy Flemingad347bb2008-10-30 16:41:01 -0500447{
448 struct mmc_cmd cmd;
449 struct mmc_data data;
450
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700451 if (blkcnt > 1)
452 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
453 else
454 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Flemingad347bb2008-10-30 16:41:01 -0500455
456 if (mmc->high_capacity)
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700457 cmd.cmdarg = start;
Andy Flemingad347bb2008-10-30 16:41:01 -0500458 else
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700459 cmd.cmdarg = start * mmc->read_bl_len;
Andy Flemingad347bb2008-10-30 16:41:01 -0500460
461 cmd.resp_type = MMC_RSP_R1;
462 cmd.flags = 0;
463
464 data.dest = dst;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700465 data.blocks = blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500466 data.blocksize = mmc->read_bl_len;
467 data.flags = MMC_DATA_READ;
468
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700469 if (mmc_send_cmd(mmc, &cmd, &data))
470 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500471
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700472 if (blkcnt > 1) {
473 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
474 cmd.cmdarg = 0;
475 cmd.resp_type = MMC_RSP_R1b;
476 cmd.flags = 0;
477 if (mmc_send_cmd(mmc, &cmd, NULL)) {
478 printf("mmc fail to send stop cmd\n");
479 return 0;
480 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500481 }
482
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700483 return blkcnt;
Andy Flemingad347bb2008-10-30 16:41:01 -0500484}
485
486static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
487{
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700488 lbaint_t cur, blocks_todo = blkcnt;
489
490 if (blkcnt == 0)
491 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500492
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700493 struct mmc *mmc = find_mmc_device(dev_num);
Andy Flemingad347bb2008-10-30 16:41:01 -0500494 if (!mmc)
495 return 0;
496
Lei Wene1cc9c82010-09-13 22:07:27 +0800497 if ((start + blkcnt) > mmc->block_dev.lba) {
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700498 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wene1cc9c82010-09-13 22:07:27 +0800499 start + blkcnt, mmc->block_dev.lba);
500 return 0;
501 }
Andy Flemingad347bb2008-10-30 16:41:01 -0500502
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700503 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
Andy Flemingad347bb2008-10-30 16:41:01 -0500504 return 0;
Andy Flemingad347bb2008-10-30 16:41:01 -0500505
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700506 do {
John Rigbyf2f43662011-04-18 05:50:08 +0000507 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Alagu Sankarc25d1b92010-10-25 07:23:56 -0700508 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
509 return 0;
510 blocks_todo -= cur;
511 start += cur;
512 dst += cur * mmc->read_bl_len;
513 } while (blocks_todo > 0);
Andy Flemingad347bb2008-10-30 16:41:01 -0500514
515 return blkcnt;
516}
517
518int mmc_go_idle(struct mmc* mmc)
519{
520 struct mmc_cmd cmd;
521 int err;
522
523 udelay(1000);
524
525 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
526 cmd.cmdarg = 0;
527 cmd.resp_type = MMC_RSP_NONE;
528 cmd.flags = 0;
529
530 err = mmc_send_cmd(mmc, &cmd, NULL);
531
532 if (err)
533 return err;
534
535 udelay(2000);
536
537 return 0;
538}
539
540int
541sd_send_op_cond(struct mmc *mmc)
542{
543 int timeout = 1000;
544 int err;
545 struct mmc_cmd cmd;
546
547 do {
548 cmd.cmdidx = MMC_CMD_APP_CMD;
549 cmd.resp_type = MMC_RSP_R1;
550 cmd.cmdarg = 0;
551 cmd.flags = 0;
552
553 err = mmc_send_cmd(mmc, &cmd, NULL);
554
555 if (err)
556 return err;
557
558 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
559 cmd.resp_type = MMC_RSP_R3;
Stefano Babicf8e9a212010-01-20 18:20:39 +0100560
561 /*
562 * Most cards do not answer if some reserved bits
563 * in the ocr are set. However, Some controller
564 * can set bit 7 (reserved for low voltages), but
565 * how to manage low voltages SD card is not yet
566 * specified.
567 */
Thomas Chou1254c3d2010-12-24 13:12:21 +0000568 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
569 (mmc->voltages & 0xff8000);
Andy Flemingad347bb2008-10-30 16:41:01 -0500570
571 if (mmc->version == SD_VERSION_2)
572 cmd.cmdarg |= OCR_HCS;
573
574 err = mmc_send_cmd(mmc, &cmd, NULL);
575
576 if (err)
577 return err;
578
579 udelay(1000);
580 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
581
582 if (timeout <= 0)
583 return UNUSABLE_ERR;
584
585 if (mmc->version != SD_VERSION_2)
586 mmc->version = SD_VERSION_1_0;
587
Thomas Chou1254c3d2010-12-24 13:12:21 +0000588 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
589 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
590 cmd.resp_type = MMC_RSP_R3;
591 cmd.cmdarg = 0;
592 cmd.flags = 0;
593
594 err = mmc_send_cmd(mmc, &cmd, NULL);
595
596 if (err)
597 return err;
598 }
599
Rabin Vincentb6eed942009-04-05 13:30:56 +0530600 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500601
602 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
603 mmc->rca = 0;
604
605 return 0;
606}
607
608int mmc_send_op_cond(struct mmc *mmc)
609{
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000610 int timeout = 10000;
Andy Flemingad347bb2008-10-30 16:41:01 -0500611 struct mmc_cmd cmd;
612 int err;
613
614 /* Some cards seem to need this */
615 mmc_go_idle(mmc);
616
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000617 /* Asking to the card its capabilities */
618 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
619 cmd.resp_type = MMC_RSP_R3;
620 cmd.cmdarg = 0;
621 cmd.flags = 0;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200622
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000623 err = mmc_send_cmd(mmc, &cmd, NULL);
Wolfgang Denk80f70212011-05-19 22:21:41 +0200624
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000625 if (err)
626 return err;
Wolfgang Denk80f70212011-05-19 22:21:41 +0200627
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000628 udelay(1000);
Wolfgang Denk80f70212011-05-19 22:21:41 +0200629
Andy Flemingad347bb2008-10-30 16:41:01 -0500630 do {
631 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
632 cmd.resp_type = MMC_RSP_R3;
Raffaele Recalcati1df837e2011-03-11 02:01:13 +0000633 cmd.cmdarg = (mmc_host_is_spi(mmc) ? 0 :
634 (mmc->voltages &
635 (cmd.response[0] & OCR_VOLTAGE_MASK)) |
636 (cmd.response[0] & OCR_ACCESS_MODE));
Łukasz Majewski237823e2011-07-05 02:19:44 +0000637
638 if (mmc->host_caps & MMC_MODE_HC)
639 cmd.cmdarg |= OCR_HCS;
640
Andy Flemingad347bb2008-10-30 16:41:01 -0500641 cmd.flags = 0;
642
643 err = mmc_send_cmd(mmc, &cmd, NULL);
644
645 if (err)
646 return err;
647
648 udelay(1000);
649 } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
650
651 if (timeout <= 0)
652 return UNUSABLE_ERR;
653
Thomas Chou1254c3d2010-12-24 13:12:21 +0000654 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
655 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
656 cmd.resp_type = MMC_RSP_R3;
657 cmd.cmdarg = 0;
658 cmd.flags = 0;
659
660 err = mmc_send_cmd(mmc, &cmd, NULL);
661
662 if (err)
663 return err;
664 }
665
Andy Flemingad347bb2008-10-30 16:41:01 -0500666 mmc->version = MMC_VERSION_UNKNOWN;
Rabin Vincentb6eed942009-04-05 13:30:56 +0530667 mmc->ocr = cmd.response[0];
Andy Flemingad347bb2008-10-30 16:41:01 -0500668
669 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
670 mmc->rca = 0;
671
672 return 0;
673}
674
675
676int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)
677{
678 struct mmc_cmd cmd;
679 struct mmc_data data;
680 int err;
681
682 /* Get the Card Status Register */
683 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
684 cmd.resp_type = MMC_RSP_R1;
685 cmd.cmdarg = 0;
686 cmd.flags = 0;
687
688 data.dest = ext_csd;
689 data.blocks = 1;
690 data.blocksize = 512;
691 data.flags = MMC_DATA_READ;
692
693 err = mmc_send_cmd(mmc, &cmd, &data);
694
695 return err;
696}
697
698
699int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
700{
701 struct mmc_cmd cmd;
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000702 int timeout = 1000;
703 int ret;
Andy Flemingad347bb2008-10-30 16:41:01 -0500704
705 cmd.cmdidx = MMC_CMD_SWITCH;
706 cmd.resp_type = MMC_RSP_R1b;
707 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000708 (index << 16) |
709 (value << 8);
Andy Flemingad347bb2008-10-30 16:41:01 -0500710 cmd.flags = 0;
711
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000712 ret = mmc_send_cmd(mmc, &cmd, NULL);
713
714 /* Waiting for the ready status */
Jan Kloetzke4e929dd2012-02-05 22:29:11 +0000715 if (!ret)
716 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000717
718 return ret;
719
Andy Flemingad347bb2008-10-30 16:41:01 -0500720}
721
722int mmc_change_freq(struct mmc *mmc)
723{
Anton staaf82d04cb2011-10-04 11:24:50 +0000724 ALLOC_CACHE_ALIGN_BUFFER(char, ext_csd, 512);
Andy Flemingad347bb2008-10-30 16:41:01 -0500725 char cardtype;
726 int err;
727
728 mmc->card_caps = 0;
729
Thomas Chou1254c3d2010-12-24 13:12:21 +0000730 if (mmc_host_is_spi(mmc))
731 return 0;
732
Andy Flemingad347bb2008-10-30 16:41:01 -0500733 /* Only version 4 supports high-speed */
734 if (mmc->version < MMC_VERSION_4)
735 return 0;
736
Andy Flemingad347bb2008-10-30 16:41:01 -0500737 err = mmc_send_ext_csd(mmc, ext_csd);
738
739 if (err)
740 return err;
741
Lei Wen217467f2011-10-03 20:35:10 +0000742 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -0500743
744 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
745
746 if (err)
747 return err;
748
749 /* Now check to see that it worked */
750 err = mmc_send_ext_csd(mmc, ext_csd);
751
752 if (err)
753 return err;
754
755 /* No high-speed support */
Lei Wen217467f2011-10-03 20:35:10 +0000756 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Flemingad347bb2008-10-30 16:41:01 -0500757 return 0;
758
759 /* High Speed is set, there are two types: 52MHz and 26MHz */
760 if (cardtype & MMC_HS_52MHZ)
761 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
762 else
763 mmc->card_caps |= MMC_MODE_HS;
764
765 return 0;
766}
767
Lei Wen31b99802011-05-02 16:26:26 +0000768int mmc_switch_part(int dev_num, unsigned int part_num)
769{
770 struct mmc *mmc = find_mmc_device(dev_num);
771
772 if (!mmc)
773 return -1;
774
775 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
776 (mmc->part_config & ~PART_ACCESS_MASK)
777 | (part_num & PART_ACCESS_MASK));
778}
779
Thierry Redingb9c8b772012-01-02 01:15:37 +0000780int mmc_getcd(struct mmc *mmc)
781{
782 int cd;
783
784 cd = board_mmc_getcd(mmc);
785
786 if ((cd < 0) && mmc->getcd)
787 cd = mmc->getcd(mmc);
788
789 return cd;
790}
791
Andy Flemingad347bb2008-10-30 16:41:01 -0500792int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
793{
794 struct mmc_cmd cmd;
795 struct mmc_data data;
796
797 /* Switch the frequency */
798 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
799 cmd.resp_type = MMC_RSP_R1;
800 cmd.cmdarg = (mode << 31) | 0xffffff;
801 cmd.cmdarg &= ~(0xf << (group * 4));
802 cmd.cmdarg |= value << (group * 4);
803 cmd.flags = 0;
804
805 data.dest = (char *)resp;
806 data.blocksize = 64;
807 data.blocks = 1;
808 data.flags = MMC_DATA_READ;
809
810 return mmc_send_cmd(mmc, &cmd, &data);
811}
812
813
814int sd_change_freq(struct mmc *mmc)
815{
816 int err;
817 struct mmc_cmd cmd;
Anton staaf9b00f0d2011-10-03 13:54:59 +0000818 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
819 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Flemingad347bb2008-10-30 16:41:01 -0500820 struct mmc_data data;
821 int timeout;
822
823 mmc->card_caps = 0;
824
Thomas Chou1254c3d2010-12-24 13:12:21 +0000825 if (mmc_host_is_spi(mmc))
826 return 0;
827
Andy Flemingad347bb2008-10-30 16:41:01 -0500828 /* Read the SCR to find out if this card supports higher speeds */
829 cmd.cmdidx = MMC_CMD_APP_CMD;
830 cmd.resp_type = MMC_RSP_R1;
831 cmd.cmdarg = mmc->rca << 16;
832 cmd.flags = 0;
833
834 err = mmc_send_cmd(mmc, &cmd, NULL);
835
836 if (err)
837 return err;
838
839 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
840 cmd.resp_type = MMC_RSP_R1;
841 cmd.cmdarg = 0;
842 cmd.flags = 0;
843
844 timeout = 3;
845
846retry_scr:
Anton staaf9b00f0d2011-10-03 13:54:59 +0000847 data.dest = (char *)scr;
Andy Flemingad347bb2008-10-30 16:41:01 -0500848 data.blocksize = 8;
849 data.blocks = 1;
850 data.flags = MMC_DATA_READ;
851
852 err = mmc_send_cmd(mmc, &cmd, &data);
853
854 if (err) {
855 if (timeout--)
856 goto retry_scr;
857
858 return err;
859 }
860
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300861 mmc->scr[0] = __be32_to_cpu(scr[0]);
862 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Flemingad347bb2008-10-30 16:41:01 -0500863
864 switch ((mmc->scr[0] >> 24) & 0xf) {
865 case 0:
866 mmc->version = SD_VERSION_1_0;
867 break;
868 case 1:
869 mmc->version = SD_VERSION_1_10;
870 break;
871 case 2:
872 mmc->version = SD_VERSION_2;
873 break;
874 default:
875 mmc->version = SD_VERSION_1_0;
876 break;
877 }
878
Alagu Sankar24bb5ab2010-05-12 15:08:24 +0530879 if (mmc->scr[0] & SD_DATA_4BIT)
880 mmc->card_caps |= MMC_MODE_4BIT;
881
Andy Flemingad347bb2008-10-30 16:41:01 -0500882 /* Version 1.0 doesn't support switching */
883 if (mmc->version == SD_VERSION_1_0)
884 return 0;
885
886 timeout = 4;
887 while (timeout--) {
888 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaf9b00f0d2011-10-03 13:54:59 +0000889 (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500890
891 if (err)
892 return err;
893
894 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300895 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Flemingad347bb2008-10-30 16:41:01 -0500896 break;
897 }
898
Andy Flemingad347bb2008-10-30 16:41:01 -0500899 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300900 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Flemingad347bb2008-10-30 16:41:01 -0500901 return 0;
902
Macpaul Lin24e92ec2011-11-28 16:31:09 +0000903 /*
904 * If the host doesn't support SD_HIGHSPEED, do not switch card to
905 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
906 * This can avoid furthur problem when the card runs in different
907 * mode between the host.
908 */
909 if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
910 (mmc->host_caps & MMC_MODE_HS)))
911 return 0;
912
Anton staaf9b00f0d2011-10-03 13:54:59 +0000913 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Flemingad347bb2008-10-30 16:41:01 -0500914
915 if (err)
916 return err;
917
Yauhen Kharuzhy6e8edf42009-05-07 00:43:30 +0300918 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Flemingad347bb2008-10-30 16:41:01 -0500919 mmc->card_caps |= MMC_MODE_HS;
920
921 return 0;
922}
923
924/* frequency bases */
925/* divided by 10 to be nice to platforms without floating point */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000926static const int fbase[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500927 10000,
928 100000,
929 1000000,
930 10000000,
931};
932
933/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
934 * to platforms without floating point.
935 */
Mike Frysingerb588caf2010-10-20 01:15:53 +0000936static const int multipliers[] = {
Andy Flemingad347bb2008-10-30 16:41:01 -0500937 0, /* reserved */
938 10,
939 12,
940 13,
941 15,
942 20,
943 25,
944 30,
945 35,
946 40,
947 45,
948 50,
949 55,
950 60,
951 70,
952 80,
953};
954
955void mmc_set_ios(struct mmc *mmc)
956{
957 mmc->set_ios(mmc);
958}
959
960void mmc_set_clock(struct mmc *mmc, uint clock)
961{
962 if (clock > mmc->f_max)
963 clock = mmc->f_max;
964
965 if (clock < mmc->f_min)
966 clock = mmc->f_min;
967
968 mmc->clock = clock;
969
970 mmc_set_ios(mmc);
971}
972
973void mmc_set_bus_width(struct mmc *mmc, uint width)
974{
975 mmc->bus_width = width;
976
977 mmc_set_ios(mmc);
978}
979
980int mmc_startup(struct mmc *mmc)
981{
Lei Wen4f5a6a52011-10-03 20:35:11 +0000982 int err, width;
Andy Flemingad347bb2008-10-30 16:41:01 -0500983 uint mult, freq;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +0000984 u64 cmult, csize, capacity;
Andy Flemingad347bb2008-10-30 16:41:01 -0500985 struct mmc_cmd cmd;
Anton staaf82d04cb2011-10-04 11:24:50 +0000986 ALLOC_CACHE_ALIGN_BUFFER(char, ext_csd, 512);
Lei Wen4f5a6a52011-10-03 20:35:11 +0000987 ALLOC_CACHE_ALIGN_BUFFER(char, test_csd, 512);
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +0000988 int timeout = 1000;
Andy Flemingad347bb2008-10-30 16:41:01 -0500989
Thomas Chou1254c3d2010-12-24 13:12:21 +0000990#ifdef CONFIG_MMC_SPI_CRC_ON
991 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
992 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
993 cmd.resp_type = MMC_RSP_R1;
994 cmd.cmdarg = 1;
995 cmd.flags = 0;
996 err = mmc_send_cmd(mmc, &cmd, NULL);
997
998 if (err)
999 return err;
1000 }
1001#endif
1002
Andy Flemingad347bb2008-10-30 16:41:01 -05001003 /* Put the Card in Identify Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001004 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
1005 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Flemingad347bb2008-10-30 16:41:01 -05001006 cmd.resp_type = MMC_RSP_R2;
1007 cmd.cmdarg = 0;
1008 cmd.flags = 0;
1009
1010 err = mmc_send_cmd(mmc, &cmd, NULL);
1011
1012 if (err)
1013 return err;
1014
1015 memcpy(mmc->cid, cmd.response, 16);
1016
1017 /*
1018 * For MMC cards, set the Relative Address.
1019 * For SD cards, get the Relatvie Address.
1020 * This also puts the cards into Standby State
1021 */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001022 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1023 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
1024 cmd.cmdarg = mmc->rca << 16;
1025 cmd.resp_type = MMC_RSP_R6;
1026 cmd.flags = 0;
Andy Flemingad347bb2008-10-30 16:41:01 -05001027
Thomas Chou1254c3d2010-12-24 13:12:21 +00001028 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001029
Thomas Chou1254c3d2010-12-24 13:12:21 +00001030 if (err)
1031 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001032
Thomas Chou1254c3d2010-12-24 13:12:21 +00001033 if (IS_SD(mmc))
1034 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
1035 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001036
1037 /* Get the Card-Specific Data */
1038 cmd.cmdidx = MMC_CMD_SEND_CSD;
1039 cmd.resp_type = MMC_RSP_R2;
1040 cmd.cmdarg = mmc->rca << 16;
1041 cmd.flags = 0;
1042
1043 err = mmc_send_cmd(mmc, &cmd, NULL);
1044
Raffaele Recalcati01a0dc62011-03-11 02:01:12 +00001045 /* Waiting for the ready status */
1046 mmc_send_status(mmc, timeout);
1047
Andy Flemingad347bb2008-10-30 16:41:01 -05001048 if (err)
1049 return err;
1050
Rabin Vincentb6eed942009-04-05 13:30:56 +05301051 mmc->csd[0] = cmd.response[0];
1052 mmc->csd[1] = cmd.response[1];
1053 mmc->csd[2] = cmd.response[2];
1054 mmc->csd[3] = cmd.response[3];
Andy Flemingad347bb2008-10-30 16:41:01 -05001055
1056 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301057 int version = (cmd.response[0] >> 26) & 0xf;
Andy Flemingad347bb2008-10-30 16:41:01 -05001058
1059 switch (version) {
1060 case 0:
1061 mmc->version = MMC_VERSION_1_2;
1062 break;
1063 case 1:
1064 mmc->version = MMC_VERSION_1_4;
1065 break;
1066 case 2:
1067 mmc->version = MMC_VERSION_2_2;
1068 break;
1069 case 3:
1070 mmc->version = MMC_VERSION_3;
1071 break;
1072 case 4:
1073 mmc->version = MMC_VERSION_4;
1074 break;
1075 default:
1076 mmc->version = MMC_VERSION_1_2;
1077 break;
1078 }
1079 }
1080
1081 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301082 freq = fbase[(cmd.response[0] & 0x7)];
1083 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Flemingad347bb2008-10-30 16:41:01 -05001084
1085 mmc->tran_speed = freq * mult;
1086
Rabin Vincentb6eed942009-04-05 13:30:56 +05301087 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001088
1089 if (IS_SD(mmc))
1090 mmc->write_bl_len = mmc->read_bl_len;
1091 else
Rabin Vincentb6eed942009-04-05 13:30:56 +05301092 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001093
1094 if (mmc->high_capacity) {
1095 csize = (mmc->csd[1] & 0x3f) << 16
1096 | (mmc->csd[2] & 0xffff0000) >> 16;
1097 cmult = 8;
1098 } else {
1099 csize = (mmc->csd[1] & 0x3ff) << 2
1100 | (mmc->csd[2] & 0xc0000000) >> 30;
1101 cmult = (mmc->csd[2] & 0x00038000) >> 15;
1102 }
1103
1104 mmc->capacity = (csize + 1) << (cmult + 2);
1105 mmc->capacity *= mmc->read_bl_len;
1106
1107 if (mmc->read_bl_len > 512)
1108 mmc->read_bl_len = 512;
1109
1110 if (mmc->write_bl_len > 512)
1111 mmc->write_bl_len = 512;
1112
1113 /* Select the card, and put it into Transfer Mode */
Thomas Chou1254c3d2010-12-24 13:12:21 +00001114 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1115 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargav4a32fba2011-10-05 03:13:23 +00001116 cmd.resp_type = MMC_RSP_R1;
Thomas Chou1254c3d2010-12-24 13:12:21 +00001117 cmd.cmdarg = mmc->rca << 16;
1118 cmd.flags = 0;
1119 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Flemingad347bb2008-10-30 16:41:01 -05001120
Thomas Chou1254c3d2010-12-24 13:12:21 +00001121 if (err)
1122 return err;
1123 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001124
Lei Wenea526762011-06-22 17:03:31 +00001125 /*
1126 * For SD, its erase group is always one sector
1127 */
1128 mmc->erase_grp_size = 1;
Lei Wen31b99802011-05-02 16:26:26 +00001129 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301130 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1131 /* check ext_csd version and capacity */
1132 err = mmc_send_ext_csd(mmc, ext_csd);
Lei Wen217467f2011-10-03 20:35:10 +00001133 if (!err & (ext_csd[EXT_CSD_REV] >= 2)) {
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001134 /*
1135 * According to the JEDEC Standard, the value of
1136 * ext_csd's capacity is valid if the value is more
1137 * than 2GB
1138 */
Lei Wen217467f2011-10-03 20:35:10 +00001139 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1140 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1141 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1142 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001143 capacity *= 512;
Łukasz Majewski237823e2011-07-05 02:19:44 +00001144 if ((capacity >> 20) > 2 * 1024)
Yoshihiro Shimoda7d88de52011-07-04 22:13:26 +00001145 mmc->capacity = capacity;
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301146 }
Lei Wen31b99802011-05-02 16:26:26 +00001147
Lei Wenea526762011-06-22 17:03:31 +00001148 /*
1149 * Check whether GROUP_DEF is set, if yes, read out
1150 * group size from ext_csd directly, or calculate
1151 * the group size from the csd value.
1152 */
Lei Wen217467f2011-10-03 20:35:10 +00001153 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF])
1154 mmc->erase_grp_size =
1155 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512 * 1024;
Lei Wenea526762011-06-22 17:03:31 +00001156 else {
1157 int erase_gsz, erase_gmul;
1158 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1159 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1160 mmc->erase_grp_size = (erase_gsz + 1)
1161 * (erase_gmul + 1);
1162 }
1163
Lei Wen31b99802011-05-02 16:26:26 +00001164 /* store the partition info of emmc */
Lei Wen217467f2011-10-03 20:35:10 +00001165 if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT)
1166 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Sukumar Ghorai232293c2010-09-20 18:29:29 +05301167 }
1168
Andy Flemingad347bb2008-10-30 16:41:01 -05001169 if (IS_SD(mmc))
1170 err = sd_change_freq(mmc);
1171 else
1172 err = mmc_change_freq(mmc);
1173
1174 if (err)
1175 return err;
1176
1177 /* Restrict card's capabilities by what the host can do */
1178 mmc->card_caps &= mmc->host_caps;
1179
1180 if (IS_SD(mmc)) {
1181 if (mmc->card_caps & MMC_MODE_4BIT) {
1182 cmd.cmdidx = MMC_CMD_APP_CMD;
1183 cmd.resp_type = MMC_RSP_R1;
1184 cmd.cmdarg = mmc->rca << 16;
1185 cmd.flags = 0;
1186
1187 err = mmc_send_cmd(mmc, &cmd, NULL);
1188 if (err)
1189 return err;
1190
1191 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1192 cmd.resp_type = MMC_RSP_R1;
1193 cmd.cmdarg = 2;
1194 cmd.flags = 0;
1195 err = mmc_send_cmd(mmc, &cmd, NULL);
1196 if (err)
1197 return err;
1198
1199 mmc_set_bus_width(mmc, 4);
1200 }
1201
1202 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001203 mmc->tran_speed = 50000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001204 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001205 mmc->tran_speed = 25000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001206 } else {
Łukasz Majewskib6fe0dc2012-03-12 22:07:18 +00001207 width = ((mmc->host_caps & MMC_MODE_MASK_WIDTH_BITS) >>
1208 MMC_MODE_WIDTH_BITS_SHIFT);
1209 for (; width >= 0; width--) {
Andy Flemingad347bb2008-10-30 16:41:01 -05001210 /* Set the card to use 4 bit*/
1211 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Lei Wen4f5a6a52011-10-03 20:35:11 +00001212 EXT_CSD_BUS_WIDTH, width);
Andy Flemingad347bb2008-10-30 16:41:01 -05001213
1214 if (err)
Lei Wen4f5a6a52011-10-03 20:35:11 +00001215 continue;
Andy Flemingad347bb2008-10-30 16:41:01 -05001216
Lei Wen4f5a6a52011-10-03 20:35:11 +00001217 if (!width) {
1218 mmc_set_bus_width(mmc, 1);
1219 break;
1220 } else
1221 mmc_set_bus_width(mmc, 4 * width);
Andy Flemingad347bb2008-10-30 16:41:01 -05001222
Lei Wen4f5a6a52011-10-03 20:35:11 +00001223 err = mmc_send_ext_csd(mmc, test_csd);
1224 if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1225 == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1226 && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1227 == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1228 && ext_csd[EXT_CSD_REV] \
1229 == test_csd[EXT_CSD_REV]
1230 && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1231 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1232 && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1233 &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
Andy Flemingad347bb2008-10-30 16:41:01 -05001234
Lei Wen4f5a6a52011-10-03 20:35:11 +00001235 mmc->card_caps |= width;
1236 break;
1237 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001238 }
1239
1240 if (mmc->card_caps & MMC_MODE_HS) {
1241 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001242 mmc->tran_speed = 52000000;
Andy Flemingad347bb2008-10-30 16:41:01 -05001243 else
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001244 mmc->tran_speed = 26000000;
1245 }
Andy Flemingad347bb2008-10-30 16:41:01 -05001246 }
1247
Jaehoon Chunge1d4c7b2012-03-26 21:16:03 +00001248 mmc_set_clock(mmc, mmc->tran_speed);
1249
Andy Flemingad347bb2008-10-30 16:41:01 -05001250 /* fill in device description */
1251 mmc->block_dev.lun = 0;
1252 mmc->block_dev.type = 0;
1253 mmc->block_dev.blksz = mmc->read_bl_len;
Rabin Vincent69d4e2c2009-04-05 13:30:54 +05301254 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Rabin Vincentbdf7a682009-04-05 13:30:55 +05301255 sprintf(mmc->block_dev.vendor, "Man %06x Snr %08x", mmc->cid[0] >> 8,
1256 (mmc->cid[2] << 8) | (mmc->cid[3] >> 24));
1257 sprintf(mmc->block_dev.product, "%c%c%c%c%c", mmc->cid[0] & 0xff,
1258 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1259 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
1260 sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
1261 (mmc->cid[2] >> 24) & 0xf);
Andy Flemingad347bb2008-10-30 16:41:01 -05001262 init_part(&mmc->block_dev);
1263
1264 return 0;
1265}
1266
1267int mmc_send_if_cond(struct mmc *mmc)
1268{
1269 struct mmc_cmd cmd;
1270 int err;
1271
1272 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1273 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1274 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
1275 cmd.resp_type = MMC_RSP_R7;
1276 cmd.flags = 0;
1277
1278 err = mmc_send_cmd(mmc, &cmd, NULL);
1279
1280 if (err)
1281 return err;
1282
Rabin Vincentb6eed942009-04-05 13:30:56 +05301283 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Flemingad347bb2008-10-30 16:41:01 -05001284 return UNUSABLE_ERR;
1285 else
1286 mmc->version = SD_VERSION_2;
1287
1288 return 0;
1289}
1290
1291int mmc_register(struct mmc *mmc)
1292{
1293 /* Setup the universal parts of the block interface just once */
1294 mmc->block_dev.if_type = IF_TYPE_MMC;
1295 mmc->block_dev.dev = cur_dev_num++;
1296 mmc->block_dev.removable = 1;
1297 mmc->block_dev.block_read = mmc_bread;
1298 mmc->block_dev.block_write = mmc_bwrite;
Lei Wenea526762011-06-22 17:03:31 +00001299 mmc->block_dev.block_erase = mmc_berase;
John Rigbyf2f43662011-04-18 05:50:08 +00001300 if (!mmc->b_max)
1301 mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
Andy Flemingad347bb2008-10-30 16:41:01 -05001302
1303 INIT_LIST_HEAD (&mmc->link);
1304
1305 list_add_tail (&mmc->link, &mmc_devices);
1306
1307 return 0;
1308}
1309
Matthew McClintock6252b4f2011-05-24 05:31:19 +00001310#ifdef CONFIG_PARTITIONS
Andy Flemingad347bb2008-10-30 16:41:01 -05001311block_dev_desc_t *mmc_get_dev(int dev)
1312{
1313 struct mmc *mmc = find_mmc_device(dev);
Łukasz Majewski65b04cf2012-04-19 02:39:18 +00001314 if (!mmc)
1315 return NULL;
Andy Flemingad347bb2008-10-30 16:41:01 -05001316
Łukasz Majewski65b04cf2012-04-19 02:39:18 +00001317 mmc_init(mmc);
1318 return &mmc->block_dev;
Andy Flemingad347bb2008-10-30 16:41:01 -05001319}
Matthew McClintock6252b4f2011-05-24 05:31:19 +00001320#endif
Andy Flemingad347bb2008-10-30 16:41:01 -05001321
1322int mmc_init(struct mmc *mmc)
1323{
Macpaul Lin028bde12011-11-14 23:35:39 +00001324 int err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001325
Thierry Redingb9c8b772012-01-02 01:15:37 +00001326 if (mmc_getcd(mmc) == 0) {
1327 mmc->has_init = 0;
1328 printf("MMC: no card present\n");
1329 return NO_CARD_ERR;
1330 }
1331
Lei Wen31b99802011-05-02 16:26:26 +00001332 if (mmc->has_init)
1333 return 0;
1334
Andy Flemingad347bb2008-10-30 16:41:01 -05001335 err = mmc->init(mmc);
1336
1337 if (err)
1338 return err;
1339
Ilya Yanok8459aab2009-06-29 17:53:16 +04001340 mmc_set_bus_width(mmc, 1);
1341 mmc_set_clock(mmc, 1);
1342
Andy Flemingad347bb2008-10-30 16:41:01 -05001343 /* Reset the Card */
1344 err = mmc_go_idle(mmc);
1345
1346 if (err)
1347 return err;
1348
Lei Wen31b99802011-05-02 16:26:26 +00001349 /* The internal partition reset to user partition(0) at every CMD0*/
1350 mmc->part_num = 0;
1351
Andy Flemingad347bb2008-10-30 16:41:01 -05001352 /* Test for SD version 2 */
Macpaul Lin028bde12011-11-14 23:35:39 +00001353 err = mmc_send_if_cond(mmc);
Andy Flemingad347bb2008-10-30 16:41:01 -05001354
Andy Flemingad347bb2008-10-30 16:41:01 -05001355 /* Now try to get the SD card's operating condition */
1356 err = sd_send_op_cond(mmc);
1357
1358 /* If the command timed out, we check for an MMC card */
1359 if (err == TIMEOUT) {
1360 err = mmc_send_op_cond(mmc);
1361
1362 if (err) {
1363 printf("Card did not respond to voltage select!\n");
1364 return UNUSABLE_ERR;
1365 }
1366 }
1367
Lei Wen31b99802011-05-02 16:26:26 +00001368 err = mmc_startup(mmc);
1369 if (err)
1370 mmc->has_init = 0;
1371 else
1372 mmc->has_init = 1;
1373 return err;
Andy Flemingad347bb2008-10-30 16:41:01 -05001374}
1375
1376/*
1377 * CPU and board-specific MMC initializations. Aliased function
1378 * signals caller to move on
1379 */
1380static int __def_mmc_init(bd_t *bis)
1381{
1382 return -1;
1383}
1384
Peter Tyser21d2cd22009-04-20 11:08:46 -05001385int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1386int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
Andy Flemingad347bb2008-10-30 16:41:01 -05001387
1388void print_mmc_devices(char separator)
1389{
1390 struct mmc *m;
1391 struct list_head *entry;
1392
1393 list_for_each(entry, &mmc_devices) {
1394 m = list_entry(entry, struct mmc, link);
1395
1396 printf("%s: %d", m->name, m->block_dev.dev);
1397
1398 if (entry->next != &mmc_devices)
1399 printf("%c ", separator);
1400 }
1401
1402 printf("\n");
1403}
1404
Lei Wend430d7c2011-05-02 16:26:25 +00001405int get_mmc_num(void)
1406{
1407 return cur_dev_num;
1408}
1409
Andy Flemingad347bb2008-10-30 16:41:01 -05001410int mmc_initialize(bd_t *bis)
1411{
1412 INIT_LIST_HEAD (&mmc_devices);
1413 cur_dev_num = 0;
1414
1415 if (board_mmc_init(bis) < 0)
1416 cpu_mmc_init(bis);
1417
1418 print_mmc_devices(',');
1419
1420 return 0;
1421}