io.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * Copyright 2004-2009 Analog Devices Inc.
  3. *
  4. * Licensed under the GPL-2 or later.
  5. */
  6. #ifndef _BFIN_IO_H
  7. #define _BFIN_IO_H
  8. #ifdef __KERNEL__
  9. #ifndef __ASSEMBLY__
  10. #include <linux/types.h>
  11. #endif
  12. #include <linux/compiler.h>
  13. /*
  14. * These are for ISA/PCI shared memory _only_ and should never be used
  15. * on any other type of memory, including Zorro memory. They are meant to
  16. * access the bus in the bus byte order which is little-endian!.
  17. *
  18. * readX/writeX() are used to access memory mapped devices. On some
  19. * architectures the memory mapped IO stuff needs to be accessed
  20. * differently. On the bfin architecture, we just read/write the
  21. * memory location directly.
  22. */
  23. #ifndef __ASSEMBLY__
  24. static inline unsigned char readb(const volatile void __iomem *addr)
  25. {
  26. unsigned int val;
  27. int tmp;
  28. __asm__ __volatile__ (
  29. "cli %1;"
  30. "NOP; NOP; SSYNC;"
  31. "%0 = b [%2] (z);"
  32. "sti %1;"
  33. : "=d"(val), "=d"(tmp)
  34. : "a"(addr)
  35. );
  36. return (unsigned char) val;
  37. }
  38. static inline unsigned short readw(const volatile void __iomem *addr)
  39. {
  40. unsigned int val;
  41. int tmp;
  42. __asm__ __volatile__ (
  43. "cli %1;"
  44. "NOP; NOP; SSYNC;"
  45. "%0 = w [%2] (z);"
  46. "sti %1;"
  47. : "=d"(val), "=d"(tmp)
  48. : "a"(addr)
  49. );
  50. return (unsigned short) val;
  51. }
  52. static inline unsigned int readl(const volatile void __iomem *addr)
  53. {
  54. unsigned int val;
  55. int tmp;
  56. __asm__ __volatile__ (
  57. "cli %1;"
  58. "NOP; NOP; SSYNC;"
  59. "%0 = [%2];"
  60. "sti %1;"
  61. : "=d"(val), "=d"(tmp)
  62. : "a"(addr)
  63. );
  64. return val;
  65. }
  66. #endif /* __ASSEMBLY__ */
  67. #define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b))
  68. #define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b))
  69. #define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b))
  70. #define __raw_readb readb
  71. #define __raw_readw readw
  72. #define __raw_readl readl
  73. #define __raw_writeb writeb
  74. #define __raw_writew writew
  75. #define __raw_writel writel
  76. #define memset_io(a, b, c) memset((void *)(a), (b), (c))
  77. #define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
  78. #define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c))
  79. /* Convert "I/O port addresses" to actual addresses. i.e. ugly casts. */
  80. #define __io(port) ((void *)(unsigned long)(port))
  81. #define inb(port) readb(__io(port))
  82. #define inw(port) readw(__io(port))
  83. #define inl(port) readl(__io(port))
  84. #define outb(x, port) writeb(x, __io(port))
  85. #define outw(x, port) writew(x, __io(port))
  86. #define outl(x, port) writel(x, __io(port))
  87. #define inb_p(port) inb(__io(port))
  88. #define inw_p(port) inw(__io(port))
  89. #define inl_p(port) inl(__io(port))
  90. #define outb_p(x, port) outb(x, __io(port))
  91. #define outw_p(x, port) outw(x, __io(port))
  92. #define outl_p(x, port) outl(x, __io(port))
  93. #define ioread8_rep(a, d, c) readsb(a, d, c)
  94. #define ioread16_rep(a, d, c) readsw(a, d, c)
  95. #define ioread32_rep(a, d, c) readsl(a, d, c)
  96. #define iowrite8_rep(a, s, c) writesb(a, s, c)
  97. #define iowrite16_rep(a, s, c) writesw(a, s, c)
  98. #define iowrite32_rep(a, s, c) writesl(a, s, c)
  99. #define ioread8(x) readb(x)
  100. #define ioread16(x) readw(x)
  101. #define ioread32(x) readl(x)
  102. #define iowrite8(val, x) writeb(val, x)
  103. #define iowrite16(val, x) writew(val, x)
  104. #define iowrite32(val, x) writel(val, x)
  105. #define mmiowb() wmb()
  106. #define IO_SPACE_LIMIT 0xffffffff
  107. /* Values for nocacheflag and cmode */
  108. #define IOMAP_NOCACHE_SER 1
  109. #ifndef __ASSEMBLY__
  110. extern void outsb(unsigned long port, const void *addr, unsigned long count);
  111. extern void outsw(unsigned long port, const void *addr, unsigned long count);
  112. extern void outsw_8(unsigned long port, const void *addr, unsigned long count);
  113. extern void outsl(unsigned long port, const void *addr, unsigned long count);
  114. extern void insb(unsigned long port, void *addr, unsigned long count);
  115. extern void insw(unsigned long port, void *addr, unsigned long count);
  116. extern void insw_8(unsigned long port, void *addr, unsigned long count);
  117. extern void insl(unsigned long port, void *addr, unsigned long count);
  118. extern void insl_16(unsigned long port, void *addr, unsigned long count);
  119. extern void dma_outsb(unsigned long port, const void *addr, unsigned short count);
  120. extern void dma_outsw(unsigned long port, const void *addr, unsigned short count);
  121. extern void dma_outsl(unsigned long port, const void *addr, unsigned short count);
  122. extern void dma_insb(unsigned long port, void *addr, unsigned short count);
  123. extern void dma_insw(unsigned long port, void *addr, unsigned short count);
  124. extern void dma_insl(unsigned long port, void *addr, unsigned short count);
  125. static inline void readsl(const void __iomem *addr, void *buf, int len)
  126. {
  127. insl((unsigned long)addr, buf, len);
  128. }
  129. static inline void readsw(const void __iomem *addr, void *buf, int len)
  130. {
  131. insw((unsigned long)addr, buf, len);
  132. }
  133. static inline void readsb(const void __iomem *addr, void *buf, int len)
  134. {
  135. insb((unsigned long)addr, buf, len);
  136. }
  137. static inline void writesl(const void __iomem *addr, const void *buf, int len)
  138. {
  139. outsl((unsigned long)addr, buf, len);
  140. }
  141. static inline void writesw(const void __iomem *addr, const void *buf, int len)
  142. {
  143. outsw((unsigned long)addr, buf, len);
  144. }
  145. static inline void writesb(const void __iomem *addr, const void *buf, int len)
  146. {
  147. outsb((unsigned long)addr, buf, len);
  148. }
  149. /*
  150. * Map some physical address range into the kernel address space.
  151. */
  152. static inline void __iomem *__ioremap(unsigned long physaddr, unsigned long size,
  153. int cacheflag)
  154. {
  155. return (void __iomem *)physaddr;
  156. }
  157. /*
  158. * Unmap a ioremap()ed region again
  159. */
  160. static inline void iounmap(void *addr)
  161. {
  162. }
  163. /*
  164. * __iounmap unmaps nearly everything, so be careful
  165. * it doesn't free currently pointer/page tables anymore but it
  166. * wans't used anyway and might be added later.
  167. */
  168. static inline void __iounmap(void *addr, unsigned long size)
  169. {
  170. }
  171. /*
  172. * Set new cache mode for some kernel address space.
  173. * The caller must push data for that range itself, if such data may already
  174. * be in the cache.
  175. */
  176. static inline void kernel_set_cachemode(void *addr, unsigned long size,
  177. int cmode)
  178. {
  179. }
  180. static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size)
  181. {
  182. return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
  183. }
  184. static inline void __iomem *ioremap_nocache(unsigned long physaddr,
  185. unsigned long size)
  186. {
  187. return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
  188. }
  189. extern void blkfin_inv_cache_all(void);
  190. #endif
  191. #define ioport_map(port, nr) ((void __iomem*)(port))
  192. #define ioport_unmap(addr)
  193. /* Pages to physical address... */
  194. #define page_to_bus(page) ((page - mem_map) << PAGE_SHIFT)
  195. #define phys_to_virt(vaddr) ((void *) (vaddr))
  196. #define virt_to_phys(vaddr) ((unsigned long) (vaddr))
  197. #define virt_to_bus virt_to_phys
  198. #define bus_to_virt phys_to_virt
  199. /*
  200. * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  201. * access
  202. */
  203. #define xlate_dev_mem_ptr(p) __va(p)
  204. /*
  205. * Convert a virtual cached pointer to an uncached pointer
  206. */
  207. #define xlate_dev_kmem_ptr(p) p
  208. #endif /* __KERNEL__ */
  209. #endif /* _BFIN_IO_H */