Message ID | 20201202185118.29076-4-mw@semihalf.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | sdhci-xenon ACPI support | expand |
On Wed, 2 Dec 2020 at 19:51, Marcin Wojtas <mw@semihalf.com> wrote: > > As a preparation for supporting ACPI, modify the driver > to use the clk framework only when booting with DT - > otherwise rely on the configuration done by firmware. > For that purpose introduce also a custom SDHCI get_max_clock > callback. > > Signed-off-by: Marcin Wojtas <mw@semihalf.com> > Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > drivers/mmc/host/sdhci-xenon.c | 61 ++++++++++++-------- > 1 file changed, 38 insertions(+), 23 deletions(-) > > diff --git a/drivers/mmc/host/sdhci-xenon.c b/drivers/mmc/host/sdhci-xenon.c [...] > @@ -637,10 +650,12 @@ static int xenon_runtime_resume(struct device *dev) > struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host); > int ret; > > - ret = clk_prepare_enable(pltfm_host->clk); > - if (ret) { > - dev_err(dev, "can't enable mainck\n"); > - return ret; > + if (dev->of_node) { I didn't notice this in the earlier version, my apologies, but there is no need for this check. clk_prepare_enable() should cope fine with a NULL argument - and you only reach this path, if the clock was successfully fetched during the probe or that it was left to stay NULL for non-DT case. > + ret = clk_prepare_enable(pltfm_host->clk); > + if (ret) { > + dev_err(dev, "can't enable mainck\n"); > + return ret; > + } > } > > if (priv->restore_needed) { > -- > 2.29.0 > Kind regards Uffe
pt., 4 gru 2020 o 14:51 Ulf Hansson <ulf.hansson@linaro.org> napisaĆ(a): > > On Wed, 2 Dec 2020 at 19:51, Marcin Wojtas <mw@semihalf.com> wrote: > > > > As a preparation for supporting ACPI, modify the driver > > to use the clk framework only when booting with DT - > > otherwise rely on the configuration done by firmware. > > For that purpose introduce also a custom SDHCI get_max_clock > > callback. > > > > Signed-off-by: Marcin Wojtas <mw@semihalf.com> > > Acked-by: Adrian Hunter <adrian.hunter@intel.com> > > --- > > drivers/mmc/host/sdhci-xenon.c | 61 ++++++++++++-------- > > 1 file changed, 38 insertions(+), 23 deletions(-) > > > > diff --git a/drivers/mmc/host/sdhci-xenon.c b/drivers/mmc/host/sdhci-xenon.c > > [...] > > > @@ -637,10 +650,12 @@ static int xenon_runtime_resume(struct device *dev) > > struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host); > > int ret; > > > > - ret = clk_prepare_enable(pltfm_host->clk); > > - if (ret) { > > - dev_err(dev, "can't enable mainck\n"); > > - return ret; > > + if (dev->of_node) { > > I didn't notice this in the earlier version, my apologies, but there > is no need for this check. > > clk_prepare_enable() should cope fine with a NULL argument - and you > only reach this path, if the clock was successfully fetched during the > probe or that it was left to stay NULL for non-DT case. You are right, thanks! I applied the change and resent v4. Best regards, Marcin > > > + ret = clk_prepare_enable(pltfm_host->clk); > > + if (ret) { > > + dev_err(dev, "can't enable mainck\n"); > > + return ret; > > + } > > } > > > > if (priv->restore_needed) { > > -- > > 2.29.0 > > > > Kind regards > Uffe
diff --git a/drivers/mmc/host/sdhci-xenon.c b/drivers/mmc/host/sdhci-xenon.c index bfc76b0e3eaa..cc0fcc646b0e 100644 --- a/drivers/mmc/host/sdhci-xenon.c +++ b/drivers/mmc/host/sdhci-xenon.c @@ -247,6 +247,16 @@ static void xenon_voltage_switch(struct sdhci_host *host) sdhci_readw(host, SDHCI_HOST_CONTROL2); } +static unsigned int xenon_get_max_clock(struct sdhci_host *host) +{ + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + + if (pltfm_host->clk) + return sdhci_pltfm_clk_get_max_clock(host); + else + return pltfm_host->clock; +} + static const struct sdhci_ops sdhci_xenon_ops = { .voltage_switch = xenon_voltage_switch, .set_clock = sdhci_set_clock, @@ -254,7 +264,7 @@ static const struct sdhci_ops sdhci_xenon_ops = { .set_bus_width = sdhci_set_bus_width, .reset = xenon_reset, .set_uhs_signaling = xenon_set_uhs_signaling, - .get_max_clock = sdhci_pltfm_clk_get_max_clock, + .get_max_clock = xenon_get_max_clock, }; static const struct sdhci_pltfm_data sdhci_xenon_pdata = { @@ -483,6 +493,7 @@ static void xenon_sdhc_unprepare(struct sdhci_host *host) static int xenon_probe(struct platform_device *pdev) { struct sdhci_pltfm_host *pltfm_host; + struct device *dev = &pdev->dev; struct sdhci_host *host; struct xenon_priv *priv; int err; @@ -503,25 +514,27 @@ static int xenon_probe(struct platform_device *pdev) */ xenon_replace_mmc_host_ops(host); - pltfm_host->clk = devm_clk_get(&pdev->dev, "core"); - if (IS_ERR(pltfm_host->clk)) { - err = PTR_ERR(pltfm_host->clk); - dev_err(&pdev->dev, "Failed to setup input clk: %d\n", err); - goto free_pltfm; - } - err = clk_prepare_enable(pltfm_host->clk); - if (err) - goto free_pltfm; - - priv->axi_clk = devm_clk_get(&pdev->dev, "axi"); - if (IS_ERR(priv->axi_clk)) { - err = PTR_ERR(priv->axi_clk); - if (err == -EPROBE_DEFER) - goto err_clk; - } else { - err = clk_prepare_enable(priv->axi_clk); + if (dev->of_node) { + pltfm_host->clk = devm_clk_get(&pdev->dev, "core"); + if (IS_ERR(pltfm_host->clk)) { + err = PTR_ERR(pltfm_host->clk); + dev_err(&pdev->dev, "Failed to setup input clk: %d\n", err); + goto free_pltfm; + } + err = clk_prepare_enable(pltfm_host->clk); if (err) - goto err_clk; + goto free_pltfm; + + priv->axi_clk = devm_clk_get(&pdev->dev, "axi"); + if (IS_ERR(priv->axi_clk)) { + err = PTR_ERR(priv->axi_clk); + if (err == -EPROBE_DEFER) + goto err_clk; + } else { + err = clk_prepare_enable(priv->axi_clk); + if (err) + goto err_clk; + } } err = mmc_of_parse(host->mmc); @@ -637,10 +650,12 @@ static int xenon_runtime_resume(struct device *dev) struct xenon_priv *priv = sdhci_pltfm_priv(pltfm_host); int ret; - ret = clk_prepare_enable(pltfm_host->clk); - if (ret) { - dev_err(dev, "can't enable mainck\n"); - return ret; + if (dev->of_node) { + ret = clk_prepare_enable(pltfm_host->clk); + if (ret) { + dev_err(dev, "can't enable mainck\n"); + return ret; + } } if (priv->restore_needed) {