COMMAND: MMC: Extend mmc command to make emmc bootable

Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
index 62a1c22..c50b6d3 100644
--- a/common/cmd_mmc.c
+++ b/common/cmd_mmc.c
@@ -199,7 +199,7 @@
 		print_mmc_devices('\n');
 		return 0;
 	} else if (strcmp(argv[1], "dev") == 0) {
-		int dev, part = -1;
+		int dev, part = -1, bootable = 0;
 		struct mmc *mmc;
 
 		if (argc == 2)
@@ -214,6 +214,19 @@
 					" than %d\n", PART_ACCESS_MASK);
 				return 1;
 			}
+		} else if (argc == 5) {
+			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\n", PART_ACCESS_MASK);
+				return 1;
+			}
+			bootable = (int)simple_strtoul(argv[4], NULL, 10);
+			if (bootable < 0 || bootable > 1) {
+				printf("bootable is boolean variable \n");
+				return 1;
+			}
 		} else
 			return CMD_RET_USAGE;
 
@@ -231,7 +244,14 @@
 				return 1;
 			}
 
-			if (part != mmc->part_num) {
+			if (bootable) {
+				ret = mmc_part_bootenable(dev, part);
+				if (!ret)
+					mmc->part_num = part;
+				printf("partions #%d, made bootable %s\n",
+						part, (!ret) ? "OK" : "ERROR");
+
+			} else if (part != mmc->part_num) {
 				ret = mmc_switch_part(dev, part);
 				if (!ret)
 					mmc->part_num = part;
@@ -317,6 +337,6 @@
 	"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"
+	"mmc dev [dev] [part] [bootable]- show or set current mmc device [partition] [bootable]\n"
 	"mmc list - lists available devices");
 #endif
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 5ffd8c5..1d2fa73 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -669,6 +669,20 @@
 			  | (part_num & PART_ACCESS_MASK));
 }
 
+int mmc_part_bootenable(int dev_num, unsigned int part_num)
+{
+	struct mmc *mmc = find_mmc_device(dev_num);
+
+	if (!mmc)
+		return -1;
+
+	return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
+			  (mmc->part_config & ~(BOOT_PART_ENABLE_MASK | PART_ACCESS_MASK))
+			  | (part_num & PART_ACCESS_MASK)
+			  | ((part_num << 3) & BOOT_PART_ENABLE_MASK)
+			  | BOOT_ACK);
+}
+
 int mmc_getcd(struct mmc *mmc)
 {
 	int cd;
diff --git a/include/mmc.h b/include/mmc.h
index a13e2bd..ed4c4e2 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -199,6 +199,8 @@
 
 #define MMCPART_NOAVAILABLE	(0xff)
 #define PART_ACCESS_MASK	(0x7)
+#define BOOT_PART_ENABLE_MASK	(0x7 << 3)
+#define BOOT_ACK		(0x1 << 6)
 #define PART_SUPPORT		(0x1)
 
 struct mmc_cid {