diff --git a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c
index eeafb32..2bc878f 100644
--- a/drivers/acpi/utilities/utdelete.c
+++ b/drivers/acpi/utilities/utdelete.c
@@ -41,7 +41,6 @@
  * POSSIBILITY OF SUCH DAMAGES.
  */
 
-
 #include <acpi/acpi.h>
 #include <acpi/acinterp.h>
 #include <acpi/acnamesp.h>
@@ -49,19 +48,13 @@
 #include <acpi/amlcode.h>
 
 #define _COMPONENT          ACPI_UTILITIES
-	 ACPI_MODULE_NAME    ("utdelete")
+ACPI_MODULE_NAME("utdelete")
 
 /* Local prototypes */
+static void acpi_ut_delete_internal_obj(union acpi_operand_object *object);
 
 static void
-acpi_ut_delete_internal_obj (
-	union acpi_operand_object       *object);
-
-static void
-acpi_ut_update_ref_count (
-	union acpi_operand_object       *object,
-	u32                             action);
-
+acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action);
 
 /*******************************************************************************
  *
@@ -76,18 +69,14 @@
  *
  ******************************************************************************/
 
-static void
-acpi_ut_delete_internal_obj (
-	union acpi_operand_object       *object)
+static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
 {
-	void                            *obj_pointer = NULL;
-	union acpi_operand_object       *handler_desc;
-	union acpi_operand_object       *second_desc;
-	union acpi_operand_object       *next_desc;
+	void *obj_pointer = NULL;
+	union acpi_operand_object *handler_desc;
+	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;
@@ -97,11 +86,12 @@
 	 * Must delete or free any pointers within the object that are not
 	 * actual ACPI objects (for example, a raw buffer pointer).
 	 */
-	switch (ACPI_GET_OBJECT_TYPE (object)) {
+	switch (ACPI_GET_OBJECT_TYPE(object)) {
 	case ACPI_TYPE_STRING:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** String %p, ptr %p\n",
-			object, object->string.pointer));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "**** String %p, ptr %p\n", object,
+				  object->string.pointer));
 
 		/* Free the actual string buffer */
 
@@ -112,11 +102,11 @@
 		}
 		break;
 
-
 	case ACPI_TYPE_BUFFER:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** Buffer %p, ptr %p\n",
-			object, object->buffer.pointer));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "**** Buffer %p, ptr %p\n", object,
+				  object->buffer.pointer));
 
 		/* Free the actual buffer */
 
@@ -127,11 +117,11 @@
 		}
 		break;
 
-
 	case ACPI_TYPE_PACKAGE:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, " **** Package of count %X\n",
-			object->package.count));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  " **** Package of count %X\n",
+				  object->package.count));
 
 		/*
 		 * Elements of the package are not handled here, they are deleted
@@ -143,11 +133,11 @@
 		obj_pointer = object->package.elements;
 		break;
 
-
 	case ACPI_TYPE_DEVICE:
 
 		if (object->device.gpe_block) {
-			(void) acpi_ev_delete_gpe_block (object->device.gpe_block);
+			(void)acpi_ev_delete_gpe_block(object->device.
+						       gpe_block);
 		}
 
 		/* Walk the handler list for this device */
@@ -155,54 +145,51 @@
 		handler_desc = object->device.handler;
 		while (handler_desc) {
 			next_desc = handler_desc->address_space.next;
-			acpi_ut_remove_reference (handler_desc);
+			acpi_ut_remove_reference(handler_desc);
 			handler_desc = next_desc;
 		}
 		break;
 
-
 	case ACPI_TYPE_MUTEX:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"***** Mutex %p, Semaphore %p\n",
-			object, object->mutex.semaphore));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "***** Mutex %p, Semaphore %p\n",
+				  object, object->mutex.semaphore));
 
-		acpi_ex_unlink_mutex (object);
-		(void) acpi_os_delete_semaphore (object->mutex.semaphore);
+		acpi_ex_unlink_mutex(object);
+		(void)acpi_os_delete_semaphore(object->mutex.semaphore);
 		break;
 
-
 	case ACPI_TYPE_EVENT:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"***** Event %p, Semaphore %p\n",
-			object, object->event.semaphore));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "***** Event %p, Semaphore %p\n",
+				  object, object->event.semaphore));
 
