xref: /linux/include/soc/arc/aux.h (revision 4b132aacb0768ac1e652cf517097ea6f237214b9)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2016-2017 Synopsys, Inc. (www.synopsys.com)
4  */
5 
6 #ifndef __SOC_ARC_AUX_H__
7 #define __SOC_ARC_AUX_H__
8 
9 #ifdef CONFIG_ARC
10 
11 #define read_aux_reg(r)		__builtin_arc_lr(r)
12 
13 /* gcc builtin sr needs reg param to be long immediate */
14 #define write_aux_reg(r, v)	__builtin_arc_sr((unsigned int)(v), r)
15 
16 #else	/* !CONFIG_ARC */
17 
18 static inline int read_aux_reg(u32 r)
19 {
20 	return 0;
21 }
22 
23 /*
24  * function helps elide unused variable warning
25  * see: https://lists.infradead.org/pipermail/linux-snps-arc/2016-November/001748.html
26  */
27 static inline void write_aux_reg(u32 r, u32 v)
28 {
29 	;
30 }
31 
32 #endif
33 
34 #define READ_BCR(reg, into)				\
35 {							\
36 	unsigned int tmp;				\
37 	tmp = read_aux_reg(reg);			\
38 	if (sizeof(tmp) == sizeof(into)) {		\
39 		into = *((typeof(into) *)&tmp);		\
40 	} else {					\
41 		extern void bogus_undefined(void);	\
42 		bogus_undefined();			\
43 	}						\
44 }
45 
46 #define WRITE_AUX(reg, into)				\
47 {							\
48 	unsigned int tmp;				\
49 	if (sizeof(tmp) == sizeof(into)) {		\
50 		tmp = (*(unsigned int *)&(into));	\
51 		write_aux_reg(reg, tmp);		\
52 	} else  {					\
53 		extern void bogus_undefined(void);	\
54 		bogus_undefined();			\
55 	}						\
56 }
57 
58 
59 #endif
60