Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2016-2017 Synopsys, Inc. (www.synopsys.com)
0004  */
0005 
0006 #ifndef __SOC_ARC_AUX_H__
0007 #define __SOC_ARC_AUX_H__
0008 
0009 #ifdef CONFIG_ARC
0010 
0011 #define read_aux_reg(r)     __builtin_arc_lr(r)
0012 
0013 /* gcc builtin sr needs reg param to be long immediate */
0014 #define write_aux_reg(r, v) __builtin_arc_sr((unsigned int)(v), r)
0015 
0016 #else   /* !CONFIG_ARC */
0017 
0018 static inline int read_aux_reg(u32 r)
0019 {
0020     return 0;
0021 }
0022 
0023 /*
0024  * function helps elide unused variable warning
0025  * see: https://lists.infradead.org/pipermail/linux-snps-arc/2016-November/001748.html
0026  */
0027 static inline void write_aux_reg(u32 r, u32 v)
0028 {
0029     ;
0030 }
0031 
0032 #endif
0033 
0034 #define READ_BCR(reg, into)             \
0035 {                           \
0036     unsigned int tmp;               \
0037     tmp = read_aux_reg(reg);            \
0038     if (sizeof(tmp) == sizeof(into)) {      \
0039         into = *((typeof(into) *)&tmp);     \
0040     } else {                    \
0041         extern void bogus_undefined(void);  \
0042         bogus_undefined();          \
0043     }                       \
0044 }
0045 
0046 #define WRITE_AUX(reg, into)                \
0047 {                           \
0048     unsigned int tmp;               \
0049     if (sizeof(tmp) == sizeof(into)) {      \
0050         tmp = (*(unsigned int *)&(into));   \
0051         write_aux_reg(reg, tmp);        \
0052     } else  {                   \
0053         extern void bogus_undefined(void);  \
0054         bogus_undefined();          \
0055     }                       \
0056 }
0057 
0058 
0059 #endif