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