1 /* 2 * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 #include <delay_timer.h> 9 #include <platform_def.h> 10 11 /*********************************************************** 12 * The delay timer implementation 13 ***********************************************************/ 14 static const timer_ops_t *ops; 15 16 /*********************************************************** 17 * Delay for the given number of microseconds. The driver must 18 * be initialized before calling this function. 19 ***********************************************************/ udelay(uint32_t usec)20void udelay(uint32_t usec) 21 { 22 assert(ops != NULL && 23 (ops->clk_mult != 0) && 24 (ops->clk_div != 0) && 25 (ops->get_timer_value != NULL)); 26 27 uint32_t start, delta, total_delta; 28 29 assert(usec < UINT32_MAX / ops->clk_div); 30 31 start = ops->get_timer_value(); 32 33 total_delta = (usec * ops->clk_div) / ops->clk_mult; 34 35 do { 36 /* 37 * If the timer value wraps around, the subtraction will 38 * overflow and it will still give the correct result. 39 */ 40 delta = start - ops->get_timer_value(); /* Decreasing counter */ 41 42 } while (delta < total_delta); 43 } 44 45 /*********************************************************** 46 * Delay for the given number of milliseconds. The driver must 47 * be initialized before calling this function. 48 ***********************************************************/ mdelay(uint32_t msec)49void mdelay(uint32_t msec) 50 { 51 udelay(msec*1000); 52 } 53 54 /*********************************************************** 55 * Initialize the timer. The fields in the provided timer 56 * ops pointer must be valid. 57 ***********************************************************/ timer_init(const timer_ops_t * ops_ptr)58void timer_init(const timer_ops_t *ops_ptr) 59 { 60 assert(ops_ptr != NULL && 61 (ops_ptr->clk_mult != 0) && 62 (ops_ptr->clk_div != 0) && 63 (ops_ptr->get_timer_value != NULL)); 64 65 ops = ops_ptr; 66 } 67