1*c67c4c8dSMarouene Boubakri // SPDX-License-Identifier: BSD-2-Clause 2*c67c4c8dSMarouene Boubakri /* 3*c67c4c8dSMarouene Boubakri * Copyright (c) 2018, Linaro Limited 4*c67c4c8dSMarouene Boubakri * Copyright (C) 2017, Fuzhou Rockchip Electronics Co., Ltd. 5*c67c4c8dSMarouene Boubakri * All rights reserved. 6*c67c4c8dSMarouene Boubakri * 7*c67c4c8dSMarouene Boubakri * Redistribution and use in source and binary forms, with or without 8*c67c4c8dSMarouene Boubakri * modification, are permitted provided that the following conditions are met: 9*c67c4c8dSMarouene Boubakri * 10*c67c4c8dSMarouene Boubakri * 1. Redistributions of source code must retain the above copyright notice, 11*c67c4c8dSMarouene Boubakri * this list of conditions and the following disclaimer. 12*c67c4c8dSMarouene Boubakri * 13*c67c4c8dSMarouene Boubakri * 2. Redistributions in binary form must reproduce the above copyright notice, 14*c67c4c8dSMarouene Boubakri * this list of conditions and the following disclaimer in the documentation 15*c67c4c8dSMarouene Boubakri * and/or other materials provided with the distribution. 16*c67c4c8dSMarouene Boubakri * 17*c67c4c8dSMarouene Boubakri * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*c67c4c8dSMarouene Boubakri * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*c67c4c8dSMarouene Boubakri * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*c67c4c8dSMarouene Boubakri * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*c67c4c8dSMarouene Boubakri * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*c67c4c8dSMarouene Boubakri * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*c67c4c8dSMarouene Boubakri * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*c67c4c8dSMarouene Boubakri * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*c67c4c8dSMarouene Boubakri * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*c67c4c8dSMarouene Boubakri * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*c67c4c8dSMarouene Boubakri * POSSIBILITY OF SUCH DAMAGE. 28*c67c4c8dSMarouene Boubakri */ 29*c67c4c8dSMarouene Boubakri 30*c67c4c8dSMarouene Boubakri #include <kernel/boot.h> 31*c67c4c8dSMarouene Boubakri #include <kernel/delay.h> 32*c67c4c8dSMarouene Boubakri #include <kernel/misc.h> 33*c67c4c8dSMarouene Boubakri 34*c67c4c8dSMarouene Boubakri #ifdef CFG_CORE_HAS_GENERIC_TIMER 35*c67c4c8dSMarouene Boubakri void udelay(uint32_t us) 36*c67c4c8dSMarouene Boubakri { 37*c67c4c8dSMarouene Boubakri uint64_t target = timeout_init_us(us); 38*c67c4c8dSMarouene Boubakri 39*c67c4c8dSMarouene Boubakri while (!timeout_elapsed(target)) 40*c67c4c8dSMarouene Boubakri ; 41*c67c4c8dSMarouene Boubakri } 42*c67c4c8dSMarouene Boubakri #else 43*c67c4c8dSMarouene Boubakri 44*c67c4c8dSMarouene Boubakri void udelay(uint32_t us) 45*c67c4c8dSMarouene Boubakri { 46*c67c4c8dSMarouene Boubakri uint64_t cycles = 0; 47*c67c4c8dSMarouene Boubakri uint32_t cycles_to_wait = 0; 48*c67c4c8dSMarouene Boubakri 49*c67c4c8dSMarouene Boubakri cycles = (uint64_t)us * ((uint64_t)plat_get_freq() / 1000000ULL); 50*c67c4c8dSMarouene Boubakri 51*c67c4c8dSMarouene Boubakri while (cycles) { 52*c67c4c8dSMarouene Boubakri cycles_to_wait = MIN(cycles, UINT32_MAX); 53*c67c4c8dSMarouene Boubakri wait_cycles(cycles_to_wait); 54*c67c4c8dSMarouene Boubakri cycles -= cycles_to_wait; 55*c67c4c8dSMarouene Boubakri } 56*c67c4c8dSMarouene Boubakri } 57*c67c4c8dSMarouene Boubakri #endif 58*c67c4c8dSMarouene Boubakri 59*c67c4c8dSMarouene Boubakri void mdelay(uint32_t ms) 60*c67c4c8dSMarouene Boubakri { 61*c67c4c8dSMarouene Boubakri udelay(1000 * ms); 62*c67c4c8dSMarouene Boubakri } 63