linux/arch/avr32/include/asm/io.h
<<
>>
Prefs
   1#ifndef __ASM_AVR32_IO_H
   2#define __ASM_AVR32_IO_H
   3
   4#include <linux/kernel.h>
   5#include <linux/string.h>
   6#include <linux/types.h>
   7
   8#include <asm/addrspace.h>
   9#include <asm/byteorder.h>
  10
  11#include <mach/io.h>
  12
  13/* virt_to_phys will only work when address is in P1 or P2 */
  14static __inline__ unsigned long virt_to_phys(volatile void *address)
  15{
  16        return PHYSADDR(address);
  17}
  18
  19static __inline__ void * phys_to_virt(unsigned long address)
  20{
  21        return (void *)P1SEGADDR(address);
  22}
  23
  24#define cached_to_phys(addr)    ((unsigned long)PHYSADDR(addr))
  25#define uncached_to_phys(addr)  ((unsigned long)PHYSADDR(addr))
  26#define phys_to_cached(addr)    ((void *)P1SEGADDR(addr))
  27#define phys_to_uncached(addr)  ((void *)P2SEGADDR(addr))
  28
  29/*
  30 * Generic IO read/write.  These perform native-endian accesses.  Note
  31 * that some architectures will want to re-define __raw_{read,write}w.
  32 */
  33extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen);
  34extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
  35extern void __raw_writesl(void __iomem *addr, const void *data, int longlen);
  36
  37extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen);
  38extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
  39extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
  40
  41static inline void __raw_writeb(u8 v, volatile void __iomem *addr)
  42{
  43        *(volatile u8 __force *)addr = v;
  44}
  45static inline void __raw_writew(u16 v, volatile void __iomem *addr)
  46{
  47        *(volatile u16 __force *)addr = v;
  48}
  49static inline void __raw_writel(u32 v, volatile void __iomem *addr)
  50{
  51        *(volatile u32 __force *)addr = v;
  52}
  53
  54static inline u8 __raw_readb(const volatile void __iomem *addr)
  55{
  56        return *(const volatile u8 __force *)addr;
  57}
  58static inline u16 __raw_readw(const volatile void __iomem *addr)
  59{
  60        return *(const volatile u16 __force *)addr;
  61}
  62static inline u32 __raw_readl(const volatile void __iomem *addr)
  63{
  64        return *(const volatile u32 __force *)addr;
  65}
  66
  67/* Convert I/O port address to virtual address */
  68#ifndef __io
  69# define __io(p)        ((void *)phys_to_uncached(p))
  70#endif
  71
  72/*
  73 * Not really sure about the best way to slow down I/O on
  74 * AVR32. Defining it as a no-op until we have an actual test case.
  75 */
  76#define SLOW_DOWN_IO    do { } while (0)
  77
  78#define __BUILD_MEMORY_SINGLE(pfx, bwl, type)                           \
  79static inline void                                                      \
  80pfx##write##bwl(type val, volatile void __iomem *addr)                  \
  81{                                                                       \
  82        volatile type *__addr;                                          \
  83        type __val;                                                     \
  84                                                                        \
  85        __addr = (void *)__swizzle_addr_##bwl((unsigned long)(addr));   \
  86        __val = pfx##ioswab##bwl(__addr, val);                          \
  87                                                                        \
  88        BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));             \
  89                                                                        \
  90        *__addr = __val;                                                \
  91}                                                                       \
  92                                                                        \
  93static inline type pfx##read##bwl(const volatile void __iomem *addr)    \
  94{                                                                       \
  95        volatile type *__addr;                                          \
  96        type __val;                                                     \
  97                                                                        \
  98        __addr = (void *)__swizzle_addr_##bwl((unsigned long)(addr));   \
  99                                                                        \
 100        BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));             \
 101                                                                        \
 102        __val = *__addr;                                                \
 103        return pfx##ioswab##bwl(__addr, __val);                         \
 104}
 105
 106#define __BUILD_IOPORT_SINGLE(pfx, bwl, type, p, slow)                  \
 107static inline void pfx##out##bwl##p(type val, unsigned long port)       \
 108{                                                                       \
 109        volatile type *__addr;                                          \
 110        type __val;                                                     \
 111                                                                        \
 112        __addr = __io(__swizzle_addr_##bwl(port));                      \
 113        __val = pfx##ioswab##bwl(__addr, val);                          \
 114                                                                        \
 115        BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));             \
 116                                                                        \
 117        *__addr = __val;                                                \
 118        slow;                                                           \
 119}                                                                       \
 120                                                                        \
 121static inline type pfx##in##bwl##p(unsigned long port)                  \
 122{                                                                       \
 123        volatile type *__addr;                                          \
 124        type __val;                                                     \
 125                                                                        \
 126        __addr = __io(__swizzle_addr_##bwl(port));                      \
 127                                                                        \
 128        BUILD_BUG_ON(sizeof(type) > sizeof(unsigned long));             \
 129                                                                        \
 130        __val = *__addr;                                                \
 131        slow;                                                           \
 132                                                                        \
 133        return pfx##ioswab##bwl(__addr, __val);                         \
 134}
 135
 136#define __BUILD_MEMORY_PFX(bus, bwl, type)                              \
 137        __BUILD_MEMORY_SINGLE(bus, bwl, type)
 138
 139#define BUILDIO_MEM(bwl, type)                                          \
 140        __BUILD_MEMORY_PFX(, bwl, type)                                 \
 141        __BUILD_MEMORY_PFX(__mem_, bwl, type)
 142
 143#define __BUILD_IOPORT_PFX(bus, bwl, type)                              \
 144        __BUILD_IOPORT_SINGLE(bus, bwl, type, ,)                        \
 145        __BUILD_IOPORT_SINGLE(bus, bwl, type, _p, SLOW_DOWN_IO)
 146
 147#define BUILDIO_IOPORT(bwl, type)                                       \
 148        __BUILD_IOPORT_PFX(, bwl, type)                                 \
 149        __BUILD_IOPORT_PFX(__mem_, bwl, type)
 150
 151BUILDIO_MEM(b, u8)
 152BUILDIO_MEM(w, u16)
 153BUILDIO_MEM(l, u32)
 154
 155BUILDIO_IOPORT(b, u8)
 156BUILDIO_IOPORT(w, u16)
 157BUILDIO_IOPORT(l, u32)
 158
 159#define readb_relaxed                   readb
 160#define readw_relaxed                   readw
 161#define readl_relaxed                   readl
 162
 163#define readb_be                        __raw_readb
 164#define readw_be                        __raw_readw
 165#define readl_be                        __raw_readl
 166
 167#define writeb_be                       __raw_writeb
 168#define writew_be                       __raw_writew
 169#define writel_be                       __raw_writel
 170
 171#define __BUILD_MEMORY_STRING(bwl, type)                                \
 172static inline void writes##bwl(volatile void __iomem *addr,             \
 173                               const void *data, unsigned int count)    \
 174{                                                                       \
 175        const type *__data = data;                                      \
 176                                                                        \
 177        while (count--)                                                 \
 178                __mem_write##bwl(*__data++, addr);                      \
 179}                                                                       \
 180                                                                        \
 181static inline void reads##bwl(const volatile void __iomem *addr,        \
 182                              void *data, unsigned int count)           \
 183{                                                                       \
 184        type *__data = data;                                            \
 185                                                                        \
 186        while (count--)                                                 \
 187                *__data++ = __mem_read##bwl(addr);                      \
 188}
 189
 190#define __BUILD_IOPORT_STRING(bwl, type)                                \
 191static inline void outs##bwl(unsigned long port, const void *data,      \
 192                             unsigned int count)                        \
 193{                                                                       \
 194        const type *__data = data;                                      \
 195                                                                        \
 196        while (count--)                                                 \
 197                __mem_out##bwl(*__data++, port);                        \
 198}                                                                       \
 199                                                                        \
 200static inline void ins##bwl(unsigned long port, void *data,             \
 201                           unsigned int count)                          \
 202{                                                                       \
 203        type *__data = data;                                            \
 204                                                                        \
 205        while (count--)                                                 \
 206                *__data++ = __mem_in##bwl(port);                        \
 207}
 208
 209#define BUILDSTRING(bwl, type)                                          \
 210        __BUILD_MEMORY_STRING(bwl, type)                                \
 211        __BUILD_IOPORT_STRING(bwl, type)
 212
 213BUILDSTRING(b, u8)
 214BUILDSTRING(w, u16)
 215BUILDSTRING(l, u32)
 216
 217/*
 218 * io{read,write}{8,16,32} macros in both le (for PCI style consumers) and native be
 219 */
 220#ifndef ioread8
 221
 222#define ioread8(p)              ((unsigned int)readb(p))
 223
 224#define ioread16(p)             ((unsigned int)readw(p))
 225#define ioread16be(p)           ((unsigned int)__raw_readw(p))
 226
 227#define ioread32(p)             ((unsigned int)readl(p))
 228#define ioread32be(p)           ((unsigned int)__raw_readl(p))
 229
 230#define iowrite8(v,p)           writeb(v, p)
 231
 232#define iowrite16(v,p)          writew(v, p)
 233#define iowrite16be(v,p)        __raw_writew(v, p)
 234
 235#define iowrite32(v,p)          writel(v, p)
 236#define iowrite32be(v,p)        __raw_writel(v, p)
 237
 238#define ioread8_rep(p,d,c)      readsb(p,d,c)
 239#define ioread16_rep(p,d,c)     readsw(p,d,c)
 240#define ioread32_rep(p,d,c)     readsl(p,d,c)
 241
 242#define iowrite8_rep(p,s,c)     writesb(p,s,c)
 243#define iowrite16_rep(p,s,c)    writesw(p,s,c)
 244#define iowrite32_rep(p,s,c)    writesl(p,s,c)
 245
 246#endif
 247
 248static inline void memcpy_fromio(void * to, const volatile void __iomem *from,
 249                                 unsigned long count)
 250{
 251        memcpy(to, (const void __force *)from, count);
 252}
 253
 254static inline void  memcpy_toio(volatile void __iomem *to, const void * from,
 255                                unsigned long count)
 256{
 257        memcpy((void __force *)to, from, count);
 258}
 259
 260static inline void memset_io(volatile void __iomem *addr, unsigned char val,
 261                             unsigned long count)
 262{
 263        memset((void __force *)addr, val, count);
 264}
 265
 266#define mmiowb()
 267
 268#define IO_SPACE_LIMIT  0xffffffff
 269
 270extern void __iomem *__ioremap(unsigned long offset, size_t size,
 271                               unsigned long flags);
 272extern void __iounmap(void __iomem *addr);
 273
 274/*
 275 * ioremap      -   map bus memory into CPU space
 276 * @offset      bus address of the memory
 277 * @size        size of the resource to map
 278 *
 279 * ioremap performs a platform specific sequence of operations to make
 280 * bus memory CPU accessible via the readb/.../writel functions and
 281 * the other mmio helpers. The returned address is not guaranteed to
 282 * be usable directly as a virtual address.
 283 */
 284#define ioremap(offset, size)                   \
 285        __ioremap((offset), (size), 0)
 286
 287#define ioremap_nocache(offset, size)           \
 288        __ioremap((offset), (size), 0)
 289
 290#define iounmap(addr)                           \
 291        __iounmap(addr)
 292
 293#define cached(addr) P1SEGADDR(addr)
 294#define uncached(addr) P2SEGADDR(addr)
 295
 296#define virt_to_bus virt_to_phys
 297#define bus_to_virt phys_to_virt
 298#define page_to_bus page_to_phys
 299#define bus_to_page phys_to_page
 300
 301/*
 302 * Create a virtual mapping cookie for an IO port range.  There exists
 303 * no such thing as port-based I/O on AVR32, so a regular ioremap()
 304 * should do what we need.
 305 */
 306#define ioport_map(port, nr)    ioremap(port, nr)
 307#define ioport_unmap(port)      iounmap(port)
 308
 309/*
 310 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
 311 * access
 312 */
 313#define xlate_dev_mem_ptr(p)    __va(p)
 314
 315/*
 316 * Convert a virtual cached pointer to an uncached pointer
 317 */
 318#define xlate_dev_kmem_ptr(p)   p
 319
 320#endif /* __ASM_AVR32_IO_H */
 321