Blame view

common/cmd_mmc.c 10.7 KB
71f951180   wdenk   * Fix CONFIG_NET_...
1
2
3
4
  /*
   * (C) Copyright 2003
   * Kyle Harris, kharris@nexus-tech.net
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
71f951180   wdenk   * Fix CONFIG_NET_...
6
7
8
9
   */
  
  #include <common.h>
  #include <command.h>
71f951180   wdenk   * Fix CONFIG_NET_...
10
  #include <mmc.h>
02e22c2de   Mike Frysinger   cmd_mmc: make cur...
11
  static int curr_device = -1;
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
12
  #ifndef CONFIG_GENERIC_MMC
54841ab50   Wolfgang Denk   Make sure that ar...
13
  int do_mmc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
71f951180   wdenk   * Fix CONFIG_NET_...
14
  {
869f6bf4d   Minkyu Kang   cmd_mmc: add supp...
15
  	int dev;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
16
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
17
  		return CMD_RET_USAGE;
869f6bf4d   Minkyu Kang   cmd_mmc: add supp...
18
19
20
21
22
23
24
25
26
27
  
  	if (strcmp(argv[1], "init") == 0) {
  		if (argc == 2) {
  			if (curr_device < 0)
  				dev = 1;
  			else
  				dev = curr_device;
  		} else if (argc == 3) {
  			dev = (int)simple_strtoul(argv[2], NULL, 10);
  		} else {
4c12eeb8b   Simon Glass   Convert cmd_usage...
28
  			return CMD_RET_USAGE;
869f6bf4d   Minkyu Kang   cmd_mmc: add supp...
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  		}
  
  		if (mmc_legacy_init(dev) != 0) {
  			puts("No MMC card found
  ");
  			return 1;
  		}
  
  		curr_device = dev;
  		printf("mmc%d is available
  ", curr_device);
  	} else if (strcmp(argv[1], "device") == 0) {
  		if (argc == 2) {
  			if (curr_device < 0) {
  				puts("No MMC device available
  ");
  				return 1;
  			}
  		} else if (argc == 3) {
  			dev = (int)simple_strtoul(argv[2], NULL, 10);
  
  #ifdef CONFIG_SYS_MMC_SET_DEV
  			if (mmc_set_dev(dev) != 0)
  				return 1;
  #endif
  			curr_device = dev;
  		} else {
4c12eeb8b   Simon Glass   Convert cmd_usage...
56
  			return CMD_RET_USAGE;
869f6bf4d   Minkyu Kang   cmd_mmc: add supp...
57
58
59
60
61
  		}
  
  		printf("mmc%d is current device
  ", curr_device);
  	} else {
4c12eeb8b   Simon Glass   Convert cmd_usage...
62
  		return CMD_RET_USAGE;
71f951180   wdenk   * Fix CONFIG_NET_...
63
  	}
869f6bf4d   Minkyu Kang   cmd_mmc: add supp...
64

71f951180   wdenk   * Fix CONFIG_NET_...
65
66
  	return 0;
  }
0d4983930   wdenk   Patch by Kenneth ...
67
  U_BOOT_CMD(
869f6bf4d   Minkyu Kang   cmd_mmc: add supp...
68
69
70
71
  	mmc, 3, 1, do_mmc,
  	"MMC sub-system",
  	"init [dev] - init MMC sub system
  "
a89c33db9   Wolfgang Denk   General help mess...
72
  	"mmc device [dev] - show or set current device"
b0fce99bf   wdenk   Fix some missing ...
73
  );
3511b4e20   Dirk Behme   MMC: Don't use ne...
74
  #else /* !CONFIG_GENERIC_MMC */
272cc70b2   Andy Fleming   Add MMC Framework
75

6be95ccf9   Lei Wen   MMC: unify mmc re...
76
77
78
79
  enum mmc_state {
  	MMC_INVALID,
  	MMC_READ,
  	MMC_WRITE,
e6f99a561   Lei Wen   MMC: add erase fu...
80
  	MMC_ERASE,
6be95ccf9   Lei Wen   MMC: unify mmc re...
81
  };
272cc70b2   Andy Fleming   Add MMC Framework
82
83
  static void print_mmcinfo(struct mmc *mmc)
  {
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
84
85
  	printf("Device: %s
  ", mmc->cfg->name);
272cc70b2   Andy Fleming   Add MMC Framework
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  	printf("Manufacturer ID: %x
  ", mmc->cid[0] >> 24);
  	printf("OEM: %x
  ", (mmc->cid[0] >> 8) & 0xffff);
  	printf("Name: %c%c%c%c%c 
  ", mmc->cid[0] & 0xff,
  			(mmc->cid[1] >> 24), (mmc->cid[1] >> 16) & 0xff,
  			(mmc->cid[1] >> 8) & 0xff, mmc->cid[1] & 0xff);
  
  	printf("Tran Speed: %d
  ", mmc->tran_speed);
  	printf("Rd Block Len: %d
  ", mmc->read_bl_len);
  
  	printf("%s version %d.%d
  ", IS_SD(mmc) ? "SD" : "MMC",
64f4a6192   Jaehoon Chung   mmc: support the ...
102
  			(mmc->version >> 8) & 0xf, mmc->version & 0xff);
272cc70b2   Andy Fleming   Add MMC Framework
103
104
105
  
  	printf("High Capacity: %s
  ", mmc->high_capacity ? "Yes" : "No");
940e07829   Minkyu Kang   mmc: show mmc cap...
106
107
108
  	puts("Capacity: ");
  	print_size(mmc->capacity, "
  ");
272cc70b2   Andy Fleming   Add MMC Framework
109
110
111
112
  
  	printf("Bus Width: %d-bit
  ", mmc->bus_width);
  }
088f1b199   Kim Phillips   common/cmd_*.c: s...
113
  static int do_mmcinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
272cc70b2   Andy Fleming   Add MMC Framework
114
115
  {
  	struct mmc *mmc;
272cc70b2   Andy Fleming   Add MMC Framework
116

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
117
118
119
120
121
122
123
124
125
  	if (curr_device < 0) {
  		if (get_mmc_num() > 0)
  			curr_device = 0;
  		else {
  			puts("No MMC device available
  ");
  			return 1;
  		}
  	}
272cc70b2   Andy Fleming   Add MMC Framework
126

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
127
  	mmc = find_mmc_device(curr_device);
272cc70b2   Andy Fleming   Add MMC Framework
128
129
130
131
132
  
  	if (mmc) {
  		mmc_init(mmc);
  
  		print_mmcinfo(mmc);
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
133
134
135
136
137
  		return 0;
  	} else {
  		printf("no mmc device at slot %x
  ", curr_device);
  		return 1;
272cc70b2   Andy Fleming   Add MMC Framework
138
  	}
272cc70b2   Andy Fleming   Add MMC Framework
139
  }
388a29d02   Frans Meulenbroeks   various cmd_* fil...
140
  U_BOOT_CMD(
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
141
  	mmcinfo, 1, 0, do_mmcinfo,
cc9f607be   Frans Meulenbroeks   various cmd_* fil...
142
  	"display MMC info",
59ddead14   Robert P. J. Day   cmd_mmc.c: Fix ty...
143
  	"- display info of the current MMC device"
a89c33db9   Wolfgang Denk   General help mess...
144
  );
272cc70b2   Andy Fleming   Add MMC Framework
145

088f1b199   Kim Phillips   common/cmd_*.c: s...
146
  static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
272cc70b2   Andy Fleming   Add MMC Framework
147
  {
6be95ccf9   Lei Wen   MMC: unify mmc re...
148
  	enum mmc_state state;
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
149
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
150
  		return CMD_RET_USAGE;
272cc70b2   Andy Fleming   Add MMC Framework
151

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
152
153
154
155
156
157
158
159
160
  	if (curr_device < 0) {
  		if (get_mmc_num() > 0)
  			curr_device = 0;
  		else {
  			puts("No MMC device available
  ");
  			return 1;
  		}
  	}
272cc70b2   Andy Fleming   Add MMC Framework
161

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
162
  	if (strcmp(argv[1], "rescan") == 0) {
9fd383724   Stephen Warren   mmc: don't allow ...
163
164
165
166
  		struct mmc *mmc;
  
  		if (argc != 2)
  			return CMD_RET_USAGE;
e85649c7e   Rabin Vincent   mmc: check find_m...
167

9fd383724   Stephen Warren   mmc: don't allow ...
168
  		mmc = find_mmc_device(curr_device);
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
169
170
171
172
173
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", curr_device);
  			return 1;
  		}
bc897b1d4   Lei Wen   mmc: enable parti...
174
  		mmc->has_init = 0;
272cc70b2   Andy Fleming   Add MMC Framework
175

8fd01b8f6   Michael Jones   mmc: rescan fails...
176
177
178
179
  		if (mmc_init(mmc))
  			return 1;
  		else
  			return 0;
792970b0a   Tom Rini   cmd_mmc.c: Add 'p...
180
  	} else if (strcmp(argv[1], "part") == 0) {
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
181
  		block_dev_desc_t *mmc_dev;
9fd383724   Stephen Warren   mmc: don't allow ...
182
  		struct mmc *mmc;
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
183

9fd383724   Stephen Warren   mmc: don't allow ...
184
185
186
187
  		if (argc != 2)
  			return CMD_RET_USAGE;
  
  		mmc = find_mmc_device(curr_device);
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
188
189
190
191
192
193
194
195
196
197
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", curr_device);
  			return 1;
  		}
  		mmc_init(mmc);
  		mmc_dev = mmc_get_dev(curr_device);
  		if (mmc_dev != NULL &&
  				mmc_dev->type != DEV_TYPE_UNKNOWN) {
  			print_part(mmc_dev);
272cc70b2   Andy Fleming   Add MMC Framework
198
  			return 0;
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
199
  		}
8f3b96427   Lei Wen   mmc: print out pa...
200

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
201
202
203
204
  		puts("get mmc type error!
  ");
  		return 1;
  	} else if (strcmp(argv[1], "list") == 0) {
9fd383724   Stephen Warren   mmc: don't allow ...
205
206
  		if (argc != 2)
  			return CMD_RET_USAGE;
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
207
208
209
210
  		print_mmc_devices('
  ');
  		return 0;
  	} else if (strcmp(argv[1], "dev") == 0) {
bc897b1d4   Lei Wen   mmc: enable parti...
211
  		int dev, part = -1;
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
212
213
214
215
216
217
  		struct mmc *mmc;
  
  		if (argc == 2)
  			dev = curr_device;
  		else if (argc == 3)
  			dev = simple_strtoul(argv[2], NULL, 10);
bc897b1d4   Lei Wen   mmc: enable parti...
218
219
220
221
222
223
224
225
226
227
  		else if (argc == 4) {
  			dev = (int)simple_strtoul(argv[2], NULL, 10);
  			part = (int)simple_strtoul(argv[3], NULL, 10);
  			if (part > PART_ACCESS_MASK) {
  				printf("#part_num shouldn't be larger"
  					" than %d
  ", PART_ACCESS_MASK);
  				return 1;
  			}
  		} else
4c12eeb8b   Simon Glass   Convert cmd_usage...
228
  			return CMD_RET_USAGE;
8f3b96427   Lei Wen   mmc: print out pa...
229

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
230
231
232
233
  		mmc = find_mmc_device(dev);
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", dev);
8f3b96427   Lei Wen   mmc: print out pa...
234
  			return 1;
272cc70b2   Andy Fleming   Add MMC Framework
235
  		}
bc897b1d4   Lei Wen   mmc: enable parti...
236
237
238
239
240
241
242
243
244
245
246
247
248
  		mmc_init(mmc);
  		if (part != -1) {
  			int ret;
  			if (mmc->part_config == MMCPART_NOAVAILABLE) {
  				printf("Card doesn't support part_switch
  ");
  				return 1;
  			}
  
  			if (part != mmc->part_num) {
  				ret = mmc_switch_part(dev, part);
  				if (!ret)
  					mmc->part_num = part;
1f8b546f9   Robert P. J. Day   Fix some obvious ...
249
250
  				printf("switch to partitions #%d, %s
  ",
bc897b1d4   Lei Wen   mmc: enable parti...
251
252
253
  						part, (!ret) ? "OK" : "ERROR");
  			}
  		}
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
254
  		curr_device = dev;
bc897b1d4   Lei Wen   mmc: enable parti...
255
256
257
258
259
260
261
  		if (mmc->part_config == MMCPART_NOAVAILABLE)
  			printf("mmc%d is current device
  ", curr_device);
  		else
  			printf("mmc%d(part %d) is current device
  ",
  				curr_device, mmc->part_num);
272cc70b2   Andy Fleming   Add MMC Framework
262

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
263
  		return 0;
2a91c9134   Amar   COMMON: MMC: Comm...
264
  #ifdef CONFIG_SUPPORT_EMMC_BOOT
792970b0a   Tom Rini   cmd_mmc.c: Add 'p...
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
  	} else if (strcmp(argv[1], "partconf") == 0) {
  		int dev;
  		struct mmc *mmc;
  		u8 ack, part_num, access;
  
  		if (argc == 6) {
  			dev = simple_strtoul(argv[2], NULL, 10);
  			ack = simple_strtoul(argv[3], NULL, 10);
  			part_num = simple_strtoul(argv[4], NULL, 10);
  			access = simple_strtoul(argv[5], NULL, 10);
  		} else {
  			return CMD_RET_USAGE;
  		}
  
  		mmc = find_mmc_device(dev);
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", dev);
  			return 1;
  		}
2a91c9134   Amar   COMMON: MMC: Comm...
285

792970b0a   Tom Rini   cmd_mmc.c: Add 'p...
286
287
288
289
290
291
292
293
  		if (IS_SD(mmc)) {
  			puts("PARTITION_CONFIG only exists on eMMC
  ");
  			return 1;
  		}
  
  		/* acknowledge to be sent during boot operation */
  		return mmc_set_part_conf(mmc, ack, part_num, access);
5a99b9de1   Tom Rini   cmd_mmc.c: Add bo...
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
  	} else if (strcmp(argv[1], "bootbus") == 0) {
  		int dev;
  		struct mmc *mmc;
  		u8 width, reset, mode;
  
  		if (argc == 6) {
  			dev = simple_strtoul(argv[2], NULL, 10);
  			width = simple_strtoul(argv[3], NULL, 10);
  			reset = simple_strtoul(argv[4], NULL, 10);
  			mode = simple_strtoul(argv[5], NULL, 10);
  		} else {
  			return CMD_RET_USAGE;
  		}
  
  		mmc = find_mmc_device(dev);
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", dev);
  			return 1;
  		}
  
  		if (IS_SD(mmc)) {
  			puts("BOOT_BUS_WIDTH only exists on eMMC
  ");
  			return 1;
  		}
  
  		/* acknowledge to be sent during boot operation */
  		return mmc_set_boot_bus_width(mmc, width, reset, mode);
f1fd957e1   Tom Rini   cmd_mmc.c: Rename...
323
  	} else if (strcmp(argv[1], "bootpart-resize") == 0) {
2a91c9134   Amar   COMMON: MMC: Comm...
324
  		int dev;
f1fd957e1   Tom Rini   cmd_mmc.c: Rename...
325
  		struct mmc *mmc;
b01e6fe6c   Tom Rini   cmd_mmc.c: Change...
326
  		u32 bootsize, rpmbsize;
2a91c9134   Amar   COMMON: MMC: Comm...
327

b01e6fe6c   Tom Rini   cmd_mmc.c: Change...
328
329
330
331
332
333
334
335
336
  		if (argc == 5) {
  			dev = simple_strtoul(argv[2], NULL, 10);
  			bootsize = simple_strtoul(argv[3], NULL, 10);
  			rpmbsize = simple_strtoul(argv[4], NULL, 10);
  		} else {
  			return CMD_RET_USAGE;
  		}
  
  		mmc = find_mmc_device(dev);
2a91c9134   Amar   COMMON: MMC: Comm...
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", dev);
  			return 1;
  		}
  
  		if (IS_SD(mmc)) {
  			printf("It is not a EMMC device
  ");
  			return 1;
  		}
  
  		if (0 == mmc_boot_partition_size_change(mmc,
  							bootsize, rpmbsize)) {
  			printf("EMMC boot partition Size %d MB
  ", bootsize);
  			printf("EMMC RPMB partition Size %d MB
  ", rpmbsize);
  			return 0;
  		} else {
  			printf("EMMC boot partition Size change Failed.
  ");
  			return 1;
  		}
33ace362f   Tom Rini   mmc: Add 'mmc rst...
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
  	} else if (strcmp(argv[1], "rst-function") == 0) {
  		/*
  		 * Set the RST_n_ENABLE bit of RST_n_FUNCTION
  		 * The only valid values are 0x0, 0x1 and 0x2 and writing
  		 * a value of 0x1 or 0x2 sets the value permanently.
  		 */
  		int dev;
  		struct mmc *mmc;
  		u8 enable;
  
  		if (argc == 4) {
  			dev = simple_strtoul(argv[2], NULL, 10);
  			enable = simple_strtoul(argv[3], NULL, 10);
  		} else {
  			return CMD_RET_USAGE;
  		}
  
  		if (enable > 2 || enable < 0) {
  			puts("Invalid RST_n_ENABLE value
  ");
  			return CMD_RET_USAGE;
  		}
  
  		mmc = find_mmc_device(dev);
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", dev);
  			return 1;
  		}
  
  		if (IS_SD(mmc)) {
  			puts("RST_n_FUNCTION only exists on eMMC
  ");
  			return 1;
  		}
  
  		return mmc_set_rst_n_function(mmc, enable);
2a91c9134   Amar   COMMON: MMC: Comm...
398
399
  #endif /* CONFIG_SUPPORT_EMMC_BOOT */
  	}
ab71188ce   Markus Niebel   mmc: add setdsr s...
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
  
  	else if (argc == 3 && strcmp(argv[1], "setdsr") == 0) {
  		struct mmc *mmc = find_mmc_device(curr_device);
  		u32 val = simple_strtoul(argv[2], NULL, 16);
  		int ret;
  
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", curr_device);
  			return 1;
  		}
  		ret = mmc_set_dsr(mmc, val);
  		printf("set dsr %s
  ", (!ret) ? "OK, force rescan" : "ERROR");
  		if (!ret) {
  			mmc->has_init = 0;
  			if (mmc_init(mmc))
  				return 1;
  			else
  				return 0;
  		}
  		return ret;
  	}
ed80c931b   Taylor Hutt   mmc: Fix incorrec...
423
424
  	state = MMC_INVALID;
  	if (argc == 5 && strcmp(argv[1], "read") == 0)
6be95ccf9   Lei Wen   MMC: unify mmc re...
425
  		state = MMC_READ;
ed80c931b   Taylor Hutt   mmc: Fix incorrec...
426
  	else if (argc == 5 && strcmp(argv[1], "write") == 0)
6be95ccf9   Lei Wen   MMC: unify mmc re...
427
  		state = MMC_WRITE;
ed80c931b   Taylor Hutt   mmc: Fix incorrec...
428
  	else if (argc == 4 && strcmp(argv[1], "erase") == 0)
e6f99a561   Lei Wen   MMC: add erase fu...
429
  		state = MMC_ERASE;
272cc70b2   Andy Fleming   Add MMC Framework
430

6be95ccf9   Lei Wen   MMC: unify mmc re...
431
432
  	if (state != MMC_INVALID) {
  		struct mmc *mmc = find_mmc_device(curr_device);
e6f99a561   Lei Wen   MMC: add erase fu...
433
434
435
436
437
438
439
440
  		int idx = 2;
  		u32 blk, cnt, n;
  		void *addr;
  
  		if (state != MMC_ERASE) {
  			addr = (void *)simple_strtoul(argv[idx], NULL, 16);
  			++idx;
  		} else
088f1b199   Kim Phillips   common/cmd_*.c: s...
441
  			addr = NULL;
e6f99a561   Lei Wen   MMC: add erase fu...
442
443
  		blk = simple_strtoul(argv[idx], NULL, 16);
  		cnt = simple_strtoul(argv[idx + 1], NULL, 16);
272cc70b2   Andy Fleming   Add MMC Framework
444

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
445
446
447
448
449
  		if (!mmc) {
  			printf("no mmc device at slot %x
  ", curr_device);
  			return 1;
  		}
e85649c7e   Rabin Vincent   mmc: check find_m...
450

6be95ccf9   Lei Wen   MMC: unify mmc re...
451
452
453
  		printf("
  MMC %s: dev # %d, block # %d, count %d ... ",
  				argv[1], curr_device, blk, cnt);
272cc70b2   Andy Fleming   Add MMC Framework
454

ea6ebe217   Lei Wen   cmd_mmc: eliminat...
455
  		mmc_init(mmc);
272cc70b2   Andy Fleming   Add MMC Framework
456

d23d8d7e0   Nikita Kiryanov   mmc: add support ...
457
458
459
460
461
462
463
  		if ((state == MMC_WRITE || state == MMC_ERASE)) {
  			if (mmc_getwp(mmc) == 1) {
  				printf("Error: card is write protected!
  ");
  				return 1;
  			}
  		}
6be95ccf9   Lei Wen   MMC: unify mmc re...
464
465
466
467
468
469
470
471
472
473
474
  		switch (state) {
  		case MMC_READ:
  			n = mmc->block_dev.block_read(curr_device, blk,
  						      cnt, addr);
  			/* flush cache after read */
  			flush_cache((ulong)addr, cnt * 512); /* FIXME */
  			break;
  		case MMC_WRITE:
  			n = mmc->block_dev.block_write(curr_device, blk,
  						      cnt, addr);
  			break;
e6f99a561   Lei Wen   MMC: add erase fu...
475
476
477
  		case MMC_ERASE:
  			n = mmc->block_dev.block_erase(curr_device, blk, cnt);
  			break;
6be95ccf9   Lei Wen   MMC: unify mmc re...
478
479
480
  		default:
  			BUG();
  		}
272cc70b2   Andy Fleming   Add MMC Framework
481

6be95ccf9   Lei Wen   MMC: unify mmc re...
482
483
484
  		printf("%d blocks %s: %s
  ",
  				n, argv[1], (n == cnt) ? "OK" : "ERROR");
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
485
  		return (n == cnt) ? 0 : 1;
272cc70b2   Andy Fleming   Add MMC Framework
486
  	}
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
487

4c12eeb8b   Simon Glass   Convert cmd_usage...
488
  	return CMD_RET_USAGE;
272cc70b2   Andy Fleming   Add MMC Framework
489
490
491
492
  }
  
  U_BOOT_CMD(
  	mmc, 6, 1, do_mmcops,
852dbfdd5   Mike Frysinger   more command usag...
493
  	"MMC sub system",
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
494
495
496
497
  	"read addr blk# cnt
  "
  	"mmc write addr blk# cnt
  "
e6f99a561   Lei Wen   MMC: add erase fu...
498
499
  	"mmc erase blk# cnt
  "
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
500
501
502
503
  	"mmc rescan
  "
  	"mmc part - lists available partition on current mmc device
  "
bc897b1d4   Lei Wen   mmc: enable parti...
504
505
  	"mmc dev [dev] [part] - show or set current mmc device [partition]
  "
2a91c9134   Amar   COMMON: MMC: Comm...
506
507
508
  	"mmc list - lists available devices
  "
  #ifdef CONFIG_SUPPORT_EMMC_BOOT
5a99b9de1   Tom Rini   cmd_mmc.c: Add bo...
509
510
511
512
  	"mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
  "
  	" - Set the BOOT_BUS_WIDTH field of the specified device
  "
f1fd957e1   Tom Rini   cmd_mmc.c: Rename...
513
514
515
516
  	"mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
  "
  	" - Change sizes of boot and RPMB partitions of specified device
  "
792970b0a   Tom Rini   cmd_mmc.c: Add 'p...
517
518
519
520
  	"mmc partconf dev boot_ack boot_partition partition_access
  "
  	" - Change the bits of the PARTITION_CONFIG field of the specified device
  "
33ace362f   Tom Rini   mmc: Add 'mmc rst...
521
522
523
524
525
526
  	"mmc rst-function dev value
  "
  	" - Change the RST_n_FUNCTION field of the specified device
  "
  	"   WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
  "
3511b4e20   Dirk Behme   MMC: Don't use ne...
527
  #endif
ab71188ce   Markus Niebel   mmc: add setdsr s...
528
529
  	"mmc setdsr - set DSR register value
  "
2a91c9134   Amar   COMMON: MMC: Comm...
530
531
  	);
  #endif /* !CONFIG_GENERIC_MMC */