1c3d6de69SThomas Renninger /*
287521e16SHans de Goede * Copyright (C) 2015 Red Hat Inc.
387521e16SHans de Goede * Hans de Goede <hdegoede@redhat.com>
4c3d6de69SThomas Renninger * Copyright (C) 2008 SuSE Linux Products GmbH
5c3d6de69SThomas Renninger * Thomas Renninger <trenn@suse.de>
6c3d6de69SThomas Renninger *
7c3d6de69SThomas Renninger * May be copied or modified under the terms of the GNU General Public License
8c3d6de69SThomas Renninger *
9c3d6de69SThomas Renninger * video_detect.c:
10c3d6de69SThomas Renninger * After PCI devices are glued with ACPI devices
111e4cffe7SAlexander Chiang * acpi_get_pci_dev() can be called to identify ACPI graphics
12c3d6de69SThomas Renninger * devices for which a real graphics card is plugged in
13c3d6de69SThomas Renninger *
14c3d6de69SThomas Renninger * Depending on whether ACPI graphics extensions (cmp. ACPI spec Appendix B)
15c3d6de69SThomas Renninger * are available, video.ko should be used to handle the device.
16c3d6de69SThomas Renninger *
177ec48cedSCorentin Chary * Otherwise vendor specific drivers like thinkpad_acpi, asus-laptop,
18677bd810SZhang Rui * sony_acpi,... can take care about backlight brightness.
19c3d6de69SThomas Renninger *
202600bfa3SHans de Goede * Backlight drivers can use acpi_video_get_backlight_type() to determine which
212600bfa3SHans de Goede * driver should handle the backlight. RAW/GPU-driver backlight drivers must
222600bfa3SHans de Goede * use the acpi_video_backlight_use_native() helper for this.
23c3d6de69SThomas Renninger *
2487521e16SHans de Goede * If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
2587521e16SHans de Goede * this file will not be compiled and acpi_video_get_backlight_type() will
2687521e16SHans de Goede * always return acpi_backlight_vendor.
27c3d6de69SThomas Renninger */
28c3d6de69SThomas Renninger
29214f2c90SPaul Gortmaker #include <linux/export.h>
30c3d6de69SThomas Renninger #include <linux/acpi.h>
3121245df3SHans de Goede #include <linux/apple-gmux.h>
3287521e16SHans de Goede #include <linux/backlight.h>
33c3d6de69SThomas Renninger #include <linux/dmi.h>
3414ca7a47SHans de Goede #include <linux/module.h>
351e4cffe7SAlexander Chiang #include <linux/pci.h>
36fe7aebb4SHans de Goede #include <linux/platform_data/x86/nvidia-wmi-ec-backlight.h>
373cf3b7f0SHans de Goede #include <linux/pnp.h>
3887521e16SHans de Goede #include <linux/types.h>
397231ed1aSHans de Goede #include <linux/workqueue.h>
4087521e16SHans de Goede #include <acpi/video.h>
41c3d6de69SThomas Renninger
4287521e16SHans de Goede static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef;
4387521e16SHans de Goede static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef;
44c3d6de69SThomas Renninger
acpi_video_parse_cmdline(void)4514ca7a47SHans de Goede static void acpi_video_parse_cmdline(void)
4614ca7a47SHans de Goede {
4714ca7a47SHans de Goede if (!strcmp("vendor", acpi_video_backlight_string))
4887521e16SHans de Goede acpi_backlight_cmdline = acpi_backlight_vendor;
4914ca7a47SHans de Goede if (!strcmp("video", acpi_video_backlight_string))
5087521e16SHans de Goede acpi_backlight_cmdline = acpi_backlight_video;
5187521e16SHans de Goede if (!strcmp("native", acpi_video_backlight_string))
5287521e16SHans de Goede acpi_backlight_cmdline = acpi_backlight_native;
53420a1116SHans de Goede if (!strcmp("nvidia_wmi_ec", acpi_video_backlight_string))
54420a1116SHans de Goede acpi_backlight_cmdline = acpi_backlight_nvidia_wmi_ec;
55420a1116SHans de Goede if (!strcmp("apple_gmux", acpi_video_backlight_string))
56420a1116SHans de Goede acpi_backlight_cmdline = acpi_backlight_apple_gmux;
5787521e16SHans de Goede if (!strcmp("none", acpi_video_backlight_string))
5887521e16SHans de Goede acpi_backlight_cmdline = acpi_backlight_none;
5914ca7a47SHans de Goede }
6014ca7a47SHans de Goede
61c3d6de69SThomas Renninger static acpi_status
find_video(acpi_handle handle,u32 lvl,void * context,void ** rv)62c3d6de69SThomas Renninger find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
63c3d6de69SThomas Renninger {
6499ece713SRafael J. Wysocki struct acpi_device *acpi_dev = acpi_fetch_acpi_dev(handle);
65c3d6de69SThomas Renninger long *cap = context;
661e4cffe7SAlexander Chiang struct pci_dev *dev;
67c3d6de69SThomas Renninger
684a4f01a6SMathias Krause static const struct acpi_device_id video_ids[] = {
69c3d6de69SThomas Renninger {ACPI_VIDEO_HID, 0},
70c3d6de69SThomas Renninger {"", 0},
71c3d6de69SThomas Renninger };
72c3d6de69SThomas Renninger
7399ece713SRafael J. Wysocki if (acpi_dev && !acpi_match_device_ids(acpi_dev, video_ids)) {
741e4cffe7SAlexander Chiang dev = acpi_get_pci_dev(handle);
75c3d6de69SThomas Renninger if (!dev)
76c3d6de69SThomas Renninger return AE_OK;
771e4cffe7SAlexander Chiang pci_dev_put(dev);
78d4e1a692SToshi Kani *cap |= acpi_is_video_device(handle);
79c3d6de69SThomas Renninger }
80c3d6de69SThomas Renninger return AE_OK;
81c3d6de69SThomas Renninger }
82c3d6de69SThomas Renninger
83fe7aebb4SHans de Goede /* This depends on ACPI_WMI which is X86 only */
84fe7aebb4SHans de Goede #ifdef CONFIG_X86
nvidia_wmi_ec_supported(void)85fe7aebb4SHans de Goede static bool nvidia_wmi_ec_supported(void)
86fe7aebb4SHans de Goede {
87fe7aebb4SHans de Goede struct wmi_brightness_args args = {
88fe7aebb4SHans de Goede .mode = WMI_BRIGHTNESS_MODE_GET,
89fe7aebb4SHans de Goede .val = 0,
90fe7aebb4SHans de Goede .ret = 0,
91fe7aebb4SHans de Goede };
92fe7aebb4SHans de Goede struct acpi_buffer buf = { (acpi_size)sizeof(args), &args };
93fe7aebb4SHans de Goede acpi_status status;
94fe7aebb4SHans de Goede
95fe7aebb4SHans de Goede status = wmi_evaluate_method(WMI_BRIGHTNESS_GUID, 0,
96fe7aebb4SHans de Goede WMI_BRIGHTNESS_METHOD_SOURCE, &buf, &buf);
97fe7aebb4SHans de Goede if (ACPI_FAILURE(status))
98fe7aebb4SHans de Goede return false;
99fe7aebb4SHans de Goede
100fe7aebb4SHans de Goede /*
101fe7aebb4SHans de Goede * If brightness is handled by the EC then nvidia-wmi-ec-backlight
102fe7aebb4SHans de Goede * should be used, else the GPU driver(s) should be used.
103fe7aebb4SHans de Goede */
104fe7aebb4SHans de Goede return args.ret == WMI_BRIGHTNESS_SOURCE_EC;
105fe7aebb4SHans de Goede }
106fe7aebb4SHans de Goede #else
nvidia_wmi_ec_supported(void)107fe7aebb4SHans de Goede static bool nvidia_wmi_ec_supported(void)
108fe7aebb4SHans de Goede {
109fe7aebb4SHans de Goede return false;
110fe7aebb4SHans de Goede }
111fe7aebb4SHans de Goede #endif
112fe7aebb4SHans de Goede
113084940d5SCorentin Chary /* Force to use vendor driver when the ACPI device is known to be
114084940d5SCorentin Chary * buggy */
video_detect_force_vendor(const struct dmi_system_id * d)115084940d5SCorentin Chary static int video_detect_force_vendor(const struct dmi_system_id *d)
116084940d5SCorentin Chary {
11787521e16SHans de Goede acpi_backlight_dmi = acpi_backlight_vendor;
118084940d5SCorentin Chary return 0;
119084940d5SCorentin Chary }
120084940d5SCorentin Chary
video_detect_force_video(const struct dmi_system_id * d)1213bd6bce3SHans de Goede static int video_detect_force_video(const struct dmi_system_id *d)
1223bd6bce3SHans de Goede {
1233bd6bce3SHans de Goede acpi_backlight_dmi = acpi_backlight_video;
1243bd6bce3SHans de Goede return 0;
1253bd6bce3SHans de Goede }
1263bd6bce3SHans de Goede
video_detect_force_native(const struct dmi_system_id * d)1273bd6bce3SHans de Goede static int video_detect_force_native(const struct dmi_system_id *d)
1283bd6bce3SHans de Goede {
1293bd6bce3SHans de Goede acpi_backlight_dmi = acpi_backlight_native;
1303bd6bce3SHans de Goede return 0;
1313bd6bce3SHans de Goede }
1323bd6bce3SHans de Goede
video_detect_portege_r100(const struct dmi_system_id * d)133c7482722SOndrej Zary static int video_detect_portege_r100(const struct dmi_system_id *d)
134c7482722SOndrej Zary {
135c7482722SOndrej Zary struct pci_dev *dev;
136c7482722SOndrej Zary /* Search for Trident CyberBlade XP4m32 to confirm Portégé R100 */
137c7482722SOndrej Zary dev = pci_get_device(PCI_VENDOR_ID_TRIDENT, 0x2100, NULL);
138c7482722SOndrej Zary if (dev)
139c7482722SOndrej Zary acpi_backlight_dmi = acpi_backlight_vendor;
140c7482722SOndrej Zary return 0;
141c7482722SOndrej Zary }
142c7482722SOndrej Zary
1434a4f01a6SMathias Krause static const struct dmi_system_id video_detect_dmi_table[] = {
14484d56f32SHans de Goede /*
14584d56f32SHans de Goede * Models which should use the vendor backlight interface,
14684d56f32SHans de Goede * because of broken ACPI video backlight control.
14784d56f32SHans de Goede */
148d0c2ce16SLan Tianyu {
1490172df18SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1128309 */
1500172df18SHans de Goede .callback = video_detect_force_vendor,
1510172df18SHans de Goede /* Acer KAV80 */
1520172df18SHans de Goede .matches = {
1530172df18SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1540172df18SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "KAV80"),
1550172df18SHans de Goede },
1560172df18SHans de Goede },
1570172df18SHans de Goede {
158d0c2ce16SLan Tianyu .callback = video_detect_force_vendor,
1593b6740bdSHans de Goede /* Asus UL30VT */
160d0c2ce16SLan Tianyu .matches = {
161d0c2ce16SLan Tianyu DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
162d0c2ce16SLan Tianyu DMI_MATCH(DMI_PRODUCT_NAME, "UL30VT"),
163d0c2ce16SLan Tianyu },
164d0c2ce16SLan Tianyu },
165c8f6d835SBastian Triller {
166c8f6d835SBastian Triller .callback = video_detect_force_vendor,
1673b6740bdSHans de Goede /* Asus UL30A */
168c8f6d835SBastian Triller .matches = {
169c8f6d835SBastian Triller DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
170c8f6d835SBastian Triller DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"),
171c8f6d835SBastian Triller },
172c8f6d835SBastian Triller },
173aefa763bSZhang Rui {
174aefa763bSZhang Rui .callback = video_detect_force_vendor,
17552796b30SHans de Goede /* Asus X55U */
17652796b30SHans de Goede .matches = {
17752796b30SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
17852796b30SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "X55U"),
17952796b30SHans de Goede },
18052796b30SHans de Goede },
18152796b30SHans de Goede {
18260f1fac2SHans de Goede /* https://bugs.launchpad.net/bugs/1000146 */
18352796b30SHans de Goede .callback = video_detect_force_vendor,
18452796b30SHans de Goede /* Asus X101CH */
18552796b30SHans de Goede .matches = {
18652796b30SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
18752796b30SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "X101CH"),
18852796b30SHans de Goede },
18952796b30SHans de Goede },
19052796b30SHans de Goede {
19152796b30SHans de Goede .callback = video_detect_force_vendor,
19252796b30SHans de Goede /* Asus X401U */
19352796b30SHans de Goede .matches = {
19452796b30SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
19552796b30SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "X401U"),
19652796b30SHans de Goede },
19752796b30SHans de Goede },
19852796b30SHans de Goede {
19952796b30SHans de Goede .callback = video_detect_force_vendor,
20052796b30SHans de Goede /* Asus X501U */
20152796b30SHans de Goede .matches = {
20252796b30SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
20352796b30SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "X501U"),
20452796b30SHans de Goede },
20552796b30SHans de Goede },
20652796b30SHans de Goede {
20760f1fac2SHans de Goede /* https://bugs.launchpad.net/bugs/1000146 */
20852796b30SHans de Goede .callback = video_detect_force_vendor,
20952796b30SHans de Goede /* Asus 1015CX */
21052796b30SHans de Goede .matches = {
21152796b30SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
21252796b30SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "1015CX"),
21352796b30SHans de Goede },
21452796b30SHans de Goede },
21552796b30SHans de Goede {
21652796b30SHans de Goede .callback = video_detect_force_vendor,
2178991d7d9SHans de Goede /* Samsung N150/N210/N220 */
2188991d7d9SHans de Goede .matches = {
2198991d7d9SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
2208991d7d9SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "N150/N210/N220"),
2218991d7d9SHans de Goede DMI_MATCH(DMI_BOARD_NAME, "N150/N210/N220"),
2228991d7d9SHans de Goede },
2238991d7d9SHans de Goede },
2248991d7d9SHans de Goede {
2258991d7d9SHans de Goede .callback = video_detect_force_vendor,
2268991d7d9SHans de Goede /* Samsung NF110/NF210/NF310 */
2278991d7d9SHans de Goede .matches = {
2288991d7d9SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
2298991d7d9SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "NF110/NF210/NF310"),
2308991d7d9SHans de Goede DMI_MATCH(DMI_BOARD_NAME, "NF110/NF210/NF310"),
2318991d7d9SHans de Goede },
2328991d7d9SHans de Goede },
2338991d7d9SHans de Goede {
2348991d7d9SHans de Goede .callback = video_detect_force_vendor,
2358991d7d9SHans de Goede /* Samsung NC210 */
2368991d7d9SHans de Goede .matches = {
2378991d7d9SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
2388991d7d9SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "NC210/NC110"),
2398991d7d9SHans de Goede DMI_MATCH(DMI_BOARD_NAME, "NC210/NC110"),
2408991d7d9SHans de Goede },
2418991d7d9SHans de Goede },
2428991d7d9SHans de Goede {
24360e6655fSHans de Goede .callback = video_detect_force_vendor,
24460e6655fSHans de Goede /* Xiaomi Mi Pad 2 */
24560e6655fSHans de Goede .matches = {
24660e6655fSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Xiaomi Inc"),
24760e6655fSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Mipad2"),
24860e6655fSHans de Goede },
24960e6655fSHans de Goede },
2503bd6bce3SHans de Goede
2513bd6bce3SHans de Goede /*
25223735543SHans de Goede * Models which should use the vendor backlight interface,
25323735543SHans de Goede * because of broken native backlight control.
25423735543SHans de Goede */
25523735543SHans de Goede {
25623735543SHans de Goede .callback = video_detect_force_vendor,
25723735543SHans de Goede /* Sony Vaio PCG-FRV35 */
25823735543SHans de Goede .matches = {
25923735543SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
26023735543SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "PCG-FRV35"),
26123735543SHans de Goede },
26223735543SHans de Goede },
263*716dae96SHans de Goede {
264*716dae96SHans de Goede .callback = video_detect_force_vendor,
265*716dae96SHans de Goede /* Panasonic Toughbook CF-18 */
266*716dae96SHans de Goede .matches = {
267*716dae96SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Matsushita Electric Industrial"),
268*716dae96SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"),
269*716dae96SHans de Goede },
270*716dae96SHans de Goede },
27123735543SHans de Goede
27223735543SHans de Goede /*
273a2ed70d0SHans de Goede * Toshiba models with Transflective display, these need to use
274a2ed70d0SHans de Goede * the toshiba_acpi vendor driver for proper Transflective handling.
275a2ed70d0SHans de Goede */
276a2ed70d0SHans de Goede {
277a2ed70d0SHans de Goede .callback = video_detect_force_vendor,
278a2ed70d0SHans de Goede .matches = {
279a2ed70d0SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
280a2ed70d0SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R500"),
281a2ed70d0SHans de Goede },
282a2ed70d0SHans de Goede },
283a2ed70d0SHans de Goede {
284a2ed70d0SHans de Goede .callback = video_detect_force_vendor,
285a2ed70d0SHans de Goede .matches = {
286a2ed70d0SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
287a2ed70d0SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R600"),
288a2ed70d0SHans de Goede },
289a2ed70d0SHans de Goede },
290a2ed70d0SHans de Goede
291a2ed70d0SHans de Goede /*
292c7482722SOndrej Zary * Toshiba Portégé R100 has working both acpi_video and toshiba_acpi
293c7482722SOndrej Zary * vendor driver. But none of them gets activated as it has a VGA with
294c7482722SOndrej Zary * no kernel driver (Trident CyberBlade XP4m32).
295c7482722SOndrej Zary * The DMI strings are generic so check for the VGA chip in callback.
296c7482722SOndrej Zary */
297c7482722SOndrej Zary {
298c7482722SOndrej Zary .callback = video_detect_portege_r100,
299c7482722SOndrej Zary .matches = {
300c7482722SOndrej Zary DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
301c7482722SOndrej Zary DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"),
302c7482722SOndrej Zary DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"),
303c7482722SOndrej Zary DMI_MATCH(DMI_BOARD_NAME, "Portable PC")
304c7482722SOndrej Zary },
305c7482722SOndrej Zary },
306c7482722SOndrej Zary
307c7482722SOndrej Zary /*
30826991079SHans de Goede * Models which need acpi_video backlight control where the GPU drivers
30926991079SHans de Goede * do not call acpi_video_register_backlight() because no internal panel
31026991079SHans de Goede * is detected. Typically these are all-in-ones (monitors with builtin
31126991079SHans de Goede * PC) where the panel connection shows up as regular DP instead of eDP.
31226991079SHans de Goede */
31326991079SHans de Goede {
31426991079SHans de Goede .callback = video_detect_force_video,
31526991079SHans de Goede /* Apple iMac14,1 */
31626991079SHans de Goede .matches = {
31726991079SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
31826991079SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "iMac14,1"),
31926991079SHans de Goede },
32026991079SHans de Goede },
32126991079SHans de Goede {
32226991079SHans de Goede .callback = video_detect_force_video,
32326991079SHans de Goede /* Apple iMac14,2 */
32426991079SHans de Goede .matches = {
32526991079SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
32626991079SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "iMac14,2"),
32726991079SHans de Goede },
32826991079SHans de Goede },
32926991079SHans de Goede
33026991079SHans de Goede /*
3313bd6bce3SHans de Goede * These models have a working acpi_video backlight control, and using
3323bd6bce3SHans de Goede * native backlight causes a regression where backlight does not work
3333bd6bce3SHans de Goede * when userspace is not handling brightness key events. Disable
3343bd6bce3SHans de Goede * native_backlight on these to fix this:
3353bd6bce3SHans de Goede * https://bugzilla.kernel.org/show_bug.cgi?id=81691
3363bd6bce3SHans de Goede */
3373bd6bce3SHans de Goede {
3383bd6bce3SHans de Goede .callback = video_detect_force_video,
3393b6740bdSHans de Goede /* ThinkPad T420 */
3403bd6bce3SHans de Goede .matches = {
3413bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
3423bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
3433bd6bce3SHans de Goede },
3443bd6bce3SHans de Goede },
3453bd6bce3SHans de Goede {
3463bd6bce3SHans de Goede .callback = video_detect_force_video,
3473b6740bdSHans de Goede /* ThinkPad T520 */
3483bd6bce3SHans de Goede .matches = {
3493bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
3503bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
3513bd6bce3SHans de Goede },
3523bd6bce3SHans de Goede },
3533bd6bce3SHans de Goede {
3543bd6bce3SHans de Goede .callback = video_detect_force_video,
3553b6740bdSHans de Goede /* ThinkPad X201s */
3563bd6bce3SHans de Goede .matches = {
3573bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
3583bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
3593bd6bce3SHans de Goede },
3603bd6bce3SHans de Goede },
361007d94caSRalf Gerbig {
362007d94caSRalf Gerbig .callback = video_detect_force_video,
3633b6740bdSHans de Goede /* ThinkPad X201T */
364007d94caSRalf Gerbig .matches = {
365007d94caSRalf Gerbig DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
366007d94caSRalf Gerbig DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201T"),
367007d94caSRalf Gerbig },
368007d94caSRalf Gerbig },
3693bd6bce3SHans de Goede
3703bd6bce3SHans de Goede /* The native backlight controls do not work on some older machines */
3713bd6bce3SHans de Goede {
3723bd6bce3SHans de Goede /* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
3733bd6bce3SHans de Goede .callback = video_detect_force_video,
3743b6740bdSHans de Goede /* HP ENVY 15 Notebook */
3753bd6bce3SHans de Goede .matches = {
3763bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
3773bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
3783bd6bce3SHans de Goede },
3793bd6bce3SHans de Goede },
3803bd6bce3SHans de Goede {
3813bd6bce3SHans de Goede .callback = video_detect_force_video,
3823b6740bdSHans de Goede /* SAMSUNG 870Z5E/880Z5E/680Z5E */
3833bd6bce3SHans de Goede .matches = {
3843bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
3853bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"),
3863bd6bce3SHans de Goede },
3873bd6bce3SHans de Goede },
3883bd6bce3SHans de Goede {
3893bd6bce3SHans de Goede .callback = video_detect_force_video,
3903b6740bdSHans de Goede /* SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V */
3913bd6bce3SHans de Goede .matches = {
3923bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
3933bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME,
3943bd6bce3SHans de Goede "370R4E/370R4V/370R5E/3570RE/370R5V"),
3953bd6bce3SHans de Goede },
3963bd6bce3SHans de Goede },
3973bd6bce3SHans de Goede {
3983bd6bce3SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */
3993bd6bce3SHans de Goede .callback = video_detect_force_video,
4003b6740bdSHans de Goede /* SAMSUNG 3570R/370R/470R/450R/510R/4450RV */
4013bd6bce3SHans de Goede .matches = {
4023bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
4033bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME,
4043bd6bce3SHans de Goede "3570R/370R/470R/450R/510R/4450RV"),
4053bd6bce3SHans de Goede },
4063bd6bce3SHans de Goede },
4073bd6bce3SHans de Goede {
408bbf03861SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1557060 */
409bbf03861SHans de Goede .callback = video_detect_force_video,
4103b6740bdSHans de Goede /* SAMSUNG 670Z5E */
411bbf03861SHans de Goede .matches = {
412bbf03861SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
413bbf03861SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "670Z5E"),
414bbf03861SHans de Goede },
415bbf03861SHans de Goede },
416bbf03861SHans de Goede {
4173bd6bce3SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */
4183bd6bce3SHans de Goede .callback = video_detect_force_video,
4193b6740bdSHans de Goede /* SAMSUNG 730U3E/740U3E */
4203bd6bce3SHans de Goede .matches = {
4213bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
4223bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"),
4233bd6bce3SHans de Goede },
4243bd6bce3SHans de Goede },
4253bd6bce3SHans de Goede {
4263bd6bce3SHans de Goede /* https://bugs.freedesktop.org/show_bug.cgi?id=87286 */
4273bd6bce3SHans de Goede .callback = video_detect_force_video,
4283b6740bdSHans de Goede /* SAMSUNG 900X3C/900X3D/900X3E/900X4C/900X4D */
4293bd6bce3SHans de Goede .matches = {
4303bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
4313bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME,
4323bd6bce3SHans de Goede "900X3C/900X3D/900X3E/900X4C/900X4D"),
4333bd6bce3SHans de Goede },
4343bd6bce3SHans de Goede },
4353bd6bce3SHans de Goede {
43661f9738dSHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1272633 */
43761f9738dSHans de Goede .callback = video_detect_force_video,
4383b6740bdSHans de Goede /* Dell XPS14 L421X */
43961f9738dSHans de Goede .matches = {
44061f9738dSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
44161f9738dSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"),
44261f9738dSHans de Goede },
44361f9738dSHans de Goede },
44461f9738dSHans de Goede {
4453bd6bce3SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
4463bd6bce3SHans de Goede .callback = video_detect_force_video,
4473b6740bdSHans de Goede /* Dell XPS15 L521X */
4483bd6bce3SHans de Goede .matches = {
4493bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
4503bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
4513bd6bce3SHans de Goede },
4523bd6bce3SHans de Goede },
45349eb5208SAaron Lu {
45449eb5208SAaron Lu /* https://bugzilla.kernel.org/show_bug.cgi?id=108971 */
45549eb5208SAaron Lu .callback = video_detect_force_video,
4563b6740bdSHans de Goede /* SAMSUNG 530U4E/540U4E */
45749eb5208SAaron Lu .matches = {
45849eb5208SAaron Lu DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
45949eb5208SAaron Lu DMI_MATCH(DMI_PRODUCT_NAME, "530U4E/540U4E"),
46049eb5208SAaron Lu },
46149eb5208SAaron Lu },
462b226faabSAlex Hung {
46360f1fac2SHans de Goede /* https://bugs.launchpad.net/bugs/1894667 */
464b226faabSAlex Hung .callback = video_detect_force_video,
4653b6740bdSHans de Goede /* HP 635 Notebook */
466b226faabSAlex Hung .matches = {
467b226faabSAlex Hung DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
468b226faabSAlex Hung DMI_MATCH(DMI_PRODUCT_NAME, "HP 635 Notebook PC"),
469b226faabSAlex Hung },
470b226faabSAlex Hung },
4713bd6bce3SHans de Goede
4723bd6bce3SHans de Goede /* Non win8 machines which need native backlight nevertheless */
4733bd6bce3SHans de Goede {
474584d8d1eSHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1201530 */
475584d8d1eSHans de Goede .callback = video_detect_force_native,
4763b6740bdSHans de Goede /* Lenovo Ideapad S405 */
477584d8d1eSHans de Goede .matches = {
478584d8d1eSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
479584d8d1eSHans de Goede DMI_MATCH(DMI_BOARD_NAME, "Lenovo IdeaPad S405"),
480584d8d1eSHans de Goede },
481584d8d1eSHans de Goede },
482584d8d1eSHans de Goede {
48396b709beSJiri Slaby (SUSE) /* https://bugzilla.suse.com/show_bug.cgi?id=1208724 */
48496b709beSJiri Slaby (SUSE) .callback = video_detect_force_native,
48596b709beSJiri Slaby (SUSE) /* Lenovo Ideapad Z470 */
48696b709beSJiri Slaby (SUSE) .matches = {
48796b709beSJiri Slaby (SUSE) DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
48896b709beSJiri Slaby (SUSE) DMI_MATCH(DMI_PRODUCT_VERSION, "IdeaPad Z470"),
48996b709beSJiri Slaby (SUSE) },
49096b709beSJiri Slaby (SUSE) },
49196b709beSJiri Slaby (SUSE) {
4923bd6bce3SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
4933bd6bce3SHans de Goede .callback = video_detect_force_native,
4943b6740bdSHans de Goede /* Lenovo Ideapad Z570 */
4953bd6bce3SHans de Goede .matches = {
4963bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4972d11eae4SHans de Goede DMI_MATCH(DMI_PRODUCT_VERSION, "Ideapad Z570"),
4983bd6bce3SHans de Goede },
4993bd6bce3SHans de Goede },
5003bd6bce3SHans de Goede {
50153870cf0SAaron Ma .callback = video_detect_force_native,
5023b6740bdSHans de Goede /* Lenovo E41-25 */
50353870cf0SAaron Ma .matches = {
50453870cf0SAaron Ma DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
50553870cf0SAaron Ma DMI_MATCH(DMI_PRODUCT_NAME, "81FS"),
50653870cf0SAaron Ma },
50753870cf0SAaron Ma },
50853870cf0SAaron Ma {
50953870cf0SAaron Ma .callback = video_detect_force_native,
5103b6740bdSHans de Goede /* Lenovo E41-45 */
51153870cf0SAaron Ma .matches = {
51253870cf0SAaron Ma DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
51353870cf0SAaron Ma DMI_MATCH(DMI_PRODUCT_NAME, "82BK"),
51453870cf0SAaron Ma },
51553870cf0SAaron Ma },
51653870cf0SAaron Ma {
51748436f2eSHans de Goede .callback = video_detect_force_native,
518810e6a1dSTakashi Iwai /* Lenovo Slim 7 16ARH7 */
519810e6a1dSTakashi Iwai .matches = {
520810e6a1dSTakashi Iwai DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
521810e6a1dSTakashi Iwai DMI_MATCH(DMI_PRODUCT_NAME, "82UX"),
522810e6a1dSTakashi Iwai },
523810e6a1dSTakashi Iwai },
524810e6a1dSTakashi Iwai {
525810e6a1dSTakashi Iwai .callback = video_detect_force_native,
526bd5d93dfSHans de Goede /* Lenovo ThinkPad X131e (3371 AMD version) */
527bd5d93dfSHans de Goede .matches = {
528bd5d93dfSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
529bd5d93dfSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "3371"),
530bd5d93dfSHans de Goede },
531bd5d93dfSHans de Goede },
532bd5d93dfSHans de Goede {
533bd5d93dfSHans de Goede .callback = video_detect_force_native,
53448436f2eSHans de Goede /* Apple iMac11,3 */
53548436f2eSHans de Goede .matches = {
53648436f2eSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
53748436f2eSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "iMac11,3"),
53848436f2eSHans de Goede },
53948436f2eSHans de Goede },
54048436f2eSHans de Goede {
5418cf04bb3SHans de Goede /* https://gitlab.freedesktop.org/drm/amd/-/issues/1838 */
5428cf04bb3SHans de Goede .callback = video_detect_force_native,
5438cf04bb3SHans de Goede /* Apple iMac12,1 */
5448cf04bb3SHans de Goede .matches = {
5458cf04bb3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
5468cf04bb3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "iMac12,1"),
5478cf04bb3SHans de Goede },
5488cf04bb3SHans de Goede },
5498cf04bb3SHans de Goede {
5508cf04bb3SHans de Goede /* https://gitlab.freedesktop.org/drm/amd/-/issues/2753 */
5518cf04bb3SHans de Goede .callback = video_detect_force_native,
5528cf04bb3SHans de Goede /* Apple iMac12,2 */
5538cf04bb3SHans de Goede .matches = {
5548cf04bb3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
5558cf04bb3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "iMac12,2"),
5568cf04bb3SHans de Goede },
5578cf04bb3SHans de Goede },
5588cf04bb3SHans de Goede {
5593bd6bce3SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
5603bd6bce3SHans de Goede .callback = video_detect_force_native,
5613b6740bdSHans de Goede /* Apple MacBook Pro 12,1 */
5623bd6bce3SHans de Goede .matches = {
5633bd6bce3SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
5643bd6bce3SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
5653bd6bce3SHans de Goede },
5663bd6bce3SHans de Goede },
5674b4b3b20SHans de Goede {
5684b4b3b20SHans de Goede .callback = video_detect_force_native,
56903c440a2SHans de Goede /* Dell Inspiron N4010 */
57003c440a2SHans de Goede .matches = {
57103c440a2SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
57203c440a2SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron N4010"),
57303c440a2SHans de Goede },
57403c440a2SHans de Goede },
57503c440a2SHans de Goede {
57603c440a2SHans de Goede .callback = video_detect_force_native,
5773b6740bdSHans de Goede /* Dell Vostro V131 */
5784b4b3b20SHans de Goede .matches = {
5794b4b3b20SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
5804b4b3b20SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
5814b4b3b20SHans de Goede },
5824b4b3b20SHans de Goede },
583350fa038SHans de Goede {
584350fa038SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1123661 */
585350fa038SHans de Goede .callback = video_detect_force_native,
5863b6740bdSHans de Goede /* Dell XPS 17 L702X */
587350fa038SHans de Goede .matches = {
588350fa038SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
589350fa038SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Dell System XPS L702X"),
590350fa038SHans de Goede },
591350fa038SHans de Goede },
592d37efb79SShih-Yuan Lee (FourDollars) {
593d37efb79SShih-Yuan Lee (FourDollars) .callback = video_detect_force_native,
5943b6740bdSHans de Goede /* Dell Precision 7510 */
595d37efb79SShih-Yuan Lee (FourDollars) .matches = {
596d37efb79SShih-Yuan Lee (FourDollars) DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
597d37efb79SShih-Yuan Lee (FourDollars) DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"),
598d37efb79SShih-Yuan Lee (FourDollars) },
599d37efb79SShih-Yuan Lee (FourDollars) },
6001c8fbc1fSHans de Goede {
6011c8fbc1fSHans de Goede .callback = video_detect_force_native,
60223d28cc0SHans de Goede /* Dell Studio 1569 */
60323d28cc0SHans de Goede .matches = {
60423d28cc0SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
60523d28cc0SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1569"),
60623d28cc0SHans de Goede },
60723d28cc0SHans de Goede },
60823d28cc0SHans de Goede {
60923d28cc0SHans de Goede .callback = video_detect_force_native,
6105e7a3bf6SHans de Goede /* Acer Aspire 3830TG */
6115e7a3bf6SHans de Goede .matches = {
6125e7a3bf6SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
6135e7a3bf6SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3830TG"),
6145e7a3bf6SHans de Goede },
6155e7a3bf6SHans de Goede },
6165e7a3bf6SHans de Goede {
6175e7a3bf6SHans de Goede .callback = video_detect_force_native,
6188ba5fc4cSHans de Goede /* Acer Aspire 4810T */
6198ba5fc4cSHans de Goede .matches = {
6208ba5fc4cSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
6218ba5fc4cSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 4810T"),
6228ba5fc4cSHans de Goede },
6238ba5fc4cSHans de Goede },
6248ba5fc4cSHans de Goede {
6258ba5fc4cSHans de Goede .callback = video_detect_force_native,
6263b6740bdSHans de Goede /* Acer Aspire 5738z */
6271c8fbc1fSHans de Goede .matches = {
6281c8fbc1fSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
6291c8fbc1fSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
6301c8fbc1fSHans de Goede DMI_MATCH(DMI_BOARD_NAME, "JV50"),
6311c8fbc1fSHans de Goede },
6321c8fbc1fSHans de Goede },
633c41c36e9SPaul Menzel {
6340172df18SHans de Goede /* https://bugzilla.redhat.com/show_bug.cgi?id=1012674 */
6350172df18SHans de Goede .callback = video_detect_force_native,
6360172df18SHans de Goede /* Acer Aspire 5741 */
6370172df18SHans de Goede .matches = {
6380172df18SHans de Goede DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
6390172df18SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"),
6400172df18SHans de Goede },
6410172df18SHans de Goede },
6420172df18SHans de Goede {
6430172df18SHans de Goede /* https://bugzilla.kernel.org/show_bug.cgi?id=42993 */
6440172df18SHans de Goede .callback = video_detect_force_native,
6450172df18SHans de Goede /* Acer Aspire 5750 */
6460172df18SHans de Goede .matches = {
6470172df18SHans de Goede DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
6480172df18SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5750"),
6490172df18SHans de Goede },
6500172df18SHans de Goede },
6510172df18SHans de Goede {
6520172df18SHans de Goede /* https://bugzilla.kernel.org/show_bug.cgi?id=42833 */
6530172df18SHans de Goede .callback = video_detect_force_native,
6540172df18SHans de Goede /* Acer Extensa 5235 */
6550172df18SHans de Goede .matches = {
6560172df18SHans de Goede DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
6570172df18SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5235"),
6580172df18SHans de Goede },
6590172df18SHans de Goede },
6600172df18SHans de Goede {
6610172df18SHans de Goede .callback = video_detect_force_native,
6620172df18SHans de Goede /* Acer TravelMate 4750 */
6630172df18SHans de Goede .matches = {
6640172df18SHans de Goede DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
6650172df18SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4750"),
6660172df18SHans de Goede },
6670172df18SHans de Goede },
6680172df18SHans de Goede {
669c41c36e9SPaul Menzel /* https://bugzilla.kernel.org/show_bug.cgi?id=207835 */
670c41c36e9SPaul Menzel .callback = video_detect_force_native,
6713b6740bdSHans de Goede /* Acer TravelMate 5735Z */
672c41c36e9SPaul Menzel .matches = {
673c41c36e9SPaul Menzel DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
674c41c36e9SPaul Menzel DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5735Z"),
675c41c36e9SPaul Menzel DMI_MATCH(DMI_BOARD_NAME, "BA51_MV"),
676c41c36e9SPaul Menzel },
677c41c36e9SPaul Menzel },
6782dfbacc6SLuke D Jones {
6790172df18SHans de Goede /* https://bugzilla.kernel.org/show_bug.cgi?id=36322 */
6800172df18SHans de Goede .callback = video_detect_force_native,
6810172df18SHans de Goede /* Acer TravelMate 5760 */
6820172df18SHans de Goede .matches = {
6830172df18SHans de Goede DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
6840172df18SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5760"),
6850172df18SHans de Goede },
6860172df18SHans de Goede },
6870172df18SHans de Goede {
6882dfbacc6SLuke D Jones .callback = video_detect_force_native,
6893b6740bdSHans de Goede /* ASUSTeK COMPUTER INC. GA401 */
6902dfbacc6SLuke D Jones .matches = {
6912dfbacc6SLuke D Jones DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
6922dfbacc6SLuke D Jones DMI_MATCH(DMI_PRODUCT_NAME, "GA401"),
6932dfbacc6SLuke D Jones },
6942dfbacc6SLuke D Jones },
6952dfbacc6SLuke D Jones {
6962dfbacc6SLuke D Jones .callback = video_detect_force_native,
6973b6740bdSHans de Goede /* ASUSTeK COMPUTER INC. GA502 */
6982dfbacc6SLuke D Jones .matches = {
6992dfbacc6SLuke D Jones DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
7002dfbacc6SLuke D Jones DMI_MATCH(DMI_PRODUCT_NAME, "GA502"),
7012dfbacc6SLuke D Jones },
7022dfbacc6SLuke D Jones },
7032dfbacc6SLuke D Jones {
7042dfbacc6SLuke D Jones .callback = video_detect_force_native,
7053b6740bdSHans de Goede /* ASUSTeK COMPUTER INC. GA503 */
7062dfbacc6SLuke D Jones .matches = {
7072dfbacc6SLuke D Jones DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
7082dfbacc6SLuke D Jones DMI_MATCH(DMI_PRODUCT_NAME, "GA503"),
7092dfbacc6SLuke D Jones },
7102dfbacc6SLuke D Jones },
7111e3344d6SHans de Goede {
7121e3344d6SHans de Goede .callback = video_detect_force_native,
713e6b3086fSHans de Goede /* Asus U46E */
714e6b3086fSHans de Goede .matches = {
715e6b3086fSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
716e6b3086fSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "U46E"),
717e6b3086fSHans de Goede },
718e6b3086fSHans de Goede },
719e6b3086fSHans de Goede {
720e6b3086fSHans de Goede .callback = video_detect_force_native,
7211e3344d6SHans de Goede /* Asus UX303UB */
7221e3344d6SHans de Goede .matches = {
7231e3344d6SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
7241e3344d6SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "UX303UB"),
7251e3344d6SHans de Goede },
7261e3344d6SHans de Goede },
7278991d7d9SHans de Goede {
7288991d7d9SHans de Goede .callback = video_detect_force_native,
7299dcb3423SHans de Goede /* HP EliteBook 8460p */
7309dcb3423SHans de Goede .matches = {
7319dcb3423SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
7329dcb3423SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8460p"),
7339dcb3423SHans de Goede },
7349dcb3423SHans de Goede },
7359dcb3423SHans de Goede {
7369dcb3423SHans de Goede .callback = video_detect_force_native,
737d77596d4SHans de Goede /* HP Pavilion g6-1d80nr / B4U19UA */
738d77596d4SHans de Goede .matches = {
739d77596d4SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
740d77596d4SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"),
741d77596d4SHans de Goede DMI_MATCH(DMI_PRODUCT_SKU, "B4U19UA"),
742d77596d4SHans de Goede },
743d77596d4SHans de Goede },
744d77596d4SHans de Goede {
745d77596d4SHans de Goede .callback = video_detect_force_native,
7468991d7d9SHans de Goede /* Samsung N150P */
7478991d7d9SHans de Goede .matches = {
7488991d7d9SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
7498991d7d9SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "N150P"),
7508991d7d9SHans de Goede DMI_MATCH(DMI_BOARD_NAME, "N150P"),
7518991d7d9SHans de Goede },
7528991d7d9SHans de Goede },
7538991d7d9SHans de Goede {
7548991d7d9SHans de Goede .callback = video_detect_force_native,
7558991d7d9SHans de Goede /* Samsung N145P/N250P/N260P */
7568991d7d9SHans de Goede .matches = {
7578991d7d9SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
7588991d7d9SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "N145P/N250P/N260P"),
7598991d7d9SHans de Goede DMI_MATCH(DMI_BOARD_NAME, "N145P/N250P/N260P"),
7608991d7d9SHans de Goede },
7618991d7d9SHans de Goede },
7628991d7d9SHans de Goede {
7638991d7d9SHans de Goede .callback = video_detect_force_native,
7648991d7d9SHans de Goede /* Samsung N250P */
7658991d7d9SHans de Goede .matches = {
7668991d7d9SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
7678991d7d9SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "N250P"),
7688991d7d9SHans de Goede DMI_MATCH(DMI_BOARD_NAME, "N250P"),
7698991d7d9SHans de Goede },
7708991d7d9SHans de Goede },
77184d56f32SHans de Goede {
77284d56f32SHans de Goede /* https://bugzilla.kernel.org/show_bug.cgi?id=202401 */
77384d56f32SHans de Goede .callback = video_detect_force_native,
77484d56f32SHans de Goede /* Sony Vaio VPCEH3U1E */
77584d56f32SHans de Goede .matches = {
77684d56f32SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
77784d56f32SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "VPCEH3U1E"),
77884d56f32SHans de Goede },
77984d56f32SHans de Goede },
780f5a6ff92SHans de Goede {
781f5a6ff92SHans de Goede .callback = video_detect_force_native,
782f5a6ff92SHans de Goede /* Sony Vaio VPCY11S1E */
783f5a6ff92SHans de Goede .matches = {
784f5a6ff92SHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
785f5a6ff92SHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "VPCY11S1E"),
786f5a6ff92SHans de Goede },
787f5a6ff92SHans de Goede },
78810212754SHans de Goede
789d21a9162SHans de Goede /*
790c5b94f5bSHans de Goede * These Toshibas have a broken acpi-video interface for brightness
791c5b94f5bSHans de Goede * control. They also have an issue where the panel is off after
792c5b94f5bSHans de Goede * suspend until a special firmware call is made to turn it back
793c5b94f5bSHans de Goede * on. This is handled by the toshiba_acpi kernel module, so that
794c5b94f5bSHans de Goede * module must be enabled for these models to work correctly.
795c5b94f5bSHans de Goede */
796c5b94f5bSHans de Goede {
797c5b94f5bSHans de Goede /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */
798c5b94f5bSHans de Goede .callback = video_detect_force_native,
799c5b94f5bSHans de Goede /* Toshiba Portégé R700 */
800c5b94f5bSHans de Goede .matches = {
801c5b94f5bSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
802c5b94f5bSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R700"),
803c5b94f5bSHans de Goede },
804c5b94f5bSHans de Goede },
805c5b94f5bSHans de Goede {
806c5b94f5bSHans de Goede /* Portégé: https://bugs.freedesktop.org/show_bug.cgi?id=82634 */
807c5b94f5bSHans de Goede /* Satellite: https://bugzilla.kernel.org/show_bug.cgi?id=21012 */
808c5b94f5bSHans de Goede .callback = video_detect_force_native,
809c5b94f5bSHans de Goede /* Toshiba Satellite/Portégé R830 */
810c5b94f5bSHans de Goede .matches = {
811c5b94f5bSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
812c5b94f5bSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "R830"),
813c5b94f5bSHans de Goede },
814c5b94f5bSHans de Goede },
815c5b94f5bSHans de Goede {
816c5b94f5bSHans de Goede .callback = video_detect_force_native,
817c5b94f5bSHans de Goede /* Toshiba Satellite/Portégé Z830 */
818c5b94f5bSHans de Goede .matches = {
819c5b94f5bSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
820c5b94f5bSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Z830"),
821c5b94f5bSHans de Goede },
822c5b94f5bSHans de Goede },
823c5b94f5bSHans de Goede
824c5b94f5bSHans de Goede /*
825f46acc1eSHans de Goede * Models which have nvidia-ec-wmi support, but should not use it.
826f46acc1eSHans de Goede * Note this indicates a likely firmware bug on these models and should
827f46acc1eSHans de Goede * be revisited if/when Linux gets support for dynamic mux mode.
828f46acc1eSHans de Goede */
829f46acc1eSHans de Goede {
830f46acc1eSHans de Goede .callback = video_detect_force_native,
831f46acc1eSHans de Goede /* Dell G15 5515 */
832f46acc1eSHans de Goede .matches = {
833f46acc1eSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
834f46acc1eSHans de Goede DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"),
835f46acc1eSHans de Goede },
836f46acc1eSHans de Goede },
83789b04114SChia-Lin Kao (AceLan) {
83889b04114SChia-Lin Kao (AceLan) .callback = video_detect_force_native,
83989b04114SChia-Lin Kao (AceLan) .matches = {
84089b04114SChia-Lin Kao (AceLan) DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
84189b04114SChia-Lin Kao (AceLan) DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 15 3535"),
84289b04114SChia-Lin Kao (AceLan) },
84389b04114SChia-Lin Kao (AceLan) },
844084940d5SCorentin Chary { },
845084940d5SCorentin Chary };
846084940d5SCorentin Chary
google_cros_ec_present(void)847e9cf4d9bSDmitry Osipenko static bool google_cros_ec_present(void)
848e9cf4d9bSDmitry Osipenko {
84959dc2a7eSHans de Goede return acpi_dev_found("GOOG0004") || acpi_dev_found("GOOG000C");
850e9cf4d9bSDmitry Osipenko }
851e9cf4d9bSDmitry Osipenko
852c3d6de69SThomas Renninger /*
853a5df4252SHans de Goede * Windows 8 and newer no longer use the ACPI video interface, so it often
854a5df4252SHans de Goede * does not work. So on win8+ systems prefer native brightness control.
855a5df4252SHans de Goede * Chromebooks should always prefer native backlight control.
856a5df4252SHans de Goede */
prefer_native_over_acpi_video(void)857a5df4252SHans de Goede static bool prefer_native_over_acpi_video(void)
858a5df4252SHans de Goede {
859a5df4252SHans de Goede return acpi_osi_is_win8() || google_cros_ec_present();
860a5df4252SHans de Goede }
861a5df4252SHans de Goede
862a5df4252SHans de Goede /*
86387521e16SHans de Goede * Determine which type of backlight interface to use on this system,
86487521e16SHans de Goede * First check cmdline, then dmi quirks, then do autodetect.
865c3d6de69SThomas Renninger */
__acpi_video_get_backlight_type(bool native,bool * auto_detect)86678dfc9d1SHans de Goede enum acpi_backlight_type __acpi_video_get_backlight_type(bool native, bool *auto_detect)
867c3d6de69SThomas Renninger {
86887521e16SHans de Goede static DEFINE_MUTEX(init_mutex);
869fe7aebb4SHans de Goede static bool nvidia_wmi_ec_present;
870b0935f11SHans de Goede static bool apple_gmux_present;
8712600bfa3SHans de Goede static bool native_available;
87287521e16SHans de Goede static bool init_done;
87387521e16SHans de Goede static long video_caps;
874c3d6de69SThomas Renninger
87587521e16SHans de Goede /* Parse cmdline, dmi and acpi only once */
87687521e16SHans de Goede mutex_lock(&init_mutex);
87787521e16SHans de Goede if (!init_done) {
87887521e16SHans de Goede acpi_video_parse_cmdline();
87987521e16SHans de Goede dmi_check_system(video_detect_dmi_table);
880c3d6de69SThomas Renninger acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
8812263576cSLin Ming ACPI_UINT32_MAX, find_video, NULL,
88287521e16SHans de Goede &video_caps, NULL);
883fe7aebb4SHans de Goede nvidia_wmi_ec_present = nvidia_wmi_ec_supported();
884b0935f11SHans de Goede apple_gmux_present = apple_gmux_detect(NULL, NULL);
88587521e16SHans de Goede init_done = true;
88687521e16SHans de Goede }
8872600bfa3SHans de Goede if (native)
8882600bfa3SHans de Goede native_available = true;
88987521e16SHans de Goede mutex_unlock(&init_mutex);
890084940d5SCorentin Chary
89178dfc9d1SHans de Goede if (auto_detect)
89278dfc9d1SHans de Goede *auto_detect = false;
89378dfc9d1SHans de Goede
894b39be9f4SHans de Goede /*
895b39be9f4SHans de Goede * The below heuristics / detection steps are in order of descending
896b39be9f4SHans de Goede * presedence. The commandline takes presedence over anything else.
897b39be9f4SHans de Goede */
89887521e16SHans de Goede if (acpi_backlight_cmdline != acpi_backlight_undef)
89987521e16SHans de Goede return acpi_backlight_cmdline;
900c3d6de69SThomas Renninger
901b39be9f4SHans de Goede /* DMI quirks override any autodetection. */
90287521e16SHans de Goede if (acpi_backlight_dmi != acpi_backlight_undef)
90387521e16SHans de Goede return acpi_backlight_dmi;
90487521e16SHans de Goede
90578dfc9d1SHans de Goede if (auto_detect)
90678dfc9d1SHans de Goede *auto_detect = true;
90778dfc9d1SHans de Goede
908fe7aebb4SHans de Goede /* Special cases such as nvidia_wmi_ec and apple gmux. */
909fe7aebb4SHans de Goede if (nvidia_wmi_ec_present)
910fe7aebb4SHans de Goede return acpi_backlight_nvidia_wmi_ec;
911fe7aebb4SHans de Goede
912b0935f11SHans de Goede if (apple_gmux_present)
91321245df3SHans de Goede return acpi_backlight_apple_gmux;
91421245df3SHans de Goede
915a5df4252SHans de Goede /* Use ACPI video if available, except when native should be preferred. */
916a5df4252SHans de Goede if ((video_caps & ACPI_VIDEO_BACKLIGHT) &&
917a5df4252SHans de Goede !(native_available && prefer_native_over_acpi_video()))
91887521e16SHans de Goede return acpi_backlight_video;
919a5df4252SHans de Goede
920a5df4252SHans de Goede /* Use native if available */
921fb1836c9SHans de Goede if (native_available)
922a5df4252SHans de Goede return acpi_backlight_native;
9232600bfa3SHans de Goede
924aa8a950aSHans de Goede /*
925aa8a950aSHans de Goede * The vendor specific BIOS interfaces are only necessary for
926aa8a950aSHans de Goede * laptops from before ~2008.
927aa8a950aSHans de Goede *
928aa8a950aSHans de Goede * For laptops from ~2008 till ~2023 this point is never reached
929aa8a950aSHans de Goede * because on those (video_caps & ACPI_VIDEO_BACKLIGHT) above is true.
930aa8a950aSHans de Goede *
931aa8a950aSHans de Goede * Laptops from after ~2023 no longer support ACPI_VIDEO_BACKLIGHT,
932aa8a950aSHans de Goede * if this point is reached on those, this likely means that
933aa8a950aSHans de Goede * the GPU kms driver which sets native_available has not loaded yet.
934aa8a950aSHans de Goede *
935aa8a950aSHans de Goede * Returning acpi_backlight_vendor in this case is known to sometimes
936aa8a950aSHans de Goede * cause a non working vendor specific /sys/class/backlight device to
937aa8a950aSHans de Goede * get registered.
938aa8a950aSHans de Goede *
939aa8a950aSHans de Goede * Return acpi_backlight_none on laptops with ACPI tables written
940aa8a950aSHans de Goede * for Windows 8 (laptops from after ~2012) to avoid this problem.
941aa8a950aSHans de Goede */
942aa8a950aSHans de Goede if (acpi_osi_is_win8())
943aa8a950aSHans de Goede return acpi_backlight_none;
944aa8a950aSHans de Goede
945fb1836c9SHans de Goede /* No ACPI video/native (old hw), use vendor specific fw methods. */
946b39be9f4SHans de Goede return acpi_backlight_vendor;
947b39be9f4SHans de Goede }
94878dfc9d1SHans de Goede EXPORT_SYMBOL(__acpi_video_get_backlight_type);
949