[PATCH 3/6] mmc: sdhci: add platform set_timeout hook
Shawn Guo
shawn.guo at linaro.org
Tue Dec 10 21:16:48 EST 2013
On Tue, Dec 10, 2013 at 08:56:05PM +0800, Dong Aisheng wrote:
> Currently the common code assume 0xE is the maximum timeout counter
> value and use it to write into the timeout counter register.
> However, it's fairly possible that the different SoCs may have
> different register layout on the timeout counter register.
> That means 0xE may not be the correct maximum timeout value, then
> the 0xE becomes meaningless.
>
> To be flexible, this patch provides another approach for platforms
> to set the correct timeout on their way.
>
> Signed-off-by: Dong Aisheng <b29396 at freescale.com>
> ---
> drivers/mmc/host/sdhci.c | 19 ++++++++++++++-----
> drivers/mmc/host/sdhci.h | 2 ++
> 2 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 464d42c..4cc3bd6 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -726,19 +726,28 @@ static void sdhci_set_transfer_irqs(struct sdhci_host *host)
> sdhci_clear_set_irqs(host, dma_irqs, pio_irqs);
> }
>
> -static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
> +static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)
> {
> u8 count;
> +
> + if (host->ops->set_timeout) {
> + host->ops->set_timeout(host, cmd);
> + } else {
> + count = sdhci_calc_timeout(host, cmd);
> + sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL);
> + }
> +}
> +
> +static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
> +{
> u8 ctrl;
> struct mmc_data *data = cmd->data;
> int ret;
>
> WARN_ON(host->data);
>
> - if (data || (cmd->flags & MMC_RSP_BUSY)) {
> - count = sdhci_calc_timeout(host, cmd);
>From what I read the commit log, I think it might be more appropriate to
patch sdhci_calc_timeout() like the following?
if (host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL)
if (host->ops->get_max_timeout)
return host->ops->get_max_timeout(host);
else
return 0xE;
Shawn
> - sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL);
> - }
> + if (data || (cmd->flags & MMC_RSP_BUSY))
> + sdhci_set_timeout(host, cmd);
>
> if (!data)
> return;
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 1591cbb..a4851a0 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -282,6 +282,8 @@ struct sdhci_ops {
> unsigned int (*get_min_clock)(struct sdhci_host *host);
> unsigned int (*get_timeout_clock)(struct sdhci_host *host);
> unsigned int (*get_max_timeout)(struct sdhci_host *host);
> + void (*set_timeout)(struct sdhci_host *host,
> + struct mmc_command *cmd);
> int (*platform_bus_width)(struct sdhci_host *host,
> int width);
> void (*platform_send_init_74_clocks)(struct sdhci_host *host,
> --
> 1.7.2.rc3
>
>
More information about the linux-arm-kernel
mailing list