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 | |