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