RE: [PATCH RESEND v5] mmc: sdhci: enhance data timeout clock setting if SDCLK is used

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

 



Hi, Kevin

I had test on my platform, it works well.
Thanks.


Regards
Haijun.


> -----Original Message-----
> From: Kevin Liu [mailto:kliu5@xxxxxxxxxxx]
> Sent: Monday, March 25, 2013 5:27 PM
> To: linux-mmc@xxxxxxxxxxxxxxx; Chris Ball; Huang Changming-R66093; Lan
> Chunhe-B25806; Guennadi Liakhovetski; Sujit Reddy Thumma; Jaehoon Chung;
> Aaron Lu; Ulf Hansson; Wei WANG; Estevam Fabio-R49496
> Cc: Stephen Warren; Adrian Hunter; Philip Rakity; Shawn Guo; Johan
> Rudholm; Girish K S; Zhang Haijun-B42677; Zhangfei Gao; Haojian Zhuang;
> Chao Xie; Kevin Liu; Kevin Liu
> Subject: [PATCH RESEND v5] mmc: sdhci: enhance data timeout clock setting
> if SDCLK is used
> 
> 1. If SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK is selected, getting timeout
> through register or callback function is useless. So skip current
> redundant code.
> 2. If SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK is selected, host uses SDCLK
> instead of TMCLK for data timeouts. So host->timeout_clk and mmc-
> >max_discard_to should be updated accordingly when SDCLK changed.
> 3. If callback function get_timeout_clock is used, the timeout clock will
> be returned directly and no need to multiply by the timeout clock unit
> read from register. Currently, no host drivers implemented
> get_timeout_clock. So this change won't introduce any impact to current
> code.
> 
> Signed-off-by: Kevin Liu <kliu5@xxxxxxxxxxx>
> Acked-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
> ---
>  drivers/mmc/host/sdhci.c |   44 ++++++++++++++++++++++++++++------------
> ----
>  1 file changed, 28 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index
> 2ea429c..577bfa3 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -1114,6 +1114,11 @@ static u16 sdhci_get_preset_value(struct
> sdhci_host *host)
>  	return preset;
>  }
> 
> +static inline void sdhci_set_max_discard_to(struct sdhci_host *host) {
> +	host->mmc->max_discard_to = (1 << 27) / host->timeout_clk; }
> +
>  static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
> {
>  	int div = 0; /* Initialized for compiler warning */ @@ -1126,6
> +1131,12 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned
> int clock)
> 
>  	host->mmc->actual_clock = 0;
> 
> +	if ((host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK) && clock)
> {
> +		/* The lowest allowed timeout clock frequency is 1Khz */
> +		host->timeout_clk = DIV_ROUND_UP(clock, 1000);
> +		sdhci_set_max_discard_to(host);
> +	}
> +
>  	if (host->ops->set_clock) {
>  		host->ops->set_clock(host, clock);
>  		if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) @@ -2875,25
> +2886,26 @@ int sdhci_add_host(struct sdhci_host *host)
>  	} else
>  		mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200;
> 
> -	host->timeout_clk =
> -		(caps[0] & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
> -	if (host->timeout_clk == 0) {
> -		if (host->ops->get_timeout_clock) {
> -			host->timeout_clk = host->ops->get_timeout_clock(host);
> -		} else if (!(host->quirks &
> -				SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) {
> -			pr_err("%s: Hardware doesn't specify timeout clock "
> -			       "frequency.\n", mmc_hostname(mmc));
> -			return -ENODEV;
> +	if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) {
> +		host->timeout_clk = (caps[0] & SDHCI_TIMEOUT_CLK_MASK) >>
> +					SDHCI_TIMEOUT_CLK_SHIFT;
> +		if (host->timeout_clk == 0) {
> +			if (host->ops->get_timeout_clock) {
> +				host->timeout_clk =
> +					host->ops->get_timeout_clock(host);
> +			}
> +			if (host->timeout_clk == 0) {
> +				pr_err("%s: Hardware doesn't specify timeout "
> +					"clock frequency.\n",
> +					mmc_hostname(mmc));
> +				return -ENODEV;
> +			}
> +		} else if (caps[0] & SDHCI_TIMEOUT_CLK_UNIT) {
> +			host->timeout_clk *= 1000;
>  		}
> +		sdhci_set_max_discard_to(host);
>  	}
> -	if (caps[0] & SDHCI_TIMEOUT_CLK_UNIT)
> -		host->timeout_clk *= 1000;
> -
> -	if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)
> -		host->timeout_clk = mmc->f_max / 1000;
> 
> -	mmc->max_discard_to = (1 << 27) / host->timeout_clk;
> 
>  	mmc->caps |= MMC_CAP_SDIO_IRQ | MMC_CAP_ERASE | MMC_CAP_CMD23;
> 
> --
> 1.7.9.5
> 


--
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