diff mbox

Devicetree: Initialization order of mmc block devices?

Message ID 50110AFB.9090300@de.bosch.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Dirk Behme July 26, 2012, 9:16 a.m. UTC
On 20.07.2012 13:56, Jassi Brar wrote:
> On 20 July 2012 17:00, Dirk Behme <dirk.behme@de.bosch.com> wrote:
>> On 19.07.2012 22:45, Jassi Brar wrote:
> 
>>>> This problem can occur on many devices with embedded MMC and removable
>>>> SD,
>>>> e.g. smart phones. So I think we should find an solution to define MMC
>>>> scan
>>>> order or device number/name in a device tree.
>>>>
>>> I assume your issue is that due to async nature of mmc scanning, the
>>> eMMC is detected later than external card, despite being the probe for
>>> eMMC's slot initiated first ?
>>> If so, we can do by simply associating 'N' of 'mmcblkN' with the slot
>>> index i.e, mmc_host.index (instead of mmc_blk_data.name_idx). Which is
>>> always in the order of probe calling. And we don't need to modify, or
>>> expect more of, DT for that.
>>
>> Do you mean something like
>>
>> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
>> --- a/drivers/mmc/card/block.c
>> +++ b/drivers/mmc/card/block.c
>> @@ -1536,7 +1536,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct
>> mmc_card *card,
>>          */
>>
>>         snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
>> -                "mmcblk%d%s", md->name_idx, subname ? subname : "");
>> +                "mmcblk%d%s", card->host->index, subname ? subname : "");
>>
>>         blk_queue_logical_block_size(md->queue.queue, 512);
>>         set_capacity(md->disk, size);
>>
>> ?
>>
> Exactly!
> It seems too trivial and default for the author to have missed it, so
> I suspect I am overlooking something yet again. I would dig email
> archives to know more about that naming convention before dare submit
> a patch :)

What's about anything like this [1]?

Best regards

Dirk

[1]

---
  drivers/mmc/card/Kconfig |   27 +++++++++++++++++++++++++++
  drivers/mmc/card/block.c |    2 +-
  include/linux/mmc/host.h |    7 +++++++
  3 files changed, 35 insertions(+), 1 deletion(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Jassi Brar July 26, 2012, 9:39 a.m. UTC | #1
On 26 July 2012 14:46, Dirk Behme <dirk.behme@de.bosch.com> wrote:

> ---
>  drivers/mmc/card/Kconfig |   27 +++++++++++++++++++++++++++
>  drivers/mmc/card/block.c |    2 +-
>  include/linux/mmc/host.h |    7 +++++++
>  3 files changed, 35 insertions(+), 1 deletion(-)
>
> Index: a/drivers/mmc/card/Kconfig
> ===================================================================
> --- a/drivers/mmc/card/Kconfig
> +++ b/drivers/mmc/card/Kconfig
> @@ -50,6 +50,33 @@ config MMC_BLOCK_BOUNCE
>
>           If unsure, say Y here.
>
> +config MMC_SLOTINDEX
> +       bool "Use host index for enumerating mmxblkN"
> +       depends on MMC_BLOCK
> +       default n
> +       help
> +         On embedded devices, often there is a combination of
> +         removable mmc devices (e.g. MMC/SD cards) and hard
> +         wired ones (e.g. eMMC). Depending on the hardware
> +         configuration, the 'mmcblkN' node might change if
> +         the removable device is available or not at boot time.
> +
> +         E.g. if the removable device is attached at boot time,
> +         it might become mmxblk0. And the hard wired one mmcblk1.
> +         But if the removable device isn't there at boot time,
> +         the hard wired one will become mmcblk0. This makes it
> +         somehow difficult to hard code the root device to the
> +         non-removable device and boot fast.
> +
> +         Enabling this option will simply associating 'N' of
> +         'mmcblkN' with the slot index instead of the dynamic
> +         name index. The slot index is always the same, ensuring
> +         that the non-removable mmc device is associated always
> +         with the same mmcblkN. Independent of the availability of
> +         the removable one.
> +
> +         If unsure, say N here.
> +
>  config SDIO_UART
>         tristate "SDIO UART/GPS class support"
>         help
> Index: a/drivers/mmc/card/block.c
> ===================================================================
>
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -1536,7 +1536,7 @@ static struct mmc_blk_data *mmc_blk_allo
>          */
>
>         snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
> -                "mmcblk%d%s", md->name_idx, subname ? subname : "");
> +                "mmcblk%d%s", NAMEIDX, subname ? subname : "");
>
>
>         blk_queue_logical_block_size(md->queue.queue, 512);
>         set_capacity(md->disk, size);
> Index: a/include/linux/mmc/host.h
> ===================================================================
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -437,4 +437,11 @@ static inline unsigned int mmc_host_clk_
>         return host->ios.clock;
>  }
>  #endif
> +
> +#ifdef CONFIG_MMC_SLOTINDEX
> +#define NAMEIDX (card->host->index)
> +#else
> +#define NAMEIDX (md->name_idx)
> +#endif
> +
>  #endif /* LINUX_MMC_HOST_H */

