Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARC: breakout aux handling into a separate header

ARC timers use aux registers for programming and this paves way for
moving ARC timer drivers into drivers/clocksource

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>

+65 -85
+1 -84
arch/arc/include/asm/arcregs.h
··· 112 112 113 113 #ifndef __ASSEMBLY__ 114 114 115 - /* 116 - ****************************************************************** 117 - * Inline ASM macros to read/write AUX Regs 118 - * Essentially invocation of lr/sr insns from "C" 119 - */ 120 - 121 - #if 1 122 - 123 - #define read_aux_reg(reg) __builtin_arc_lr(reg) 124 - 125 - /* gcc builtin sr needs reg param to be long immediate */ 126 - #define write_aux_reg(reg_immed, val) \ 127 - __builtin_arc_sr((unsigned int)(val), reg_immed) 128 - 129 - #else 130 - 131 - #define read_aux_reg(reg) \ 132 - ({ \ 133 - unsigned int __ret; \ 134 - __asm__ __volatile__( \ 135 - " lr %0, [%1]" \ 136 - : "=r"(__ret) \ 137 - : "i"(reg)); \ 138 - __ret; \ 139 - }) 140 - 141 - /* 142 - * Aux Reg address is specified as long immediate by caller 143 - * e.g. 144 - * write_aux_reg(0x69, some_val); 145 - * This generates tightest code. 146 - */ 147 - #define write_aux_reg(reg_imm, val) \ 148 - ({ \ 149 - __asm__ __volatile__( \ 150 - " sr %0, [%1] \n" \ 151 - : \ 152 - : "ir"(val), "i"(reg_imm)); \ 153 - }) 154 - 155 - /* 156 - * Aux Reg address is specified in a variable 157 - * * e.g. 158 - * reg_num = 0x69 159 - * write_aux_reg2(reg_num, some_val); 160 - * This has to generate glue code to load the reg num from 161 - * memory to a reg hence not recommended. 162 - */ 163 - #define write_aux_reg2(reg_in_var, val) \ 164 - ({ \ 165 - unsigned int tmp; \ 166 - \ 167 - __asm__ __volatile__( \ 168 - " ld %0, [%2] \n\t" \ 169 - " sr %1, [%0] \n\t" \ 170 - : "=&r"(tmp) \ 171 - : "r"(val), "memory"(&reg_in_var)); \ 172 - }) 173 - 174 - #endif 175 - 176 - #define READ_BCR(reg, into) \ 177 - { \ 178 - unsigned int tmp; \ 179 - tmp = read_aux_reg(reg); \ 180 - if (sizeof(tmp) == sizeof(into)) { \ 181 - into = *((typeof(into) *)&tmp); \ 182 - } else { \ 183 - extern void bogus_undefined(void); \ 184 - bogus_undefined(); \ 185 - } \ 186 - } 187 - 188 - #define WRITE_AUX(reg, into) \ 189 - { \ 190 - unsigned int tmp; \ 191 - if (sizeof(tmp) == sizeof(into)) { \ 192 - tmp = (*(unsigned int *)&(into)); \ 193 - write_aux_reg(reg, tmp); \ 194 - } else { \ 195 - extern void bogus_undefined(void); \ 196 - bogus_undefined(); \ 197 - } \ 198 - } 115 + #include <soc/arc/aux.h> 199 116 200 117 /* Helpers */ 201 118 #define TO_KB(bytes) ((bytes) >> 10)
+1 -1
arch/arc/include/asm/mcip.h
··· 13 13 14 14 #ifdef CONFIG_ISA_ARCV2 15 15 16 - #include <asm/arcregs.h> 16 + #include <soc/arc/aux.h> 17 17 18 18 #define ARC_REG_MCIP_BCR 0x0d0 19 19 #define ARC_REG_MCIP_CMD 0x600
+63
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