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