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

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.39 347 lines 8.1 kB view raw
1/* 2 * linux/include/asm-m68k/raw_io.h 3 * 4 * 10/20/00 RZ: - created from bits of io.h and ide.h to cleanup namespace 5 * 6 */ 7 8#ifndef _RAW_IO_H 9#define _RAW_IO_H 10 11#ifdef __KERNEL__ 12 13#include <asm/types.h> 14 15 16/* Values for nocacheflag and cmode */ 17#define IOMAP_FULL_CACHING 0 18#define IOMAP_NOCACHE_SER 1 19#define IOMAP_NOCACHE_NONSER 2 20#define IOMAP_WRITETHROUGH 3 21 22extern void iounmap(void __iomem *addr); 23 24extern void __iomem *__ioremap(unsigned long physaddr, unsigned long size, 25 int cacheflag); 26extern void __iounmap(void *addr, unsigned long size); 27 28 29/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates 30 * two accesses to memory, which may be undesirable for some devices. 31 */ 32#define in_8(addr) \ 33 ({ u8 __v = (*(__force volatile u8 *) (addr)); __v; }) 34#define in_be16(addr) \ 35 ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; }) 36#define in_be32(addr) \ 37 ({ u32 __v = (*(__force volatile u32 *) (addr)); __v; }) 38#define in_le16(addr) \ 39 ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (addr)); __v; }) 40#define in_le32(addr) \ 41 ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (addr)); __v; }) 42 43#define out_8(addr,b) (void)((*(__force volatile u8 *) (addr)) = (b)) 44#define out_be16(addr,w) (void)((*(__force volatile u16 *) (addr)) = (w)) 45#define out_be32(addr,l) (void)((*(__force volatile u32 *) (addr)) = (l)) 46#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w)) 47#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l)) 48 49#define raw_inb in_8 50#define raw_inw in_be16 51#define raw_inl in_be32 52#define __raw_readb in_8 53#define __raw_readw in_be16 54#define __raw_readl in_be32 55 56#define raw_outb(val,port) out_8((port),(val)) 57#define raw_outw(val,port) out_be16((port),(val)) 58#define raw_outl(val,port) out_be32((port),(val)) 59#define __raw_writeb(val,addr) out_8((addr),(val)) 60#define __raw_writew(val,addr) out_be16((addr),(val)) 61#define __raw_writel(val,addr) out_be32((addr),(val)) 62 63static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len) 64{ 65 unsigned int i; 66 67 for (i = 0; i < len; i++) 68 *buf++ = in_8(port); 69} 70 71static inline void raw_outsb(volatile u8 __iomem *port, const u8 *buf, 72 unsigned int len) 73{ 74 unsigned int i; 75 76 for (i = 0; i < len; i++) 77 out_8(port, *buf++); 78} 79 80static inline void raw_insw(volatile u16 __iomem *port, u16 *buf, unsigned int nr) 81{ 82 unsigned int tmp; 83 84 if (nr & 15) { 85 tmp = (nr & 15) - 1; 86 asm volatile ( 87 "1: movew %2@,%0@+; dbra %1,1b" 88 : "=a" (buf), "=d" (tmp) 89 : "a" (port), "0" (buf), 90 "1" (tmp)); 91 } 92 if (nr >> 4) { 93 tmp = (nr >> 4) - 1; 94 asm volatile ( 95 "1: " 96 "movew %2@,%0@+; " 97 "movew %2@,%0@+; " 98 "movew %2@,%0@+; " 99 "movew %2@,%0@+; " 100 "movew %2@,%0@+; " 101 "movew %2@,%0@+; " 102 "movew %2@,%0@+; " 103 "movew %2@,%0@+; " 104 "movew %2@,%0@+; " 105 "movew %2@,%0@+; " 106 "movew %2@,%0@+; " 107 "movew %2@,%0@+; " 108 "movew %2@,%0@+; " 109 "movew %2@,%0@+; " 110 "movew %2@,%0@+; " 111 "movew %2@,%0@+; " 112 "dbra %1,1b" 113 : "=a" (buf), "=d" (tmp) 114 : "a" (port), "0" (buf), 115 "1" (tmp)); 116 } 117} 118 119static inline void raw_outsw(volatile u16 __iomem *port, const u16 *buf, 120 unsigned int nr) 121{ 122 unsigned int tmp; 123 124 if (nr & 15) { 125 tmp = (nr & 15) - 1; 126 asm volatile ( 127 "1: movew %0@+,%2@; dbra %1,1b" 128 : "=a" (buf), "=d" (tmp) 129 : "a" (port), "0" (buf), 130 "1" (tmp)); 131 } 132 if (nr >> 4) { 133 tmp = (nr >> 4) - 1; 134 asm volatile ( 135 "1: " 136 "movew %0@+,%2@; " 137 "movew %0@+,%2@; " 138 "movew %0@+,%2@; " 139 "movew %0@+,%2@; " 140 "movew %0@+,%2@; " 141 "movew %0@+,%2@; " 142 "movew %0@+,%2@; " 143 "movew %0@+,%2@; " 144 "movew %0@+,%2@; " 145 "movew %0@+,%2@; " 146 "movew %0@+,%2@; " 147 "movew %0@+,%2@; " 148 "movew %0@+,%2@; " 149 "movew %0@+,%2@; " 150 "movew %0@+,%2@; " 151 "movew %0@+,%2@; " 152 "dbra %1,1b" 153 : "=a" (buf), "=d" (tmp) 154 : "a" (port), "0" (buf), 155 "1" (tmp)); 156 } 157} 158 159static inline void raw_insl(volatile u32 __iomem *port, u32 *buf, unsigned int nr) 160{ 161 unsigned int tmp; 162 163 if (nr & 15) { 164 tmp = (nr & 15) - 1; 165 asm volatile ( 166 "1: movel %2@,%0@+; dbra %1,1b" 167 : "=a" (buf), "=d" (tmp) 168 : "a" (port), "0" (buf), 169 "1" (tmp)); 170 } 171 if (nr >> 4) { 172 tmp = (nr >> 4) - 1; 173 asm volatile ( 174 "1: " 175 "movel %2@,%0@+; " 176 "movel %2@,%0@+; " 177 "movel %2@,%0@+; " 178 "movel %2@,%0@+; " 179 "movel %2@,%0@+; " 180 "movel %2@,%0@+; " 181 "movel %2@,%0@+; " 182 "movel %2@,%0@+; " 183 "movel %2@,%0@+; " 184 "movel %2@,%0@+; " 185 "movel %2@,%0@+; " 186 "movel %2@,%0@+; " 187 "movel %2@,%0@+; " 188 "movel %2@,%0@+; " 189 "movel %2@,%0@+; " 190 "movel %2@,%0@+; " 191 "dbra %1,1b" 192 : "=a" (buf), "=d" (tmp) 193 : "a" (port), "0" (buf), 194 "1" (tmp)); 195 } 196} 197 198static inline void raw_outsl(volatile u32 __iomem *port, const u32 *buf, 199 unsigned int nr) 200{ 201 unsigned int tmp; 202 203 if (nr & 15) { 204 tmp = (nr & 15) - 1; 205 asm volatile ( 206 "1: movel %0@+,%2@; dbra %1,1b" 207 : "=a" (buf), "=d" (tmp) 208 : "a" (port), "0" (buf), 209 "1" (tmp)); 210 } 211 if (nr >> 4) { 212 tmp = (nr >> 4) - 1; 213 asm volatile ( 214 "1: " 215 "movel %0@+,%2@; " 216 "movel %0@+,%2@; " 217 "movel %0@+,%2@; " 218 "movel %0@+,%2@; " 219 "movel %0@+,%2@; " 220 "movel %0@+,%2@; " 221 "movel %0@+,%2@; " 222 "movel %0@+,%2@; " 223 "movel %0@+,%2@; " 224 "movel %0@+,%2@; " 225 "movel %0@+,%2@; " 226 "movel %0@+,%2@; " 227 "movel %0@+,%2@; " 228 "movel %0@+,%2@; " 229 "movel %0@+,%2@; " 230 "movel %0@+,%2@; " 231 "dbra %1,1b" 232 : "=a" (buf), "=d" (tmp) 233 : "a" (port), "0" (buf), 234 "1" (tmp)); 235 } 236} 237 238 239static inline void raw_insw_swapw(volatile u16 __iomem *port, u16 *buf, 240 unsigned int nr) 241{ 242 if ((nr) % 8) 243 __asm__ __volatile__ 244 ("\tmovel %0,%/a0\n\t" 245 "movel %1,%/a1\n\t" 246 "movel %2,%/d6\n\t" 247 "subql #1,%/d6\n" 248 "1:\tmovew %/a0@,%/d0\n\t" 249 "rolw #8,%/d0\n\t" 250 "movew %/d0,%/a1@+\n\t" 251 "dbra %/d6,1b" 252 : 253 : "g" (port), "g" (buf), "g" (nr) 254 : "d0", "a0", "a1", "d6"); 255 else 256 __asm__ __volatile__ 257 ("movel %0,%/a0\n\t" 258 "movel %1,%/a1\n\t" 259 "movel %2,%/d6\n\t" 260 "lsrl #3,%/d6\n\t" 261 "subql #1,%/d6\n" 262 "1:\tmovew %/a0@,%/d0\n\t" 263 "rolw #8,%/d0\n\t" 264 "movew %/d0,%/a1@+\n\t" 265 "movew %/a0@,%/d0\n\t" 266 "rolw #8,%/d0\n\t" 267 "movew %/d0,%/a1@+\n\t" 268 "movew %/a0@,%/d0\n\t" 269 "rolw #8,%/d0\n\t" 270 "movew %/d0,%/a1@+\n\t" 271 "movew %/a0@,%/d0\n\t" 272 "rolw #8,%/d0\n\t" 273 "movew %/d0,%/a1@+\n\t" 274 "movew %/a0@,%/d0\n\t" 275 "rolw #8,%/d0\n\t" 276 "movew %/d0,%/a1@+\n\t" 277 "movew %/a0@,%/d0\n\t" 278 "rolw #8,%/d0\n\t" 279 "movew %/d0,%/a1@+\n\t" 280 "movew %/a0@,%/d0\n\t" 281 "rolw #8,%/d0\n\t" 282 "movew %/d0,%/a1@+\n\t" 283 "movew %/a0@,%/d0\n\t" 284 "rolw #8,%/d0\n\t" 285 "movew %/d0,%/a1@+\n\t" 286 "dbra %/d6,1b" 287 : 288 : "g" (port), "g" (buf), "g" (nr) 289 : "d0", "a0", "a1", "d6"); 290} 291 292static inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf, 293 unsigned int nr) 294{ 295 if ((nr) % 8) 296 __asm__ __volatile__ 297 ("movel %0,%/a0\n\t" 298 "movel %1,%/a1\n\t" 299 "movel %2,%/d6\n\t" 300 "subql #1,%/d6\n" 301 "1:\tmovew %/a1@+,%/d0\n\t" 302 "rolw #8,%/d0\n\t" 303 "movew %/d0,%/a0@\n\t" 304 "dbra %/d6,1b" 305 : 306 : "g" (port), "g" (buf), "g" (nr) 307 : "d0", "a0", "a1", "d6"); 308 else 309 __asm__ __volatile__ 310 ("movel %0,%/a0\n\t" 311 "movel %1,%/a1\n\t" 312 "movel %2,%/d6\n\t" 313 "lsrl #3,%/d6\n\t" 314 "subql #1,%/d6\n" 315 "1:\tmovew %/a1@+,%/d0\n\t" 316 "rolw #8,%/d0\n\t" 317 "movew %/d0,%/a0@\n\t" 318 "movew %/a1@+,%/d0\n\t" 319 "rolw #8,%/d0\n\t" 320 "movew %/d0,%/a0@\n\t" 321 "movew %/a1@+,%/d0\n\t" 322 "rolw #8,%/d0\n\t" 323 "movew %/d0,%/a0@\n\t" 324 "movew %/a1@+,%/d0\n\t" 325 "rolw #8,%/d0\n\t" 326 "movew %/d0,%/a0@\n\t" 327 "movew %/a1@+,%/d0\n\t" 328 "rolw #8,%/d0\n\t" 329 "movew %/d0,%/a0@\n\t" 330 "movew %/a1@+,%/d0\n\t" 331 "rolw #8,%/d0\n\t" 332 "movew %/d0,%/a0@\n\t" 333 "movew %/a1@+,%/d0\n\t" 334 "rolw #8,%/d0\n\t" 335 "movew %/d0,%/a0@\n\t" 336 "movew %/a1@+,%/d0\n\t" 337 "rolw #8,%/d0\n\t" 338 "movew %/d0,%/a0@\n\t" 339 "dbra %/d6,1b" 340 : 341 : "g" (port), "g" (buf), "g" (nr) 342 : "d0", "a0", "a1", "d6"); 343} 344 345#endif /* __KERNEL__ */ 346 347#endif /* _RAW_IO_H */