cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

acpi_video.c (60586B)


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