Re: [PATCH 5/7] mmc: sd_mmcif: Move clock handling into runtime PM callbacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2 Oct 2013, Ulf Hansson wrote:

> Implement callbacks for runtime suspend|resume and leave the clock
> to be handled from there.
> 
> The .set_ios function is still capable of using the interal registers
> to gate the clock when the frequency is zero, but the operations needed
> towards the clk API is now handled from the runtime callbacks.
> 
> >From now on, CONFIG_PM_RUNTIME is required handle power save with full
> clock gating at request inactivity.
> 
> Cc: Guennadi Liakhovetski <g.liakhovetski@xxxxxx>
> Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
> ---
>  drivers/mmc/host/sh_mmcif.c |   47 ++++++++++++++++++++++++++-----------------
>  1 file changed, 29 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
> index f4532dc..e234856 100644
> --- a/drivers/mmc/host/sh_mmcif.c
> +++ b/drivers/mmc/host/sh_mmcif.c
> @@ -964,19 +964,6 @@ static void sh_mmcif_request(struct mmc_host *mmc, struct mmc_request *mrq)
>  	sh_mmcif_start_cmd(host, mrq);
>  }
>  
> -static int sh_mmcif_clk_update(struct sh_mmcif_host *host)
> -{
> -	int ret = clk_prepare_enable(host->hclk);
> -
> -	if (!ret) {
> -		host->clk = clk_get_rate(host->hclk);
> -		host->mmc->f_max = host->clk / 2;
> -		host->mmc->f_min = host->clk / 512;
> -	}
> -
> -	return ret;
> -}
> -

This reverts effect of this commit:

commit a6609267107ecc5598b79aa353036c1f57e7257e
Author: Guennadi Liakhovetski <g.liakhovetski@xxxxxx>
Date:   Thu Apr 19 18:02:50 2012 +0200

    mmc: sh_mmcif: re-read the clock frequency every time it is turned on

Thanks
Guennadi

>  static void sh_mmcif_set_power(struct sh_mmcif_host *host, struct mmc_ios *ios)
>  {
>  	struct mmc_host *mmc = host->mmc;
> @@ -1021,7 +1008,6 @@ static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  			}
>  		}
>  		if (host->power) {
> -			clk_disable_unprepare(host->hclk);
>  			host->power = false;
>  			if (ios->power_mode == MMC_POWER_OFF)
>  				sh_mmcif_set_power(host, ios);
> @@ -1032,7 +1018,6 @@ static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  
>  	if (ios->clock) {
>  		if (!host->power) {
> -			sh_mmcif_clk_update(host);
>  			host->power = true;
>  			sh_mmcif_sync_reset(host);
>  		}
> @@ -1440,9 +1425,16 @@ static int sh_mmcif_probe(struct platform_device *pdev)
>  		dev_err(&pdev->dev, "cannot get clock: %d\n", ret);
>  		goto eofparse;
>  	}
> -	ret = sh_mmcif_clk_update(host);
> -	if (ret < 0)
> +
> +	ret = clk_prepare_enable(host->hclk);
> +	if (ret) {
> +		dev_err(&pdev->dev, "cannot enable clock: %d\n", ret);
>  		goto eclkupdate;
> +	}
> +
> +	host->clk = clk_get_rate(host->hclk);
> +	host->mmc->f_max = host->clk / 2;
> +	host->mmc->f_min = host->clk / 512;
>  
>  	INIT_DELAYED_WORK(&host->timeout_work, mmcif_timeout_work);
>  
> @@ -1478,7 +1470,6 @@ static int sh_mmcif_probe(struct platform_device *pdev)
>  	pm_runtime_set_active(&pdev->dev);
>  	pm_runtime_enable(&pdev->dev);
>  
> -	clk_disable_unprepare(host->hclk);
>  	ret = mmc_add_host(mmc);
>  	if (ret < 0)
>  		goto emmcaddh;
> @@ -1568,6 +1559,24 @@ static int sh_mmcif_resume(struct device *dev)
>  }
>  #endif
>  
> +#ifdef CONFIG_PM_RUNTIME
> +static int sh_mmcif_runtime_suspend(struct device *dev)
> +{
> +	struct sh_mmcif_host *host = dev_get_drvdata(dev);
> +
> +	clk_disable_unprepare(host->hclk);
> +	return 0;
> +}
> +
> +static int sh_mmcif_runtime_resume(struct device *dev)
> +{
> +	struct sh_mmcif_host *host = dev_get_drvdata(dev);
> +
> +	clk_prepare_enable(host->hclk);
> +	return 0;
> +}
> +#endif
> +
>  static const struct of_device_id mmcif_of_match[] = {
>  	{ .compatible = "renesas,sh-mmcif" },
>  	{ }
> @@ -1576,6 +1585,8 @@ MODULE_DEVICE_TABLE(of, mmcif_of_match);
>  
>  static const struct dev_pm_ops sh_mmcif_dev_pm_ops = {
>  	SET_SYSTEM_SLEEP_PM_OPS(sh_mmcif_suspend, sh_mmcif_resume)
> +	SET_RUNTIME_PM_OPS(sh_mmcif_runtime_suspend, sh_mmcif_runtime_resume,
> +			   NULL)
>  };
>  
>  static struct platform_driver sh_mmcif_driver = {
> -- 
> 1.7.9.5
> 

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux