Commit 4898b99c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-4.13-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI fixes from Rafael Wysocki:
 "These fix two recent regressions (in ACPICA and in the ACPI EC driver)
  and one bug in code introduced during the 4.12 cycle (ACPI device
  properties library routine).

  Specifics:

   - Fix a regression in the ACPI EC driver causing a kernel to crash
     during initialization on some systems due to a code ordering issue
     exposed by a recent change (Lv Zheng).

   - Fix a recent regression in ACPICA due to a change of the behavior
     of a library function in a way that is not backwards compatible
     with some existing callers of it (Rafael Wysocki).

   - Fix a coding mistake in a library function related to the handling
     of ACPI device properties introduced during the 4.12 cycle (Sakari
     Ailus)"

* tag 'acpi-4.13-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: device property: Fix node lookup in acpi_graph_get_child_prop_value()
  ACPICA: Fix acpi_evaluate_object_typed()
  ACPI: EC: Fix regression related to wrong ECDT initialization order
parents f7bbf075 d5d6c1dd
...@@ -100,10 +100,14 @@ acpi_evaluate_object_typed(acpi_handle handle, ...@@ -100,10 +100,14 @@ acpi_evaluate_object_typed(acpi_handle handle,
free_buffer_on_error = TRUE; free_buffer_on_error = TRUE;
} }
if (pathname) {
status = acpi_get_handle(handle, pathname, &target_handle); status = acpi_get_handle(handle, pathname, &target_handle);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
} else {
target_handle = handle;
}
full_pathname = acpi_ns_get_external_pathname(target_handle); full_pathname = acpi_ns_get_external_pathname(target_handle);
if (!full_pathname) { if (!full_pathname) {
......
...@@ -1741,7 +1741,7 @@ int __init acpi_ec_dsdt_probe(void) ...@@ -1741,7 +1741,7 @@ int __init acpi_ec_dsdt_probe(void)
* functioning ECDT EC first in order to handle the events. * functioning ECDT EC first in order to handle the events.
* https://bugzilla.kernel.org/show_bug.cgi?id=115021 * https://bugzilla.kernel.org/show_bug.cgi?id=115021
*/ */
int __init acpi_ec_ecdt_start(void) static int __init acpi_ec_ecdt_start(void)
{ {
acpi_handle handle; acpi_handle handle;
...@@ -2003,20 +2003,17 @@ static inline void acpi_ec_query_exit(void) ...@@ -2003,20 +2003,17 @@ static inline void acpi_ec_query_exit(void)
int __init acpi_ec_init(void) int __init acpi_ec_init(void)
{ {
int result; int result;
int ecdt_fail, dsdt_fail;
/* register workqueue for _Qxx evaluations */ /* register workqueue for _Qxx evaluations */
result = acpi_ec_query_init(); result = acpi_ec_query_init();
if (result) if (result)
goto err_exit;
/* Now register the driver for the EC */
result = acpi_bus_register_driver(&acpi_ec_driver);
if (result)
goto err_exit;
err_exit:
if (result)
acpi_ec_query_exit();
return result; return result;
/* Drivers must be started after acpi_ec_query_init() */
ecdt_fail = acpi_ec_ecdt_start();
dsdt_fail = acpi_bus_register_driver(&acpi_ec_driver);
return ecdt_fail && dsdt_fail ? -ENODEV : 0;
} }
/* EC driver currently not unloadable */ /* EC driver currently not unloadable */
......
...@@ -185,7 +185,6 @@ typedef int (*acpi_ec_query_func) (void *data); ...@@ -185,7 +185,6 @@ typedef int (*acpi_ec_query_func) (void *data);
int acpi_ec_init(void); int acpi_ec_init(void);
int acpi_ec_ecdt_probe(void); int acpi_ec_ecdt_probe(void);
int acpi_ec_dsdt_probe(void); int acpi_ec_dsdt_probe(void);
int acpi_ec_ecdt_start(void);
void acpi_ec_block_transactions(void); void acpi_ec_block_transactions(void);
void acpi_ec_unblock_transactions(void); void acpi_ec_unblock_transactions(void);
int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
......
...@@ -1047,7 +1047,7 @@ static struct fwnode_handle *acpi_graph_get_child_prop_value( ...@@ -1047,7 +1047,7 @@ static struct fwnode_handle *acpi_graph_get_child_prop_value(
fwnode_for_each_child_node(fwnode, child) { fwnode_for_each_child_node(fwnode, child) {
u32 nr; u32 nr;
if (!fwnode_property_read_u32(fwnode, prop_name, &nr)) if (fwnode_property_read_u32(child, prop_name, &nr))
continue; continue;
if (val == nr) if (val == nr)
......
...@@ -2084,7 +2084,6 @@ int __init acpi_scan_init(void) ...@@ -2084,7 +2084,6 @@ int __init acpi_scan_init(void)
acpi_gpe_apply_masked_gpes(); acpi_gpe_apply_masked_gpes();
acpi_update_all_gpes(); acpi_update_all_gpes();
acpi_ec_ecdt_start();
acpi_scan_initialized = true; acpi_scan_initialized = true;
......
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