-		(void) acpi_os_delete_semaphore (object->event.semaphore);
+		(void)acpi_os_delete_semaphore(object->event.semaphore);
 		object->event.semaphore = NULL;
 		break;
 
-
 	case ACPI_TYPE_METHOD:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"***** Method %p\n", object));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "***** Method %p\n", object));
 
 		/* Delete the method semaphore if it exists */
 
 		if (object->method.semaphore) {
-			(void) acpi_os_delete_semaphore (object->method.semaphore);
+			(void)acpi_os_delete_semaphore(object->method.
+						       semaphore);
 			object->method.semaphore = NULL;
 		}
 		break;
 
-
 	case ACPI_TYPE_REGION:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"***** Region %p\n", object));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "***** Region %p\n", object));
 
-		second_desc = acpi_ns_get_secondary_object (object);
+		second_desc = acpi_ns_get_secondary_object(object);
 		if (second_desc) {
 			/*
 			 * Free the region_context if and only if the handler is one of the
@@ -211,32 +198,33 @@
 			 */
 			handler_desc = object->region.handler;
 			if (handler_desc) {
-				if (handler_desc->address_space.hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
-					obj_pointer = second_desc->extra.region_context;
+				if (handler_desc->address_space.
+				    hflags &
+				    ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
+					obj_pointer =
+					    second_desc->extra.region_context;
 				}
 
-				acpi_ut_remove_reference (handler_desc);
+				acpi_ut_remove_reference(handler_desc);
 			}
 
 			/* Now we can free the Extra object */
 
-			acpi_ut_delete_object_desc (second_desc);
+			acpi_ut_delete_object_desc(second_desc);
 		}
 		break;
 
-
 	case ACPI_TYPE_BUFFER_FIELD:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"***** Buffer Field %p\n", object));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "***** Buffer Field %p\n", object));
 
-		second_desc = acpi_ns_get_secondary_object (object);
+		second_desc = acpi_ns_get_secondary_object(object);
 		if (second_desc) {
-			acpi_ut_delete_object_desc (second_desc);
+			acpi_ut_delete_object_desc(second_desc);
 		}
 		break;
 
-
 	default:
 		break;
 	}
@@ -244,21 +232,20 @@
 	/* Free any allocated memory (pointer within the object) found above */
 
 	if (obj_pointer) {
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object Subptr %p\n",
-				obj_pointer));
-		ACPI_MEM_FREE (obj_pointer);
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "Deleting Object Subptr %p\n", obj_pointer));
+		ACPI_MEM_FREE(obj_pointer);
 	}
 
 	/* Now the object can be safely deleted */
 
-	ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object %p [%s]\n",
-			object, acpi_ut_get_object_type_name (object)));
+	ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Deleting Object %p [%s]\n",
+			  object, acpi_ut_get_object_type_name(object)));
 
-	acpi_ut_delete_object_desc (object);
+	acpi_ut_delete_object_desc(object);
 	return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_delete_internal_object_list
@@ -272,29 +259,24 @@
  *
  ******************************************************************************/
 
-void
-acpi_ut_delete_internal_object_list (
-	union acpi_operand_object       **obj_list)
+void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list)
 {
-	union acpi_operand_object       **internal_obj;
+	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 */
 
 	for (internal_obj = obj_list; *internal_obj; internal_obj++) {
-		acpi_ut_remove_reference (*internal_obj);
+		acpi_ut_remove_reference(*internal_obj);
 	}
 
 	/* Free the combined parameter pointer list and object array */
 
-	ACPI_MEM_FREE (obj_list);
+	ACPI_MEM_FREE(obj_list);
 	return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_update_ref_count
@@ -309,16 +291,12 @@
  ******************************************************************************/
 
 static void
-acpi_ut_update_ref_count (
-	union acpi_operand_object       *object,
-	u32                             action)
+acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
 {
-	u16                             count;
-	u16                             new_count;
+	u16 count;
+	u16 new_count;
 
-
-	ACPI_FUNCTION_NAME ("ut_update_ref_count");
-
+	ACPI_FUNCTION_NAME("ut_update_ref_count");
 
 	if (!object) {
 		return;
@@ -338,58 +316,55 @@
 		new_count++;
 		object->common.reference_count = new_count;
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"Obj %p Refs=%X, [Incremented]\n",
-			object, new_count));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "Obj %p Refs=%X, [Incremented]\n",
+				  object, new_count));
 		break;
 
