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