diff --git a/arch/arm/boot/dts/am335x-smarc-common.dtsi b/arch/arm/boot/dts/am335x-smarc-common.dtsi
index b87ec5c..03b582f0 100644
--- a/arch/arm/boot/dts/am335x-smarc-common.dtsi
+++ b/arch/arm/boot/dts/am335x-smarc-common.dtsi
@@ -92,6 +92,8 @@
         aliases {
                 rtc0 = &s35390a;
                 rtc1 = &rtc;
+               	mmc0 = &mmc2;   /* Fixed to mmcblk0 for &mmc2 */
+               	mmc1 = &mmc1;   /* Fixed to mmcblk1 for &mmc1 */
         };
 
 	cpus {
@@ -125,7 +127,7 @@
                 status = "okay";
         	pinctrl-names = "default";
         	pinctrl-0 = <&lcd_pins_default>;
-		enable-gpios = <&gpio1 23 0>;
+		enable-gpios = <&gpio1 23 0>; /* Enable LCD_VDD_EN pin */
                 panel-info {
                         ac-bias           = <255>;
                         ac-bias-intrpt    = <0>;
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index e0cbe7b..7abcfa8 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -36,8 +36,6 @@
 		phy1 = &usb1_phy;
 		ethernet0 = &cpsw_emac0;
 		ethernet1 = &cpsw_emac1;
-                mmc1 = &mmc1;   /* Fixed to mmcblk1 for &mmc1 */
-                mmc0 = &mmc2;   /* Fixed to mmcblk0 for &mmc2 */
 	};
 
 	cpus {
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 709a872..f84499f 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -36,6 +36,7 @@
 #include <linux/compat.h>
 #include <linux/pm_runtime.h>
 #include <linux/idr.h>
+#include <linux/of.h>
 
 #include <linux/mmc/ioctl.h>
 #include <linux/mmc/card.h>
@@ -86,6 +87,8 @@ static int max_devices;
 
 #define MAX_DEVICES 256
 
+static DECLARE_BITMAP(name_use, MAX_DEVICES);
+
 static DEFINE_IDA(mmc_blk_ida);
 static DEFINE_SPINLOCK(mmc_blk_lock);
 
@@ -107,6 +110,7 @@ struct mmc_blk_data {
 	unsigned int	usage;
 	unsigned int	read_only;
 	unsigned int	part_type;
+        unsigned int    name_idx;
 	unsigned int	reset_done;
 #define MMC_BLK_READ		BIT(0)
 #define MMC_BLK_WRITE		BIT(1)
@@ -2219,6 +2223,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
 {
 	struct mmc_blk_data *md;
 	int devidx, ret;
+	int idx = 0;
 
 again:
 	if (!ida_pre_get(&mmc_blk_ida, GFP_KERNEL))
@@ -2244,6 +2249,32 @@ again:
 		goto out;
 	}
 
+        /*
+         * !subname implies we are creating main mmc_blk_data that will be
+         * associated with mmc_card with dev_set_drvdata. Due to device
+         * partitions, devidx will not coincide with a per-physical card
+         * index anymore so we keep track of a name index.
+         */
+        if (!subname) {
+                if (card->dev.parent->parent->of_node)
+                        idx = of_alias_get_id(card->dev.parent->parent->of_node,
+                                        "mmc");
+
+                if (idx < 0)
+                        md->name_idx = find_first_zero_bit(name_use,
+                                        max_devices);
+                else {
+                        if (test_bit(idx, name_use))
+                                md->name_idx = find_first_zero_bit(name_use,
+                                                max_devices);
+                        else
+                                md->name_idx = (unsigned int)idx;
+                }
+                __set_bit(md->name_idx, name_use);
+        } else
+                md->name_idx = ((struct mmc_blk_data *)
+                                dev_to_disk(parent)->private_data)->name_idx;
+
 	md->area_type = area_type;
 
 	/*
@@ -2292,7 +2323,7 @@ again:
 	 */
 
 	snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
-		 "mmcblk%u%s", card->host->index, subname ? subname : "");
+		 "mmcblk%u%s", md->name_idx, subname ? subname : "");
 
 	if (mmc_card_mmc(card))
 		blk_queue_logical_block_size(md->queue.queue,
@@ -2450,6 +2481,7 @@ static void mmc_blk_remove_parts(struct mmc_card *card,
 	struct list_head *pos, *q;
 	struct mmc_blk_data *part_md;
 
+        __clear_bit(md->name_idx, name_use);
 	list_for_each_safe(pos, q, &md->part) {
 		part_md = list_entry(pos, struct mmc_blk_data, part);
 		list_del(pos);