mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-08 04:42:04 -04:00
mmc: allow setting slot index via device tree alias
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 . Git-repo: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/ Git-commit: fa2d0aa96941e8dc347e49a04c75468e3002ee20_ Change-Id: I88c11705c8b66022e67b38a64bbc91625357a4bc 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> Signed-off-by: Ram Prakash Gupta <rampraka@codeaurora.org>
This commit is contained in:
parent
dd05986c8b
commit
8dceb5dc57
1 changed files with 25 additions and 1 deletions
|
|
@ -464,6 +464,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("sdhc");
|
||||
if (max < 0)
|
||||
return 0;
|
||||
|
||||
return max + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* mmc_alloc_host - initialise the per-host structure.
|
||||
* @extra: sizeof private data structure
|
||||
|
|
@ -475,6 +489,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)
|
||||
|
|
@ -483,7 +498,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, "sdhc");
|
||||
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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue