1 /*
2  * Copyright (c) 2015 Intel Corporation.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_ARCH_ARC_V2_SYS_IO_H_
8 #define ZEPHYR_INCLUDE_ARCH_ARC_V2_SYS_IO_H_
9 
10 #ifndef _ASMLANGUAGE
11 
12 #include <zephyr/toolchain.h>
13 #include <zephyr/sys/sys_io.h>
14 #include <zephyr/arch/arc/v2/aux_regs.h>
15 
16 #include <zephyr/types.h>
17 #include <stddef.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /* Implementation of sys_io.h's documented functions */
24 
25 static ALWAYS_INLINE
sys_out8(uint8_t data,io_port_t port)26 	void sys_out8(uint8_t data, io_port_t port)
27 {
28 	z_arc_v2_aux_reg_write(port, data);
29 }
30 
31 static ALWAYS_INLINE
sys_in8(io_port_t port)32 	uint8_t sys_in8(io_port_t port)
33 {
34 	return (uint8_t)(z_arc_v2_aux_reg_read(port) & 0x000000ff);
35 }
36 
37 static ALWAYS_INLINE
sys_out16(uint16_t data,io_port_t port)38 	void sys_out16(uint16_t data, io_port_t port)
39 {
40 	z_arc_v2_aux_reg_write(port, data);
41 }
42 
43 static ALWAYS_INLINE
sys_in16(io_port_t port)44 	uint16_t sys_in16(io_port_t port)
45 {
46 	return (uint16_t)(z_arc_v2_aux_reg_read(port) & 0x0000ffff);
47 }
48 
49 static ALWAYS_INLINE
sys_out32(uint32_t data,io_port_t port)50 	void sys_out32(uint32_t data, io_port_t port)
51 {
52 	z_arc_v2_aux_reg_write(port, data);
53 }
54 
55 static ALWAYS_INLINE
sys_in32(io_port_t port)56 	uint32_t sys_in32(io_port_t port)
57 {
58 	return z_arc_v2_aux_reg_read(port);
59 }
60 
61 static ALWAYS_INLINE
sys_io_set_bit(io_port_t port,unsigned int bit)62 	void sys_io_set_bit(io_port_t port, unsigned int bit)
63 {
64 	uint32_t reg = 0;
65 
66 	__asm__ volatile("lr	%1, [%0]\n"
67 			 "bset	%1, %1, %2\n"
68 			 "sr	%1, [%0];\n\t"
69 			 :
70 			 : "ir" (port),
71 			   "r" (reg), "ir" (bit)
72 			 : "memory", "cc");
73 }
74 
75 static ALWAYS_INLINE
sys_io_clear_bit(io_port_t port,unsigned int bit)76 	void sys_io_clear_bit(io_port_t port, unsigned int bit)
77 {
78 	uint32_t reg = 0;
79 
80 	__asm__ volatile("lr	%1, [%0]\n"
81 			 "bclr	%1, %1, %2\n"
82 			 "sr	%1, [%0];\n\t"
83 			 :
84 			 : "ir" (port),
85 			   "r" (reg), "ir" (bit)
86 			 : "memory", "cc");
87 }
88 
89 static ALWAYS_INLINE
sys_io_test_bit(io_port_t port,unsigned int bit)90 	int sys_io_test_bit(io_port_t port, unsigned int bit)
91 {
92 	uint32_t status = _ARC_V2_STATUS32;
93 	uint32_t reg = 0;
94 	uint32_t ret;
95 
96 	__asm__ volatile("lr	%2, [%1]\n"
97 			 "btst	%2, %3\n"
98 			 "lr	%0, [%4];\n\t"
99 			 : "=r" (ret)
100 			 : "ir" (port),
101 			   "r" (reg), "ir" (bit), "i" (status)
102 			 : "memory", "cc");
103 
104 	return !(ret & _ARC_V2_STATUS32_Z);
105 }
106 
107 static ALWAYS_INLINE
sys_io_test_and_set_bit(io_port_t port,unsigned int bit)108 	int sys_io_test_and_set_bit(io_port_t port, unsigned int bit)
109 {
110 	int ret;
111 
112 	ret = sys_io_test_bit(port, bit);
113 	sys_io_set_bit(port, bit);
114 
115 	return ret;
116 }
117 
118 static ALWAYS_INLINE
sys_io_test_and_clear_bit(io_port_t port,unsigned int bit)119 	int sys_io_test_and_clear_bit(io_port_t port, unsigned int bit)
120 {
121 	int ret;
122 
123 	ret = sys_io_test_bit(port, bit);
124 	sys_io_clear_bit(port, bit);
125 
126 	return ret;
127 }
128 
129 #ifdef __cplusplus
130 }
131 #endif
132 
133 #endif /* _ASMLANGUAGE */
134 
135 #endif /* ZEPHYR_INCLUDE_ARCH_ARC_V2_SYS_IO_H_ */
136