public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mmc: core: Pass node pointer to mmc_of_parse
@ 2017-01-21 10:59 Jan Glauber
  2017-01-24  8:56 ` Ulf Hansson
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Glauber @ 2017-01-21 10:59 UTC (permalink / raw)
  To: Ulf Hansson; +Cc: linux-mmc, linux-kernel, Jan Glauber

Extend mmc_of_parse to get the device node pointer as an
additional argument instead of using the device node of the
mmc device.

While this has no effect for the current users it allows
mmc_of_parse to be used by mmc controllers with multiple slots
per device. These controllers can then pass the child node of the
slot.

Signed-off-by: Jan Glauber <jglauber@cavium.com>
---
 drivers/mmc/core/host.c            | 8 +++-----
 drivers/mmc/host/davinci_mmc.c     | 2 +-
 drivers/mmc/host/dw_mmc.c          | 2 +-
 drivers/mmc/host/meson-gx-mmc.c    | 2 +-
 drivers/mmc/host/mmci.c            | 2 +-
 drivers/mmc/host/moxart-mmc.c      | 2 +-
 drivers/mmc/host/mtk-sd.c          | 2 +-
 drivers/mmc/host/mvsdio.c          | 2 +-
 drivers/mmc/host/mxcmmc.c          | 2 +-
 drivers/mmc/host/mxs-mmc.c         | 2 +-
 drivers/mmc/host/omap_hsmmc.c      | 2 +-
 drivers/mmc/host/sdhci-bcm-kona.c  | 2 +-
 drivers/mmc/host/sdhci-brcmstb.c   | 2 +-
 drivers/mmc/host/sdhci-cadence.c   | 2 +-
 drivers/mmc/host/sdhci-dove.c      | 2 +-
 drivers/mmc/host/sdhci-esdhc-imx.c | 2 +-
 drivers/mmc/host/sdhci-iproc.c     | 2 +-
 drivers/mmc/host/sdhci-msm.c       | 2 +-
 drivers/mmc/host/sdhci-of-arasan.c | 2 +-
 drivers/mmc/host/sdhci-of-at91.c   | 2 +-
 drivers/mmc/host/sdhci-of-esdhc.c  | 2 +-
 drivers/mmc/host/sdhci-pic32.c     | 2 +-
 drivers/mmc/host/sdhci-pxav3.c     | 2 +-
 drivers/mmc/host/sdhci-s3c.c       | 2 +-
 drivers/mmc/host/sdhci-st.c        | 2 +-
 drivers/mmc/host/sdhci-tegra.c     | 2 +-
 drivers/mmc/host/sdhci_f_sdh30.c   | 2 +-
 drivers/mmc/host/sh_mmcif.c        | 2 +-
 drivers/mmc/host/sunxi-mmc.c       | 2 +-
 drivers/mmc/host/tmio_mmc_pio.c    | 2 +-
 drivers/mmc/host/usdhi6rol0.c      | 2 +-
 include/linux/mmc/host.h           | 2 +-
 32 files changed, 34 insertions(+), 36 deletions(-)

diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index 98f25ff..444faac 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -171,25 +171,23 @@ static void mmc_retune_timer(unsigned long data)
 /**
  *	mmc_of_parse() - parse host's device-tree node
  *	@host: host whose node should be parsed.
+ *	@np: node that should be parsed.
  *
  * To keep the rest of the MMC subsystem unaware of whether DT has been
  * used to to instantiate and configure this host instance or not, we
  * parse the properties and set respective generic mmc-host flags and
  * parameters.
  */
-int mmc_of_parse(struct mmc_host *host)
+int mmc_of_parse(struct mmc_host *host, struct device_node *np)
 {
-	struct device_node *np;
 	u32 bus_width;
 	int ret;
 	bool cd_cap_invert, cd_gpio_invert = false;
 	bool ro_cap_invert, ro_gpio_invert = false;
 
-	if (!host->parent || !host->parent->of_node)
+	if (!np)
 		return 0;
 
-	np = host->parent->of_node;
-
 	/* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
 	if (of_property_read_u32(np, "bus-width", &bus_width) < 0) {
 		dev_dbg(host->parent,
diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index 36b5af8..1ce9375 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -1257,7 +1257,7 @@ static int __init davinci_mmcsd_probe(struct platform_device *pdev)
 	match = of_match_device(davinci_mmc_dt_ids, &pdev->dev);
 	if (match) {
 		pdev->id_entry = match->data;
-		ret = mmc_of_parse(mmc);
+		ret = mmc_of_parse(mmc, pdev->dev.of_node);
 		if (ret) {
 			dev_err(&pdev->dev,
 				"could not parse of data: %d\n", ret);
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index b44306b..0f10000 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -2673,7 +2673,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
 	if (host->pdata->caps2)
 		mmc->caps2 = host->pdata->caps2;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, host->dev->of_node);
 	if (ret)
 		goto err_host_allocated;
 
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
index 0973935..2cfb959 100644
--- a/drivers/mmc/host/meson-gx-mmc.c
+++ b/drivers/mmc/host/meson-gx-mmc.c
@@ -740,7 +740,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
 	if (ret == -EPROBE_DEFER)
 		goto free_host;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, pdev->dev.of_node);
 	if (ret) {
 		dev_warn(&pdev->dev, "error parsing DT: %d\n", ret);
 		goto free_host;
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 01a8047..36bb957 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -1505,7 +1505,7 @@ static struct mmc_host_ops mmci_ops = {
 static int mmci_of_parse(struct device_node *np, struct mmc_host *mmc)
 {
 	struct mmci_host *host = mmc_priv(mmc);
-	int ret = mmc_of_parse(mmc);
+	int ret = mmc_of_parse(mmc, np);
 
 	if (ret)
 		return ret;
diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c
index bbad309..c710d4f 100644
--- a/drivers/mmc/host/moxart-mmc.c
+++ b/drivers/mmc/host/moxart-mmc.c
@@ -599,7 +599,7 @@ static int moxart_probe(struct platform_device *pdev)
 		goto out;
 	}
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, node);
 	if (ret)
 		goto out;
 
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 10ef2ae..cdbe76c 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -1497,7 +1497,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	host = mmc_priv(mmc);
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, pdev->dev.of_node);
 	if (ret)
 		goto host_free;
 
diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
index 42296e5..614372f 100644
--- a/drivers/mmc/host/mvsdio.c
+++ b/drivers/mmc/host/mvsdio.c
@@ -750,7 +750,7 @@ static int mvsd_probe(struct platform_device *pdev)
 	mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
 
 	host->base_clock = clk_get_rate(host->clk) / 2;
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, np);
 	if (ret < 0)
 		goto out;
 	if (maxfreq)
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c
index fb3ca82..2d180e0 100644
--- a/drivers/mmc/host/mxcmmc.c
+++ b/drivers/mmc/host/mxcmmc.c
@@ -1031,7 +1031,7 @@ static int mxcmci_probe(struct platform_device *pdev)
 
 	host->phys_base = res->start;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, pdev->dev.of_node);
 	if (ret)
 		goto out_free;
 	mmc->ops = &mxcmci_ops;
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index c8b8ac6..f6bf639 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -649,7 +649,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
 	mmc->f_min = 400000;
 	mmc->f_max = 288000000;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, np);
 	if (ret)
 		goto out_clk_disable;
 
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index ad11c4c..9f883d2 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2028,7 +2028,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
 		goto err;
 	}
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, pdev->dev.of_node);
 	if (ret)
 		goto err1;
 
diff --git a/drivers/mmc/host/sdhci-bcm-kona.c b/drivers/mmc/host/sdhci-bcm-kona.c
index 51dd2fd..ad4e129 100644
--- a/drivers/mmc/host/sdhci-bcm-kona.c
+++ b/drivers/mmc/host/sdhci-bcm-kona.c
@@ -235,7 +235,7 @@ static int sdhci_bcm_kona_probe(struct platform_device *pdev)
 	kona_dev = sdhci_pltfm_priv(pltfm_priv);
 	mutex_init(&kona_dev->write_lock);
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, dev->of_node);
 	if (ret)
 		goto err_pltfm_free;
 
diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c
index 159f6f6..2dc77cb 100644
--- a/drivers/mmc/host/sdhci-brcmstb.c
+++ b/drivers/mmc/host/sdhci-brcmstb.c
@@ -90,7 +90,7 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
 	host->mmc->caps2 |= MMC_CAP2_HC_ERASE_SZ;
 
 	sdhci_get_of_property(pdev);
-	mmc_of_parse(host->mmc);
+	mmc_of_parse(host->mmc, pdev->dev.of_node);
 
 	/*
 	 * Supply the existing CAPS, but clear the UHS modes. This
diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
index 4b0ecb9..20c363a 100644
--- a/drivers/mmc/host/sdhci-cadence.c
+++ b/drivers/mmc/host/sdhci-cadence.c
@@ -242,7 +242,7 @@ static int sdhci_cdns_probe(struct platform_device *pdev)
 	host->ioaddr += SDHCI_CDNS_SRS_BASE;
 	host->mmc_host_ops.execute_tuning = sdhci_cdns_execute_tuning;
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret)
 		goto free;
 
diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c
index de9f960..6b117b6 100644
--- a/drivers/mmc/host/sdhci-dove.c
+++ b/drivers/mmc/host/sdhci-dove.c
@@ -92,7 +92,7 @@ static int sdhci_dove_probe(struct platform_device *pdev)
 	if (!IS_ERR(pltfm_host->clk))
 		clk_prepare_enable(pltfm_host->clk);
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret)
 		goto err_sdhci_add;
 
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 7123ef9..32288ac 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -1098,7 +1098,7 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
 	}
 
 	/* call to generic mmc_of_parse to support additional capabilities */
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, np);
 	if (ret)
 		return ret;
 
diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c
index d7046d6..244a167 100644
--- a/drivers/mmc/host/sdhci-iproc.c
+++ b/drivers/mmc/host/sdhci-iproc.c
@@ -253,7 +253,7 @@ static int sdhci_iproc_probe(struct platform_device *pdev)
 
 	iproc_host->data = iproc_data;
 
-	mmc_of_parse(host->mmc);
+	mmc_of_parse(host->mmc, pdev->dev.of_node);
 	sdhci_get_of_property(pdev);
 
 	host->mmc->caps |= iproc_host->data->mmc_caps;
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 32879b8..0bd5764 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -1066,7 +1066,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
 	msm_host->mmc = host->mmc;
 	msm_host->pdev = pdev;
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret)
 		goto pltfm_free;
 
diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index 410a55b..205dae9 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -658,7 +658,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
 	if (ret)
 		goto clk_disable_all;
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret) {
 		dev_err(&pdev->dev, "parsing dt failed (%u)\n", ret);
 		goto unreg_clk;
diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c
index 2f9ad21..4a335b6 100644
--- a/drivers/mmc/host/sdhci-of-at91.c
+++ b/drivers/mmc/host/sdhci-of-at91.c
@@ -260,7 +260,7 @@ static int sdhci_at91_probe(struct platform_device *pdev)
 	clk_prepare_enable(priv->mainck);
 	clk_prepare_enable(priv->gck);
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret)
 		goto clocks_disable_unprepare;
 
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index 9a6eb44..c48eaa1 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -659,7 +659,7 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)
 	}
 
 	/* call to generic mmc_of_parse to support additional capabilities */
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, np);
 	if (ret)
 		goto err;
 
diff --git a/drivers/mmc/host/sdhci-pic32.c b/drivers/mmc/host/sdhci-pic32.c
index 72c13b6..3703cb4 100644
--- a/drivers/mmc/host/sdhci-pic32.c
+++ b/drivers/mmc/host/sdhci-pic32.c
@@ -189,7 +189,7 @@ static int pic32_sdhci_probe(struct platform_device *pdev)
 		goto err_base_clk;
 	}
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret)
 		goto err_base_clk;
 
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
index d0f5c05..6530c68 100644
--- a/drivers/mmc/host/sdhci-pxav3.c
+++ b/drivers/mmc/host/sdhci-pxav3.c
@@ -430,7 +430,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
 
 	match = of_match_device(of_match_ptr(sdhci_pxav3_of_match), &pdev->dev);
 	if (match) {
-		ret = mmc_of_parse(host->mmc);
+		ret = mmc_of_parse(host->mmc, np);
 		if (ret)
 			goto err_of_parse;
 		sdhci_get_of_property(pdev);
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c
index de219ca..f34c70b3 100644
--- a/drivers/mmc/host/sdhci-s3c.c
+++ b/drivers/mmc/host/sdhci-s3c.c
@@ -617,7 +617,7 @@ static int sdhci_s3c_probe(struct platform_device *pdev)
 	pm_runtime_use_autosuspend(&pdev->dev);
 	pm_suspend_ignore_children(&pdev->dev, 1);
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (ret)
 		goto err_req_regs;
 
diff --git a/drivers/mmc/host/sdhci-st.c b/drivers/mmc/host/sdhci-st.c
index ed92ce72..6cb3f8a 100644
--- a/drivers/mmc/host/sdhci-st.c
+++ b/drivers/mmc/host/sdhci-st.c
@@ -388,7 +388,7 @@ static int sdhci_st_probe(struct platform_device *pdev)
 	pdata = sdhci_pltfm_priv(pltfm_host);
 	pdata->rstc = rstc;
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, np);
 	if (ret) {
 		dev_err(&pdev->dev, "Failed mmc_of_parse\n");
 		goto err_of;
diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c
index 20b6ff5..1748eb9 100644
--- a/drivers/mmc/host/sdhci-tegra.c
+++ b/drivers/mmc/host/sdhci-tegra.c
@@ -466,7 +466,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
 	tegra_host->pad_calib_required = false;
 	tegra_host->soc_data = soc_data;
 
-	rc = mmc_of_parse(host->mmc);
+	rc = mmc_of_parse(host->mmc, pdev->dev.of_node);
 	if (rc)
 		goto err_parse_dt;
 
diff --git a/drivers/mmc/host/sdhci_f_sdh30.c b/drivers/mmc/host/sdhci_f_sdh30.c
index 111b66f..afb054f 100644
--- a/drivers/mmc/host/sdhci_f_sdh30.c
+++ b/drivers/mmc/host/sdhci_f_sdh30.c
@@ -126,7 +126,7 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
 	host->quirks2 = SDHCI_QUIRK2_SUPPORT_SINGLE |
 			SDHCI_QUIRK2_TUNING_WORK_AROUND;
 
-	ret = mmc_of_parse(host->mmc);
+	ret = mmc_of_parse(host->mmc, dev->of_node);
 	if (ret)
 		goto err;
 
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index 9007784..925dc47 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -1435,7 +1435,7 @@ static int sh_mmcif_probe(struct platform_device *pdev)
 	if (!mmc)
 		return -ENOMEM;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, dev->of_node);
 	if (ret < 0)
 		goto err_host;
 
diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
index b1d1303..95772e0 100644
--- a/drivers/mmc/host/sunxi-mmc.c
+++ b/drivers/mmc/host/sunxi-mmc.c
@@ -1253,7 +1253,7 @@ static int sunxi_mmc_probe(struct platform_device *pdev)
 	if (host->cfg->clk_delays)
 		mmc->caps      |= MMC_CAP_1_8V_DDR;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, pdev->dev.of_node);
 	if (ret)
 		goto error_free_dma;
 
diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c
index 2064fa1..9db27e7 100644
--- a/drivers/mmc/host/tmio_mmc_pio.c
+++ b/drivers/mmc/host/tmio_mmc_pio.c
@@ -1143,7 +1143,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host,
 	if (!res_ctl)
 		return -EINVAL;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, pdev->dev.of_node);
 	if (ret < 0)
 		goto host_free;
 
diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
index 1bd5f1a..cd728be 100644
--- a/drivers/mmc/host/usdhi6rol0.c
+++ b/drivers/mmc/host/usdhi6rol0.c
@@ -1760,7 +1760,7 @@ static int usdhi6_probe(struct platform_device *pdev)
 	if (ret == -EPROBE_DEFER)
 		goto e_free_mmc;
 
-	ret = mmc_of_parse(mmc);
+	ret = mmc_of_parse(mmc, dev->of_node);
 	if (ret < 0)
 		goto e_free_mmc;
 
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 8bc8841..cc6f909 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -401,7 +401,7 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *);
 int mmc_add_host(struct mmc_host *);
 void mmc_remove_host(struct mmc_host *);
 void mmc_free_host(struct mmc_host *);
-int mmc_of_parse(struct mmc_host *host);
+int mmc_of_parse(struct mmc_host *host, struct device_node *);
 
 static inline void *mmc_priv(struct mmc_host *host)
 {
-- 
2.9.0.rc0.21.g7777322

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] mmc: core: Pass node pointer to mmc_of_parse
  2017-01-21 10:59 [PATCH] mmc: core: Pass node pointer to mmc_of_parse Jan Glauber
@ 2017-01-24  8:56 ` Ulf Hansson
  2017-01-25 13:47   ` Jan Glauber
  0 siblings, 1 reply; 3+ messages in thread
From: Ulf Hansson @ 2017-01-24  8:56 UTC (permalink / raw)
  To: Jan Glauber; +Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org

On 21 January 2017 at 11:59, Jan Glauber <jglauber@cavium.com> wrote:
> Extend mmc_of_parse to get the device node pointer as an
> additional argument instead of using the device node of the
> mmc device.
>
> While this has no effect for the current users it allows
> mmc_of_parse to be used by mmc controllers with multiple slots
> per device. These controllers can then pass the child node of the
> slot.
>
> Signed-off-by: Jan Glauber <jglauber@cavium.com>
> ---
>  drivers/mmc/core/host.c            | 8 +++-----
>  drivers/mmc/host/davinci_mmc.c     | 2 +-
>  drivers/mmc/host/dw_mmc.c          | 2 +-
>  drivers/mmc/host/meson-gx-mmc.c    | 2 +-
>  drivers/mmc/host/mmci.c            | 2 +-
>  drivers/mmc/host/moxart-mmc.c      | 2 +-
>  drivers/mmc/host/mtk-sd.c          | 2 +-
>  drivers/mmc/host/mvsdio.c          | 2 +-
>  drivers/mmc/host/mxcmmc.c          | 2 +-
>  drivers/mmc/host/mxs-mmc.c         | 2 +-
>  drivers/mmc/host/omap_hsmmc.c      | 2 +-
>  drivers/mmc/host/sdhci-bcm-kona.c  | 2 +-
>  drivers/mmc/host/sdhci-brcmstb.c   | 2 +-
>  drivers/mmc/host/sdhci-cadence.c   | 2 +-
>  drivers/mmc/host/sdhci-dove.c      | 2 +-
>  drivers/mmc/host/sdhci-esdhc-imx.c | 2 +-
>  drivers/mmc/host/sdhci-iproc.c     | 2 +-
>  drivers/mmc/host/sdhci-msm.c       | 2 +-
>  drivers/mmc/host/sdhci-of-arasan.c | 2 +-
>  drivers/mmc/host/sdhci-of-at91.c   | 2 +-
>  drivers/mmc/host/sdhci-of-esdhc.c  | 2 +-
>  drivers/mmc/host/sdhci-pic32.c     | 2 +-
>  drivers/mmc/host/sdhci-pxav3.c     | 2 +-
>  drivers/mmc/host/sdhci-s3c.c       | 2 +-
>  drivers/mmc/host/sdhci-st.c        | 2 +-
>  drivers/mmc/host/sdhci-tegra.c     | 2 +-
>  drivers/mmc/host/sdhci_f_sdh30.c   | 2 +-
>  drivers/mmc/host/sh_mmcif.c        | 2 +-
>  drivers/mmc/host/sunxi-mmc.c       | 2 +-
>  drivers/mmc/host/tmio_mmc_pio.c    | 2 +-
>  drivers/mmc/host/usdhi6rol0.c      | 2 +-
>  include/linux/mmc/host.h           | 2 +-
>  32 files changed, 34 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> index 98f25ff..444faac 100644
> --- a/drivers/mmc/core/host.c
> +++ b/drivers/mmc/core/host.c
> @@ -171,25 +171,23 @@ static void mmc_retune_timer(unsigned long data)
>  /**
>   *     mmc_of_parse() - parse host's device-tree node
>   *     @host: host whose node should be parsed.
> + *     @np: node that should be parsed.
>   *
>   * To keep the rest of the MMC subsystem unaware of whether DT has been
>   * used to to instantiate and configure this host instance or not, we
>   * parse the properties and set respective generic mmc-host flags and
>   * parameters.
>   */
> -int mmc_of_parse(struct mmc_host *host)
> +int mmc_of_parse(struct mmc_host *host, struct device_node *np)
>  {
> -       struct device_node *np;
>         u32 bus_width;
>         int ret;
>         bool cd_cap_invert, cd_gpio_invert = false;
>         bool ro_cap_invert, ro_gpio_invert = false;
>
> -       if (!host->parent || !host->parent->of_node)
> +       if (!np)
>                 return 0;
>
> -       np = host->parent->of_node;
> -

This doesn't work because of mmc_of_parse() calls the below functions,
which uses the parent device associated with the mmc host.

1) mmc_gpiod_request_cd()
2) mmc_gpiod_request_ro()
3) mmc_pwrseq_alloc()

Please have a look to see how we can change these first.

One way that might help to simplify the implementation could be to
optionally store the of_node in the mmc host, while it's being
allocated. When it's set, it could indicate we have a child/slot-node.
Just an idea...

Kind regards
Uffe

>         /* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
>         if (of_property_read_u32(np, "bus-width", &bus_width) < 0) {
>                 dev_dbg(host->parent,
> diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
> index 36b5af8..1ce9375 100644
> --- a/drivers/mmc/host/davinci_mmc.c
> +++ b/drivers/mmc/host/davinci_mmc.c
> @@ -1257,7 +1257,7 @@ static int __init davinci_mmcsd_probe(struct platform_device *pdev)
>         match = of_match_device(davinci_mmc_dt_ids, &pdev->dev);
>         if (match) {
>                 pdev->id_entry = match->data;
> -               ret = mmc_of_parse(mmc);
> +               ret = mmc_of_parse(mmc, pdev->dev.of_node);
>                 if (ret) {
>                         dev_err(&pdev->dev,
>                                 "could not parse of data: %d\n", ret);
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index b44306b..0f10000 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -2673,7 +2673,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
>         if (host->pdata->caps2)
>                 mmc->caps2 = host->pdata->caps2;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, host->dev->of_node);
>         if (ret)
>                 goto err_host_allocated;
>
> diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
> index 0973935..2cfb959 100644
> --- a/drivers/mmc/host/meson-gx-mmc.c
> +++ b/drivers/mmc/host/meson-gx-mmc.c
> @@ -740,7 +740,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
>         if (ret == -EPROBE_DEFER)
>                 goto free_host;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, pdev->dev.of_node);
>         if (ret) {
>                 dev_warn(&pdev->dev, "error parsing DT: %d\n", ret);
>                 goto free_host;
> diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
> index 01a8047..36bb957 100644
> --- a/drivers/mmc/host/mmci.c
> +++ b/drivers/mmc/host/mmci.c
> @@ -1505,7 +1505,7 @@ static struct mmc_host_ops mmci_ops = {
>  static int mmci_of_parse(struct device_node *np, struct mmc_host *mmc)
>  {
>         struct mmci_host *host = mmc_priv(mmc);
> -       int ret = mmc_of_parse(mmc);
> +       int ret = mmc_of_parse(mmc, np);
>
>         if (ret)
>                 return ret;
> diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c
> index bbad309..c710d4f 100644
> --- a/drivers/mmc/host/moxart-mmc.c
> +++ b/drivers/mmc/host/moxart-mmc.c
> @@ -599,7 +599,7 @@ static int moxart_probe(struct platform_device *pdev)
>                 goto out;
>         }
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, node);
>         if (ret)
>                 goto out;
>
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index 10ef2ae..cdbe76c 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -1497,7 +1497,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
>                 return -ENOMEM;
>
>         host = mmc_priv(mmc);
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, pdev->dev.of_node);
>         if (ret)
>                 goto host_free;
>
> diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
> index 42296e5..614372f 100644
> --- a/drivers/mmc/host/mvsdio.c
> +++ b/drivers/mmc/host/mvsdio.c
> @@ -750,7 +750,7 @@ static int mvsd_probe(struct platform_device *pdev)
>         mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
>
>         host->base_clock = clk_get_rate(host->clk) / 2;
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, np);
>         if (ret < 0)
>                 goto out;
>         if (maxfreq)
> diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c
> index fb3ca82..2d180e0 100644
> --- a/drivers/mmc/host/mxcmmc.c
> +++ b/drivers/mmc/host/mxcmmc.c
> @@ -1031,7 +1031,7 @@ static int mxcmci_probe(struct platform_device *pdev)
>
>         host->phys_base = res->start;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, pdev->dev.of_node);
>         if (ret)
>                 goto out_free;
>         mmc->ops = &mxcmci_ops;
> diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
> index c8b8ac6..f6bf639 100644
> --- a/drivers/mmc/host/mxs-mmc.c
> +++ b/drivers/mmc/host/mxs-mmc.c
> @@ -649,7 +649,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
>         mmc->f_min = 400000;
>         mmc->f_max = 288000000;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, np);
>         if (ret)
>                 goto out_clk_disable;
>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index ad11c4c..9f883d2 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -2028,7 +2028,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>                 goto err;
>         }
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, pdev->dev.of_node);
>         if (ret)
>                 goto err1;
>
> diff --git a/drivers/mmc/host/sdhci-bcm-kona.c b/drivers/mmc/host/sdhci-bcm-kona.c
> index 51dd2fd..ad4e129 100644
> --- a/drivers/mmc/host/sdhci-bcm-kona.c
> +++ b/drivers/mmc/host/sdhci-bcm-kona.c
> @@ -235,7 +235,7 @@ static int sdhci_bcm_kona_probe(struct platform_device *pdev)
>         kona_dev = sdhci_pltfm_priv(pltfm_priv);
>         mutex_init(&kona_dev->write_lock);
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, dev->of_node);
>         if (ret)
>                 goto err_pltfm_free;
>
> diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c
> index 159f6f6..2dc77cb 100644
> --- a/drivers/mmc/host/sdhci-brcmstb.c
> +++ b/drivers/mmc/host/sdhci-brcmstb.c
> @@ -90,7 +90,7 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
>         host->mmc->caps2 |= MMC_CAP2_HC_ERASE_SZ;
>
>         sdhci_get_of_property(pdev);
> -       mmc_of_parse(host->mmc);
> +       mmc_of_parse(host->mmc, pdev->dev.of_node);
>
>         /*
>          * Supply the existing CAPS, but clear the UHS modes. This
> diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
> index 4b0ecb9..20c363a 100644
> --- a/drivers/mmc/host/sdhci-cadence.c
> +++ b/drivers/mmc/host/sdhci-cadence.c
> @@ -242,7 +242,7 @@ static int sdhci_cdns_probe(struct platform_device *pdev)
>         host->ioaddr += SDHCI_CDNS_SRS_BASE;
>         host->mmc_host_ops.execute_tuning = sdhci_cdns_execute_tuning;
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret)
>                 goto free;
>
> diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c
> index de9f960..6b117b6 100644
> --- a/drivers/mmc/host/sdhci-dove.c
> +++ b/drivers/mmc/host/sdhci-dove.c
> @@ -92,7 +92,7 @@ static int sdhci_dove_probe(struct platform_device *pdev)
>         if (!IS_ERR(pltfm_host->clk))
>                 clk_prepare_enable(pltfm_host->clk);
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret)
>                 goto err_sdhci_add;
>
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
> index 7123ef9..32288ac 100644
> --- a/drivers/mmc/host/sdhci-esdhc-imx.c
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -1098,7 +1098,7 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
>         }
>
>         /* call to generic mmc_of_parse to support additional capabilities */
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, np);
>         if (ret)
>                 return ret;
>
> diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c
> index d7046d6..244a167 100644
> --- a/drivers/mmc/host/sdhci-iproc.c
> +++ b/drivers/mmc/host/sdhci-iproc.c
> @@ -253,7 +253,7 @@ static int sdhci_iproc_probe(struct platform_device *pdev)
>
>         iproc_host->data = iproc_data;
>
> -       mmc_of_parse(host->mmc);
> +       mmc_of_parse(host->mmc, pdev->dev.of_node);
>         sdhci_get_of_property(pdev);
>
>         host->mmc->caps |= iproc_host->data->mmc_caps;
> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
> index 32879b8..0bd5764 100644
> --- a/drivers/mmc/host/sdhci-msm.c
> +++ b/drivers/mmc/host/sdhci-msm.c
> @@ -1066,7 +1066,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
>         msm_host->mmc = host->mmc;
>         msm_host->pdev = pdev;
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret)
>                 goto pltfm_free;
>
> diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> index 410a55b..205dae9 100644
> --- a/drivers/mmc/host/sdhci-of-arasan.c
> +++ b/drivers/mmc/host/sdhci-of-arasan.c
> @@ -658,7 +658,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
>         if (ret)
>                 goto clk_disable_all;
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret) {
>                 dev_err(&pdev->dev, "parsing dt failed (%u)\n", ret);
>                 goto unreg_clk;
> diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c
> index 2f9ad21..4a335b6 100644
> --- a/drivers/mmc/host/sdhci-of-at91.c
> +++ b/drivers/mmc/host/sdhci-of-at91.c
> @@ -260,7 +260,7 @@ static int sdhci_at91_probe(struct platform_device *pdev)
>         clk_prepare_enable(priv->mainck);
>         clk_prepare_enable(priv->gck);
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret)
>                 goto clocks_disable_unprepare;
>
> diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
> index 9a6eb44..c48eaa1 100644
> --- a/drivers/mmc/host/sdhci-of-esdhc.c
> +++ b/drivers/mmc/host/sdhci-of-esdhc.c
> @@ -659,7 +659,7 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)
>         }
>
>         /* call to generic mmc_of_parse to support additional capabilities */
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, np);
>         if (ret)
>                 goto err;
>
> diff --git a/drivers/mmc/host/sdhci-pic32.c b/drivers/mmc/host/sdhci-pic32.c
> index 72c13b6..3703cb4 100644
> --- a/drivers/mmc/host/sdhci-pic32.c
> +++ b/drivers/mmc/host/sdhci-pic32.c
> @@ -189,7 +189,7 @@ static int pic32_sdhci_probe(struct platform_device *pdev)
>                 goto err_base_clk;
>         }
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret)
>                 goto err_base_clk;
>
> diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
> index d0f5c05..6530c68 100644
> --- a/drivers/mmc/host/sdhci-pxav3.c
> +++ b/drivers/mmc/host/sdhci-pxav3.c
> @@ -430,7 +430,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
>
>         match = of_match_device(of_match_ptr(sdhci_pxav3_of_match), &pdev->dev);
>         if (match) {
> -               ret = mmc_of_parse(host->mmc);
> +               ret = mmc_of_parse(host->mmc, np);
>                 if (ret)
>                         goto err_of_parse;
>                 sdhci_get_of_property(pdev);
> diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c
> index de219ca..f34c70b3 100644
> --- a/drivers/mmc/host/sdhci-s3c.c
> +++ b/drivers/mmc/host/sdhci-s3c.c
> @@ -617,7 +617,7 @@ static int sdhci_s3c_probe(struct platform_device *pdev)
>         pm_runtime_use_autosuspend(&pdev->dev);
>         pm_suspend_ignore_children(&pdev->dev, 1);
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (ret)
>                 goto err_req_regs;
>
> diff --git a/drivers/mmc/host/sdhci-st.c b/drivers/mmc/host/sdhci-st.c
> index ed92ce72..6cb3f8a 100644
> --- a/drivers/mmc/host/sdhci-st.c
> +++ b/drivers/mmc/host/sdhci-st.c
> @@ -388,7 +388,7 @@ static int sdhci_st_probe(struct platform_device *pdev)
>         pdata = sdhci_pltfm_priv(pltfm_host);
>         pdata->rstc = rstc;
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, np);
>         if (ret) {
>                 dev_err(&pdev->dev, "Failed mmc_of_parse\n");
>                 goto err_of;
> diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c
> index 20b6ff5..1748eb9 100644
> --- a/drivers/mmc/host/sdhci-tegra.c
> +++ b/drivers/mmc/host/sdhci-tegra.c
> @@ -466,7 +466,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev)
>         tegra_host->pad_calib_required = false;
>         tegra_host->soc_data = soc_data;
>
> -       rc = mmc_of_parse(host->mmc);
> +       rc = mmc_of_parse(host->mmc, pdev->dev.of_node);
>         if (rc)
>                 goto err_parse_dt;
>
> diff --git a/drivers/mmc/host/sdhci_f_sdh30.c b/drivers/mmc/host/sdhci_f_sdh30.c
> index 111b66f..afb054f 100644
> --- a/drivers/mmc/host/sdhci_f_sdh30.c
> +++ b/drivers/mmc/host/sdhci_f_sdh30.c
> @@ -126,7 +126,7 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
>         host->quirks2 = SDHCI_QUIRK2_SUPPORT_SINGLE |
>                         SDHCI_QUIRK2_TUNING_WORK_AROUND;
>
> -       ret = mmc_of_parse(host->mmc);
> +       ret = mmc_of_parse(host->mmc, dev->of_node);
>         if (ret)
>                 goto err;
>
> diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
> index 9007784..925dc47 100644
> --- a/drivers/mmc/host/sh_mmcif.c
> +++ b/drivers/mmc/host/sh_mmcif.c
> @@ -1435,7 +1435,7 @@ static int sh_mmcif_probe(struct platform_device *pdev)
>         if (!mmc)
>                 return -ENOMEM;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, dev->of_node);
>         if (ret < 0)
>                 goto err_host;
>
> diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
> index b1d1303..95772e0 100644
> --- a/drivers/mmc/host/sunxi-mmc.c
> +++ b/drivers/mmc/host/sunxi-mmc.c
> @@ -1253,7 +1253,7 @@ static int sunxi_mmc_probe(struct platform_device *pdev)
>         if (host->cfg->clk_delays)
>                 mmc->caps      |= MMC_CAP_1_8V_DDR;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, pdev->dev.of_node);
>         if (ret)
>                 goto error_free_dma;
>
> diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c
> index 2064fa1..9db27e7 100644
> --- a/drivers/mmc/host/tmio_mmc_pio.c
> +++ b/drivers/mmc/host/tmio_mmc_pio.c
> @@ -1143,7 +1143,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host,
>         if (!res_ctl)
>                 return -EINVAL;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, pdev->dev.of_node);
>         if (ret < 0)
>                 goto host_free;
>
> diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
> index 1bd5f1a..cd728be 100644
> --- a/drivers/mmc/host/usdhi6rol0.c
> +++ b/drivers/mmc/host/usdhi6rol0.c
> @@ -1760,7 +1760,7 @@ static int usdhi6_probe(struct platform_device *pdev)
>         if (ret == -EPROBE_DEFER)
>                 goto e_free_mmc;
>
> -       ret = mmc_of_parse(mmc);
> +       ret = mmc_of_parse(mmc, dev->of_node);
>         if (ret < 0)
>                 goto e_free_mmc;
>
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index 8bc8841..cc6f909 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -401,7 +401,7 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *);
>  int mmc_add_host(struct mmc_host *);
>  void mmc_remove_host(struct mmc_host *);
>  void mmc_free_host(struct mmc_host *);
> -int mmc_of_parse(struct mmc_host *host);
> +int mmc_of_parse(struct mmc_host *host, struct device_node *);
>
>  static inline void *mmc_priv(struct mmc_host *host)
>  {
> --
> 2.9.0.rc0.21.g7777322
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] mmc: core: Pass node pointer to mmc_of_parse
  2017-01-24  8:56 ` Ulf Hansson
