-
Notifications
You must be signed in to change notification settings - Fork 242
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
789 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,263 @@ | ||
diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c | ||
index 5a606ea..7b5eb33 100644 | ||
--- a/drivers/acpi/acpica/dbdisply.c | ||
+++ b/drivers/acpi/acpica/dbdisply.c | ||
@@ -642,9 +642,8 @@ void acpi_db_display_object_type(char *object_arg) | ||
return; | ||
} | ||
|
||
- acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n", | ||
- ACPI_FORMAT_UINT64(info->address), | ||
- info->current_status, info->flags); | ||
+ acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n", | ||
+ ACPI_FORMAT_UINT64(info->address), info->flags); | ||
|
||
acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n", | ||
info->highest_dstates[0], info->highest_dstates[1], | ||
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c | ||
index d3b6b31..37b0b4c 100644 | ||
--- a/drivers/acpi/acpica/evevent.c | ||
+++ b/drivers/acpi/acpica/evevent.c | ||
@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void) | ||
u32 fixed_status; | ||
u32 fixed_enable; | ||
u32 i; | ||
+ acpi_status status; | ||
|
||
ACPI_FUNCTION_NAME(ev_fixed_event_detect); | ||
|
||
@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void) | ||
* Read the fixed feature status and enable registers, as all the cases | ||
* depend on their values. Ignore errors here. | ||
*/ | ||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status); | ||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable); | ||
+ status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status); | ||
+ status |= | ||
+ acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable); | ||
+ if (ACPI_FAILURE(status)) { | ||
+ return (int_status); | ||
+ } | ||
|
||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS, | ||
"Fixed Event Block: Enable %08X Status %08X\n", | ||
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c | ||
index a8191d2..2ad13d8 100644 | ||
--- a/drivers/acpi/acpica/exdebug.c | ||
+++ b/drivers/acpi/acpica/exdebug.c | ||
@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | ||
return_VOID; | ||
} | ||
|
||
- /* Null string or newline -- don't emit the line header */ | ||
+ /* Newline -- don't emit the line header */ | ||
|
||
if (source_desc && | ||
(ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) && | ||
(source_desc->common.type == ACPI_TYPE_STRING)) { | ||
- if ((source_desc->string.length == 0) || | ||
- ((source_desc->string.length == 1) && | ||
- (*source_desc->string.pointer == '\n'))) { | ||
+ if ((source_desc->string.length == 1) && | ||
+ (*source_desc->string.pointer == '\n')) { | ||
acpi_os_printf("\n"); | ||
return_VOID; | ||
} | ||
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c | ||
index 5026594..573a5f3 100644 | ||
--- a/drivers/acpi/acpica/nsdumpdv.c | ||
+++ b/drivers/acpi/acpica/nsdumpdv.c | ||
@@ -88,10 +88,9 @@ acpi_ns_dump_one_device(acpi_handle obj_handle, | ||
} | ||
|
||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES, | ||
- " HID: %s, ADR: %8.8X%8.8X, Status: %X\n", | ||
+ " HID: %s, ADR: %8.8X%8.8X\n", | ||
info->hardware_id.value, | ||
- ACPI_FORMAT_UINT64(info->address), | ||
- info->current_status)); | ||
+ ACPI_FORMAT_UINT64(info->address)); | ||
ACPI_FREE(info); | ||
} | ||
|
||
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c | ||
index 1069662..0a9c600 100644 | ||
--- a/drivers/acpi/acpica/nsxfname.c | ||
+++ b/drivers/acpi/acpica/nsxfname.c | ||
@@ -241,7 +241,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest, | ||
* namespace node and possibly by running several standard | ||
* control methods (Such as in the case of a device.) | ||
* | ||
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA, | ||
+ * For Device and Processor objects, run the Device _HID, _UID, _CID, | ||
* _CLS, _ADR, _sx_w, and _sx_d methods. | ||
* | ||
* Note: Allocates the return buffer, must be freed by the caller. | ||
@@ -250,8 +250,9 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest, | ||
* discovery namespace traversal. Therefore, no complex methods can be | ||
* executed, especially those that access operation regions. Therefore, do | ||
* not add any additional methods that could cause problems in this area. | ||
- * this was the fate of the _SUB method which was found to cause such | ||
- * problems and was removed (11/2015). | ||
+ * Because of this reason support for the following methods has been removed: | ||
+ * 1) _SUB method was removed (11/2015) | ||
+ * 2) _STA method was removed (02/2018) | ||
* | ||
******************************************************************************/ | ||
|
||
@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle, | ||
* Notes: none of these methods are required, so they may or may | ||
* not be present for this device. The Info->Valid bitfield is used | ||
* to indicate which methods were found and run successfully. | ||
- * | ||
- * For _STA, if the method does not exist, then (as per the ACPI | ||
- * specification), the returned current_status flags will indicate | ||
- * that the device is present/functional/enabled. Otherwise, the | ||
- * current_status flags reflect the value returned from _STA. | ||
*/ | ||
|
||
- /* Execute the Device._STA method */ | ||
- | ||
- status = acpi_ut_execute_STA(node, &info->current_status); | ||
- if (ACPI_SUCCESS(status)) { | ||
- valid |= ACPI_VALID_STA; | ||
- } | ||
- | ||
/* Execute the Device._ADR method */ | ||
|
||
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node, | ||
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c | ||
index eb9dfac..11ce4e5 100644 | ||
--- a/drivers/acpi/acpica/psargs.c | ||
+++ b/drivers/acpi/acpica/psargs.c | ||
@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state, | ||
ACPI_POSSIBLE_METHOD_CALL); | ||
|
||
if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) { | ||
+ | ||
+ /* Free method call op and corresponding namestring sub-ob */ | ||
+ | ||
+ acpi_ps_free_op(arg->common.value.arg); | ||
acpi_ps_free_op(arg); | ||
arg = NULL; | ||
walk_state->arg_count = 1; | ||
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c | ||
index b6d58cc..5c00e5e 100644 | ||
--- a/drivers/acpi/bus.c | ||
+++ b/drivers/acpi/bus.c | ||
@@ -135,6 +135,7 @@ acpi_status acpi_bus_get_status_handle(acpi_handle handle, | ||
} | ||
return status; | ||
} | ||
+EXPORT_SYMBOL_GPL(acpi_bus_get_status_handle); | ||
|
||
int acpi_bus_get_status(struct acpi_device *device) | ||
{ | ||
@@ -146,6 +147,12 @@ int acpi_bus_get_status(struct acpi_device *device) | ||
return 0; | ||
} | ||
|
||
+ /* Battery devices must have their deps met before calling _STA */ | ||
+ if (acpi_device_is_battery(device) && device->dep_unmet) { | ||
+ acpi_set_device_status(device, 0); | ||
+ return 0; | ||
+ } | ||
+ | ||
status = acpi_bus_get_status_handle(device->handle, &sta); | ||
if (ACPI_FAILURE(status)) | ||
return -ENODEV; | ||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
index b0fe527..4c1b90e 100644 | ||
--- a/drivers/acpi/scan.c | ||
+++ b/drivers/acpi/scan.c | ||
@@ -1565,6 +1565,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, | ||
device_initialize(&device->dev); | ||
dev_set_uevent_suppress(&device->dev, true); | ||
acpi_init_coherency(device); | ||
+ /* Assume there are unmet deps until acpi_device_dep_initialize runs */ | ||
+ device->dep_unmet = 1; | ||
} | ||
|
||
void acpi_device_add_finalize(struct acpi_device *device) | ||
@@ -1588,6 +1590,14 @@ static int acpi_add_single_object(struct acpi_device **child, | ||
} | ||
|
||
acpi_init_device_object(device, handle, type, sta); | ||
+ /* | ||
+ * For ACPI_BUS_TYPE_DEVICE getting the status is delayed till here so | ||
+ * that we can call acpi_bus_get_status and use its quirk handling. | ||
+ * Note this must be done before the get power-/wakeup_dev-flags calls. | ||
+ */ | ||
+ if (type == ACPI_BUS_TYPE_DEVICE) | ||
+ acpi_bus_get_status(device); | ||
+ | ||
acpi_bus_get_power_flags(device); | ||
acpi_bus_get_wakeup_device_flags(device); | ||
|
||
@@ -1660,9 +1670,11 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type, | ||
return -ENODEV; | ||
|
||
*type = ACPI_BUS_TYPE_DEVICE; | ||
- status = acpi_bus_get_status_handle(handle, sta); | ||
- if (ACPI_FAILURE(status)) | ||
- *sta = 0; | ||
+ /* | ||
+ * acpi_add_single_object updates this once we've an acpi_device | ||
+ * so that acpi_bus_get_status' quirk handling can be used. | ||
+ */ | ||
+ *sta = 0; | ||
break; | ||
case ACPI_TYPE_PROCESSOR: | ||
*type = ACPI_BUS_TYPE_PROCESSOR; | ||
@@ -1760,6 +1772,8 @@ static void acpi_device_dep_initialize(struct acpi_device *adev) | ||
acpi_status status; | ||
int i; | ||
|
||
+ adev->dep_unmet = 0; | ||
+ | ||
if (!acpi_has_method(adev->handle, "_DEP")) | ||
return; | ||
|
||
diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c | ||
index 984c7e8..8472c4a 100644 | ||
--- a/drivers/pci/hotplug/acpiphp_ibm.c | ||
+++ b/drivers/pci/hotplug/acpiphp_ibm.c | ||
@@ -399,6 +399,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle, | ||
u32 lvl, void *context, void **rv) | ||
{ | ||
acpi_handle *phandle = (acpi_handle *)context; | ||
+ unsigned long long current_status = 0; | ||
acpi_status status; | ||
struct acpi_device_info *info; | ||
int retval = 0; | ||
@@ -410,7 +411,9 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle, | ||
return retval; | ||
} | ||
|
||
- if (info->current_status && (info->valid & ACPI_VALID_HID) && | ||
+ acpi_bus_get_status_handle(handle, ¤t_status); | ||
+ | ||
+ if (current_status && (info->valid & ACPI_VALID_HID) && | ||
(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) || | ||
!strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) { | ||
pr_debug("found hardware: %s, handle: %p\n", | ||
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h | ||
index 4f077ed..220ef86 100644 | ||
--- a/include/acpi/actypes.h | ||
+++ b/include/acpi/actypes.h | ||
@@ -1191,7 +1191,6 @@ struct acpi_device_info { | ||
u8 flags; /* Miscellaneous info */ | ||
u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */ | ||
u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */ | ||
- u32 current_status; /* _STA value */ | ||
u64 address; /* _ADR value */ | ||
struct acpi_pnp_device_id hardware_id; /* _HID value */ | ||
struct acpi_pnp_device_id unique_id; /* _UID value */ | ||
@@ -1205,7 +1204,6 @@ struct acpi_device_info { | ||
|
||
/* Flags for Valid field above (acpi_get_object_info) */ | ||
|
||
-#define ACPI_VALID_STA 0x0001 | ||
#define ACPI_VALID_ADR 0x0002 | ||
#define ACPI_VALID_HID 0x0004 | ||
#define ACPI_VALID_UID 0x0008 |
Oops, something went wrong.