Merge branch 'acpi-video'
* acpi-video: ACPI: blacklist win8 OSI for buggy laptops ACPI: blacklist win8 OSI for ASUS Zenbook Prime UX31A ACPI / video: drop unused fields from struct acpi_video_brightness_flags ACPI / video: remove unnecessary type casting ACPI / video: trivial style cleanups ACPI / video: trivial costmetic cleanups Conflicts: drivers/acpi/video.c
This commit is contained in:
commit
8a3a53ea89
@ -192,6 +192,12 @@ static int __init dmi_disable_osi_win7(const struct dmi_system_id *d)
|
||||
acpi_osi_setup("!Windows 2009");
|
||||
return 0;
|
||||
}
|
||||
static int __init dmi_disable_osi_win8(const struct dmi_system_id *d)
|
||||
{
|
||||
printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
|
||||
acpi_osi_setup("!Windows 2012");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
|
||||
{
|
||||
@ -267,6 +273,30 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P305D"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_disable_osi_win8,
|
||||
.ident = "ASUS Zenbook Prime UX31A",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "UX31A"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_disable_osi_win8,
|
||||
.ident = "Dell Inspiron 15R SE",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7520"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_disable_osi_win8,
|
||||
.ident = "Lenovo ThinkPad Edge E530",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "3259A2G"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* BIOS invocation of _OSI(Linux) is almost always a BIOS bug.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* video.c - ACPI Video Driver ($Revision:$)
|
||||
* video.c - ACPI Video Driver
|
||||
*
|
||||
* Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
|
||||
* Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org>
|
||||
@ -88,7 +88,7 @@ module_param(allow_duplicates, bool, 0644);
|
||||
static bool use_bios_initial_backlight = 1;
|
||||
module_param(use_bios_initial_backlight, bool, 0644);
|
||||
|
||||
static int register_count = 0;
|
||||
static int register_count;
|
||||
static int acpi_video_bus_add(struct acpi_device *device);
|
||||
static int acpi_video_bus_remove(struct acpi_device *device);
|
||||
static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
|
||||
@ -118,26 +118,26 @@ struct acpi_video_bus_flags {
|
||||
};
|
||||
|
||||
struct acpi_video_bus_cap {
|
||||
u8 _DOS:1; /*Enable/Disable output switching */
|
||||
u8 _DOD:1; /*Enumerate all devices attached to display adapter */
|
||||
u8 _ROM:1; /*Get ROM Data */
|
||||
u8 _GPD:1; /*Get POST Device */
|
||||
u8 _SPD:1; /*Set POST Device */
|
||||
u8 _VPO:1; /*Video POST Options */
|
||||
u8 _DOS:1; /* Enable/Disable output switching */
|
||||
u8 _DOD:1; /* Enumerate all devices attached to display adapter */
|
||||
u8 _ROM:1; /* Get ROM Data */
|
||||
u8 _GPD:1; /* Get POST Device */
|
||||
u8 _SPD:1; /* Set POST Device */
|
||||
u8 _VPO:1; /* Video POST Options */
|
||||
u8 reserved:2;
|
||||
};
|
||||
|
||||
struct acpi_video_device_attrib {
|
||||
u32 display_index:4; /* A zero-based instance of the Display */
|
||||
u32 display_port_attachment:4; /*This field differentiates the display type */
|
||||
u32 display_type:4; /*Describe the specific type in use */
|
||||
u32 vendor_specific:4; /*Chipset Vendor Specific */
|
||||
u32 bios_can_detect:1; /*BIOS can detect the device */
|
||||
u32 depend_on_vga:1; /*Non-VGA output device whose power is related to
|
||||
u32 display_port_attachment:4; /* This field differentiates the display type */
|
||||
u32 display_type:4; /* Describe the specific type in use */
|
||||
u32 vendor_specific:4; /* Chipset Vendor Specific */
|
||||
u32 bios_can_detect:1; /* BIOS can detect the device */
|
||||
u32 depend_on_vga:1; /* Non-VGA output device whose power is related to
|
||||
the VGA device. */
|
||||
u32 pipe_id:3; /*For VGA multiple-head devices. */
|
||||
u32 reserved:10; /*Must be 0 */
|
||||
u32 device_id_scheme:1; /*Device ID Scheme */
|
||||
u32 pipe_id:3; /* For VGA multiple-head devices. */
|
||||
u32 reserved:10; /* Must be 0 */
|
||||
u32 device_id_scheme:1; /* Device ID Scheme */
|
||||
};
|
||||
|
||||
struct acpi_video_enumerated_device {
|
||||
@ -174,19 +174,17 @@ struct acpi_video_device_flags {
|
||||
};
|
||||
|
||||
struct acpi_video_device_cap {
|
||||
u8 _ADR:1; /*Return the unique ID */
|
||||
u8 _BCL:1; /*Query list of brightness control levels supported */
|
||||
u8 _BCM:1; /*Set the brightness level */
|
||||
u8 _ADR:1; /* Return the unique ID */
|
||||
u8 _BCL:1; /* Query list of brightness control levels supported */
|
||||
u8 _BCM:1; /* Set the brightness level */
|
||||
u8 _BQC:1; /* Get current brightness level */
|
||||
u8 _BCQ:1; /* Some buggy BIOS uses _BCQ instead of _BQC */
|
||||
u8 _DDC:1; /*Return the EDID for this device */
|
||||
u8 _DDC:1; /* Return the EDID for this device */
|
||||
};
|
||||
|
||||
struct acpi_video_brightness_flags {
|
||||
u8 _BCL_no_ac_battery_levels:1; /* no AC/Battery levels in _BCL */
|
||||
u8 _BCL_reversed:1; /* _BCL package is in a reversed order*/
|
||||
u8 _BCL_use_index:1; /* levels in _BCL are index values */
|
||||
u8 _BCM_use_index:1; /* input of _BCM is an index value */
|
||||
u8 _BCL_reversed:1; /* _BCL package is in a reversed order */
|
||||
u8 _BQC_use_index:1; /* _BQC returns an index value */
|
||||
};
|
||||
|
||||
@ -231,21 +229,22 @@ static int acpi_video_get_next_level(struct acpi_video_device *device,
|
||||
static int acpi_video_switch_brightness(struct acpi_video_device *device,
|
||||
int event);
|
||||
|
||||
/*backlight device sysfs support*/
|
||||
/* backlight device sysfs support */
|
||||
static int acpi_video_get_brightness(struct backlight_device *bd)
|
||||
{
|
||||
unsigned long long cur_level;
|
||||
int i;
|
||||
struct acpi_video_device *vd =
|
||||
(struct acpi_video_device *)bl_get_data(bd);
|
||||
struct acpi_video_device *vd = bl_get_data(bd);
|
||||
|
||||
if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false))
|
||||
return -EINVAL;
|
||||
for (i = 2; i < vd->brightness->count; i++) {
|
||||
if (vd->brightness->levels[i] == cur_level)
|
||||
/* The first two entries are special - see page 575
|
||||
of the ACPI spec 3.0 */
|
||||
return i-2;
|
||||
/*
|
||||
* The first two entries are special - see page 575
|
||||
* of the ACPI spec 3.0
|
||||
*/
|
||||
return i - 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -253,8 +252,7 @@ static int acpi_video_get_brightness(struct backlight_device *bd)
|
||||
static int acpi_video_set_brightness(struct backlight_device *bd)
|
||||
{
|
||||
int request_level = bd->props.brightness + 2;
|
||||
struct acpi_video_device *vd =
|
||||
(struct acpi_video_device *)bl_get_data(bd);
|
||||
struct acpi_video_device *vd = bl_get_data(bd);
|
||||
|
||||
return acpi_video_device_lcd_set_level(vd,
|
||||
vd->brightness->levels[request_level]);
|
||||
@ -302,11 +300,11 @@ video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long st
|
||||
struct acpi_video_device *video = acpi_driver_data(device);
|
||||
int level;
|
||||
|
||||
if ( state >= video->brightness->count - 2)
|
||||
if (state >= video->brightness->count - 2)
|
||||
return -EINVAL;
|
||||
|
||||
state = video->brightness->count - state;
|
||||
level = video->brightness->levels[state -1];
|
||||
level = video->brightness->levels[state - 1];
|
||||
return acpi_video_device_lcd_set_level(video, level);
|
||||
}
|
||||
|
||||
@ -316,9 +314,11 @@ static const struct thermal_cooling_device_ops video_cooling_ops = {
|
||||
.set_cur_state = video_set_cur_state,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Video Management
|
||||
-------------------------------------------------------------------------- */
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Video Management
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
|
||||
@ -345,7 +345,7 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
err:
|
||||
kfree(buffer.pointer);
|
||||
|
||||
return status;
|
||||
@ -542,7 +542,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
||||
if (device->brightness->levels[i] == *level) {
|
||||
device->brightness->curr = *level;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* BQC returned an invalid level.
|
||||
* Stop using it.
|
||||
@ -552,7 +552,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
||||
buf));
|
||||
device->cap._BQC = device->cap._BCQ = 0;
|
||||
} else {
|
||||
/* Fixme:
|
||||
/*
|
||||
* Fixme:
|
||||
* should we return an error or ignore this failure?
|
||||
* dev->brightness->curr is a cached value which stores
|
||||
* the correct current backlight level in most cases.
|
||||
@ -611,8 +612,8 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* video : video bus device pointer
|
||||
* bios_flag :
|
||||
* video : video bus device pointer
|
||||
* bios_flag :
|
||||
* 0. The system BIOS should NOT automatically switch(toggle)
|
||||
* the active display output.
|
||||
* 1. The system BIOS should automatically switch (toggle) the
|
||||
@ -624,9 +625,9 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
||||
* lcd_flag :
|
||||
* 0. The system BIOS should automatically control the brightness level
|
||||
* of the LCD when the power changes from AC to DC
|
||||
* 1. The system BIOS should NOT automatically control the brightness
|
||||
* 1. The system BIOS should NOT automatically control the brightness
|
||||
* level of the LCD when the power changes from AC to DC.
|
||||
* Return Value:
|
||||
* Return Value:
|
||||
* -EINVAL wrong arg.
|
||||
*/
|
||||
|
||||
@ -710,8 +711,8 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device,
|
||||
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* device : video output device (LCD, CRT, ..)
|
||||
* Arg:
|
||||
* device : video output device (LCD, CRT, ..)
|
||||
*
|
||||
* Return Value:
|
||||
* Maximum brightness level
|
||||
@ -799,16 +800,6 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
||||
br->count = count;
|
||||
device->brightness = br;
|
||||
|
||||
/* Check the input/output of _BQC/_BCL/_BCM */
|
||||
if ((max_level < 100) && (max_level <= (count - 2)))
|
||||
br->flags._BCL_use_index = 1;
|
||||
|
||||
/*
|
||||
* _BCM is always consistent with _BCL,
|
||||
* at least for all the laptops we have ever seen.
|
||||
*/
|
||||
br->flags._BCM_use_index = br->flags._BCL_use_index;
|
||||
|
||||
/* _BQC uses INDEX while _BCL uses VALUE in some laptops */
|
||||
br->curr = level = max_level;
|
||||
|
||||
@ -870,7 +861,7 @@ out:
|
||||
* device : video output device (LCD, CRT, ..)
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
* None
|
||||
*
|
||||
* Find out all required AML methods defined under the output
|
||||
* device.
|
||||
@ -900,7 +891,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
||||
acpi_handle acpi_parent;
|
||||
struct device *parent = NULL;
|
||||
int result;
|
||||
static int count = 0;
|
||||
static int count;
|
||||
char *name;
|
||||
|
||||
result = acpi_video_init_brightness(device);
|
||||
@ -969,11 +960,11 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
||||
}
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* device : video output device (VGA)
|
||||
* Arg:
|
||||
* device : video output device (VGA)
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
* None
|
||||
*
|
||||
* Find out all required AML methods defined under the video bus device.
|
||||
*/
|
||||
@ -1012,7 +1003,8 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
|
||||
return -ENODEV;
|
||||
pci_dev_put(dev);
|
||||
|
||||
/* Since there is no HID, CID and so on for VGA driver, we have
|
||||
/*
|
||||
* Since there is no HID, CID and so on for VGA driver, we have
|
||||
* to check well known required nodes.
|
||||
*/
|
||||
|
||||
@ -1042,12 +1034,14 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
|
||||
return status;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Driver Interface
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* device interface */
|
||||
static struct acpi_video_device_attrib*
|
||||
static struct acpi_video_device_attrib *
|
||||
acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
|
||||
{
|
||||
struct acpi_video_enumerated_device *ids;
|
||||
@ -1085,7 +1079,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||
unsigned long long device_id;
|
||||
int status, device_type;
|
||||
struct acpi_video_device *data;
|
||||
struct acpi_video_device_attrib* attribute;
|
||||
struct acpi_video_device_attrib *attribute;
|
||||
|
||||
status =
|
||||
acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
|
||||
@ -1107,7 +1101,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||
|
||||
attribute = acpi_video_get_device_attr(video, device_id);
|
||||
|
||||
if((attribute != NULL) && attribute->device_id_scheme) {
|
||||
if (attribute && attribute->device_id_scheme) {
|
||||
switch (attribute->display_type) {
|
||||
case ACPI_VIDEO_DISPLAY_CRT:
|
||||
data->flags.crt = 1;
|
||||
@ -1125,24 +1119,24 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||
data->flags.unknown = 1;
|
||||
break;
|
||||
}
|
||||
if(attribute->bios_can_detect)
|
||||
if (attribute->bios_can_detect)
|
||||
data->flags.bios = 1;
|
||||
} else {
|
||||
/* Check for legacy IDs */
|
||||
device_type = acpi_video_get_device_type(video, device_id);
|
||||
/* Ignore bits 16 and 18-20 */
|
||||
switch (device_type & 0xffe2ffff) {
|
||||
case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
|
||||
data->flags.crt = 1;
|
||||
break;
|
||||
case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
|
||||
data->flags.lcd = 1;
|
||||
break;
|
||||
case ACPI_VIDEO_DISPLAY_LEGACY_TV:
|
||||
data->flags.tvout = 1;
|
||||
break;
|
||||
default:
|
||||
data->flags.unknown = 1;
|
||||
case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
|
||||
data->flags.crt = 1;
|
||||
break;
|
||||
case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
|
||||
data->flags.lcd = 1;
|
||||
break;
|
||||
case ACPI_VIDEO_DISPLAY_LEGACY_TV:
|
||||
data->flags.tvout = 1;
|
||||
break;
|
||||
default:
|
||||
data->flags.unknown = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1165,12 +1159,12 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* video : video bus device
|
||||
* video : video bus device
|
||||
*
|
||||
* Return:
|
||||
* none
|
||||
*
|
||||
* Enumerate the video device list of the video bus,
|
||||
* none
|
||||
*
|
||||
* Enumerate the video device list of the video bus,
|
||||
* bind the ids with the corresponding video devices
|
||||
* under the video bus.
|
||||
*/
|
||||
@ -1189,13 +1183,13 @@ static void acpi_video_device_rebind(struct acpi_video_bus *video)
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* video : video bus device
|
||||
* device : video output device under the video
|
||||
* bus
|
||||
* video : video bus device
|
||||
* device : video output device under the video
|
||||
* bus
|
||||
*
|
||||
* Return:
|
||||
* none
|
||||
*
|
||||
* none
|
||||
*
|
||||
* Bind the ids with the corresponding video devices
|
||||
* under the video bus.
|
||||
*/
|
||||
@ -1218,11 +1212,11 @@ acpi_video_device_bind(struct acpi_video_bus *video,
|
||||
|
||||
/*
|
||||
* Arg:
|
||||
* video : video bus device
|
||||
* video : video bus device
|
||||
*
|
||||
* Return:
|
||||
* < 0 : error
|
||||
*
|
||||
* < 0 : error
|
||||
*
|
||||
* Call _DOD to enumerate all devices attached to display adapter
|
||||
*
|
||||
*/
|
||||
@ -1283,7 +1277,7 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
||||
video->attached_array = active_list;
|
||||
video->attached_count = count;
|
||||
|
||||
out:
|
||||
out:
|
||||
kfree(buffer.pointer);
|
||||
return status;
|
||||
}
|
||||
@ -1728,7 +1722,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
||||
if (!strcmp(device->pnp.bus_id, "VID")) {
|
||||
if (instance)
|
||||
device->pnp.bus_id[3] = '0' + instance;
|
||||
instance ++;
|
||||
instance++;
|
||||
}
|
||||
/* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
|
||||
if (!strcmp(device->pnp.bus_id, "VGA")) {
|
||||
|
Loading…
Reference in New Issue
Block a user