Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 2012 Regents of the University of California
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/param.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/timex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * This is copies from arch/arm/include/asm/delay.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  * Loop (or tick) based delay:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * loops = loops_per_jiffy * jiffies_per_sec * delay_us / us_per_sec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * where:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * jiffies_per_sec = HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * us_per_sec = 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * Therefore the constant part is HZ / 1000000 which is a small
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * fractional number. To make this usable with integer math, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * scale up this constant by 2^31, perform the actual multiplication,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * and scale the result back down by 2^31 with a simple shift:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * loops = (loops_per_jiffy * delay_us * UDELAY_MULT) >> 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  * where:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * UDELAY_MULT = 2^31 * HZ / 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *             = (2^31 / 1000000) * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *             = 2147.483648 * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *             = 2147 * HZ + 483648 * HZ / 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * 31 is the biggest scale shift value that won't overflow 32 bits for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  * delay_us * UDELAY_MULT assuming HZ <= 1000 and delay_us <= 2000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) #define MAX_UDELAY_US	2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define MAX_UDELAY_HZ	1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define UDELAY_MULT	(2147UL * HZ + 483648UL * HZ / 1000000UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) #define UDELAY_SHIFT	31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #if HZ > MAX_UDELAY_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #error "HZ > MAX_UDELAY_HZ"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  * RISC-V supports both UDELAY and NDELAY.  This is largely the same as above,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * but with different constants.  I added 10 bits to the shift to get this, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * the result is that I need a 64-bit multiply, which is slow on 32-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  * platforms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * NDELAY_MULT = 2^41 * HZ / 1000000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  *             = (2^41 / 1000000000) * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57)  *             = 2199.02325555 * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58)  *             = 2199 * HZ + 23255550 * HZ / 1000000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)  * The maximum here is to avoid 64-bit overflow, but it isn't checked as it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)  * won't happen.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define MAX_NDELAY_NS   (1ULL << 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #define MAX_NDELAY_HZ	MAX_UDELAY_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) #define NDELAY_MULT	((unsigned long long)(2199ULL * HZ + 23255550ULL * HZ / 1000000000ULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) #define NDELAY_SHIFT	41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) #if HZ > MAX_NDELAY_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #error "HZ > MAX_NDELAY_HZ"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) void __delay(unsigned long cycles)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	u64 t0 = get_cycles();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	while ((unsigned long)(get_cycles() - t0) < cycles)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		cpu_relax();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) EXPORT_SYMBOL(__delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) void udelay(unsigned long usecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	u64 ucycles = (u64)usecs * lpj_fine * UDELAY_MULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	u64 n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	if (unlikely(usecs > MAX_UDELAY_US)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		n = (u64)usecs * riscv_timebase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		do_div(n, 1000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 		__delay(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	__delay(ucycles >> UDELAY_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) EXPORT_SYMBOL(udelay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) void ndelay(unsigned long nsecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	 * This doesn't bother checking for overflow, as it won't happen (it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	 * an hour) of delay.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	unsigned long long ncycles = nsecs * lpj_fine * NDELAY_MULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	__delay(ncycles >> NDELAY_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) EXPORT_SYMBOL(ndelay);