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<[email protected]>
>> Subject: [PATCH] sdhci: allow for eMMC 74 clock generation by controller
>> Signed-off-by: Philip Rakity<[email protected]>
>>
>> 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 [email protected]
>> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html