aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/host/sdhci.c18
-rw-r--r--include/linux/pci_ids.h1
2 files changed, 19 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:
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index eafc9d6d2b35..65953822c9cb 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1520,6 +1520,7 @@
1520#define PCI_DEVICE_ID_MARVELL_GT64260 0x6430 1520#define PCI_DEVICE_ID_MARVELL_GT64260 0x6430
1521#define PCI_DEVICE_ID_MARVELL_MV64360 0x6460 1521#define PCI_DEVICE_ID_MARVELL_MV64360 0x6460
1522#define PCI_DEVICE_ID_MARVELL_MV64460 0x6480 1522#define PCI_DEVICE_ID_MARVELL_MV64460 0x6480
1523#define PCI_DEVICE_ID_MARVELL_CAFE_SD 0x4101
1523 1524
1524#define PCI_VENDOR_ID_V3 0x11b0 1525#define PCI_VENDOR_ID_V3 0x11b0
1525#define PCI_DEVICE_ID_V3_V960 0x0001 1526#define PCI_DEVICE_ID_V3_V960 0x0001