@ 2017-01-25 13:47   ` Jan Glauber
  0 siblings, 0 replies; 3+ messages in thread
From: Jan Glauber @ 2017-01-25 13:47 UTC (permalink / raw)
  To: Ulf Hansson; +Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org

On Tue, Jan 24, 2017 at 09:56:55AM +0100, Ulf Hansson wrote:
> On 21 January 2017 at 11:59, Jan Glauber <jglauber@cavium.com> wrote:
> > Extend mmc_of_parse to get the device node pointer as an
> > additional argument instead of using the device node of the
> > mmc device.
> >
> > While this has no effect for the current users it allows
> > mmc_of_parse to be used by mmc controllers with multiple slots
> > per device. These controllers can then pass the child node of the
> > slot.
> >
> > Signed-off-by: Jan Glauber <jglauber@cavium.com>
> > ---
> >  drivers/mmc/core/host.c            | 8 +++-----
> >  drivers/mmc/host/davinci_mmc.c     | 2 +-
> >  drivers/mmc/host/dw_mmc.c          | 2 +-
> >  drivers/mmc/host/meson-gx-mmc.c    | 2 +-
> >  drivers/mmc/host/mmci.c            | 2 +-
> >  drivers/mmc/host/moxart-mmc.c      | 2 +-
> >  drivers/mmc/host/mtk-sd.c          | 2 +-
> >  drivers/mmc/host/mvsdio.c          | 2 +-
> >  drivers/mmc/host/mxcmmc.c          | 2 +-
> >  drivers/mmc/host/mxs-mmc.c         | 2 +-
> >  drivers/mmc/host/omap_hsmmc.c      | 2 +-
> >  drivers/mmc/host/sdhci-bcm-kona.c  | 2 +-
> >  drivers/mmc/host/sdhci-brcmstb.c   | 2 +-
> >  drivers/mmc/host/sdhci-cadence.c   | 2 +-
> >  drivers/mmc/host/sdhci-dove.c      | 2 +-
> >  drivers/mmc/host/sdhci-esdhc-imx.c | 2 +-
> >  drivers/mmc/host/sdhci-iproc.c     | 2 +-
> >  drivers/mmc/host/sdhci-msm.c       | 2 +-
> >  drivers/mmc/host/sdhci-of-arasan.c | 2 +-
> >  drivers/mmc/host/sdhci-of-at91.c   | 2 +-
> >  drivers/mmc/host/sdhci-of-esdhc.c  | 2 +-
> >  drivers/mmc/host/sdhci-pic32.c     | 2 +-
> >  drivers/mmc/host/sdhci-pxav3.c     | 2 +-
> >  drivers/mmc/host/sdhci-s3c.c       | 2 +-
> >  drivers/mmc/host/sdhci-st.c        | 2 +-
> >  drivers/mmc/host/sdhci-tegra.c     | 2 +-
> >  drivers/mmc/host/sdhci_f_sdh30.c   | 2 +-
> >  drivers/mmc/host/sh_mmcif.c        | 2 +-
> >  drivers/mmc/host/sunxi-mmc.c       | 2 +-
> >  drivers/mmc/host/tmio_mmc_pio.c    | 2 +-
> >  drivers/mmc/host/usdhi6rol0.c      | 2 +-
> >  include/linux/mmc/host.h           | 2 +-
> >  32 files changed, 34 insertions(+), 36 deletions(-)
> >
> > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> > index 98f25ff..444faac 100644
> > --- a/drivers/mmc/core/host.c
> > +++ b/drivers/mmc/core/host.c
> > @@ -171,25 +171,23 @@ static void mmc_retune_timer(unsigned long data)
> >  /**
> >   *     mmc_of_parse() - parse host's device-tree node
> >   *     @host: host whose node should be parsed.
> > + *     @np: node that should be parsed.
> >   *
> >   * To keep the rest of the MMC subsystem unaware of whether DT has been
> >   * used to to instantiate and configure this host instance or not, we
> >   * parse the properties and set respective generic mmc-host flags and
> >   * parameters.
> >   */
> > -int mmc_of_parse(struct mmc_host *host)
> > +int mmc_of_parse(struct mmc_host *host, struct device_node *np)
> >  {
> > -       struct device_node *np;
> >         u32 bus_width;
> >         int ret;
> >         bool cd_cap_invert, cd_gpio_invert = false;
> >         bool ro_cap_invert, ro_gpio_invert = false;
> >
> > -       if (!host->parent || !host->parent->of_node)
> > +       if (!np)
> >                 return 0;
> >
> > -       np = host->parent->of_node;
> > -
> 
> This doesn't work because of mmc_of_parse() calls the below functions,
> which uses the parent device associated with the mmc host.
> 
> 1) mmc_gpiod_request_cd()
> 2) mmc_gpiod_request_ro()
> 3) mmc_pwrseq_alloc()
> 
> Please have a look to see how we can change these first.

Yes, I've missed these. While 3) would be easy to adopt
I don't see how we can change 1) and 2) to parse the child nodes.

Both functions call devm_gpiod_get_index() which is agnostic to
DT nodes but uses the struct device *. So I think this kills my plan of
adopting mmc_of_parse, looks like I really need to create one device per
child node.

thanks,
Jan

> One way that might help to simplify the implementation could be to
> optionally store the of_node in the mmc host, while it's being
> allocated. When it's set, it could indicate we have a child/slot-node.
> Just an idea...
> 
> Kind regards
> Uffe

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-01-25 13:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-21 10:59 [PATCH] mmc: core: Pass node pointer to mmc_of_parse Jan Glauber
2017-01-24  8:56 ` Ulf Hansson
2017-01-25 13:47   ` Jan Glauber

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox