]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
zynqmp: sdhci: Prevent SD driver deferred probe after host init
authorManish Narani <manish.narani@xilinx.com>
Thu, 10 Aug 2017 08:22:03 +0000 (13:52 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 15 Aug 2017 10:37:23 +0000 (12:37 +0200)
This patch prevents deferred probe after the host initialization is
done. Instead if the deferred probe is necessary, do it before the host
initialization. This way the unnecessary increase in host id can be
avoided.
In standard boot flow deferred probe is called at least 2 times
that's why it is better to extract it out.
Also add error message when getting silicon version fails.

Signed-off-by: Manish Narani <mnarani@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/mmc/host/sdhci-of-arasan.c

index d79371f00c79af4e802b013df335fd5c9a7df56a..2436e802d66485bef44475a4db92e5f5dfc867ff 100644 (file)
@@ -801,18 +801,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
        struct sdhci_pltfm_host *pltfm_host;
        struct sdhci_arasan_data *sdhci_arasan;
        struct device_node *np = pdev->dev.of_node;
-
-       host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
-                               sizeof(*sdhci_arasan));
-       if (IS_ERR(host))
-               return PTR_ERR(host);
-
-       pltfm_host = sdhci_priv(host);
-       sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
-       sdhci_arasan->host = host;
-
-       match = of_match_node(sdhci_arasan_of_match, pdev->dev.of_node);
-       sdhci_arasan->soc_ctl_map = match->data;
+       unsigned int host_quirks2 = 0;
 
        if (of_device_is_compatible(pdev->dev.of_node, "xlnx,zynqmp-8.9a")) {
                char *soc_rev;
@@ -823,9 +812,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
                if (PTR_ERR(soc_rev) == -EPROBE_DEFER)
                        /* Do a deferred probe */
                        return -EPROBE_DEFER;
+               else if (IS_ERR(soc_rev))
+                       dev_dbg(&pdev->dev, "Error getting silicon version\n");
 
+               /* Set host quirk if the silicon version is v1.0 */
                if (!IS_ERR(soc_rev) && (*soc_rev == ZYNQMP_SILICON_V1))
-                       host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
+                       host_quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
 
                /* Clean soc_rev if got a valid pointer from nvmem driver
                 * else we may end up in kernel panic
@@ -834,6 +826,20 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
                        kfree(soc_rev);
        }
 
+       host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
+                               sizeof(*sdhci_arasan));
+       if (IS_ERR(host))
+               return PTR_ERR(host);
+
+       pltfm_host = sdhci_priv(host);
+       sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
+       sdhci_arasan->host = host;
+
+       match = of_match_node(sdhci_arasan_of_match, pdev->dev.of_node);
+       sdhci_arasan->soc_ctl_map = match->data;
+
+       host->quirks2 |= host_quirks2;
+
        node = of_parse_phandle(pdev->dev.of_node, "arasan,soc-ctl-syscon", 0);
        if (node) {
                sdhci_arasan->soc_ctl_base = syscon_node_to_regmap(node);