diff options
Diffstat (limited to 'drivers/acpi/acpica/hwtimer.c')
| -rw-r--r-- | drivers/acpi/acpica/hwtimer.c | 29 | 
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/acpi/acpica/hwtimer.c b/drivers/acpi/acpica/hwtimer.c index a2f4e25d45b1..5b4282902a83 100644 --- a/drivers/acpi/acpica/hwtimer.c +++ b/drivers/acpi/acpica/hwtimer.c @@ -150,10 +150,10 @@ ACPI_EXPORT_SYMBOL(acpi_get_timer)   *   ******************************************************************************/  acpi_status -acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed) +acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 *time_elapsed)  {  	acpi_status status; -	u32 delta_ticks; +	u64 delta_ticks;  	u64 quotient;  	ACPI_FUNCTION_TRACE(acpi_get_timer_duration); @@ -168,30 +168,29 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)  		return_ACPI_STATUS(AE_SUPPORT);  	} +	if (start_ticks == end_ticks) { +		*time_elapsed = 0; +		return_ACPI_STATUS(AE_OK); +	} +  	/*  	 * Compute Tick Delta:  	 * Handle (max one) timer rollovers on 24-bit versus 32-bit timers.  	 */ -	if (start_ticks < end_ticks) { -		delta_ticks = end_ticks - start_ticks; -	} else if (start_ticks > end_ticks) { +	delta_ticks = end_ticks; +	if (start_ticks > end_ticks) {  		if ((acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) == 0) {  			/* 24-bit Timer */ -			delta_ticks = -			    (((0x00FFFFFF - start_ticks) + -			      end_ticks) & 0x00FFFFFF); +			delta_ticks |= (u64)1 << 24;  		} else {  			/* 32-bit Timer */ -			delta_ticks = (0xFFFFFFFF - start_ticks) + end_ticks; +			delta_ticks |= (u64)1 << 32;  		} -	} else {		/* start_ticks == end_ticks */ - -		*time_elapsed = 0; -		return_ACPI_STATUS(AE_OK);  	} +	delta_ticks -= start_ticks;  	/*  	 * Compute Duration (Requires a 64-bit multiply and divide): @@ -199,10 +198,10 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)  	 * time_elapsed (microseconds) =  	 *  (delta_ticks * ACPI_USEC_PER_SEC) / ACPI_PM_TIMER_FREQUENCY;  	 */ -	status = acpi_ut_short_divide(((u64)delta_ticks) * ACPI_USEC_PER_SEC, +	status = acpi_ut_short_divide(delta_ticks * ACPI_USEC_PER_SEC,  				      ACPI_PM_TIMER_FREQUENCY, "ient, NULL); -	*time_elapsed = (u32) quotient; +	*time_elapsed = (u32)quotient;  	return_ACPI_STATUS(status);  }  | 
