Make the routine for setting power compliant with the specification. Certain ENE chips seem to be sufficiently non-compliant that they don't like this change; however, the single-power-write quirk should be enough to handle them (and is, in the case of at least one such device). Not-yet-signed-off-by: Darren Salt diff -ur linux-2.6.20-rc6.orig/drivers/mmc/sdhci.c linux-2.6.20-rc6/drivers/mmc/sdhci.c --- linux-2.6.20-rc6.orig/drivers/mmc/sdhci.c 2007-02-02 20:04:54.000000000 +0000 +++ linux-2.6.20-rc6/drivers/mmc/sdhci.c 2007-02-02 20:14:28.000000000 +0000 @@ -691,28 +691,31 @@ if ((host->chip->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE) == 0) writeb(0, host->ioaddr + SDHCI_POWER_CONTROL); - pwr = SDHCI_POWER_ON; - switch (power) { case MMC_VDD_170: case MMC_VDD_180: case MMC_VDD_190: - pwr |= SDHCI_POWER_180; + pwr = SDHCI_POWER_180; break; case MMC_VDD_290: case MMC_VDD_300: case MMC_VDD_310: - pwr |= SDHCI_POWER_300; + pwr = SDHCI_POWER_300; break; case MMC_VDD_320: case MMC_VDD_330: case MMC_VDD_340: - pwr |= SDHCI_POWER_330; + pwr = SDHCI_POWER_330; break; default: BUG(); } + if ((host->chip->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE) == 0) + writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL); + + pwr |= SDHCI_POWER_ON; + out: writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL);