diff options
Diffstat (limited to 'drivers/acpi/acpica/evgpeutil.c')
| -rw-r--r-- | drivers/acpi/acpica/evgpeutil.c | 30 | 
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c index b24dbb80fab..17e4bbfdb09 100644 --- a/drivers/acpi/acpica/evgpeutil.c +++ b/drivers/acpi/acpica/evgpeutil.c @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2013, Intel Corp. + * Copyright (C) 2000 - 2014, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -101,7 +101,7 @@ acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context)  		gpe_xrupt_info = gpe_xrupt_info->next;  	} -      unlock_and_exit: +unlock_and_exit:  	acpi_os_release_lock(acpi_gbl_gpe_lock, flags);  	return_ACPI_STATUS(status);  } @@ -196,9 +196,10 @@ acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,   *   * FUNCTION:    acpi_ev_get_gpe_xrupt_block   * - * PARAMETERS:  interrupt_number     - Interrupt for a GPE block + * PARAMETERS:  interrupt_number            - Interrupt for a GPE block + *              gpe_xrupt_block             - Where the block is returned   * - * RETURN:      A GPE interrupt block + * RETURN:      Status   *   * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt   *              block per unique interrupt level used for GPEs. Should be @@ -207,7 +208,9 @@ acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,   *   ******************************************************************************/ -struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number) +acpi_status +acpi_ev_get_gpe_xrupt_block(u32 interrupt_number, +			    struct acpi_gpe_xrupt_info ** gpe_xrupt_block)  {  	struct acpi_gpe_xrupt_info *next_gpe_xrupt;  	struct acpi_gpe_xrupt_info *gpe_xrupt; @@ -221,7 +224,8 @@ struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number)  	next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head;  	while (next_gpe_xrupt) {  		if (next_gpe_xrupt->interrupt_number == interrupt_number) { -			return_PTR(next_gpe_xrupt); +			*gpe_xrupt_block = next_gpe_xrupt; +			return_ACPI_STATUS(AE_OK);  		}  		next_gpe_xrupt = next_gpe_xrupt->next; @@ -231,7 +235,7 @@ struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number)  	gpe_xrupt = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_xrupt_info));  	if (!gpe_xrupt) { -		return_PTR(NULL); +		return_ACPI_STATUS(AE_NO_MEMORY);  	}  	gpe_xrupt->interrupt_number = interrupt_number; @@ -250,6 +254,7 @@ struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number)  	} else {  		acpi_gbl_gpe_xrupt_list_head = gpe_xrupt;  	} +  	acpi_os_release_lock(acpi_gbl_gpe_lock, flags);  	/* Install new interrupt handler if not SCI_INT */ @@ -259,14 +264,15 @@ struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number)  							   acpi_ev_gpe_xrupt_handler,  							   gpe_xrupt);  		if (ACPI_FAILURE(status)) { -			ACPI_ERROR((AE_INFO, -				    "Could not install GPE interrupt handler at level 0x%X", -				    interrupt_number)); -			return_PTR(NULL); +			ACPI_EXCEPTION((AE_INFO, status, +					"Could not install GPE interrupt handler at level 0x%X", +					interrupt_number)); +			return_ACPI_STATUS(status);  		}  	} -	return_PTR(gpe_xrupt); +	*gpe_xrupt_block = gpe_xrupt; +	return_ACPI_STATUS(AE_OK);  }  /*******************************************************************************  | 
