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
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3)  * arch/sh/lib/io.c - SH32 optimized I/O routines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5)  * Copyright (C) 2000  Stuart Menefy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6)  * Copyright (C) 2005  Paul Mundt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8)  * Provide real functions which expand to whatever the header file defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9)  * Also definitions of machine independent IO functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) void __raw_readsl(const void __iomem *addr, void *datap, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) 	u32 *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) 	for (data = datap; (len != 0) && (((u32)data & 0x1f) != 0); len--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 		*data++ = __raw_readl(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) 	if (likely(len >= (0x20 >> 2))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 		int tmp2, tmp3, tmp4, tmp5, tmp6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) 		__asm__ __volatile__(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) 			"1:			\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 			"mov.l	@%7, r0		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 			"mov.l	@%7, %2		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #ifdef CONFIG_CPU_SH4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 			"movca.l r0, @%0	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 			"mov.l	r0, @%0		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 			"mov.l	@%7, %3		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 			"mov.l	@%7, %4		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 			"mov.l	@%7, %5		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 			"mov.l	@%7, %6		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 			"mov.l	@%7, r7		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 			"mov.l	@%7, r0		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 			"mov.l	%2, @(0x04,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 			"mov	#0x20>>2, %2	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 			"mov.l	%3, @(0x08,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 			"sub	%2, %1		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 			"mov.l	%4, @(0x0c,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 			"cmp/hi	%1, %2		! T if 32 > len	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 			"mov.l	%5, @(0x10,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 			"mov.l	%6, @(0x14,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 			"mov.l	r7, @(0x18,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 			"mov.l	r0, @(0x1c,%0)	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 			"bf.s	1b		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 			" add	#0x20, %0	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 			: "=&r" (data), "=&r" (len),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 			  "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 			  "=&r" (tmp5), "=&r" (tmp6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 			: "r"(addr), "0" (data), "1" (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 			: "r0", "r7", "t", "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 	for (; len != 0; len--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 		*data++ = __raw_readl(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) EXPORT_SYMBOL(__raw_readsl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) void __raw_writesl(void __iomem *addr, const void *data, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 	if (likely(len != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 		int tmp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 		__asm__ __volatile__ (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) 			"1:				\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 			"mov.l	@%0+, %1	\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 			"dt		%3		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 			"bf.s		1b		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) 			" mov.l	%1, @%4		\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) 			: "=&r" (data), "=&r" (tmp1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) 			: "0" (data), "r" (len), "r"(addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) 			: "t", "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) EXPORT_SYMBOL(__raw_writesl);