io.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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__ ("cli %1;\n\t"
  29. "NOP; NOP; SSYNC;\n\t"
  30. "%0 = b [%2] (z);\n\t"
  31. "sti %1;\n\t"
  32. : "=d"(val), "=d"(tmp): "a"(addr)
  33. );
  34. return (unsigned char) val;
  35. }
  36. static inline unsigned short readw(const volatile void __iomem *addr)
  37. {
  38. unsigned int val;
  39. int tmp;
  40. __asm__ __volatile__ ("cli %1;\n\t"
  41. "NOP; NOP; SSYNC;\n\t"
  42. "%0 = w [%2] (z);\n\t"
  43. "sti %1;\n\t"
  44. : "=d"(val), "=d"(tmp): "a"(addr)
  45. );
  46. return (unsigned short) val;
  47. }
  48. static inline unsigned int readl(const volatile void __iomem *addr)
  49. {
  50. unsigned int val;
  51. int tmp;
  52. __asm__ __volatile__ ("cli %1;\n\t"
  53. "NOP; NOP; SSYNC;\n\t"
  54. "%0 = [%2];\n\t"
  55. "sti %1;\n\t"
  56. : "=d"(val), "=d"(tmp): "a"(addr)
  57. );
  58. return val;
  59. }
  60. #endif /* __ASSEMBLY__ */
  61. #define writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))
  62. #define writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))
  63. #define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
  64. #define __raw_readb readb
  65. #define __raw_readw readw
  66. #define __raw_readl readl
  67. #define __raw_writeb writeb
  68. #define __raw_writew writew
  69. #define __raw_writel writel
  70. #define memset_io(a,b,c) memset((void *)(a),(b),(c))
  71. #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c))
  72. #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c))
  73. /* Convert "I/O port addresses" to actual addresses. i.e. ugly casts. */
  74. #define __io(port) ((void *)(unsigned long)(port))
  75. #define inb(port) readb(__io(port))
  76. #define inw(port) readw(__io(port))
  77. #define inl(port) readl(__io(port))
  78. #define outb(x,port) writeb(x,__io(port))
  79. #define outw(x,port) writew(x,__io(port))
  80. #define outl(x,port) writel(x,__io(port))
  81. #define inb_p(port) inb(__io(port))
  82. #define inw_p(port) inw(__io(port))
  83. #define inl_p(port) inl(__io(port))
  84. #define outb_p(x,port) outb(x,__io(port))
  85. #define outw_p(x,port) outw(x,__io(port))
  86. #define outl_p(x,port) outl(x,__io(port))
  87. #define ioread8_rep(a,d,c) readsb(a,d,c)
  88. #define ioread16_rep(a,d,c) readsw(a,d,c)
  89. #define ioread32_rep(a,d,c) readsl(a,d,c)
  90. #define iowrite8_rep(a,s,c) writesb(a,s,c)
  91. #define iowrite16_rep(a,s,c) writesw(a,s,c)
  92. #define iowrite32_rep(a,s,c) writesl(a,s,c)
  93. #define ioread8(X) readb(X)
  94. #define ioread16(X) readw(X)
  95. #define ioread32(X) readl(X)
  96. #define iowrite8(val,X) writeb(val,X)
  97. #define iowrite16(val,X) writew(val,X)
  98. #define iowrite32(val,X) writel(val,X)
  99. #define mmiowb() wmb()
  100. #define IO_SPACE_LIMIT 0xffffffff
  101. /* Values for nocacheflag and cmode */
  102. #define IOMAP_NOCACHE_SER 1
  103. #ifndef __ASSEMBLY__
  104. extern void outsb(unsigned long port, const void *addr, unsigned long count);
  105. extern void outsw(unsigned long port, const void *addr, unsigned long count);
  106. extern void outsw_8(unsigned long port, const void *addr, unsigned long count);
  107. extern void outsl(unsigned long port, const void *addr, unsigned long count);
  108. extern void insb(unsigned long port, void *addr, unsigned long count);
  109. extern void insw(unsigned long port, void *addr, unsigned long count);
  110. extern void insw_8(unsigned long port, void *addr, unsigned long count);
  111. extern void insl(unsigned long port, void *addr, unsigned long count);
  112. extern void insl_16(unsigned long port, void *addr, unsigned long count);
  113. extern void dma_outsb(unsigned long port, const void *addr, unsigned short count);
  114. extern void dma_outsw(unsigned long port, const void *addr, unsigned short count);
  115. extern void dma_outsl(unsigned long port, const void *addr, unsigned short count);
  116. extern void dma_insb(unsigned long port, void *addr, unsigned short count);
  117. extern void dma_insw(unsigned long port, void *addr, unsigned short count);
  118. extern void dma_insl(unsigned long port, void *addr, unsigned short count);
  119. static inline void readsl(const void __iomem *addr, void *buf, int len)
  120. {
  121. insl((unsigned long)addr, buf, len);
  122. }
  123. static inline void readsw(const void __iomem *addr, void *buf, int len)
  124. {
  125. insw((unsigned long)addr, buf, len);
  126. }
  127. static inline void readsb(const void __iomem *addr, void *buf, int len)
  128. {
  129. insb((unsigned long)addr, buf, len);
  130. }
  131. static inline void writesl(const void __iomem *addr, const void *buf, int len)
  132. {
  133. outsl((unsigned long)addr, buf, len);
  134. }
  135. static inline void writesw(const void __iomem *addr, const void *buf, int len)
  136. {
  137. outsw((unsigned long)addr, buf, len);
  138. }
  139. static inline void writesb(const void __iomem *addr, const void *buf, int len)
  140. {
  141. outsb((unsigned long)addr, buf, len);
  142. }
  143. /*
  144. * Map some physical address range into the kernel address space.
  145. */
  146. static inline void __iomem *__ioremap(unsigned long physaddr, unsigned long size,
  147. int cacheflag)
  148. {
  149. return (void __iomem *)physaddr;
  150. }
  151. /*
  152. * Unmap a ioremap()ed region again
  153. */
  154. static inline void iounmap(void *addr)
  155. {
  156. }
  157. /*
  158. * __iounmap unmaps nearly everything, so be careful
  159. * it doesn't free currently pointer/page tables anymore but it
  160. * wans't used anyway and might be added later.
  161. */
  162. static inline void __iounmap(void *addr, unsigned long size)
  163. {
  164. }
  165. /*
  166. * Set new cache mode for some kernel address space.
  167. * The caller must push data for that range itself, if such data may already
  168. * be in the cache.
  169. */
  170. static inline void kernel_set_cachemode(void *addr, unsigned long size,
  171. int cmode)
  172. {
  173. }
  174. static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size)
  175. {
  176. return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
  177. }
  178. static inline void __iomem *ioremap_nocache(unsigned long physaddr,
  179. unsigned long size)
  180. {
  181. return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
  182. }
  183. extern void blkfin_inv_cache_all(void);
  184. #endif
  185. #define ioport_map(port, nr) ((void __iomem*)(port))
  186. #define ioport_unmap(addr)
  187. /* Pages to physical address... */
  188. #define page_to_bus(page) ((page - mem_map) << PAGE_SHIFT)
  189. #define phys_to_virt(vaddr) ((void *) (vaddr))
  190. #define virt_to_phys(vaddr) ((unsigned long) (vaddr))
  191. #define virt_to_bus virt_to_phys
  192. #define bus_to_virt phys_to_virt
  193. /*
  194. * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  195. * access
  196. */
  197. #define xlate_dev_mem_ptr(p) __va(p)
  198. /*
  199. * Convert a virtual cached pointer to an uncached pointer
  200. */
  201. #define xlate_dev_kmem_ptr(p) p
  202. #endif /* __KERNEL__ */
  203. #endif /* _BFIN_IO_H */