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