diff options
Diffstat (limited to 'drivers/acpi')
| -rw-r--r-- | drivers/acpi/acpica/nsprepkg.c | 39 | ||||
| -rw-r--r-- | drivers/acpi/ec.c | 4 | ||||
| -rw-r--r-- | drivers/acpi/processor_idle.c | 4 | ||||
| -rw-r--r-- | drivers/acpi/scan.c | 15 | ||||
| -rw-r--r-- | drivers/acpi/video.c | 45 |
5 files changed, 96 insertions, 11 deletions
diff --git a/drivers/acpi/acpica/nsprepkg.c b/drivers/acpi/acpica/nsprepkg.c index 68f725839eb6..1b13b921dda9 100644 --- a/drivers/acpi/acpica/nsprepkg.c +++ b/drivers/acpi/acpica/nsprepkg.c | |||
| @@ -316,6 +316,45 @@ acpi_ns_check_package(struct acpi_evaluate_info *info, | |||
| 316 | acpi_ns_check_package_list(info, package, elements, count); | 316 | acpi_ns_check_package_list(info, package, elements, count); |
| 317 | break; | 317 | break; |
| 318 | 318 | ||
| 319 | case ACPI_PTYPE2_UUID_PAIR: | ||
| 320 | |||
| 321 | /* The package must contain pairs of (UUID + type) */ | ||
| 322 | |||
| 323 | if (count & 1) { | ||
| 324 | expected_count = count + 1; | ||
| 325 | goto package_too_small; | ||
| 326 | } | ||
| 327 | |||
| 328 | while (count > 0) { | ||
| 329 | status = acpi_ns_check_object_type(info, elements, | ||
| 330 | package->ret_info. | ||
| 331 | object_type1, 0); | ||
| 332 | if (ACPI_FAILURE(status)) { | ||
| 333 | return (status); | ||
| 334 | } | ||
| 335 | |||
| 336 | /* Validate length of the UUID buffer */ | ||
| 337 | |||
| 338 | if ((*elements)->buffer.length != 16) { | ||
| 339 | ACPI_WARN_PREDEFINED((AE_INFO, | ||
| 340 | info->full_pathname, | ||
| 341 | info->node_flags, | ||
| 342 | "Invalid length for UUID Buffer")); | ||
| 343 | return (AE_AML_OPERAND_VALUE); | ||
| 344 | } | ||
| 345 | |||
| 346 | status = acpi_ns_check_object_type(info, elements + 1, | ||
| 347 | package->ret_info. | ||
| 348 | object_type2, 0); | ||
| 349 | if (ACPI_FAILURE(status)) { | ||
| 350 | return (status); | ||
| 351 | } | ||
| 352 | |||
| 353 | elements += 2; | ||
| 354 | count -= 2; | ||
| 355 | } | ||
| 356 | break; | ||
| 357 | |||
| 319 | default: | 358 | default: |
| 320 | 359 | ||
| 321 | /* Should not get here if predefined info table is correct */ | 360 | /* Should not get here if predefined info table is correct */ |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 9922cc46b15c..cb6066c809ea 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -1030,6 +1030,10 @@ static struct dmi_system_id ec_dmi_table[] __initdata = { | |||
| 1030 | DMI_MATCH(DMI_SYS_VENDOR, "Quanta"), | 1030 | DMI_MATCH(DMI_SYS_VENDOR, "Quanta"), |
| 1031 | DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL}, | 1031 | DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL}, |
| 1032 | { | 1032 | { |
| 1033 | ec_flag_msi, "Clevo W350etq", { | ||
| 1034 | DMI_MATCH(DMI_SYS_VENDOR, "CLEVO CO."), | ||
| 1035 | DMI_MATCH(DMI_PRODUCT_NAME, "W35_37ET"),}, NULL}, | ||
| 1036 | { | ||
| 1033 | ec_validate_ecdt, "ASUS hardware", { | 1037 | ec_validate_ecdt, "ASUS hardware", { |
| 1034 | DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL}, | 1038 | DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL}, |
| 1035 | { | 1039 | { |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 3dca36d4ad26..17f9ec501972 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -1071,9 +1071,9 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) | |||
| 1071 | 1071 | ||
| 1072 | if (pr->id == 0 && cpuidle_get_driver() == &acpi_idle_driver) { | 1072 | if (pr->id == 0 && cpuidle_get_driver() == &acpi_idle_driver) { |
| 1073 | 1073 | ||
| 1074 | cpuidle_pause_and_lock(); | ||
| 1075 | /* Protect against cpu-hotplug */ | 1074 | /* Protect against cpu-hotplug */ |
| 1076 | get_online_cpus(); | 1075 | get_online_cpus(); |
| 1076 | cpuidle_pause_and_lock(); | ||
| 1077 | 1077 | ||
| 1078 | /* Disable all cpuidle devices */ | 1078 | /* Disable all cpuidle devices */ |
| 1079 | for_each_online_cpu(cpu) { | 1079 | for_each_online_cpu(cpu) { |
| @@ -1100,8 +1100,8 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) | |||
| 1100 | cpuidle_enable_device(dev); | 1100 | cpuidle_enable_device(dev); |
| 1101 | } | 1101 | } |
| 1102 | } | 1102 | } |
| 1103 | put_online_cpus(); | ||
| 1104 | cpuidle_resume_and_unlock(); | 1103 | cpuidle_resume_and_unlock(); |
| 1104 | put_online_cpus(); | ||
| 1105 | } | 1105 | } |
| 1106 | 1106 | ||
| 1107 | return 0; | 1107 | return 0; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 9a9298994e26..3bf7764659a4 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -667,8 +667,14 @@ static ssize_t | |||
| 667 | acpi_device_sun_show(struct device *dev, struct device_attribute *attr, | 667 | acpi_device_sun_show(struct device *dev, struct device_attribute *attr, |
| 668 | char *buf) { | 668 | char *buf) { |
| 669 | struct acpi_device *acpi_dev = to_acpi_device(dev); | 669 | struct acpi_device *acpi_dev = to_acpi_device(dev); |
| 670 | acpi_status status; | ||
| 671 | unsigned long long sun; | ||
| 672 | |||
| 673 | status = acpi_evaluate_integer(acpi_dev->handle, "_SUN", NULL, &sun); | ||
| 674 | if (ACPI_FAILURE(status)) | ||
| 675 | return -ENODEV; | ||
| 670 | 676 | ||
| 671 | return sprintf(buf, "%lu\n", acpi_dev->pnp.sun); | 677 | return sprintf(buf, "%llu\n", sun); |
| 672 | } | 678 | } |
| 673 | static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL); | 679 | static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL); |
| 674 | 680 | ||
| @@ -690,7 +696,6 @@ static int acpi_device_setup_files(struct acpi_device *dev) | |||
| 690 | { | 696 | { |
| 691 | struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; | 697 | struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; |
| 692 | acpi_status status; | 698 | acpi_status status; |
| 693 | unsigned long long sun; | ||
| 694 | int result = 0; | 699 | int result = 0; |
| 695 | 700 | ||
| 696 | /* | 701 | /* |
| @@ -731,14 +736,10 @@ static int acpi_device_setup_files(struct acpi_device *dev) | |||
| 731 | if (dev->pnp.unique_id) | 736 | if (dev->pnp.unique_id) |
| 732 | result = device_create_file(&dev->dev, &dev_attr_uid); | 737 | result = device_create_file(&dev->dev, &dev_attr_uid); |
| 733 | 738 | ||
| 734 | status = acpi_evaluate_integer(dev->handle, "_SUN", NULL, &sun); | 739 | if (acpi_has_method(dev->handle, "_SUN")) { |
| 735 | if (ACPI_SUCCESS(status)) { | ||
| 736 | dev->pnp.sun = (unsigned long)sun; | ||
| 737 | result = device_create_file(&dev->dev, &dev_attr_sun); | 740 | result = device_create_file(&dev->dev, &dev_attr_sun); |
| 738 | if (result) | 741 | if (result) |
| 739 | goto end; | 742 | goto end; |
| 740 | } else { | ||
| 741 | dev->pnp.sun = (unsigned long)-1; | ||
| 742 | } | 743 | } |
| 743 | 744 | ||
| 744 | if (acpi_has_method(dev->handle, "_STA")) { | 745 | if (acpi_has_method(dev->handle, "_STA")) { |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 826884392e6b..fcbda105616e 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -82,9 +82,9 @@ module_param(allow_duplicates, bool, 0644); | |||
| 82 | * For Windows 8 systems: used to decide if video module | 82 | * For Windows 8 systems: used to decide if video module |
| 83 | * should skip registering backlight interface of its own. | 83 | * should skip registering backlight interface of its own. |
| 84 | */ | 84 | */ |
| 85 | static int use_native_backlight_param = 1; | 85 | static int use_native_backlight_param = -1; |
| 86 | module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); | 86 | module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); |
| 87 | static bool use_native_backlight_dmi = false; | 87 | static bool use_native_backlight_dmi = true; |
| 88 | 88 | ||
| 89 | static int register_count; | 89 | static int register_count; |
| 90 | static struct mutex video_list_lock; | 90 | static struct mutex video_list_lock; |
| @@ -417,6 +417,12 @@ static int __init video_set_use_native_backlight(const struct dmi_system_id *d) | |||
| 417 | return 0; | 417 | return 0; |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | static int __init video_disable_native_backlight(const struct dmi_system_id *d) | ||
| 421 | { | ||
| 422 | use_native_backlight_dmi = false; | ||
| 423 | return 0; | ||
| 424 | } | ||
| 425 | |||
| 420 | static struct dmi_system_id video_dmi_table[] __initdata = { | 426 | static struct dmi_system_id video_dmi_table[] __initdata = { |
| 421 | /* | 427 | /* |
| 422 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 | 428 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 |
| @@ -720,6 +726,41 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 720 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), | 726 | DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), |
| 721 | }, | 727 | }, |
| 722 | }, | 728 | }, |
| 729 | |||
| 730 | /* | ||
| 731 | * These models have a working acpi_video backlight control, and using | ||
| 732 | * native backlight causes a regression where backlight does not work | ||
| 733 | * when userspace is not handling brightness key events. Disable | ||
| 734 | * native_backlight on these to fix this: | ||
| 735 | * https://bugzilla.kernel.org/show_bug.cgi?id=81691 | ||
| 736 | */ | ||
| 737 | { | ||
| 738 | .callback = video_disable_native_backlight, | ||
| 739 | .ident = "ThinkPad T420", | ||
| 740 | .matches = { | ||
| 741 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 742 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"), | ||
| 743 | }, | ||
| 744 | }, | ||
| 745 | { | ||
| 746 | .callback = video_disable_native_backlight, | ||
| 747 | .ident = "ThinkPad T520", | ||
| 748 | .matches = { | ||
| 749 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 750 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"), | ||
| 751 | }, | ||
| 752 | }, | ||
| 753 | |||
| 754 | /* The native backlight controls do not work on some older machines */ | ||
| 755 | { | ||
| 756 | /* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */ | ||
| 757 | .callback = video_disable_native_backlight, | ||
| 758 | .ident = "HP ENVY 15 Notebook", | ||
| 759 | .matches = { | ||
| 760 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
| 761 | DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"), | ||
| 762 | }, | ||
| 763 | }, | ||
| 723 | {} | 764 | {} |
| 724 | }; | 765 | }; |
| 725 | 766 | ||
