diff options
Diffstat (limited to 'arch/sh/include/asm/io.h')
-rw-r--r-- | arch/sh/include/asm/io.h | 169 |
1 files changed, 132 insertions, 37 deletions
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 026dd659a640..7dab7b23a5ec 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
@@ -22,6 +22,7 @@ | |||
22 | * for old compat code for I/O offseting to SuperIOs, all of which are | 22 | * for old compat code for I/O offseting to SuperIOs, all of which are |
23 | * better handled through the machvec ioport mapping routines these days. | 23 | * better handled through the machvec ioport mapping routines these days. |
24 | */ | 24 | */ |
25 | #include <linux/errno.h> | ||
25 | #include <asm/cache.h> | 26 | #include <asm/cache.h> |
26 | #include <asm/system.h> | 27 | #include <asm/system.h> |
27 | #include <asm/addrspace.h> | 28 | #include <asm/addrspace.h> |
@@ -79,16 +80,51 @@ | |||
79 | #define writel(v,a) ({ __raw_writel((v),(a)); mb(); }) | 80 | #define writel(v,a) ({ __raw_writel((v),(a)); mb(); }) |
80 | #define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); }) | 81 | #define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); }) |
81 | 82 | ||
82 | /* SuperH on-chip I/O functions */ | 83 | /* |
83 | #define ctrl_inb __raw_readb | 84 | * Legacy SuperH on-chip I/O functions |
84 | #define ctrl_inw __raw_readw | 85 | * |
85 | #define ctrl_inl __raw_readl | 86 | * These are all deprecated, all new (and especially cross-platform) code |
86 | #define ctrl_inq __raw_readq | 87 | * should be using the __raw_xxx() routines directly. |
88 | */ | ||
89 | static inline u8 __deprecated ctrl_inb(unsigned long addr) | ||
90 | { | ||
91 | return __raw_readb(addr); | ||
92 | } | ||
93 | |||
94 | static inline u16 __deprecated ctrl_inw(unsigned long addr) | ||
95 | { | ||
96 | return __raw_readw(addr); | ||
97 | } | ||
98 | |||
99 | static inline u32 __deprecated ctrl_inl(unsigned long addr) | ||
100 | { | ||
101 | return __raw_readl(addr); | ||
102 | } | ||
103 | |||
104 | static inline u64 __deprecated ctrl_inq(unsigned long addr) | ||
105 | { | ||
106 | return __raw_readq(addr); | ||
107 | } | ||
108 | |||
109 | static inline void __deprecated ctrl_outb(u8 v, unsigned long addr) | ||
110 | { | ||
111 | __raw_writeb(v, addr); | ||
112 | } | ||
113 | |||
114 | static inline void __deprecated ctrl_outw(u16 v, unsigned long addr) | ||
115 | { | ||
116 | __raw_writew(v, addr); | ||
117 | } | ||
87 | 118 | ||
88 | #define ctrl_outb __raw_writeb | 119 | static inline void __deprecated ctrl_outl(u32 v, unsigned long addr) |
89 | #define ctrl_outw __raw_writew | 120 | { |
90 | #define ctrl_outl __raw_writel | 121 | __raw_writel(v, addr); |
91 | #define ctrl_outq __raw_writeq | 122 | } |
123 | |||
124 | static inline void __deprecated ctrl_outq(u64 v, unsigned long addr) | ||
125 | { | ||
126 | __raw_writeq(v, addr); | ||
127 | } | ||
92 | 128 | ||
93 | extern unsigned long generic_io_base; | 129 | extern unsigned long generic_io_base; |
94 | 130 | ||
@@ -97,6 +133,28 @@ static inline void ctrl_delay(void) | |||
97 | __raw_readw(generic_io_base); | 133 | __raw_readw(generic_io_base); |
98 | } | 134 | } |
99 | 135 | ||
136 | #define __BUILD_UNCACHED_IO(bwlq, type) \ | ||
137 | static inline type read##bwlq##_uncached(unsigned long addr) \ | ||
138 | { \ | ||
139 | type ret; \ | ||
140 | jump_to_uncached(); \ | ||
141 | ret = __raw_read##bwlq(addr); \ | ||
142 | back_to_cached(); \ | ||
143 | return ret; \ | ||
144 | } \ | ||
145 | \ | ||
146 | static inline void write##bwlq##_uncached(type v, unsigned long addr) \ | ||
147 | { \ | ||
148 | jump_to_uncached(); \ | ||
149 | __raw_write##bwlq(v, addr); \ | ||
150 | back_to_cached(); \ | ||
151 | } | ||
152 | |||
153 | __BUILD_UNCACHED_IO(b, u8) | ||
154 | __BUILD_UNCACHED_IO(w, u16) | ||
155 | __BUILD_UNCACHED_IO(l, u32) | ||
156 | __BUILD_UNCACHED_IO(q, u64) | ||
157 | |||
100 | #define __BUILD_MEMORY_STRING(bwlq, type) \ | 158 | #define __BUILD_MEMORY_STRING(bwlq, type) \ |
101 | \ | 159 | \ |
102 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ | 160 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ |
@@ -234,28 +292,21 @@ unsigned long long poke_real_address_q(unsigned long long addr, | |||
234 | */ | 292 | */ |
235 | #ifdef CONFIG_MMU | 293 | #ifdef CONFIG_MMU |
236 | void __iomem *__ioremap_caller(unsigned long offset, unsigned long size, | 294 | void __iomem *__ioremap_caller(unsigned long offset, unsigned long size, |
237 | unsigned long flags, void *caller); | 295 | pgprot_t prot, void *caller); |
238 | void __iounmap(void __iomem *addr); | 296 | void __iounmap(void __iomem *addr); |
239 | 297 | ||
240 | static inline void __iomem * | 298 | static inline void __iomem * |
241 | __ioremap(unsigned long offset, unsigned long size, unsigned long flags) | 299 | __ioremap(unsigned long offset, unsigned long size, pgprot_t prot) |
242 | { | 300 | { |
243 | return __ioremap_caller(offset, size, flags, __builtin_return_address(0)); | 301 | return __ioremap_caller(offset, size, prot, __builtin_return_address(0)); |
244 | } | 302 | } |
245 | 303 | ||
246 | static inline void __iomem * | 304 | static inline void __iomem * |
247 | __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | 305 | __ioremap_29bit(unsigned long offset, unsigned long size, pgprot_t prot) |
248 | { | 306 | { |
249 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) && !defined(CONFIG_PMB) | 307 | #ifdef CONFIG_29BIT |
250 | unsigned long last_addr = offset + size - 1; | 308 | unsigned long last_addr = offset + size - 1; |
251 | #endif | ||
252 | void __iomem *ret; | ||
253 | 309 | ||
254 | ret = __ioremap_trapped(offset, size); | ||
255 | if (ret) | ||
256 | return ret; | ||
257 | |||
258 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) && !defined(CONFIG_PMB) | ||
259 | /* | 310 | /* |
260 | * For P1 and P2 space this is trivial, as everything is already | 311 | * For P1 and P2 space this is trivial, as everything is already |
261 | * mapped. Uncached access for P1 addresses are done through P2. | 312 | * mapped. Uncached access for P1 addresses are done through P2. |
@@ -263,7 +314,7 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
263 | * mapping must be done by the PMB or by using page tables. | 314 | * mapping must be done by the PMB or by using page tables. |
264 | */ | 315 | */ |
265 | if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { | 316 | if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { |
266 | if (unlikely(flags & _PAGE_CACHABLE)) | 317 | if (unlikely(pgprot_val(prot) & _PAGE_CACHABLE)) |
267 | return (void __iomem *)P1SEGADDR(offset); | 318 | return (void __iomem *)P1SEGADDR(offset); |
268 | 319 | ||
269 | return (void __iomem *)P2SEGADDR(offset); | 320 | return (void __iomem *)P2SEGADDR(offset); |
@@ -274,26 +325,70 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
274 | return (void __iomem *)P4SEGADDR(offset); | 325 | return (void __iomem *)P4SEGADDR(offset); |
275 | #endif | 326 | #endif |
276 | 327 | ||
277 | return __ioremap(offset, size, flags); | 328 | return NULL; |
329 | } | ||
330 | |||
331 | static inline void __iomem * | ||
332 | __ioremap_mode(unsigned long offset, unsigned long size, pgprot_t prot) | ||
333 | { | ||
334 | void __iomem *ret; | ||
335 | |||
336 | ret = __ioremap_trapped(offset, size); | ||
337 | if (ret) | ||
338 | return ret; | ||
339 | |||
340 | ret = __ioremap_29bit(offset, size, prot); | ||
341 | if (ret) | ||
342 | return ret; | ||
343 | |||
344 | return __ioremap(offset, size, prot); | ||
278 | } | 345 | } |
279 | #else | 346 | #else |
280 | #define __ioremap(offset, size, flags) ((void __iomem *)(offset)) | 347 | #define __ioremap(offset, size, prot) ((void __iomem *)(offset)) |
281 | #define __ioremap_mode(offset, size, flags) ((void __iomem *)(offset)) | 348 | #define __ioremap_mode(offset, size, prot) ((void __iomem *)(offset)) |
282 | #define __iounmap(addr) do { } while (0) | 349 | #define __iounmap(addr) do { } while (0) |
283 | #endif /* CONFIG_MMU */ | 350 | #endif /* CONFIG_MMU */ |
284 | 351 | ||
285 | #define ioremap(offset, size) \ | 352 | static inline void __iomem * |
286 | __ioremap_mode((offset), (size), 0) | 353 | ioremap(unsigned long offset, unsigned long size) |
287 | #define ioremap_nocache(offset, size) \ | 354 | { |
288 | __ioremap_mode((offset), (size), 0) | 355 | return __ioremap_mode(offset, size, PAGE_KERNEL_NOCACHE); |
289 | #define ioremap_cache(offset, size) \ | 356 | } |
290 | __ioremap_mode((offset), (size), _PAGE_CACHABLE) | 357 | |
291 | #define p3_ioremap(offset, size, flags) \ | 358 | static inline void __iomem * |
292 | __ioremap((offset), (size), (flags)) | 359 | ioremap_cache(unsigned long offset, unsigned long size) |
293 | #define ioremap_prot(offset, size, flags) \ | 360 | { |
294 | __ioremap_mode((offset), (size), (flags)) | 361 | return __ioremap_mode(offset, size, PAGE_KERNEL); |
295 | #define iounmap(addr) \ | 362 | } |
296 | __iounmap((addr)) | 363 | |
364 | #ifdef CONFIG_HAVE_IOREMAP_PROT | ||
365 | static inline void __iomem * | ||
366 | ioremap_prot(resource_size_t offset, unsigned long size, unsigned long flags) | ||
367 | { | ||
368 | return __ioremap_mode(offset, size, __pgprot(flags)); | ||
369 | } | ||
370 | #endif | ||
371 | |||
372 | #ifdef CONFIG_IOREMAP_FIXED | ||
373 | extern void __iomem *ioremap_fixed(resource_size_t, unsigned long, | ||
374 | unsigned long, pgprot_t); | ||
375 | extern int iounmap_fixed(void __iomem *); | ||
376 | extern void ioremap_fixed_init(void); | ||
377 | #else | ||
378 | static inline void __iomem * | ||
379 | ioremap_fixed(resource_size_t phys_addr, unsigned long offset, | ||
380 | unsigned long size, pgprot_t prot) | ||
381 | { | ||
382 | BUG(); | ||
383 | return NULL; | ||
384 | } | ||
385 | |||
386 | static inline void ioremap_fixed_init(void) { } | ||
387 | static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; } | ||
388 | #endif | ||
389 | |||
390 | #define ioremap_nocache ioremap | ||
391 | #define iounmap __iounmap | ||
297 | 392 | ||
298 | #define maybebadio(port) \ | 393 | #define maybebadio(port) \ |
299 | printk(KERN_ERR "bad PC-like io %s:%u for port 0x%lx at 0x%08x\n", \ | 394 | printk(KERN_ERR "bad PC-like io %s:%u for port 0x%lx at 0x%08x\n", \ |