mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Linux 3.17
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUMZqoAAoJEHm+PkMAQRiGFC4H/i0b9vxCwe6VCXonpaDW03fI JKE7v/zwDfhDngKSYfBWRSf3jXwfSHLvAvCgIvqTw5qBW3XSWF8xB7kJpWptQxIi M6ePfaETt2mPYhEWWWxJK8boykiOXObDrFJVhfjHGsjbvmKiLPMaGYwXTSwZJ32V fQDaA9Piugjc9wEY0d+6cjqUUEwlb4+GFz4Wv2oJgbpzxwgJS/XjQYk+3PrcdAXz lmwPXQ+6ntJaducVu3JM2YYvaJLzTw+T+MPsWiTvaE4ILmuiw492VNY5XdyQQtb2 DSActOKCF2hIwnG+DMg63XV5FH81HqczwORDygBuxko0cURxupxMnaLPkVRpksk= =+PRQ -----END PGP SIGNATURE----- Merge tag 'v3.17' into next Synchronize with mainline to bring in changes to Synaptics and i8042 drivers.
This commit is contained in:
commit
9d93551188
925 changed files with 9658 additions and 5139 deletions
|
|
@ -33,7 +33,7 @@ acpi_cmos_rtc_space_handler(u32 function, acpi_physical_address address,
|
|||
void *handler_context, void *region_context)
|
||||
{
|
||||
int i;
|
||||
u8 *value = (u8 *)&value64;
|
||||
u8 *value = (u8 *)value64;
|
||||
|
||||
if (address > 0xff || !value64)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
|
|
|||
|
|
@ -419,7 +419,6 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
adev->driver_data = pdata;
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
if (!IS_ERR_OR_NULL(pdev)) {
|
||||
device_enable_async_suspend(&pdev->dev);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -610,7 +609,7 @@ static int acpi_lpss_suspend_late(struct device *dev)
|
|||
return acpi_dev_suspend_late(dev);
|
||||
}
|
||||
|
||||
static int acpi_lpss_restore_early(struct device *dev)
|
||||
static int acpi_lpss_resume_early(struct device *dev)
|
||||
{
|
||||
int ret = acpi_dev_resume_early(dev);
|
||||
|
||||
|
|
@ -650,15 +649,15 @@ static int acpi_lpss_runtime_resume(struct device *dev)
|
|||
static struct dev_pm_domain acpi_lpss_pm_domain = {
|
||||
.ops = {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend_late = acpi_lpss_suspend_late,
|
||||
.restore_early = acpi_lpss_restore_early,
|
||||
.prepare = acpi_subsys_prepare,
|
||||
.complete = acpi_subsys_complete,
|
||||
.suspend = acpi_subsys_suspend,
|
||||
.resume_early = acpi_subsys_resume_early,
|
||||
.suspend_late = acpi_lpss_suspend_late,
|
||||
.resume_early = acpi_lpss_resume_early,
|
||||
.freeze = acpi_subsys_freeze,
|
||||
.poweroff = acpi_subsys_suspend,
|
||||
.poweroff_late = acpi_subsys_suspend_late,
|
||||
.poweroff_late = acpi_lpss_suspend_late,
|
||||
.restore_early = acpi_lpss_resume_early,
|
||||
#endif
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
.runtime_suspend = acpi_lpss_runtime_suspend,
|
||||
|
|
|
|||
|
|
@ -254,6 +254,7 @@ struct acpi_create_field_info {
|
|||
u32 field_bit_position;
|
||||
u32 field_bit_length;
|
||||
u16 resource_length;
|
||||
u16 pin_number_index;
|
||||
u8 field_flags;
|
||||
u8 attribute;
|
||||
u8 field_type;
|
||||
|
|
|
|||
|
|
@ -264,6 +264,7 @@ struct acpi_object_region_field {
|
|||
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length;
|
||||
union acpi_operand_object *region_obj; /* Containing op_region object */
|
||||
u8 *resource_buffer; /* resource_template for serial regions/fields */
|
||||
u16 pin_number_index; /* Index relative to previous Connection/Template */
|
||||
};
|
||||
|
||||
struct acpi_object_bank_field {
|
||||
|
|
|
|||
|
|
@ -360,6 +360,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
|
|||
*/
|
||||
info->resource_buffer = NULL;
|
||||
info->connection_node = NULL;
|
||||
info->pin_number_index = 0;
|
||||
|
||||
/*
|
||||
* A Connection() is either an actual resource descriptor (buffer)
|
||||
|
|
@ -437,6 +438,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
|
|||
}
|
||||
|
||||
info->field_bit_position += info->field_bit_length;
|
||||
info->pin_number_index++; /* Index relative to previous Connection() */
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -142,6 +142,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
union acpi_operand_object *region_obj2;
|
||||
void *region_context = NULL;
|
||||
struct acpi_connection_info *context;
|
||||
acpi_physical_address address;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
|
||||
|
||||
|
|
@ -231,25 +232,23 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
/* We have everything we need, we can invoke the address space handler */
|
||||
|
||||
handler = handler_desc->address_space.handler;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
|
||||
®ion_obj->region.handler->address_space, handler,
|
||||
ACPI_FORMAT_NATIVE_UINT(region_obj->region.address +
|
||||
region_offset),
|
||||
acpi_ut_get_region_name(region_obj->region.
|
||||
space_id)));
|
||||
address = (region_obj->region.address + region_offset);
|
||||
|
||||
/*
|
||||
* Special handling for generic_serial_bus and general_purpose_io:
|
||||
* There are three extra parameters that must be passed to the
|
||||
* handler via the context:
|
||||
* 1) Connection buffer, a resource template from Connection() op.
|
||||
* 2) Length of the above buffer.
|
||||
* 3) Actual access length from the access_as() op.
|
||||
* 1) Connection buffer, a resource template from Connection() op
|
||||
* 2) Length of the above buffer
|
||||
* 3) Actual access length from the access_as() op
|
||||
*
|
||||
* In addition, for general_purpose_io, the Address and bit_width fields
|
||||
* are defined as follows:
|
||||
* 1) Address is the pin number index of the field (bit offset from
|
||||
* the previous Connection)
|
||||
* 2) bit_width is the actual bit length of the field (number of pins)
|
||||
*/
|
||||
if (((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) ||
|
||||
(region_obj->region.space_id == ACPI_ADR_SPACE_GPIO)) &&
|
||||
if ((region_obj->region.space_id == ACPI_ADR_SPACE_GSBUS) &&
|
||||
context && field_obj) {
|
||||
|
||||
/* Get the Connection (resource_template) buffer */
|
||||
|
|
@ -258,6 +257,24 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
context->length = field_obj->field.resource_length;
|
||||
context->access_length = field_obj->field.access_length;
|
||||
}
|
||||
if ((region_obj->region.space_id == ACPI_ADR_SPACE_GPIO) &&
|
||||
context && field_obj) {
|
||||
|
||||
/* Get the Connection (resource_template) buffer */
|
||||
|
||||
context->connection = field_obj->field.resource_buffer;
|
||||
context->length = field_obj->field.resource_length;
|
||||
context->access_length = field_obj->field.access_length;
|
||||
address = field_obj->field.pin_number_index;
|
||||
bit_width = field_obj->field.bit_length;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
|
||||
®ion_obj->region.handler->address_space, handler,
|
||||
ACPI_FORMAT_NATIVE_UINT(address),
|
||||
acpi_ut_get_region_name(region_obj->region.
|
||||
space_id)));
|
||||
|
||||
if (!(handler_desc->address_space.handler_flags &
|
||||
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
|
||||
|
|
@ -271,9 +288,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
|
||||
/* Call the handler */
|
||||
|
||||
status = handler(function,
|
||||
(region_obj->region.address + region_offset),
|
||||
bit_width, value, context,
|
||||
status = handler(function, address, bit_width, value, context,
|
||||
region_obj2->extra.region_context);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
|||
|
|
@ -253,6 +253,37 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
|
|||
buffer = &buffer_desc->integer.value;
|
||||
}
|
||||
|
||||
if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
|
||||
(obj_desc->field.region_obj->region.space_id ==
|
||||
ACPI_ADR_SPACE_GPIO)) {
|
||||
/*
|
||||
* For GPIO (general_purpose_io), the Address will be the bit offset
|
||||
* from the previous Connection() operator, making it effectively a
|
||||
* pin number index. The bit_length is the length of the field, which
|
||||
* is thus the number of pins.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"GPIO FieldRead [FROM]: Pin %u Bits %u\n",
|
||||
obj_desc->field.pin_number_index,
|
||||
obj_desc->field.bit_length));
|
||||
|
||||
/* Lock entire transaction if requested */
|
||||
|
||||
acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags);
|
||||
|
||||
/* Perform the write */
|
||||
|
||||
status = acpi_ex_access_region(obj_desc, 0,
|
||||
(u64 *)buffer, ACPI_READ);
|
||||
acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_ut_remove_reference(buffer_desc);
|
||||
} else {
|
||||
*ret_buffer_desc = buffer_desc;
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n",
|
||||
obj_desc, obj_desc->common.type, buffer,
|
||||
|
|
@ -413,6 +444,42 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
|
||||
*result_desc = buffer_desc;
|
||||
return_ACPI_STATUS(status);
|
||||
} else if ((obj_desc->common.type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
|
||||
(obj_desc->field.region_obj->region.space_id ==
|
||||
ACPI_ADR_SPACE_GPIO)) {
|
||||
/*
|
||||
* For GPIO (general_purpose_io), we will bypass the entire field
|
||||
* mechanism and handoff the bit address and bit width directly to
|
||||
* the handler. The Address will be the bit offset
|
||||
* from the previous Connection() operator, making it effectively a
|
||||
* pin number index. The bit_length is the length of the field, which
|
||||
* is thus the number of pins.
|
||||
*/
|
||||
if (source_desc->common.type != ACPI_TYPE_INTEGER) {
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
|
||||
"GPIO FieldWrite [FROM]: (%s:%X), Val %.8X [TO]: Pin %u Bits %u\n",
|
||||
acpi_ut_get_type_name(source_desc->common.
|
||||
type),
|
||||
source_desc->common.type,
|
||||
(u32)source_desc->integer.value,
|
||||
obj_desc->field.pin_number_index,
|
||||
obj_desc->field.bit_length));
|
||||
|
||||
buffer = &source_desc->integer.value;
|
||||
|
||||
/* Lock entire transaction if requested */
|
||||
|
||||
acpi_ex_acquire_global_lock(obj_desc->common_field.field_flags);
|
||||
|
||||
/* Perform the write */
|
||||
|
||||
status = acpi_ex_access_region(obj_desc, 0,
|
||||
(u64 *)buffer, ACPI_WRITE);
|
||||
acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Get a pointer to the data to be written */
|
||||
|
|
|
|||
|
|
@ -484,6 +484,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
|
|||
obj_desc->field.resource_length = info->resource_length;
|
||||
}
|
||||
|
||||
obj_desc->field.pin_number_index = info->pin_number_index;
|
||||
|
||||
/* Allow full data read from EC address space */
|
||||
|
||||
if ((obj_desc->field.region_obj->region.space_id ==
|
||||
|
|
|
|||
|
|
@ -316,6 +316,45 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
|||
acpi_ns_check_package_list(info, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_UUID_PAIR:
|
||||
|
||||
/* The package must contain pairs of (UUID + type) */
|
||||
|
||||
if (count & 1) {
|
||||
expected_count = count + 1;
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
while (count > 0) {
|
||||
status = acpi_ns_check_object_type(info, elements,
|
||||
package->ret_info.
|
||||
object_type1, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Validate length of the UUID buffer */
|
||||
|
||||
if ((*elements)->buffer.length != 16) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO,
|
||||
info->full_pathname,
|
||||
info->node_flags,
|
||||
"Invalid length for UUID Buffer"));
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
status = acpi_ns_check_object_type(info, elements + 1,
|
||||
package->ret_info.
|
||||
object_type2, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
elements += 2;
|
||||
count -= 2;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Should not get here if predefined info table is correct */
|
||||
|
|
|
|||
|
|
@ -534,20 +534,6 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
|
|||
" invalid.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* When fully charged, some batteries wrongly report
|
||||
* capacity_now = design_capacity instead of = full_charge_capacity
|
||||
*/
|
||||
if (battery->capacity_now > battery->full_charge_capacity
|
||||
&& battery->full_charge_capacity != ACPI_BATTERY_VALUE_UNKNOWN) {
|
||||
if (battery->capacity_now != battery->design_capacity)
|
||||
printk_once(KERN_WARNING FW_BUG
|
||||
"battery: reported current charge level (%d) "
|
||||
"is higher than reported maximum charge level (%d).\n",
|
||||
battery->capacity_now, battery->full_charge_capacity);
|
||||
battery->capacity_now = battery->full_charge_capacity;
|
||||
}
|
||||
|
||||
if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
|
||||
&& battery->capacity_now >= 0 && battery->capacity_now <= 100)
|
||||
battery->capacity_now = (battery->capacity_now *
|
||||
|
|
|
|||
|
|
@ -177,16 +177,6 @@ void acpi_bus_detach_private_data(acpi_handle handle)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_detach_private_data);
|
||||
|
||||
void acpi_bus_no_hotplug(acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *adev = NULL;
|
||||
|
||||
acpi_bus_get_device(handle, &adev);
|
||||
if (adev)
|
||||
adev->flags.no_hotplug = true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_no_hotplug);
|
||||
|
||||
static void acpi_print_osc_error(acpi_handle handle,
|
||||
struct acpi_osc_context *context, char *error)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -99,6 +99,13 @@ static void container_device_detach(struct acpi_device *adev)
|
|||
device_unregister(dev);
|
||||
}
|
||||
|
||||
static void container_device_online(struct acpi_device *adev)
|
||||
{
|
||||
struct device *dev = acpi_driver_data(adev);
|
||||
|
||||
kobject_uevent(&dev->kobj, KOBJ_ONLINE);
|
||||
}
|
||||
|
||||
static struct acpi_scan_handler container_handler = {
|
||||
.ids = container_device_ids,
|
||||
.attach = container_device_attach,
|
||||
|
|
@ -106,6 +113,7 @@ static struct acpi_scan_handler container_handler = {
|
|||
.hotplug = {
|
||||
.enabled = true,
|
||||
.demand_offline = true,
|
||||
.notify_online = container_device_online,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1030,6 +1030,10 @@ static struct dmi_system_id ec_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL},
|
||||
{
|
||||
ec_flag_msi, "Clevo W350etq", {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "CLEVO CO."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "W35_37ET"),}, NULL},
|
||||
{
|
||||
ec_validate_ecdt, "ASUS hardware", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1071,9 +1071,9 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
|
|||
|
||||
if (pr->id == 0 && cpuidle_get_driver() == &acpi_idle_driver) {
|
||||
|
||||
cpuidle_pause_and_lock();
|
||||
/* Protect against cpu-hotplug */
|
||||
get_online_cpus();
|
||||
cpuidle_pause_and_lock();
|
||||
|
||||
/* Disable all cpuidle devices */
|
||||
for_each_online_cpu(cpu) {
|
||||
|
|
@ -1100,8 +1100,8 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
|
|||
cpuidle_enable_device(dev);
|
||||
}
|
||||
}
|
||||
put_online_cpus();
|
||||
cpuidle_resume_and_unlock();
|
||||
put_online_cpus();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
|
|||
list_for_each_entry(id, &acpi_dev->pnp.ids, list) {
|
||||
count = snprintf(&modalias[len], size, "%s:", id->id);
|
||||
if (count < 0)
|
||||
return EINVAL;
|
||||
return -EINVAL;
|
||||
if (count >= size)
|
||||
return -ENOMEM;
|
||||
len += count;
|
||||
|
|
@ -667,8 +667,14 @@ static ssize_t
|
|||
acpi_device_sun_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf) {
|
||||
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
||||
acpi_status status;
|
||||
unsigned long long sun;
|
||||
|
||||
return sprintf(buf, "%lu\n", acpi_dev->pnp.sun);
|
||||
status = acpi_evaluate_integer(acpi_dev->handle, "_SUN", NULL, &sun);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
return sprintf(buf, "%llu\n", sun);
|
||||
}
|
||||
static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL);
|
||||
|
||||
|
|
@ -690,7 +696,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
|
|||
{
|
||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
acpi_status status;
|
||||
unsigned long long sun;
|
||||
int result = 0;
|
||||
|
||||
/*
|
||||
|
|
@ -731,14 +736,10 @@ static int acpi_device_setup_files(struct acpi_device *dev)
|
|||
if (dev->pnp.unique_id)
|
||||
result = device_create_file(&dev->dev, &dev_attr_uid);
|
||||
|
||||
status = acpi_evaluate_integer(dev->handle, "_SUN", NULL, &sun);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
dev->pnp.sun = (unsigned long)sun;
|
||||
if (acpi_has_method(dev->handle, "_SUN")) {
|
||||
result = device_create_file(&dev->dev, &dev_attr_sun);
|
||||
if (result)
|
||||
goto end;
|
||||
} else {
|
||||
dev->pnp.sun = (unsigned long)-1;
|
||||
}
|
||||
|
||||
if (acpi_has_method(dev->handle, "_STA")) {
|
||||
|
|
@ -2188,6 +2189,9 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|||
ok:
|
||||
list_for_each_entry(child, &device->children, node)
|
||||
acpi_bus_attach(child);
|
||||
|
||||
if (device->handler && device->handler->hotplug.notify_online)
|
||||
device->handler->hotplug.notify_online(device);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -82,9 +82,9 @@ module_param(allow_duplicates, bool, 0644);
|
|||
* For Windows 8 systems: used to decide if video module
|
||||
* should skip registering backlight interface of its own.
|
||||
*/
|
||||
static int use_native_backlight_param = 1;
|
||||
static int use_native_backlight_param = -1;
|
||||
module_param_named(use_native_backlight, use_native_backlight_param, int, 0444);
|
||||
static bool use_native_backlight_dmi = false;
|
||||
static bool use_native_backlight_dmi = true;
|
||||
|
||||
static int register_count;
|
||||
static struct mutex video_list_lock;
|
||||
|
|
@ -417,6 +417,12 @@ static int __init video_set_use_native_backlight(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init video_disable_native_backlight(const struct dmi_system_id *d)
|
||||
{
|
||||
use_native_backlight_dmi = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
/*
|
||||
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
|
||||
|
|
@ -720,6 +726,49 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* These models have a working acpi_video backlight control, and using
|
||||
* native backlight causes a regression where backlight does not work
|
||||
* when userspace is not handling brightness key events. Disable
|
||||
* native_backlight on these to fix this:
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=81691
|
||||
*/
|
||||
{
|
||||
.callback = video_disable_native_backlight,
|
||||
.ident = "ThinkPad T420",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_disable_native_backlight,
|
||||
.ident = "ThinkPad T520",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_disable_native_backlight,
|
||||
.ident = "ThinkPad X201s",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
|
||||
},
|
||||
},
|
||||
|
||||
/* The native backlight controls do not work on some older machines */
|
||||
{
|
||||
/* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
|
||||
.callback = video_disable_native_backlight,
|
||||
.ident = "HP ENVY 15 Notebook",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue