|
|
@@ -7,6 +7,8 @@
|
|
|
|
* Copyright (C) 2006 Thomas Tuttle <linux-kernel@ttuttle.net>
|
|
|
|
* Copyright (C) 2006 Thomas Tuttle <linux-kernel@ttuttle.net>
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define pr_fmt(fmt) "ACPI: video: " fmt
|
|
|
|
|
|
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/init.h>
|
|
|
@@ -26,16 +28,11 @@
|
|
|
|
#include <acpi/video.h>
|
|
|
|
#include <acpi/video.h>
|
|
|
|
#include <linux/uaccess.h>
|
|
|
|
#include <linux/uaccess.h>
|
|
|
|
|
|
|
|
|
|
|
|
#define PREFIX "ACPI: "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define ACPI_VIDEO_BUS_NAME "Video Bus"
|
|
|
|
#define ACPI_VIDEO_BUS_NAME "Video Bus"
|
|
|
|
#define ACPI_VIDEO_DEVICE_NAME "Video Device"
|
|
|
|
#define ACPI_VIDEO_DEVICE_NAME "Video Device"
|
|
|
|
|
|
|
|
|
|
|
|
#define MAX_NAME_LEN 20
|
|
|
|
#define MAX_NAME_LEN 20
|
|
|
|
|
|
|
|
|
|
|
|
#define _COMPONENT ACPI_VIDEO_COMPONENT
|
|
|
|
|
|
|
|
ACPI_MODULE_NAME("video");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MODULE_AUTHOR("Bruno Ducrot");
|
|
|
|
MODULE_AUTHOR("Bruno Ducrot");
|
|
|
|
MODULE_DESCRIPTION("ACPI Video Driver");
|
|
|
|
MODULE_DESCRIPTION("ACPI Video Driver");
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
@@ -326,11 +323,11 @@ acpi_video_device_lcd_query_levels(acpi_handle handle,
|
|
|
|
*levels = NULL;
|
|
|
|
*levels = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer);
|
|
|
|
status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer);
|
|
|
|
if (!ACPI_SUCCESS(status))
|
|
|
|
if (ACPI_FAILURE(status))
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
obj = (union acpi_object *)buffer.pointer;
|
|
|
|
obj = (union acpi_object *)buffer.pointer;
|
|
|
|
if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) {
|
|
|
|
if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) {
|
|
|
|
printk(KERN_ERR PREFIX "Invalid _BCL data\n");
|
|
|
|
acpi_handle_info(handle, "Invalid _BCL data\n");
|
|
|
|
status = -EFAULT;
|
|
|
|
status = -EFAULT;
|
|
|
|
goto err;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -354,7 +351,7 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
|
|
|
|
status = acpi_execute_simple_method(device->dev->handle,
|
|
|
|
status = acpi_execute_simple_method(device->dev->handle,
|
|
|
|
"_BCM", level);
|
|
|
|
"_BCM", level);
|
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
|
ACPI_ERROR((AE_INFO, "Evaluating _BCM failed"));
|
|
|
|
acpi_handle_info(device->dev->handle, "_BCM evaluation failed\n");
|
|
|
|
return -EIO;
|
|
|
|
return -EIO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -368,7 +365,7 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ACPI_ERROR((AE_INFO, "Current brightness invalid"));
|
|
|
|
acpi_handle_info(device->dev->handle, "Current brightness invalid\n");
|
|
|
|
return -EINVAL;
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -622,9 +619,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
|
|
|
* BQC returned an invalid level.
|
|
|
|
* BQC returned an invalid level.
|
|
|
|
* Stop using it.
|
|
|
|
* Stop using it.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
ACPI_WARNING((AE_INFO,
|
|
|
|
acpi_handle_info(device->dev->handle,
|
|
|
|
"%s returned an invalid level",
|
|
|
|
"%s returned an invalid level", buf);
|
|
|
|
buf));
|
|
|
|
|
|
|
|
device->cap._BQC = device->cap._BCQ = 0;
|
|
|
|
device->cap._BQC = device->cap._BCQ = 0;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@@ -635,7 +631,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
|
|
|
* ACPI video backlight still works w/ buggy _BQC.
|
|
|
|
* ACPI video backlight still works w/ buggy _BQC.
|
|
|
|
* http://bugzilla.kernel.org/show_bug.cgi?id=12233
|
|
|
|
* http://bugzilla.kernel.org/show_bug.cgi?id=12233
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
ACPI_WARNING((AE_INFO, "Evaluating %s failed", buf));
|
|
|
|
acpi_handle_info(device->dev->handle,
|
|
|
|
|
|
|
|
"%s evaluation failed", buf);
|
|
|
|
device->cap._BQC = device->cap._BCQ = 0;
|
|
|
|
device->cap._BQC = device->cap._BCQ = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -675,7 +672,7 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
|
|
|
if (obj && obj->type == ACPI_TYPE_BUFFER)
|
|
|
|
if (obj && obj->type == ACPI_TYPE_BUFFER)
|
|
|
|
*edid = obj;
|
|
|
|
*edid = obj;
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
printk(KERN_ERR PREFIX "Invalid _DDC data\n");
|
|
|
|
acpi_handle_info(device->dev->handle, "Invalid _DDC data\n");
|
|
|
|
status = -EFAULT;
|
|
|
|
status = -EFAULT;
|
|
|
|
kfree(obj);
|
|
|
|
kfree(obj);
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -827,10 +824,9 @@ int acpi_video_get_levels(struct acpi_device *device,
|
|
|
|
int result = 0;
|
|
|
|
int result = 0;
|
|
|
|
u32 value;
|
|
|
|
u32 value;
|
|
|
|
|
|
|
|
|
|
|
|
if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device->handle,
|
|
|
|
if (ACPI_FAILURE(acpi_video_device_lcd_query_levels(device->handle, &obj))) {
|
|
|
|
&obj))) {
|
|
|
|
acpi_handle_debug(device->handle,
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available "
|
|
|
|
"Could not query available LCD brightness level\n");
|
|
|
|
"LCD brightness level\n"));
|
|
|
|
|
|
|
|
result = -ENODEV;
|
|
|
|
result = -ENODEV;
|
|
|
|
goto out;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -842,7 +838,6 @@ int acpi_video_get_levels(struct acpi_device *device,
|
|
|
|
|
|
|
|
|
|
|
|
br = kzalloc(sizeof(*br), GFP_KERNEL);
|
|
|
|
br = kzalloc(sizeof(*br), GFP_KERNEL);
|
|
|
|
if (!br) {
|
|
|
|
if (!br) {
|
|
|
|
printk(KERN_ERR "can't allocate memory\n");
|
|
|
|
|
|
|
|
result = -ENOMEM;
|
|
|
|
result = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -863,7 +858,7 @@ int acpi_video_get_levels(struct acpi_device *device,
|
|
|
|
for (i = 0; i < obj->package.count; i++) {
|
|
|
|
for (i = 0; i < obj->package.count; i++) {
|
|
|
|
o = (union acpi_object *)&obj->package.elements[i];
|
|
|
|
o = (union acpi_object *)&obj->package.elements[i];
|
|
|
|
if (o->type != ACPI_TYPE_INTEGER) {
|
|
|
|
if (o->type != ACPI_TYPE_INTEGER) {
|
|
|
|
printk(KERN_ERR PREFIX "Invalid data\n");
|
|
|
|
acpi_handle_info(device->handle, "Invalid data\n");
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
value = (u32) o->integer.value;
|
|
|
|
value = (u32) o->integer.value;
|
|
|
@@ -900,7 +895,8 @@ int acpi_video_get_levels(struct acpi_device *device,
|
|
|
|
br->levels[i] = br->levels[i - level_ac_battery];
|
|
|
|
br->levels[i] = br->levels[i - level_ac_battery];
|
|
|
|
count += level_ac_battery;
|
|
|
|
count += level_ac_battery;
|
|
|
|
} else if (level_ac_battery > ACPI_VIDEO_FIRST_LEVEL)
|
|
|
|
} else if (level_ac_battery > ACPI_VIDEO_FIRST_LEVEL)
|
|
|
|
ACPI_ERROR((AE_INFO, "Too many duplicates in _BCL package"));
|
|
|
|
acpi_handle_info(device->handle,
|
|
|
|
|
|
|
|
"Too many duplicates in _BCL package");
|
|
|
|
|
|
|
|
|
|
|
|
/* Check if the _BCL package is in a reversed order */
|
|
|
|
/* Check if the _BCL package is in a reversed order */
|
|
|
|
if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) {
|
|
|
|
if (max_level == br->levels[ACPI_VIDEO_FIRST_LEVEL]) {
|
|
|
@@ -910,8 +906,8 @@ int acpi_video_get_levels(struct acpi_device *device,
|
|
|
|
sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]),
|
|
|
|
sizeof(br->levels[ACPI_VIDEO_FIRST_LEVEL]),
|
|
|
|
acpi_video_cmp_level, NULL);
|
|
|
|
acpi_video_cmp_level, NULL);
|
|
|
|
} else if (max_level != br->levels[count - 1])
|
|
|
|
} else if (max_level != br->levels[count - 1])
|
|
|
|
ACPI_ERROR((AE_INFO,
|
|
|
|
acpi_handle_info(device->handle,
|
|
|
|
"Found unordered _BCL package"));
|
|
|
|
"Found unordered _BCL package");
|
|
|
|
|
|
|
|
|
|
|
|
br->count = count;
|
|
|
|
br->count = count;
|
|
|
|
*dev_br = br;
|
|
|
|
*dev_br = br;
|
|
|
@@ -989,9 +985,9 @@ set_level:
|
|
|
|
if (result)
|
|
|
|
if (result)
|
|
|
|
goto out_free_levels;
|
|
|
|
goto out_free_levels;
|
|
|
|
|
|
|
|
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
|
acpi_handle_debug(device->dev->handle, "found %d brightness levels\n",
|
|
|
|
"found %d brightness levels\n",
|
|
|
|
br->count - ACPI_VIDEO_FIRST_LEVEL);
|
|
|
|
br->count - ACPI_VIDEO_FIRST_LEVEL));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
out_free_levels:
|
|
|
|
out_free_levels:
|
|
|
@@ -1023,7 +1019,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|
|
|
if (acpi_has_method(device->dev->handle, "_BQC")) {
|
|
|
|
if (acpi_has_method(device->dev->handle, "_BQC")) {
|
|
|
|
device->cap._BQC = 1;
|
|
|
|
device->cap._BQC = 1;
|
|
|
|
} else if (acpi_has_method(device->dev->handle, "_BCQ")) {
|
|
|
|
} else if (acpi_has_method(device->dev->handle, "_BCQ")) {
|
|
|
|
printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n");
|
|
|
|
acpi_handle_info(device->dev->handle,
|
|
|
|
|
|
|
|
"_BCQ is used instead of _BQC\n");
|
|
|
|
device->cap._BCQ = 1;
|
|
|
|
device->cap._BCQ = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -1083,8 +1080,7 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
|
|
|
|
/* Does this device support video switching? */
|
|
|
|
/* Does this device support video switching? */
|
|
|
|
if (video->cap._DOS || video->cap._DOD) {
|
|
|
|
if (video->cap._DOS || video->cap._DOD) {
|
|
|
|
if (!video->cap._DOS) {
|
|
|
|
if (!video->cap._DOS) {
|
|
|
|
printk(KERN_WARNING FW_BUG
|
|
|
|
pr_info(FW_BUG "ACPI(%s) defines _DOD but not _DOS\n",
|
|
|
|
"ACPI(%s) defines _DOD but not _DOS\n",
|
|
|
|
|
|
|
|
acpi_device_bid(video->device));
|
|
|
|
acpi_device_bid(video->device));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
video->flags.multihead = 1;
|
|
|
|
video->flags.multihead = 1;
|
|
|
@@ -1272,7 +1268,8 @@ acpi_video_device_bind(struct acpi_video_bus *video,
|
|
|
|
ids = &video->attached_array[i];
|
|
|
|
ids = &video->attached_array[i];
|
|
|
|
if (device->device_id == (ids->value.int_val & 0xffff)) {
|
|
|
|
if (device->device_id == (ids->value.int_val & 0xffff)) {
|
|
|
|
ids->bind_info = device;
|
|
|
|
ids->bind_info = device;
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "device_bind %d\n", i));
|
|
|
|
acpi_handle_debug(video->device->handle, "%s: %d\n",
|
|
|
|
|
|
|
|
__func__, i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -1324,20 +1321,22 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
|
|
|
return AE_NOT_EXIST;
|
|
|
|
return AE_NOT_EXIST;
|
|
|
|
|
|
|
|
|
|
|
|
status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
|
|
|
|
status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
|
|
|
|
if (!ACPI_SUCCESS(status)) {
|
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
|
ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD"));
|
|
|
|
acpi_handle_info(video->device->handle,
|
|
|
|
|
|
|
|
"_DOD evaluation failed: %s\n",
|
|
|
|
|
|
|
|
acpi_format_exception(status));
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dod = buffer.pointer;
|
|
|
|
dod = buffer.pointer;
|
|
|
|
if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
|
|
|
|
if (!dod || (dod->type != ACPI_TYPE_PACKAGE)) {
|
|
|
|
ACPI_EXCEPTION((AE_INFO, status, "Invalid _DOD data"));
|
|
|
|
acpi_handle_info(video->device->handle, "Invalid _DOD data\n");
|
|
|
|
status = -EFAULT;
|
|
|
|
status = -EFAULT;
|
|
|
|
goto out;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d video heads in _DOD\n",
|
|
|
|
acpi_handle_debug(video->device->handle, "Found %d video heads in _DOD\n",
|
|
|
|
dod->package.count));
|
|
|
|
dod->package.count);
|
|
|
|
|
|
|
|
|
|
|
|
active_list = kcalloc(1 + dod->package.count,
|
|
|
|
active_list = kcalloc(1 + dod->package.count,
|
|
|
|
sizeof(struct acpi_video_enumerated_device),
|
|
|
|
sizeof(struct acpi_video_enumerated_device),
|
|
|
@@ -1352,15 +1351,18 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
|
|
|
obj = &dod->package.elements[i];
|
|
|
|
obj = &dod->package.elements[i];
|
|
|
|
|
|
|
|
|
|
|
|
if (obj->type != ACPI_TYPE_INTEGER) {
|
|
|
|
if (obj->type != ACPI_TYPE_INTEGER) {
|
|
|
|
printk(KERN_ERR PREFIX
|
|
|
|
acpi_handle_info(video->device->handle,
|
|
|
|
"Invalid _DOD data in element %d\n", i);
|
|
|
|
"Invalid _DOD data in element %d\n", i);
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
active_list[count].value.int_val = obj->integer.value;
|
|
|
|
active_list[count].value.int_val = obj->integer.value;
|
|
|
|
active_list[count].bind_info = NULL;
|
|
|
|
active_list[count].bind_info = NULL;
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "dod element[%d] = %d\n", i,
|
|
|
|
|
|
|
|
(int)obj->integer.value));
|
|
|
|
acpi_handle_debug(video->device->handle,
|
|
|
|
|
|
|
|
"_DOD element[%d] = %d\n", i,
|
|
|
|
|
|
|
|
(int)obj->integer.value);
|
|
|
|
|
|
|
|
|
|
|
|
count++;
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -1451,7 +1453,8 @@ acpi_video_switch_brightness(struct work_struct *work)
|
|
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
out:
|
|
|
|
if (result)
|
|
|
|
if (result)
|
|
|
|
printk(KERN_ERR PREFIX "Failed to switch the brightness\n");
|
|
|
|
acpi_handle_info(device->dev->handle,
|
|
|
|
|
|
|
|
"Failed to switch brightness\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
|
|
|
|
int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
|
|
|
@@ -1601,8 +1604,8 @@ static void acpi_video_bus_notify(struct acpi_device *device, u32 event)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
|
acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n",
|
|
|
|
"Unsupported event [0x%x]\n", event));
|
|
|
|
event);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -1675,8 +1678,7 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
|
|
|
keycode = KEY_DISPLAY_OFF;
|
|
|
|
keycode = KEY_DISPLAY_OFF;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
|
acpi_handle_debug(handle, "Unsupported event [0x%x]\n", event);
|
|
|
|
"Unsupported event [0x%x]\n", event));
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -1812,11 +1814,12 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
|
|
|
|
&device->cooling_dev->device.kobj,
|
|
|
|
&device->cooling_dev->device.kobj,
|
|
|
|
"thermal_cooling");
|
|
|
|
"thermal_cooling");
|
|
|
|
if (result)
|
|
|
|
if (result)
|
|
|
|
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
|
|
|
pr_info("sysfs link creation failed\n");
|
|
|
|
|
|
|
|
|
|
|
|
result = sysfs_create_link(&device->cooling_dev->device.kobj,
|
|
|
|
result = sysfs_create_link(&device->cooling_dev->device.kobj,
|
|
|
|
&device->dev->dev.kobj, "device");
|
|
|
|
&device->dev->dev.kobj, "device");
|
|
|
|
if (result)
|
|
|
|
if (result)
|
|
|
|
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
|
|
|
pr_info("Reverse sysfs link creation failed\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video)
|
|
|
|
static void acpi_video_run_bcl_for_osi(struct acpi_video_bus *video)
|
|
|
@@ -2030,7 +2033,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
|
|
|
acpi_video_bus_match, NULL,
|
|
|
|
acpi_video_bus_match, NULL,
|
|
|
|
device, NULL);
|
|
|
|
device, NULL);
|
|
|
|
if (status == AE_ALREADY_EXISTS) {
|
|
|
|
if (status == AE_ALREADY_EXISTS) {
|
|
|
|
printk(KERN_WARNING FW_BUG
|
|
|
|
pr_info(FW_BUG
|
|
|
|
"Duplicate ACPI video bus devices for the"
|
|
|
|
"Duplicate ACPI video bus devices for the"
|
|
|
|
" same VGA controller, please try module "
|
|
|
|
" same VGA controller, please try module "
|
|
|
|
"parameter \"video.allow_duplicates=1\""
|
|
|
|
"parameter \"video.allow_duplicates=1\""
|
|
|
@@ -2073,7 +2076,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
|
|
|
if (error)
|
|
|
|
if (error)
|
|
|
|
goto err_put_video;
|
|
|
|
goto err_put_video;
|
|
|
|
|
|
|
|
|
|
|
|
printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n",
|
|
|
|
pr_info("%s [%s] (multi-head: %s rom: %s post: %s)\n",
|
|
|
|
ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
|
|
|
|
ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
|
|
|
|
video->flags.multihead ? "yes" : "no",
|
|
|
|
video->flags.multihead ? "yes" : "no",
|
|
|
|
video->flags.rom ? "yes" : "no",
|
|
|
|
video->flags.rom ? "yes" : "no",
|
|
|
|