MMC: add erase function to both mmc and sd

Erase is a very basic function since the begin of sd specification is
announced. Although we could write a bulk of full 0xff memory to the
range to take place of erase, it is more convenient and safe to
implement the erase function itself.

Signed-off-by: Lei Wen <leiwen@marvell.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
index a645803..7335cdc 100644
--- a/common/cmd_mmc.c
+++ b/common/cmd_mmc.c
@@ -91,6 +91,7 @@
 	MMC_INVALID,
 	MMC_READ,
 	MMC_WRITE,
+	MMC_ERASE,
 };
 static void print_mmcinfo(struct mmc *mmc)
 {
@@ -252,15 +253,24 @@
 		state = MMC_READ;
 	else if (strcmp(argv[1], "write") == 0)
 		state = MMC_WRITE;
+	else if (strcmp(argv[1], "erase") == 0)
+		state = MMC_ERASE;
 	else
 		state = MMC_INVALID;
 
 	if (state != MMC_INVALID) {
 		struct mmc *mmc = find_mmc_device(curr_device);
-		void *addr = (void *)simple_strtoul(argv[2], NULL, 16);
-		u32 blk = simple_strtoul(argv[3], NULL, 16);
-		u32 cnt = simple_strtoul(argv[4], NULL, 16);
-		u32 n;
+		int idx = 2;
+		u32 blk, cnt, n;
+		void *addr;
+
+		if (state != MMC_ERASE) {
+			addr = (void *)simple_strtoul(argv[idx], NULL, 16);
+			++idx;
+		} else
+			addr = 0;
+		blk = simple_strtoul(argv[idx], NULL, 16);
+		cnt = simple_strtoul(argv[idx + 1], NULL, 16);
 
 		if (!mmc) {
 			printf("no mmc device at slot %x\n", curr_device);
@@ -283,6 +293,9 @@
 			n = mmc->block_dev.block_write(curr_device, blk,
 						      cnt, addr);
 			break;
+		case MMC_ERASE:
+			n = mmc->block_dev.block_erase(curr_device, blk, cnt);
+			break;
 		default:
 			BUG();
 		}
@@ -300,6 +313,7 @@
 	"MMC sub system",
 	"read addr blk# cnt\n"
 	"mmc write addr blk# cnt\n"
+	"mmc erase blk# cnt\n"
 	"mmc rescan\n"
 	"mmc part - lists available partition on current mmc device\n"
 	"mmc dev [dev] [part] - show or set current mmc device [partition]\n"