|
@@ -55,6 +55,8 @@ static unsigned int debug_quirks = 0;
|
|
#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<7)
|
|
#define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<7)
|
|
/* Controller needs to be reset after each request to stay stable */
|
|
/* Controller needs to be reset after each request to stay stable */
|
|
#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<8)
|
|
#define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<8)
|
|
|
|
+/* Controller needs voltage and power writes to happen separately */
|
|
|
|
+#define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<9)
|
|
|
|
|
|
static const struct pci_device_id pci_ids[] __devinitdata = {
|
|
static const struct pci_device_id pci_ids[] __devinitdata = {
|
|
{
|
|
{
|
|
@@ -127,6 +129,14 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
|
|
SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS,
|
|
SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS,
|
|
},
|
|
},
|
|
|
|
|
|
|
|
+ {
|
|
|
|
+ .vendor = PCI_VENDOR_ID_MARVELL,
|
|
|
|
+ .device = PCI_DEVICE_ID_MARVELL_CAFE_SD,
|
|
|
|
+ .subvendor = PCI_ANY_ID,
|
|
|
|
+ .subdevice = PCI_ANY_ID,
|
|
|
|
+ .driver_data = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER,
|
|
|
|
+ },
|
|
|
|
+
|
|
{
|
|
{
|
|
.vendor = PCI_VENDOR_ID_JMICRON,
|
|
.vendor = PCI_VENDOR_ID_JMICRON,
|
|
.device = PCI_DEVICE_ID_JMICRON_JMB38X_SD,
|
|
.device = PCI_DEVICE_ID_JMICRON_JMB38X_SD,
|
|
@@ -774,6 +784,14 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
|
|
BUG();
|
|
BUG();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * At least the CaFe chip gets confused if we set the voltage
|
|
|
|
+ * and set turn on power at the same time, so set the voltage first.
|
|
|
|
+ */
|
|
|
|
+ if ((host->chip->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER))
|
|
|
|
+ writeb(pwr & ~SDHCI_POWER_ON,
|
|
|
|
+ host->ioaddr + SDHCI_POWER_CONTROL);
|
|
|
|
+
|
|
writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL);
|
|
writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL);
|
|
|
|
|
|
out:
|
|
out:
|