Commit b09f6ca9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ACPI fix from Rafael Wysocki:
 "Fix backlight control on a Dell All In One system where a backlight
  controller board is attached to a UART port and the dell-uart
  backlight driver binds to it, but the backlight is actually controlled
  by other means (Hans de Goede)"

* tag 'acpi-6.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: video: Add backlight=native quirk for Dell OptiPlex 7760 AIO
  platform/x86: dell-uart-backlight: Use acpi_video_get_backlight_type()
  ACPI: video: Add Dell UART backlight controller detection
parents 6ae4e48b 5c7bb62c
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ static void acpi_video_parse_cmdline(void)
		acpi_backlight_cmdline = acpi_backlight_nvidia_wmi_ec;
	if (!strcmp("apple_gmux", acpi_video_backlight_string))
		acpi_backlight_cmdline = acpi_backlight_apple_gmux;
	if (!strcmp("dell_uart", acpi_video_backlight_string))
		acpi_backlight_cmdline = acpi_backlight_dell_uart;
	if (!strcmp("none", acpi_video_backlight_string))
		acpi_backlight_cmdline = acpi_backlight_none;
}
@@ -821,6 +823,21 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
		},
	},

	/*
	 * Dell AIO (All in Ones) which advertise an UART attached backlight
	 * controller board in their ACPI tables (and may even have one), but
	 * which need native backlight control nevertheless.
	 */
	{
	 /* https://bugzilla.redhat.com/show_bug.cgi?id=2303936 */
	 .callback = video_detect_force_native,
	 /* Dell OptiPlex 7760 AIO */
	 .matches = {
		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
		DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 7760 AIO"),
		},
	},

	/*
	 * Models which have nvidia-ec-wmi support, but should not use it.
	 * Note this indicates a likely firmware bug on these models and should
@@ -918,6 +935,7 @@ enum acpi_backlight_type __acpi_video_get_backlight_type(bool native, bool *auto
	static DEFINE_MUTEX(init_mutex);
	static bool nvidia_wmi_ec_present;
	static bool apple_gmux_present;
	static bool dell_uart_present;
	static bool native_available;
	static bool init_done;
	static long video_caps;
@@ -932,6 +950,7 @@ enum acpi_backlight_type __acpi_video_get_backlight_type(bool native, bool *auto
				    &video_caps, NULL);
		nvidia_wmi_ec_present = nvidia_wmi_ec_supported();
		apple_gmux_present = apple_gmux_detect(NULL, NULL);
		dell_uart_present = acpi_dev_present("DELL0501", NULL, -1);
		init_done = true;
	}
	if (native)
@@ -962,6 +981,9 @@ enum acpi_backlight_type __acpi_video_get_backlight_type(bool native, bool *auto
	if (apple_gmux_present)
		return acpi_backlight_apple_gmux;

	if (dell_uart_present)
		return acpi_backlight_dell_uart;

	/* Use ACPI video if available, except when native should be preferred. */
	if ((video_caps & ACPI_VIDEO_BACKLIGHT) &&
	     !(native_available && prefer_native_over_acpi_video()))
+1 −0
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@ config DELL_SMO8800
config DELL_UART_BACKLIGHT
	tristate "Dell AIO UART Backlight driver"
	depends on ACPI
	depends on ACPI_VIDEO
	depends on BACKLIGHT_CLASS_DEVICE
	depends on SERIAL_DEV_BUS
	help
+8 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/string.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <acpi/video.h>
#include "../serdev_helpers.h"

/* The backlight controller must respond within 1 second */
@@ -332,10 +333,17 @@ struct serdev_device_driver dell_uart_bl_serdev_driver = {

static int dell_uart_bl_pdev_probe(struct platform_device *pdev)
{
	enum acpi_backlight_type bl_type;
	struct serdev_device *serdev;
	struct device *ctrl_dev;
	int ret;

	bl_type = acpi_video_get_backlight_type();
	if (bl_type != acpi_backlight_dell_uart) {
		dev_dbg(&pdev->dev, "Not loading (ACPI backlight type = %d)\n", bl_type);
		return -ENODEV;
	}

	ctrl_dev = get_serdev_controller("DELL0501", NULL, 0, "serial0");
	if (IS_ERR(ctrl_dev))
		return PTR_ERR(ctrl_dev);
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ enum acpi_backlight_type {
	acpi_backlight_native,
	acpi_backlight_nvidia_wmi_ec,
	acpi_backlight_apple_gmux,
	acpi_backlight_dell_uart,
};

#if IS_ENABLED(CONFIG_ACPI_VIDEO)