diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c
index 6987999..10db848 100644
--- a/drivers/acpi/tables/tbinstal.c
+++ b/drivers/acpi/tables/tbinstal.c
@@ -41,22 +41,16 @@
  * POSSIBILITY OF SUCH DAMAGES.
  */
 
-
 #include <acpi/acpi.h>
 #include <acpi/actables.h>
 
-
 #define _COMPONENT          ACPI_TABLES
-	 ACPI_MODULE_NAME    ("tbinstal")
+ACPI_MODULE_NAME("tbinstal")
 
 /* Local prototypes */
-
 static acpi_status
-acpi_tb_match_signature (
-	char                            *signature,
-	struct acpi_table_desc          *table_info,
-	u8                              search_type);
-
+acpi_tb_match_signature(char *signature,
+			struct acpi_table_desc *table_info, u8 search_type);
 
 /*******************************************************************************
  *
@@ -74,16 +68,12 @@
  ******************************************************************************/
 
 static acpi_status
-acpi_tb_match_signature (
-	char                            *signature,
-	struct acpi_table_desc          *table_info,
-	u8                              search_type)
+acpi_tb_match_signature(char *signature,
+			struct acpi_table_desc *table_info, u8 search_type)
 {
-	acpi_native_uint                i;
+	acpi_native_uint i;
 
-
-	ACPI_FUNCTION_TRACE ("tb_match_signature");
-
+	ACPI_FUNCTION_TRACE("tb_match_signature");
 
 	/* Search for a signature match among the known table types */
 
@@ -92,30 +82,30 @@
 			continue;
 		}
 
-		if (!ACPI_STRNCMP (signature, acpi_gbl_table_data[i].signature,
-				   acpi_gbl_table_data[i].sig_length)) {
+		if (!ACPI_STRNCMP(signature, acpi_gbl_table_data[i].signature,
+				  acpi_gbl_table_data[i].sig_length)) {
 			/* Found a signature match, return index if requested */
 
 			if (table_info) {
 				table_info->type = (u8) i;
 			}
 
-			ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-				"Table [%4.4s] is an ACPI table consumed by the core subsystem\n",
-				(char *) acpi_gbl_table_data[i].signature));
+			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+					  "Table [%4.4s] is an ACPI table consumed by the core subsystem\n",
+					  (char *)acpi_gbl_table_data[i].
+					  signature));
 
-			return_ACPI_STATUS (AE_OK);
+			return_ACPI_STATUS(AE_OK);
 		}
 	}
 
-	ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-		"Table [%4.4s] is not an ACPI table consumed by the core subsystem - ignored\n",
-		(char *) signature));
+	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+			  "Table [%4.4s] is not an ACPI table consumed by the core subsystem - ignored\n",
+			  (char *)signature));
 
-	return_ACPI_STATUS (AE_TABLE_NOT_SUPPORTED);
+	return_ACPI_STATUS(AE_TABLE_NOT_SUPPORTED);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_install_table
@@ -128,52 +118,48 @@
  *
  ******************************************************************************/
 
-acpi_status
-acpi_tb_install_table (
-	struct acpi_table_desc          *table_info)
+acpi_status acpi_tb_install_table(struct acpi_table_desc *table_info)
 {
-	acpi_status                     status;
+	acpi_status status;
 
-
-	ACPI_FUNCTION_TRACE ("tb_install_table");
-
+	ACPI_FUNCTION_TRACE("tb_install_table");
 
 	/* Lock tables while installing */
 
-	status = acpi_ut_acquire_mutex (ACPI_MTX_TABLES);
-	if (ACPI_FAILURE (status)) {
-		ACPI_REPORT_ERROR (("Could not acquire table mutex, %s\n",
-			acpi_format_exception (status)));
-		return_ACPI_STATUS (status);
+	status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
+	if (ACPI_FAILURE(status)) {
+		ACPI_REPORT_ERROR(("Could not acquire table mutex, %s\n",
+				   acpi_format_exception(status)));
+		return_ACPI_STATUS(status);
 	}
 
 	/*
 	 * Ignore a table that is already installed. For example, some BIOS
 	 * ASL code will repeatedly attempt to load the same SSDT.
 	 */
-	status = acpi_tb_is_table_installed (table_info);
-	if (ACPI_FAILURE (status)) {
+	status = acpi_tb_is_table_installed(table_info);
+	if (ACPI_FAILURE(status)) {
 		goto unlock_and_exit;
 	}
 
 	/* Install the table into the global data structure */
 
-	status = acpi_tb_init_table_descriptor (table_info->type, table_info);
-	if (ACPI_FAILURE (status)) {
-		ACPI_REPORT_ERROR (("Could not install table [%4.4s], %s\n",
-			table_info->pointer->signature, acpi_format_exception (status)));
+	status = acpi_tb_init_table_descriptor(table_info->type, table_info);
+	if (ACPI_FAILURE(status)) {
+		ACPI_REPORT_ERROR(("Could not install table [%4.4s], %s\n",
+				   table_info->pointer->signature,
+				   acpi_format_exception(status)));
 	}
 
-	ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s located at %p\n",
-		acpi_gbl_table_data[table_info->type].name, table_info->pointer));
+	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s located at %p\n",
+			  acpi_gbl_table_data[table_info->type].name,
+			  table_info->pointer));
 
