Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / drivers / acpi / utilities / utdelete.c
index 1db9695..9d3f114 100644 (file)
@@ -76,7 +76,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
        union acpi_operand_object *second_desc;
        union acpi_operand_object *next_desc;
 
-       ACPI_FUNCTION_TRACE_PTR("ut_delete_internal_obj", object);
+       ACPI_FUNCTION_TRACE_PTR(ut_delete_internal_obj, object);
 
        if (!object) {
                return_VOID;
@@ -96,6 +96,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                /* Free the actual string buffer */
 
                if (!(object->common.flags & AOPOBJ_STATIC_POINTER)) {
+
                        /* But only if it is NOT a pointer into an ACPI table */
 
                        obj_pointer = object->string.pointer;
@@ -111,6 +112,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                /* Free the actual buffer */
 
                if (!(object->common.flags & AOPOBJ_STATIC_POINTER)) {
+
                        /* But only if it is NOT a pointer into an ACPI table */
 
                        obj_pointer = object->buffer.pointer;
@@ -153,21 +155,30 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
        case ACPI_TYPE_MUTEX:
 
                ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
-                                 "***** Mutex %p, Semaphore %p\n",
-                                 object, object->mutex.semaphore));
+                                 "***** Mutex %p, OS Mutex %p\n",
+                                 object, object->mutex.os_mutex));
+
+               if (object->mutex.os_mutex != ACPI_GLOBAL_LOCK) {
+                       acpi_ex_unlink_mutex(object);
+                       acpi_os_delete_mutex(object->mutex.os_mutex);
+               } else {
+                       /* Global Lock "mutex" is actually a counting semaphore */
 
-               acpi_ex_unlink_mutex(object);
-               (void)acpi_os_delete_semaphore(object->mutex.semaphore);
+                       (void)
+                           acpi_os_delete_semaphore
+                           (acpi_gbl_global_lock_semaphore);
+                       acpi_gbl_global_lock_semaphore = NULL;
+               }
                break;
 
        case ACPI_TYPE_EVENT:
 
                ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
-                                 "***** Event %p, Semaphore %p\n",
-                                 object, object->event.semaphore));
+                                 "***** Event %p, OS Semaphore %p\n",
+                                 object, object->event.os_semaphore));
 
-               (void)acpi_os_delete_semaphore(object->event.semaphore);
-               object->event.semaphore = NULL;
+               (void)acpi_os_delete_semaphore(object->event.os_semaphore);
+               object->event.os_semaphore = NULL;
                break;
 
        case ACPI_TYPE_METHOD:
@@ -175,12 +186,13 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
                                  "***** Method %p\n", object));
 
-               /* Delete the method semaphore if it exists */
+               /* Delete the method mutex if it exists */
 
-               if (object->method.semaphore) {
-                       (void)acpi_os_delete_semaphore(object->method.
-                                                      semaphore);
-                       object->method.semaphore = NULL;
+               if (object->method.mutex) {
+                       acpi_os_delete_mutex(object->method.mutex->mutex.
+                                            os_mutex);
+                       acpi_ut_delete_object_desc(object->method.mutex);
+                       object->method.mutex = NULL;
                }
                break;
 
@@ -198,11 +210,22 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                         */
                        handler_desc = object->region.handler;
                        if (handler_desc) {
-                               if (handler_desc->address_space.
-                                   hflags &
+                               if (handler_desc->address_space.handler_flags &
                                    ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
-                                       obj_pointer =
-                                           second_desc->extra.region_context;
+
+                                       /* Deactivate region and free region context */
+
+                                       if (handler_desc->address_space.setup) {
+                                               (void)handler_desc->
+                                                   address_space.setup(object,
+                                                                       ACPI_REGION_DEACTIVATE,
+                                                                       handler_desc->
+                                                                       address_space.
+                                                                       context,
+                                                                       &second_desc->
+                                                                       extra.
+                                                                       region_context);
+                                       }
                                }
 
                                acpi_ut_remove_reference(handler_desc);
@@ -234,7 +257,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
        if (obj_pointer) {
                ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
                                  "Deleting Object Subptr %p\n", obj_pointer));
-               ACPI_MEM_FREE(obj_pointer);
+               ACPI_FREE(obj_pointer);
        }
 
        /* Now the object can be safely deleted */
@@ -263,7 +286,7 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list)
 {
        union acpi_operand_object **internal_obj;
 
-       ACPI_FUNCTION_TRACE("ut_delete_internal_object_list");
+       ACPI_FUNCTION_TRACE(ut_delete_internal_object_list);
 
        /* Walk the null-terminated internal list */
 
@@ -273,7 +296,7 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list)
 
        /* Free the combined parameter pointer list and object array */
 
