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 #include #include +#include #include #include @@ -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);