Merge tag 'pm+acpi-3.14-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI and power management fixes and cleanups from Rafael Wysocki:

- ACPI device hotplug fix preventing ACPI drivers from binding to device
objects that acpi_bus_trim() has been called for and the devices
represented by them may not be operational.

- Recent cpufreq changes related to the "boost" (turbo) feature broke
the acpi-cpufreq error code path causing a NULL pointer dereference
to occur on some systems. Fix from Konrad Rzeszutek Wilk.

- The log level of a CPU initialization error message added recently
needs to be reduced, because the particular BIOS issue indicated by
it turns out to be widespread and doesn't really matter for the
majority of systems having it. From Jiang Liu.

- The regulator API needs to be told to stay away from things on systems
with ACPI BIOSes or it may conflict with the BIOS' own handling of
voltage regulators. Fix from Mark Brown that works around a 3.13
regression in lm90 on PCs occuring if the regulator API is enabled.

- Prevent the Exynos4 devfreq driver from being built on multiplatform,
because it depends on things that aren't available during such builds.
From Sachin Kamat.

- Upstream ACPICA doesn't use the bool type as defined in the kernel,
so modify the kernel's ACPICA code to follow the upstream in that
respect (only one variable definition is affected) to reduce
divergences between the two. From Lv Zheng.

- Make the ACPI device PM code use ACPI_COMPANION() instead of its own
routine doing the same thing (and invokng ACPI_COMPANION() in the
process).

- Modify some routines in the ACPI processor driver to follow the
common convention and return negative integers on errors. From
Hanjun Guo.

* tag 'pm+acpi-3.14-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
ACPI / scan: Clear match_driver flag in acpi_bus_trim()
ACPI / init: Flag use of ACPI and ACPI idioms for power supplies to regulator API
acpi-cpufreq: De-register CPU notifier and free struct msr on error.
ACPICA: Remove bool usage from ACPICA.
PM / devfreq: Disable Exynos4 driver build on multiplatform
ACPI / PM: Use ACPI_COMPANION() to get ACPI companions of devices
ACPI / scan: reduce log level of "ACPI: \_PR_.CPU4: failed to get CPU APIC ID"
ACPI / processor: Return specific error value when mapping lapic id

