[PATCH 3/6] mmc: sdhci: add platform set_timeout hook

Dong Aisheng dongas86 at gmail.com
Tue Dec 10 22:03:31 EST 2013


On Wed, Dec 11, 2013 at 10:16 AM, Shawn Guo <shawn.guo at linaro.org> wrote:
> 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;
>

The return val of sdhci_calc_timeout is the register value to be
written into timeout counter register.
host->ops->get_max_timeout returns the max timeout in miliseconds directly.
So we can not do like that here.
They're two concepts.

Regards
Dong Aisheng

> 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
>>
>>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel



More information about the linux-arm-kernel mailing list