Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[sfrench/cifs-2.6.git] / include / soc / arc / aux.h
1 /*
2  * Copyright (C) 2016-2017 Synopsys, Inc. (www.synopsys.com)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  */
9
10 #ifndef __SOC_ARC_AUX_H__
11 #define __SOC_ARC_AUX_H__
12
13 #ifdef CONFIG_ARC
14
15 #define read_aux_reg(r)         __builtin_arc_lr(r)
16
17 /* gcc builtin sr needs reg param to be long immediate */
18 #define write_aux_reg(r, v)     __builtin_arc_sr((unsigned int)(v), r)
19
20 #else   /* !CONFIG_ARC */
21
22 static inline int read_aux_reg(u32 r)
23 {
24         return 0;
25 }
26
27 /*
28  * function helps elide unused variable warning
29  * see: http://lists.infradead.org/pipermail/linux-snps-arc/2016-November/001748.html
30  */
31 static inline void write_aux_reg(u32 r, u32 v)
32 {
33         ;
34 }
35
36 #endif
37
38 #define READ_BCR(reg, into)                             \
39 {                                                       \
40         unsigned int tmp;                               \
41         tmp = read_aux_reg(reg);                        \
42         if (sizeof(tmp) == sizeof(into)) {              \
43                 into = *((typeof(into) *)&tmp);         \
44         } else {                                        \
45                 extern void bogus_undefined(void);      \
46                 bogus_undefined();                      \
47         }                                               \
48 }
49
50 #define WRITE_AUX(reg, into)                            \
51 {                                                       \
52         unsigned int tmp;                               \
53         if (sizeof(tmp) == sizeof(into)) {              \
54                 tmp = (*(unsigned int *)&(into));       \
55                 write_aux_reg(reg, tmp);                \
56         } else  {                                       \
57                 extern void bogus_undefined(void);      \
58                 bogus_undefined();                      \
59         }                                               \
60 }
61
62
63 #endif