aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/host/sdhci.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 07c2048b230b..5b74c8cf4409 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -55,6 +55,8 @@ static unsigned int debug_quirks = 0;
55#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<7) 55#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<7)
56/* Controller needs to be reset after each request to stay stable */ 56/* Controller needs to be reset after each request to stay stable */
57#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<8) 57#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<8)
58/* Controller needs voltage and power writes to happen separately */
59#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<9)
58 60
59static const struct pci_device_id pci_ids[] __devinitdata = { 61static const struct pci_device_id pci_ids[] __devinitdata = {
60 { 62 {
@@ -128,6 +130,14 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
128 }, 130 },
129 131
130 { 132 {
133 .vendor = PCI_VENDOR_ID_MARVELL,
134 .device = PCI_DEVICE_ID_MARVELL_CAFE_SD,
135 .subvendor = PCI_ANY_ID,
136 .subdevice = PCI_ANY_ID,
137 .driver_data = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER,
138 },
139
140 {
131 .vendor = PCI_VENDOR_ID_JMICRON, 141 .vendor = PCI_VENDOR_ID_JMICRON,
132 .device = PCI_DEVICE_ID_JMICRON_JMB38X_SD, 142 .device = PCI_DEVICE_ID_JMICRON_JMB38X_SD,
133 .subvendor = PCI_ANY_ID, 143 .subvendor = PCI_ANY_ID,
@@ -774,6 +784,14 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
774 BUG(); 784 BUG();
775 } 785 }
776 786
787 /*
788 * At least the CaFe chip gets confused if we set the voltage
789 * and set turn on power at the same time, so set the voltage first.
790 */
791 if ((host->chip->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER))
792 writeb(pwr & ~SDHCI_POWER_ON,
793 host->ioaddr + SDHCI_POWER_CONTROL);
794
777 writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL); 795 writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL);
778 796
779out: 797out: