Our hardware needs to be programmed to handle this case. The host-ops option is only needed from h/w that does not handle this. If you can suggest a way to do this in the mmc layer I would welcome implementing it. I looked and the solution requires a call into the driver from the mmc layer after the all setting POWER_ON call. This was more intrusive than doing it in the driver but if you think this makes sense I can do a patch for that. eg /* * Apply power to the MMC stack. This is a two-stage process. * First, we enable power to the card without the clock running. * We then wait a bit for the power to stabilise. Finally, * enable the bus drivers and clock to the card. * * We must _NOT_ enable the clock prior to power stablising. * * If a host does all the power sequencing itself, ignore the * initial MMC_POWER_UP stage. */ static void mmc_power_up(struct mmc_host *host) { int bit = fls(host->ocr_avail) - 1; host->ios.vdd = bit; if (mmc_host_is_spi(host)) { host->ios.chip_select = MMC_CS_HIGH; host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; } else { host->ios.chip_select = MMC_CS_DONTCARE; host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; } host->ios.power_mode = MMC_POWER_UP; host->ios.bus_width = MMC_BUS_WIDTH_1; host->ios.timing = MMC_TIMING_LEGACY; mmc_set_ios(host); /* CALL INTO DRIVER HERE TO SEND 74 CLOCKS */ <========== Philip On Sep 20, 2010, at 11:04 PM, Adrian Hunter wrote: > On 21/09/10 08:43, ext Philip Rakity wrote: >> >> Wolfram, >> >> I generated the patch for eMMC 74 clocks. I do not know if you want to incorporate into your submission or let it stand on its own. > > Wouldn't it be better to fix it in MMC core rather than duplicate it in every driver? > >> >> regards, >> >> Philip >> >> >> >> From: Philip Rakity<prakity@xxxxxxxxxxx> >> Subject: [PATCH] sdhci: allow for eMMC 74 clock generation by controller >> Signed-off-by: Philip Rakity<prakity@xxxxxxxxxxx> >> >> Patch is below and sample usage in sdhci-xxxx.c adaption code is below. >> >> /* >> * eMMC spec calls for the host to send 74 clocks to the card >> * during initialization, right after voltage stabilization. >> * create the clocks manually right here. >> */ >> void generate_init_clocks_A0(struct sdhci_host *host, u8 power_mode) >> { >> struct sdhci_mmc_slot *slot = sdhci_priv(host); >> >> DBG ("%s: ENTER %s: slot->power_mode = %d, ios->power_mode = %d\n", >> __func__, >> mmc_hostname(host->mmc), >> slot->power_mode, >> power_mode); >> >> if (slot->power_mode == MMC_POWER_UP >> && power_mode == MMC_POWER_ON) { >> >> /* controller specific code here */ >> /* slot->power_mode holds previous power setting */ >> >> } >> slot->power_mode = power_mode; >> } >> >> >> >> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c >> index 401527d..6aadd0f 100644 >> --- a/drivers/mmc/host/sdhci.c >> +++ b/drivers/mmc/host/sdhci.c >> @@ -1168,6 +1168,9 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) >> else >> sdhci_set_power(host, ios->vdd); >> >> + if (host->ops->platform_generate_initial_74_clocks) >> + host->ops->platform_generate_initial_74_clocks(host, ios->power_mode); >> + >> ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); >> >> if (ios->bus_width == MMC_BUS_WIDTH_8) >> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h >> index d316bc7..70c5806 100644 >> --- a/drivers/mmc/host/sdhci.h >> +++ b/drivers/mmc/host/sdhci.h >> @@ -323,6 +323,8 @@ struct sdhci_ops { >> unsigned int (*get_max_clock)(struct sdhci_host *host); >> unsigned int (*get_min_clock)(struct sdhci_host *host); >> unsigned int (*get_timeout_clock)(struct sdhci_host *host); >> + void (*platform_generate_initial_74_clocks)(struct sdhci_host *host, >> + u8 power_mode); >> }; >> >> #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS >> >> -- >> 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