Message ID | 1379903897-16019-1-git-send-email-festevam@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 09/22/2013 08:38 PM, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > On embedded devices, there is often 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. > > Allow the sdhci-esdhc-imx driver to retrieve the mmc aliases, so that we can > map via the device tree which mmcblk corresponds to the rootfs. > diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c > - devidx = find_first_zero_bit(dev_use, max_devices); > + devidx = find_next_zero_bit(dev_use, max_devices, card->host->devidx); I'm not sure if this works; what if the SD card gets detected/removed without recycling the device name/ID a few times before the fixed eMMC is detected? So, in the perfect case this will achieve what you want, but not in some unusual cases. So I don't think it's a good idea to rely on this. -- 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 --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 1a3163f..94f842b 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -2026,7 +2026,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, struct mmc_blk_data *md; int devidx, ret; - devidx = find_first_zero_bit(dev_use, max_devices); + devidx = find_next_zero_bit(dev_use, max_devices, card->host->devidx); if (devidx >= max_devices) return ERR_PTR(-ENOSPC); __set_bit(devidx, dev_use); @@ -2044,7 +2044,8 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, * index anymore so we keep track of a name index. */ if (!subname) { - md->name_idx = find_first_zero_bit(name_use, max_devices); + md->name_idx = find_next_zero_bit(name_use, max_devices, + card->host->devidx); __set_bit(md->name_idx, name_use); } else md->name_idx = ((struct mmc_blk_data *) diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index abc8cf0..e11a6af 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -524,8 +524,9 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) struct sdhci_pltfm_host *pltfm_host; struct sdhci_host *host; struct esdhc_platform_data *boarddata; - int err; + int err, ret; struct pltfm_imx_data *imx_data; + struct device_node *np = pdev->dev.of_node; host = sdhci_pltfm_init(pdev, &sdhci_esdhc_imx_pdata, 0); if (IS_ERR(host)) @@ -602,6 +603,13 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) host->mmc->parent->platform_data); } + + if (np) { + ret = of_alias_get_id(np, "mmcblk"); + if (ret >= 0) + host->mmc->devidx = ret; + } + /* write_protect */ if (boarddata->wp_type == ESDHC_WP_GPIO) { err = mmc_gpio_request_ro(host->mmc, boarddata->wp_gpio); diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 3b0c33a..8209f72 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -362,6 +362,8 @@ struct mmc_host { unsigned int slotno; /* used for sdio acpi binding */ + /* preferred mmc block device index (mmcblkX) */ + unsigned int devidx; unsigned long private[0] ____cacheline_aligned; };