|
@@ -149,11 +149,11 @@ static const struct sdhci_pci_fixes sdhci_cafe = {
|
|
* ADMA operation is disabled for Moorestown platform due to
|
|
* ADMA operation is disabled for Moorestown platform due to
|
|
* hardware bugs.
|
|
* hardware bugs.
|
|
*/
|
|
*/
|
|
-static int mrst_hc1_probe(struct sdhci_pci_chip *chip)
|
|
|
|
|
|
+static int mrst_hc_probe(struct sdhci_pci_chip *chip)
|
|
{
|
|
{
|
|
/*
|
|
/*
|
|
- * slots number is fixed here for MRST as SDIO3 is never used and has
|
|
|
|
- * hardware bugs.
|
|
|
|
|
|
+ * slots number is fixed here for MRST as SDIO3/5 are never used and
|
|
|
|
+ * have hardware bugs.
|
|
*/
|
|
*/
|
|
chip->num_slots = 1;
|
|
chip->num_slots = 1;
|
|
return 0;
|
|
return 0;
|
|
@@ -163,9 +163,9 @@ static const struct sdhci_pci_fixes sdhci_intel_mrst_hc0 = {
|
|
.quirks = SDHCI_QUIRK_BROKEN_ADMA | SDHCI_QUIRK_NO_HISPD_BIT,
|
|
.quirks = SDHCI_QUIRK_BROKEN_ADMA | SDHCI_QUIRK_NO_HISPD_BIT,
|
|
};
|
|
};
|
|
|
|
|
|
-static const struct sdhci_pci_fixes sdhci_intel_mrst_hc1 = {
|
|
|
|
|
|
+static const struct sdhci_pci_fixes sdhci_intel_mrst_hc1_hc2 = {
|
|
.quirks = SDHCI_QUIRK_BROKEN_ADMA | SDHCI_QUIRK_NO_HISPD_BIT,
|
|
.quirks = SDHCI_QUIRK_BROKEN_ADMA | SDHCI_QUIRK_NO_HISPD_BIT,
|
|
- .probe = mrst_hc1_probe,
|
|
|
|
|
|
+ .probe = mrst_hc_probe,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct sdhci_pci_fixes sdhci_intel_mfd_sd = {
|
|
static const struct sdhci_pci_fixes sdhci_intel_mfd_sd = {
|
|
@@ -538,7 +538,15 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
|
|
.device = PCI_DEVICE_ID_INTEL_MRST_SD1,
|
|
.device = PCI_DEVICE_ID_INTEL_MRST_SD1,
|
|
.subvendor = PCI_ANY_ID,
|
|
.subvendor = PCI_ANY_ID,
|
|
.subdevice = PCI_ANY_ID,
|
|
.subdevice = PCI_ANY_ID,
|
|
- .driver_data = (kernel_ulong_t)&sdhci_intel_mrst_hc1,
|
|
|
|
|
|
+ .driver_data = (kernel_ulong_t)&sdhci_intel_mrst_hc1_hc2,
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ .vendor = PCI_VENDOR_ID_INTEL,
|
|
|
|
+ .device = PCI_DEVICE_ID_INTEL_MRST_SD2,
|
|
|
|
+ .subvendor = PCI_ANY_ID,
|
|
|
|
+ .subdevice = PCI_ANY_ID,
|
|
|
|
+ .driver_data = (kernel_ulong_t)&sdhci_intel_mrst_hc1_hc2,
|
|
},
|
|
},
|
|
|
|
|
|
{
|
|
{
|
|
@@ -637,6 +645,7 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state)
|
|
{
|
|
{
|
|
struct sdhci_pci_chip *chip;
|
|
struct sdhci_pci_chip *chip;
|
|
struct sdhci_pci_slot *slot;
|
|
struct sdhci_pci_slot *slot;
|
|
|
|
+ mmc_pm_flag_t slot_pm_flags;
|
|
mmc_pm_flag_t pm_flags = 0;
|
|
mmc_pm_flag_t pm_flags = 0;
|
|
int i, ret;
|
|
int i, ret;
|
|
|
|
|
|
@@ -657,7 +666,11 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- pm_flags |= slot->host->mmc->pm_flags;
|
|
|
|
|
|
+ slot_pm_flags = slot->host->mmc->pm_flags;
|
|
|
|
+ if (slot_pm_flags & MMC_PM_WAKE_SDIO_IRQ)
|
|
|
|
+ sdhci_enable_irq_wakeups(slot->host);
|
|
|
|
+
|
|
|
|
+ pm_flags |= slot_pm_flags;
|
|
}
|
|
}
|
|
|
|
|
|
if (chip->fixes && chip->fixes->suspend) {
|
|
if (chip->fixes && chip->fixes->suspend) {
|
|
@@ -671,8 +684,10 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state)
|
|
|
|
|
|
pci_save_state(pdev);
|
|
pci_save_state(pdev);
|
|
if (pm_flags & MMC_PM_KEEP_POWER) {
|
|
if (pm_flags & MMC_PM_KEEP_POWER) {
|
|
- if (pm_flags & MMC_PM_WAKE_SDIO_IRQ)
|
|
|
|
|
|
+ if (pm_flags & MMC_PM_WAKE_SDIO_IRQ) {
|
|
|
|
+ pci_pme_active(pdev, true);
|
|
pci_enable_wake(pdev, PCI_D3hot, 1);
|
|
pci_enable_wake(pdev, PCI_D3hot, 1);
|
|
|
|
+ }
|
|
pci_set_power_state(pdev, PCI_D3hot);
|
|
pci_set_power_state(pdev, PCI_D3hot);
|
|
} else {
|
|
} else {
|
|
pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
|
|
pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
|