at v4.16 39 lines 879 B view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * NSC/Cyrix CPU indexed register access. Must be inlined instead of 4 * macros to ensure correct access ordering 5 * Access order is always 0x22 (=offset), 0x23 (=value) 6 * 7 * When using the old macros a line like 8 * setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88); 9 * gets expanded to: 10 * do { 11 * outb((CX86_CCR2), 0x22); 12 * outb((({ 13 * outb((CX86_CCR2), 0x22); 14 * inb(0x23); 15 * }) | 0x88), 0x23); 16 * } while (0); 17 * 18 * which in fact violates the access order (= 0x22, 0x22, 0x23, 0x23). 19 */ 20 21static inline u8 getCx86(u8 reg) 22{ 23 outb(reg, 0x22); 24 return inb(0x23); 25} 26 27static inline void setCx86(u8 reg, u8 data) 28{ 29 outb(reg, 0x22); 30 outb(data, 0x23); 31} 32 33#define getCx86_old(reg) ({ outb((reg), 0x22); inb(0x23); }) 34 35#define setCx86_old(reg, data) do { \ 36 outb((reg), 0x22); \ 37 outb((data), 0x23); \ 38} while (0) 39