|
@@ -375,6 +375,13 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
|
|
|
+{
|
|
|
+ slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE |
|
|
|
+ MMC_CAP_WAIT_WHILE_BUSY;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
|
|
|
{
|
|
|
slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE |
|
|
@@ -448,6 +455,15 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = {
|
|
|
.ops = &sdhci_intel_byt_ops,
|
|
|
};
|
|
|
|
|
|
+static const struct sdhci_pci_fixes sdhci_ni_byt_sdio = {
|
|
|
+ .quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
|
|
|
+ .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON |
|
|
|
+ SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
|
|
|
+ .allow_runtime_pm = true,
|
|
|
+ .probe_slot = ni_byt_sdio_probe_slot,
|
|
|
+ .ops = &sdhci_intel_byt_ops,
|
|
|
+};
|
|
|
+
|
|
|
static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = {
|
|
|
.quirks = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
|
|
|
.quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON |
|
|
@@ -1077,6 +1093,14 @@ static const struct pci_device_id pci_ids[] = {
|
|
|
.driver_data = (kernel_ulong_t)&sdhci_intel_byt_emmc,
|
|
|
},
|
|
|
|
|
|
+ {
|
|
|
+ .vendor = PCI_VENDOR_ID_INTEL,
|
|
|
+ .device = PCI_DEVICE_ID_INTEL_BYT_SDIO,
|
|
|
+ .subvendor = PCI_VENDOR_ID_NI,
|
|
|
+ .subdevice = 0x7884,
|
|
|
+ .driver_data = (kernel_ulong_t)&sdhci_ni_byt_sdio,
|
|
|
+ },
|
|
|
+
|
|
|
{
|
|
|
.vendor = PCI_VENDOR_ID_INTEL,
|
|
|
.device = PCI_DEVICE_ID_INTEL_BYT_SDIO,
|