15f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#ifndef __ASM_AVR32_IO_H 25f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define __ASM_AVR32_IO_H 35f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 4187f1882b5b0748b3c4c22274663fdb372ac0452Paul Gortmaker#include <linux/bug.h> 5e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#include <linux/kernel.h> 65f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/string.h> 7e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#include <linux/types.h> 85f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 95f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/addrspace.h> 105f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/byteorder.h> 115f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 123663b736a5083b3bce74520b637f630f01f66a7fHaavard Skinnemoen#include <mach/io.h> 13e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* virt_to_phys will only work when address is in P1 or P2 */ 155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic __inline__ unsigned long virt_to_phys(volatile void *address) 165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen return PHYSADDR(address); 185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic __inline__ void * phys_to_virt(unsigned long address) 215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen return (void *)P1SEGADDR(address); 235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define cached_to_phys(addr) ((unsigned long)PHYSADDR(addr)) 265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define uncached_to_phys(addr) ((unsigned long)PHYSADDR(addr)) 275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define phys_to_cached(addr) ((void *)P1SEGADDR(addr)) 285f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define phys_to_uncached(addr) ((void *)P2SEGADDR(addr)) 295f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 305f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* 315f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Generic IO read/write. These perform native-endian accesses. Note 325f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * that some architectures will want to re-define __raw_{read,write}w. 335f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 34b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_writesb(void __iomem *addr, const void *data, int bytelen); 35b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_writesw(void __iomem *addr, const void *data, int wordlen); 36b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_writesl(void __iomem *addr, const void *data, int longlen); 375f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 38b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_readsb(const void __iomem *addr, void *data, int bytelen); 39b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_readsw(const void __iomem *addr, void *data, int wordlen); 40b60f16eb56ff872a86c55c11bcfd430ce8cec340Haavard Skinnemoenextern void __raw_readsl(const void __iomem *addr, void *data, int longlen); 415f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 42e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void __raw_writeb(u8 v, volatile void __iomem *addr) 435f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 44e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *(volatile u8 __force *)addr = v; 455f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 46e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void __raw_writew(u16 v, volatile void __iomem *addr) 475f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 48e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *(volatile u16 __force *)addr = v; 495f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 50e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void __raw_writel(u32 v, volatile void __iomem *addr) 515f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 52e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *(volatile u32 __force *)addr = v; 535f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 55e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline u8 __raw_readb(const volatile void __iomem *addr) 565f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 57e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen return *(const volatile u8 __force *)addr; 585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 59e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline u16 __raw_readw(const volatile void __iomem *addr) 605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 61e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen return *(const volatile u16 __force *)addr; 625f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 63e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline u32 __raw_readl(const volatile void __iomem *addr) 645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 65e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen return *(const volatile u32 __force *)addr; 66e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} 67e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 68e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen/* Convert I/O port address to virtual address */ 69e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#ifndef __io 70e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen# define __io(p) ((void *)phys_to_uncached(p)) 71e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#endif 72e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 73e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen/* 74e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen * Not really sure about the best way to slow down I/O on 75e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen * AVR32. Defining it as a no-op until we have an actual test case. 76e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen */ 77e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define SLOW_DOWN_IO do { } while (0) 78e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 79e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_MEMORY_SINGLE(pfx, bwl, type) \ 80e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void \ 81e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenpfx##write##bwl(type val, volatile void __iomem *addr) \ 82e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 83e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen volatile type *__addr; \ 84e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen type __val; \ 85e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 86e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __addr = (void *)__swizzle_addr_##bwl((unsigned long)(addr)); \ 87e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __val = pfx##ioswab##bwl(__addr, val); \ 88e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 89e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long)); \ 90e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 91e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *__addr = __val; \ 92e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} \ 93e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 94e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline type pfx##read##bwl(const volatile void __iomem *addr) \ 95e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 96e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen volatile type *__addr; \ 97e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen type __val; \ 98e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 99e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __addr = (void *)__swizzle_addr_##bwl((unsigned long)(addr)); \ 100e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 101e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long)); \ 102e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 103e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __val = *__addr; \ 104e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen return pfx##ioswab##bwl(__addr, __val); \ 105e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} 106e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 107e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_IOPORT_SINGLE(pfx, bwl, type, p, slow) \ 108e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void pfx##out##bwl##p(type val, unsigned long port) \ 109e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 110e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen volatile type *__addr; \ 111e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen type __val; \ 112e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 113e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __addr = __io(__swizzle_addr_##bwl(port)); \ 114e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __val = pfx##ioswab##bwl(__addr, val); \ 115e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 116e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long)); \ 117e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 118e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *__addr = __val; \ 119e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen slow; \ 120e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} \ 121e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 122e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline type pfx##in##bwl##p(unsigned long port) \ 123e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 124e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen volatile type *__addr; \ 125e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen type __val; \ 126e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 127e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __addr = __io(__swizzle_addr_##bwl(port)); \ 128e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 129e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long)); \ 130e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 131e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __val = *__addr; \ 132e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen slow; \ 133e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 134e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen return pfx##ioswab##bwl(__addr, __val); \ 1355f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 1365f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 137e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_MEMORY_PFX(bus, bwl, type) \ 138e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_MEMORY_SINGLE(bus, bwl, type) 139e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 140e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define BUILDIO_MEM(bwl, type) \ 141e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_MEMORY_PFX(, bwl, type) \ 142e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_MEMORY_PFX(__mem_, bwl, type) 143e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 144e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_IOPORT_PFX(bus, bwl, type) \ 145e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_IOPORT_SINGLE(bus, bwl, type, ,) \ 146e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_IOPORT_SINGLE(bus, bwl, type, _p, SLOW_DOWN_IO) 147e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 148e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define BUILDIO_IOPORT(bwl, type) \ 149e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_IOPORT_PFX(, bwl, type) \ 150e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_IOPORT_PFX(__mem_, bwl, type) 151e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 152e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_MEM(b, u8) 153e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_MEM(w, u16) 154e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_MEM(l, u32) 155e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 156e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_IOPORT(b, u8) 157e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_IOPORT(w, u16) 158e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDIO_IOPORT(l, u32) 159e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 160e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define readb_relaxed readb 161e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define readw_relaxed readw 162e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define readl_relaxed readl 163e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 164520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define readb_be __raw_readb 165520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define readw_be __raw_readw 166520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define readl_be __raw_readl 167472d326677db37625903265428582694394d2df7Josh Wu 168472d326677db37625903265428582694394d2df7Josh Wu#define writeb_relaxed writeb 169472d326677db37625903265428582694394d2df7Josh Wu#define writew_relaxed writew 170472d326677db37625903265428582694394d2df7Josh Wu#define writel_relaxed writel 171520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen 172520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define writeb_be __raw_writeb 173520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define writew_be __raw_writew 174520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen#define writel_be __raw_writel 175520bab804e3fe4868890980a55fe785f1b8a55e5Haavard Skinnemoen 176e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_MEMORY_STRING(bwl, type) \ 177e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void writes##bwl(volatile void __iomem *addr, \ 178e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen const void *data, unsigned int count) \ 179e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 180e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen const type *__data = data; \ 181e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 182e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen while (count--) \ 183e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __mem_write##bwl(*__data++, addr); \ 184e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} \ 185e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 186e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void reads##bwl(const volatile void __iomem *addr, \ 187e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen void *data, unsigned int count) \ 188e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 189e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen type *__data = data; \ 190e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 191e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen while (count--) \ 192e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *__data++ = __mem_read##bwl(addr); \ 193e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} 194e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen 195e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define __BUILD_IOPORT_STRING(bwl, type) \ 196e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void outs##bwl(unsigned long port, const void *data, \ 197e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen unsigned int count) \ 198e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 199e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen const type *__data = data; \ 200e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 201e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen while (count--) \ 202e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __mem_out##bwl(*__data++, port); \ 203e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} \ 204e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 205e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoenstatic inline void ins##bwl(unsigned long port, void *data, \ 206e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen unsigned int count) \ 207e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen{ \ 208e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen type *__data = data; \ 209e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen \ 210e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen while (count--) \ 211e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen *__data++ = __mem_in##bwl(port); \ 212e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen} 2135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 214e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define BUILDSTRING(bwl, type) \ 215e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_MEMORY_STRING(bwl, type) \ 216e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen __BUILD_IOPORT_STRING(bwl, type) 2175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 218e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDSTRING(b, u8) 219e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDSTRING(w, u16) 220e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard SkinnemoenBUILDSTRING(l, u32) 221065834ab3988fece5608088e83724891c8190a2fBen Nizette 222065834ab3988fece5608088e83724891c8190a2fBen Nizette/* 223065834ab3988fece5608088e83724891c8190a2fBen Nizette * io{read,write}{8,16,32} macros in both le (for PCI style consumers) and native be 224065834ab3988fece5608088e83724891c8190a2fBen Nizette */ 225065834ab3988fece5608088e83724891c8190a2fBen Nizette#ifndef ioread8 226065834ab3988fece5608088e83724891c8190a2fBen Nizette 227e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread8(p) ((unsigned int)readb(p)) 228065834ab3988fece5608088e83724891c8190a2fBen Nizette 229e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread16(p) ((unsigned int)readw(p)) 230e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread16be(p) ((unsigned int)__raw_readw(p)) 231065834ab3988fece5608088e83724891c8190a2fBen Nizette 232e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread32(p) ((unsigned int)readl(p)) 233e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread32be(p) ((unsigned int)__raw_readl(p)) 234065834ab3988fece5608088e83724891c8190a2fBen Nizette 235e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite8(v,p) writeb(v, p) 236065834ab3988fece5608088e83724891c8190a2fBen Nizette 237e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite16(v,p) writew(v, p) 238e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite16be(v,p) __raw_writew(v, p) 239065834ab3988fece5608088e83724891c8190a2fBen Nizette 240e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite32(v,p) writel(v, p) 241e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite32be(v,p) __raw_writel(v, p) 242065834ab3988fece5608088e83724891c8190a2fBen Nizette 243e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread8_rep(p,d,c) readsb(p,d,c) 244e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread16_rep(p,d,c) readsw(p,d,c) 245e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define ioread32_rep(p,d,c) readsl(p,d,c) 246065834ab3988fece5608088e83724891c8190a2fBen Nizette 247e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite8_rep(p,s,c) writesb(p,s,c) 248e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite16_rep(p,s,c) writesw(p,s,c) 249e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define iowrite32_rep(p,s,c) writesl(p,s,c) 250065834ab3988fece5608088e83724891c8190a2fBen Nizette 251065834ab3988fece5608088e83724891c8190a2fBen Nizette#endif 252065834ab3988fece5608088e83724891c8190a2fBen Nizette 2535f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic inline void memcpy_fromio(void * to, const volatile void __iomem *from, 2545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen unsigned long count) 2555f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 2562c1a2a3441a754a9b5a8e7184071154f8a9bd61bHaavard Skinnemoen memcpy(to, (const void __force *)from, count); 2575f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 2585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 2595f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic inline void memcpy_toio(volatile void __iomem *to, const void * from, 2605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen unsigned long count) 2615f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 2622c1a2a3441a754a9b5a8e7184071154f8a9bd61bHaavard Skinnemoen memcpy((void __force *)to, from, count); 2635f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 2645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 2655f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic inline void memset_io(volatile void __iomem *addr, unsigned char val, 2665f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen unsigned long count) 2675f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{ 2682c1a2a3441a754a9b5a8e7184071154f8a9bd61bHaavard Skinnemoen memset((void __force *)addr, val, count); 2695f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen} 2705f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 271cca67164bbdb083df9adb6480822518b0f4b358fHaavard Skinnemoen#define mmiowb() 272cca67164bbdb083df9adb6480822518b0f4b358fHaavard Skinnemoen 273e3e7d8d4ea37b8372ee417452d03171c5dc55125Haavard Skinnemoen#define IO_SPACE_LIMIT 0xffffffff 2745f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 2755f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenextern void __iomem *__ioremap(unsigned long offset, size_t size, 2765f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen unsigned long flags); 2775f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenextern void __iounmap(void __iomem *addr); 2785f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 2795f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* 2805f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * ioremap - map bus memory into CPU space 2815f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * @offset bus address of the memory 2825f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * @size size of the resource to map 2835f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * 2845f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * ioremap performs a platform specific sequence of operations to make 2855f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * bus memory CPU accessible via the readb/.../writel functions and 2865f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * the other mmio helpers. The returned address is not guaranteed to 2875f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * be usable directly as a virtual address. 2885f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 2895f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define ioremap(offset, size) \ 2905f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen __ioremap((offset), (size), 0) 2915f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 2922201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen#define ioremap_nocache(offset, size) \ 2932201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen __ioremap((offset), (size), 0) 2942201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen 2955f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define iounmap(addr) \ 2965f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen __iounmap(addr) 2975f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 2981bbce4f3d11a6bfac0c51800f6337766f82b42daChen Gang#define ioremap_wc ioremap_nocache 2991bbce4f3d11a6bfac0c51800f6337766f82b42daChen Gang 3005f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define cached(addr) P1SEGADDR(addr) 3015f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define uncached(addr) P2SEGADDR(addr) 3025f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 3035f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define virt_to_bus virt_to_phys 3045f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define bus_to_virt phys_to_virt 3055f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define page_to_bus page_to_phys 3065f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define bus_to_page phys_to_page 3075f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 3082201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen/* 3092201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen * Create a virtual mapping cookie for an IO port range. There exists 3102201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen * no such thing as port-based I/O on AVR32, so a regular ioremap() 3112201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen * should do what we need. 3122201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen */ 3132201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen#define ioport_map(port, nr) ioremap(port, nr) 3142201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen#define ioport_unmap(port) iounmap(port) 3152201ec2b10910c869befb012ae75696a02091e7dHaavard Skinnemoen 3165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* 3175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Convert a physical pointer to a virtual kernel pointer for /dev/mem 3185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * access 3195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 3205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define xlate_dev_mem_ptr(p) __va(p) 3215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 3225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/* 3235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Convert a virtual cached pointer to an uncached pointer 3245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */ 3255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#define xlate_dev_kmem_ptr(p) p 3265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen 3275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#endif /* __ASM_AVR32_IO_H */ 328