Hi,
On 26-12-16 00:25, Rafael J. Wysocki wrote:
CC Mika and Andy.
Plus I don't think -stable is going to take your patches directly.
Not sure what you mean with this remark? According to:
Documentation/stable_kernel_rules.txt
Option 1
********
To have the patch automatically included in the stable tree, add the tag
.. code-block:: none
Cc: stable@xxxxxxxxxxxxxxx
in the sign-off area. Once the patch is merged it will be applied to
the stable tree without anything else needing to be done by the author
or subsystem maintainer.
So yes, it won't get merged until it has been merged into Linus'
tree. But AFAICT adding Cc: stable@xxxxxxxxxxxxxxx is the right way
to indicate that a patch is a bug-fix which should be applied to
stable kernels once merged, which is my intention of adding the Cc.
Regards,
Hans
On Sun, Dec 25, 2016 at 11:21 AM, Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
The firmware on some cherrytrail devices wrongly adds _ADR 0 to their
entry describing the 80860F14 uid "2" sd-controller.
I believe the firmware writers intended this as a sdio function address,
but it is in the wrong place for this, so it gets interpreted as a pci
address, causing the node describing the sd-controller used for the
sdio-wifi to get seen as a firmware_node for the pci host bridge, rather
then being stand-alone device.
This commit adds a byt_sdio_setup function which detects this scenario
and removes the wrong firmware_node link from the pci host bridge, which
fixes acpi_create_platform_device returning NULL, leading to non-working
sdio-wifi.
BugLink: https://github.com/hadess/rtl8723bs/issues/80
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
---
drivers/acpi/acpi_lpss.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
index 373657f..df9cc66 100644
--- a/drivers/acpi/acpi_lpss.c
+++ b/drivers/acpi/acpi_lpss.c
@@ -84,6 +84,7 @@ static const struct lpss_device_desc lpss_dma_desc = {
};
struct lpss_private_data {
+ struct acpi_device *adev;
void __iomem *mmio_base;
resource_size_t mmio_size;
unsigned int fixed_clk_rate;
@@ -154,6 +155,33 @@ static void byt_i2c_setup(struct lpss_private_data *pdata)
writel(0, pdata->mmio_base + LPSS_I2C_ENABLE);
}
+static void byt_sdio_setup(struct lpss_private_data *pdata)
+{
+ unsigned long long adr;
+ acpi_status status;
+ struct device *dev;
+
+ /*
+ * Some firmware has a broken _ADR 0 enter for the 80860F14:2
+ * device, which causes it to get seen as the firmware_node
+ * for the pci host bridge, rather then a stand alone device.
+ *
+ * Check if this is the case, and if it is remove the link.
+ */
+ if (strcmp(acpi_device_uid(pdata->adev), "2") != 0)
+ return;
+
+ status = acpi_evaluate_integer(pdata->adev->handle, "_ADR", NULL, &adr);
+ if (ACPI_FAILURE(status) || adr != 0)
+ return;
+
+ dev = acpi_get_first_physical_node(pdata->adev);
+ if (!dev)
+ return;
+
+ acpi_unbind_one(dev);
+}
+
static const struct lpss_device_desc lpt_dev_desc = {
.flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR,
.prv_offset = 0x800,
@@ -217,6 +245,7 @@ static const struct lpss_device_desc byt_spi_dev_desc = {
static const struct lpss_device_desc byt_sdio_dev_desc = {
.flags = LPSS_CLK,
+ .setup = byt_sdio_setup,
};
static const struct lpss_device_desc byt_i2c_dev_desc = {
@@ -425,6 +454,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
goto err_out;
}
+ pdata->adev = adev;
pdata->dev_desc = dev_desc;
if (dev_desc->setup)
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html