aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndres Salomon <dilinger@queued.net>2008-07-04 13:00:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-04 13:40:09 -0400
commite08c1694d9e2138204f2b79b73f0f159074ce2f5 (patch)
tree78078c43810ab607516445c9543220f26306eecf
parent491539982aa01fa71de93c2a06ac5d890d4cf1e2 (diff)
olpc: sdhci: add quirk for the Marvell CaFe's vdd/powerup issue
This has been sitting around unloved for way too long.. The Marvell CaFe chip's SD implementation chokes during card insertion if one attempts to set the voltage and power up in the same SDHCI_POWER_CONTROL register write. This adds a quirk that does that particular dance in two steps. It also adds an entry to pci_ids.h for the CaFe chip's SD device. Signed-off-by: Andres Salomon <dilinger@debian.org> Cc: Pierre Ossman <drzeus-list@drzeus.cx> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-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