| From 39dffa157c4c787e8bf8919cb8bb0b056e21a5dd Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 15 Dec 2022 10:41:38 +0100 |
| Subject: ACPI: video: Fix Apple GMUX backlight detection |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| [ Upstream commit 3cf3b7f012f3ea8bdc56196e367cf07c10424855 ] |
| |
| The apple-gmux driver only binds to old GMUX devices which have an |
| IORESOURCE_IO resource (using inb()/outb()) rather then memory-mapped |
| IO (IORESOURCE_MEM). |
| |
| T2 MacBooks use the new style GMUX devices (with IORESOURCE_MEM access), |
| so these are not supported by the apple-gmux driver. This is not a problem |
| since they have working ACPI video backlight support. |
| |
| But the apple_gmux_present() helper only checks if an ACPI device with |
| the "APP000B" HID is present, causing acpi_video_get_backlight_type() |
| to return acpi_backlight_apple_gmux disabling the acpi_video backlight |
| device. |
| |
| Add a new apple_gmux_backlight_present() helper which checks that |
| the "APP000B" device actually is an old GMUX device with an IORESOURCE_IO |
| resource. |
| |
| This fixes the acpi_video0 backlight no longer registering on T2 MacBooks. |
| |
| Note people are working to add support for the new style GMUX to Linux: |
| https://github.com/kekrby/linux-t2/commits/wip/hybrid-graphics |
| |
| Once this lands this patch should be reverted so that |
| acpi_video_get_backlight_type() also prefers the gmux on new style GMUX |
| MacBooks, but for now this is necessary to avoid regressing backlight |
| control on T2 Macs. |
| |
| Fixes: 21245df307cb ("ACPI: video: Add Apple GMUX brightness control detection") |
| Reported-and-tested-by: Aditya Garg <gargaditya08@live.com> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/acpi/video_detect.c | 23 ++++++++++++++++++++++- |
| 1 file changed, 22 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c |
| index ffa19d418847..13f10fbcd7f0 100644 |
| --- a/drivers/acpi/video_detect.c |
| +++ b/drivers/acpi/video_detect.c |
| @@ -34,6 +34,7 @@ |
| #include <linux/module.h> |
| #include <linux/pci.h> |
| #include <linux/platform_data/x86/nvidia-wmi-ec-backlight.h> |
| +#include <linux/pnp.h> |
| #include <linux/types.h> |
| #include <linux/workqueue.h> |
| #include <acpi/video.h> |
| @@ -105,6 +106,26 @@ static bool nvidia_wmi_ec_supported(void) |
| } |
| #endif |
| |
| +static bool apple_gmux_backlight_present(void) |
| +{ |
| + struct acpi_device *adev; |
| + struct device *dev; |
| + |
| + adev = acpi_dev_get_first_match_dev(GMUX_ACPI_HID, NULL, -1); |
| + if (!adev) |
| + return false; |
| + |
| + dev = acpi_get_first_physical_node(adev); |
| + if (!dev) |
| + return false; |
| + |
| + /* |
| + * drivers/platform/x86/apple-gmux.c only supports old style |
| + * Apple GMUX with an IO-resource. |
| + */ |
| + return pnp_get_resource(to_pnp_dev(dev), IORESOURCE_IO, 0) != NULL; |
| +} |
| + |
| /* Force to use vendor driver when the ACPI device is known to be |
| * buggy */ |
| static int video_detect_force_vendor(const struct dmi_system_id *d) |
| @@ -755,7 +776,7 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native) |
| if (nvidia_wmi_ec_present) |
| return acpi_backlight_nvidia_wmi_ec; |
| |
| - if (apple_gmux_present()) |
| + if (apple_gmux_backlight_present()) |
| return acpi_backlight_apple_gmux; |
| |
| /* Chromebooks should always prefer native backlight control. */ |
| -- |
| 2.35.1 |
| |