diff options
Diffstat (limited to 'drivers/acpi/acpica/evevent.c')
| -rw-r--r-- | drivers/acpi/acpica/evevent.c | 44 | 
1 files changed, 34 insertions, 10 deletions
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c index c61c3039c31..c7bffff9ed3 100644 --- a/drivers/acpi/acpica/evevent.c +++ b/drivers/acpi/acpica/evevent.c @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2010, Intel Corp. + * Copyright (C) 2000 - 2014, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -47,7 +47,7 @@  #define _COMPONENT          ACPI_EVENTS  ACPI_MODULE_NAME("evevent") - +#if (!ACPI_REDUCED_HARDWARE)	/* Entire module */  /* Local prototypes */  static acpi_status acpi_ev_fixed_event_initialize(void); @@ -71,6 +71,12 @@ acpi_status acpi_ev_initialize_events(void)  	ACPI_FUNCTION_TRACE(ev_initialize_events); +	/* If Hardware Reduced flag is set, there are no fixed events */ + +	if (acpi_gbl_reduced_hardware) { +		return_ACPI_STATUS(AE_OK); +	} +  	/*  	 * Initialize the Fixed and General Purpose Events. This is done prior to  	 * enabling SCIs to prevent interrupts from occurring before the handlers @@ -111,6 +117,12 @@ acpi_status acpi_ev_install_xrupt_handlers(void)  	ACPI_FUNCTION_TRACE(ev_install_xrupt_handlers); +	/* If Hardware Reduced flag is set, there is no ACPI h/w */ + +	if (acpi_gbl_reduced_hardware) { +		return_ACPI_STATUS(AE_OK); +	} +  	/* Install the SCI handler */  	status = acpi_ev_install_sci_handler(); @@ -217,9 +229,17 @@ u32 acpi_ev_fixed_event_detect(void)  		     status_bit_mask)  		    && (fixed_enable & acpi_gbl_fixed_event_info[i].  			enable_bit_mask)) { +			/* +			 * Found an active (signalled) event. Invoke global event +			 * handler if present. +			 */ +			acpi_fixed_event_count[i]++; +			if (acpi_gbl_global_event_handler) { +				acpi_gbl_global_event_handler +				    (ACPI_EVENT_TYPE_FIXED, NULL, i, +				     acpi_gbl_global_event_handler_context); +			} -			/* Found an active (signalled) event */ -			acpi_os_fixed_event_count(i);  			int_status |= acpi_ev_fixed_event_dispatch(i);  		}  	} @@ -231,12 +251,14 @@ u32 acpi_ev_fixed_event_detect(void)   *   * FUNCTION:    acpi_ev_fixed_event_dispatch   * - * PARAMETERS:  Event               - Event type + * PARAMETERS:  event               - Event type   *   * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED   *   * DESCRIPTION: Clears the status bit for the requested event, calls the   *              handler that previously registered for the event. + *              NOTE: If there is no handler for the event, the event is + *              disabled to prevent further interrupts.   *   ******************************************************************************/ @@ -251,17 +273,17 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)  				      status_register_id, ACPI_CLEAR_STATUS);  	/* -	 * Make sure we've got a handler. If not, report an error. The event is -	 * disabled to prevent further interrupts. +	 * Make sure that a handler exists. If not, report an error +	 * and disable the event to prevent further interrupts.  	 */ -	if (NULL == acpi_gbl_fixed_event_handlers[event].handler) { +	if (!acpi_gbl_fixed_event_handlers[event].handler) {  		(void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].  					      enable_register_id,  					      ACPI_DISABLE_EVENT);  		ACPI_ERROR((AE_INFO, -			    "No installed handler for fixed event [0x%08X]", -			    event)); +			    "No installed handler for fixed event - %s (%u), disabling", +			    acpi_ut_get_event_name(event), event));  		return (ACPI_INTERRUPT_NOT_HANDLED);  	} @@ -271,3 +293,5 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)  	return ((acpi_gbl_fixed_event_handlers[event].  		 handler) (acpi_gbl_fixed_event_handlers[event].context));  } + +#endif				/* !ACPI_REDUCED_HARDWARE */  | 
