From 119f37bc1c1b9da19f80c4a8fbc04cb0120e1bdf Mon Sep 17 00:00:00 2001 From: Doug Gilbert Date: Fri, 29 Sep 2017 10:00:59 -0500 Subject: Correct gpe timebase Change-Id: I47524f8400d1b5f2ed5423c2bea105a22a099205 CQ: SW402715 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46917 Tested-by: FSP CI Jenkins Reviewed-by: Christopher J. Cain Reviewed-by: William A. Bryan Reviewed-by: Martha Broyles --- src/occ_gpe0/gpe_util.c | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) (limited to 'src/occ_gpe0/gpe_util.c') diff --git a/src/occ_gpe0/gpe_util.c b/src/occ_gpe0/gpe_util.c index 59e44c1..2606a3d 100644 --- a/src/occ_gpe0/gpe_util.c +++ b/src/occ_gpe0/gpe_util.c @@ -159,29 +159,24 @@ int wait_spi_completion(GpeErrorStruct *error, uint32_t reg, uint32_t i_timeout) */ void busy_wait(uint32_t i_microseconds) { - uint32_t start_decrementer_value; // The decrementer register value at the beginning - uint32_t end_decrementer_value; // The decrementer register value at the end - uint32_t current_decrementer_value; // The current decrementer register value - uint32_t duration; - MFDEC(start_decrementer_value); // get the decrementer register value at the beginning - current_decrementer_value = start_decrementer_value; + uint32_t current_count = pk_timebase32_get(); + uint32_t end_count = current_count + + PK_INTERVAL_SCALE((uint32_t)PK_MICROSECONDS(i_microseconds)); - // multiply the delay time by the external clock frequency (~37.5 MHz) - duration = (i_microseconds * 37); - duration += (i_microseconds >> 1); - - // Calculate the decrementer register value at the end of the busy wait period - end_decrementer_value = start_decrementer_value - duration; - - if(start_decrementer_value < end_decrementer_value) // decrementer overflows during the busy wait? + // Handle wrap case + if(current_count > end_count) { - MFDEC(current_decrementer_value); - while(current_decrementer_value < end_decrementer_value) // Wait until Decrementer overflows - MFDEC(current_decrementer_value); + // let counter roll over + while(current_count > end_count) + { + current_count = pk_timebase32_get(); + } } - while (current_decrementer_value > end_decrementer_value) // Wait until end_decrementer_value is reached - MFDEC(current_decrementer_value); + while (current_count < end_count) + { + current_count = pk_timebase32_get(); + } } /* -- cgit v1.2.1