Message ID | 20200901085004.2512-1-matthias.schiffer@ew.tq-group.com |
---|---|
State | Not Applicable, archived |
Headers | show |
Series | [mmc-next,v4,1/2] dt-bindings: mmc: document alias support | expand |
Context | Check | Description |
---|---|---|
robh/checkpatch | success | |
robh/dt-meta-schema | success |
On Tue, 1 Sep 2020 at 10:50, Matthias Schiffer <matthias.schiffer@ew.tq-group.com> wrote: > > As for I2C and SPI, it now is possible to reserve a fixed index for > mmc/mmcblk devices. > > Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> Applied for next, thanks! Kind regards Uffe > --- > > v4: moved alias documentation from example to description > > v3: new patch > > Documentation/devicetree/bindings/mmc/mmc-controller.yaml | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/Documentation/devicetree/bindings/mmc/mmc-controller.yaml b/Documentation/devicetree/bindings/mmc/mmc-controller.yaml > index b96da0c7f819..f928f66fc59a 100644 > --- a/Documentation/devicetree/bindings/mmc/mmc-controller.yaml > +++ b/Documentation/devicetree/bindings/mmc/mmc-controller.yaml > @@ -14,6 +14,10 @@ description: | > that requires the respective functionality should implement them using > these definitions. > > + It is possible to assign a fixed index mmcN to an MMC host controller > + (and the corresponding mmcblkN devices) by defining an alias in the > + /aliases device tree node. > + > properties: > $nodename: > pattern: "^mmc(@.*)?$" > -- > 2.17.1 >
On Tue, 1 Sep 2020 at 10:50, Matthias Schiffer <matthias.schiffer@ew.tq-group.com> wrote: > > As with GPIO, UART and others, allow specifying the device index via the > aliases node in the device tree. > > On embedded devices, there is often a combination of removable (e.g. > SD card) and non-removable MMC devices (e.g. eMMC). > Therefore the index might change depending on > > * host of removable device > * removable card present or not > > This makes it difficult to hardcode the root device, if it is on the > non-removable device. E.g. if SD card is present eMMC will be mmcblk1, > if SD card is not present at boot, eMMC will be mmcblk0. > > Alternative solutions like PARTUUIDs do not cover the case where multiple > mmcblk devices contain the same image. This is a common issue on devices > that can boot both from eMMC (for regular boot) and SD cards (as a > temporary boot medium for development). When a firmware image is > installed to eMMC after a test boot via SD card, there will be no > reliable way to refer to a specific device using (PART)UUIDs oder > LABELs. > > The demand for this feature has led to multiple attempts to implement > it, dating back at least to 2012 (see > https://www.spinics.net/lists/linux-mmc/msg26586.html for a previous > discussion from 2014). > > All indices defined in the aliases node will be reserved for use by the > respective MMC device, moving the indices of devices that don't have an > alias up into the non-reserved range. If the aliases node is not found, > the driver will act as before. > > This is a rebased and cleaned up version of > https://www.spinics.net/lists/linux-mmc/msg26588.html . > > Based-on-patch-by: Sascha Hauer <s.hauer@pengutronix.de> > Link: https://lkml.org/lkml/2020/8/5/194 > Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> Applied for next, thanks! Kind regards Uffe > --- > > v4: > - minor adjustments to commit message > > v3: > - remove unneeded mmcblock changes > - remove most helper functions to simplify code > - extended commit message > > v2: > - fix missing symbols for modular mmcblock > > > > drivers/mmc/core/host.c | 26 +++++++++++++++++++++++++- > 1 file changed, 25 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c8fae6611b73..96b2ca1f1b06 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -376,6 +376,20 @@ int mmc_of_parse_voltage(struct device_node *np, u32 *mask) > } > EXPORT_SYMBOL(mmc_of_parse_voltage); > > +/** > + * mmc_first_nonreserved_index() - get the first index that is not reserved > + */ > +static int mmc_first_nonreserved_index(void) > +{ > + int max; > + > + max = of_alias_get_highest_id("mmc"); > + if (max < 0) > + return 0; > + > + return max + 1; > +} > + > /** > * mmc_alloc_host - initialise the per-host structure. > * @extra: sizeof private data structure > @@ -387,6 +401,7 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > { > int err; > struct mmc_host *host; > + int alias_id, min_idx, max_idx; > > host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL); > if (!host) > @@ -395,7 +410,16 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > /* scanning will be enabled when we're ready */ > host->rescan_disable = 1; > > - err = ida_simple_get(&mmc_host_ida, 0, 0, GFP_KERNEL); > + alias_id = of_alias_get_id(dev->of_node, "mmc"); > + if (alias_id >= 0) { > + min_idx = alias_id; > + max_idx = alias_id + 1; > + } else { > + min_idx = mmc_first_nonreserved_index(); > + max_idx = 0; > + } > + > + err = ida_simple_get(&mmc_host_ida, min_idx, max_idx, GFP_KERNEL); > if (err < 0) { > kfree(host); > return NULL; > -- > 2.17.1 >
diff --git a/Documentation/devicetree/bindings/mmc/mmc-controller.yaml b/Documentation/devicetree/bindings/mmc/mmc-controller.yaml index b96da0c7f819..f928f66fc59a 100644 --- a/Documentation/devicetree/bindings/mmc/mmc-controller.yaml +++ b/Documentation/devicetree/bindings/mmc/mmc-controller.yaml @@ -14,6 +14,10 @@ description: | that requires the respective functionality should implement them using these definitions. + It is possible to assign a fixed index mmcN to an MMC host controller + (and the corresponding mmcblkN devices) by defining an alias in the + /aliases device tree node. + properties: $nodename: pattern: "^mmc(@.*)?$"
As for I2C and SPI, it now is possible to reserve a fixed index for mmc/mmcblk devices. Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> --- v4: moved alias documentation from example to description v3: new patch Documentation/devicetree/bindings/mmc/mmc-controller.yaml | 4 ++++ 1 file changed, 4 insertions(+)