-
-unlock_and_exit:
-	(void) acpi_ut_release_mutex (ACPI_MTX_TABLES);
-	return_ACPI_STATUS (status);
+      unlock_and_exit:
+	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
+	return_ACPI_STATUS(status);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_recognize_table
@@ -196,22 +182,18 @@
  ******************************************************************************/
 
 acpi_status
-acpi_tb_recognize_table (
-	struct acpi_table_desc          *table_info,
-	u8                              search_type)
+acpi_tb_recognize_table(struct acpi_table_desc *table_info, u8 search_type)
 {
-	struct acpi_table_header        *table_header;
-	acpi_status                     status;
+	struct acpi_table_header *table_header;
+	acpi_status status;
 
-
-	ACPI_FUNCTION_TRACE ("tb_recognize_table");
-
+	ACPI_FUNCTION_TRACE("tb_recognize_table");
 
 	/* Ensure that we have a valid table pointer */
 
-	table_header = (struct acpi_table_header *) table_info->pointer;
+	table_header = (struct acpi_table_header *)table_info->pointer;
 	if (!table_header) {
-		return_ACPI_STATUS (AE_BAD_PARAMETER);
+		return_ACPI_STATUS(AE_BAD_PARAMETER);
 	}
 
 	/*
@@ -222,25 +204,24 @@
 	 * This can be any one of many valid ACPI tables, it just isn't one of
 	 * the tables that is consumed by the core subsystem
 	 */
-	status = acpi_tb_match_signature (table_header->signature,
-			 table_info, search_type);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
+	status = acpi_tb_match_signature(table_header->signature,
+					 table_info, search_type);
+	if (ACPI_FAILURE(status)) {
+		return_ACPI_STATUS(status);
 	}
 
-	status = acpi_tb_validate_table_header (table_header);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
+	status = acpi_tb_validate_table_header(table_header);
+	if (ACPI_FAILURE(status)) {
+		return_ACPI_STATUS(status);
 	}
 
 	/* Return the table type and length via the info struct */
 
 	table_info->length = (acpi_size) table_header->length;
 
-	return_ACPI_STATUS (status);
+	return_ACPI_STATUS(status);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_init_table_descriptor
@@ -255,30 +236,27 @@
  ******************************************************************************/
 
 acpi_status
-acpi_tb_init_table_descriptor (
-	acpi_table_type                 table_type,
-	struct acpi_table_desc          *table_info)
+acpi_tb_init_table_descriptor(acpi_table_type table_type,
+			      struct acpi_table_desc *table_info)
 {
-	struct acpi_table_list          *list_head;
-	struct acpi_table_desc          *table_desc;
-	acpi_status                     status;
+	struct acpi_table_list *list_head;
+	struct acpi_table_desc *table_desc;
+	acpi_status status;
 
-
-	ACPI_FUNCTION_TRACE_U32 ("tb_init_table_descriptor", table_type);
-
+	ACPI_FUNCTION_TRACE_U32("tb_init_table_descriptor", table_type);
 
 	/* Allocate a descriptor for this table */
 
-	table_desc = ACPI_MEM_CALLOCATE (sizeof (struct acpi_table_desc));
+	table_desc = ACPI_MEM_CALLOCATE(sizeof(struct acpi_table_desc));
 	if (!table_desc) {
-		return_ACPI_STATUS (AE_NO_MEMORY);
+		return_ACPI_STATUS(AE_NO_MEMORY);
 	}
 
 	/* Get a new owner ID for the table */
 
-	status = acpi_ut_allocate_owner_id (&table_desc->owner_id);
-	if (ACPI_FAILURE (status)) {
-		return_ACPI_STATUS (status);
+	status = acpi_ut_allocate_owner_id(&table_desc->owner_id);
+	if (ACPI_FAILURE(status)) {
+		return_ACPI_STATUS(status);
 	}
 
 	/* Install the table into the global data structure */
@@ -290,14 +268,14 @@
 	 * includes most ACPI tables such as the DSDT.  2) Multiple instances of
 	 * the table are allowed.  This includes SSDT and PSDTs.
 	 */
-	if (ACPI_IS_SINGLE_TABLE (acpi_gbl_table_data[table_type].flags)) {
+	if (ACPI_IS_SINGLE_TABLE(acpi_gbl_table_data[table_type].flags)) {
 		/*
 		 * Only one table allowed, and a table has alread been installed
 		 * at this location, so return an error.
 		 */
 		if (list_head->next) {
-			ACPI_MEM_FREE (table_desc);
-			return_ACPI_STATUS (AE_ALREADY_EXISTS);
+			ACPI_MEM_FREE(table_desc);
+			return_ACPI_STATUS(AE_ALREADY_EXISTS);
 		}
 
 		table_desc->next = list_head->next;
@@ -308,8 +286,7 @@
 		}
 
 		list_head->count++;
-	}
-	else {
+	} else {
 		/*
 		 * Link the new table in to the list of tables of this type.
 		 * Insert at the end of the list, order IS IMPORTANT.
@@ -320,8 +297,7 @@
 
 		if (!list_head->next) {
 			list_head->next = table_desc;
-		}
-		else {
+		} else {
 			table_desc->next = list_head->next;
 
 			while (table_desc->next->next) {
@@ -336,13 +312,14 @@
 
 	/* Finish initialization of the table descriptor */
 
-	table_desc->type                = (u8) table_type;
-	table_desc->pointer             = table_info->pointer;
-	table_desc->length              = table_info->length;
-	table_desc->allocation          = table_info->allocation;
-	table_desc->aml_start           = (u8 *) (table_desc->pointer + 1),
-	table_desc->aml_length          = (u32) (table_desc->length -
-			 (u32) sizeof (struct acpi_table_header));
+	table_desc->type = (u8) table_type;
+	table_desc->pointer = table_info->pointer;
+	table_desc->length = table_info->length;
+	table_desc->allocation = table_info->allocation;
+	table_desc->aml_start = (u8 *) (table_desc->pointer + 1),
+	    table_desc->aml_length = (u32) (table_desc->length -
+					    (u32) sizeof(struct
+							 acpi_table_header));
 	table_desc->loaded_into_namespace = FALSE;
 
 	/*
@@ -350,18 +327,18 @@
 	 * newly installed table
 	 */
 	if (acpi_gbl_table_data[table_type].global_ptr) {
-		*(acpi_gbl_table_data[table_type].global_ptr) = table_info->pointer;
+		*(acpi_gbl_table_data[table_type].global_ptr) =
+		    table_info->pointer;
 	}
 
 	/* Return Data */
 
-	table_info->owner_id        = table_desc->owner_id;
-	table_info->installed_desc  = table_desc;
+	table_info->owner_id = table_desc->owner_id;
+	table_info->installed_desc = table_desc;
 
-	return_ACPI_STATUS (AE_OK);
+	return_ACPI_STATUS(AE_OK);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_delete_all_tables
@@ -374,23 +351,19 @@
  *
  ******************************************************************************/
 
-void
-acpi_tb_delete_all_tables (
-	void)
+void acpi_tb_delete_all_tables(void)
 {
-	acpi_table_type                 type;
-
+	acpi_table_type type;
 
 	/*
 	 * Free memory allocated for ACPI tables
 	 * Memory can either be mapped or allocated
 	 */
 	for (type = 0; type < NUM_ACPI_TABLE_TYPES; type++) {
-		acpi_tb_delete_tables_by_type (type);
+		acpi_tb_delete_tables_by_type(type);
 	}
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_delete_tables_by_type
@@ -404,23 +377,19 @@
  *
  ******************************************************************************/
 
-void
-acpi_tb_delete_tables_by_type (
-	acpi_table_type                 type)
+void acpi_tb_delete_tables_by_type(acpi_table_type type)
 {
-	struct acpi_table_desc          *table_desc;
-	u32                             count;
-	u32                             i;
+	struct acpi_table_desc *table_desc;
+	u32 count;
+	u32 i;
 
-
-	ACPI_FUNCTION_TRACE_U32 ("tb_delete_tables_by_type", type);
-
+	ACPI_FUNCTION_TRACE_U32("tb_delete_tables_by_type", type);
 
 	if (type > ACPI_TABLE_MAX) {
 		return_VOID;
 	}
 
-	if (ACPI_FAILURE (acpi_ut_acquire_mutex (ACPI_MTX_TABLES))) {
+	if (ACPI_FAILURE(acpi_ut_acquire_mutex(ACPI_MTX_TABLES))) {
 		return;
 	}
 
@@ -458,21 +427,20 @@
 	 * 1) Get the head of the list
 	 */
 	table_desc = acpi_gbl_table_lists[type].next;
-	count     = acpi_gbl_table_lists[type].count;
+	count = acpi_gbl_table_lists[type].count;
 
 	/*
 	 * 2) Walk the entire list, deleting both the allocated tables
 	 *    and the table descriptors
 	 */
 	for (i = 0; i < count; i++) {
-		table_desc = acpi_tb_uninstall_table (table_desc);
+		table_desc = acpi_tb_uninstall_table(table_desc);
 	}
 
-	(void) acpi_ut_release_mutex (ACPI_MTX_TABLES);
+	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
 	return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_delete_single_table
@@ -486,15 +454,12 @@
  *
  ******************************************************************************/
 
-void
-acpi_tb_delete_single_table (
-	struct acpi_table_desc          *table_desc)
+void acpi_tb_delete_single_table(struct acpi_table_desc *table_desc)
 {
 
 	/* Must have a valid table descriptor and pointer */
 
-	if ((!table_desc) ||
-		 (!table_desc->pointer)) {
+	if ((!table_desc) || (!table_desc->pointer)) {
 		return;
 	}
 
@@ -506,12 +471,12 @@
 
 	case ACPI_MEM_ALLOCATED:
 
-		ACPI_MEM_FREE (table_desc->pointer);
+		ACPI_MEM_FREE(table_desc->pointer);
 		break;
 
 	case ACPI_MEM_MAPPED:
 
-		acpi_os_unmap_memory (table_desc->pointer, table_desc->length);
+		acpi_os_unmap_memory(table_desc->pointer, table_desc->length);
 		break;
 
 	default:
@@ -519,7 +484,6 @@
 	}
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_uninstall_table
@@ -534,26 +498,22 @@
  *
  ******************************************************************************/
 
-struct acpi_table_desc *
-acpi_tb_uninstall_table (
-	struct acpi_table_desc          *table_desc)
+struct acpi_table_desc *acpi_tb_uninstall_table(struct acpi_table_desc
+						*table_desc)
 {
-	struct acpi_table_desc          *next_desc;
+	struct acpi_table_desc *next_desc;
 
-
-	ACPI_FUNCTION_TRACE_PTR ("tb_uninstall_table", table_desc);
-
+	ACPI_FUNCTION_TRACE_PTR("tb_uninstall_table", table_desc);
 
 	if (!table_desc) {
-		return_PTR (NULL);
+		return_PTR(NULL);
 	}
 
 	/* Unlink the descriptor from the doubly linked list */
 
 	if (table_desc->prev) {
 		table_desc->prev->next = table_desc->next;
-	}
-	else {
+	} else {
 		/* Is first on list, update list head */
 
 		acpi_gbl_table_lists[table_desc->type].next = table_desc->next;
@@ -565,16 +525,14 @@
 
 	/* Free the memory allocated for the table itself */
 
-	acpi_tb_delete_single_table (table_desc);
+	acpi_tb_delete_single_table(table_desc);
 
 	/* Free the table descriptor */
 
 	next_desc = table_desc->next;
-	ACPI_MEM_FREE (table_desc);
+	ACPI_MEM_FREE(table_desc);
 
 	/* Return pointer to the next descriptor */
 
-	return_PTR (next_desc);
+	return_PTR(next_desc);
 }
-
-
