diff options
-rw-r--r-- | drivers/mmc/host/sdhci.c | 18 | ||||
-rw-r--r-- | include/linux/pci_ids.h | 1 |
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 | ||
59 | static const struct pci_device_id pci_ids[] __devinitdata = { | 61 | static 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 | ||
779 | out: | 797 | out: |
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 |