home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / avr32 / include / asm / io.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  8.6 KB  |  321 lines

  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 */
  14. static __inline__ unsigned long virt_to_phys(volatile void *address)
  15. {
  16.     return PHYSADDR(address);
  17. }
  18.  
  19. static __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.  */
  33. extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen);
  34. extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
  35. extern void __raw_writesl(void __iomem *addr, const void *data, int longlen);
  36.  
  37. extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen);
  38. extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
  39. extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
  40.  
  41. static inline void __raw_writeb(u8 v, volatile void __iomem *addr)
  42. {
  43.     *(volatile u8 __force *)addr = v;
  44. }
  45. static inline void __raw_writew(u16 v, volatile void __iomem *addr)
  46. {
  47.     *(volatile u16 __force *)addr = v;
  48. }
  49. static inline void __raw_writel(u32 v, volatile void __iomem *addr)
  50. {
  51.     *(volatile u32 __force *)addr = v;
  52. }
  53.  
  54. static inline u8 __raw_readb(const volatile void __iomem *addr)
  55. {
  56.     return *(const volatile u8 __force *)addr;
  57. }
  58. static inline u16 __raw_readw(const volatile void __iomem *addr)
  59. {
  60.     return *(const volatile u16 __force *)addr;
  61. }
  62. static 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)                \
  79. static inline void                            \
  80. pfx##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.                                     \
  93. static 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)            \
  107. static 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.                                     \
  121. static 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.  
  151. BUILDIO_MEM(b, u8)
  152. BUILDIO_MEM(w, u16)
  153. BUILDIO_MEM(l, u32)
  154.  
  155. BUILDIO_IOPORT(b, u8)
  156. BUILDIO_IOPORT(w, u16)
  157. BUILDIO_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)                \
  172. static 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.                                     \
  181. static 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)                \
  191. static 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.                                     \
  200. static 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.  
  213. BUILDSTRING(b, u8)
  214. BUILDSTRING(w, u16)
  215. BUILDSTRING(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.  
  248. static 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.  
  254. static 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.  
  260. static 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.  
  270. extern void __iomem *__ioremap(unsigned long offset, size_t size,
  271.                    unsigned long flags);
  272. extern 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.