-       ACPI_MEM_FREE(obj_list);
+       ACPI_FREE(obj_list);
        return_VOID;
 }
 
@@ -296,7 +319,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
        u16 count;
        u16 new_count;
 
-       ACPI_FUNCTION_NAME("ut_update_ref_count");
+       ACPI_FUNCTION_NAME(ut_update_ref_count);
 
        if (!object) {
                return;
@@ -306,11 +329,9 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
        new_count = count;
 
        /*
-        * Perform the reference count action
-        * (increment, decrement, or force delete)
+        * Perform the reference count action (increment, decrement, force delete)
         */
        switch (action) {
-
        case REF_INCREMENT:
 
                new_count++;
@@ -347,7 +368,6 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
                if (new_count == 0) {
                        acpi_ut_delete_internal_obj(object);
                }
-
                break;
 
        case REF_FORCE_DELETE:
@@ -372,13 +392,10 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
         * (A deleted object will have a huge reference count)
         */
        if (count > ACPI_MAX_REFERENCE_COUNT) {
-
                ACPI_WARNING((AE_INFO,
-                             "Large Reference Count (%X) in object %p",
-                             count, object));
+                             "Large Reference Count (%X) in object %p", count,
+                             object));
        }
-
-       return;
 }
 
 /*******************************************************************************
@@ -404,7 +421,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
  ******************************************************************************/
 
 acpi_status
-acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
+acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
 {
        acpi_status status = AE_OK;
        union acpi_generic_state *state_list = NULL;
@@ -412,9 +429,10 @@ acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
        union acpi_generic_state *state;
        acpi_native_uint i;
 
-       ACPI_FUNCTION_TRACE_PTR("ut_update_object_reference", object);
+       ACPI_FUNCTION_TRACE_PTR(ut_update_object_reference, object);
 
        while (object) {
+
                /* Make sure that this isn't a namespace handle */
 
                if (ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED) {
@@ -429,11 +447,16 @@ acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
                 */
                switch (ACPI_GET_OBJECT_TYPE(object)) {
                case ACPI_TYPE_DEVICE:
+               case ACPI_TYPE_PROCESSOR:
+               case ACPI_TYPE_POWER:
+               case ACPI_TYPE_THERMAL:
+
+                       /* Update the notify objects for these types (if present) */
 
-                       acpi_ut_update_ref_count(object->device.system_notify,
-                                                action);
-                       acpi_ut_update_ref_count(object->device.device_notify,
-                                                action);
+                       acpi_ut_update_ref_count(object->common_notify.
+                                                system_notify, action);
+                       acpi_ut_update_ref_count(object->common_notify.
+                                                device_notify, action);
                        break;
 
                case ACPI_TYPE_PACKAGE:
@@ -507,11 +530,11 @@ acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
 
                case ACPI_TYPE_REGION:
                default:
-                       break;  /* No subobjects */
+                       break;  /* No subobjects for all other types */
                }
 
                /*
-                * Now we can update the count in the main object.  This can only
+                * Now we can update the count in the main object. This can only
                 * happen after we update the sub-objects in case this causes the
                 * main object to be deleted.
                 */
@@ -556,7 +579,7 @@ acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
 void acpi_ut_add_reference(union acpi_operand_object *object)
 {
 
-       ACPI_FUNCTION_TRACE_PTR("ut_add_reference", object);
+       ACPI_FUNCTION_TRACE_PTR(ut_add_reference, object);
 
        /* Ensure that we have a valid object */
 
@@ -589,11 +612,11 @@ void acpi_ut_add_reference(union acpi_operand_object *object)
 void acpi_ut_remove_reference(union acpi_operand_object *object)
 {
 
-       ACPI_FUNCTION_TRACE_PTR("ut_remove_reference", object);
+       ACPI_FUNCTION_TRACE_PTR(ut_remove_reference, object);
 
        /*
-        * Allow a NULL pointer to be passed in, just ignore it.  This saves
-        * each caller from having to check.  Also, ignore NS nodes.
+        * Allow a NULL pointer to be passed in, just ignore it. This saves
+        * each caller from having to check. Also, ignore NS nodes.
         *
         */
        if (!object ||
@@ -613,7 +636,7 @@ void acpi_ut_remove_reference(union acpi_operand_object *object)
 
        /*
         * Decrement the reference count, and only actually delete the object
-        * if the reference count becomes 0.  (Must also decrement the ref count
+        * if the reference count becomes 0. (Must also decrement the ref count
         * of all subobjects!)
         */
        (void)acpi_ut_update_object_reference(object, REF_DECREMENT);