+38 -39
+1 -1
drivers/acpi/acpi_processor.c
··· 261 261 262 262 apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id); 263 263 if (apic_id < 0) { 264 - acpi_handle_err(pr->handle, "failed to get CPU APIC ID.\n"); 264 + acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n"); 265 265 return -ENODEV; 266 266 } 267 267 pr->apic_id = apic_id;
+1 -1
drivers/acpi/acpica/acglobal.h
··· 108 108 /* 109 109 * Optionally enable output from the AML Debug Object. 110 110 */ 111 - bool ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); 111 + u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); 112 112 113 113 /* 114 114 * Optionally copy the entire DSDT to local memory (instead of simply
+9
drivers/acpi/bus.c
··· 33 33 #include <linux/proc_fs.h> 34 34 #include <linux/acpi.h> 35 35 #include <linux/slab.h> 36 + #include <linux/regulator/machine.h> 36 37 #ifdef CONFIG_X86 37 38 #include <asm/mpspec.h> 38 39 #endif ··· 509 508 printk(KERN_ERR PREFIX "Unable to enable ACPI\n"); 510 509 goto error0; 511 510 } 511 + 512 + /* 513 + * If the system is using ACPI then we can be reasonably 514 + * confident that any regulators are managed by the firmware 515 + * so tell the regulator core it has everything it needs to 516 + * know. 517 + */ 518 + regulator_has_full_constraints(); 512 519 513 520 return; 514 521
+6 -18
drivers/acpi/device_pm.c
··· 727 727 #endif /* CONFIG_PM_SLEEP */ 728 728 729 729 /** 730 - * acpi_dev_pm_get_node - Get ACPI device node for the given physical device. 731 - * @dev: Device to get the ACPI node for. 732 - */ 733 - struct acpi_device *acpi_dev_pm_get_node(struct device *dev) 734 - { 735 - acpi_handle handle = ACPI_HANDLE(dev); 736 - struct acpi_device *adev; 737 - 738 - return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL; 739 - } 740 - 741 - /** 742 730 * acpi_dev_pm_low_power - Put ACPI device into a low-power state. 743 731 * @dev: Device to put into a low-power state. 744 732 * @adev: ACPI device node corresponding to @dev. ··· 766 778 */ 767 779 int acpi_dev_runtime_suspend(struct device *dev) 768 780 { 769 - struct acpi_device *adev = acpi_dev_pm_get_node(dev); 781 + struct acpi_device *adev = ACPI_COMPANION(dev); 770 782 bool remote_wakeup; 771 783 int error; 772 784 ··· 797 809 */ 798 810 int acpi_dev_runtime_resume(struct device *dev) 799 811 { 800 - struct acpi_device *adev = acpi_dev_pm_get_node(dev); 812 + struct acpi_device *adev = ACPI_COMPANION(dev); 801 813 int error; 802 814 803 815 if (!adev) ··· 850 862 */ 851 863 int acpi_dev_suspend_late(struct device *dev) 852 864 { 853 - struct acpi_device *adev = acpi_dev_pm_get_node(dev); 865 + struct acpi_device *adev = ACPI_COMPANION(dev); 854 866 u32 target_state; 855 867 bool wakeup; 856 868 int error; ··· 882 894 */ 883 895 int acpi_dev_resume_early(struct device *dev) 884 896 { 885 - struct acpi_device *adev = acpi_dev_pm_get_node(dev); 897 + struct acpi_device *adev = ACPI_COMPANION(dev); 886 898 int error; 887 899 888 900 if (!adev) ··· 973 985 */ 974 986 int acpi_dev_pm_attach(struct device *dev, bool power_on) 975 987 { 976 - struct acpi_device *adev = acpi_dev_pm_get_node(dev); 988 + struct acpi_device *adev = ACPI_COMPANION(dev); 977 989 978 990 if (!adev) 979 991 return -ENODEV; ··· 1005 1017 */ 1006 1018 void acpi_dev_pm_detach(struct device *dev, bool power_off) 1007 1019 { 1008 - struct acpi_device *adev = acpi_dev_pm_get_node(dev); 1020 + struct acpi_device *adev = ACPI_COMPANION(dev); 1009 1021 1010 1022 if (adev && dev->pm_domain == &acpi_general_pm_domain) { 1011 1023 dev->pm_domain = NULL;
+13 -13
drivers/acpi/processor_core.c
··· 44 44 (struct acpi_madt_local_apic *)entry; 45 45 46 46 if (!(lapic->lapic_flags & ACPI_MADT_ENABLED)) 47 - return 0; 47 + return -ENODEV; 48 48 49 49 if (lapic->processor_id != acpi_id) 50 - return 0; 50 + return -EINVAL; 51 51 52 52 *apic_id = lapic->id; 53 - return 1; 53 + return 0; 54 54 } 55 55 56 56 static int map_x2apic_id(struct acpi_subtable_header *entry, ··· 60 60 (struct acpi_madt_local_x2apic *)entry; 61 61 62 62 if (!(apic->lapic_flags & ACPI_MADT_ENABLED)) 63 - return 0; 63 + return -ENODEV; 64 64 65 65 if (device_declaration && (apic->uid == acpi_id)) { 66 66 *apic_id = apic->local_apic_id; 67 - return 1; 67 + return 0; 68 68 } 69 69 70 - return 0; 70 + return -EINVAL; 71 71 } 72 72 73 73 static int map_lsapic_id(struct acpi_subtable_header *entry, ··· 77 77 (struct acpi_madt_local_sapic *)entry; 78 78 79 79 if (!(lsapic->lapic_flags & ACPI_MADT_ENABLED)) 80 - return 0; 80 + return -ENODEV; 81 81 82 82 if (device_declaration) { 83 83 if ((entry->length < 16) || (lsapic->uid != acpi_id)) 84 - return 0; 84 + return -EINVAL; 85 85 } else if (lsapic->processor_id != acpi_id) 86 - return 0; 86 + return -EINVAL; 87 87 88 88 *apic_id = (lsapic->id << 8) | lsapic->eid; 89 - return 1; 89 + return 0; 90 90 } 91 91 92 92 static int map_madt_entry(int type, u32 acpi_id) ··· 116 116 struct acpi_subtable_header *header = 117 117 (struct acpi_subtable_header *)entry; 118 118 if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) { 119 - if (map_lapic_id(header, acpi_id, &apic_id)) 119 + if (!map_lapic_id(header, acpi_id, &apic_id)) 120 120 break; 121 121 } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) { 122 - if (map_x2apic_id(header, type, acpi_id, &apic_id)) 122 + if (!map_x2apic_id(header, type, acpi_id, &apic_id)) 123 123 break; 124 124 } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { 125 - if (map_lsapic_id(header, type, acpi_id, &apic_id)) 125 + if (!map_lsapic_id(header, type, acpi_id, &apic_id)) 126 126 break; 127 127 } 128 128 entry += header->length;
+1
drivers/acpi/scan.c
··· 2105 2105 list_for_each_entry_reverse(child, &adev->children, node) 2106 2106 acpi_bus_trim(child); 2107 2107 2108 + adev->flags.match_driver = false; 2108 2109 if (handler) { 2109 2110 if (handler->detach) 2110 2111 handler->detach(adev);
+1 -1
drivers/acpi/sysfs.c
··· 226 226 /* /sys/modules/acpi/parameters/aml_debug_output */ 227 227 228 228 module_param_named(aml_debug_output, acpi_gbl_enable_aml_debug_object, 229 - bool, 0644); 229 + byte, 0644); 230 230 MODULE_PARM_DESC(aml_debug_output, 231 231 "To enable/disable the ACPI Debug Object output."); 232 232
+4 -3
drivers/cpufreq/acpi-cpufreq.c
··· 919 919 } 920 920 } 921 921 922 - static void __exit acpi_cpufreq_boost_exit(void) 922 + static void acpi_cpufreq_boost_exit(void) 923 923 { 924 924 if (msrs) { 925 925 unregister_cpu_notifier(&boost_nb); ··· 969 969 acpi_cpufreq_boost_init(); 970 970 971 971 ret = cpufreq_register_driver(&acpi_cpufreq_driver); 972 - if (ret) 972 + if (ret) { 973 973 free_acpi_perf_data(); 974 - 974 + acpi_cpufreq_boost_exit(); 975 + } 975 976 return ret; 976 977 } 977 978
+1 -1
drivers/devfreq/Kconfig
··· 67 67 68 68 config ARM_EXYNOS4_BUS_DEVFREQ 69 69 bool "ARM Exynos4210/4212/4412 Memory Bus DEVFREQ Driver" 70 - depends on CPU_EXYNOS4210 || SOC_EXYNOS4212 || SOC_EXYNOS4412 70 + depends on (CPU_EXYNOS4210 || SOC_EXYNOS4212 || SOC_EXYNOS4412) && !ARCH_MULTIPLATFORM 71 71 select ARCH_HAS_OPP 72 72 select DEVFREQ_GOV_SIMPLE_ONDEMAND 73 73 help
+1 -1
include/acpi/acpixf.h
··· 77 77 extern u8 acpi_gbl_disable_auto_repair; 78 78 extern u8 acpi_gbl_disable_ssdt_table_load; 79 79 extern u8 acpi_gbl_do_not_use_xsdt; 80 - extern bool acpi_gbl_enable_aml_debug_object; 80 + extern u8 acpi_gbl_enable_aml_debug_object; 81 81 extern u8 acpi_gbl_enable_interpreter_slack; 82 82 extern u32 acpi_gbl_trace_flags; 83 83 extern acpi_name acpi_gbl_trace_method_name;