MLK-17621-2 mmc: add feature of setting slot index via devicetree alias
authorHaibo Chen <haibo.chen@nxp.com>
Mon, 26 Feb 2018 07:12:18 +0000 (15:12 +0800)
committerHaibo Chen <haibo.chen@nxp.com>
Thu, 12 Apr 2018 10:45:50 +0000 (18:45 +0800)
Add feature of setting slot index via devicetree alias, to hard code the
mmc/sd root device.

The patch requires additional alias_id fix or it won't work.

Note: minor device number keep independent with this device alias.

Refer to the commit 35928d6c6a76 ("mmc: Allow setting slot index via
devicetree alias").

Acked-by: Leonard Crestez <leonard.crestez@nxp.com>
Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
drivers/mmc/core/core.c
drivers/mmc/core/core.h
drivers/mmc/core/host.c
drivers/of/base.c

index 316b633..d2eb755 100644 (file)
@@ -64,6 +64,8 @@
 
 static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };
 
+static int __mmc_max_reserved_idx = -1;
+
 /*
  * Enabling software CRCs on the data blocks can be a significant (30%)
  * performance cost, and for other reasons may not always be desired.
@@ -3165,10 +3167,46 @@ void mmc_init_context_info(struct mmc_host *host)
        init_waitqueue_head(&host->context_info.wait);
 }
 
+/*
+ * mmc_first_nonreserved_index() - get the first index that
+ * is not reserved
+ */
+int mmc_first_nonreserved_index(void)
+{
+       return __mmc_max_reserved_idx + 1;
+}
+EXPORT_SYMBOL(mmc_first_nonreserved_index);
+
+/*
+ * mmc_get_reserved_index() - get the index reserved for this host
+ * Return: The index reserved for this host or negative error value
+ *        if no index is reserved for this host
+ */
+int mmc_get_reserved_index(struct mmc_host *host)
+{
+       return of_alias_get_id(host->parent->of_node, "mmc");
+}
+EXPORT_SYMBOL(mmc_get_reserved_index);
+
+static void mmc_of_reserve_idx(void)
+{
+       int max;
+
+       max = of_alias_max_index("mmc");
+       if (max < 0)
+               return;
+
+       __mmc_max_reserved_idx = max;
+       pr_debug("MMC: reserving %d slots for of aliases\n",
+                       __mmc_max_reserved_idx + 1);
+}
+
 static int __init mmc_init(void)
 {
        int ret;
 
+       mmc_of_reserve_idx();
+
        ret = mmc_register_bus();
        if (ret)
                return ret;
index 55f543f..222f588 100644 (file)
@@ -80,6 +80,8 @@ int mmc_attach_mmc(struct mmc_host *host);
 int mmc_attach_sd(struct mmc_host *host);
 int mmc_attach_sdio(struct mmc_host *host);
 
+int mmc_first_nonreserved_index(void);
+int mmc_get_reserved_index(struct mmc_host *host);
 /* Module parameters */
 extern bool use_spi_crc;
 
index f56b490..aa4afba 100644 (file)
@@ -353,6 +353,7 @@ EXPORT_SYMBOL(mmc_of_parse);
 struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 {
        int err;
+       int alias_id;
        struct mmc_host *host;
 
        host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
@@ -361,8 +362,16 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 
        /* scanning will be enabled when we're ready */
        host->rescan_disable = 1;
+       host->parent = dev;
 
-       err = ida_simple_get(&mmc_host_ida, 0, 0, GFP_KERNEL);
+       alias_id = mmc_get_reserved_index(host);
+       if (alias_id >= 0)
+               err = ida_simple_get(&mmc_host_ida, alias_id,
+                                       alias_id + 1, GFP_KERNEL);
+       else
+               err = ida_simple_get(&mmc_host_ida,
+                                       mmc_first_nonreserved_index(),
+                                       0, GFP_KERNEL);
        if (err < 0) {
                kfree(host);
                return NULL;
@@ -372,7 +381,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 
        dev_set_name(&host->class_dev, "mmc%d", host->index);
 
-       host->parent = dev;
        host->class_dev.parent = dev;
        host->class_dev.class = &mmc_host_class;
        device_initialize(&host->class_dev);
index 5fbd492..4d6cbfe 100644 (file)
@@ -2077,6 +2077,7 @@ int of_alias_max_index(const char *stem)
 
        return max;
 }
+EXPORT_SYMBOL_GPL(of_alias_max_index);
 
 /**
  * of_alias_scan - Scan all properties of the 'aliases' node