RE: [PATCH RESEND v4 1/2] mmc: sdhci: update timeout clock setting if SDCLK is used

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

 



Is there any feedback about this patch?
We also need this patch.


Regards
Haijun.


> -----Original Message-----
> From: Kevin Liu [mailto:kliu5@xxxxxxxxxxx]
> Sent: Friday, January 25, 2013 7:35 PM
> To: linux-mmc@xxxxxxxxxxxxxxx; Chris Ball; Andy Shevchenko; Ulf Hansson
> Cc: Nicolas Pitre; Adrian Hunter; Philip Rakity; Aaron Lu; Shawn Guo;
> Johan Rudholm; Daniel Drake; Guennadi Liakhovetski; Huang Changming-
> R66093; Alexander Stein; Girish K S; Zhang Haijun-B42677; Viresh Kumar;
> Heiko Stuebner; Thomas Abraham; Chander Kashyap; Jaehoon Chung; Sebastian
> Hesselbarth; Zhangfei Gao; Haojian Zhuang; Chao Xie; Kevin Liu; Kevin Liu
> Subject: [PATCH RESEND v4 1/2] mmc: sdhci: update 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.
> 
> Signed-off-by: Kevin Liu <kliu5@xxxxxxxxxxx>
> Acked-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
> ---
>  drivers/mmc/host/sdhci.c |   43 +++++++++++++++++++++++++++-------------
> ---
>  1 file changed, 27 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index
> 04af0fd..c31c30e 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -1082,6 +1082,11 @@ static void sdhci_finish_command(struct sdhci_host
> *host)
>  	}
>  }
> 
> +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 */ @@ -1094,6
> +1099,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 permitted 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) @@ -2828,25
> +2839,25 @@ 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