diff options
author | Laura Abbott <labbott@fedoraproject.org> | 2017-07-17 08:39:06 -0700 |
---|---|---|
committer | Laura Abbott <labbott@fedoraproject.org> | 2017-07-17 08:39:06 -0700 |
commit | 3986999a48a7b1279e3b1e407f7aad00b337a3ad (patch) | |
tree | 11cd8325b553b3b8858a4d630d2609d617dbc8e5 /0014-mmc-sdhci-acpi-Workaround-conflict-with-PCI-wifi-on-.patch | |
parent | 927dc52638a0f684092e0a06d286c95609cec64d (diff) | |
download | kernel-3986999a48a7b1279e3b1e407f7aad00b337a3ad.tar.gz kernel-3986999a48a7b1279e3b1e407f7aad00b337a3ad.tar.xz kernel-3986999a48a7b1279e3b1e407f7aad00b337a3ad.zip |
Linux v4.13-rc1
Diffstat (limited to '0014-mmc-sdhci-acpi-Workaround-conflict-with-PCI-wifi-on-.patch')
-rw-r--r-- | 0014-mmc-sdhci-acpi-Workaround-conflict-with-PCI-wifi-on-.patch | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/0014-mmc-sdhci-acpi-Workaround-conflict-with-PCI-wifi-on-.patch b/0014-mmc-sdhci-acpi-Workaround-conflict-with-PCI-wifi-on-.patch deleted file mode 100644 index 4eaaac1e2..000000000 --- a/0014-mmc-sdhci-acpi-Workaround-conflict-with-PCI-wifi-on-.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 93c501a65e23aba07389ad95b7e31834ae6d4722 Mon Sep 17 00:00:00 2001 -From: Adrian Hunter <adrian.hunter@intel.com> -Date: Wed, 21 Jun 2017 15:08:39 +0300 -Subject: [PATCH 14/16] mmc: sdhci-acpi: Workaround conflict with PCI wifi on - GPD Win handheld - -GPDwin uses PCI wifi which conflicts with SDIO's use of -acpi_device_fix_up_power() on child device nodes. Specifically -acpi_device_fix_up_power() causes the wifi module to get turned off. -Identifying GPDwin is problematic, but since SDIO is only used for wifi, -the presence of the PCI wifi card in the expected slot with an ACPI -companion node, is used to indicate that acpi_device_fix_up_power() should -be avoided. - -[labbott@redhat.com: Rebased for Fedora] -Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> -Acked-by: Hans de Goede <hdegoede@redhat.com> -Tested-by: Hans de Goede <hdegoede@redhat.com> -Cc: stable@vger.kernel.org ---- - drivers/mmc/host/sdhci-acpi.c | 70 +++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 64 insertions(+), 6 deletions(-) - -diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c -index cf66a3d..ac678e9 100644 ---- a/drivers/mmc/host/sdhci-acpi.c -+++ b/drivers/mmc/host/sdhci-acpi.c -@@ -45,6 +45,7 @@ - #include <asm/cpu_device_id.h> - #include <asm/intel-family.h> - #include <asm/iosf_mbi.h> -+#include <linux/pci.h> - #endif - - #include "sdhci.h" -@@ -134,6 +135,16 @@ static bool sdhci_acpi_byt(void) - return x86_match_cpu(byt); - } - -+static bool sdhci_acpi_cht(void) -+{ -+ static const struct x86_cpu_id cht[] = { -+ { X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_AIRMONT }, -+ {} -+ }; -+ -+ return x86_match_cpu(cht); -+} -+ - #define BYT_IOSF_SCCEP 0x63 - #define BYT_IOSF_OCP_NETCTRL0 0x1078 - #define BYT_IOSF_OCP_TIMEOUT_BASE GENMASK(10, 8) -@@ -178,6 +189,45 @@ static bool sdhci_acpi_byt_defer(struct device *dev) - return false; - } - -+static bool sdhci_acpi_cht_pci_wifi(unsigned int vendor, unsigned int device, -+ unsigned int slot, unsigned int parent_slot) -+{ -+ struct pci_dev *dev, *parent, *from = NULL; -+ -+ while (1) { -+ dev = pci_get_device(vendor, device, from); -+ pci_dev_put(from); -+ if (!dev) -+ break; -+ parent = pci_upstream_bridge(dev); -+ if (ACPI_COMPANION(&dev->dev) && PCI_SLOT(dev->devfn) == slot && -+ parent && PCI_SLOT(parent->devfn) == parent_slot && -+ !pci_upstream_bridge(parent)) { -+ pci_dev_put(dev); -+ return true; -+ } -+ from = dev; -+ } -+ -+ return false; -+} -+ -+/* -+ * GPDwin uses PCI wifi which conflicts with SDIO's use of -+ * acpi_device_fix_up_power() on child device nodes. Identifying GPDwin is -+ * problematic, but since SDIO is only used for wifi, the presence of the PCI -+ * wifi card in the expected slot with an ACPI companion node, is used to -+ * indicate that acpi_device_fix_up_power() should be avoided. -+ */ -+static inline bool sdhci_acpi_no_fixup_child_power(const char *hid, -+ const char *uid) -+{ -+ return sdhci_acpi_cht() && -+ !strcmp(hid, "80860F14") && -+ !strcmp(uid, "2") && -+ sdhci_acpi_cht_pci_wifi(0x14e4, 0x43ec, 0, 28); -+} -+ - #else - - static inline void sdhci_acpi_byt_setting(struct device *dev) -@@ -189,6 +239,12 @@ static inline bool sdhci_acpi_byt_defer(struct device *dev) - return false; - } - -+static inline bool sdhci_acpi_no_fixup_child_power(const char *hid, -+ const char *uid) -+{ -+ return false; -+} -+ - #endif - - static int bxt_get_cd(struct mmc_host *mmc) -@@ -389,18 +445,20 @@ static int sdhci_acpi_probe(struct platform_device *pdev) - if (acpi_bus_get_device(handle, &device)) - return -ENODEV; - -+ hid = acpi_device_hid(device); -+ uid = device->pnp.unique_id; -+ - /* Power on the SDHCI controller and its children */ - acpi_device_fix_up_power(device); -- list_for_each_entry(child, &device->children, node) -- if (child->status.present && child->status.enabled) -- acpi_device_fix_up_power(child); -+ if (!sdhci_acpi_no_fixup_child_power(hid, uid)) { -+ list_for_each_entry(child, &device->children, node) -+ if (child->status.present && child->status.enabled) -+ acpi_device_fix_up_power(child); -+ } - - if (sdhci_acpi_byt_defer(dev)) - return -EPROBE_DEFER; - -- hid = acpi_device_hid(device); -- uid = device->pnp.unique_id; -- - iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!iomem) - return -ENOMEM; --- -2.7.5 - |