On Tue, Sep 28, 2010 at 12:05 AM, Philip Rakity <prakity@xxxxxxxxxxx> wrote: > > The code snippet >> + for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; div += 2) { >> if ((host->max_clk / div) <= clock) >> break; > > is not correct. In sdio 3.0 the value is not a power of 2 for the divider but the value to be divided down-- all the bits count That's the reason using div += 2 instead of div *= 2 > 2) 10-bit Divided Clock > Host Controller Version 3.00 supports this mandatory mode instead of the > 8-bit Divided Clock Mode. The length of the divider is extended to 10 bits and all > divider values shall be supported. > 3FFh 1/2046 Divided Clock > > Philip > > Hi Zhangfei, > > On Sat, Sep 25, 2010 at 12:23:33AM -0400, zhangfei gao wrote: >> From: Zhangfei Gao <zhangfei.gao@xxxxxxxxxxx> >> Date: Mon, 20 Sep 2010 15:15:18 -0400 >> Subject: [PATCH] sdhci: correct f_min in sd 3.0 >> >> Signed-off-by: Zhangfei Gao <zhangfei.gao@xxxxxxxxxxx> >> --- >> drivers/mmc/host/sdhci.c | 8 +++++--- >> drivers/mmc/host/sdhci.h | 3 +++ >> 2 files changed, 8 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c >> index 5928b0a..829e78a 100644 >> --- a/drivers/mmc/host/sdhci.c >> +++ b/drivers/mmc/host/sdhci.c >> @@ -1007,14 +1007,14 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) >> if (host->max_clk <= clock) >> div = 1; >> else { >> - for (div = 2; div < 2046; div += 2) { >> + for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; div += 2) { >> if ((host->max_clk / div) <= clock) >> break; >> } >> } >> } else { >> /* Version 2.00 divisors must be a power of 2. */ >> - for (div = 1; div < 256; div *= 2) { >> + for (div = 1; div < SDHCI_MAX_DIV_SPEC_200; div *= 2) { >> if ((host->max_clk / div) <= clock) >> break; >> } >> @@ -1836,8 +1836,10 @@ int sdhci_add_host(struct sdhci_host *host) >> mmc->ops = &sdhci_ops; >> if (host->ops->get_min_clock) >> mmc->f_min = host->ops->get_min_clock(host); >> + else if (host->version >= SDHCI_SPEC_300) >> + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; >> else >> - mmc->f_min = host->max_clk / 256; >> + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; >> mmc->f_max = host->max_clk; >> mmc->caps |= MMC_CAP_SDIO_IRQ; >> >> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h >> index ae28a31..d35fb3d 100644 >> --- a/drivers/mmc/host/sdhci.h >> +++ b/drivers/mmc/host/sdhci.h >> @@ -185,6 +185,9 @@ >> #define SDHCI_SPEC_200 1 >> #define SDHCI_SPEC_300 2 >> >> +#define SDHCI_MAX_DIV_SPEC_200 256 >> +#define SDHCI_MAX_DIV_SPEC_300 2046 >> + >> struct sdhci_ops; >> >> struct sdhci_host { > > Thanks very much, I've applied this to mmc-next now. > > - Chris. > -- > Chris Ball <cjb@xxxxxxxxxx> <http://printf.net/> > One Laptop Per Child > -- > 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 > > -- > 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 > -- 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