diff options
Diffstat (limited to 'drivers/acpi/acpica/dsmethod.c')
-rw-r--r-- | drivers/acpi/acpica/dsmethod.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index 47c7b52a519c..32e9ddc0cf2b 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c | |||
@@ -99,11 +99,14 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node, | |||
99 | "Method auto-serialization parse [%4.4s] %p\n", | 99 | "Method auto-serialization parse [%4.4s] %p\n", |
100 | acpi_ut_get_node_name(node), node)); | 100 | acpi_ut_get_node_name(node), node)); |
101 | 101 | ||
102 | acpi_ex_enter_interpreter(); | ||
103 | |||
102 | /* Create/Init a root op for the method parse tree */ | 104 | /* Create/Init a root op for the method parse tree */ |
103 | 105 | ||
104 | op = acpi_ps_alloc_op(AML_METHOD_OP, obj_desc->method.aml_start); | 106 | op = acpi_ps_alloc_op(AML_METHOD_OP, obj_desc->method.aml_start); |
105 | if (!op) { | 107 | if (!op) { |
106 | return_ACPI_STATUS(AE_NO_MEMORY); | 108 | status = AE_NO_MEMORY; |
109 | goto unlock; | ||
107 | } | 110 | } |
108 | 111 | ||
109 | acpi_ps_set_name(op, node->name.integer); | 112 | acpi_ps_set_name(op, node->name.integer); |
@@ -115,7 +118,8 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node, | |||
115 | acpi_ds_create_walk_state(node->owner_id, NULL, NULL, NULL); | 118 | acpi_ds_create_walk_state(node->owner_id, NULL, NULL, NULL); |
116 | if (!walk_state) { | 119 | if (!walk_state) { |
117 | acpi_ps_free_op(op); | 120 | acpi_ps_free_op(op); |
118 | return_ACPI_STATUS(AE_NO_MEMORY); | 121 | status = AE_NO_MEMORY; |
122 | goto unlock; | ||
119 | } | 123 | } |
120 | 124 | ||
121 | status = acpi_ds_init_aml_walk(walk_state, op, node, | 125 | status = acpi_ds_init_aml_walk(walk_state, op, node, |
@@ -134,6 +138,8 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node, | |||
134 | status = acpi_ps_parse_aml(walk_state); | 138 | status = acpi_ps_parse_aml(walk_state); |
135 | 139 | ||
136 | acpi_ps_delete_parse_tree(op); | 140 | acpi_ps_delete_parse_tree(op); |
141 | unlock: | ||
142 | acpi_ex_exit_interpreter(); | ||
137 | return_ACPI_STATUS(status); | 143 | return_ACPI_STATUS(status); |
138 | } | 144 | } |
139 | 145 | ||
@@ -757,8 +763,10 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, | |||
757 | 763 | ||
758 | /* Delete any direct children of (created by) this method */ | 764 | /* Delete any direct children of (created by) this method */ |
759 | 765 | ||
766 | (void)acpi_ex_exit_interpreter(); | ||
760 | acpi_ns_delete_namespace_subtree(walk_state-> | 767 | acpi_ns_delete_namespace_subtree(walk_state-> |
761 | method_node); | 768 | method_node); |
769 | (void)acpi_ex_enter_interpreter(); | ||
762 | 770 | ||
763 | /* | 771 | /* |
764 | * Delete any objects that were created by this method | 772 | * Delete any objects that were created by this method |
@@ -769,9 +777,11 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, | |||
769 | */ | 777 | */ |
770 | if (method_desc->method. | 778 | if (method_desc->method. |
771 | info_flags & ACPI_METHOD_MODIFIED_NAMESPACE) { | 779 | info_flags & ACPI_METHOD_MODIFIED_NAMESPACE) { |
780 | (void)acpi_ex_exit_interpreter(); | ||
772 | acpi_ns_delete_namespace_by_owner(method_desc-> | 781 | acpi_ns_delete_namespace_by_owner(method_desc-> |
773 | method. | 782 | method. |
774 | owner_id); | 783 | owner_id); |
784 | (void)acpi_ex_enter_interpreter(); | ||
775 | method_desc->method.info_flags &= | 785 | method_desc->method.info_flags &= |
776 | ~ACPI_METHOD_MODIFIED_NAMESPACE; | 786 | ~ACPI_METHOD_MODIFIED_NAMESPACE; |
777 | } | 787 | } |