1*288aaacfSAlexey Brodkin /* 2*288aaacfSAlexey Brodkin * Copyright (C) 2013-2014 Synopsys, Inc. All rights reserved. 3*288aaacfSAlexey Brodkin * 4*288aaacfSAlexey Brodkin * SPDX-License-Identifier: GPL-2.0+ 5*288aaacfSAlexey Brodkin */ 6*288aaacfSAlexey Brodkin 7*288aaacfSAlexey Brodkin #ifndef __ASM_ARC_IO_H 8*288aaacfSAlexey Brodkin #define __ASM_ARC_IO_H 9*288aaacfSAlexey Brodkin 10*288aaacfSAlexey Brodkin #include <linux/types.h> 11*288aaacfSAlexey Brodkin #include <asm/byteorder.h> 12*288aaacfSAlexey Brodkin 13*288aaacfSAlexey Brodkin static inline void sync(void) 14*288aaacfSAlexey Brodkin { 15*288aaacfSAlexey Brodkin /* Not yet implemented */ 16*288aaacfSAlexey Brodkin } 17*288aaacfSAlexey Brodkin 18*288aaacfSAlexey Brodkin static inline u8 __raw_readb(const volatile void __iomem *addr) 19*288aaacfSAlexey Brodkin { 20*288aaacfSAlexey Brodkin u8 b; 21*288aaacfSAlexey Brodkin 22*288aaacfSAlexey Brodkin __asm__ __volatile__("ldb%U1 %0, %1\n" 23*288aaacfSAlexey Brodkin : "=r" (b) 24*288aaacfSAlexey Brodkin : "m" (*(volatile u8 __force *)addr) 25*288aaacfSAlexey Brodkin : "memory"); 26*288aaacfSAlexey Brodkin return b; 27*288aaacfSAlexey Brodkin } 28*288aaacfSAlexey Brodkin 29*288aaacfSAlexey Brodkin static inline u16 __raw_readw(const volatile void __iomem *addr) 30*288aaacfSAlexey Brodkin { 31*288aaacfSAlexey Brodkin u16 s; 32*288aaacfSAlexey Brodkin 33*288aaacfSAlexey Brodkin __asm__ __volatile__("ldw%U1 %0, %1\n" 34*288aaacfSAlexey Brodkin : "=r" (s) 35*288aaacfSAlexey Brodkin : "m" (*(volatile u16 __force *)addr) 36*288aaacfSAlexey Brodkin : "memory"); 37*288aaacfSAlexey Brodkin return s; 38*288aaacfSAlexey Brodkin } 39*288aaacfSAlexey Brodkin 40*288aaacfSAlexey Brodkin static inline u32 __raw_readl(const volatile void __iomem *addr) 41*288aaacfSAlexey Brodkin { 42*288aaacfSAlexey Brodkin u32 w; 43*288aaacfSAlexey Brodkin 44*288aaacfSAlexey Brodkin __asm__ __volatile__("ld%U1 %0, %1\n" 45*288aaacfSAlexey Brodkin : "=r" (w) 46*288aaacfSAlexey Brodkin : "m" (*(volatile u32 __force *)addr) 47*288aaacfSAlexey Brodkin : "memory"); 48*288aaacfSAlexey Brodkin return w; 49*288aaacfSAlexey Brodkin } 50*288aaacfSAlexey Brodkin 51*288aaacfSAlexey Brodkin #define readb __raw_readb 52*288aaacfSAlexey Brodkin 53*288aaacfSAlexey Brodkin static inline u16 readw(const volatile void __iomem *addr) 54*288aaacfSAlexey Brodkin { 55*288aaacfSAlexey Brodkin return __le16_to_cpu(__raw_readw(addr)); 56*288aaacfSAlexey Brodkin } 57*288aaacfSAlexey Brodkin 58*288aaacfSAlexey Brodkin static inline u32 readl(const volatile void __iomem *addr) 59*288aaacfSAlexey Brodkin { 60*288aaacfSAlexey Brodkin return __le32_to_cpu(__raw_readl(addr)); 61*288aaacfSAlexey Brodkin } 62*288aaacfSAlexey Brodkin 63*288aaacfSAlexey Brodkin static inline void __raw_writeb(u8 b, volatile void __iomem *addr) 64*288aaacfSAlexey Brodkin { 65*288aaacfSAlexey Brodkin __asm__ __volatile__("stb%U1 %0, %1\n" 66*288aaacfSAlexey Brodkin : 67*288aaacfSAlexey Brodkin : "r" (b), "m" (*(volatile u8 __force *)addr) 68*288aaacfSAlexey Brodkin : "memory"); 69*288aaacfSAlexey Brodkin } 70*288aaacfSAlexey Brodkin 71*288aaacfSAlexey Brodkin static inline void __raw_writew(u16 s, volatile void __iomem *addr) 72*288aaacfSAlexey Brodkin { 73*288aaacfSAlexey Brodkin __asm__ __volatile__("stw%U1 %0, %1\n" 74*288aaacfSAlexey Brodkin : 75*288aaacfSAlexey Brodkin : "r" (s), "m" (*(volatile u16 __force *)addr) 76*288aaacfSAlexey Brodkin : "memory"); 77*288aaacfSAlexey Brodkin } 78*288aaacfSAlexey Brodkin 79*288aaacfSAlexey Brodkin static inline void __raw_writel(u32 w, volatile void __iomem *addr) 80*288aaacfSAlexey Brodkin { 81*288aaacfSAlexey Brodkin __asm__ __volatile__("st%U1 %0, %1\n" 82*288aaacfSAlexey Brodkin : 83*288aaacfSAlexey Brodkin : "r" (w), "m" (*(volatile u32 __force *)addr) 84*288aaacfSAlexey Brodkin : "memory"); 85*288aaacfSAlexey Brodkin } 86*288aaacfSAlexey Brodkin 87*288aaacfSAlexey Brodkin #define writeb __raw_writeb 88*288aaacfSAlexey Brodkin #define writew(b, addr) __raw_writew(__cpu_to_le16(b), addr) 89*288aaacfSAlexey Brodkin #define writel(b, addr) __raw_writel(__cpu_to_le32(b), addr) 90*288aaacfSAlexey Brodkin 91*288aaacfSAlexey Brodkin static inline int __raw_readsb(unsigned int addr, void *data, int bytelen) 92*288aaacfSAlexey Brodkin { 93*288aaacfSAlexey Brodkin __asm__ __volatile__ ("1:ld.di r8, [r0]\n" 94*288aaacfSAlexey Brodkin "sub.f r2, r2, 1\n" 95*288aaacfSAlexey Brodkin "bnz.d 1b\n" 96*288aaacfSAlexey Brodkin "stb.ab r8, [r1, 1]\n" 97*288aaacfSAlexey Brodkin : 98*288aaacfSAlexey Brodkin : "r" (addr), "r" (data), "r" (bytelen) 99*288aaacfSAlexey Brodkin : "r8"); 100*288aaacfSAlexey Brodkin return bytelen; 101*288aaacfSAlexey Brodkin } 102*288aaacfSAlexey Brodkin 103*288aaacfSAlexey Brodkin static inline int __raw_readsw(unsigned int addr, void *data, int wordlen) 104*288aaacfSAlexey Brodkin { 105*288aaacfSAlexey Brodkin __asm__ __volatile__ ("1:ld.di r8, [r0]\n" 106*288aaacfSAlexey Brodkin "sub.f r2, r2, 1\n" 107*288aaacfSAlexey Brodkin "bnz.d 1b\n" 108*288aaacfSAlexey Brodkin "stw.ab r8, [r1, 2]\n" 109*288aaacfSAlexey Brodkin : 110*288aaacfSAlexey Brodkin : "r" (addr), "r" (data), "r" (wordlen) 111*288aaacfSAlexey Brodkin : "r8"); 112*288aaacfSAlexey Brodkin return wordlen; 113*288aaacfSAlexey Brodkin } 114*288aaacfSAlexey Brodkin 115*288aaacfSAlexey Brodkin static inline int __raw_readsl(unsigned int addr, void *data, int longlen) 116*288aaacfSAlexey Brodkin { 117*288aaacfSAlexey Brodkin __asm__ __volatile__ ("1:ld.di r8, [r0]\n" 118*288aaacfSAlexey Brodkin "sub.f r2, r2, 1\n" 119*288aaacfSAlexey Brodkin "bnz.d 1b\n" 120*288aaacfSAlexey Brodkin "st.ab r8, [r1, 4]\n" 121*288aaacfSAlexey Brodkin : 122*288aaacfSAlexey Brodkin : "r" (addr), "r" (data), "r" (longlen) 123*288aaacfSAlexey Brodkin : "r8"); 124*288aaacfSAlexey Brodkin return longlen; 125*288aaacfSAlexey Brodkin } 126*288aaacfSAlexey Brodkin 127*288aaacfSAlexey Brodkin static inline int __raw_writesb(unsigned int addr, void *data, int bytelen) 128*288aaacfSAlexey Brodkin { 129*288aaacfSAlexey Brodkin __asm__ __volatile__ ("1:ldb.ab r8, [r1, 1]\n" 130*288aaacfSAlexey Brodkin "sub.f r2, r2, 1\n" 131*288aaacfSAlexey Brodkin "bnz.d 1b\n" 132*288aaacfSAlexey Brodkin "st.di r8, [r0, 0]\n" 133*288aaacfSAlexey Brodkin : 134*288aaacfSAlexey Brodkin : "r" (addr), "r" (data), "r" (bytelen) 135*288aaacfSAlexey Brodkin : "r8"); 136*288aaacfSAlexey Brodkin return bytelen; 137*288aaacfSAlexey Brodkin } 138*288aaacfSAlexey Brodkin 139*288aaacfSAlexey Brodkin static inline int __raw_writesw(unsigned int addr, void *data, int wordlen) 140*288aaacfSAlexey Brodkin { 141*288aaacfSAlexey Brodkin __asm__ __volatile__ ("1:ldw.ab r8, [r1, 2]\n" 142*288aaacfSAlexey Brodkin "sub.f r2, r2, 1\n" 143*288aaacfSAlexey Brodkin "bnz.d 1b\n" 144*288aaacfSAlexey Brodkin "st.ab.di r8, [r0, 0]\n" 145*288aaacfSAlexey Brodkin : 146*288aaacfSAlexey Brodkin : "r" (addr), "r" (data), "r" (wordlen) 147*288aaacfSAlexey Brodkin : "r8"); 148*288aaacfSAlexey Brodkin return wordlen; 149*288aaacfSAlexey Brodkin } 150*288aaacfSAlexey Brodkin 151*288aaacfSAlexey Brodkin static inline int __raw_writesl(unsigned int addr, void *data, int longlen) 152*288aaacfSAlexey Brodkin { 153*288aaacfSAlexey Brodkin __asm__ __volatile__ ("1:ld.ab r8, [r1, 4]\n" 154*288aaacfSAlexey Brodkin "sub.f r2, r2, 1\n" 155*288aaacfSAlexey Brodkin "bnz.d 1b\n" 156*288aaacfSAlexey Brodkin "st.ab.di r8, [r0, 0]\n" 157*288aaacfSAlexey Brodkin : 158*288aaacfSAlexey Brodkin : "r" (addr), "r" (data), "r" (longlen) 159*288aaacfSAlexey Brodkin : "r8"); 160*288aaacfSAlexey Brodkin return longlen; 161*288aaacfSAlexey Brodkin } 162*288aaacfSAlexey Brodkin 163*288aaacfSAlexey Brodkin #define out_arch(type, endian, a, v) __raw_write##type(cpu_to_##endian(v), a) 164*288aaacfSAlexey Brodkin #define in_arch(type, endian, a) endian##_to_cpu(__raw_read##type(a)) 165*288aaacfSAlexey Brodkin 166*288aaacfSAlexey Brodkin #define out_le32(a, v) out_arch(l, le32, a, v) 167*288aaacfSAlexey Brodkin #define out_le16(a, v) out_arch(w, le16, a, v) 168*288aaacfSAlexey Brodkin 169*288aaacfSAlexey Brodkin #define in_le32(a) in_arch(l, le32, a) 170*288aaacfSAlexey Brodkin #define in_le16(a) in_arch(w, le16, a) 171*288aaacfSAlexey Brodkin 172*288aaacfSAlexey Brodkin #define out_be32(a, v) out_arch(l, be32, a, v) 173*288aaacfSAlexey Brodkin #define out_be16(a, v) out_arch(w, be16, a, v) 174*288aaacfSAlexey Brodkin 175*288aaacfSAlexey Brodkin #define in_be32(a) in_arch(l, be32, a) 176*288aaacfSAlexey Brodkin #define in_be16(a) in_arch(w, be16, a) 177*288aaacfSAlexey Brodkin 178*288aaacfSAlexey Brodkin #define out_8(a, v) __raw_writeb(v, a) 179*288aaacfSAlexey Brodkin #define in_8(a) __raw_readb(a) 180*288aaacfSAlexey Brodkin 181*288aaacfSAlexey Brodkin /* 182*288aaacfSAlexey Brodkin * Clear and set bits in one shot. These macros can be used to clear and 183*288aaacfSAlexey Brodkin * set multiple bits in a register using a single call. These macros can 184*288aaacfSAlexey Brodkin * also be used to set a multiple-bit bit pattern using a mask, by 185*288aaacfSAlexey Brodkin * specifying the mask in the 'clear' parameter and the new bit pattern 186*288aaacfSAlexey Brodkin * in the 'set' parameter. 187*288aaacfSAlexey Brodkin */ 188*288aaacfSAlexey Brodkin 189*288aaacfSAlexey Brodkin #define clrbits(type, addr, clear) \ 190*288aaacfSAlexey Brodkin out_##type((addr), in_##type(addr) & ~(clear)) 191*288aaacfSAlexey Brodkin 192*288aaacfSAlexey Brodkin #define setbits(type, addr, set) \ 193*288aaacfSAlexey Brodkin out_##type((addr), in_##type(addr) | (set)) 194*288aaacfSAlexey Brodkin 195*288aaacfSAlexey Brodkin #define clrsetbits(type, addr, clear, set) \ 196*288aaacfSAlexey Brodkin out_##type((addr), (in_##type(addr) & ~(clear)) | (set)) 197*288aaacfSAlexey Brodkin 198*288aaacfSAlexey Brodkin #define clrbits_be32(addr, clear) clrbits(be32, addr, clear) 199*288aaacfSAlexey Brodkin #define setbits_be32(addr, set) setbits(be32, addr, set) 200*288aaacfSAlexey Brodkin #define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set) 201*288aaacfSAlexey Brodkin 202*288aaacfSAlexey Brodkin #define clrbits_le32(addr, clear) clrbits(le32, addr, clear) 203*288aaacfSAlexey Brodkin #define setbits_le32(addr, set) setbits(le32, addr, set) 204*288aaacfSAlexey Brodkin #define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set) 205*288aaacfSAlexey Brodkin 206*288aaacfSAlexey Brodkin #define clrbits_be16(addr, clear) clrbits(be16, addr, clear) 207*288aaacfSAlexey Brodkin #define setbits_be16(addr, set) setbits(be16, addr, set) 208*288aaacfSAlexey Brodkin #define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set) 209*288aaacfSAlexey Brodkin 210*288aaacfSAlexey Brodkin #define clrbits_le16(addr, clear) clrbits(le16, addr, clear) 211*288aaacfSAlexey Brodkin #define setbits_le16(addr, set) setbits(le16, addr, set) 212*288aaacfSAlexey Brodkin #define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set) 213*288aaacfSAlexey Brodkin 214*288aaacfSAlexey Brodkin #define clrbits_8(addr, clear) clrbits(8, addr, clear) 215*288aaacfSAlexey Brodkin #define setbits_8(addr, set) setbits(8, addr, set) 216*288aaacfSAlexey Brodkin #define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set) 217*288aaacfSAlexey Brodkin 218*288aaacfSAlexey Brodkin #endif /* __ASM_ARC_IO_H */ 219