-
 	case REF_DECREMENT:
 
 		if (count < 1) {
-			ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-				"Obj %p Refs=%X, can't decrement! (Set to 0)\n",
-				object, new_count));
+			ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+					  "Obj %p Refs=%X, can't decrement! (Set to 0)\n",
+					  object, new_count));
 
 			new_count = 0;
-		}
-		else {
+		} else {
 			new_count--;
 
-			ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-				"Obj %p Refs=%X, [Decremented]\n",
-				object, new_count));
+			ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+					  "Obj %p Refs=%X, [Decremented]\n",
+					  object, new_count));
 		}
 
-		if (ACPI_GET_OBJECT_TYPE (object) == ACPI_TYPE_METHOD) {
-			ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-				"Method Obj %p Refs=%X, [Decremented]\n",
-				object, new_count));
+		if (ACPI_GET_OBJECT_TYPE(object) == ACPI_TYPE_METHOD) {
+			ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+					  "Method Obj %p Refs=%X, [Decremented]\n",
+					  object, new_count));
 		}
 
 		object->common.reference_count = new_count;
 		if (new_count == 0) {
-			acpi_ut_delete_internal_obj (object);
+			acpi_ut_delete_internal_obj(object);
 		}
 
 		break;
 
-
 	case REF_FORCE_DELETE:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-			"Obj %p Refs=%X, Force delete! (Set to 0)\n",
-			object, count));
+		ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+				  "Obj %p Refs=%X, Force delete! (Set to 0)\n",
+				  object, count));
 
 		new_count = 0;
 		object->common.reference_count = new_count;
-		acpi_ut_delete_internal_obj (object);
+		acpi_ut_delete_internal_obj(object);
 		break;
 
-
 	default:
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown action (%X)\n", action));
+		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown action (%X)\n",
+				  action));
 		break;
 	}
 
@@ -399,15 +374,14 @@
 	 */
 	if (count > ACPI_MAX_REFERENCE_COUNT) {
 
-		ACPI_DEBUG_PRINT ((ACPI_DB_WARN,
-			"**** Warning **** Large Reference Count (%X) in object %p\n\n",
-			count, object));
+		ACPI_DEBUG_PRINT((ACPI_DB_WARN,
+				  "**** Warning **** Large Reference Count (%X) in object %p\n\n",
+				  count, object));
 	}
 
 	return;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_update_object_reference
@@ -431,38 +405,36 @@
  ******************************************************************************/
 
 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;
-	union acpi_operand_object       *next_object = NULL;
-	union acpi_generic_state        *state;
-	acpi_native_uint                i;
+	acpi_status status = AE_OK;
+	union acpi_generic_state *state_list = NULL;
+	union acpi_operand_object *next_object = NULL;
+	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) {
-			ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-				"Object %p is NS handle\n", object));
-			return_ACPI_STATUS (AE_OK);
+		if (ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED) {
+			ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+					  "Object %p is NS handle\n", object));
+			return_ACPI_STATUS(AE_OK);
 		}
 
 		/*
 		 * All sub-objects must have their reference count incremented also.
 		 * Different object types have different subobjects.
 		 */
