blob: 5ffd8c59e6ebfed812e459a422477c6b3d92b4e2 [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
Thierry Reding314284b2012-01-02 01:15:36 +000043int __board_mmc_getcd(struct mmc *mmc) {
Stefano Babic11fdade2010-02-05 15:04:43 +010044 return -1;
45}
46
Thierry Reding314284b2012-01-02 01:15:36 +000047int board_mmc_getcd(struct mmc *mmc)__attribute__((weak,
Stefano Babic11fdade2010-02-05 15:04:43 +010048 alias("__board_mmc_getcd")));
49
Kim Phillipsfdbb8732012-10-29 13:34:43 +000050static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
51 struct mmc_data *data)
Andy Fleming272cc702008-10-30 16:41:01 -050052{
Marek Vasut8635ff92012-03-15 18:41:35 +000053 struct mmc_data backup;
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000054 int ret;
Marek Vasut8635ff92012-03-15 18:41:35 +000055
56 memset(&backup, 0, sizeof(backup));
57
Marek Vasut8635ff92012-03-15 18:41:35 +000058#ifdef CONFIG_MMC_TRACE
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000059 int i;
60 u8 *ptr;
61
62 printf("CMD_SEND:%d\n", cmd->cmdidx);
63 printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000064 ret = mmc->send_cmd(mmc, cmd, data);
65 switch (cmd->resp_type) {
66 case MMC_RSP_NONE:
67 printf("\t\tMMC_RSP_NONE\n");
68 break;
69 case MMC_RSP_R1:
70 printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
71 cmd->response[0]);
72 break;
73 case MMC_RSP_R1b:
74 printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
75 cmd->response[0]);
76 break;
77 case MMC_RSP_R2:
78 printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
79 cmd->response[0]);
80 printf("\t\t \t\t 0x%08X \n",
81 cmd->response[1]);
82 printf("\t\t \t\t 0x%08X \n",
83 cmd->response[2]);
84 printf("\t\t \t\t 0x%08X \n",
85 cmd->response[3]);
86 printf("\n");
87 printf("\t\t\t\t\tDUMPING DATA\n");
88 for (i = 0; i < 4; i++) {
89 int j;
90 printf("\t\t\t\t\t%03d - ", i*4);
Dirk Behme146bec72012-03-08 02:35:34 +000091 ptr = (u8 *)&cmd->response[i];
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +000092 ptr += 3;
93 for (j = 0; j < 4; j++)
94 printf("%02X ", *ptr--);
95 printf("\n");
96 }
97 break;
98 case MMC_RSP_R3:
99 printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
100 cmd->response[0]);
101 break;
102 default:
103 printf("\t\tERROR MMC rsp not supported\n");
104 break;
105 }
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000106#else
Marek Vasut8635ff92012-03-15 18:41:35 +0000107 ret = mmc->send_cmd(mmc, cmd, data);
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000108#endif
Marek Vasut8635ff92012-03-15 18:41:35 +0000109 return ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500110}
111
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000112static int mmc_send_status(struct mmc *mmc, int timeout)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000113{
114 struct mmc_cmd cmd;
Jan Kloetzked617c422012-02-05 22:29:12 +0000115 int err, retries = 5;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000116#ifdef CONFIG_MMC_TRACE
117 int status;
118#endif
119
120 cmd.cmdidx = MMC_CMD_SEND_STATUS;
121 cmd.resp_type = MMC_RSP_R1;
Marek Vasutaaf3d412011-08-10 09:24:48 +0200122 if (!mmc_host_is_spi(mmc))
123 cmd.cmdarg = mmc->rca << 16;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000124
125 do {
126 err = mmc_send_cmd(mmc, &cmd, NULL);
Jan Kloetzked617c422012-02-05 22:29:12 +0000127 if (!err) {
128 if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
129 (cmd.response[0] & MMC_STATUS_CURR_STATE) !=
130 MMC_STATE_PRG)
131 break;
132 else if (cmd.response[0] & MMC_STATUS_MASK) {
133 printf("Status Error: 0x%08X\n",
134 cmd.response[0]);
135 return COMM_ERR;
136 }
137 } else if (--retries < 0)
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000138 return err;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000139
140 udelay(1000);
141
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000142 } while (timeout--);
143
Raffaele Recalcati5db2fe32011-03-11 02:01:14 +0000144#ifdef CONFIG_MMC_TRACE
145 status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
146 printf("CURR STATE:%d\n", status);
147#endif
Jongman Heo5b0c9422012-06-03 21:32:13 +0000148 if (timeout <= 0) {
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000149 printf("Timeout waiting card ready\n");
150 return TIMEOUT;
151 }
152
153 return 0;
154}
155
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000156static int mmc_set_blocklen(struct mmc *mmc, int len)
Andy Fleming272cc702008-10-30 16:41:01 -0500157{
158 struct mmc_cmd cmd;
159
160 cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
161 cmd.resp_type = MMC_RSP_R1;
162 cmd.cmdarg = len;
Andy Fleming272cc702008-10-30 16:41:01 -0500163
164 return mmc_send_cmd(mmc, &cmd, NULL);
165}
166
167struct mmc *find_mmc_device(int dev_num)
168{
169 struct mmc *m;
170 struct list_head *entry;
171
172 list_for_each(entry, &mmc_devices) {
173 m = list_entry(entry, struct mmc, link);
174
175 if (m->block_dev.dev == dev_num)
176 return m;
177 }
178
179 printf("MMC Device %d not found\n", dev_num);
180
181 return NULL;
182}
183
Lei Wene6f99a52011-06-22 17:03:31 +0000184static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt)
185{
186 struct mmc_cmd cmd;
187 ulong end;
188 int err, start_cmd, end_cmd;
189
190 if (mmc->high_capacity)
191 end = start + blkcnt - 1;
192 else {
193 end = (start + blkcnt - 1) * mmc->write_bl_len;
194 start *= mmc->write_bl_len;
195 }
196
197 if (IS_SD(mmc)) {
198 start_cmd = SD_CMD_ERASE_WR_BLK_START;
199 end_cmd = SD_CMD_ERASE_WR_BLK_END;
200 } else {
201 start_cmd = MMC_CMD_ERASE_GROUP_START;
202 end_cmd = MMC_CMD_ERASE_GROUP_END;
203 }
204
205 cmd.cmdidx = start_cmd;
206 cmd.cmdarg = start;
207 cmd.resp_type = MMC_RSP_R1;
Lei Wene6f99a52011-06-22 17:03:31 +0000208
209 err = mmc_send_cmd(mmc, &cmd, NULL);
210 if (err)
211 goto err_out;
212
213 cmd.cmdidx = end_cmd;
214 cmd.cmdarg = end;
215
216 err = mmc_send_cmd(mmc, &cmd, NULL);
217 if (err)
218 goto err_out;
219
220 cmd.cmdidx = MMC_CMD_ERASE;
221 cmd.cmdarg = SECURE_ERASE;
222 cmd.resp_type = MMC_RSP_R1b;
223
224 err = mmc_send_cmd(mmc, &cmd, NULL);
225 if (err)
226 goto err_out;
227
228 return 0;
229
230err_out:
231 puts("mmc erase failed\n");
232 return err;
233}
234
235static unsigned long
236mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
237{
238 int err = 0;
239 struct mmc *mmc = find_mmc_device(dev_num);
240 lbaint_t blk = 0, blk_r = 0;
Jerry Huangd2d8afa2012-05-17 23:00:51 +0000241 int timeout = 1000;
Lei Wene6f99a52011-06-22 17:03:31 +0000242
243 if (!mmc)
244 return -1;
245
246 if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size))
247 printf("\n\nCaution! Your devices Erase group is 0x%x\n"
248 "The erase range would be change to 0x%lx~0x%lx\n\n",
249 mmc->erase_grp_size, start & ~(mmc->erase_grp_size - 1),
250 ((start + blkcnt + mmc->erase_grp_size)
251 & ~(mmc->erase_grp_size - 1)) - 1);
252
253 while (blk < blkcnt) {
254 blk_r = ((blkcnt - blk) > mmc->erase_grp_size) ?
255 mmc->erase_grp_size : (blkcnt - blk);
256 err = mmc_erase_t(mmc, start + blk, blk_r);
257 if (err)
258 break;
259
260 blk += blk_r;
Jerry Huangd2d8afa2012-05-17 23:00:51 +0000261
262 /* Waiting for the ready status */
263 if (mmc_send_status(mmc, timeout))
264 return 0;
Lei Wene6f99a52011-06-22 17:03:31 +0000265 }
266
267 return blk;
268}
269
Andy Fleming272cc702008-10-30 16:41:01 -0500270static ulong
Lei Wen01581262010-10-14 13:38:11 +0800271mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
Andy Fleming272cc702008-10-30 16:41:01 -0500272{
273 struct mmc_cmd cmd;
274 struct mmc_data data;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000275 int timeout = 1000;
Andy Fleming272cc702008-10-30 16:41:01 -0500276
Lei Wend2bf29e2010-09-13 22:07:27 +0800277 if ((start + blkcnt) > mmc->block_dev.lba) {
Steve Sakomandef412b2010-10-28 09:00:26 -0700278 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800279 start + blkcnt, mmc->block_dev.lba);
280 return 0;
281 }
Andy Fleming272cc702008-10-30 16:41:01 -0500282
283 if (blkcnt > 1)
284 cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
285 else
286 cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
287
288 if (mmc->high_capacity)
289 cmd.cmdarg = start;
290 else
Steve Sakomandef412b2010-10-28 09:00:26 -0700291 cmd.cmdarg = start * mmc->write_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500292
293 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500294
295 data.src = src;
296 data.blocks = blkcnt;
Steve Sakomandef412b2010-10-28 09:00:26 -0700297 data.blocksize = mmc->write_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500298 data.flags = MMC_DATA_WRITE;
299
Steve Sakomandef412b2010-10-28 09:00:26 -0700300 if (mmc_send_cmd(mmc, &cmd, &data)) {
301 printf("mmc write failed\n");
302 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500303 }
304
Thomas Choud52ebf12010-12-24 13:12:21 +0000305 /* SPI multiblock writes terminate using a special
306 * token, not a STOP_TRANSMISSION request.
307 */
308 if (!mmc_host_is_spi(mmc) && blkcnt > 1) {
Andy Fleming272cc702008-10-30 16:41:01 -0500309 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
310 cmd.cmdarg = 0;
311 cmd.resp_type = MMC_RSP_R1b;
Steve Sakomandef412b2010-10-28 09:00:26 -0700312 if (mmc_send_cmd(mmc, &cmd, NULL)) {
313 printf("mmc fail to send stop cmd\n");
314 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800315 }
Andy Fleming272cc702008-10-30 16:41:01 -0500316 }
317
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000318 /* Waiting for the ready status */
319 if (mmc_send_status(mmc, timeout))
320 return 0;
321
Andy Fleming272cc702008-10-30 16:41:01 -0500322 return blkcnt;
323}
324
Lei Wen01581262010-10-14 13:38:11 +0800325static ulong
326mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)
327{
Lei Wen01581262010-10-14 13:38:11 +0800328 lbaint_t cur, blocks_todo = blkcnt;
329
Steve Sakomandef412b2010-10-28 09:00:26 -0700330 struct mmc *mmc = find_mmc_device(dev_num);
Lei Wen01581262010-10-14 13:38:11 +0800331 if (!mmc)
Steve Sakomandef412b2010-10-28 09:00:26 -0700332 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800333
Steve Sakomandef412b2010-10-28 09:00:26 -0700334 if (mmc_set_blocklen(mmc, mmc->write_bl_len))
335 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800336
337 do {
John Rigby8feafcc2011-04-18 05:50:08 +0000338 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Lei Wen01581262010-10-14 13:38:11 +0800339 if(mmc_write_blocks(mmc, start, cur, src) != cur)
Steve Sakomandef412b2010-10-28 09:00:26 -0700340 return 0;
Lei Wen01581262010-10-14 13:38:11 +0800341 blocks_todo -= cur;
342 start += cur;
343 src += cur * mmc->write_bl_len;
344 } while (blocks_todo > 0);
345
346 return blkcnt;
347}
348
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000349static int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start,
350 lbaint_t blkcnt)
Andy Fleming272cc702008-10-30 16:41:01 -0500351{
352 struct mmc_cmd cmd;
353 struct mmc_data data;
354
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700355 if (blkcnt > 1)
356 cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
357 else
358 cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;
Andy Fleming272cc702008-10-30 16:41:01 -0500359
360 if (mmc->high_capacity)
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700361 cmd.cmdarg = start;
Andy Fleming272cc702008-10-30 16:41:01 -0500362 else
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700363 cmd.cmdarg = start * mmc->read_bl_len;
Andy Fleming272cc702008-10-30 16:41:01 -0500364
365 cmd.resp_type = MMC_RSP_R1;
Andy Fleming272cc702008-10-30 16:41:01 -0500366
367 data.dest = dst;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700368 data.blocks = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500369 data.blocksize = mmc->read_bl_len;
370 data.flags = MMC_DATA_READ;
371
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700372 if (mmc_send_cmd(mmc, &cmd, &data))
373 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500374
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700375 if (blkcnt > 1) {
376 cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
377 cmd.cmdarg = 0;
378 cmd.resp_type = MMC_RSP_R1b;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700379 if (mmc_send_cmd(mmc, &cmd, NULL)) {
380 printf("mmc fail to send stop cmd\n");
381 return 0;
382 }
Andy Fleming272cc702008-10-30 16:41:01 -0500383 }
384
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700385 return blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500386}
387
388static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)
389{
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700390 lbaint_t cur, blocks_todo = blkcnt;
Andy Fleming272cc702008-10-30 16:41:01 -0500391
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700392 if (blkcnt == 0)
393 return 0;
394
395 struct mmc *mmc = find_mmc_device(dev_num);
Andy Fleming272cc702008-10-30 16:41:01 -0500396 if (!mmc)
397 return 0;
398
Lei Wend2bf29e2010-09-13 22:07:27 +0800399 if ((start + blkcnt) > mmc->block_dev.lba) {
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700400 printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
Lei Wend2bf29e2010-09-13 22:07:27 +0800401 start + blkcnt, mmc->block_dev.lba);
402 return 0;
403 }
Andy Fleming272cc702008-10-30 16:41:01 -0500404
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700405 if (mmc_set_blocklen(mmc, mmc->read_bl_len))
Andy Fleming272cc702008-10-30 16:41:01 -0500406 return 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500407
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700408 do {
John Rigby8feafcc2011-04-18 05:50:08 +0000409 cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo;
Alagu Sankar4a1a06b2010-10-25 07:23:56 -0700410 if(mmc_read_blocks(mmc, dst, start, cur) != cur)
411 return 0;
412 blocks_todo -= cur;
413 start += cur;
414 dst += cur * mmc->read_bl_len;
415 } while (blocks_todo > 0);
Andy Fleming272cc702008-10-30 16:41:01 -0500416
417 return blkcnt;
418}
419
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000420static int mmc_go_idle(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500421{
422 struct mmc_cmd cmd;
423 int err;
424
425 udelay(1000);
426
427 cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
428 cmd.cmdarg = 0;
429 cmd.resp_type = MMC_RSP_NONE;
Andy Fleming272cc702008-10-30 16:41:01 -0500430
431 err = mmc_send_cmd(mmc, &cmd, NULL);
432
433 if (err)
434 return err;
435
436 udelay(2000);
437
438 return 0;
439}
440
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000441static int sd_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500442{
443 int timeout = 1000;
444 int err;
445 struct mmc_cmd cmd;
446
447 do {
448 cmd.cmdidx = MMC_CMD_APP_CMD;
449 cmd.resp_type = MMC_RSP_R1;
450 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500451
452 err = mmc_send_cmd(mmc, &cmd, NULL);
453
454 if (err)
455 return err;
456
457 cmd.cmdidx = SD_CMD_APP_SEND_OP_COND;
458 cmd.resp_type = MMC_RSP_R3;
Stefano Babic250de122010-01-20 18:20:39 +0100459
460 /*
461 * Most cards do not answer if some reserved bits
462 * in the ocr are set. However, Some controller
463 * can set bit 7 (reserved for low voltages), but
464 * how to manage low voltages SD card is not yet
465 * specified.
466 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000467 cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 :
468 (mmc->voltages & 0xff8000);
Andy Fleming272cc702008-10-30 16:41:01 -0500469
470 if (mmc->version == SD_VERSION_2)
471 cmd.cmdarg |= OCR_HCS;
472
473 err = mmc_send_cmd(mmc, &cmd, NULL);
474
475 if (err)
476 return err;
477
478 udelay(1000);
479 } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
480
481 if (timeout <= 0)
482 return UNUSABLE_ERR;
483
484 if (mmc->version != SD_VERSION_2)
485 mmc->version = SD_VERSION_1_0;
486
Thomas Choud52ebf12010-12-24 13:12:21 +0000487 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
488 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
489 cmd.resp_type = MMC_RSP_R3;
490 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000491
492 err = mmc_send_cmd(mmc, &cmd, NULL);
493
494 if (err)
495 return err;
496 }
497
Rabin Vincent998be3d2009-04-05 13:30:56 +0530498 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500499
500 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
501 mmc->rca = 0;
502
503 return 0;
504}
505
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000506static int mmc_send_op_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500507{
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000508 int timeout = 10000;
Andy Fleming272cc702008-10-30 16:41:01 -0500509 struct mmc_cmd cmd;
510 int err;
511
512 /* Some cards seem to need this */
513 mmc_go_idle(mmc);
514
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000515 /* Asking to the card its capabilities */
516 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
517 cmd.resp_type = MMC_RSP_R3;
518 cmd.cmdarg = 0;
Wolfgang Denkcd6881b2011-05-19 22:21:41 +0200519
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000520 err = mmc_send_cmd(mmc, &cmd, NULL);
Wolfgang Denkcd6881b2011-05-19 22:21:41 +0200521
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000522 if (err)
523 return err;
Wolfgang Denkcd6881b2011-05-19 22:21:41 +0200524
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000525 udelay(1000);
Wolfgang Denkcd6881b2011-05-19 22:21:41 +0200526
Andy Fleming272cc702008-10-30 16:41:01 -0500527 do {
528 cmd.cmdidx = MMC_CMD_SEND_OP_COND;
529 cmd.resp_type = MMC_RSP_R3;
Raffaele Recalcati31cacba2011-03-11 02:01:13 +0000530 cmd.cmdarg = (mmc_host_is_spi(mmc) ? 0 :
531 (mmc->voltages &
532 (cmd.response[0] & OCR_VOLTAGE_MASK)) |
533 (cmd.response[0] & OCR_ACCESS_MODE));
Łukasz Majewskib1f1e8212011-07-05 02:19:44 +0000534
535 if (mmc->host_caps & MMC_MODE_HC)
536 cmd.cmdarg |= OCR_HCS;
537
Andy Fleming272cc702008-10-30 16:41:01 -0500538 err = mmc_send_cmd(mmc, &cmd, NULL);
539
540 if (err)
541 return err;
542
543 udelay(1000);
544 } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
545
546 if (timeout <= 0)
547 return UNUSABLE_ERR;
548
Thomas Choud52ebf12010-12-24 13:12:21 +0000549 if (mmc_host_is_spi(mmc)) { /* read OCR for spi */
550 cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
551 cmd.resp_type = MMC_RSP_R3;
552 cmd.cmdarg = 0;
Thomas Choud52ebf12010-12-24 13:12:21 +0000553
554 err = mmc_send_cmd(mmc, &cmd, NULL);
555
556 if (err)
557 return err;
558 }
559
Andy Fleming272cc702008-10-30 16:41:01 -0500560 mmc->version = MMC_VERSION_UNKNOWN;
Rabin Vincent998be3d2009-04-05 13:30:56 +0530561 mmc->ocr = cmd.response[0];
Andy Fleming272cc702008-10-30 16:41:01 -0500562
563 mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS);
564 mmc->rca = 0;
565
566 return 0;
567}
568
569
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000570static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
Andy Fleming272cc702008-10-30 16:41:01 -0500571{
572 struct mmc_cmd cmd;
573 struct mmc_data data;
574 int err;
575
576 /* Get the Card Status Register */
577 cmd.cmdidx = MMC_CMD_SEND_EXT_CSD;
578 cmd.resp_type = MMC_RSP_R1;
579 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500580
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000581 data.dest = (char *)ext_csd;
Andy Fleming272cc702008-10-30 16:41:01 -0500582 data.blocks = 1;
583 data.blocksize = 512;
584 data.flags = MMC_DATA_READ;
585
586 err = mmc_send_cmd(mmc, &cmd, &data);
587
588 return err;
589}
590
591
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000592static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
Andy Fleming272cc702008-10-30 16:41:01 -0500593{
594 struct mmc_cmd cmd;
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000595 int timeout = 1000;
596 int ret;
Andy Fleming272cc702008-10-30 16:41:01 -0500597
598 cmd.cmdidx = MMC_CMD_SWITCH;
599 cmd.resp_type = MMC_RSP_R1b;
600 cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000601 (index << 16) |
602 (value << 8);
Andy Fleming272cc702008-10-30 16:41:01 -0500603
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000604 ret = mmc_send_cmd(mmc, &cmd, NULL);
605
606 /* Waiting for the ready status */
Jan Kloetzke93ad0d12012-02-05 22:29:11 +0000607 if (!ret)
608 ret = mmc_send_status(mmc, timeout);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000609
610 return ret;
611
Andy Fleming272cc702008-10-30 16:41:01 -0500612}
613
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000614static int mmc_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500615{
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000616 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, 512);
Andy Fleming272cc702008-10-30 16:41:01 -0500617 char cardtype;
618 int err;
619
620 mmc->card_caps = 0;
621
Thomas Choud52ebf12010-12-24 13:12:21 +0000622 if (mmc_host_is_spi(mmc))
623 return 0;
624
Andy Fleming272cc702008-10-30 16:41:01 -0500625 /* Only version 4 supports high-speed */
626 if (mmc->version < MMC_VERSION_4)
627 return 0;
628
Andy Fleming272cc702008-10-30 16:41:01 -0500629 err = mmc_send_ext_csd(mmc, ext_csd);
630
631 if (err)
632 return err;
633
Lei Wen0560db12011-10-03 20:35:10 +0000634 cardtype = ext_csd[EXT_CSD_CARD_TYPE] & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500635
636 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
637
638 if (err)
639 return err;
640
641 /* Now check to see that it worked */
642 err = mmc_send_ext_csd(mmc, ext_csd);
643
644 if (err)
645 return err;
646
647 /* No high-speed support */
Lei Wen0560db12011-10-03 20:35:10 +0000648 if (!ext_csd[EXT_CSD_HS_TIMING])
Andy Fleming272cc702008-10-30 16:41:01 -0500649 return 0;
650
651 /* High Speed is set, there are two types: 52MHz and 26MHz */
652 if (cardtype & MMC_HS_52MHZ)
653 mmc->card_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
654 else
655 mmc->card_caps |= MMC_MODE_HS;
656
657 return 0;
658}
659
Lei Wenbc897b12011-05-02 16:26:26 +0000660int mmc_switch_part(int dev_num, unsigned int part_num)
661{
662 struct mmc *mmc = find_mmc_device(dev_num);
663
664 if (!mmc)
665 return -1;
666
667 return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
668 (mmc->part_config & ~PART_ACCESS_MASK)
669 | (part_num & PART_ACCESS_MASK));
670}
671
Thierry Reding48972d92012-01-02 01:15:37 +0000672int mmc_getcd(struct mmc *mmc)
673{
674 int cd;
675
676 cd = board_mmc_getcd(mmc);
677
678 if ((cd < 0) && mmc->getcd)
679 cd = mmc->getcd(mmc);
680
681 return cd;
682}
683
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000684static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
Andy Fleming272cc702008-10-30 16:41:01 -0500685{
686 struct mmc_cmd cmd;
687 struct mmc_data data;
688
689 /* Switch the frequency */
690 cmd.cmdidx = SD_CMD_SWITCH_FUNC;
691 cmd.resp_type = MMC_RSP_R1;
692 cmd.cmdarg = (mode << 31) | 0xffffff;
693 cmd.cmdarg &= ~(0xf << (group * 4));
694 cmd.cmdarg |= value << (group * 4);
Andy Fleming272cc702008-10-30 16:41:01 -0500695
696 data.dest = (char *)resp;
697 data.blocksize = 64;
698 data.blocks = 1;
699 data.flags = MMC_DATA_READ;
700
701 return mmc_send_cmd(mmc, &cmd, &data);
702}
703
704
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000705static int sd_change_freq(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500706{
707 int err;
708 struct mmc_cmd cmd;
Anton staaff781dd32011-10-03 13:54:59 +0000709 ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
710 ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
Andy Fleming272cc702008-10-30 16:41:01 -0500711 struct mmc_data data;
712 int timeout;
713
714 mmc->card_caps = 0;
715
Thomas Choud52ebf12010-12-24 13:12:21 +0000716 if (mmc_host_is_spi(mmc))
717 return 0;
718
Andy Fleming272cc702008-10-30 16:41:01 -0500719 /* Read the SCR to find out if this card supports higher speeds */
720 cmd.cmdidx = MMC_CMD_APP_CMD;
721 cmd.resp_type = MMC_RSP_R1;
722 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500723
724 err = mmc_send_cmd(mmc, &cmd, NULL);
725
726 if (err)
727 return err;
728
729 cmd.cmdidx = SD_CMD_APP_SEND_SCR;
730 cmd.resp_type = MMC_RSP_R1;
731 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500732
733 timeout = 3;
734
735retry_scr:
Anton staaff781dd32011-10-03 13:54:59 +0000736 data.dest = (char *)scr;
Andy Fleming272cc702008-10-30 16:41:01 -0500737 data.blocksize = 8;
738 data.blocks = 1;
739 data.flags = MMC_DATA_READ;
740
741 err = mmc_send_cmd(mmc, &cmd, &data);
742
743 if (err) {
744 if (timeout--)
745 goto retry_scr;
746
747 return err;
748 }
749
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300750 mmc->scr[0] = __be32_to_cpu(scr[0]);
751 mmc->scr[1] = __be32_to_cpu(scr[1]);
Andy Fleming272cc702008-10-30 16:41:01 -0500752
753 switch ((mmc->scr[0] >> 24) & 0xf) {
754 case 0:
755 mmc->version = SD_VERSION_1_0;
756 break;
757 case 1:
758 mmc->version = SD_VERSION_1_10;
759 break;
760 case 2:
761 mmc->version = SD_VERSION_2;
762 break;
763 default:
764 mmc->version = SD_VERSION_1_0;
765 break;
766 }
767
Alagu Sankarb44c7082010-05-12 15:08:24 +0530768 if (mmc->scr[0] & SD_DATA_4BIT)
769 mmc->card_caps |= MMC_MODE_4BIT;
770
Andy Fleming272cc702008-10-30 16:41:01 -0500771 /* Version 1.0 doesn't support switching */
772 if (mmc->version == SD_VERSION_1_0)
773 return 0;
774
775 timeout = 4;
776 while (timeout--) {
777 err = sd_switch(mmc, SD_SWITCH_CHECK, 0, 1,
Anton staaff781dd32011-10-03 13:54:59 +0000778 (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500779
780 if (err)
781 return err;
782
783 /* The high-speed function is busy. Try again */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300784 if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
Andy Fleming272cc702008-10-30 16:41:01 -0500785 break;
786 }
787
Andy Fleming272cc702008-10-30 16:41:01 -0500788 /* If high-speed isn't supported, we return */
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300789 if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
Andy Fleming272cc702008-10-30 16:41:01 -0500790 return 0;
791
Macpaul Lin2c3fbf42011-11-28 16:31:09 +0000792 /*
793 * If the host doesn't support SD_HIGHSPEED, do not switch card to
794 * HIGHSPEED mode even if the card support SD_HIGHSPPED.
795 * This can avoid furthur problem when the card runs in different
796 * mode between the host.
797 */
798 if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
799 (mmc->host_caps & MMC_MODE_HS)))
800 return 0;
801
Anton staaff781dd32011-10-03 13:54:59 +0000802 err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
Andy Fleming272cc702008-10-30 16:41:01 -0500803
804 if (err)
805 return err;
806
Yauhen Kharuzhy4e3d89b2009-05-07 00:43:30 +0300807 if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
Andy Fleming272cc702008-10-30 16:41:01 -0500808 mmc->card_caps |= MMC_MODE_HS;
809
810 return 0;
811}
812
813/* frequency bases */
814/* divided by 10 to be nice to platforms without floating point */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000815static const int fbase[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500816 10000,
817 100000,
818 1000000,
819 10000000,
820};
821
822/* Multiplier values for TRAN_SPEED. Multiplied by 10 to be nice
823 * to platforms without floating point.
824 */
Mike Frysinger5f837c22010-10-20 01:15:53 +0000825static const int multipliers[] = {
Andy Fleming272cc702008-10-30 16:41:01 -0500826 0, /* reserved */
827 10,
828 12,
829 13,
830 15,
831 20,
832 25,
833 30,
834 35,
835 40,
836 45,
837 50,
838 55,
839 60,
840 70,
841 80,
842};
843
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000844static void mmc_set_ios(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500845{
846 mmc->set_ios(mmc);
847}
848
849void mmc_set_clock(struct mmc *mmc, uint clock)
850{
851 if (clock > mmc->f_max)
852 clock = mmc->f_max;
853
854 if (clock < mmc->f_min)
855 clock = mmc->f_min;
856
857 mmc->clock = clock;
858
859 mmc_set_ios(mmc);
860}
861
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000862static void mmc_set_bus_width(struct mmc *mmc, uint width)
Andy Fleming272cc702008-10-30 16:41:01 -0500863{
864 mmc->bus_width = width;
865
866 mmc_set_ios(mmc);
867}
868
Kim Phillipsfdbb8732012-10-29 13:34:43 +0000869static int mmc_startup(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -0500870{
Lei Wen41378942011-10-03 20:35:11 +0000871 int err, width;
Andy Fleming272cc702008-10-30 16:41:01 -0500872 uint mult, freq;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +0000873 u64 cmult, csize, capacity;
Andy Fleming272cc702008-10-30 16:41:01 -0500874 struct mmc_cmd cmd;
Yoshihiro Shimodacdfd1ac2012-06-07 19:09:11 +0000875 ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, 512);
876 ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, 512);
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000877 int timeout = 1000;
Andy Fleming272cc702008-10-30 16:41:01 -0500878
Thomas Choud52ebf12010-12-24 13:12:21 +0000879#ifdef CONFIG_MMC_SPI_CRC_ON
880 if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
881 cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF;
882 cmd.resp_type = MMC_RSP_R1;
883 cmd.cmdarg = 1;
Thomas Choud52ebf12010-12-24 13:12:21 +0000884 err = mmc_send_cmd(mmc, &cmd, NULL);
885
886 if (err)
887 return err;
888 }
889#endif
890
Andy Fleming272cc702008-10-30 16:41:01 -0500891 /* Put the Card in Identify Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +0000892 cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
893 MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
Andy Fleming272cc702008-10-30 16:41:01 -0500894 cmd.resp_type = MMC_RSP_R2;
895 cmd.cmdarg = 0;
Andy Fleming272cc702008-10-30 16:41:01 -0500896
897 err = mmc_send_cmd(mmc, &cmd, NULL);
898
899 if (err)
900 return err;
901
902 memcpy(mmc->cid, cmd.response, 16);
903
904 /*
905 * For MMC cards, set the Relative Address.
906 * For SD cards, get the Relatvie Address.
907 * This also puts the cards into Standby State
908 */
Thomas Choud52ebf12010-12-24 13:12:21 +0000909 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
910 cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR;
911 cmd.cmdarg = mmc->rca << 16;
912 cmd.resp_type = MMC_RSP_R6;
Andy Fleming272cc702008-10-30 16:41:01 -0500913
Thomas Choud52ebf12010-12-24 13:12:21 +0000914 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -0500915
Thomas Choud52ebf12010-12-24 13:12:21 +0000916 if (err)
917 return err;
Andy Fleming272cc702008-10-30 16:41:01 -0500918
Thomas Choud52ebf12010-12-24 13:12:21 +0000919 if (IS_SD(mmc))
920 mmc->rca = (cmd.response[0] >> 16) & 0xffff;
921 }
Andy Fleming272cc702008-10-30 16:41:01 -0500922
923 /* Get the Card-Specific Data */
924 cmd.cmdidx = MMC_CMD_SEND_CSD;
925 cmd.resp_type = MMC_RSP_R2;
926 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -0500927
928 err = mmc_send_cmd(mmc, &cmd, NULL);
929
Raffaele Recalcati5d4fc8d2011-03-11 02:01:12 +0000930 /* Waiting for the ready status */
931 mmc_send_status(mmc, timeout);
932
Andy Fleming272cc702008-10-30 16:41:01 -0500933 if (err)
934 return err;
935
Rabin Vincent998be3d2009-04-05 13:30:56 +0530936 mmc->csd[0] = cmd.response[0];
937 mmc->csd[1] = cmd.response[1];
938 mmc->csd[2] = cmd.response[2];
939 mmc->csd[3] = cmd.response[3];
Andy Fleming272cc702008-10-30 16:41:01 -0500940
941 if (mmc->version == MMC_VERSION_UNKNOWN) {
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530942 int version = (cmd.response[0] >> 26) & 0xf;
Andy Fleming272cc702008-10-30 16:41:01 -0500943
944 switch (version) {
945 case 0:
946 mmc->version = MMC_VERSION_1_2;
947 break;
948 case 1:
949 mmc->version = MMC_VERSION_1_4;
950 break;
951 case 2:
952 mmc->version = MMC_VERSION_2_2;
953 break;
954 case 3:
955 mmc->version = MMC_VERSION_3;
956 break;
957 case 4:
958 mmc->version = MMC_VERSION_4;
959 break;
960 default:
961 mmc->version = MMC_VERSION_1_2;
962 break;
963 }
964 }
965
966 /* divide frequency by 10, since the mults are 10x bigger */
Rabin Vincent0b453ff2009-04-05 13:30:55 +0530967 freq = fbase[(cmd.response[0] & 0x7)];
968 mult = multipliers[((cmd.response[0] >> 3) & 0xf)];
Andy Fleming272cc702008-10-30 16:41:01 -0500969
970 mmc->tran_speed = freq * mult;
971
Rabin Vincent998be3d2009-04-05 13:30:56 +0530972 mmc->read_bl_len = 1 << ((cmd.response[1] >> 16) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500973
974 if (IS_SD(mmc))
975 mmc->write_bl_len = mmc->read_bl_len;
976 else
Rabin Vincent998be3d2009-04-05 13:30:56 +0530977 mmc->write_bl_len = 1 << ((cmd.response[3] >> 22) & 0xf);
Andy Fleming272cc702008-10-30 16:41:01 -0500978
979 if (mmc->high_capacity) {
980 csize = (mmc->csd[1] & 0x3f) << 16
981 | (mmc->csd[2] & 0xffff0000) >> 16;
982 cmult = 8;
983 } else {
984 csize = (mmc->csd[1] & 0x3ff) << 2
985 | (mmc->csd[2] & 0xc0000000) >> 30;
986 cmult = (mmc->csd[2] & 0x00038000) >> 15;
987 }
988
989 mmc->capacity = (csize + 1) << (cmult + 2);
990 mmc->capacity *= mmc->read_bl_len;
991
992 if (mmc->read_bl_len > 512)
993 mmc->read_bl_len = 512;
994
995 if (mmc->write_bl_len > 512)
996 mmc->write_bl_len = 512;
997
998 /* Select the card, and put it into Transfer Mode */
Thomas Choud52ebf12010-12-24 13:12:21 +0000999 if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */
1000 cmd.cmdidx = MMC_CMD_SELECT_CARD;
Ajay Bhargavfe8f7062011-10-05 03:13:23 +00001001 cmd.resp_type = MMC_RSP_R1;
Thomas Choud52ebf12010-12-24 13:12:21 +00001002 cmd.cmdarg = mmc->rca << 16;
Thomas Choud52ebf12010-12-24 13:12:21 +00001003 err = mmc_send_cmd(mmc, &cmd, NULL);
Andy Fleming272cc702008-10-30 16:41:01 -05001004
Thomas Choud52ebf12010-12-24 13:12:21 +00001005 if (err)
1006 return err;
1007 }
Andy Fleming272cc702008-10-30 16:41:01 -05001008
Lei Wene6f99a52011-06-22 17:03:31 +00001009 /*
1010 * For SD, its erase group is always one sector
1011 */
1012 mmc->erase_grp_size = 1;
Lei Wenbc897b12011-05-02 16:26:26 +00001013 mmc->part_config = MMCPART_NOAVAILABLE;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301014 if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
1015 /* check ext_csd version and capacity */
1016 err = mmc_send_ext_csd(mmc, ext_csd);
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001017 if (!err && (ext_csd[EXT_CSD_REV] >= 2)) {
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001018 /*
1019 * According to the JEDEC Standard, the value of
1020 * ext_csd's capacity is valid if the value is more
1021 * than 2GB
1022 */
Lei Wen0560db12011-10-03 20:35:10 +00001023 capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
1024 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
1025 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
1026 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001027 capacity *= 512;
Łukasz Majewskib1f1e8212011-07-05 02:19:44 +00001028 if ((capacity >> 20) > 2 * 1024)
Yoshihiro Shimoda639b7822011-07-04 22:13:26 +00001029 mmc->capacity = capacity;
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301030 }
Lei Wenbc897b12011-05-02 16:26:26 +00001031
Lei Wene6f99a52011-06-22 17:03:31 +00001032 /*
1033 * Check whether GROUP_DEF is set, if yes, read out
1034 * group size from ext_csd directly, or calculate
1035 * the group size from the csd value.
1036 */
Lei Wen0560db12011-10-03 20:35:10 +00001037 if (ext_csd[EXT_CSD_ERASE_GROUP_DEF])
1038 mmc->erase_grp_size =
1039 ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 512 * 1024;
Lei Wene6f99a52011-06-22 17:03:31 +00001040 else {
1041 int erase_gsz, erase_gmul;
1042 erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
1043 erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
1044 mmc->erase_grp_size = (erase_gsz + 1)
1045 * (erase_gmul + 1);
1046 }
1047
Lei Wenbc897b12011-05-02 16:26:26 +00001048 /* store the partition info of emmc */
Stephen Warren8948ea82012-07-30 10:55:43 +00001049 if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
1050 ext_csd[EXT_CSD_BOOT_MULT])
Lei Wen0560db12011-10-03 20:35:10 +00001051 mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
Sukumar Ghoraid23e2c02010-09-20 18:29:29 +05301052 }
1053
Andy Fleming272cc702008-10-30 16:41:01 -05001054 if (IS_SD(mmc))
1055 err = sd_change_freq(mmc);
1056 else
1057 err = mmc_change_freq(mmc);
1058
1059 if (err)
1060 return err;
1061
1062 /* Restrict card's capabilities by what the host can do */
1063 mmc->card_caps &= mmc->host_caps;
1064
1065 if (IS_SD(mmc)) {
1066 if (mmc->card_caps & MMC_MODE_4BIT) {
1067 cmd.cmdidx = MMC_CMD_APP_CMD;
1068 cmd.resp_type = MMC_RSP_R1;
1069 cmd.cmdarg = mmc->rca << 16;
Andy Fleming272cc702008-10-30 16:41:01 -05001070
1071 err = mmc_send_cmd(mmc, &cmd, NULL);
1072 if (err)
1073 return err;
1074
1075 cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
1076 cmd.resp_type = MMC_RSP_R1;
1077 cmd.cmdarg = 2;
Andy Fleming272cc702008-10-30 16:41:01 -05001078 err = mmc_send_cmd(mmc, &cmd, NULL);
1079 if (err)
1080 return err;
1081
1082 mmc_set_bus_width(mmc, 4);
1083 }
1084
1085 if (mmc->card_caps & MMC_MODE_HS)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001086 mmc->tran_speed = 50000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001087 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001088 mmc->tran_speed = 25000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001089 } else {
Łukasz Majewski62722032012-03-12 22:07:18 +00001090 width = ((mmc->host_caps & MMC_MODE_MASK_WIDTH_BITS) >>
1091 MMC_MODE_WIDTH_BITS_SHIFT);
1092 for (; width >= 0; width--) {
Andy Fleming272cc702008-10-30 16:41:01 -05001093 /* Set the card to use 4 bit*/
1094 err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
Lei Wen41378942011-10-03 20:35:11 +00001095 EXT_CSD_BUS_WIDTH, width);
Andy Fleming272cc702008-10-30 16:41:01 -05001096
1097 if (err)
Lei Wen41378942011-10-03 20:35:11 +00001098 continue;
Andy Fleming272cc702008-10-30 16:41:01 -05001099
Lei Wen41378942011-10-03 20:35:11 +00001100 if (!width) {
1101 mmc_set_bus_width(mmc, 1);
1102 break;
1103 } else
1104 mmc_set_bus_width(mmc, 4 * width);
Andy Fleming272cc702008-10-30 16:41:01 -05001105
Lei Wen41378942011-10-03 20:35:11 +00001106 err = mmc_send_ext_csd(mmc, test_csd);
1107 if (!err && ext_csd[EXT_CSD_PARTITIONING_SUPPORT] \
1108 == test_csd[EXT_CSD_PARTITIONING_SUPPORT]
1109 && ext_csd[EXT_CSD_ERASE_GROUP_DEF] \
1110 == test_csd[EXT_CSD_ERASE_GROUP_DEF] \
1111 && ext_csd[EXT_CSD_REV] \
1112 == test_csd[EXT_CSD_REV]
1113 && ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] \
1114 == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
1115 && memcmp(&ext_csd[EXT_CSD_SEC_CNT], \
1116 &test_csd[EXT_CSD_SEC_CNT], 4) == 0) {
Andy Fleming272cc702008-10-30 16:41:01 -05001117
Lei Wen41378942011-10-03 20:35:11 +00001118 mmc->card_caps |= width;
1119 break;
1120 }
Andy Fleming272cc702008-10-30 16:41:01 -05001121 }
1122
1123 if (mmc->card_caps & MMC_MODE_HS) {
1124 if (mmc->card_caps & MMC_MODE_HS_52MHz)
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001125 mmc->tran_speed = 52000000;
Andy Fleming272cc702008-10-30 16:41:01 -05001126 else
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001127 mmc->tran_speed = 26000000;
1128 }
Andy Fleming272cc702008-10-30 16:41:01 -05001129 }
1130
Jaehoon Chungad5fd922012-03-26 21:16:03 +00001131 mmc_set_clock(mmc, mmc->tran_speed);
1132
Andy Fleming272cc702008-10-30 16:41:01 -05001133 /* fill in device description */
1134 mmc->block_dev.lun = 0;
1135 mmc->block_dev.type = 0;
1136 mmc->block_dev.blksz = mmc->read_bl_len;
Rabin Vincent9b1f9422009-04-05 13:30:54 +05301137 mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
Rabin Vincent0b453ff2009-04-05 13:30:55 +05301138 sprintf(mmc->block_dev.vendor, "Man %06x Snr %08x", mmc->cid[0] >> 8,
1139 (mmc->cid[2] << 8) | (mmc->cid[3] >> 24));
1140 sprintf(mmc->block_dev.product, "%c%c%c%c%c", mmc->cid[0] & 0xff,
1141 (mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
1142 (mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
1143 sprintf(mmc->block_dev.revision, "%d.%d", mmc->cid[2] >> 28,
1144 (mmc->cid[2] >> 24) & 0xf);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001145#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBDISK_SUPPORT)
Andy Fleming272cc702008-10-30 16:41:01 -05001146 init_part(&mmc->block_dev);
Mikhail Kshevetskiy122efd42012-07-09 08:53:38 +00001147#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001148
1149 return 0;
1150}
1151
Kim Phillipsfdbb8732012-10-29 13:34:43 +00001152static int mmc_send_if_cond(struct mmc *mmc)
Andy Fleming272cc702008-10-30 16:41:01 -05001153{
1154 struct mmc_cmd cmd;
1155 int err;
1156
1157 cmd.cmdidx = SD_CMD_SEND_IF_COND;
1158 /* We set the bit if the host supports voltages between 2.7 and 3.6 V */
1159 cmd.cmdarg = ((mmc->voltages & 0xff8000) != 0) << 8 | 0xaa;
1160 cmd.resp_type = MMC_RSP_R7;
Andy Fleming272cc702008-10-30 16:41:01 -05001161
1162 err = mmc_send_cmd(mmc, &cmd, NULL);
1163
1164 if (err)
1165 return err;
1166
Rabin Vincent998be3d2009-04-05 13:30:56 +05301167 if ((cmd.response[0] & 0xff) != 0xaa)
Andy Fleming272cc702008-10-30 16:41:01 -05001168 return UNUSABLE_ERR;
1169 else
1170 mmc->version = SD_VERSION_2;
1171
1172 return 0;
1173}
1174
1175int mmc_register(struct mmc *mmc)
1176{
1177 /* Setup the universal parts of the block interface just once */
1178 mmc->block_dev.if_type = IF_TYPE_MMC;
1179 mmc->block_dev.dev = cur_dev_num++;
1180 mmc->block_dev.removable = 1;
1181 mmc->block_dev.block_read = mmc_bread;
1182 mmc->block_dev.block_write = mmc_bwrite;
Lei Wene6f99a52011-06-22 17:03:31 +00001183 mmc->block_dev.block_erase = mmc_berase;
John Rigby8feafcc2011-04-18 05:50:08 +00001184 if (!mmc->b_max)
1185 mmc->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
Andy Fleming272cc702008-10-30 16:41:01 -05001186
1187 INIT_LIST_HEAD (&mmc->link);
1188
1189 list_add_tail (&mmc->link, &mmc_devices);
1190
1191 return 0;
1192}
1193
Matthew McClintockdf3fc522011-05-24 05:31:19 +00001194#ifdef CONFIG_PARTITIONS
Andy Fleming272cc702008-10-30 16:41:01 -05001195block_dev_desc_t *mmc_get_dev(int dev)
1196{
1197 struct mmc *mmc = find_mmc_device(dev);
Benoît Thébaudeau6bb4b4b2012-08-10 08:59:12 +00001198 if (!mmc || mmc_init(mmc))
Łukasz Majewski40242bc2012-04-19 02:39:18 +00001199 return NULL;
Andy Fleming272cc702008-10-30 16:41:01 -05001200
Łukasz Majewski40242bc2012-04-19 02:39:18 +00001201 return &mmc->block_dev;
Andy Fleming272cc702008-10-30 16:41:01 -05001202}
Matthew McClintockdf3fc522011-05-24 05:31:19 +00001203#endif
Andy Fleming272cc702008-10-30 16:41:01 -05001204
1205int mmc_init(struct mmc *mmc)
1206{
Macpaul Linafd59322011-11-14 23:35:39 +00001207 int err;
Andy Fleming272cc702008-10-30 16:41:01 -05001208
Thierry Reding48972d92012-01-02 01:15:37 +00001209 if (mmc_getcd(mmc) == 0) {
1210 mmc->has_init = 0;
1211 printf("MMC: no card present\n");
1212 return NO_CARD_ERR;
1213 }
1214
Lei Wenbc897b12011-05-02 16:26:26 +00001215 if (mmc->has_init)
1216 return 0;
1217
Andy Fleming272cc702008-10-30 16:41:01 -05001218 err = mmc->init(mmc);
1219
1220 if (err)
1221 return err;
1222
Ilya Yanokb86b85e2009-06-29 17:53:16 +04001223 mmc_set_bus_width(mmc, 1);
1224 mmc_set_clock(mmc, 1);
1225
Andy Fleming272cc702008-10-30 16:41:01 -05001226 /* Reset the Card */
1227 err = mmc_go_idle(mmc);
1228
1229 if (err)
1230 return err;
1231
Lei Wenbc897b12011-05-02 16:26:26 +00001232 /* The internal partition reset to user partition(0) at every CMD0*/
1233 mmc->part_num = 0;
1234
Andy Fleming272cc702008-10-30 16:41:01 -05001235 /* Test for SD version 2 */
Macpaul Linafd59322011-11-14 23:35:39 +00001236 err = mmc_send_if_cond(mmc);
Andy Fleming272cc702008-10-30 16:41:01 -05001237
Andy Fleming272cc702008-10-30 16:41:01 -05001238 /* Now try to get the SD card's operating condition */
1239 err = sd_send_op_cond(mmc);
1240
1241 /* If the command timed out, we check for an MMC card */
1242 if (err == TIMEOUT) {
1243 err = mmc_send_op_cond(mmc);
1244
1245 if (err) {
1246 printf("Card did not respond to voltage select!\n");
1247 return UNUSABLE_ERR;
1248 }
1249 }
1250
Lei Wenbc897b12011-05-02 16:26:26 +00001251 err = mmc_startup(mmc);
1252 if (err)
1253 mmc->has_init = 0;
1254 else
1255 mmc->has_init = 1;
1256 return err;
Andy Fleming272cc702008-10-30 16:41:01 -05001257}
1258
1259/*
1260 * CPU and board-specific MMC initializations. Aliased function
1261 * signals caller to move on
1262 */
1263static int __def_mmc_init(bd_t *bis)
1264{
1265 return -1;
1266}
1267
Peter Tyserf9a109b2009-04-20 11:08:46 -05001268int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
1269int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
Andy Fleming272cc702008-10-30 16:41:01 -05001270
1271void print_mmc_devices(char separator)
1272{
1273 struct mmc *m;
1274 struct list_head *entry;
1275
1276 list_for_each(entry, &mmc_devices) {
1277 m = list_entry(entry, struct mmc, link);
1278
1279 printf("%s: %d", m->name, m->block_dev.dev);
1280
1281 if (entry->next != &mmc_devices)
1282 printf("%c ", separator);
1283 }
1284
1285 printf("\n");
1286}
1287
Lei Wenea6ebe22011-05-02 16:26:25 +00001288int get_mmc_num(void)
1289{
1290 return cur_dev_num;
1291}
1292
Andy Fleming272cc702008-10-30 16:41:01 -05001293int mmc_initialize(bd_t *bis)
1294{
1295 INIT_LIST_HEAD (&mmc_devices);
1296 cur_dev_num = 0;
1297
1298 if (board_mmc_init(bis) < 0)
1299 cpu_mmc_init(bis);
1300
1301 print_mmc_devices(',');
1302
1303 return 0;
1304}