Message ID | 5570bdf5ebb3aaae5a376634ecfbac9c2fd7b9f4.1396384101.git.stefan@agner.ch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Stefan, On Tue, Apr 1, 2014 at 1:35 PM, <stefan@agner.ch> wrote: > From: Stefan Agner <stefan@agner.ch> > > To get the SD/MMC host device ID, read the alias from the device > tree. > > This is useful in case a SoC has multipe SD/MMC host controllers while > the second controller should logically be the first device (e.g. if > the second controller is connected to an internal eMMC). Combined > with block device numbering using MMC/SD host device ID, this > results in predictable name assignment of the internal eMMC block > device. > > Signed-off-by: Stefan Agner <stefan@agner.ch> Yes, please. It is very handy to have mmc devices be enumerated in a predictable way. Reviewed-by: Doug Anderson <dianders@chromium.org> Tested-by: Doug Anderson <dianders@chromium.org> -- 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
Hi, On Tue, Apr 1, 2014 at 1:35 PM, <stefan@agner.ch> wrote: > From: Stefan Agner <stefan@agner.ch> > > To get the SD/MMC host device ID, read the alias from the device > tree. > > This is useful in case a SoC has multipe SD/MMC host controllers while > the second controller should logically be the first device (e.g. if > the second controller is connected to an internal eMMC). Combined > with block device numbering using MMC/SD host device ID, this > results in predictable name assignment of the internal eMMC block > device. > > Signed-off-by: Stefan Agner <stefan@agner.ch> > --- > drivers/mmc/core/host.c | 24 +++++++++++++++++++----- > 1 file changed, 19 insertions(+), 5 deletions(-) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index 49bc403..29f44cf 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -448,8 +448,8 @@ EXPORT_SYMBOL(mmc_of_parse); > */ > struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > { > - int err; > struct mmc_host *host; > + int of_id = -1, id = -1; > > host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL); > if (!host) > @@ -459,12 +459,26 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > host->rescan_disable = 1; > idr_preload(GFP_KERNEL); > spin_lock(&mmc_host_lock); > - err = idr_alloc(&mmc_host_idr, host, 0, 0, GFP_NOWAIT); > - if (err >= 0) > - host->index = err; > + > + if (dev->of_node) > + of_id = of_alias_get_id(dev->of_node, "mmc"); Not that there's much chance of such an old patch landing, but just in case anyone finds this Dmitry points out that this causes a "scheduling while atomic". A fix is to move the "of_alias_get_id" up above the spin_lock(): https://chromium-review.googlesource.com/#/c/259916/ -Doug -- 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/core/host.c b/drivers/mmc/core/host.c index 49bc403..29f44cf 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -448,8 +448,8 @@ EXPORT_SYMBOL(mmc_of_parse); */ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) { - int err; struct mmc_host *host; + int of_id = -1, id = -1; host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL); if (!host) @@ -459,12 +459,26 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) host->rescan_disable = 1; idr_preload(GFP_KERNEL); spin_lock(&mmc_host_lock); - err = idr_alloc(&mmc_host_idr, host, 0, 0, GFP_NOWAIT); - if (err >= 0) - host->index = err; + + if (dev->of_node) + of_id = of_alias_get_id(dev->of_node, "mmc"); + + if (of_id >= 0) { + id = idr_alloc(&mmc_host_idr, host, of_id, of_id + 1, + GFP_NOWAIT); + if (id < 0) + dev_warn(dev, "/aliases ID %d not available\n", of_id); + } + + if (id < 0) + id = idr_alloc(&mmc_host_idr, host, 0, 0, GFP_NOWAIT); + + if (id >= 0) + host->index = id; + spin_unlock(&mmc_host_lock); idr_preload_end(); - if (err < 0) + if (id < 0) goto free; dev_set_name(&host->class_dev, "mmc%d", host->index);