Re: [PATCH 1/7] mmc: dw_mmc: lookup for optional biu and ciu clocks
From: Thomas Abraham <hidden>
Date: 2012-05-10 09:11:14
Also in:
linux-arm-kernel, linux-mmc, linux-samsung-soc, lkml
On 2 May 2012 14:47, Will Newton [off-list ref] wrote:
On Wed, May 2, 2012 at 6:07 AM, Thomas Abraham [off-list ref] wrote:quoted
Some platforms allow for clock gating and control of bus interface unit clock and card interface unit clock. Add support for clock lookup of optional biu and ciu clocks for clock gating and clock speed determination. Signed-off-by: Abhilash Kesavan <redacted> Signed-off-by: Thomas Abraham <redacted> --- drivers/mmc/host/dw_mmc.c | 35 +++++++++++++++++++++++++++++++---- include/linux/mmc/dw_mmc.h | 4 ++++ 2 files changed, 35 insertions(+), 4 deletions(-)diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 1532357..036846f 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c@@ -1938,19 +1938,35 @@ int dw_mci_probe(struct dw_mci *host)return -ENODEV; } - if (!host->pdata->bus_hz) { + host->biu_clk = clk_get(&host->dev, "biu"); + if (IS_ERR(host->biu_clk)) + dev_info(&host->dev, "biu clock not available\n"); + else + clk_enable(host->biu_clk); + + host->ciu_clk = clk_get(&host->dev, "ciu"); + if (IS_ERR(host->ciu_clk)) + dev_info(&host->dev, "ciu clock not available\n");Should these printks be at debug level? I'm not 100% sure either way but it could be a little noisy on systems that do not use these clocks.
Right. I will change dev_info to dev_dbg.
quoted
+ else + clk_enable(host->ciu_clk); + + if (IS_ERR(host->ciu_clk)) + host->bus_hz = host->pdata->bus_hz; + else + host->bus_hz = clk_get_rate(host->ciu_clk); + + if (!host->bus_hz) { dev_err(&host->dev, "Platform data must supply bus speed\n"); - return -ENODEV; + ret = -ENODEV; + goto err_clk; } - host->bus_hz = host->pdata->bus_hz; host->quirks = host->pdata->quirks; spin_lock_init(&host->lock); INIT_LIST_HEAD(&host->queue); - host->dma_ops = host->pdata->dma_ops; dw_mci_init_dma(host);@@ -2095,6 +2111,13 @@ err_dmaunmap:regulator_disable(host->vmmc); regulator_put(host->vmmc); } + kfree(host); + +err_clk: + clk_disable(host->ciu_clk); + clk_disable(host->biu_clk); + clk_put(host->ciu_clk); + clk_put(host->biu_clk);Are these calls safe, or do we need to check IS_ERR as above?
The clk_disable is safe on Samsung platforms but it cannot be assumed for other platforms. So, the IS_ERR check will be added before clk_disable. clk_put will not need the IS_ERR check. Thanks for pointing this out.
quoted
return ret; } EXPORT_SYMBOL(dw_mci_probe);@@ -2128,6 +2151,10 @@ void dw_mci_remove(struct dw_mci *host)regulator_put(host->vmmc); } + clk_disable(host->ciu_clk); + clk_disable(host->biu_clk); + clk_put(host->ciu_clk); + clk_put(host->biu_clk);Likewise.
Yes, will be fixed. Thanks, Thomas. [...]