I would suggest first attempting the original patch ...

        snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
-                "mmcblk%d%s", md->name_idx, subname ? subname : "");
+                "mmcblk%d%s", card->host->index, subname ? subname : "");


That would either provide the simplest solution to the problem or
teach us the importance of current naming scheme, in which case you
could try this patch :)
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Index: a/drivers/mmc/card/Kconfig
===================================================================
--- a/drivers/mmc/card/Kconfig
+++ b/drivers/mmc/card/Kconfig
@@ -50,6 +50,33 @@  config MMC_BLOCK_BOUNCE

  	  If unsure, say Y here.

+config MMC_SLOTINDEX
+	bool "Use host index for enumerating mmxblkN"
+	depends on MMC_BLOCK
+	default n
+	help
+	  On embedded devices, often there is a combination of
+	  removable mmc devices (e.g. MMC/SD cards) and hard
+	  wired ones (e.g. eMMC). Depending on the hardware
+	  configuration, the 'mmcblkN' node might change if
+	  the removable device is available or not at boot time.
+
+	  E.g. if the removable device is attached at boot time,
+	  it might become mmxblk0. And the hard wired one mmcblk1.
+	  But if the removable device isn't there at boot time,
+	  the hard wired one will become mmcblk0. This makes it
+	  somehow difficult to hard code the root device to the
+	  non-removable device and boot fast.
+
+	  Enabling this option will simply associating 'N' of
+	  'mmcblkN' with the slot index instead of the dynamic
+	  name index. The slot index is always the same, ensuring
+	  that the non-removable mmc device is associated always
+	  with the same mmcblkN. Independent of the availability of
+	  the removable one.
+
+	  If unsure, say N here.
+
  config SDIO_UART
  	tristate "SDIO UART/GPS class support"
  	help
Index: a/drivers/mmc/card/block.c
===================================================================
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -1536,7 +1536,7 @@  static struct mmc_blk_data *mmc_blk_allo
  	 */

  	snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
-		 "mmcblk%d%s", md->name_idx, subname ? subname : "");
+		 "mmcblk%d%s", NAMEIDX, subname ? subname : "");

  	blk_queue_logical_block_size(md->queue.queue, 512);
  	set_capacity(md->disk, size);
Index: a/include/linux/mmc/host.h
===================================================================
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -437,4 +437,11 @@  static inline unsigned int mmc_host_clk_
  	return host->ios.clock;
  }
  #endif
+
+#ifdef CONFIG_MMC_SLOTINDEX
+#define NAMEIDX (card->host->index)
+#else
+#define NAMEIDX (md->name_idx)
+#endif
+
  #endif /* LINUX_MMC_HOST_H */