-		switch (ACPI_GET_OBJECT_TYPE (object)) {
+		switch (ACPI_GET_OBJECT_TYPE(object)) {
 		case ACPI_TYPE_DEVICE:
 
-			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->device.system_notify,
+						 action);
+			acpi_ut_update_ref_count(object->device.device_notify,
+						 action);
 			break;
 
 		case ACPI_TYPE_PACKAGE:
@@ -476,9 +448,11 @@
 				 * Note: There can be null elements within the package,
 				 * these are simply ignored
 				 */
-				status = acpi_ut_create_update_state_and_push (
-						 object->package.elements[i], action, &state_list);
-				if (ACPI_FAILURE (status)) {
+				status =
+				    acpi_ut_create_update_state_and_push
+				    (object->package.elements[i], action,
+				     &state_list);
+				if (ACPI_FAILURE(status)) {
 					goto error_exit;
 				}
 			}
@@ -497,9 +471,13 @@
 		case ACPI_TYPE_LOCAL_BANK_FIELD:
 
 			next_object = object->bank_field.bank_obj;
-			status = acpi_ut_create_update_state_and_push (
-					 object->bank_field.region_obj, action, &state_list);
-			if (ACPI_FAILURE (status)) {
+			status =
+			    acpi_ut_create_update_state_and_push(object->
+								 bank_field.
+								 region_obj,
+								 action,
+								 &state_list);
+			if (ACPI_FAILURE(status)) {
 				goto error_exit;
 			}
 			break;
@@ -507,9 +485,13 @@
 		case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
 			next_object = object->index_field.index_obj;
-			status = acpi_ut_create_update_state_and_push (
-					 object->index_field.data_obj, action, &state_list);
-			if (ACPI_FAILURE (status)) {
+			status =
+			    acpi_ut_create_update_state_and_push(object->
+								 index_field.
+								 data_obj,
+								 action,
+								 &state_list);
+			if (ACPI_FAILURE(status)) {
 				goto error_exit;
 			}
 			break;
@@ -526,7 +508,7 @@
 
 		case ACPI_TYPE_REGION:
 		default:
-			break;/* No subobjects */
+			break;	/* No subobjects */
 		}
 
 		/*
@@ -534,7 +516,7 @@
 		 * happen after we update the sub-objects in case this causes the
 		 * main object to be deleted.
 		 */
-		acpi_ut_update_ref_count (object, action);
+		acpi_ut_update_ref_count(object, action);
 		object = NULL;
 
 		/* Move on to the next object to be updated */
@@ -542,25 +524,23 @@
 		if (next_object) {
 			object = next_object;
 			next_object = NULL;
-		}
-		else if (state_list) {
-			state = acpi_ut_pop_generic_state (&state_list);
+		} else if (state_list) {
+			state = acpi_ut_pop_generic_state(&state_list);
 			object = state->update.object;
-			acpi_ut_delete_generic_state (state);
+			acpi_ut_delete_generic_state(state);
 		}
 	}
 
-	return_ACPI_STATUS (AE_OK);
+	return_ACPI_STATUS(AE_OK);
 
-error_exit:
+      error_exit:
 
-	ACPI_REPORT_ERROR (("Could not update object reference count, %s\n",
-		acpi_format_exception (status)));
+	ACPI_REPORT_ERROR(("Could not update object reference count, %s\n",
+			   acpi_format_exception(status)));
 
-	return_ACPI_STATUS (status);
+	return_ACPI_STATUS(status);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_add_reference
@@ -574,31 +554,27 @@
  *
  ******************************************************************************/
 
-void
-acpi_ut_add_reference (
-	union acpi_operand_object       *object)
+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 */
 
-	if (!acpi_ut_valid_internal_object (object)) {
+	if (!acpi_ut_valid_internal_object(object)) {
 		return_VOID;
 	}
 
-	ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-		"Obj %p Current Refs=%X [To Be Incremented]\n",
-		object, object->common.reference_count));
+	ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+			  "Obj %p Current Refs=%X [To Be Incremented]\n",
+			  object, object->common.reference_count));
 
 	/* Increment the reference count */
 
-	(void) acpi_ut_update_object_reference (object, REF_INCREMENT);
+	(void)acpi_ut_update_object_reference(object, REF_INCREMENT);
 	return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_remove_reference
@@ -611,13 +587,10 @@
  *
  ******************************************************************************/
 
-void
-acpi_ut_remove_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
@@ -625,27 +598,25 @@
 	 *
 	 */
 	if (!object ||
-		(ACPI_GET_DESCRIPTOR_TYPE (object) == ACPI_DESC_TYPE_NAMED)) {
+	    (ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED)) {
 		return_VOID;
 	}
 
 	/* Ensure that we have a valid object */
 
-	if (!acpi_ut_valid_internal_object (object)) {
+	if (!acpi_ut_valid_internal_object(object)) {
 		return_VOID;
 	}
 
-	ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-		"Obj %p Current Refs=%X [To Be Decremented]\n",
-		object, object->common.reference_count));
+	ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+			  "Obj %p Current Refs=%X [To Be Decremented]\n",
+			  object, object->common.reference_count));
 
 	/*
 	 * Decrement the reference count, and only actually delete the object
 	 * if the reference count becomes 0.  (Must also decrement the ref count
 	 * of all subobjects!)
 	 */
-	(void) acpi_ut_update_object_reference (object, REF_DECREMENT);
+	(void)acpi_ut_update_object_reference(object, REF_DECREMENT);
 	return_VOID;
 }
-
-
