• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  video.c - ACPI Video Driver
4  *
5  *  Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
6  *  Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org>
7  *  Copyright (C) 2006 Thomas Tuttle <linux-kernel@ttuttle.net>
8  */
9 
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/types.h>
14 #include <linux/list.h>
15 #include <linux/mutex.h>
16 #include <linux/input.h>
17 #include <linux/backlight.h>
18 #include <linux/thermal.h>
19 #include <linux/sort.h>
20 #include <linux/pci.h>
21 #include <linux/pci_ids.h>
22 #include <linux/slab.h>
23 #include <linux/dmi.h>
24 #include <linux/suspend.h>
25 #include <linux/acpi.h>
26 #include <acpi/video.h>
27 #include <linux/uaccess.h>
28 
29 #define PREFIX "ACPI: "
30 
31 #define ACPI_VIDEO_BUS_NAME		"Video Bus"
32 #define ACPI_VIDEO_DEVICE_NAME		"Video Device"
33 
34 #define MAX_NAME_LEN	20
35 
36 #define _COMPONENT		ACPI_VIDEO_COMPONENT
37 ACPI_MODULE_NAME("video");
38 
39 MODULE_AUTHOR("Bruno Ducrot");
40 MODULE_DESCRIPTION("ACPI Video Driver");
41 MODULE_LICENSE("GPL");
42 
43 static bool brightness_switch_enabled = true;
44 module_param(brightness_switch_enabled, bool, 0644);
45 
46 /*
47  * By default, we don't allow duplicate ACPI video bus devices
48  * under the same VGA controller
49  */
50 static bool allow_duplicates;
51 module_param(allow_duplicates, bool, 0644);
52 
53 static int disable_backlight_sysfs_if = -1;
54 module_param(disable_backlight_sysfs_if, int, 0444);
55 
56 #define REPORT_OUTPUT_KEY_EVENTS		0x01
57 #define REPORT_BRIGHTNESS_KEY_EVENTS		0x02
58 static int report_key_events = -1;
59 module_param(report_key_events, int, 0644);
60 MODULE_PARM_DESC(report_key_events,
61 	"0: none, 1: output changes, 2: brightness changes, 3: all");
62 
63 static int hw_changes_brightness = -1;
64 module_param(hw_changes_brightness, int, 0644);
65 MODULE_PARM_DESC(hw_changes_brightness,
66 	"Set this to 1 on buggy hw which changes the brightness itself when "
67 	"a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness");
68 
69 /*
70  * Whether the struct acpi_video_device_attrib::device_id_scheme bit should be
71  * assumed even if not actually set.
72  */
73 static bool device_id_scheme = false;
74 module_param(device_id_scheme, bool, 0444);
75 
76 static int only_lcd = -1;
77 module_param(only_lcd, int, 0444);
78 
79 static int register_count;
80 static DEFINE_MUTEX(register_count_mutex);
81 static DEFINE_MUTEX(video_list_lock);
82 static LIST_HEAD(video_bus_head);
83 static int acpi_video_bus_add(struct acpi_device *device);
84 static int acpi_video_bus_remove(struct acpi_device *device);
85 static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
86 void acpi_video_detect_exit(void);
87 
88 /*
89  * Indices in the _BCL method response: the first two items are special,
90  * the rest are all supported levels.
91  *
92  * See page 575 of the ACPI spec 3.0
93  */
94 enum acpi_video_level_idx {
95 	ACPI_VIDEO_AC_LEVEL,		/* level when machine has full power */
96 	ACPI_VIDEO_BATTERY_LEVEL,	/* level when machine is on batteries */
97 	ACPI_VIDEO_FIRST_LEVEL,		/* actual supported levels begin here */
98 };
99 
100 static const struct acpi_device_id video_device_ids[] = {
101 	{ACPI_VIDEO_HID, 0},
102 	{"", 0},
103 };
104 MODULE_DEVICE_TABLE(acpi, video_device_ids);
105 
106 static struct acpi_driver acpi_video_bus = {
107 	.name = "video",
108 	.class = ACPI_VIDEO_CLASS,
109 	.ids = video_device_ids,
110 	.ops = {
111 		.add = acpi_video_bus_add,
112 		.remove = acpi_video_bus_remove,
113 		.notify = acpi_video_bus_notify,
114 		},
115 };
116 
117 struct acpi_video_bus_flags {
118 	u8 multihead:1;		/* can switch video heads */
119 	u8 rom:1;		/* can retrieve a video rom */
120 	u8 post:1;		/* can configure the head to */
121 	u8 reserved:5;
122 };
123 
124 struct acpi_video_bus_cap {
125 	u8 _DOS:1;		/* Enable/Disable output switching */
126 	u8 _DOD:1;		/* Enumerate all devices attached to display adapter */
127 	u8 _ROM:1;		/* Get ROM Data */
128 	u8 _GPD:1;		/* Get POST Device */
129 	u8 _SPD:1;		/* Set POST Device */
130 	u8 _VPO:1;		/* Video POST Options */
131 	u8 reserved:2;
132 };
133 
134 struct acpi_video_device_attrib {
135 	u32 display_index:4;	/* A zero-based instance of the Display */
136 	u32 display_port_attachment:4;	/* This field differentiates the display type */
137 	u32 display_type:4;	/* Describe the specific type in use */
138 	u32 vendor_specific:4;	/* Chipset Vendor Specific */
139 	u32 bios_can_detect:1;	/* BIOS can detect the device */
140 	u32 depend_on_vga:1;	/* Non-VGA output device whose power is related to
141 				   the VGA device. */
142 	u32 pipe_id:3;		/* For VGA multiple-head devices. */
143 	u32 reserved:10;	/* Must be 0 */
144 
145 	/*
146 	 * The device ID might not actually follow the scheme described by this
147 	 * struct acpi_video_device_attrib. If it does, then this bit
148 	 * device_id_scheme is set; otherwise, other fields should be ignored.
149 	 *
150 	 * (but also see the global flag device_id_scheme)
151 	 */
152 	u32 device_id_scheme:1;
153 };
154 
155 struct acpi_video_enumerated_device {
156 	union {
157 		u32 int_val;
158 		struct acpi_video_device_attrib attrib;
159 	} value;
160 	struct acpi_video_device *bind_info;
161 };
162 
163 struct acpi_video_bus {
164 	struct acpi_device *device;
165 	bool backlight_registered;
166 	u8 dos_setting;
167 	struct acpi_video_enumerated_device *attached_array;
168 	u8 attached_count;
169 	u8 child_count;
170 	struct acpi_video_bus_cap cap;
171 	struct acpi_video_bus_flags flags;
172 	struct list_head video_device_list;
173 	struct mutex device_list_lock;	/* protects video_device_list */
174 	struct list_head entry;
175 	struct input_dev *input;
176 	char phys[32];	/* for input device */
177 	struct notifier_block pm_nb;
178 };
179 
180 struct acpi_video_device_flags {
181 	u8 crt:1;
182 	u8 lcd:1;
183 	u8 tvout:1;
184 	u8 dvi:1;
185 	u8 bios:1;
186 	u8 unknown:1;
187 	u8 notify:1;
188 	u8 reserved:1;
189 };
190 
191 struct acpi_video_device_cap {
192 	u8 _ADR:1;		/* Return the unique ID */
193 	u8 _BCL:1;		/* Query list of brightness control levels supported */
194 	u8 _BCM:1;		/* Set the brightness level */
195 	u8 _BQC:1;		/* Get current brightness level */
196 	u8 _BCQ:1;		/* Some buggy BIOS uses _BCQ instead of _BQC */
197 	u8 _DDC:1;		/* Return the EDID for this device */
198 };
199 
200 struct acpi_video_device {
201 	unsigned long device_id;
202 	struct acpi_video_device_flags flags;
203 	struct acpi_video_device_cap cap;
204 	struct list_head entry;
205 	struct delayed_work switch_brightness_work;
206 	int switch_brightness_event;
207 	struct acpi_video_bus *video;
208 	struct acpi_device *dev;
209 	struct acpi_video_device_brightness *brightness;
210 	struct backlight_device *backlight;
211 	struct thermal_cooling_device *cooling_dev;
212 };
213 
214 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data);
215 static void acpi_video_device_rebind(struct acpi_video_bus *video);
216 static void acpi_video_device_bind(struct acpi_video_bus *video,
217 				   struct acpi_video_device *device);
218 static int acpi_video_device_enumerate(struct acpi_video_bus *video);
219 static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
220 			int level);
221 static int acpi_video_device_lcd_get_level_current(
222 			struct acpi_video_device *device,
223 			unsigned long long *level, bool raw);
224 static int acpi_video_get_next_level(struct acpi_video_device *device,
225 				     u32 level_current, u32 event);
226 static void acpi_video_switch_brightness(struct work_struct *work);
227 
228 /* backlight device sysfs support */
acpi_video_get_brightness(struct backlight_device * bd)229 static int acpi_video_get_brightness(struct backlight_device *bd)
230 {
231 	unsigned long long cur_level;
232 	int i;
233 	struct acpi_video_device *vd = bl_get_data(bd);
234 
235 	if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false))
236 		return -EINVAL;
237 	for (i = ACPI_VIDEO_FIRST_LEVEL; i < vd->brightness->count; i++) {
238 		if (vd->brightness->levels[i] == cur_level)
239 			return i - ACPI_VIDEO_FIRST_LEVEL;
240 	}
241 	return 0;
242 }
243 
acpi_video_set_brightness(struct backlight_device * bd)244 static int acpi_video_set_brightness(struct backlight_device *bd)
245 {
246 	int request_level = bd->props.brightness + ACPI_VIDEO_FIRST_LEVEL;
247 	struct acpi_video_device *vd = bl_get_data(bd);
248 
249 	cancel_delayed_work(&vd->switch_brightness_work);
250 	return acpi_video_device_lcd_set_level(vd,
251 				vd->brightness->levels[request_level]);
252 }
253 
254 static const struct backlight_ops acpi_backlight_ops = {
255 	.get_brightness = acpi_video_get_brightness,
256 	.update_status  = acpi_video_set_brightness,
257 };
258 
259 /* thermal cooling device callbacks */
video_get_max_state(struct thermal_cooling_device * cooling_dev,unsigned long * state)260 static int video_get_max_state(struct thermal_cooling_device *cooling_dev,
261 			       unsigned long *state)
262 {
263 	struct acpi_device *device = cooling_dev->devdata;
264 	struct acpi_video_device *video = acpi_driver_data(device);
265 
266 	*state = video->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1;
267 	return 0;
268 }
269 
video_get_cur_state(struct thermal_cooling_device * cooling_dev,unsigned long * state)270 static int video_get_cur_state(struct thermal_cooling_device *cooling_dev,
271 			       unsigned long *state)
272 {
273 	struct acpi_device *device = cooling_dev->devdata;
274 	struct acpi_video_device *video = acpi_driver_data(device);
275 	unsigned long long level;
276 	int offset;
277 
278 	if (acpi_video_device_lcd_get_level_current(video, &level, false))
279 		return -EINVAL;
280 	for (offset = ACPI_VIDEO_FIRST_LEVEL; offset < video->brightness->count;
281 	     offset++)
282 		if (level == video->brightness->levels[offset]) {
283 			*state = video->brightness->count - offset - 1;
284 			return 0;
285 		}
286 
287 	return -EINVAL;
288 }
289 
290 static int
video_set_cur_state(struct thermal_cooling_device * cooling_dev,unsigned long state)291 video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long state)
292 {
293 	struct acpi_device *device = cooling_dev->devdata;
294 	struct acpi_video_device *video = acpi_driver_data(device);
295 	int level;
296 
297 	if (state >= video->brightness->count - ACPI_VIDEO_FIRST_LEVEL)
298 		return -EINVAL;
299 
300 	state = video->brightness->count - state;
301 	level = video->brightness->levels[state - 1];
302 	return acpi_video_device_lcd_set_level(video, level);
303 }
304 
305 static const struct thermal_cooling_device_ops video_cooling_ops = {
306 	.get_max_state = video_get_max_state,
307 	.get_cur_state = video_get_cur_state,
308 	.set_cur_state = video_set_cur_state,
309 };
310 
311 /*
312  * --------------------------------------------------------------------------
313  *                             Video Management
314  * --------------------------------------------------------------------------
315  */
316 
317 static int
acpi_video_device_lcd_query_levels(acpi_handle handle,union acpi_object ** levels)318 acpi_video_device_lcd_query_levels(acpi_handle handle,
319 				   union acpi_object **levels)
320 {
321 	int status;
322 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
323 	union acpi_object *obj;
324 
325 
326 	*levels = NULL;
327 
328 	status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer);
329 	if (!ACPI_SUCCESS(status))
330 		return status;
331 	obj = (union acpi_object *)buffer.pointer;
332 	if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) {
333 		printk(KERN_ERR PREFIX "Invalid _BCL data\n");
334 		status = -EFAULT;
335 		goto err;
336 	}
337 
338 	*levels = obj;
339 
340 	return 0;
341 
342 err:
343 	kfree(buffer.pointer);
344 
345 	return status;
346 }
347 
348 static int
acpi_video_device_lcd_set_level(struct acpi_video_device * device,int level)349 acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
350 {
351 	int status;
352 	int state;
353 
354 	status = acpi_execute_simple_method(device->dev->handle,
355 					    "_BCM", level);
356 	if (ACPI_FAILURE(status)) {
357 		ACPI_ERROR((AE_INFO, "Evaluating _BCM failed"));
358 		return -EIO;
359 	}
360 
361 	device->brightness->curr = level;
362 	for (state = ACPI_VIDEO_FIRST_LEVEL; state < device->brightness->count;
363 	     state++)
364 		if (level == device->brightness->levels[state]) {
365 			if (device->backlight)
366 				device->backlight->props.brightness =
367 					state - ACPI_VIDEO_FIRST_LEVEL;
368 			return 0;
369 		}
370 
371 	ACPI_ERROR((AE_INFO, "Current brightness invalid"));
372 	return -EINVAL;
373 }
374 
375 /*
376  * For some buggy _BQC methods, we need to add a constant value to
377  * the _BQC return value to get the actual current brightness level
378  */
379 
380 static int bqc_offset_aml_bug_workaround;
video_set_bqc_offset(const struct dmi_system_id * d)381 static int video_set_bqc_offset(const struct dmi_system_id *d)
382 {
383 	bqc_offset_aml_bug_workaround = 9;
384 	return 0;
385 }
386 
video_disable_backlight_sysfs_if(const struct dmi_system_id * d)387 static int video_disable_backlight_sysfs_if(
388 	const struct dmi_system_id *d)
389 {
390 	if (disable_backlight_sysfs_if == -1)
391 		disable_backlight_sysfs_if = 1;
392 	return 0;
393 }
394 
video_set_device_id_scheme(const struct dmi_system_id * d)395 static int video_set_device_id_scheme(const struct dmi_system_id *d)
396 {
397 	device_id_scheme = true;
398 	return 0;
399 }
400 
video_enable_only_lcd(const struct dmi_system_id * d)401 static int video_enable_only_lcd(const struct dmi_system_id *d)
402 {
403 	only_lcd = true;
404 	return 0;
405 }
406 
video_set_report_key_events(const struct dmi_system_id * id)407 static int video_set_report_key_events(const struct dmi_system_id *id)
408 {
409 	if (report_key_events == -1)
410 		report_key_events = (uintptr_t)id->driver_data;
411 	return 0;
412 }
413 
video_hw_changes_brightness(const struct dmi_system_id * d)414 static int video_hw_changes_brightness(
415 	const struct dmi_system_id *d)
416 {
417 	if (hw_changes_brightness == -1)
418 		hw_changes_brightness = 1;
419 	return 0;
420 }
421 
422 static const struct dmi_system_id video_dmi_table[] = {
423 	/*
424 	 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
425 	 */
426 	{
427 	 .callback = video_set_bqc_offset,
428 	 .ident = "Acer Aspire 5720",
429 	 .matches = {
430 		DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
431 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
432 		},
433 	},
434 	{
435 	 .callback = video_set_bqc_offset,
436 	 .ident = "Acer Aspire 5710Z",
437 	 .matches = {
438 		DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
439 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710Z"),
440 		},
441 	},
442 	{
443 	 .callback = video_set_bqc_offset,
444 	 .ident = "eMachines E510",
445 	 .matches = {
446 		DMI_MATCH(DMI_BOARD_VENDOR, "EMACHINES"),
447 		DMI_MATCH(DMI_PRODUCT_NAME, "eMachines E510"),
448 		},
449 	},
450 	{
451 	 .callback = video_set_bqc_offset,
452 	 .ident = "Acer Aspire 5315",
453 	 .matches = {
454 		DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
455 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
456 		},
457 	},
458 	{
459 	 .callback = video_set_bqc_offset,
460 	 .ident = "Acer Aspire 7720",
461 	 .matches = {
462 		DMI_MATCH(DMI_BOARD_VENDOR, "Acer"),
463 		DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"),
464 		},
465 	},
466 
467 	/*
468 	 * Some machines have a broken acpi-video interface for brightness
469 	 * control, but still need an acpi_video_device_lcd_set_level() call
470 	 * on resume to turn the backlight power on.  We Enable backlight
471 	 * control on these systems, but do not register a backlight sysfs
472 	 * as brightness control does not work.
473 	 */
474 	{
475 	 /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */
476 	 .callback = video_disable_backlight_sysfs_if,
477 	 .ident = "Toshiba Portege R700",
478 	 .matches = {
479 		DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
480 		DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R700"),
481 		},
482 	},
483 	{
484 	 /* https://bugs.freedesktop.org/show_bug.cgi?id=82634 */
485 	 .callback = video_disable_backlight_sysfs_if,
486 	 .ident = "Toshiba Portege R830",
487 	 .matches = {
488 		DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
489 		DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"),
490 		},
491 	},
492 	{
493 	 /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */
494 	 .callback = video_disable_backlight_sysfs_if,
495 	 .ident = "Toshiba Satellite R830",
496 	 .matches = {
497 		DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
498 		DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE R830"),
499 		},
500 	},
501 	{
502 	 .callback = video_disable_backlight_sysfs_if,
503 	 .ident = "Toshiba Satellite Z830",
504 	 .matches = {
505 		DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
506 		DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE Z830"),
507 		},
508 	},
509 	{
510 	 .callback = video_disable_backlight_sysfs_if,
511 	 .ident = "Toshiba Portege Z830",
512 	 .matches = {
513 		DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
514 		DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE Z830"),
515 		},
516 	},
517 	/*
518 	 * Some machine's _DOD IDs don't have bit 31(Device ID Scheme) set
519 	 * but the IDs actually follow the Device ID Scheme.
520 	 */
521 	{
522 	 /* https://bugzilla.kernel.org/show_bug.cgi?id=104121 */
523 	 .callback = video_set_device_id_scheme,
524 	 .ident = "ESPRIMO Mobile M9410",
525 	 .matches = {
526 		DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
527 		DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
528 		},
529 	},
530 	/*
531 	 * Some machines have multiple video output devices, but only the one
532 	 * that is the type of LCD can do the backlight control so we should not
533 	 * register backlight interface for other video output devices.
534 	 */
535 	{
536 	 /* https://bugzilla.kernel.org/show_bug.cgi?id=104121 */
537 	 .callback = video_enable_only_lcd,
538 	 .ident = "ESPRIMO Mobile M9410",
539 	 .matches = {
540 		DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
541 		DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
542 		},
543 	},
544 	/*
545 	 * Some machines report wrong key events on the acpi-bus, suppress
546 	 * key event reporting on these.  Note this is only intended to work
547 	 * around events which are plain wrong. In some cases we get double
548 	 * events, in this case acpi-video is considered the canonical source
549 	 * and the events from the other source should be filtered. E.g.
550 	 * by calling acpi_video_handles_brightness_key_presses() from the
551 	 * vendor acpi/wmi driver or by using /lib/udev/hwdb.d/60-keyboard.hwdb
552 	 */
553 	{
554 	 .callback = video_set_report_key_events,
555 	 .driver_data = (void *)((uintptr_t)REPORT_OUTPUT_KEY_EVENTS),
556 	 .ident = "Dell Vostro V131",
557 	 .matches = {
558 		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
559 		DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
560 		},
561 	},
562 	{
563 	 .callback = video_set_report_key_events,
564 	 .driver_data = (void *)((uintptr_t)REPORT_BRIGHTNESS_KEY_EVENTS),
565 	 .ident = "Dell Vostro 3350",
566 	 .matches = {
567 		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
568 		DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3350"),
569 		},
570 	},
571 	/*
572 	 * Some machines change the brightness themselves when a brightness
573 	 * hotkey gets pressed, despite us telling them not to. In this case
574 	 * acpi_video_device_notify() should only call backlight_force_update(
575 	 * BACKLIGHT_UPDATE_HOTKEY) and not do anything else.
576 	 */
577 	{
578 	 /* https://bugzilla.kernel.org/show_bug.cgi?id=204077 */
579 	 .callback = video_hw_changes_brightness,
580 	 .ident = "Packard Bell EasyNote MZ35",
581 	 .matches = {
582 		DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"),
583 		DMI_MATCH(DMI_PRODUCT_NAME, "EasyNote MZ35"),
584 		},
585 	},
586 	{}
587 };
588 
589 static unsigned long long
acpi_video_bqc_value_to_level(struct acpi_video_device * device,unsigned long long bqc_value)590 acpi_video_bqc_value_to_level(struct acpi_video_device *device,
591 			      unsigned long long bqc_value)
592 {
593 	unsigned long long level;
594 
595 	if (device->brightness->flags._BQC_use_index) {
596 		/*
597 		 * _BQC returns an index that doesn't account for the first 2
598 		 * items with special meaning (see enum acpi_video_level_idx),
599 		 * so we need to compensate for that by offsetting ourselves
600 		 */
601 		if (device->brightness->flags._BCL_reversed)
602 			bqc_value = device->brightness->count -
603 				ACPI_VIDEO_FIRST_LEVEL - 1 - bqc_value;
604 
605 		level = device->brightness->levels[bqc_value +
606 						   ACPI_VIDEO_FIRST_LEVEL];
607 	} else {
608 		level = bqc_value;
609 	}
610 
611 	level += bqc_offset_aml_bug_workaround;
612 
613 	return level;
614 }
615 
616 static int
acpi_video_device_lcd_get_level_current(struct acpi_video_device * device,unsigned long long * level,bool raw)617 acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
618 					unsigned long long *level, bool raw)
619 {
620 	acpi_status status = AE_OK;
621 	int i;
622 
623 	if (device->cap._BQC || device->cap._BCQ) {
624 		char *buf = device->cap._BQC ? "_BQC" : "_BCQ";
625 
626 		status = acpi_evaluate_integer(device->dev->handle, buf,
627 						NULL, level);
628 		if (ACPI_SUCCESS(status)) {
629 			if (raw) {
630 				/*
631 				 * Caller has indicated he wants the raw
632 				 * value returned by _BQC, so don't furtherly
633 				 * mess with the value.
634 				 */
635 				return 0;
636 			}
637 
638 			*level = acpi_video_bqc_value_to_level(device, *level);
639 
640 			for (i = ACPI_VIDEO_FIRST_LEVEL;
641 			     i < device->brightness->count; i++)
642 				if (device->brightness->levels[i] == *level) {
643 					device->brightness->curr = *level;
644 					return 0;
645 				}
646 			/*
647 			 * BQC returned an invalid level.
648 			 * Stop using it.
649 			 */
650 			ACPI_WARNING((AE_INFO,
651 				      "%s returned an invalid level",
652 				      buf));
653 			device->cap._BQC = device->cap._BCQ = 0;
654 		} else {
655 			/*
656 			 * Fixme:
657 			 * should we return an error or ignore this failure?
658 			 * dev->brightness->curr is a cached value which stores
659 			 * the correct current backlight level in most cases.
660 			 * ACPI video backlight still works w/ buggy _BQC.
661 			 * http://bugzilla.kernel.org/show_bug.cgi?id=12233
662 			 */
663 			ACPI_WARNING((AE_INFO, "Evaluating %s failed", buf));
664 			device->cap._BQC = device->cap._BCQ = 0;
665 		}
666 	}
667 
668 	*level = device->brightness->curr;
669 	return 0;
670 }
671 
672 static int
acpi_video_device_EDID(struct acpi_video_device * device,union acpi_object ** edid,ssize_t length)673 acpi_video_device_EDID(struct acpi_video_device *device,
674 		       union acpi_object **edid, ssize_t length)
675 {
676 	int status;
677 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
678 	union acpi_object *obj;
679 	union acpi_object arg0 = { ACPI_TYPE_INTEGER };
680 	struct acpi_object_list args = { 1, &arg0 };
681 
682 
683 	*edid = NULL;
684 
685 	if (!device)
686 		return -ENODEV;
687 	if (length == 128)
688 		arg0.integer.value = 1;
689 	else if (length == 256)
690 		arg0.integer.value = 2;
691 	else
692 		return -EINVAL;
693 
694 	status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer);
695 	if (ACPI_FAILURE(status))
696 		return -ENODEV;
697 
698 	obj = buffer.pointer;
699 
700 	if (obj && obj->type == ACPI_TYPE_BUFFER)
701 		*edid = obj;
702 	else {
703 		printk(KERN_ERR PREFIX "Invalid _DDC data\n");
704 		status = -EFAULT;
705 		kfree(obj);
706 	}
707 
708 	return status;
709 }
710 
711 /* bus */
712 
713 /*
714  *  Arg:
715  *	video		: video bus device pointer
716  *	bios_flag	:
717  *		0.	The system BIOS should NOT automatically switch(toggle)
718  *			the active display output.
719  *		1.	The system BIOS should automatically switch (toggle) the
720  *			active display output. No switch event.
721  *		2.	The _DGS value should be locked.
722  *		3.	The system BIOS should not automatically switch (toggle) the
723  *			active display output, but instead generate the display switch
724  *			event notify code.
725  *	lcd_flag	:
726  *		0.	The system BIOS should automatically control the brightness level
727  *			of the LCD when:
728  *			- the power changes from AC to DC (ACPI appendix B)
729  *			- a brightness hotkey gets pressed (implied by Win7/8 backlight docs)
730  *		1.	The system BIOS should NOT automatically control the brightness
731  *			level of the LCD when:
732  *			- the power changes from AC to DC (ACPI appendix B)
733  *			- a brightness hotkey gets pressed (implied by Win7/8 backlight docs)
734  *  Return Value:
735  *		-EINVAL	wrong arg.
736  */
737 
738 static int
acpi_video_bus_DOS(struct acpi_video_bus * video,int bios_flag,int lcd_flag)739 acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
740 {
741 	acpi_status status;
742 
743 	if (!video->cap._DOS)
744 		return 0;
745 
746 	if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1)
747 		return -EINVAL;
748 	video->dos_setting = (lcd_flag << 2) | bios_flag;
749 	status = acpi_execute_simple_method(video->device->handle, "_DOS",
750 					    (lcd_flag << 2) | bios_flag);
751 	if (ACPI_FAILURE(status))
752 		return -EIO;
753 
754 	return 0;
755 }
756 
757 /*
758  * Simple comparison function used to sort backlight levels.
759  */
760 
761 static int
acpi_video_cmp_level(const void * a,const void * b)762 acpi_video_cmp_level(const void *a, const void *b)
763 {
764 	return *(int *)a - *(int *)b;
765 }
766 
767 /*
768  * Decides if _BQC/_BCQ for this system is usable
769  *
770  * We do this by changing the level first and then read out the current
771  * brightness level, if the value does not match, find out if it is using
772  * index. If not, clear the _BQC/_BCQ capability.
773  */
acpi_video_bqc_quirk(struct acpi_video_device * device,int max_level,int current_level)774 static int acpi_video_bqc_quirk(struct acpi_video_device *device,
775 				int max_level, int current_level)
776 {
777 	struct acpi_video_device_brightness *br = device->brightness;
778 	int result;
779 	unsigned long long level;
780 	int test_level;
781 
782 	/* don't mess with existing known broken systems */
783 	if (bqc_offset_aml_bug_workaround)
784 		return 0;
785 
786 	/*
787 	 * Some systems always report current brightness level as maximum
788 	 * through _BQC, we need to test another value for them. However,
789 	 * there is a subtlety:
790 	 *
791 	 * If the _BCL package ordering is descending, the first level
792 	 * (br->levels[2]) is likely to be 0, and if the number of levels
793 	 * matches the number of steps, we might confuse a returned level to
794 	 * mean the index.
795 	 *
796 	 * For example:
797 	 *
798 	 *     current_level = max_level = 100
799 	 *     test_level = 0
800 	 *     returned level = 100
801 	 *
802 	 * In this case 100 means the level, not the index, and _BCM failed.
803 	 * Still, if the _BCL package ordering is descending, the index of
804 	 * level 0 is also 100, so we assume _BQC is indexed, when it's not.
805 	 *
806 	 * This causes all _BQC calls to return bogus values causing weird
807 	 * behavior from the user's perspective.  For example:
808 	 *
809 	 * xbacklight -set 10; xbacklight -set 20;
810 	 *
811 	 * would flash to 90% and then slowly down to the desired level (20).
812 	 *
813 	 * The solution is simple; test anything other than the first level
814 	 * (e.g. 1).
815 	 */
816 	test_level = current_level == max_level
817 		? br->levels[ACPI_VIDEO_FIRST_LEVEL + 1]
818 		: max_level;
819 
820 	result = acpi_video_device_lcd_set_level(device, test_level);
821 	if (result)
822 		return result;
823 
824 	result = acpi_video_device_lcd_get_level_current(device, &level, true);
825 	if (result)
826 		return result;
827 
828 	if (level != test_level) {
829 		/* buggy _BQC found, need to find out if it uses index */
830 		if (level < br->count) {
831 			if (br->flags._BCL_reversed)
832 				level = br->count - ACPI_VIDEO_FIRST_LEVEL - 1 - level;
833 			if (br->levels[level + ACPI_VIDEO_FIRST_LEVEL] == test_level)
834 				br->flags._BQC_use_index = 1;
835 		}
836 
837 		if (!br->flags._BQC_use_index)
838 			device->cap._BQC = device->cap._BCQ = 0;
839 	}
840 
841 	return 0;
842 }
843 
acpi_video_get_levels(struct acpi_device * device,struct acpi_video_device_brightness ** dev_br,int * pmax_level)844 int acpi_video_get_levels(struct acpi_device *device,
845 			  struct acpi_video_device_brightness **dev_br,
846 			  int *pmax_level)
847 {
848 	union acpi_object *obj = NULL;
849 	int i, max_level = 0, count = 0, level_ac_battery = 0;
850 	union acpi_object *o;
851 	struct acpi_video_device_brightness *br = NULL;
852 	int result = 0;
853 	u32 value;
854 
855 	if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device->handle,
856 								&obj))) {
857 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available "
858 						"LCD brightness level\n"));
859 		result = -ENODEV;
860 		goto out;
861 	}
862 
863 	if (obj->package.count < ACPI_VIDEO_FIRST_LEVEL) {
864 		result = -EINVAL;
865 		goto out;
866 	}
867 
868 	br = kzalloc(sizeof(*br), GFP_KERNEL);
869 	if (!br) {
870 		printk(KERN_ERR "can't allocate memory\n");
871 		result = -ENOMEM;
872 		goto out;
873 	}
874 
875 	/*
876 	 * Note that we have to reserve 2 extra items (ACPI_VIDEO_FIRST_LEVEL),
877 	 * in order to account for buggy BIOS which don't export the first two
878 	 * special levels (see below)
879 	 */
880 	br->levels = kmalloc_array(obj->package.count + ACPI_VIDEO_FIRST_LEVEL,
881 				   sizeof(*br->levels),
882 				   GFP_KERNEL);
883 	if (!br->levels) {
884 		result = -ENOMEM;
885 		goto out_free;
886 	}
887 
888 	for (i = 0; i < obj->package.count; i++) {
889 		o = (union acpi_object *)&obj->package.elements[i];
890 		if (o->type != ACPI_TYPE_INTEGER) {
891 			printk(KERN_ERR PREFIX "Invalid data\n");
892 			continue;
893 		}
894 		value = (u32) o->integer.value;
895 		/* Skip duplicate entries */
896 		if (count > ACPI_VIDEO_FIRST_LEVEL
897 		    && br->levels[count - 1] == value)
898 			continue;
899 
900 		br->levels[count] = value;
901 
902 		if (br->levels[count] > max_level)
903 			max_level = br->levels[count];
904 		count++;
905 	}
906 
907 	/*
908 	 * some buggy BIOS don't export the levels
909 	 * when machine is on AC/Battery in _BCL package.
910 	 * In this case, the first two elements in _BCL packages
911 	 * are also supported brightness levels that OS should take care of.
912 	 */
913 	for (i = ACPI_VIDEO_FIRST_LEVEL; i < count; i++) {
914 		if (br->levels[i] == br->levels[ACPI_VIDEO_AC_LEVEL])
915 			level_ac_battery++;
916 		if (br->levels[i] == br->levels[ACPI_VIDEO_BATTERY_LEVEL])
917 			level_ac_battery++;
918 	}
919 
920 	if (level_ac_battery < ACPI_VIDEO_FIRST_LEVEL) {
921 		level_ac_battery = ACPI_VIDEO_FIRST_LEVEL - level_ac_battery;
922 		br->flags._BCL_no_ac_battery_levels = 1;
923 		for (i = (count - 1 + level_ac_battery);
924 		     i >= ACPI_VIDEO_FIRST_LEVEL; i--)
925 			br->levels[i] = br->levels[i - level_ac_battery];
926 		count += level_ac_battery;
927 	} else if (level_ac_battery > ACPI_VIDEO_FIRST_LEVEL)
928 		ACPI_ERROR((AE_INFO, "Too many duplicates in _BCL package"));
929 
930 	/* Check if the _BCL package is in a reversed order */
931 	if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) {
932 		br->flags._BCL_reversed = 1;
933 		sort(&br->levels[ACPI_VIDEO_FIRST_LEVEL],
934 		     count - ACPI_VIDEO_FIRST_LEVEL,
935 		     sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]),
936 		     acpi_video_cmp_level, NULL);
937 	} else if (max_level != br->levels[count - 1])
938 		ACPI_ERROR((AE_INFO,
939 			    "Found unordered _BCL package"));
940 
941 	br->count = count;
942 	*dev_br = br;
943 	if (pmax_level)
944 		*pmax_level = max_level;
945 
946 out:
947 	kfree(obj);
948 	return result;
949 out_free:
950 	kfree(br);
951 	goto out;
952 }
953 EXPORT_SYMBOL(acpi_video_get_levels);
954 
955 /*
956  *  Arg:
957  *	device	: video output device (LCD, CRT, ..)
958  *
959  *  Return Value:
960  *	Maximum brightness level
961  *
962  *  Allocate and initialize device->brightness.
963  */
964 
965 static int
acpi_video_init_brightness(struct acpi_video_device * device)966 acpi_video_init_brightness(struct acpi_video_device *device)
967 {
968 	int i, max_level = 0;
969 	unsigned long long level, level_old;
970 	struct acpi_video_device_brightness *br = NULL;
971 	int result;
972 
973 	result = acpi_video_get_levels(device->dev, &br, &max_level);
974 	if (result)
975 		return result;
976 	device->brightness = br;
977 
978 	/* _BQC uses INDEX while _BCL uses VALUE in some laptops */
979 	br->curr = level = max_level;
980 
981 	if (!device->cap._BQC)
982 		goto set_level;
983 
984 	result = acpi_video_device_lcd_get_level_current(device,
985 							 &level_old, true);
986 	if (result)
987 		goto out_free_levels;
988 
989 	result = acpi_video_bqc_quirk(device, max_level, level_old);
990 	if (result)
991 		goto out_free_levels;
992 	/*
993 	 * cap._BQC may get cleared due to _BQC is found to be broken
994 	 * in acpi_video_bqc_quirk, so check again here.
995 	 */
996 	if (!device->cap._BQC)
997 		goto set_level;
998 
999 	level = acpi_video_bqc_value_to_level(device, level_old);
1000 	/*
1001 	 * On some buggy laptops, _BQC returns an uninitialized
1002 	 * value when invoked for the first time, i.e.
1003 	 * level_old is invalid (no matter whether it's a level
1004 	 * or an index). Set the backlight to max_level in this case.
1005 	 */
1006 	for (i = ACPI_VIDEO_FIRST_LEVEL; i < br->count; i++)
1007 		if (level == br->levels[i])
1008 			break;
1009 	if (i == br->count || !level)
1010 		level = max_level;
1011 
1012 set_level:
1013 	result = acpi_video_device_lcd_set_level(device, level);
1014 	if (result)
1015 		goto out_free_levels;
1016 
1017 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1018 			  "found %d brightness levels\n",
1019 			  br->count - ACPI_VIDEO_FIRST_LEVEL));
1020 	return 0;
1021 
1022 out_free_levels:
1023 	kfree(br->levels);
1024 	kfree(br);
1025 	device->brightness = NULL;
1026 	return result;
1027 }
1028 
1029 /*
1030  *  Arg:
1031  *	device	: video output device (LCD, CRT, ..)
1032  *
1033  *  Return Value:
1034  *	None
1035  *
1036  *  Find out all required AML methods defined under the output
1037  *  device.
1038  */
1039 
acpi_video_device_find_cap(struct acpi_video_device * device)1040 static void acpi_video_device_find_cap(struct acpi_video_device *device)
1041 {
1042 	if (acpi_has_method(device->dev->handle, "_ADR"))
1043 		device->cap._ADR = 1;
1044 	if (acpi_has_method(device->dev->handle, "_BCL"))
1045 		device->cap._BCL = 1;
1046 	if (acpi_has_method(device->dev->handle, "_BCM"))
1047 		device->cap._BCM = 1;
1048 	if (acpi_has_method(device->dev->handle, "_BQC")) {
1049 		device->cap._BQC = 1;
1050 	} else if (acpi_has_method(device->dev->handle, "_BCQ")) {
1051 		printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n");
1052 		device->cap._BCQ = 1;
1053 	}
1054 
1055 	if (acpi_has_method(device->dev->handle, "_DDC"))
1056 		device->cap._DDC = 1;
1057 }
1058 
1059 /*
1060  *  Arg:
1061  *	device	: video output device (VGA)
1062  *
1063  *  Return Value:
1064  *	None
1065  *
1066  *  Find out all required AML methods defined under the video bus device.
1067  */
1068 
acpi_video_bus_find_cap(struct acpi_video_bus * video)1069 static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
1070 {
1071 	if (acpi_has_method(video->device->handle, "_DOS"))
1072 		video->cap._DOS = 1;
1073 	if (acpi_has_method(video->device->handle, "_DOD"))
1074 		video->cap._DOD = 1;
1075 	if (acpi_has_method(video->device->handle, "_ROM"))
1076 		video->cap._ROM = 1;
1077 	if (acpi_has_method(video->device->handle, "_GPD"))
1078 		video->cap._GPD = 1;
1079 	if (acpi_has_method(video->device->handle, "_SPD"))
1080 		video->cap._SPD = 1;
1081 	if (acpi_has_method(video->device->handle, "_VPO"))
1082 		video->cap._VPO = 1;
1083 }
1084 
1085 /*
1086  * Check whether the video bus device has required AML method to
1087  * support the desired features
1088  */
1089 
acpi_video_bus_check(struct acpi_video_bus * video)1090 static int acpi_video_bus_check(struct acpi_video_bus *video)
1091 {
1092 	acpi_status status = -ENOENT;
1093 	struct pci_dev *dev;
1094 
1095 	if (!video)
1096 		return -EINVAL;
1097 
1098 	dev = acpi_get_pci_dev(video->device->handle);
1099 	if (!dev)
1100 		return -ENODEV;
1101 	pci_dev_put(dev);
1102 
1103 	/*
1104 	 * Since there is no HID, CID and so on for VGA driver, we have
1105 	 * to check well known required nodes.
1106 	 */
1107 
1108 	/* Does this device support video switching? */
1109 	if (video->cap._DOS || video->cap._DOD) {
1110 		if (!video->cap._DOS) {
1111 			printk(KERN_WARNING FW_BUG
1112 				"ACPI(%s) defines _DOD but not _DOS\n",
1113 				acpi_device_bid(video->device));
1114 		}
1115 		video->flags.multihead = 1;
1116 		status = 0;
1117 	}
1118 
1119 	/* Does this device support retrieving a video ROM? */
1120 	if (video->cap._ROM) {
1121 		video->flags.rom = 1;
1122 		status = 0;
1123 	}
1124 
1125 	/* Does this device support configuring which video device to POST? */
1126 	if (video->cap._GPD && video->cap._SPD && video->cap._VPO) {
1127 		video->flags.post = 1;
1128 		status = 0;
1129 	}
1130 
1131 	return status;
1132 }
1133 
1134 /*
1135  * --------------------------------------------------------------------------
1136  *                               Driver Interface
1137  * --------------------------------------------------------------------------
1138  */
1139 
1140 /* device interface */
1141 static struct acpi_video_device_attrib *
acpi_video_get_device_attr(struct acpi_video_bus * video,unsigned long device_id)1142 acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
1143 {
1144 	struct acpi_video_enumerated_device *ids;
1145 	int i;
1146 
1147 	for (i = 0; i < video->attached_count; i++) {
1148 		ids = &video->attached_array[i];
1149 		if ((ids->value.int_val & 0xffff) == device_id)
1150 			return &ids->value.attrib;
1151 	}
1152 
1153 	return NULL;
1154 }
1155 
1156 static int
acpi_video_get_device_type(struct acpi_video_bus * video,unsigned long device_id)1157 acpi_video_get_device_type(struct acpi_video_bus *video,
1158 			   unsigned long device_id)
1159 {
1160 	struct acpi_video_enumerated_device *ids;
1161 	int i;
1162 
1163 	for (i = 0; i < video->attached_count; i++) {
1164 		ids = &video->attached_array[i];
1165 		if ((ids->value.int_val & 0xffff) == device_id)
1166 			return ids->value.int_val;
1167 	}
1168 
1169 	return 0;
1170 }
1171 
1172 static int
acpi_video_bus_get_one_device(struct acpi_device * device,struct acpi_video_bus * video)1173 acpi_video_bus_get_one_device(struct acpi_device *device,
1174 			      struct acpi_video_bus *video)
1175 {
1176 	unsigned long long device_id;
1177 	int status, device_type;
1178 	struct acpi_video_device *data;
1179 	struct acpi_video_device_attrib *attribute;
1180 
1181 	status =
1182 	    acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
1183 	/* Some device omits _ADR, we skip them instead of fail */
1184 	if (ACPI_FAILURE(status))
1185 		return 0;
1186 
1187 	data = kzalloc(sizeof(struct acpi_video_device), GFP_KERNEL);
1188 	if (!data)
1189 		return -ENOMEM;
1190 
1191 	strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME);
1192 	strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
1193 	device->driver_data = data;
1194 
1195 	data->device_id = device_id;
1196 	data->video = video;
1197 	data->dev = device;
1198 	INIT_DELAYED_WORK(&data->switch_brightness_work,
1199 			  acpi_video_switch_brightness);
1200 
1201 	attribute = acpi_video_get_device_attr(video, device_id);
1202 
1203 	if (attribute && (attribute->device_id_scheme || device_id_scheme)) {
1204 		switch (attribute->display_type) {
1205 		case ACPI_VIDEO_DISPLAY_CRT:
1206 			data->flags.crt = 1;
1207 			break;
1208 		case ACPI_VIDEO_DISPLAY_TV:
1209 			data->flags.tvout = 1;
1210 			break;
1211 		case ACPI_VIDEO_DISPLAY_DVI:
1212 			data->flags.dvi = 1;
1213 			break;
1214 		case ACPI_VIDEO_DISPLAY_LCD:
1215 			data->flags.lcd = 1;
1216 			break;
1217 		default:
1218 			data->flags.unknown = 1;
1219 			break;
1220 		}
1221 		if (attribute->bios_can_detect)
1222 			data->flags.bios = 1;
1223 	} else {
1224 		/* Check for legacy IDs */
1225 		device_type = acpi_video_get_device_type(video, device_id);
1226 		/* Ignore bits 16 and 18-20 */
1227 		switch (device_type & 0xffe2ffff) {
1228 		case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
1229 			data->flags.crt = 1;
1230 			break;
1231 		case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
1232 			data->flags.lcd = 1;
1233 			break;
1234 		case ACPI_VIDEO_DISPLAY_LEGACY_TV:
1235 			data->flags.tvout = 1;
1236 			break;
1237 		default:
1238 			data->flags.unknown = 1;
1239 		}
1240 	}
1241 
1242 	acpi_video_device_bind(video, data);
1243 	acpi_video_device_find_cap(data);
1244 
1245 	mutex_lock(&video->device_list_lock);
1246 	list_add_tail(&data->entry, &video->video_device_list);
1247 	mutex_unlock(&video->device_list_lock);
1248 
1249 	return status;
1250 }
1251 
1252 /*
1253  *  Arg:
1254  *	video	: video bus device
1255  *
1256  *  Return:
1257  *	none
1258  *
1259  *  Enumerate the video device list of the video bus,
1260  *  bind the ids with the corresponding video devices
1261  *  under the video bus.
1262  */
1263 
acpi_video_device_rebind(struct acpi_video_bus * video)1264 static void acpi_video_device_rebind(struct acpi_video_bus *video)
1265 {
1266 	struct acpi_video_device *dev;
1267 
1268 	mutex_lock(&video->device_list_lock);
1269 
1270 	list_for_each_entry(dev, &video->video_device_list, entry)
1271 		acpi_video_device_bind(video, dev);
1272 
1273 	mutex_unlock(&video->device_list_lock);
1274 }
1275 
1276 /*
1277  *  Arg:
1278  *	video	: video bus device
1279  *	device	: video output device under the video
1280  *		bus
1281  *
1282  *  Return:
1283  *	none
1284  *
1285  *  Bind the ids with the corresponding video devices
1286  *  under the video bus.
1287  */
1288 
1289 static void
acpi_video_device_bind(struct acpi_video_bus * video,struct acpi_video_device * device)1290 acpi_video_device_bind(struct acpi_video_bus *video,
1291 		       struct acpi_video_device *device)
1292 {
1293 	struct acpi_video_enumerated_device *ids;
1294 	int i;
1295 
1296 	for (i = 0; i < video->attached_count; i++) {
1297 		ids = &video->attached_array[i];
1298 		if (device->device_id == (ids->value.int_val & 0xffff)) {
1299 			ids->bind_info = device;
1300 			ACPI_DEBUG_PRINT((ACPI_DB_INFO, "device_bind %d\n", i));
1301 		}
1302 	}
1303 }
1304 
acpi_video_device_in_dod(struct acpi_video_device * device)1305 static bool acpi_video_device_in_dod(struct acpi_video_device *device)
1306 {
1307 	struct acpi_video_bus *video = device->video;
1308 	int i;
1309 
1310 	/*
1311 	 * If we have a broken _DOD or we have more than 8 output devices
1312 	 * under the graphics controller node that we can't proper deal with
1313 	 * in the operation region code currently, no need to test.
1314 	 */
1315 	if (!video->attached_count || video->child_count > 8)
1316 		return true;
1317 
1318 	for (i = 0; i < video->attached_count; i++) {
1319 		if ((video->attached_array[i].value.int_val & 0xfff) ==
1320 		    (device->device_id & 0xfff))
1321 			return true;
1322 	}
1323 
1324 	return false;
1325 }
1326 
1327 /*
1328  *  Arg:
1329  *	video	: video bus device
1330  *
1331  *  Return:
1332  *	< 0	: error
1333  *
1334  *  Call _DOD to enumerate all devices attached to display adapter
1335  *
1336  */
1337 
acpi_video_device_enumerate(struct acpi_video_bus * video)1338 static int acpi_video_device_enumerate(struct acpi_video_bus *video)
1339 {
1340 	int status;
1341 	int count;
1342 	int i;
1343 	struct acpi_video_enumerated_device *active_list;
1344 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
1345 	union acpi_object *dod = NULL;
1346 	union acpi_object *obj;
1347 
1348 	if (!video->cap._DOD)
1349 		return AE_NOT_EXIST;
1350 
1351 	status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
1352 	if (!ACPI_SUCCESS(status)) {
1353 		ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD"));
1354 		return status;
1355 	}
1356 
1357 	dod = buffer.pointer;
1358 	if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
1359 		ACPI_EXCEPTION((AE_INFO, status, "Invalid _DOD data"));
1360 		status = -EFAULT;
1361 		goto out;
1362 	}
1363 
1364 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d video heads in _DOD\n",
1365 			  dod->package.count));
1366 
1367 	active_list = kcalloc(1 + dod->package.count,
1368 			      sizeof(struct acpi_video_enumerated_device),
1369 			      GFP_KERNEL);
1370 	if (!active_list) {
1371 		status = -ENOMEM;
1372 		goto out;
1373 	}
1374 
1375 	count = 0;
1376 	for (i = 0; i < dod->package.count; i++) {
1377 		obj = &dod->package.elements[i];
1378 
1379 		if (obj->type != ACPI_TYPE_INTEGER) {
1380 			printk(KERN_ERR PREFIX
1381 				"Invalid _DOD data in element %d\n", i);
1382 			continue;
1383 		}
1384 
1385 		active_list[count].value.int_val = obj->integer.value;
1386 		active_list[count].bind_info = NULL;
1387 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "dod element[%d] = %d\n", i,
1388 				  (int)obj->integer.value));
1389 		count++;
1390 	}
1391 
1392 	kfree(video->attached_array);
1393 
1394 	video->attached_array = active_list;
1395 	video->attached_count = count;
1396 
1397 out:
1398 	kfree(buffer.pointer);
1399 	return status;
1400 }
1401 
1402 static int
acpi_video_get_next_level(struct acpi_video_device * device,u32 level_current,u32 event)1403 acpi_video_get_next_level(struct acpi_video_device *device,
1404 			  u32 level_current, u32 event)
1405 {
1406 	int min, max, min_above, max_below, i, l, delta = 255;
1407 	max = max_below = 0;
1408 	min = min_above = 255;
1409 	/* Find closest level to level_current */
1410 	for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) {
1411 		l = device->brightness->levels[i];
1412 		if (abs(l - level_current) < abs(delta)) {
1413 			delta = l - level_current;
1414 			if (!delta)
1415 				break;
1416 		}
1417 	}
1418 	/* Ajust level_current to closest available level */
1419 	level_current += delta;
1420 	for (i = ACPI_VIDEO_FIRST_LEVEL; i < device->brightness->count; i++) {
1421 		l = device->brightness->levels[i];
1422 		if (l < min)
1423 			min = l;
1424 		if (l > max)
1425 			max = l;
1426 		if (l < min_above && l > level_current)
1427 			min_above = l;
1428 		if (l > max_below && l < level_current)
1429 			max_below = l;
1430 	}
1431 
1432 	switch (event) {
1433 	case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS:
1434 		return (level_current < max) ? min_above : min;
1435 	case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS:
1436 		return (level_current < max) ? min_above : max;
1437 	case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS:
1438 		return (level_current > min) ? max_below : min;
1439 	case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS:
1440 	case ACPI_VIDEO_NOTIFY_DISPLAY_OFF:
1441 		return 0;
1442 	default:
1443 		return level_current;
1444 	}
1445 }
1446 
1447 static void
acpi_video_switch_brightness(struct work_struct * work)1448 acpi_video_switch_brightness(struct work_struct *work)
1449 {
1450 	struct acpi_video_device *device = container_of(to_delayed_work(work),
1451 			     struct acpi_video_device, switch_brightness_work);
1452 	unsigned long long level_current, level_next;
1453 	int event = device->switch_brightness_event;
1454 	int result = -EINVAL;
1455 
1456 	/* no warning message if acpi_backlight=vendor or a quirk is used */
1457 	if (!device->backlight)
1458 		return;
1459 
1460 	if (!device->brightness)
1461 		goto out;
1462 
1463 	result = acpi_video_device_lcd_get_level_current(device,
1464 							 &level_current,
1465 							 false);
1466 	if (result)
1467 		goto out;
1468 
1469 	level_next = acpi_video_get_next_level(device, level_current, event);
1470 
1471 	result = acpi_video_device_lcd_set_level(device, level_next);
1472 
1473 	if (!result)
1474 		backlight_force_update(device->backlight,
1475 				       BACKLIGHT_UPDATE_HOTKEY);
1476 
1477 out:
1478 	if (result)
1479 		printk(KERN_ERR PREFIX "Failed to switch the brightness\n");
1480 }
1481 
acpi_video_get_edid(struct acpi_device * device,int type,int device_id,void ** edid)1482 int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
1483 			void **edid)
1484 {
1485 	struct acpi_video_bus *video;
1486 	struct acpi_video_device *video_device;
1487 	union acpi_object *buffer = NULL;
1488 	acpi_status status;
1489 	int i, length;
1490 
1491 	if (!device || !acpi_driver_data(device))
1492 		return -EINVAL;
1493 
1494 	video = acpi_driver_data(device);
1495 
1496 	for (i = 0; i < video->attached_count; i++) {
1497 		video_device = video->attached_array[i].bind_info;
1498 		length = 256;
1499 
1500 		if (!video_device)
1501 			continue;
1502 
1503 		if (!video_device->cap._DDC)
1504 			continue;
1505 
1506 		if (type) {
1507 			switch (type) {
1508 			case ACPI_VIDEO_DISPLAY_CRT:
1509 				if (!video_device->flags.crt)
1510 					continue;
1511 				break;
1512 			case ACPI_VIDEO_DISPLAY_TV:
1513 				if (!video_device->flags.tvout)
1514 					continue;
1515 				break;
1516 			case ACPI_VIDEO_DISPLAY_DVI:
1517 				if (!video_device->flags.dvi)
1518 					continue;
1519 				break;
1520 			case ACPI_VIDEO_DISPLAY_LCD:
1521 				if (!video_device->flags.lcd)
1522 					continue;
1523 				break;
1524 			}
1525 		} else if (video_device->device_id != device_id) {
1526 			continue;
1527 		}
1528 
1529 		status = acpi_video_device_EDID(video_device, &buffer, length);
1530 
1531 		if (ACPI_FAILURE(status) || !buffer ||
1532 		    buffer->type != ACPI_TYPE_BUFFER) {
1533 			length = 128;
1534 			status = acpi_video_device_EDID(video_device, &buffer,
1535 							length);
1536 			if (ACPI_FAILURE(status) || !buffer ||
1537 			    buffer->type != ACPI_TYPE_BUFFER) {
1538 				continue;
1539 			}
1540 		}
1541 
1542 		*edid = buffer->buffer.pointer;
1543 		return length;
1544 	}
1545 
1546 	return -ENODEV;
1547 }
1548 EXPORT_SYMBOL(acpi_video_get_edid);
1549 
1550 static int
acpi_video_bus_get_devices(struct acpi_video_bus * video,struct acpi_device * device)1551 acpi_video_bus_get_devices(struct acpi_video_bus *video,
1552 			   struct acpi_device *device)
1553 {
1554 	int status = 0;
1555 	struct acpi_device *dev;
1556 
1557 	/*
1558 	 * There are systems where video module known to work fine regardless
1559 	 * of broken _DOD and ignoring returned value here doesn't cause
1560 	 * any issues later.
1561 	 */
1562 	acpi_video_device_enumerate(video);
1563 
1564 	list_for_each_entry(dev, &device->children, node) {
1565 
1566 		status = acpi_video_bus_get_one_device(dev, video);
1567 		if (status) {
1568 			dev_err(&dev->dev, "Can't attach device\n");
1569 			break;
1570 		}
1571 		video->child_count++;
1572 	}
1573 	return status;
1574 }
1575 
1576 /* acpi_video interface */
1577 
1578 /*
1579  * Win8 requires setting bit2 of _DOS to let firmware know it shouldn't
1580  * preform any automatic brightness change on receiving a notification.
1581  */
acpi_video_bus_start_devices(struct acpi_video_bus * video)1582 static int acpi_video_bus_start_devices(struct acpi_video_bus *video)
1583 {
1584 	return acpi_video_bus_DOS(video, 0,
1585 				  acpi_osi_is_win8() ? 1 : 0);
1586 }
1587 
acpi_video_bus_stop_devices(struct acpi_video_bus * video)1588 static int acpi_video_bus_stop_devices(struct acpi_video_bus *video)
1589 {
1590 	return acpi_video_bus_DOS(video, 0,
1591 				  acpi_osi_is_win8() ? 0 : 1);
1592 }
1593 
acpi_video_bus_notify(struct acpi_device * device,u32 event)1594 static void acpi_video_bus_notify(struct acpi_device *device, u32 event)
1595 {
1596 	struct acpi_video_bus *video = acpi_driver_data(device);
1597 	struct input_dev *input;
1598 	int keycode = 0;
1599 
1600 	if (!video || !video->input)
1601 		return;
1602 
1603 	input = video->input;
1604 
1605 	switch (event) {
1606 	case ACPI_VIDEO_NOTIFY_SWITCH:	/* User requested a switch,
1607 					 * most likely via hotkey. */
1608 		keycode = KEY_SWITCHVIDEOMODE;
1609 		break;
1610 
1611 	case ACPI_VIDEO_NOTIFY_PROBE:	/* User plugged in or removed a video
1612 					 * connector. */
1613 		acpi_video_device_enumerate(video);
1614 		acpi_video_device_rebind(video);
1615 		keycode = KEY_SWITCHVIDEOMODE;
1616 		break;
1617 
1618 	case ACPI_VIDEO_NOTIFY_CYCLE:	/* Cycle Display output hotkey pressed. */
1619 		keycode = KEY_SWITCHVIDEOMODE;
1620 		break;
1621 	case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:	/* Next Display output hotkey pressed. */
1622 		keycode = KEY_VIDEO_NEXT;
1623 		break;
1624 	case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:	/* previous Display output hotkey pressed. */
1625 		keycode = KEY_VIDEO_PREV;
1626 		break;
1627 
1628 	default:
1629 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1630 				  "Unsupported event [0x%x]\n", event));
1631 		break;
1632 	}
1633 
1634 	if (acpi_notifier_call_chain(device, event, 0))
1635 		/* Something vetoed the keypress. */
1636 		keycode = 0;
1637 
1638 	if (keycode && (report_key_events & REPORT_OUTPUT_KEY_EVENTS)) {
1639 		input_report_key(input, keycode, 1);
1640 		input_sync(input);
1641 		input_report_key(input, keycode, 0);
1642 		input_sync(input);
1643 	}
1644 
1645 	return;
1646 }
1647 
brightness_switch_event(struct acpi_video_device * video_device,u32 event)1648 static void brightness_switch_event(struct acpi_video_device *video_device,
1649 				    u32 event)
1650 {
1651 	if (!brightness_switch_enabled)
1652 		return;
1653 
1654 	video_device->switch_brightness_event = event;
1655 	schedule_delayed_work(&video_device->switch_brightness_work, HZ / 10);
1656 }
1657 
acpi_video_device_notify(acpi_handle handle,u32 event,void * data)1658 static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
1659 {
1660 	struct acpi_video_device *video_device = data;
1661 	struct acpi_device *device = NULL;
1662 	struct acpi_video_bus *bus;
1663 	struct input_dev *input;
1664 	int keycode = 0;
1665 
1666 	if (!video_device)
1667 		return;
1668 
1669 	device = video_device->dev;
1670 	bus = video_device->video;
1671 	input = bus->input;
1672 
1673 	if (hw_changes_brightness > 0) {
1674 		if (video_device->backlight)
1675 			backlight_force_update(video_device->backlight,
1676 					       BACKLIGHT_UPDATE_HOTKEY);
1677 		acpi_notifier_call_chain(device, event, 0);
1678 		return;
1679 	}
1680 
1681 	switch (event) {
1682 	case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS:	/* Cycle brightness */
1683 		brightness_switch_event(video_device, event);
1684 		keycode = KEY_BRIGHTNESS_CYCLE;
1685 		break;
1686 	case ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS:	/* Increase brightness */
1687 		brightness_switch_event(video_device, event);
1688 		keycode = KEY_BRIGHTNESSUP;
1689 		break;
1690 	case ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS:	/* Decrease brightness */
1691 		brightness_switch_event(video_device, event);
1692 		keycode = KEY_BRIGHTNESSDOWN;
1693 		break;
1694 	case ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS:	/* zero brightness */
1695 		brightness_switch_event(video_device, event);
1696 		keycode = KEY_BRIGHTNESS_ZERO;
1697 		break;
1698 	case ACPI_VIDEO_NOTIFY_DISPLAY_OFF:	/* display device off */
1699 		brightness_switch_event(video_device, event);
1700 		keycode = KEY_DISPLAY_OFF;
1701 		break;
1702 	default:
1703 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1704 				  "Unsupported event [0x%x]\n", event));
1705 		break;
1706 	}
1707 
1708 	acpi_notifier_call_chain(device, event, 0);
1709 
1710 	if (keycode && (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS)) {
1711 		input_report_key(input, keycode, 1);
1712 		input_sync(input);
1713 		input_report_key(input, keycode, 0);
1714 		input_sync(input);
1715 	}
1716 
1717 	return;
1718 }
1719 
acpi_video_resume(struct notifier_block * nb,unsigned long val,void * ign)1720 static int acpi_video_resume(struct notifier_block *nb,
1721 				unsigned long val, void *ign)
1722 {
1723 	struct acpi_video_bus *video;
1724 	struct acpi_video_device *video_device;
1725 	int i;
1726 
1727 	switch (val) {
1728 	case PM_HIBERNATION_PREPARE:
1729 	case PM_SUSPEND_PREPARE:
1730 	case PM_RESTORE_PREPARE:
1731 		return NOTIFY_DONE;
1732 	}
1733 
1734 	video = container_of(nb, struct acpi_video_bus, pm_nb);
1735 
1736 	dev_info(&video->device->dev, "Restoring backlight state\n");
1737 
1738 	for (i = 0; i < video->attached_count; i++) {
1739 		video_device = video->attached_array[i].bind_info;
1740 		if (video_device && video_device->brightness)
1741 			acpi_video_device_lcd_set_level(video_device,
1742 					video_device->brightness->curr);
1743 	}
1744 
1745 	return NOTIFY_OK;
1746 }
1747 
1748 static acpi_status
acpi_video_bus_match(acpi_handle handle,u32 level,void * context,void ** return_value)1749 acpi_video_bus_match(acpi_handle handle, u32 level, void *context,
1750 			void **return_value)
1751 {
1752 	struct acpi_device *device = context;
1753 	struct acpi_device *sibling;
1754 	int result;
1755 
1756 	if (handle == device->handle)
1757 		return AE_CTRL_TERMINATE;
1758 
1759 	result = acpi_bus_get_device(handle, &sibling);
1760 	if (result)
1761 		return AE_OK;
1762 
1763 	if (!strcmp(acpi_device_name(sibling), ACPI_VIDEO_BUS_NAME))
1764 			return AE_ALREADY_EXISTS;
1765 
1766 	return AE_OK;
1767 }
1768 
acpi_video_dev_register_backlight(struct acpi_video_device * device)1769 static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
1770 {
1771 	struct backlight_properties props;
1772 	struct pci_dev *pdev;
1773 	acpi_handle acpi_parent;
1774 	struct device *parent = NULL;
1775 	int result;
1776 	static int count;
1777 	char *name;
1778 
1779 	result = acpi_video_init_brightness(device);
1780 	if (result)
1781 		return;
1782 
1783 	if (disable_backlight_sysfs_if > 0)
1784 		return;
1785 
1786 	name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
1787 	if (!name)
1788 		return;
1789 	count++;
1790 
1791 	if (ACPI_SUCCESS(acpi_get_parent(device->dev->handle, &acpi_parent))) {
1792 		pdev = acpi_get_pci_dev(acpi_parent);
1793 		if (pdev) {
1794 			parent = &pdev->dev;
1795 			pci_dev_put(pdev);
1796 		}
1797 	}
1798 
1799 	memset(&props, 0, sizeof(struct backlight_properties));
1800 	props.type = BACKLIGHT_FIRMWARE;
1801 	props.max_brightness =
1802 		device->brightness->count - ACPI_VIDEO_FIRST_LEVEL - 1;
1803 	device->backlight = backlight_device_register(name,
1804 						      parent,
1805 						      device,
1806 						      &acpi_backlight_ops,
1807 						      &props);
1808 	kfree(name);
1809 	if (IS_ERR(device->backlight)) {
1810 		device->backlight = NULL;
1811 		return;
1812 	}
1813 
1814 	/*
1815 	 * Save current brightness level in case we have to restore it
1816 	 * before acpi_video_device_lcd_set_level() is called next time.
1817 	 */
1818 	device->backlight->props.brightness =
1819 			acpi_video_get_brightness(device->backlight);
1820 
1821 	device->cooling_dev = thermal_cooling_device_register("LCD",
1822 				device->dev, &video_cooling_ops);
1823 	if (IS_ERR(device->cooling_dev)) {
1824 		/*
1825 		 * Set cooling_dev to NULL so we don't crash trying to free it.
1826 		 * Also, why the hell we are returning early and not attempt to
1827 		 * register video output if cooling device registration failed?
1828 		 * -- dtor
1829 		 */
1830 		device->cooling_dev = NULL;
1831 		return;
1832 	}
1833 
1834 	dev_info(&device->dev->dev, "registered as cooling_device%d\n",
1835 		 device->cooling_dev->id);
1836 	result = sysfs_create_link(&device->dev->dev.kobj,
1837 			&device->cooling_dev->device.kobj,
1838 			"thermal_cooling");
1839 	if (result)
1840 		printk(KERN_ERR PREFIX "Create sysfs link\n");
1841 	result = sysfs_create_link(&device->cooling_dev->device.kobj,
1842 			&device->dev->dev.kobj, "device");
1843 	if (result)
1844 		printk(KERN_ERR PREFIX "Create sysfs link\n");
1845 }
1846 
acpi_video_run_bcl_for_osi(struct acpi_video_bus * video)1847 static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video)
1848 {
1849 	struct acpi_video_device *dev;
1850 	union acpi_object *levels;
1851 
1852 	mutex_lock(&video->device_list_lock);
1853 	list_for_each_entry(dev, &video->video_device_list, entry) {
1854 		if (!acpi_video_device_lcd_query_levels(dev->dev->handle, &levels))
1855 			kfree(levels);
1856 	}
1857 	mutex_unlock(&video->device_list_lock);
1858 }
1859 
acpi_video_should_register_backlight(struct acpi_video_device * dev)1860 static bool acpi_video_should_register_backlight(struct acpi_video_device *dev)
1861 {
1862 	/*
1863 	 * Do not create backlight device for video output
1864 	 * device that is not in the enumerated list.
1865 	 */
1866 	if (!acpi_video_device_in_dod(dev)) {
1867 		dev_dbg(&dev->dev->dev, "not in _DOD list, ignore\n");
1868 		return false;
1869 	}
1870 
1871 	if (only_lcd)
1872 		return dev->flags.lcd;
1873 	return true;
1874 }
1875 
acpi_video_bus_register_backlight(struct acpi_video_bus * video)1876 static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
1877 {
1878 	struct acpi_video_device *dev;
1879 
1880 	if (video->backlight_registered)
1881 		return 0;
1882 
1883 	acpi_video_run_bcl_for_osi(video);
1884 
1885 	if (acpi_video_get_backlight_type() != acpi_backlight_video)
1886 		return 0;
1887 
1888 	mutex_lock(&video->device_list_lock);
1889 	list_for_each_entry(dev, &video->video_device_list, entry) {
1890 		if (acpi_video_should_register_backlight(dev))
1891 			acpi_video_dev_register_backlight(dev);
1892 	}
1893 	mutex_unlock(&video->device_list_lock);
1894 
1895 	video->backlight_registered = true;
1896 
1897 	video->pm_nb.notifier_call = acpi_video_resume;
1898 	video->pm_nb.priority = 0;
1899 	return register_pm_notifier(&video->pm_nb);
1900 }
1901 
acpi_video_dev_unregister_backlight(struct acpi_video_device * device)1902 static void acpi_video_dev_unregister_backlight(struct acpi_video_device *device)
1903 {
1904 	if (device->backlight) {
1905 		backlight_device_unregister(device->backlight);
1906 		device->backlight = NULL;
1907 	}
1908 	if (device->brightness) {
1909 		kfree(device->brightness->levels);
1910 		kfree(device->brightness);
1911 		device->brightness = NULL;
1912 	}
1913 	if (device->cooling_dev) {
1914 		sysfs_remove_link(&device->dev->dev.kobj, "thermal_cooling");
1915 		sysfs_remove_link(&device->cooling_dev->device.kobj, "device");
1916 		thermal_cooling_device_unregister(device->cooling_dev);
1917 		device->cooling_dev = NULL;
1918 	}
1919 }
1920 
acpi_video_bus_unregister_backlight(struct acpi_video_bus * video)1921 static int acpi_video_bus_unregister_backlight(struct acpi_video_bus *video)
1922 {
1923 	struct acpi_video_device *dev;
1924 	int error;
1925 
1926 	if (!video->backlight_registered)
1927 		return 0;
1928 
1929 	error = unregister_pm_notifier(&video->pm_nb);
1930 
1931 	mutex_lock(&video->device_list_lock);
1932 	list_for_each_entry(dev, &video->video_device_list, entry)
1933 		acpi_video_dev_unregister_backlight(dev);
1934 	mutex_unlock(&video->device_list_lock);
1935 
1936 	video->backlight_registered = false;
1937 
1938 	return error;
1939 }
1940 
acpi_video_dev_add_notify_handler(struct acpi_video_device * device)1941 static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device)
1942 {
1943 	acpi_status status;
1944 	struct acpi_device *adev = device->dev;
1945 
1946 	status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
1947 					     acpi_video_device_notify, device);
1948 	if (ACPI_FAILURE(status))
1949 		dev_err(&adev->dev, "Error installing notify handler\n");
1950 	else
1951 		device->flags.notify = 1;
1952 }
1953 
acpi_video_bus_add_notify_handler(struct acpi_video_bus * video)1954 static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video)
1955 {
1956 	struct input_dev *input;
1957 	struct acpi_video_device *dev;
1958 	int error;
1959 
1960 	video->input = input = input_allocate_device();
1961 	if (!input) {
1962 		error = -ENOMEM;
1963 		goto out;
1964 	}
1965 
1966 	error = acpi_video_bus_start_devices(video);
1967 	if (error)
1968 		goto err_free_input;
1969 
1970 	snprintf(video->phys, sizeof(video->phys),
1971 			"%s/video/input0", acpi_device_hid(video->device));
1972 
1973 	input->name = acpi_device_name(video->device);
1974 	input->phys = video->phys;
1975 	input->id.bustype = BUS_HOST;
1976 	input->id.product = 0x06;
1977 	input->dev.parent = &video->device->dev;
1978 	input->evbit[0] = BIT(EV_KEY);
1979 	set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
1980 	set_bit(KEY_VIDEO_NEXT, input->keybit);
1981 	set_bit(KEY_VIDEO_PREV, input->keybit);
1982 	set_bit(KEY_BRIGHTNESS_CYCLE, input->keybit);
1983 	set_bit(KEY_BRIGHTNESSUP, input->keybit);
1984 	set_bit(KEY_BRIGHTNESSDOWN, input->keybit);
1985 	set_bit(KEY_BRIGHTNESS_ZERO, input->keybit);
1986 	set_bit(KEY_DISPLAY_OFF, input->keybit);
1987 
1988 	error = input_register_device(input);
1989 	if (error)
1990 		goto err_stop_dev;
1991 
1992 	mutex_lock(&video->device_list_lock);
1993 	list_for_each_entry(dev, &video->video_device_list, entry)
1994 		acpi_video_dev_add_notify_handler(dev);
1995 	mutex_unlock(&video->device_list_lock);
1996 
1997 	return 0;
1998 
1999 err_stop_dev:
2000 	acpi_video_bus_stop_devices(video);
2001 err_free_input:
2002 	input_free_device(input);
2003 	video->input = NULL;
2004 out:
2005 	return error;
2006 }
2007 
acpi_video_dev_remove_notify_handler(struct acpi_video_device * dev)2008 static void acpi_video_dev_remove_notify_handler(struct acpi_video_device *dev)
2009 {
2010 	if (dev->flags.notify) {
2011 		acpi_remove_notify_handler(dev->dev->handle, ACPI_DEVICE_NOTIFY,
2012 					   acpi_video_device_notify);
2013 		dev->flags.notify = 0;
2014 	}
2015 }
2016 
acpi_video_bus_remove_notify_handler(struct acpi_video_bus * video)2017 static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
2018 {
2019 	struct acpi_video_device *dev;
2020 
2021 	mutex_lock(&video->device_list_lock);
2022 	list_for_each_entry(dev, &video->video_device_list, entry)
2023 		acpi_video_dev_remove_notify_handler(dev);
2024 	mutex_unlock(&video->device_list_lock);
2025 
2026 	acpi_video_bus_stop_devices(video);
2027 	input_unregister_device(video->input);
2028 	video->input = NULL;
2029 }
2030 
acpi_video_bus_put_devices(struct acpi_video_bus * video)2031 static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
2032 {
2033 	struct acpi_video_device *dev, *next;
2034 
2035 	mutex_lock(&video->device_list_lock);
2036 	list_for_each_entry_safe(dev, next, &video->video_device_list, entry) {
2037 		list_del(&dev->entry);
2038 		kfree(dev);
2039 	}
2040 	mutex_unlock(&video->device_list_lock);
2041 
2042 	return 0;
2043 }
2044 
2045 static int instance;
2046 
acpi_video_bus_add(struct acpi_device * device)2047 static int acpi_video_bus_add(struct acpi_device *device)
2048 {
2049 	struct acpi_video_bus *video;
2050 	int error;
2051 	acpi_status status;
2052 
2053 	status = acpi_walk_namespace(ACPI_TYPE_DEVICE,
2054 				device->parent->handle, 1,
2055 				acpi_video_bus_match, NULL,
2056 				device, NULL);
2057 	if (status == AE_ALREADY_EXISTS) {
2058 		printk(KERN_WARNING FW_BUG
2059 			"Duplicate ACPI video bus devices for the"
2060 			" same VGA controller, please try module "
2061 			"parameter \"video.allow_duplicates=1\""
2062 			"if the current driver doesn't work.\n");
2063 		if (!allow_duplicates)
2064 			return -ENODEV;
2065 	}
2066 
2067 	video = kzalloc(sizeof(struct acpi_video_bus), GFP_KERNEL);
2068 	if (!video)
2069 		return -ENOMEM;
2070 
2071 	/* a hack to fix the duplicate name "VID" problem on T61 */
2072 	if (!strcmp(device->pnp.bus_id, "VID")) {
2073 		if (instance)
2074 			device->pnp.bus_id[3] = '0' + instance;
2075 		instance++;
2076 	}
2077 	/* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
2078 	if (!strcmp(device->pnp.bus_id, "VGA")) {
2079 		if (instance)
2080 			device->pnp.bus_id[3] = '0' + instance;
2081 		instance++;
2082 	}
2083 
2084 	video->device = device;
2085 	strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
2086 	strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
2087 	device->driver_data = video;
2088 
2089 	acpi_video_bus_find_cap(video);
2090 	error = acpi_video_bus_check(video);
2091 	if (error)
2092 		goto err_free_video;
2093 
2094 	mutex_init(&video->device_list_lock);
2095 	INIT_LIST_HEAD(&video->video_device_list);
2096 
2097 	error = acpi_video_bus_get_devices(video, device);
2098 	if (error)
2099 		goto err_put_video;
2100 
2101 	printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s  rom: %s  post: %s)\n",
2102 	       ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
2103 	       video->flags.multihead ? "yes" : "no",
2104 	       video->flags.rom ? "yes" : "no",
2105 	       video->flags.post ? "yes" : "no");
2106 	mutex_lock(&video_list_lock);
2107 	list_add_tail(&video->entry, &video_bus_head);
2108 	mutex_unlock(&video_list_lock);
2109 
2110 	acpi_video_bus_register_backlight(video);
2111 	acpi_video_bus_add_notify_handler(video);
2112 
2113 	return 0;
2114 
2115 err_put_video:
2116 	acpi_video_bus_put_devices(video);
2117 	kfree(video->attached_array);
2118 err_free_video:
2119 	kfree(video);
2120 	device->driver_data = NULL;
2121 
2122 	return error;
2123 }
2124 
acpi_video_bus_remove(struct acpi_device * device)2125 static int acpi_video_bus_remove(struct acpi_device *device)
2126 {
2127 	struct acpi_video_bus *video = NULL;
2128 
2129 
2130 	if (!device || !acpi_driver_data(device))
2131 		return -EINVAL;
2132 
2133 	video = acpi_driver_data(device);
2134 
2135 	acpi_video_bus_remove_notify_handler(video);
2136 	acpi_video_bus_unregister_backlight(video);
2137 	acpi_video_bus_put_devices(video);
2138 
2139 	mutex_lock(&video_list_lock);
2140 	list_del(&video->entry);
2141 	mutex_unlock(&video_list_lock);
2142 
2143 	kfree(video->attached_array);
2144 	kfree(video);
2145 
2146 	return 0;
2147 }
2148 
is_i740(struct pci_dev * dev)2149 static int __init is_i740(struct pci_dev *dev)
2150 {
2151 	if (dev->device == 0x00D1)
2152 		return 1;
2153 	if (dev->device == 0x7000)
2154 		return 1;
2155 	return 0;
2156 }
2157 
intel_opregion_present(void)2158 static int __init intel_opregion_present(void)
2159 {
2160 	int opregion = 0;
2161 	struct pci_dev *dev = NULL;
2162 	u32 address;
2163 
2164 	for_each_pci_dev(dev) {
2165 		if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
2166 			continue;
2167 		if (dev->vendor != PCI_VENDOR_ID_INTEL)
2168 			continue;
2169 		/* We don't want to poke around undefined i740 registers */
2170 		if (is_i740(dev))
2171 			continue;
2172 		pci_read_config_dword(dev, 0xfc, &address);
2173 		if (!address)
2174 			continue;
2175 		opregion = 1;
2176 	}
2177 	return opregion;
2178 }
2179 
2180 /* Check if the chassis-type indicates there is no builtin LCD panel */
dmi_is_desktop(void)2181 static bool dmi_is_desktop(void)
2182 {
2183 	const char *chassis_type;
2184 	unsigned long type;
2185 
2186 	chassis_type = dmi_get_system_info(DMI_CHASSIS_TYPE);
2187 	if (!chassis_type)
2188 		return false;
2189 
2190 	if (kstrtoul(chassis_type, 10, &type) != 0)
2191 		return false;
2192 
2193 	switch (type) {
2194 	case 0x03: /* Desktop */
2195 	case 0x04: /* Low Profile Desktop */
2196 	case 0x05: /* Pizza Box */
2197 	case 0x06: /* Mini Tower */
2198 	case 0x07: /* Tower */
2199 	case 0x10: /* Lunch Box */
2200 	case 0x11: /* Main Server Chassis */
2201 		return true;
2202 	}
2203 
2204 	return false;
2205 }
2206 
acpi_video_register(void)2207 int acpi_video_register(void)
2208 {
2209 	int ret = 0;
2210 
2211 	mutex_lock(&register_count_mutex);
2212 	if (register_count) {
2213 		/*
2214 		 * if the function of acpi_video_register is already called,
2215 		 * don't register the acpi_video_bus again and return no error.
2216 		 */
2217 		goto leave;
2218 	}
2219 
2220 	/*
2221 	 * We're seeing a lot of bogus backlight interfaces on newer machines
2222 	 * without a LCD such as desktops, servers and HDMI sticks. Checking
2223 	 * the lcd flag fixes this, so enable this on any machines which are
2224 	 * win8 ready (where we also prefer the native backlight driver, so
2225 	 * normally the acpi_video code should not register there anyways).
2226 	 */
2227 	if (only_lcd == -1) {
2228 		if (dmi_is_desktop() && acpi_osi_is_win8())
2229 			only_lcd = true;
2230 		else
2231 			only_lcd = false;
2232 	}
2233 
2234 	dmi_check_system(video_dmi_table);
2235 
2236 	ret = acpi_bus_register_driver(&acpi_video_bus);
2237 	if (ret)
2238 		goto leave;
2239 
2240 	/*
2241 	 * When the acpi_video_bus is loaded successfully, increase
2242 	 * the counter reference.
2243 	 */
2244 	register_count = 1;
2245 
2246 leave:
2247 	mutex_unlock(&register_count_mutex);
2248 	return ret;
2249 }
2250 EXPORT_SYMBOL(acpi_video_register);
2251 
acpi_video_unregister(void)2252 void acpi_video_unregister(void)
2253 {
2254 	mutex_lock(&register_count_mutex);
2255 	if (register_count) {
2256 		acpi_bus_unregister_driver(&acpi_video_bus);
2257 		register_count = 0;
2258 	}
2259 	mutex_unlock(&register_count_mutex);
2260 }
2261 EXPORT_SYMBOL(acpi_video_unregister);
2262 
acpi_video_unregister_backlight(void)2263 void acpi_video_unregister_backlight(void)
2264 {
2265 	struct acpi_video_bus *video;
2266 
2267 	mutex_lock(&register_count_mutex);
2268 	if (register_count) {
2269 		mutex_lock(&video_list_lock);
2270 		list_for_each_entry(video, &video_bus_head, entry)
2271 			acpi_video_bus_unregister_backlight(video);
2272 		mutex_unlock(&video_list_lock);
2273 	}
2274 	mutex_unlock(&register_count_mutex);
2275 }
2276 
acpi_video_handles_brightness_key_presses(void)2277 bool acpi_video_handles_brightness_key_presses(void)
2278 {
2279 	bool have_video_busses;
2280 
2281 	mutex_lock(&video_list_lock);
2282 	have_video_busses = !list_empty(&video_bus_head);
2283 	mutex_unlock(&video_list_lock);
2284 
2285 	return have_video_busses &&
2286 	       (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS);
2287 }
2288 EXPORT_SYMBOL(acpi_video_handles_brightness_key_presses);
2289 
2290 /*
2291  * This is kind of nasty. Hardware using Intel chipsets may require
2292  * the video opregion code to be run first in order to initialise
2293  * state before any ACPI video calls are made. To handle this we defer
2294  * registration of the video class until the opregion code has run.
2295  */
2296 
acpi_video_init(void)2297 static int __init acpi_video_init(void)
2298 {
2299 	/*
2300 	 * Let the module load even if ACPI is disabled (e.g. due to
2301 	 * a broken BIOS) so that i915.ko can still be loaded on such
2302 	 * old systems without an AcpiOpRegion.
2303 	 *
2304 	 * acpi_video_register() will report -ENODEV later as well due
2305 	 * to acpi_disabled when i915.ko tries to register itself afterwards.
2306 	 */
2307 	if (acpi_disabled)
2308 		return 0;
2309 
2310 	if (intel_opregion_present())
2311 		return 0;
2312 
2313 	return acpi_video_register();
2314 }
2315 
acpi_video_exit(void)2316 static void __exit acpi_video_exit(void)
2317 {
2318 	acpi_video_detect_exit();
2319 	acpi_video_unregister();
2320 
2321 	return;
2322 }
2323 
2324 module_init(acpi_video_init);
2325 module_exit(acpi_video_exit);
2326