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
18static 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 */
27static 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