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
drivers/acpi
|
@ -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 = {
|
||||||
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.
|
||||||
|
|
|
@ -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 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);
|
||||||
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 {
|
||||||
};
|
};
|
||||||
|
|
||||||
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 {
|
||||||
};
|
};
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
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
|
||||||
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 = {
|
||||||
.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,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
kfree(buffer.pointer);
|
kfree(buffer.pointer);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,7 +1119,7 @@ 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 */
|
||||||
|
@ -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)
|
||||||
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")) {
|
||||||
|
|
Loading…
Reference in New Issue