162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 362306a36Sopenharmony_ci#include <linux/kernel.h> 462306a36Sopenharmony_ci#include <linux/module.h> 562306a36Sopenharmony_ci#include <linux/init.h> 662306a36Sopenharmony_ci#include <linux/delay.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_civoid __aligned(8) __delay(unsigned long loops) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci asm volatile ( 1162306a36Sopenharmony_ci "mov r0, r0\n" 1262306a36Sopenharmony_ci "1:declt %0\n" 1362306a36Sopenharmony_ci "bf 1b" 1462306a36Sopenharmony_ci : "=r"(loops) 1562306a36Sopenharmony_ci : "0"(loops)); 1662306a36Sopenharmony_ci} 1762306a36Sopenharmony_ciEXPORT_SYMBOL(__delay); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_civoid __const_udelay(unsigned long xloops) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci unsigned long long loops; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci loops = (unsigned long long)xloops * loops_per_jiffy * HZ; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci __delay(loops >> 32); 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ciEXPORT_SYMBOL(__const_udelay); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_civoid __udelay(unsigned long usecs) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci __const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */ 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ciEXPORT_SYMBOL(__udelay); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_civoid __ndelay(unsigned long nsecs) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci __const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */ 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ciEXPORT_SYMBOL(__ndelay); 40