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:
Rafael J. Wysocki 2013-08-27 01:40:40 +02:00
commit 8a3a53ea89
2 changed files with 117 additions and 93 deletions

View file

@ -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.

View file

@ -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 @@ acpi_video_init_brightness(struct acpi_video_device *device)
* 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")) {