Commit 8a3a53ea authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

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
parents 551f5c74 94fb9823
...@@ -192,6 +192,12 @@ static int __init dmi_disable_osi_win7(const struct dmi_system_id *d) ...@@ -192,6 +192,12 @@ static int __init dmi_disable_osi_win7(const struct dmi_system_id *d)
acpi_osi_setup("!Windows 2009"); acpi_osi_setup("!Windows 2009");
return 0; 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 = { static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
{ {
...@@ -267,6 +273,30 @@ 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"), 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. * BIOS invocation of _OSI(Linux) is almost always a BIOS bug.
......
/* /*
* video.c - ACPI Video Driver ($Revision:$) * video.c - ACPI Video Driver
* *
* Copyright (C) 2004 Luming Yu <luming.yu@intel.com> * Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
* Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org> * Copyright (C) 2004 Bruno Ducrot <ducrot@poupinou.org>
...@@ -88,7 +88,7 @@ module_param(allow_duplicates, bool, 0644); ...@@ -88,7 +88,7 @@ module_param(allow_duplicates, bool, 0644);
static bool use_bios_initial_backlight = 1; static bool use_bios_initial_backlight = 1;
module_param(use_bios_initial_backlight, bool, 0644); 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_add(struct acpi_device *device);
static int acpi_video_bus_remove(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); static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
...@@ -118,26 +118,26 @@ struct acpi_video_bus_flags { ...@@ -118,26 +118,26 @@ struct acpi_video_bus_flags {
}; };
struct acpi_video_bus_cap { struct acpi_video_bus_cap {
u8 _DOS:1; /*Enable/Disable output switching */ u8 _DOS:1; /* Enable/Disable output switching */
u8 _DOD:1; /*Enumerate all devices attached to display adapter */ u8 _DOD:1; /* Enumerate all devices attached to display adapter */
u8 _ROM:1; /*Get ROM Data */ u8 _ROM:1; /* Get ROM Data */
u8 _GPD:1; /*Get POST Device */ u8 _GPD:1; /* Get POST Device */
u8 _SPD:1; /*Set POST Device */ u8 _SPD:1; /* Set POST Device */
u8 _VPO:1; /*Video POST Options */ u8 _VPO:1; /* Video POST Options */
u8 reserved:2; u8 reserved:2;
}; };
struct acpi_video_device_attrib { struct acpi_video_device_attrib {
u32 display_index:4; /* A zero-based instance of the Display */ u32 display_index:4; /* A zero-based instance of the Display */
u32 display_port_attachment:4; /*This field differentiates the display type */ u32 display_port_attachment:4; /* This field differentiates the display type */
u32 display_type:4; /*Describe the specific type in use */ u32 display_type:4; /* Describe the specific type in use */
u32 vendor_specific:4; /*Chipset Vendor Specific */ u32 vendor_specific:4; /* Chipset Vendor Specific */
u32 bios_can_detect:1; /*BIOS can detect the device */ 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 depend_on_vga:1; /* Non-VGA output device whose power is related to
the VGA device. */ the VGA device. */
u32 pipe_id:3; /*For VGA multiple-head devices. */ u32 pipe_id:3; /* For VGA multiple-head devices. */
u32 reserved:10; /*Must be 0 */ u32 reserved:10; /* Must be 0 */
u32 device_id_scheme:1; /*Device ID Scheme */ u32 device_id_scheme:1; /* Device ID Scheme */
}; };
struct acpi_video_enumerated_device { struct acpi_video_enumerated_device {
...@@ -174,19 +174,17 @@ struct acpi_video_device_flags { ...@@ -174,19 +174,17 @@ struct acpi_video_device_flags {
}; };
struct acpi_video_device_cap { struct acpi_video_device_cap {
u8 _ADR:1; /*Return the unique ID */ u8 _ADR:1; /* Return the unique ID */
u8 _BCL:1; /*Query list of brightness control levels supported */ u8 _BCL:1; /* Query list of brightness control levels supported */
u8 _BCM:1; /*Set the brightness level */ u8 _BCM:1; /* Set the brightness level */
u8 _BQC:1; /* Get current brightness level */ u8 _BQC:1; /* Get current brightness level */
u8 _BCQ:1; /* Some buggy BIOS uses _BCQ instead of _BQC */ 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 { struct acpi_video_brightness_flags {
u8 _BCL_no_ac_battery_levels:1; /* no AC/Battery levels in _BCL */ 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_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 _BQC_use_index:1; /* _BQC returns an index value */ 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, ...@@ -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, static int acpi_video_switch_brightness(struct acpi_video_device *device,
int event); int event);
/*backlight device sysfs support*/ /* backlight device sysfs support */
static int acpi_video_get_brightness(struct backlight_device *bd) static int acpi_video_get_brightness(struct backlight_device *bd)
{ {
unsigned long long cur_level; unsigned long long cur_level;
int i; int i;
struct acpi_video_device *vd = struct acpi_video_device *vd = bl_get_data(bd);
(struct acpi_video_device *)bl_get_data(bd);
if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false)) if (acpi_video_device_lcd_get_level_current(vd, &cur_level, false))
return -EINVAL; return -EINVAL;
for (i = 2; i < vd->brightness->count; i++) { for (i = 2; i < vd->brightness->count; i++) {
if (vd->brightness->levels[i] == cur_level) if (vd->brightness->levels[i] == cur_level)
/* The first two entries are special - see page 575 /*
of the ACPI spec 3.0 */ * The first two entries are special - see page 575
return i-2; * of the ACPI spec 3.0
*/
return i - 2;
} }
return 0; return 0;
} }
...@@ -253,8 +252,7 @@ static int acpi_video_get_brightness(struct backlight_device *bd) ...@@ -253,8 +252,7 @@ static int acpi_video_get_brightness(struct backlight_device *bd)
static int acpi_video_set_brightness(struct backlight_device *bd) static int acpi_video_set_brightness(struct backlight_device *bd)
{ {
int request_level = bd->props.brightness + 2; int request_level = bd->props.brightness + 2;
struct acpi_video_device *vd = struct acpi_video_device *vd = bl_get_data(bd);
(struct acpi_video_device *)bl_get_data(bd);
return acpi_video_device_lcd_set_level(vd, return acpi_video_device_lcd_set_level(vd,
vd->brightness->levels[request_level]); vd->brightness->levels[request_level]);
...@@ -302,11 +300,11 @@ video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long st ...@@ -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); struct acpi_video_device *video = acpi_driver_data(device);
int level; int level;
if ( state >= video->brightness->count - 2) if (state >= video->brightness->count - 2)
return -EINVAL; return -EINVAL;
state = video->brightness->count - state; 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); return acpi_video_device_lcd_set_level(video, level);
} }
...@@ -316,9 +314,11 @@ static const struct thermal_cooling_device_ops video_cooling_ops = { ...@@ -316,9 +314,11 @@ static const struct thermal_cooling_device_ops video_cooling_ops = {
.set_cur_state = video_set_cur_state, .set_cur_state = video_set_cur_state,
}; };
/* -------------------------------------------------------------------------- /*
Video Management * --------------------------------------------------------------------------
-------------------------------------------------------------------------- */ * Video Management
* --------------------------------------------------------------------------
*/
static int static int
acpi_video_device_lcd_query_levels(struct acpi_video_device *device, 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, ...@@ -345,7 +345,7 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
return 0; return 0;
err: err:
kfree(buffer.pointer); kfree(buffer.pointer);
return status; return status;
...@@ -542,7 +542,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, ...@@ -542,7 +542,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
if (device->brightness->levels[i] == *level) { if (device->brightness->levels[i] == *level) {
device->brightness->curr = *level; device->brightness->curr = *level;
return 0; return 0;
} }
/* /*
* BQC returned an invalid level. * BQC returned an invalid level.
* Stop using it. * Stop using it.
...@@ -552,7 +552,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, ...@@ -552,7 +552,8 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
buf)); buf));
device->cap._BQC = device->cap._BCQ = 0; device->cap._BQC = device->cap._BCQ = 0;
} else { } else {
/* Fixme: /*
* Fixme:
* should we return an error or ignore this failure? * should we return an error or ignore this failure?
* dev->brightness->curr is a cached value which stores * dev->brightness->curr is a cached value which stores
* the correct current backlight level in most cases. * the correct current backlight level in most cases.
...@@ -611,8 +612,8 @@ acpi_video_device_EDID(struct acpi_video_device *device, ...@@ -611,8 +612,8 @@ acpi_video_device_EDID(struct acpi_video_device *device,
/* /*
* Arg: * Arg:
* video : video bus device pointer * video : video bus device pointer
* bios_flag : * bios_flag :
* 0. The system BIOS should NOT automatically switch(toggle) * 0. The system BIOS should NOT automatically switch(toggle)
* the active display output. * the active display output.
* 1. The system BIOS should automatically switch (toggle) the * 1. The system BIOS should automatically switch (toggle) the
...@@ -624,9 +625,9 @@ acpi_video_device_EDID(struct acpi_video_device *device, ...@@ -624,9 +625,9 @@ acpi_video_device_EDID(struct acpi_video_device *device,
* lcd_flag : * lcd_flag :
* 0. The system BIOS should automatically control the brightness level * 0. The system BIOS should automatically control the brightness level
* of the LCD when the power changes from AC to DC * 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. * level of the LCD when the power changes from AC to DC.
* Return Value: * Return Value:
* -EINVAL wrong arg. * -EINVAL wrong arg.
*/ */
...@@ -710,8 +711,8 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device, ...@@ -710,8 +711,8 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device,
/* /*
* Arg: * Arg:
* device : video output device (LCD, CRT, ..) * device : video output device (LCD, CRT, ..)
* *
* Return Value: * Return Value:
* Maximum brightness level * Maximum brightness level
...@@ -799,16 +800,6 @@ acpi_video_init_brightness(struct acpi_video_device *device) ...@@ -799,16 +800,6 @@ acpi_video_init_brightness(struct acpi_video_device *device)
br->count = count; br->count = count;
device->brightness = br; 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 */ /* _BQC uses INDEX while _BCL uses VALUE in some laptops */
br->curr = level = max_level; br->curr = level = max_level;
...@@ -870,7 +861,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) ...@@ -870,7 +861,7 @@ acpi_video_init_brightness(struct acpi_video_device *device)
* device : video output device (LCD, CRT, ..) * device : video output device (LCD, CRT, ..)
* *
* Return Value: * Return Value:
* None * None
* *
* Find out all required AML methods defined under the output * Find out all required AML methods defined under the output
* device. * device.
...@@ -900,7 +891,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -900,7 +891,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
acpi_handle acpi_parent; acpi_handle acpi_parent;
struct device *parent = NULL; struct device *parent = NULL;
int result; int result;
static int count = 0; static int count;
char *name; char *name;
result = acpi_video_init_brightness(device); result = acpi_video_init_brightness(device);
...@@ -969,11 +960,11 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -969,11 +960,11 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
} }
/* /*
* Arg: * Arg:
* device : video output device (VGA) * device : video output device (VGA)
* *
* Return Value: * Return Value:
* None * None
* *
* Find out all required AML methods defined under the video bus device. * 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) ...@@ -1012,7 +1003,8 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
return -ENODEV; return -ENODEV;
pci_dev_put(dev); 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. * to check well known required nodes.
*/ */
...@@ -1042,12 +1034,14 @@ static int acpi_video_bus_check(struct acpi_video_bus *video) ...@@ -1042,12 +1034,14 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
return status; return status;
} }
/* -------------------------------------------------------------------------- /*
Driver Interface * --------------------------------------------------------------------------
-------------------------------------------------------------------------- */ * Driver Interface
* --------------------------------------------------------------------------
*/
/* device 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) acpi_video_get_device_attr(struct acpi_video_bus *video, unsigned long device_id)
{ {
struct acpi_video_enumerated_device *ids; struct acpi_video_enumerated_device *ids;
...@@ -1085,7 +1079,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device, ...@@ -1085,7 +1079,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
unsigned long long device_id; unsigned long long device_id;
int status, device_type; int status, device_type;
struct acpi_video_device *data; struct acpi_video_device *data;
struct acpi_video_device_attrib* attribute; struct acpi_video_device_attrib *attribute;
status = status =
acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
...@@ -1107,7 +1101,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device, ...@@ -1107,7 +1101,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
attribute = acpi_video_get_device_attr(video, device_id); 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) { switch (attribute->display_type) {
case ACPI_VIDEO_DISPLAY_CRT: case ACPI_VIDEO_DISPLAY_CRT:
data->flags.crt = 1; data->flags.crt = 1;
...@@ -1125,24 +1119,24 @@ acpi_video_bus_get_one_device(struct acpi_device *device, ...@@ -1125,24 +1119,24 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
data->flags.unknown = 1; data->flags.unknown = 1;
break; break;
} }
if(attribute->bios_can_detect) if (attribute->bios_can_detect)
data->flags.bios = 1; data->flags.bios = 1;
} else { } else {
/* Check for legacy IDs */ /* Check for legacy IDs */
device_type = acpi_video_get_device_type(video, device_id); device_type = acpi_video_get_device_type(video, device_id);
/* Ignore bits 16 and 18-20 */ /* Ignore bits 16 and 18-20 */
switch (device_type & 0xffe2ffff) { switch (device_type & 0xffe2ffff) {
case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR: case ACPI_VIDEO_DISPLAY_LEGACY_MONITOR:
data->flags.crt = 1; data->flags.crt = 1;
break; break;
case ACPI_VIDEO_DISPLAY_LEGACY_PANEL: case ACPI_VIDEO_DISPLAY_LEGACY_PANEL:
data->flags.lcd = 1; data->flags.lcd = 1;
break; break;
case ACPI_VIDEO_DISPLAY_LEGACY_TV: case ACPI_VIDEO_DISPLAY_LEGACY_TV:
data->flags.tvout = 1; data->flags.tvout = 1;
break; break;
default: default:
data->flags.unknown = 1; data->flags.unknown = 1;
} }
} }
...@@ -1165,12 +1159,12 @@ acpi_video_bus_get_one_device(struct acpi_device *device, ...@@ -1165,12 +1159,12 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
/* /*
* Arg: * Arg:
* video : video bus device * video : video bus device
* *
* Return: * Return:
* none * none
* *
* Enumerate the video device list of the video bus, * Enumerate the video device list of the video bus,
* bind the ids with the corresponding video devices * bind the ids with the corresponding video devices
* under the video bus. * under the video bus.
*/ */
...@@ -1189,13 +1183,13 @@ static void acpi_video_device_rebind(struct acpi_video_bus *video) ...@@ -1189,13 +1183,13 @@ static void acpi_video_device_rebind(struct acpi_video_bus *video)
/* /*
* Arg: * Arg:
* video : video bus device * video : video bus device
* device : video output device under the video * device : video output device under the video
* bus * bus
* *
* Return: * Return:
* none * none
* *
* Bind the ids with the corresponding video devices * Bind the ids with the corresponding video devices
* under the video bus. * under the video bus.
*/ */
...@@ -1218,11 +1212,11 @@ acpi_video_device_bind(struct acpi_video_bus *video, ...@@ -1218,11 +1212,11 @@ acpi_video_device_bind(struct acpi_video_bus *video,
/* /*
* Arg: * Arg:
* video : video bus device * video : video bus device
* *
* Return: * Return:
* < 0 : error * < 0 : error
* *
* Call _DOD to enumerate all devices attached to display adapter * 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) ...@@ -1283,7 +1277,7 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
video->attached_array = active_list; video->attached_array = active_list;
video->attached_count = count; video->attached_count = count;
out: out:
kfree(buffer.pointer); kfree(buffer.pointer);
return status; return status;
} }
...@@ -1728,7 +1722,7 @@ static int acpi_video_bus_add(struct acpi_device *device) ...@@ -1728,7 +1722,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
if (!strcmp(device->pnp.bus_id, "VID")) { if (!strcmp(device->pnp.bus_id, "VID")) {
if (instance) if (instance)
device->pnp.bus_id[3] = '0' + instance; device->pnp.bus_id[3] = '0' + instance;
instance ++; instance++;
} }
/* a hack to fix the duplicate name "VGA" problem on Pa 3553 */ /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
if (!strcmp(device->pnp.bus_id, "VGA")) { if (!strcmp(device->pnp.bus_id, "VGA")) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment