ACPI: video: Change GIGABYTE GB-BXBT-2807 quirk to force_none
[linux-2.6-block.git] / drivers / acpi / video_detect.c
CommitLineData
c3d6de69 1/*
87521e16
HG
2 * Copyright (C) 2015 Red Hat Inc.
3 * Hans de Goede <hdegoede@redhat.com>
c3d6de69
TR
4 * Copyright (C) 2008 SuSE Linux Products GmbH
5 * Thomas Renninger <trenn@suse.de>
6 *
7 * May be copied or modified under the terms of the GNU General Public License
8 *
9 * video_detect.c:
c3d6de69 10 * After PCI devices are glued with ACPI devices
1e4cffe7 11 * acpi_get_pci_dev() can be called to identify ACPI graphics
c3d6de69
TR
12 * devices for which a real graphics card is plugged in
13 *
c3d6de69
TR
14 * Depending on whether ACPI graphics extensions (cmp. ACPI spec Appendix B)
15 * are available, video.ko should be used to handle the device.
16 *
7ec48ced 17 * Otherwise vendor specific drivers like thinkpad_acpi, asus-laptop,
677bd810 18 * sony_acpi,... can take care about backlight brightness.
c3d6de69 19 *
2600bfa3
HG
20 * Backlight drivers can use acpi_video_get_backlight_type() to determine which
21 * driver should handle the backlight. RAW/GPU-driver backlight drivers must
22 * use the acpi_video_backlight_use_native() helper for this.
c3d6de69 23 *
87521e16
HG
24 * If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
25 * this file will not be compiled and acpi_video_get_backlight_type() will
26 * always return acpi_backlight_vendor.
c3d6de69
TR
27 */
28
214f2c90 29#include <linux/export.h>
c3d6de69 30#include <linux/acpi.h>
21245df3 31#include <linux/apple-gmux.h>
87521e16 32#include <linux/backlight.h>
c3d6de69 33#include <linux/dmi.h>
14ca7a47 34#include <linux/module.h>
1e4cffe7 35#include <linux/pci.h>
fe7aebb4 36#include <linux/platform_data/x86/nvidia-wmi-ec-backlight.h>
87521e16 37#include <linux/types.h>
7231ed1a 38#include <linux/workqueue.h>
87521e16 39#include <acpi/video.h>
c3d6de69 40
87521e16
HG
41static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef;
42static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef;
c3d6de69 43
14ca7a47
HG
44static void acpi_video_parse_cmdline(void)
45{
46 if (!strcmp("vendor", acpi_video_backlight_string))
87521e16 47 acpi_backlight_cmdline = acpi_backlight_vendor;
14ca7a47 48 if (!strcmp("video", acpi_video_backlight_string))
87521e16
HG
49 acpi_backlight_cmdline = acpi_backlight_video;
50 if (!strcmp("native", acpi_video_backlight_string))
51 acpi_backlight_cmdline = acpi_backlight_native;
52 if (!strcmp("none", acpi_video_backlight_string))
53 acpi_backlight_cmdline = acpi_backlight_none;
14ca7a47
HG
54}
55
c3d6de69
TR
56static acpi_status
57find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
58{
99ece713 59 struct acpi_device *acpi_dev = acpi_fetch_acpi_dev(handle);
c3d6de69 60 long *cap = context;
1e4cffe7 61 struct pci_dev *dev;
c3d6de69 62
4a4f01a6 63 static const struct acpi_device_id video_ids[] = {
c3d6de69
TR
64 {ACPI_VIDEO_HID, 0},
65 {"", 0},
66 };
c3d6de69 67
99ece713 68 if (acpi_dev && !acpi_match_device_ids(acpi_dev, video_ids)) {
1e4cffe7 69 dev = acpi_get_pci_dev(handle);
c3d6de69
TR
70 if (!dev)
71 return AE_OK;
1e4cffe7 72 pci_dev_put(dev);
d4e1a692 73 *cap |= acpi_is_video_device(handle);
c3d6de69
TR
74 }
75 return AE_OK;
76}
77
fe7aebb4
HG
78/* This depends on ACPI_WMI which is X86 only */
79#ifdef CONFIG_X86
80static bool nvidia_wmi_ec_supported(void)
81{
82 struct wmi_brightness_args args = {
83 .mode = WMI_BRIGHTNESS_MODE_GET,
84 .val = 0,
85 .ret = 0,
86 };
87 struct acpi_buffer buf = { (acpi_size)sizeof(args), &args };
88 acpi_status status;
89
90 status = wmi_evaluate_method(WMI_BRIGHTNESS_GUID, 0,
91 WMI_BRIGHTNESS_METHOD_SOURCE, &buf, &buf);
92 if (ACPI_FAILURE(status))
93 return false;
94
95 /*
96 * If brightness is handled by the EC then nvidia-wmi-ec-backlight
97 * should be used, else the GPU driver(s) should be used.
98 */
99 return args.ret == WMI_BRIGHTNESS_SOURCE_EC;
100}
101#else
102static bool nvidia_wmi_ec_supported(void)
103{
104 return false;
105}
106#endif
107
084940d5
CC
108/* Force to use vendor driver when the ACPI device is known to be
109 * buggy */
110static int video_detect_force_vendor(const struct dmi_system_id *d)
111{
87521e16 112 acpi_backlight_dmi = acpi_backlight_vendor;
084940d5
CC
113 return 0;
114}
115
3bd6bce3
HG
116static int video_detect_force_video(const struct dmi_system_id *d)
117{
118 acpi_backlight_dmi = acpi_backlight_video;
119 return 0;
120}
121
122static int video_detect_force_native(const struct dmi_system_id *d)
123{
124 acpi_backlight_dmi = acpi_backlight_native;
125 return 0;
126}
127
1f59ab27
AH
128static int video_detect_force_none(const struct dmi_system_id *d)
129{
130 acpi_backlight_dmi = acpi_backlight_none;
131 return 0;
132}
133
4a4f01a6 134static const struct dmi_system_id video_detect_dmi_table[] = {
0172df18
HG
135 {
136 /* https://bugzilla.redhat.com/show_bug.cgi?id=1128309 */
137 .callback = video_detect_force_vendor,
138 /* Acer KAV80 */
139 .matches = {
140 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
141 DMI_MATCH(DMI_PRODUCT_NAME, "KAV80"),
142 },
143 },
d0c2ce16 144 {
c2d6920e
HG
145 .callback = video_detect_force_vendor,
146 /* Asus UL30VT */
147 .matches = {
d0c2ce16
LT
148 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
149 DMI_MATCH(DMI_PRODUCT_NAME, "UL30VT"),
150 },
151 },
c8f6d835 152 {
c2d6920e
HG
153 .callback = video_detect_force_vendor,
154 /* Asus UL30A */
155 .matches = {
c8f6d835
BT
156 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
157 DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"),
158 },
159 },
52796b30
HG
160 {
161 .callback = video_detect_force_vendor,
162 /* Asus X55U */
163 .matches = {
164 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
165 DMI_MATCH(DMI_PRODUCT_NAME, "X55U"),
166 },
167 },
168 {
60f1fac2 169 /* https://bugs.launchpad.net/bugs/1000146 */
52796b30
HG
170 .callback = video_detect_force_vendor,
171 /* Asus X101CH */
172 .matches = {
173 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
174 DMI_MATCH(DMI_PRODUCT_NAME, "X101CH"),
175 },
176 },
177 {
178 .callback = video_detect_force_vendor,
179 /* Asus X401U */
180 .matches = {
181 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
182 DMI_MATCH(DMI_PRODUCT_NAME, "X401U"),
183 },
184 },
185 {
186 .callback = video_detect_force_vendor,
187 /* Asus X501U */
188 .matches = {
189 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
190 DMI_MATCH(DMI_PRODUCT_NAME, "X501U"),
191 },
192 },
193 {
60f1fac2 194 /* https://bugs.launchpad.net/bugs/1000146 */
52796b30
HG
195 .callback = video_detect_force_vendor,
196 /* Asus 1015CX */
197 .matches = {
198 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
199 DMI_MATCH(DMI_PRODUCT_NAME, "1015CX"),
200 },
201 },
8991d7d9
HG
202 {
203 .callback = video_detect_force_vendor,
204 /* Samsung N150/N210/N220 */
205 .matches = {
206 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
207 DMI_MATCH(DMI_PRODUCT_NAME, "N150/N210/N220"),
208 DMI_MATCH(DMI_BOARD_NAME, "N150/N210/N220"),
209 },
210 },
211 {
212 .callback = video_detect_force_vendor,
213 /* Samsung NF110/NF210/NF310 */
214 .matches = {
215 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
216 DMI_MATCH(DMI_PRODUCT_NAME, "NF110/NF210/NF310"),
217 DMI_MATCH(DMI_BOARD_NAME, "NF110/NF210/NF310"),
218 },
219 },
220 {
221 .callback = video_detect_force_vendor,
222 /* Samsung NC210 */
223 .matches = {
224 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
225 DMI_MATCH(DMI_PRODUCT_NAME, "NC210/NC110"),
226 DMI_MATCH(DMI_BOARD_NAME, "NC210/NC110"),
227 },
228 },
25417185 229 {
60f1fac2 230 /* https://bugzilla.kernel.org/show_bug.cgi?id=202401 */
c2d6920e
HG
231 .callback = video_detect_force_vendor,
232 /* Sony VPCEH3U1E */
233 .matches = {
aefa763b
ZR
234 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
235 DMI_MATCH(DMI_PRODUCT_NAME, "VPCEH3U1E"),
236 },
237 },
60e6655f 238 {
c2d6920e
HG
239 .callback = video_detect_force_vendor,
240 /* Xiaomi Mi Pad 2 */
241 .matches = {
60e6655f
HG
242 DMI_MATCH(DMI_SYS_VENDOR, "Xiaomi Inc"),
243 DMI_MATCH(DMI_PRODUCT_NAME, "Mipad2"),
244 },
245 },
3bd6bce3 246
a2ed70d0
HG
247 /*
248 * Toshiba models with Transflective display, these need to use
249 * the toshiba_acpi vendor driver for proper Transflective handling.
250 */
251 {
252 .callback = video_detect_force_vendor,
253 .matches = {
254 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
255 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R500"),
256 },
257 },
258 {
259 .callback = video_detect_force_vendor,
260 .matches = {
261 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
262 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R600"),
263 },
264 },
265
3bd6bce3
HG
266 /*
267 * These models have a working acpi_video backlight control, and using
268 * native backlight causes a regression where backlight does not work
269 * when userspace is not handling brightness key events. Disable
270 * native_backlight on these to fix this:
271 * https://bugzilla.kernel.org/show_bug.cgi?id=81691
272 */
273 {
274 .callback = video_detect_force_video,
3b6740bd 275 /* ThinkPad T420 */
3bd6bce3
HG
276 .matches = {
277 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
278 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
279 },
280 },
281 {
282 .callback = video_detect_force_video,
3b6740bd 283 /* ThinkPad T520 */
3bd6bce3
HG
284 .matches = {
285 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
286 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
287 },
288 },
289 {
290 .callback = video_detect_force_video,
3b6740bd 291 /* ThinkPad X201s */
3bd6bce3
HG
292 .matches = {
293 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
294 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
295 },
296 },
c6237b21
ML
297 {
298 .callback = video_detect_force_video,
3b6740bd 299 /* ThinkPad X201T */
c6237b21
ML
300 .matches = {
301 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
302 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201T"),
303 },
304 },
3bd6bce3
HG
305
306 /* The native backlight controls do not work on some older machines */
307 {
308 /* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
309 .callback = video_detect_force_video,
3b6740bd 310 /* HP ENVY 15 Notebook */
3bd6bce3
HG
311 .matches = {
312 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
313 DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
314 },
315 },
316 {
317 .callback = video_detect_force_video,
3b6740bd 318 /* SAMSUNG 870Z5E/880Z5E/680Z5E */
3bd6bce3
HG
319 .matches = {
320 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
321 DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"),
322 },
323 },
324 {
325 .callback = video_detect_force_video,
3b6740bd 326 /* SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V */
3bd6bce3
HG
327 .matches = {
328 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
329 DMI_MATCH(DMI_PRODUCT_NAME,
330 "370R4E/370R4V/370R5E/3570RE/370R5V"),
331 },
332 },
333 {
334 /* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */
335 .callback = video_detect_force_video,
3b6740bd 336 /* SAMSUNG 3570R/370R/470R/450R/510R/4450RV */
3bd6bce3
HG
337 .matches = {
338 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
339 DMI_MATCH(DMI_PRODUCT_NAME,
340 "3570R/370R/470R/450R/510R/4450RV"),
341 },
342 },
bbf03861
HG
343 {
344 /* https://bugzilla.redhat.com/show_bug.cgi?id=1557060 */
345 .callback = video_detect_force_video,
3b6740bd 346 /* SAMSUNG 670Z5E */
bbf03861
HG
347 .matches = {
348 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
349 DMI_MATCH(DMI_PRODUCT_NAME, "670Z5E"),
350 },
351 },
3bd6bce3
HG
352 {
353 /* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */
354 .callback = video_detect_force_video,
3b6740bd 355 /* SAMSUNG 730U3E/740U3E */
3bd6bce3
HG
356 .matches = {
357 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
358 DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"),
359 },
360 },
361 {
362 /* https://bugs.freedesktop.org/show_bug.cgi?id=87286 */
363 .callback = video_detect_force_video,
3b6740bd 364 /* SAMSUNG 900X3C/900X3D/900X3E/900X4C/900X4D */
3bd6bce3
HG
365 .matches = {
366 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
367 DMI_MATCH(DMI_PRODUCT_NAME,
368 "900X3C/900X3D/900X3E/900X4C/900X4D"),
369 },
370 },
61f9738d
HG
371 {
372 /* https://bugzilla.redhat.com/show_bug.cgi?id=1272633 */
373 .callback = video_detect_force_video,
3b6740bd 374 /* Dell XPS14 L421X */
61f9738d
HG
375 .matches = {
376 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
377 DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"),
378 },
379 },
3bd6bce3
HG
380 {
381 /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
382 .callback = video_detect_force_video,
3b6740bd 383 /* Dell XPS15 L521X */
3bd6bce3
HG
384 .matches = {
385 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
386 DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
387 },
388 },
49eb5208
AL
389 {
390 /* https://bugzilla.kernel.org/show_bug.cgi?id=108971 */
391 .callback = video_detect_force_video,
3b6740bd 392 /* SAMSUNG 530U4E/540U4E */
49eb5208
AL
393 .matches = {
394 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
395 DMI_MATCH(DMI_PRODUCT_NAME, "530U4E/540U4E"),
396 },
397 },
b226faab 398 {
60f1fac2 399 /* https://bugs.launchpad.net/bugs/1894667 */
b226faab 400 .callback = video_detect_force_video,
3b6740bd 401 /* HP 635 Notebook */
b226faab
AH
402 .matches = {
403 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
404 DMI_MATCH(DMI_PRODUCT_NAME, "HP 635 Notebook PC"),
405 },
406 },
3bd6bce3
HG
407
408 /* Non win8 machines which need native backlight nevertheless */
584d8d1e
HG
409 {
410 /* https://bugzilla.redhat.com/show_bug.cgi?id=1201530 */
411 .callback = video_detect_force_native,
3b6740bd 412 /* Lenovo Ideapad S405 */
584d8d1e
HG
413 .matches = {
414 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
415 DMI_MATCH(DMI_BOARD_NAME, "Lenovo IdeaPad S405"),
416 },
417 },
3bd6bce3
HG
418 {
419 /* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
420 .callback = video_detect_force_native,
3b6740bd 421 /* Lenovo Ideapad Z570 */
3bd6bce3
HG
422 .matches = {
423 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
424 DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
425 },
426 },
53870cf0
AM
427 {
428 .callback = video_detect_force_native,
3b6740bd 429 /* Lenovo E41-25 */
53870cf0
AM
430 .matches = {
431 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
432 DMI_MATCH(DMI_PRODUCT_NAME, "81FS"),
433 },
434 },
435 {
436 .callback = video_detect_force_native,
3b6740bd 437 /* Lenovo E41-45 */
53870cf0
AM
438 .matches = {
439 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
440 DMI_MATCH(DMI_PRODUCT_NAME, "82BK"),
441 },
442 },
3bd6bce3
HG
443 {
444 /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
445 .callback = video_detect_force_native,
3b6740bd 446 /* Apple MacBook Pro 12,1 */
3bd6bce3
HG
447 .matches = {
448 DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
449 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
450 },
451 },
03c440a2
HG
452 {
453 .callback = video_detect_force_native,
454 /* Dell Inspiron N4010 */
455 .matches = {
456 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
457 DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron N4010"),
458 },
459 },
4b4b3b20
HG
460 {
461 .callback = video_detect_force_native,
3b6740bd 462 /* Dell Vostro V131 */
4b4b3b20
HG
463 .matches = {
464 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
465 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
466 },
467 },
350fa038
HG
468 {
469 /* https://bugzilla.redhat.com/show_bug.cgi?id=1123661 */
470 .callback = video_detect_force_native,
3b6740bd 471 /* Dell XPS 17 L702X */
350fa038
HG
472 .matches = {
473 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
474 DMI_MATCH(DMI_PRODUCT_NAME, "Dell System XPS L702X"),
475 },
476 },
d37efb79
SYLF
477 {
478 .callback = video_detect_force_native,
3b6740bd 479 /* Dell Precision 7510 */
d37efb79
SYLF
480 .matches = {
481 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
482 DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"),
483 },
484 },
1c8fbc1f
HG
485 {
486 .callback = video_detect_force_native,
3b6740bd 487 /* Acer Aspire 5738z */
1c8fbc1f
HG
488 .matches = {
489 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
490 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
491 DMI_MATCH(DMI_BOARD_NAME, "JV50"),
492 },
493 },
0172df18
HG
494 {
495 /* https://bugzilla.redhat.com/show_bug.cgi?id=1012674 */
496 .callback = video_detect_force_native,
497 /* Acer Aspire 5741 */
498 .matches = {
499 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
500 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5741"),
501 },
502 },
503 {
504 /* https://bugzilla.kernel.org/show_bug.cgi?id=42993 */
505 .callback = video_detect_force_native,
506 /* Acer Aspire 5750 */
507 .matches = {
508 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
509 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5750"),
510 },
511 },
512 {
513 /* https://bugzilla.kernel.org/show_bug.cgi?id=42833 */
514 .callback = video_detect_force_native,
515 /* Acer Extensa 5235 */
516 .matches = {
517 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
518 DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5235"),
519 },
520 },
521 {
522 .callback = video_detect_force_native,
523 /* Acer TravelMate 4750 */
524 .matches = {
525 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
526 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4750"),
527 },
528 },
c41c36e9
PM
529 {
530 /* https://bugzilla.kernel.org/show_bug.cgi?id=207835 */
531 .callback = video_detect_force_native,
3b6740bd 532 /* Acer TravelMate 5735Z */
c41c36e9
PM
533 .matches = {
534 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
535 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5735Z"),
536 DMI_MATCH(DMI_BOARD_NAME, "BA51_MV"),
537 },
538 },
0172df18
HG
539 {
540 /* https://bugzilla.kernel.org/show_bug.cgi?id=36322 */
541 .callback = video_detect_force_native,
542 /* Acer TravelMate 5760 */
543 .matches = {
544 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
545 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5760"),
546 },
547 },
2dfbacc6 548 {
c2d6920e
HG
549 .callback = video_detect_force_native,
550 /* ASUSTeK COMPUTER INC. GA401 */
551 .matches = {
2dfbacc6
LJ
552 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
553 DMI_MATCH(DMI_PRODUCT_NAME, "GA401"),
554 },
555 },
556 {
c2d6920e
HG
557 .callback = video_detect_force_native,
558 /* ASUSTeK COMPUTER INC. GA502 */
559 .matches = {
2dfbacc6
LJ
560 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
561 DMI_MATCH(DMI_PRODUCT_NAME, "GA502"),
562 },
563 },
564 {
c2d6920e
HG
565 .callback = video_detect_force_native,
566 /* ASUSTeK COMPUTER INC. GA503 */
567 .matches = {
2dfbacc6
LJ
568 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
569 DMI_MATCH(DMI_PRODUCT_NAME, "GA503"),
570 },
571 },
1e3344d6
HG
572 {
573 .callback = video_detect_force_native,
574 /* Asus UX303UB */
575 .matches = {
576 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
577 DMI_MATCH(DMI_PRODUCT_NAME, "UX303UB"),
578 },
579 },
8991d7d9
HG
580 {
581 .callback = video_detect_force_native,
582 /* Samsung N150P */
583 .matches = {
584 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
585 DMI_MATCH(DMI_PRODUCT_NAME, "N150P"),
586 DMI_MATCH(DMI_BOARD_NAME, "N150P"),
587 },
588 },
589 {
590 .callback = video_detect_force_native,
591 /* Samsung N145P/N250P/N260P */
592 .matches = {
593 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
594 DMI_MATCH(DMI_PRODUCT_NAME, "N145P/N250P/N260P"),
595 DMI_MATCH(DMI_BOARD_NAME, "N145P/N250P/N260P"),
596 },
597 },
598 {
599 .callback = video_detect_force_native,
600 /* Samsung N250P */
601 .matches = {
602 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
603 DMI_MATCH(DMI_PRODUCT_NAME, "N250P"),
604 DMI_MATCH(DMI_BOARD_NAME, "N250P"),
605 },
606 },
10212754 607
c5b94f5b
HG
608 /*
609 * These Toshibas have a broken acpi-video interface for brightness
610 * control. They also have an issue where the panel is off after
611 * suspend until a special firmware call is made to turn it back
612 * on. This is handled by the toshiba_acpi kernel module, so that
613 * module must be enabled for these models to work correctly.
614 */
615 {
616 /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */
617 .callback = video_detect_force_native,
618 /* Toshiba Portégé R700 */
619 .matches = {
620 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
621 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R700"),
622 },
623 },
624 {
625 /* Portégé: https://bugs.freedesktop.org/show_bug.cgi?id=82634 */
626 /* Satellite: https://bugzilla.kernel.org/show_bug.cgi?id=21012 */
627 .callback = video_detect_force_native,
628 /* Toshiba Satellite/Portégé R830 */
629 .matches = {
630 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
631 DMI_MATCH(DMI_PRODUCT_NAME, "R830"),
632 },
633 },
634 {
635 .callback = video_detect_force_native,
636 /* Toshiba Satellite/Portégé Z830 */
637 .matches = {
638 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
639 DMI_MATCH(DMI_PRODUCT_NAME, "Z830"),
640 },
641 },
642
f46acc1e
HG
643 /*
644 * Models which have nvidia-ec-wmi support, but should not use it.
645 * Note this indicates a likely firmware bug on these models and should
646 * be revisited if/when Linux gets support for dynamic mux mode.
647 */
648 {
649 .callback = video_detect_force_native,
650 /* Dell G15 5515 */
651 .matches = {
652 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
653 DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"),
654 },
655 },
656
d21a9162
HG
657 /*
658 * Desktops which falsely report a backlight and which our heuristics
659 * for this do not catch.
660 */
1f59ab27
AH
661 {
662 .callback = video_detect_force_none,
3b6740bd 663 /* Dell OptiPlex 9020M */
1f59ab27
AH
664 .matches = {
665 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
666 DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 9020M"),
667 },
668 },
9f7dd272
HG
669 {
670 .callback = video_detect_force_none,
671 /* GIGABYTE GB-BXBT-2807 */
672 .matches = {
673 DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
674 DMI_MATCH(DMI_PRODUCT_NAME, "GB-BXBT-2807"),
675 },
676 },
d21a9162
HG
677 {
678 .callback = video_detect_force_none,
3b6740bd 679 /* MSI MS-7721 */
d21a9162
HG
680 .matches = {
681 DMI_MATCH(DMI_SYS_VENDOR, "MSI"),
682 DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"),
683 },
684 },
084940d5
CC
685 { },
686};
687
e9cf4d9b
DO
688static bool google_cros_ec_present(void)
689{
59dc2a7e 690 return acpi_dev_found("GOOG0004") || acpi_dev_found("GOOG000C");
e9cf4d9b
DO
691}
692
c3d6de69 693/*
87521e16
HG
694 * Determine which type of backlight interface to use on this system,
695 * First check cmdline, then dmi quirks, then do autodetect.
c3d6de69 696 */
2600bfa3 697static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
c3d6de69 698{
87521e16 699 static DEFINE_MUTEX(init_mutex);
fe7aebb4 700 static bool nvidia_wmi_ec_present;
2600bfa3 701 static bool native_available;
87521e16
HG
702 static bool init_done;
703 static long video_caps;
084940d5 704
87521e16
HG
705 /* Parse cmdline, dmi and acpi only once */
706 mutex_lock(&init_mutex);
707 if (!init_done) {
708 acpi_video_parse_cmdline();
084940d5 709 dmi_check_system(video_detect_dmi_table);
87521e16 710 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
2263576c 711 ACPI_UINT32_MAX, find_video, NULL,
87521e16 712 &video_caps, NULL);
fe7aebb4 713 nvidia_wmi_ec_present = nvidia_wmi_ec_supported();
87521e16 714 init_done = true;
c3d6de69 715 }
2600bfa3
HG
716 if (native)
717 native_available = true;
87521e16
HG
718 mutex_unlock(&init_mutex);
719
b39be9f4
HG
720 /*
721 * The below heuristics / detection steps are in order of descending
722 * presedence. The commandline takes presedence over anything else.
723 */
87521e16
HG
724 if (acpi_backlight_cmdline != acpi_backlight_undef)
725 return acpi_backlight_cmdline;
726
b39be9f4 727 /* DMI quirks override any autodetection. */
87521e16
HG
728 if (acpi_backlight_dmi != acpi_backlight_undef)
729 return acpi_backlight_dmi;
730
fe7aebb4
HG
731 /* Special cases such as nvidia_wmi_ec and apple gmux. */
732 if (nvidia_wmi_ec_present)
733 return acpi_backlight_nvidia_wmi_ec;
734
21245df3
HG
735 if (apple_gmux_present())
736 return acpi_backlight_apple_gmux;
737
59dc2a7e
HG
738 /* Chromebooks should always prefer native backlight control. */
739 if (google_cros_ec_present() && native_available)
740 return acpi_backlight_native;
741
b39be9f4
HG
742 /* On systems with ACPI video use either native or ACPI video. */
743 if (video_caps & ACPI_VIDEO_BACKLIGHT) {
744 /*
745 * Windows 8 and newer no longer use the ACPI video interface,
746 * so it often does not work. If the ACPI tables are written
747 * for win8 and native brightness ctl is available, use that.
748 *
749 * The native check deliberately is inside the if acpi-video
750 * block on older devices without acpi-video support native
751 * is usually not the best choice.
752 */
753 if (acpi_osi_is_win8() && native_available)
754 return acpi_backlight_native;
755 else
756 return acpi_backlight_video;
757 }
87521e16 758
b39be9f4
HG
759 /* No ACPI video (old hw), use vendor specific fw methods. */
760 return acpi_backlight_vendor;
c3d6de69 761}
2600bfa3
HG
762
763enum acpi_backlight_type acpi_video_get_backlight_type(void)
764{
765 return __acpi_video_get_backlight_type(false);
766}
87521e16 767EXPORT_SYMBOL(acpi_video_get_backlight_type);
c3d6de69 768
2600bfa3
HG
769bool acpi_video_backlight_use_native(void)
770{
454d61a5
HG
771 /*
772 * Call __acpi_video_get_backlight_type() to let it know that
773 * a native backlight is available.
774 */
775 __acpi_video_get_backlight_type(true);
776
777 /*
778 * For now just always return true. There is a whole bunch of laptop
779 * models where (video_caps & ACPI_VIDEO_BACKLIGHT) is false causing
780 * __acpi_video_get_backlight_type() to return vendor, while these
781 * models only have a native backlight control.
782 */
783 return true;
2600bfa3
HG
784}
785EXPORT_SYMBOL(acpi_video_backlight_use_native);