diff options
| author | Ingo Molnar <mingo@kernel.org> | 2013-12-17 09:27:08 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2013-12-17 09:27:08 -0500 |
| commit | bb799d3b980eb803ca2da4a4eefbd9308f8d988a (patch) | |
| tree | 69fbe0cd6d47b23a50f5e1d87bf7489532fae149 /drivers/acpi | |
| parent | 919fc6e34831d1c2b58bfb5ae261dc3facc9b269 (diff) | |
| parent | 319e2e3f63c348a9b66db4667efa73178e18b17d (diff) | |
Merge tag 'v3.13-rc4' into core/locking
Merge Linux 3.13-rc4, to refresh this rather old tree with the latest fixes.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/acpi')
| -rw-r--r-- | drivers/acpi/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/acpi/ac.c | 15 | ||||
| -rw-r--r-- | drivers/acpi/acpi_lpss.c | 9 | ||||
| -rw-r--r-- | drivers/acpi/acpi_platform.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/acpica/acresrc.h | 6 | ||||
| -rw-r--r-- | drivers/acpi/acpica/nsalloc.c | 18 | ||||
| -rw-r--r-- | drivers/acpi/acpica/nsutils.c | 18 | ||||
| -rw-r--r-- | drivers/acpi/acpica/rscalc.c | 9 | ||||
| -rw-r--r-- | drivers/acpi/acpica/rscreate.c | 36 | ||||
| -rw-r--r-- | drivers/acpi/acpica/rsutils.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/acpica/utdebug.c | 31 | ||||
| -rw-r--r-- | drivers/acpi/blacklist.c | 35 | ||||
| -rw-r--r-- | drivers/acpi/device_pm.c | 14 | ||||
| -rw-r--r-- | drivers/acpi/ec.c | 3 | ||||
| -rw-r--r-- | drivers/acpi/glue.c | 53 | ||||
| -rw-r--r-- | drivers/acpi/nvs.c | 1 | ||||
| -rw-r--r-- | drivers/acpi/pci_root.c | 4 | ||||
| -rw-r--r-- | drivers/acpi/scan.c | 16 | ||||
| -rw-r--r-- | drivers/acpi/sleep.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/sysfs.c | 54 | ||||
| -rw-r--r-- | drivers/acpi/video.c | 87 |
21 files changed, 179 insertions, 247 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index c95df0b8c880..5d9248526d78 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
| @@ -235,17 +235,6 @@ config ACPI_INITRD_TABLE_OVERRIDE | |||
| 235 | initrd, therefore it's safe to say Y. | 235 | initrd, therefore it's safe to say Y. |
| 236 | See Documentation/acpi/initrd_table_override.txt for details | 236 | See Documentation/acpi/initrd_table_override.txt for details |
| 237 | 237 | ||
| 238 | config ACPI_BLACKLIST_YEAR | ||
| 239 | int "Disable ACPI for systems before Jan 1st this year" if X86_32 | ||
| 240 | default 0 | ||
| 241 | help | ||
| 242 | Enter a 4-digit year, e.g., 2001, to disable ACPI by default | ||
| 243 | on platforms with DMI BIOS date before January 1st that year. | ||
| 244 | "acpi=force" can be used to override this mechanism. | ||
| 245 | |||
| 246 | Enter 0 to disable this mechanism and allow ACPI to | ||
| 247 | run by default no matter what the year. (default) | ||
| 248 | |||
| 249 | config ACPI_DEBUG | 238 | config ACPI_DEBUG |
| 250 | bool "Debug Statements" | 239 | bool "Debug Statements" |
| 251 | default n | 240 | default n |
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index b9f0d5f4bba5..8711e3797165 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c | |||
| @@ -56,7 +56,6 @@ static int ac_sleep_before_get_state_ms; | |||
| 56 | 56 | ||
| 57 | struct acpi_ac { | 57 | struct acpi_ac { |
| 58 | struct power_supply charger; | 58 | struct power_supply charger; |
| 59 | struct acpi_device *adev; | ||
| 60 | struct platform_device *pdev; | 59 | struct platform_device *pdev; |
| 61 | unsigned long long state; | 60 | unsigned long long state; |
| 62 | }; | 61 | }; |
| @@ -70,8 +69,9 @@ struct acpi_ac { | |||
| 70 | static int acpi_ac_get_state(struct acpi_ac *ac) | 69 | static int acpi_ac_get_state(struct acpi_ac *ac) |
| 71 | { | 70 | { |
| 72 | acpi_status status; | 71 | acpi_status status; |
| 72 | acpi_handle handle = ACPI_HANDLE(&ac->pdev->dev); | ||
| 73 | 73 | ||
| 74 | status = acpi_evaluate_integer(ac->adev->handle, "_PSR", NULL, | 74 | status = acpi_evaluate_integer(handle, "_PSR", NULL, |
| 75 | &ac->state); | 75 | &ac->state); |
| 76 | if (ACPI_FAILURE(status)) { | 76 | if (ACPI_FAILURE(status)) { |
| 77 | ACPI_EXCEPTION((AE_INFO, status, | 77 | ACPI_EXCEPTION((AE_INFO, status, |
| @@ -119,6 +119,7 @@ static enum power_supply_property ac_props[] = { | |||
| 119 | static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data) | 119 | static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data) |
| 120 | { | 120 | { |
| 121 | struct acpi_ac *ac = data; | 121 | struct acpi_ac *ac = data; |
| 122 | struct acpi_device *adev; | ||
| 122 | 123 | ||
| 123 | if (!ac) | 124 | if (!ac) |
| 124 | return; | 125 | return; |
| @@ -141,10 +142,11 @@ static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data) | |||
| 141 | msleep(ac_sleep_before_get_state_ms); | 142 | msleep(ac_sleep_before_get_state_ms); |
| 142 | 143 | ||
| 143 | acpi_ac_get_state(ac); | 144 | acpi_ac_get_state(ac); |
| 144 | acpi_bus_generate_netlink_event(ac->adev->pnp.device_class, | 145 | adev = ACPI_COMPANION(&ac->pdev->dev); |
| 146 | acpi_bus_generate_netlink_event(adev->pnp.device_class, | ||
| 145 | dev_name(&ac->pdev->dev), | 147 | dev_name(&ac->pdev->dev), |
| 146 | event, (u32) ac->state); | 148 | event, (u32) ac->state); |
| 147 | acpi_notifier_call_chain(ac->adev, event, (u32) ac->state); | 149 | acpi_notifier_call_chain(adev, event, (u32) ac->state); |
| 148 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); | 150 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); |
| 149 | } | 151 | } |
| 150 | 152 | ||
| @@ -178,8 +180,8 @@ static int acpi_ac_probe(struct platform_device *pdev) | |||
| 178 | if (!pdev) | 180 | if (!pdev) |
| 179 | return -EINVAL; | 181 | return -EINVAL; |
| 180 | 182 | ||
| 181 | result = acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev); | 183 | adev = ACPI_COMPANION(&pdev->dev); |
| 182 | if (result) | 184 | if (!adev) |
| 183 | return -ENODEV; | 185 | return -ENODEV; |
| 184 | 186 | ||
| 185 | ac = kzalloc(sizeof(struct acpi_ac), GFP_KERNEL); | 187 | ac = kzalloc(sizeof(struct acpi_ac), GFP_KERNEL); |
| @@ -188,7 +190,6 @@ static int acpi_ac_probe(struct platform_device *pdev) | |||
| 188 | 190 | ||
| 189 | strcpy(acpi_device_name(adev), ACPI_AC_DEVICE_NAME); | 191 | strcpy(acpi_device_name(adev), ACPI_AC_DEVICE_NAME); |
| 190 | strcpy(acpi_device_class(adev), ACPI_AC_CLASS); | 192 | strcpy(acpi_device_class(adev), ACPI_AC_CLASS); |
| 191 | ac->adev = adev; | ||
| 192 | ac->pdev = pdev; | 193 | ac->pdev = pdev; |
| 193 | platform_set_drvdata(pdev, ac); | 194 | platform_set_drvdata(pdev, ac); |
| 194 | 195 | ||
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index d3961014aad7..6745fe137b9e 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
| @@ -163,6 +163,15 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = { | |||
| 163 | { "80860F41", (unsigned long)&byt_i2c_dev_desc }, | 163 | { "80860F41", (unsigned long)&byt_i2c_dev_desc }, |
| 164 | { "INT33B2", }, | 164 | { "INT33B2", }, |
| 165 | 165 | ||
| 166 | { "INT3430", (unsigned long)&lpt_dev_desc }, | ||
| 167 | { "INT3431", (unsigned long)&lpt_dev_desc }, | ||
| 168 | { "INT3432", (unsigned long)&lpt_dev_desc }, | ||
| 169 | { "INT3433", (unsigned long)&lpt_dev_desc }, | ||
| 170 | { "INT3434", (unsigned long)&lpt_uart_dev_desc }, | ||
| 171 | { "INT3435", (unsigned long)&lpt_uart_dev_desc }, | ||
| 172 | { "INT3436", (unsigned long)&lpt_sdio_dev_desc }, | ||
| 173 | { "INT3437", }, | ||
| 174 | |||
| 166 | { } | 175 | { } |
| 167 | }; | 176 | }; |
| 168 | 177 | ||
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c index 8a4cfc7e71f0..dbfe49e5fd63 100644 --- a/drivers/acpi/acpi_platform.c +++ b/drivers/acpi/acpi_platform.c | |||
| @@ -111,7 +111,7 @@ int acpi_create_platform_device(struct acpi_device *adev, | |||
| 111 | pdevinfo.id = -1; | 111 | pdevinfo.id = -1; |
| 112 | pdevinfo.res = resources; | 112 | pdevinfo.res = resources; |
| 113 | pdevinfo.num_res = count; | 113 | pdevinfo.num_res = count; |
| 114 | pdevinfo.acpi_node.handle = adev->handle; | 114 | pdevinfo.acpi_node.companion = adev; |
| 115 | pdev = platform_device_register_full(&pdevinfo); | 115 | pdev = platform_device_register_full(&pdevinfo); |
| 116 | if (IS_ERR(pdev)) { | 116 | if (IS_ERR(pdev)) { |
| 117 | dev_err(&adev->dev, "platform device creation failed: %ld\n", | 117 | dev_err(&adev->dev, "platform device creation failed: %ld\n", |
diff --git a/drivers/acpi/acpica/acresrc.h b/drivers/acpi/acpica/acresrc.h index f691d0e4d9fa..ff97430455cb 100644 --- a/drivers/acpi/acpica/acresrc.h +++ b/drivers/acpi/acpica/acresrc.h | |||
| @@ -184,7 +184,7 @@ acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer, | |||
| 184 | struct acpi_buffer *output_buffer); | 184 | struct acpi_buffer *output_buffer); |
| 185 | 185 | ||
| 186 | acpi_status | 186 | acpi_status |
| 187 | acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, | 187 | acpi_rs_create_aml_resources(struct acpi_buffer *resource_list, |
| 188 | struct acpi_buffer *output_buffer); | 188 | struct acpi_buffer *output_buffer); |
| 189 | 189 | ||
| 190 | acpi_status | 190 | acpi_status |
| @@ -227,8 +227,8 @@ acpi_rs_get_list_length(u8 * aml_buffer, | |||
| 227 | u32 aml_buffer_length, acpi_size * size_needed); | 227 | u32 aml_buffer_length, acpi_size * size_needed); |
| 228 | 228 | ||
| 229 | acpi_status | 229 | acpi_status |
| 230 | acpi_rs_get_aml_length(struct acpi_resource *linked_list_buffer, | 230 | acpi_rs_get_aml_length(struct acpi_resource *resource_list, |
| 231 | acpi_size * size_needed); | 231 | acpi_size resource_list_size, acpi_size * size_needed); |
| 232 | 232 | ||
| 233 | acpi_status | 233 | acpi_status |
| 234 | acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, | 234 | acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, |
diff --git a/drivers/acpi/acpica/nsalloc.c b/drivers/acpi/acpica/nsalloc.c index 243737363fb8..fd1ff54cda19 100644 --- a/drivers/acpi/acpica/nsalloc.c +++ b/drivers/acpi/acpica/nsalloc.c | |||
| @@ -106,6 +106,7 @@ struct acpi_namespace_node *acpi_ns_create_node(u32 name) | |||
| 106 | void acpi_ns_delete_node(struct acpi_namespace_node *node) | 106 | void acpi_ns_delete_node(struct acpi_namespace_node *node) |
| 107 | { | 107 | { |
| 108 | union acpi_operand_object *obj_desc; | 108 | union acpi_operand_object *obj_desc; |
| 109 | union acpi_operand_object *next_desc; | ||
| 109 | 110 | ||
| 110 | ACPI_FUNCTION_NAME(ns_delete_node); | 111 | ACPI_FUNCTION_NAME(ns_delete_node); |
| 111 | 112 | ||
| @@ -114,12 +115,13 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node) | |||
| 114 | acpi_ns_detach_object(node); | 115 | acpi_ns_detach_object(node); |
| 115 | 116 | ||
| 116 | /* | 117 | /* |
| 117 | * Delete an attached data object if present (an object that was created | 118 | * Delete an attached data object list if present (objects that were |
| 118 | * and attached via acpi_attach_data). Note: After any normal object is | 119 | * attached via acpi_attach_data). Note: After any normal object is |
| 119 | * detached above, the only possible remaining object is a data object. | 120 | * detached above, the only possible remaining object(s) are data |
| 121 | * objects, in a linked list. | ||
| 120 | */ | 122 | */ |
| 121 | obj_desc = node->object; | 123 | obj_desc = node->object; |
| 122 | if (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { | 124 | while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { |
| 123 | 125 | ||
| 124 | /* Invoke the attached data deletion handler if present */ | 126 | /* Invoke the attached data deletion handler if present */ |
| 125 | 127 | ||
| @@ -127,7 +129,15 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node) | |||
| 127 | obj_desc->data.handler(node, obj_desc->data.pointer); | 129 | obj_desc->data.handler(node, obj_desc->data.pointer); |
| 128 | } | 130 | } |
| 129 | 131 | ||
| 132 | next_desc = obj_desc->common.next_object; | ||
| 130 | acpi_ut_remove_reference(obj_desc); | 133 | acpi_ut_remove_reference(obj_desc); |
| 134 | obj_desc = next_desc; | ||
| 135 | } | ||
| 136 | |||
| 137 | /* Special case for the statically allocated root node */ | ||
| 138 | |||
| 139 | if (node == acpi_gbl_root_node) { | ||
| 140 | return; | ||
| 131 | } | 141 | } |
| 132 | 142 | ||
| 133 | /* Now we can delete the node */ | 143 | /* Now we can delete the node */ |
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c index cc2fea94c5f0..4a0665b6bcc1 100644 --- a/drivers/acpi/acpica/nsutils.c +++ b/drivers/acpi/acpica/nsutils.c | |||
| @@ -593,24 +593,26 @@ struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle) | |||
| 593 | 593 | ||
| 594 | void acpi_ns_terminate(void) | 594 | void acpi_ns_terminate(void) |
| 595 | { | 595 | { |
| 596 | union acpi_operand_object *obj_desc; | 596 | acpi_status status; |
| 597 | 597 | ||
| 598 | ACPI_FUNCTION_TRACE(ns_terminate); | 598 | ACPI_FUNCTION_TRACE(ns_terminate); |
| 599 | 599 | ||
| 600 | /* | 600 | /* |
| 601 | * 1) Free the entire namespace -- all nodes and objects | 601 | * Free the entire namespace -- all nodes and all objects |
| 602 | * | 602 | * attached to the nodes |
| 603 | * Delete all object descriptors attached to namepsace nodes | ||
| 604 | */ | 603 | */ |
| 605 | acpi_ns_delete_namespace_subtree(acpi_gbl_root_node); | 604 | acpi_ns_delete_namespace_subtree(acpi_gbl_root_node); |
| 606 | 605 | ||
| 607 | /* Detach any objects attached to the root */ | 606 | /* Delete any objects attached to the root node */ |
| 608 | 607 | ||
| 609 | obj_desc = acpi_ns_get_attached_object(acpi_gbl_root_node); | 608 | status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); |
| 610 | if (obj_desc) { | 609 | if (ACPI_FAILURE(status)) { |
| 611 | acpi_ns_detach_object(acpi_gbl_root_node); | 610 | return_VOID; |
| 612 | } | 611 | } |
| 613 | 612 | ||
| 613 | acpi_ns_delete_node(acpi_gbl_root_node); | ||
| 614 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | ||
| 615 | |||
| 614 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Namespace freed\n")); | 616 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Namespace freed\n")); |
| 615 | return_VOID; | 617 | return_VOID; |
| 616 | } | 618 | } |
diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index b62a0f4f4f9b..b60c9cf82862 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c | |||
| @@ -174,6 +174,7 @@ acpi_rs_stream_option_length(u32 resource_length, | |||
| 174 | * FUNCTION: acpi_rs_get_aml_length | 174 | * FUNCTION: acpi_rs_get_aml_length |
| 175 | * | 175 | * |
| 176 | * PARAMETERS: resource - Pointer to the resource linked list | 176 | * PARAMETERS: resource - Pointer to the resource linked list |
| 177 | * resource_list_size - Size of the resource linked list | ||
| 177 | * size_needed - Where the required size is returned | 178 | * size_needed - Where the required size is returned |
| 178 | * | 179 | * |
| 179 | * RETURN: Status | 180 | * RETURN: Status |
| @@ -185,16 +186,20 @@ acpi_rs_stream_option_length(u32 resource_length, | |||
| 185 | ******************************************************************************/ | 186 | ******************************************************************************/ |
| 186 | 187 | ||
| 187 | acpi_status | 188 | acpi_status |
| 188 | acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) | 189 | acpi_rs_get_aml_length(struct acpi_resource *resource, |
| 190 | acpi_size resource_list_size, acpi_size * size_needed) | ||
| 189 | { | 191 | { |
| 190 | acpi_size aml_size_needed = 0; | 192 | acpi_size aml_size_needed = 0; |
| 193 | struct acpi_resource *resource_end; | ||
| 191 | acpi_rs_length total_size; | 194 | acpi_rs_length total_size; |
| 192 | 195 | ||
| 193 | ACPI_FUNCTION_TRACE(rs_get_aml_length); | 196 | ACPI_FUNCTION_TRACE(rs_get_aml_length); |
| 194 | 197 | ||
| 195 | /* Traverse entire list of internal resource descriptors */ | 198 | /* Traverse entire list of internal resource descriptors */ |
| 196 | 199 | ||
| 197 | while (resource) { | 200 | resource_end = |
| 201 | ACPI_ADD_PTR(struct acpi_resource, resource, resource_list_size); | ||
| 202 | while (resource < resource_end) { | ||
| 198 | 203 | ||
| 199 | /* Validate the descriptor type */ | 204 | /* Validate the descriptor type */ |
| 200 | 205 | ||
diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index 65f3e1c5b598..3a2ace93e62c 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c | |||
| @@ -418,22 +418,21 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
| 418 | * | 418 | * |
| 419 | * FUNCTION: acpi_rs_create_aml_resources | 419 | * FUNCTION: acpi_rs_create_aml_resources |
| 420 | * | 420 | * |
| 421 | * PARAMETERS: linked_list_buffer - Pointer to the resource linked list | 421 | * PARAMETERS: resource_list - Pointer to the resource list buffer |
| 422 | * output_buffer - Pointer to the user's buffer | 422 | * output_buffer - Where the AML buffer is returned |
| 423 | * | 423 | * |
| 424 | * RETURN: Status AE_OK if okay, else a valid acpi_status code. | 424 | * RETURN: Status AE_OK if okay, else a valid acpi_status code. |
| 425 | * If the output_buffer is too small, the error will be | 425 | * If the output_buffer is too small, the error will be |
| 426 | * AE_BUFFER_OVERFLOW and output_buffer->Length will point | 426 | * AE_BUFFER_OVERFLOW and output_buffer->Length will point |
| 427 | * to the size buffer needed. | 427 | * to the size buffer needed. |
| 428 | * | 428 | * |
| 429 | * DESCRIPTION: Takes the linked list of device resources and | 429 | * DESCRIPTION: Converts a list of device resources to an AML bytestream |
| 430 | * creates a bytestream to be used as input for the | 430 | * to be used as input for the _SRS control method. |
| 431 | * _SRS control method. | ||
| 432 | * | 431 | * |
| 433 | ******************************************************************************/ | 432 | ******************************************************************************/ |
| 434 | 433 | ||
| 435 | acpi_status | 434 | acpi_status |
| 436 | acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, | 435 | acpi_rs_create_aml_resources(struct acpi_buffer *resource_list, |
| 437 | struct acpi_buffer *output_buffer) | 436 | struct acpi_buffer *output_buffer) |
| 438 | { | 437 | { |
| 439 | acpi_status status; | 438 | acpi_status status; |
| @@ -441,16 +440,16 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, | |||
| 441 | 440 | ||
| 442 | ACPI_FUNCTION_TRACE(rs_create_aml_resources); | 441 | ACPI_FUNCTION_TRACE(rs_create_aml_resources); |
| 443 | 442 | ||
| 444 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "LinkedListBuffer = %p\n", | 443 | /* Params already validated, no need to re-validate here */ |
| 445 | linked_list_buffer)); | ||
| 446 | 444 | ||
| 447 | /* | 445 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ResourceList Buffer = %p\n", |
| 448 | * Params already validated, so we don't re-validate here | 446 | resource_list->pointer)); |
| 449 | * | 447 | |
| 450 | * Pass the linked_list_buffer into a module that calculates | 448 | /* Get the buffer size needed for the AML byte stream */ |
| 451 | * the buffer size needed for the byte stream. | 449 | |
| 452 | */ | 450 | status = acpi_rs_get_aml_length(resource_list->pointer, |
| 453 | status = acpi_rs_get_aml_length(linked_list_buffer, &aml_size_needed); | 451 | resource_list->length, |
| 452 | &aml_size_needed); | ||
| 454 | 453 | ||
| 455 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n", | 454 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n", |
| 456 | (u32)aml_size_needed, acpi_format_exception(status))); | 455 | (u32)aml_size_needed, acpi_format_exception(status))); |
| @@ -467,10 +466,9 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, | |||
| 467 | 466 | ||
| 468 | /* Do the conversion */ | 467 | /* Do the conversion */ |
| 469 | 468 | ||
| 470 | status = | 469 | status = acpi_rs_convert_resources_to_aml(resource_list->pointer, |
| 471 | acpi_rs_convert_resources_to_aml(linked_list_buffer, | 470 | aml_size_needed, |
| 472 | aml_size_needed, | 471 | output_buffer->pointer); |
| 473 | output_buffer->pointer); | ||
| 474 | if (ACPI_FAILURE(status)) { | 472 | if (ACPI_FAILURE(status)) { |
| 475 | return_ACPI_STATUS(status); | 473 | return_ACPI_STATUS(status); |
| 476 | } | 474 | } |
diff --git a/drivers/acpi/acpica/rsutils.c b/drivers/acpi/acpica/rsutils.c index aef303d56d86..14a7982c9961 100644 --- a/drivers/acpi/acpica/rsutils.c +++ b/drivers/acpi/acpica/rsutils.c | |||
| @@ -753,7 +753,7 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, | |||
| 753 | * Convert the linked list into a byte stream | 753 | * Convert the linked list into a byte stream |
| 754 | */ | 754 | */ |
| 755 | buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; | 755 | buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; |
| 756 | status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer); | 756 | status = acpi_rs_create_aml_resources(in_buffer, &buffer); |
| 757 | if (ACPI_FAILURE(status)) { | 757 | if (ACPI_FAILURE(status)) { |
| 758 | goto cleanup; | 758 | goto cleanup; |
| 759 | } | 759 | } |
diff --git a/drivers/acpi/acpica/utdebug.c b/drivers/acpi/acpica/utdebug.c index 1a67b3944b3b..03ae8affe48f 100644 --- a/drivers/acpi/acpica/utdebug.c +++ b/drivers/acpi/acpica/utdebug.c | |||
| @@ -185,6 +185,7 @@ acpi_debug_print(u32 requested_debug_level, | |||
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | acpi_gbl_prev_thread_id = thread_id; | 187 | acpi_gbl_prev_thread_id = thread_id; |
| 188 | acpi_gbl_nesting_level = 0; | ||
| 188 | } | 189 | } |
| 189 | 190 | ||
| 190 | /* | 191 | /* |
| @@ -193,13 +194,21 @@ acpi_debug_print(u32 requested_debug_level, | |||
| 193 | */ | 194 | */ |
| 194 | acpi_os_printf("%9s-%04ld ", module_name, line_number); | 195 | acpi_os_printf("%9s-%04ld ", module_name, line_number); |
| 195 | 196 | ||
| 197 | #ifdef ACPI_EXEC_APP | ||
| 198 | /* | ||
| 199 | * For acpi_exec only, emit the thread ID and nesting level. | ||
| 200 | * Note: nesting level is really only useful during a single-thread | ||
| 201 | * execution. Otherwise, multiple threads will keep resetting the | ||
| 202 | * level. | ||
| 203 | */ | ||
| 196 | if (ACPI_LV_THREADS & acpi_dbg_level) { | 204 | if (ACPI_LV_THREADS & acpi_dbg_level) { |
| 197 | acpi_os_printf("[%u] ", (u32)thread_id); | 205 | acpi_os_printf("[%u] ", (u32)thread_id); |
| 198 | } | 206 | } |
| 199 | 207 | ||
| 200 | acpi_os_printf("[%02ld] %-22.22s: ", | 208 | acpi_os_printf("[%02ld] ", acpi_gbl_nesting_level); |
| 201 | acpi_gbl_nesting_level, | 209 | #endif |
| 202 | acpi_ut_trim_function_name(function_name)); | 210 | |
| 211 | acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name)); | ||
| 203 | 212 | ||
| 204 | va_start(args, format); | 213 | va_start(args, format); |
| 205 | acpi_os_vprintf(format, args); | 214 | acpi_os_vprintf(format, args); |
| @@ -420,7 +429,9 @@ acpi_ut_exit(u32 line_number, | |||
| 420 | component_id, "%s\n", acpi_gbl_fn_exit_str); | 429 | component_id, "%s\n", acpi_gbl_fn_exit_str); |
| 421 | } | 430 | } |
| 422 | 431 | ||
| 423 | acpi_gbl_nesting_level--; | 432 | if (acpi_gbl_nesting_level) { |
| 433 | acpi_gbl_nesting_level--; | ||
| 434 | } | ||
| 424 | } | 435 | } |
| 425 | 436 | ||
| 426 | ACPI_EXPORT_SYMBOL(acpi_ut_exit) | 437 | ACPI_EXPORT_SYMBOL(acpi_ut_exit) |
| @@ -467,7 +478,9 @@ acpi_ut_status_exit(u32 line_number, | |||
| 467 | } | 478 | } |
| 468 | } | 479 | } |
| 469 | 480 | ||
| 470 | acpi_gbl_nesting_level--; | 481 | if (acpi_gbl_nesting_level) { |
| 482 | acpi_gbl_nesting_level--; | ||
| 483 | } | ||
| 471 | } | 484 | } |
| 472 | 485 | ||
| 473 | ACPI_EXPORT_SYMBOL(acpi_ut_status_exit) | 486 | ACPI_EXPORT_SYMBOL(acpi_ut_status_exit) |
| @@ -504,7 +517,9 @@ acpi_ut_value_exit(u32 line_number, | |||
| 504 | ACPI_FORMAT_UINT64(value)); | 517 | ACPI_FORMAT_UINT64(value)); |
| 505 | } | 518 | } |
| 506 | 519 | ||
| 507 | acpi_gbl_nesting_level--; | 520 | if (acpi_gbl_nesting_level) { |
| 521 | acpi_gbl_nesting_level--; | ||
| 522 | } | ||
| 508 | } | 523 | } |
| 509 | 524 | ||
| 510 | ACPI_EXPORT_SYMBOL(acpi_ut_value_exit) | 525 | ACPI_EXPORT_SYMBOL(acpi_ut_value_exit) |
| @@ -540,7 +555,9 @@ acpi_ut_ptr_exit(u32 line_number, | |||
| 540 | ptr); | 555 | ptr); |
| 541 | } | 556 | } |
| 542 | 557 | ||
| 543 | acpi_gbl_nesting_level--; | 558 | if (acpi_gbl_nesting_level) { |
| 559 | acpi_gbl_nesting_level--; | ||
| 560 | } | ||
| 544 | } | 561 | } |
| 545 | 562 | ||
| 546 | #endif | 563 | #endif |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index fb848378d582..078c4f7fe2dd 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
| @@ -75,39 +75,6 @@ static struct acpi_blacklist_item acpi_blacklist[] __initdata = { | |||
| 75 | {""} | 75 | {""} |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | #if CONFIG_ACPI_BLACKLIST_YEAR | ||
| 79 | |||
| 80 | static int __init blacklist_by_year(void) | ||
| 81 | { | ||
| 82 | int year; | ||
| 83 | |||
| 84 | /* Doesn't exist? Likely an old system */ | ||
| 85 | if (!dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL)) { | ||
| 86 | printk(KERN_ERR PREFIX "no DMI BIOS year, " | ||
| 87 | "acpi=force is required to enable ACPI\n" ); | ||
| 88 | return 1; | ||
| 89 | } | ||
| 90 | /* 0? Likely a buggy new BIOS */ | ||
| 91 | if (year == 0) { | ||
| 92 | printk(KERN_ERR PREFIX "DMI BIOS year==0, " | ||
| 93 | "assuming ACPI-capable machine\n" ); | ||
| 94 | return 0; | ||
| 95 | } | ||
| 96 | if (year < CONFIG_ACPI_BLACKLIST_YEAR) { | ||
| 97 | printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), " | ||
| 98 | "acpi=force is required to enable ACPI\n", | ||
| 99 | year, CONFIG_ACPI_BLACKLIST_YEAR); | ||
| 100 | return 1; | ||
| 101 | } | ||
| 102 | return 0; | ||
| 103 | } | ||
| 104 | #else | ||
| 105 | static inline int blacklist_by_year(void) | ||
| 106 | { | ||
| 107 | return 0; | ||
| 108 | } | ||
| 109 | #endif | ||
| 110 | |||
| 111 | int __init acpi_blacklisted(void) | 78 | int __init acpi_blacklisted(void) |
| 112 | { | 79 | { |
| 113 | int i = 0; | 80 | int i = 0; |
| @@ -166,8 +133,6 @@ int __init acpi_blacklisted(void) | |||
| 166 | } | 133 | } |
| 167 | } | 134 | } |
| 168 | 135 | ||
| 169 | blacklisted += blacklist_by_year(); | ||
| 170 | |||
| 171 | dmi_check_system(acpi_osi_dmi_table); | 136 | dmi_check_system(acpi_osi_dmi_table); |
| 172 | 137 | ||
| 173 | return blacklisted; | 138 | return blacklisted; |
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index d42b2fb5a7e9..b3480cf7db1a 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
| @@ -22,16 +22,12 @@ | |||
| 22 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 22 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | #include <linux/device.h> | 25 | #include <linux/acpi.h> |
| 26 | #include <linux/export.h> | 26 | #include <linux/export.h> |
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/pm_qos.h> | 28 | #include <linux/pm_qos.h> |
| 29 | #include <linux/pm_runtime.h> | 29 | #include <linux/pm_runtime.h> |
| 30 | 30 | ||
| 31 | #include <acpi/acpi.h> | ||
| 32 | #include <acpi/acpi_bus.h> | ||
| 33 | #include <acpi/acpi_drivers.h> | ||
| 34 | |||
| 35 | #include "internal.h" | 31 | #include "internal.h" |
| 36 | 32 | ||
| 37 | #define _COMPONENT ACPI_POWER_COMPONENT | 33 | #define _COMPONENT ACPI_POWER_COMPONENT |
| @@ -548,7 +544,7 @@ static int acpi_dev_pm_get_state(struct device *dev, struct acpi_device *adev, | |||
| 548 | */ | 544 | */ |
| 549 | int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in) | 545 | int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in) |
| 550 | { | 546 | { |
| 551 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); | 547 | acpi_handle handle = ACPI_HANDLE(dev); |
| 552 | struct acpi_device *adev; | 548 | struct acpi_device *adev; |
| 553 | int ret, d_min, d_max; | 549 | int ret, d_min, d_max; |
| 554 | 550 | ||
| @@ -656,7 +652,7 @@ int acpi_pm_device_run_wake(struct device *phys_dev, bool enable) | |||
| 656 | if (!device_run_wake(phys_dev)) | 652 | if (!device_run_wake(phys_dev)) |
| 657 | return -EINVAL; | 653 | return -EINVAL; |
| 658 | 654 | ||
| 659 | handle = DEVICE_ACPI_HANDLE(phys_dev); | 655 | handle = ACPI_HANDLE(phys_dev); |
| 660 | if (!handle || acpi_bus_get_device(handle, &adev)) { | 656 | if (!handle || acpi_bus_get_device(handle, &adev)) { |
| 661 | dev_dbg(phys_dev, "ACPI handle without context in %s!\n", | 657 | dev_dbg(phys_dev, "ACPI handle without context in %s!\n", |
| 662 | __func__); | 658 | __func__); |
| @@ -700,7 +696,7 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable) | |||
| 700 | if (!device_can_wakeup(dev)) | 696 | if (!device_can_wakeup(dev)) |
| 701 | return -EINVAL; | 697 | return -EINVAL; |
| 702 | 698 | ||
| 703 | handle = DEVICE_ACPI_HANDLE(dev); | 699 | handle = ACPI_HANDLE(dev); |
| 704 | if (!handle || acpi_bus_get_device(handle, &adev)) { | 700 | if (!handle || acpi_bus_get_device(handle, &adev)) { |
| 705 | dev_dbg(dev, "ACPI handle without context in %s!\n", __func__); | 701 | dev_dbg(dev, "ACPI handle without context in %s!\n", __func__); |
| 706 | return -ENODEV; | 702 | return -ENODEV; |
| @@ -722,7 +718,7 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable) | |||
| 722 | */ | 718 | */ |
| 723 | struct acpi_device *acpi_dev_pm_get_node(struct device *dev) | 719 | struct acpi_device *acpi_dev_pm_get_node(struct device *dev) |
| 724 | { | 720 | { |
| 725 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); | 721 | acpi_handle handle = ACPI_HANDLE(dev); |
| 726 | struct acpi_device *adev; | 722 | struct acpi_device *adev; |
| 727 | 723 | ||
| 728 | return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL; | 724 | return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL; |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index d5309fd49458..ba5b56db9d27 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -173,9 +173,10 @@ static void start_transaction(struct acpi_ec *ec) | |||
| 173 | static void advance_transaction(struct acpi_ec *ec, u8 status) | 173 | static void advance_transaction(struct acpi_ec *ec, u8 status) |
| 174 | { | 174 | { |
| 175 | unsigned long flags; | 175 | unsigned long flags; |
| 176 | struct transaction *t = ec->curr; | 176 | struct transaction *t; |
| 177 | 177 | ||
| 178 | spin_lock_irqsave(&ec->lock, flags); | 178 | spin_lock_irqsave(&ec->lock, flags); |
| 179 | t = ec->curr; | ||
| 179 | if (!t) | 180 | if (!t) |
| 180 | goto unlock; | 181 | goto unlock; |
| 181 | if (t->wlen > t->wi) { | 182 | if (t->wlen > t->wi) { |
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 10f0f40587bb..a22a295edb69 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -197,30 +197,28 @@ static void acpi_physnode_link_name(char *buf, unsigned int node_id) | |||
| 197 | 197 | ||
| 198 | int acpi_bind_one(struct device *dev, acpi_handle handle) | 198 | int acpi_bind_one(struct device *dev, acpi_handle handle) |
| 199 | { | 199 | { |
| 200 | struct acpi_device *acpi_dev; | 200 | struct acpi_device *acpi_dev = NULL; |
| 201 | acpi_status status; | ||
| 202 | struct acpi_device_physical_node *physical_node, *pn; | 201 | struct acpi_device_physical_node *physical_node, *pn; |
| 203 | char physical_node_name[PHYSICAL_NODE_NAME_SIZE]; | 202 | char physical_node_name[PHYSICAL_NODE_NAME_SIZE]; |
| 204 | struct list_head *physnode_list; | 203 | struct list_head *physnode_list; |
| 205 | unsigned int node_id; | 204 | unsigned int node_id; |
| 206 | int retval = -EINVAL; | 205 | int retval = -EINVAL; |
| 207 | 206 | ||
| 208 | if (ACPI_HANDLE(dev)) { | 207 | if (ACPI_COMPANION(dev)) { |
| 209 | if (handle) { | 208 | if (handle) { |
| 210 | dev_warn(dev, "ACPI handle is already set\n"); | 209 | dev_warn(dev, "ACPI companion already set\n"); |
| 211 | return -EINVAL; | 210 | return -EINVAL; |
| 212 | } else { | 211 | } else { |
| 213 | handle = ACPI_HANDLE(dev); | 212 | acpi_dev = ACPI_COMPANION(dev); |
| 214 | } | 213 | } |
| 214 | } else { | ||
| 215 | acpi_bus_get_device(handle, &acpi_dev); | ||
| 215 | } | 216 | } |
| 216 | if (!handle) | 217 | if (!acpi_dev) |
| 217 | return -EINVAL; | 218 | return -EINVAL; |
| 218 | 219 | ||
| 220 | get_device(&acpi_dev->dev); | ||
| 219 | get_device(dev); | 221 | get_device(dev); |
| 220 | status = acpi_bus_get_device(handle, &acpi_dev); | ||
| 221 | if (ACPI_FAILURE(status)) | ||
| 222 | goto err; | ||
| 223 | |||
| 224 | physical_node = kzalloc(sizeof(*physical_node), GFP_KERNEL); | 222 | physical_node = kzalloc(sizeof(*physical_node), GFP_KERNEL); |
| 225 | if (!physical_node) { | 223 | if (!physical_node) { |
| 226 | retval = -ENOMEM; | 224 | retval = -ENOMEM; |
| @@ -242,10 +240,11 @@ int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
| 242 | 240 | ||
| 243 | dev_warn(dev, "Already associated with ACPI node\n"); | 241 | dev_warn(dev, "Already associated with ACPI node\n"); |
| 244 | kfree(physical_node); | 242 | kfree(physical_node); |
| 245 | if (ACPI_HANDLE(dev) != handle) | 243 | if (ACPI_COMPANION(dev) != acpi_dev) |
| 246 | goto err; | 244 | goto err; |
| 247 | 245 | ||
| 248 | put_device(dev); | 246 | put_device(dev); |
| 247 | put_device(&acpi_dev->dev); | ||
| 249 | return 0; | 248 | return 0; |
| 250 | } | 249 | } |
| 251 | if (pn->node_id == node_id) { | 250 | if (pn->node_id == node_id) { |
| @@ -259,8 +258,8 @@ int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
| 259 | list_add(&physical_node->node, physnode_list); | 258 | list_add(&physical_node->node, physnode_list); |
| 260 | acpi_dev->physical_node_count++; | 259 | acpi_dev->physical_node_count++; |
| 261 | 260 | ||
| 262 | if (!ACPI_HANDLE(dev)) | 261 | if (!ACPI_COMPANION(dev)) |
| 263 | ACPI_HANDLE_SET(dev, acpi_dev->handle); | 262 | ACPI_COMPANION_SET(dev, acpi_dev); |
| 264 | 263 | ||
| 265 | acpi_physnode_link_name(physical_node_name, node_id); | 264 | acpi_physnode_link_name(physical_node_name, node_id); |
| 266 | retval = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, | 265 | retval = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, |
| @@ -283,27 +282,21 @@ int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
| 283 | return 0; | 282 | return 0; |
| 284 | 283 | ||
| 285 | err: | 284 | err: |
| 286 | ACPI_HANDLE_SET(dev, NULL); | 285 | ACPI_COMPANION_SET(dev, NULL); |
| 287 | put_device(dev); | 286 | put_device(dev); |
| 287 | put_device(&acpi_dev->dev); | ||
| 288 | return retval; | 288 | return retval; |
| 289 | } | 289 | } |
| 290 | EXPORT_SYMBOL_GPL(acpi_bind_one); | 290 | EXPORT_SYMBOL_GPL(acpi_bind_one); |
| 291 | 291 | ||
| 292 | int acpi_unbind_one(struct device *dev) | 292 | int acpi_unbind_one(struct device *dev) |
| 293 | { | 293 | { |
| 294 | struct acpi_device *acpi_dev = ACPI_COMPANION(dev); | ||
| 294 | struct acpi_device_physical_node *entry; | 295 | struct acpi_device_physical_node *entry; |
| 295 | struct acpi_device *acpi_dev; | ||
| 296 | acpi_status status; | ||
| 297 | 296 | ||
| 298 | if (!ACPI_HANDLE(dev)) | 297 | if (!acpi_dev) |
| 299 | return 0; | 298 | return 0; |
| 300 | 299 | ||
| 301 | status = acpi_bus_get_device(ACPI_HANDLE(dev), &acpi_dev); | ||
| 302 | if (ACPI_FAILURE(status)) { | ||
| 303 | dev_err(dev, "Oops, ACPI handle corrupt in %s()\n", __func__); | ||
| 304 | return -EINVAL; | ||
| 305 | } | ||
| 306 | |||
| 307 | mutex_lock(&acpi_dev->physical_node_lock); | 300 | mutex_lock(&acpi_dev->physical_node_lock); |
| 308 | 301 | ||
| 309 | list_for_each_entry(entry, &acpi_dev->physical_node_list, node) | 302 | list_for_each_entry(entry, &acpi_dev->physical_node_list, node) |
| @@ -316,9 +309,10 @@ int acpi_unbind_one(struct device *dev) | |||
| 316 | acpi_physnode_link_name(physnode_name, entry->node_id); | 309 | acpi_physnode_link_name(physnode_name, entry->node_id); |
| 317 | sysfs_remove_link(&acpi_dev->dev.kobj, physnode_name); | 310 | sysfs_remove_link(&acpi_dev->dev.kobj, physnode_name); |
| 318 | sysfs_remove_link(&dev->kobj, "firmware_node"); | 311 | sysfs_remove_link(&dev->kobj, "firmware_node"); |
| 319 | ACPI_HANDLE_SET(dev, NULL); | 312 | ACPI_COMPANION_SET(dev, NULL); |
| 320 | /* acpi_bind_one() increase refcnt by one. */ | 313 | /* Drop references taken by acpi_bind_one(). */ |
| 321 | put_device(dev); | 314 | put_device(dev); |
| 315 | put_device(&acpi_dev->dev); | ||
| 322 | kfree(entry); | 316 | kfree(entry); |
| 323 | break; | 317 | break; |
| 324 | } | 318 | } |
| @@ -328,6 +322,15 @@ int acpi_unbind_one(struct device *dev) | |||
| 328 | } | 322 | } |
| 329 | EXPORT_SYMBOL_GPL(acpi_unbind_one); | 323 | EXPORT_SYMBOL_GPL(acpi_unbind_one); |
| 330 | 324 | ||
| 325 | void acpi_preset_companion(struct device *dev, acpi_handle parent, u64 addr) | ||
| 326 | { | ||
| 327 | struct acpi_device *adev; | ||
| 328 | |||
| 329 | if (!acpi_bus_get_device(acpi_get_child(parent, addr), &adev)) | ||
| 330 | ACPI_COMPANION_SET(dev, adev); | ||
| 331 | } | ||
| 332 | EXPORT_SYMBOL_GPL(acpi_preset_companion); | ||
| 333 | |||
| 331 | static int acpi_platform_notify(struct device *dev) | 334 | static int acpi_platform_notify(struct device *dev) |
| 332 | { | 335 | { |
| 333 | struct acpi_bus_type *type = acpi_get_bus_type(dev); | 336 | struct acpi_bus_type *type = acpi_get_bus_type(dev); |
diff --git a/drivers/acpi/nvs.c b/drivers/acpi/nvs.c index 266bc58ce0ce..386a9fe497b4 100644 --- a/drivers/acpi/nvs.c +++ b/drivers/acpi/nvs.c | |||
| @@ -13,7 +13,6 @@ | |||
| 13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
| 14 | #include <linux/acpi.h> | 14 | #include <linux/acpi.h> |
| 15 | #include <linux/acpi_io.h> | 15 | #include <linux/acpi_io.h> |
| 16 | #include <acpi/acpiosxf.h> | ||
| 17 | 16 | ||
| 18 | /* ACPI NVS regions, APEI may use it */ | 17 | /* ACPI NVS regions, APEI may use it */ |
| 19 | 18 | ||
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 56f05869b08d..20360e480bd8 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
| @@ -65,6 +65,9 @@ static struct acpi_scan_handler pci_root_handler = { | |||
| 65 | .ids = root_device_ids, | 65 | .ids = root_device_ids, |
| 66 | .attach = acpi_pci_root_add, | 66 | .attach = acpi_pci_root_add, |
| 67 | .detach = acpi_pci_root_remove, | 67 | .detach = acpi_pci_root_remove, |
| 68 | .hotplug = { | ||
| 69 | .ignore = true, | ||
| 70 | }, | ||
| 68 | }; | 71 | }; |
| 69 | 72 | ||
| 70 | static DEFINE_MUTEX(osc_lock); | 73 | static DEFINE_MUTEX(osc_lock); |
| @@ -575,6 +578,7 @@ static int acpi_pci_root_add(struct acpi_device *device, | |||
| 575 | dev_err(&device->dev, | 578 | dev_err(&device->dev, |
| 576 | "Bus %04x:%02x not present in PCI namespace\n", | 579 | "Bus %04x:%02x not present in PCI namespace\n", |
| 577 | root->segment, (unsigned int)root->secondary.start); | 580 | root->segment, (unsigned int)root->secondary.start); |
| 581 | device->driver_data = NULL; | ||
| 578 | result = -ENODEV; | 582 | result = -ENODEV; |
| 579 | goto end; | 583 | goto end; |
| 580 | } | 584 | } |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 55f9dedbbf9f..fd39459926b1 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -289,24 +289,17 @@ void acpi_bus_device_eject(void *data, u32 ost_src) | |||
| 289 | { | 289 | { |
| 290 | struct acpi_device *device = data; | 290 | struct acpi_device *device = data; |
| 291 | acpi_handle handle = device->handle; | 291 | acpi_handle handle = device->handle; |
| 292 | struct acpi_scan_handler *handler; | ||
| 293 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; | 292 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; |
| 294 | int error; | 293 | int error; |
| 295 | 294 | ||
| 296 | lock_device_hotplug(); | 295 | lock_device_hotplug(); |
| 297 | mutex_lock(&acpi_scan_lock); | 296 | mutex_lock(&acpi_scan_lock); |
| 298 | 297 | ||
| 299 | handler = device->handler; | ||
| 300 | if (!handler || !handler->hotplug.enabled) { | ||
| 301 | put_device(&device->dev); | ||
| 302 | goto err_support; | ||
| 303 | } | ||
| 304 | |||
| 305 | if (ost_src == ACPI_NOTIFY_EJECT_REQUEST) | 298 | if (ost_src == ACPI_NOTIFY_EJECT_REQUEST) |
| 306 | acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, | 299 | acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, |
| 307 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); | 300 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); |
| 308 | 301 | ||
| 309 | if (handler->hotplug.mode == AHM_CONTAINER) | 302 | if (device->handler && device->handler->hotplug.mode == AHM_CONTAINER) |
| 310 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); | 303 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); |
| 311 | 304 | ||
| 312 | error = acpi_scan_hot_remove(device); | 305 | error = acpi_scan_hot_remove(device); |
| @@ -411,8 +404,7 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data) | |||
| 411 | break; | 404 | break; |
| 412 | case ACPI_NOTIFY_EJECT_REQUEST: | 405 | case ACPI_NOTIFY_EJECT_REQUEST: |
| 413 | acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n"); | 406 | acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n"); |
| 414 | status = acpi_bus_get_device(handle, &adev); | 407 | if (acpi_bus_get_device(handle, &adev)) |
| 415 | if (ACPI_FAILURE(status)) | ||
| 416 | goto err_out; | 408 | goto err_out; |
| 417 | 409 | ||
| 418 | get_device(&adev->dev); | 410 | get_device(&adev->dev); |
| @@ -1780,7 +1772,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) | |||
| 1780 | */ | 1772 | */ |
| 1781 | list_for_each_entry(hwid, &pnp.ids, list) { | 1773 | list_for_each_entry(hwid, &pnp.ids, list) { |
| 1782 | handler = acpi_scan_match_handler(hwid->id, NULL); | 1774 | handler = acpi_scan_match_handler(hwid->id, NULL); |
| 1783 | if (handler) { | 1775 | if (handler && !handler->hotplug.ignore) { |
| 1784 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 1776 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
| 1785 | acpi_hotplug_notify_cb, handler); | 1777 | acpi_hotplug_notify_cb, handler); |
| 1786 | break; | 1778 | break; |
| @@ -1997,6 +1989,7 @@ static int acpi_bus_scan_fixed(void) | |||
| 1997 | if (result) | 1989 | if (result) |
| 1998 | return result; | 1990 | return result; |
| 1999 | 1991 | ||
| 1992 | device->flags.match_driver = true; | ||
| 2000 | result = device_attach(&device->dev); | 1993 | result = device_attach(&device->dev); |
| 2001 | if (result < 0) | 1994 | if (result < 0) |
| 2002 | return result; | 1995 | return result; |
| @@ -2013,6 +2006,7 @@ static int acpi_bus_scan_fixed(void) | |||
| 2013 | if (result) | 2006 | if (result) |
| 2014 | return result; | 2007 | return result; |
| 2015 | 2008 | ||
| 2009 | device->flags.match_driver = true; | ||
| 2016 | result = device_attach(&device->dev); | 2010 | result = device_attach(&device->dev); |
| 2017 | } | 2011 | } |
| 2018 | 2012 | ||
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 14df30580e15..721e949e606e 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -525,7 +525,7 @@ static int acpi_suspend_enter(suspend_state_t pm_state) | |||
| 525 | * generate wakeup events. | 525 | * generate wakeup events. |
| 526 | */ | 526 | */ |
| 527 | if (ACPI_SUCCESS(status) && (acpi_state == ACPI_STATE_S3)) { | 527 | if (ACPI_SUCCESS(status) && (acpi_state == ACPI_STATE_S3)) { |
| 528 | acpi_event_status pwr_btn_status; | 528 | acpi_event_status pwr_btn_status = ACPI_EVENT_FLAG_DISABLED; |
| 529 | 529 | ||
| 530 | acpi_get_event_status(ACPI_EVENT_POWER_BUTTON, &pwr_btn_status); | 530 | acpi_get_event_status(ACPI_EVENT_POWER_BUTTON, &pwr_btn_status); |
| 531 | 531 | ||
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index db5293650f62..6dbc3ca45223 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c | |||
| @@ -309,7 +309,7 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr, | |||
| 309 | sprintf(table_attr->name + ACPI_NAME_SIZE, "%d", | 309 | sprintf(table_attr->name + ACPI_NAME_SIZE, "%d", |
| 310 | table_attr->instance); | 310 | table_attr->instance); |
| 311 | 311 | ||
| 312 | table_attr->attr.size = 0; | 312 | table_attr->attr.size = table_header->length; |
| 313 | table_attr->attr.read = acpi_table_show; | 313 | table_attr->attr.read = acpi_table_show; |
| 314 | table_attr->attr.attr.name = table_attr->name; | 314 | table_attr->attr.attr.name = table_attr->name; |
| 315 | table_attr->attr.attr.mode = 0400; | 315 | table_attr->attr.attr.mode = 0400; |
| @@ -354,8 +354,9 @@ static int acpi_tables_sysfs_init(void) | |||
| 354 | { | 354 | { |
| 355 | struct acpi_table_attr *table_attr; | 355 | struct acpi_table_attr *table_attr; |
| 356 | struct acpi_table_header *table_header = NULL; | 356 | struct acpi_table_header *table_header = NULL; |
| 357 | int table_index = 0; | 357 | int table_index; |
| 358 | int result; | 358 | acpi_status status; |
| 359 | int ret; | ||
| 359 | 360 | ||
| 360 | tables_kobj = kobject_create_and_add("tables", acpi_kobj); | 361 | tables_kobj = kobject_create_and_add("tables", acpi_kobj); |
| 361 | if (!tables_kobj) | 362 | if (!tables_kobj) |
| @@ -365,33 +366,34 @@ static int acpi_tables_sysfs_init(void) | |||
| 365 | if (!dynamic_tables_kobj) | 366 | if (!dynamic_tables_kobj) |
| 366 | goto err_dynamic_tables; | 367 | goto err_dynamic_tables; |
| 367 | 368 | ||
| 368 | do { | 369 | for (table_index = 0;; table_index++) { |
| 369 | result = acpi_get_table_by_index(table_index, &table_header); | 370 | status = acpi_get_table_by_index(table_index, &table_header); |
| 370 | if (!result) { | 371 | |
| 371 | table_index++; | 372 | if (status == AE_BAD_PARAMETER) |
| 372 | table_attr = NULL; | 373 | break; |
| 373 | table_attr = | 374 | |
| 374 | kzalloc(sizeof(struct acpi_table_attr), GFP_KERNEL); | 375 | if (ACPI_FAILURE(status)) |
| 375 | if (!table_attr) | 376 | continue; |
| 376 | return -ENOMEM; | 377 | |
| 377 | 378 | table_attr = NULL; | |
| 378 | acpi_table_attr_init(table_attr, table_header); | 379 | table_attr = kzalloc(sizeof(*table_attr), GFP_KERNEL); |
| 379 | result = | 380 | if (!table_attr) |
| 380 | sysfs_create_bin_file(tables_kobj, | 381 | return -ENOMEM; |
| 381 | &table_attr->attr); | 382 | |
| 382 | if (result) { | 383 | acpi_table_attr_init(table_attr, table_header); |
| 383 | kfree(table_attr); | 384 | ret = sysfs_create_bin_file(tables_kobj, &table_attr->attr); |
| 384 | return result; | 385 | if (ret) { |
| 385 | } else | 386 | kfree(table_attr); |
| 386 | list_add_tail(&table_attr->node, | 387 | return ret; |
| 387 | &acpi_table_attr_list); | ||
| 388 | } | 388 | } |
| 389 | } while (!result); | 389 | list_add_tail(&table_attr->node, &acpi_table_attr_list); |
| 390 | } | ||
| 391 | |||
| 390 | kobject_uevent(tables_kobj, KOBJ_ADD); | 392 | kobject_uevent(tables_kobj, KOBJ_ADD); |
| 391 | kobject_uevent(dynamic_tables_kobj, KOBJ_ADD); | 393 | kobject_uevent(dynamic_tables_kobj, KOBJ_ADD); |
| 392 | result = acpi_install_table_handler(acpi_sysfs_table_handler, NULL); | 394 | status = acpi_install_table_handler(acpi_sysfs_table_handler, NULL); |
| 393 | 395 | ||
| 394 | return result == AE_OK ? 0 : -EINVAL; | 396 | return ACPI_FAILURE(status) ? -EINVAL : 0; |
| 395 | err_dynamic_tables: | 397 | err_dynamic_tables: |
| 396 | kobject_put(tables_kobj); | 398 | kobject_put(tables_kobj); |
| 397 | err: | 399 | err: |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 18dbdff4656e..995e91bcb97b 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -82,13 +82,6 @@ static bool allow_duplicates; | |||
| 82 | module_param(allow_duplicates, bool, 0644); | 82 | module_param(allow_duplicates, bool, 0644); |
| 83 | 83 | ||
| 84 | /* | 84 | /* |
| 85 | * Some BIOSes claim they use minimum backlight at boot, | ||
| 86 | * and this may bring dimming screen after boot | ||
| 87 | */ | ||
| 88 | static bool use_bios_initial_backlight = 1; | ||
| 89 | module_param(use_bios_initial_backlight, bool, 0644); | ||
| 90 | |||
| 91 | /* | ||
| 92 | * For Windows 8 systems: if set ture and the GPU driver has | 85 | * For Windows 8 systems: if set ture and the GPU driver has |
| 93 | * registered a backlight interface, skip registering ACPI video's. | 86 | * registered a backlight interface, skip registering ACPI video's. |
| 94 | */ | 87 | */ |
| @@ -406,12 +399,6 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d) | |||
| 406 | return 0; | 399 | return 0; |
| 407 | } | 400 | } |
| 408 | 401 | ||
| 409 | static int video_ignore_initial_backlight(const struct dmi_system_id *d) | ||
| 410 | { | ||
| 411 | use_bios_initial_backlight = 0; | ||
| 412 | return 0; | ||
| 413 | } | ||
| 414 | |||
| 415 | static struct dmi_system_id video_dmi_table[] __initdata = { | 402 | static struct dmi_system_id video_dmi_table[] __initdata = { |
| 416 | /* | 403 | /* |
| 417 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 | 404 | * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 |
| @@ -456,54 +443,6 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 456 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), | 443 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), |
| 457 | }, | 444 | }, |
| 458 | }, | 445 | }, |
| 459 | { | ||
| 460 | .callback = video_ignore_initial_backlight, | ||
| 461 | .ident = "HP Folio 13-2000", | ||
| 462 | .matches = { | ||
| 463 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 464 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"), | ||
| 465 | }, | ||
| 466 | }, | ||
| 467 | { | ||
| 468 | .callback = video_ignore_initial_backlight, | ||
| 469 | .ident = "Fujitsu E753", | ||
| 470 | .matches = { | ||
| 471 | DMI_MATCH(DMI_BOARD_VENDOR, "FUJITSU"), | ||
| 472 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E753"), | ||
| 473 | }, | ||
| 474 | }, | ||
| 475 | { | ||
| 476 | .callback = video_ignore_initial_backlight, | ||
| 477 | .ident = "HP Pavilion dm4", | ||
| 478 | .matches = { | ||
| 479 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 480 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dm4 Notebook PC"), | ||
| 481 | }, | ||
| 482 | }, | ||
| 483 | { | ||
| 484 | .callback = video_ignore_initial_backlight, | ||
| 485 | .ident = "HP Pavilion g6 Notebook PC", | ||
| 486 | .matches = { | ||
| 487 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 488 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), | ||
| 489 | }, | ||
| 490 | }, | ||
| 491 | { | ||
| 492 | .callback = video_ignore_initial_backlight, | ||
| 493 | .ident = "HP 1000 Notebook PC", | ||
| 494 | .matches = { | ||
| 495 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 496 | DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), | ||
| 497 | }, | ||
| 498 | }, | ||
| 499 | { | ||
| 500 | .callback = video_ignore_initial_backlight, | ||
| 501 | .ident = "HP Pavilion m4", | ||
| 502 | .matches = { | ||
| 503 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 504 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), | ||
| 505 | }, | ||
| 506 | }, | ||
| 507 | {} | 446 | {} |
| 508 | }; | 447 | }; |
| 509 | 448 | ||
| @@ -839,20 +778,18 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
| 839 | if (!device->cap._BQC) | 778 | if (!device->cap._BQC) |
| 840 | goto set_level; | 779 | goto set_level; |
| 841 | 780 | ||
| 842 | if (use_bios_initial_backlight) { | 781 | level = acpi_video_bqc_value_to_level(device, level_old); |
| 843 | level = acpi_video_bqc_value_to_level(device, level_old); | 782 | /* |
| 844 | /* | 783 | * On some buggy laptops, _BQC returns an uninitialized |
| 845 | * On some buggy laptops, _BQC returns an uninitialized | 784 | * value when invoked for the first time, i.e. |
| 846 | * value when invoked for the first time, i.e. | 785 | * level_old is invalid (no matter whether it's a level |
| 847 | * level_old is invalid (no matter whether it's a level | 786 | * or an index). Set the backlight to max_level in this case. |
| 848 | * or an index). Set the backlight to max_level in this case. | 787 | */ |
| 849 | */ | 788 | for (i = 2; i < br->count; i++) |
| 850 | for (i = 2; i < br->count; i++) | 789 | if (level == br->levels[i]) |
| 851 | if (level == br->levels[i]) | 790 | break; |
| 852 | break; | 791 | if (i == br->count || !level) |
| 853 | if (i == br->count || !level) | 792 | level = max_level; |
| 854 | level = max_level; | ||
| 855 | } | ||
| 856 | 793 | ||
| 857 | set_level: | 794 | set_level: |
| 858 | result = acpi_video_device_lcd_set_level(device, level); | 795 | result = acpi_video_device_lcd_set_level(device, level); |
