]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/include/asm/io.h
Merge branch 'master' of git://git.denx.de/u-boot-arc
[karo-tx-uboot.git] / arch / arm / include / asm / io.h
index 0a4b5be715720ce64af8f72f3e4a8ff3af3a2806..88ecddbc41e2923321b07fd299a66c676e0ea326 100644 (file)
@@ -70,34 +70,86 @@ static inline phys_addr_t virt_to_phys(void * vaddr)
 #define __arch_getb(a)                 (*(volatile unsigned char *)(a))
 #define __arch_getw(a)                 (*(volatile unsigned short *)(a))
 #define __arch_getl(a)                 (*(volatile unsigned int *)(a))
+#define __arch_getq(a)                 (*(volatile unsigned long long *)(a))
 
 #define __arch_putb(v,a)               (*(volatile unsigned char *)(a) = (v))
 #define __arch_putw(v,a)               (*(volatile unsigned short *)(a) = (v))
 #define __arch_putl(v,a)               (*(volatile unsigned int *)(a) = (v))
+#define __arch_putq(v,a)               (*(volatile unsigned long long *)(a) = (v))
 
-extern void __raw_writesb(unsigned int addr, const void *data, int bytelen);
-extern void __raw_writesw(unsigned int addr, const void *data, int wordlen);
-extern void __raw_writesl(unsigned int addr, const void *data, int longlen);
+static inline void __raw_writesb(unsigned long addr, const void *data,
+                                int bytelen)
+{
+       uint8_t *buf = (uint8_t *)data;
+       while(bytelen--)
+               __arch_putb(*buf++, addr);
+}
 
-extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
-extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
-extern void __raw_readsl(unsigned int addr, void *data, int longlen);
+static inline void __raw_writesw(unsigned long addr, const void *data,
+                                int wordlen)
+{
+       uint16_t *buf = (uint16_t *)data;
+       while(wordlen--)
+               __arch_putw(*buf++, addr);
+}
 
-#define __raw_writeb(v,a)              __arch_putb(v,a)
-#define __raw_writew(v,a)              __arch_putw(v,a)
-#define __raw_writel(v,a)              __arch_putl(v,a)
+static inline void __raw_writesl(unsigned long addr, const void *data,
+                                int longlen)
+{
+       uint32_t *buf = (uint32_t *)data;
+       while(longlen--)
+               __arch_putl(*buf++, addr);
+}
 
-#define __raw_readb(a)                 __arch_getb(a)
-#define __raw_readw(a)                 __arch_getw(a)
-#define __raw_readl(a)                 __arch_getl(a)
+static inline void __raw_readsb(unsigned long addr, void *data, int bytelen)
+{
+       uint8_t *buf = (uint8_t *)data;
+       while(bytelen--)
+               *buf++ = __arch_getb(addr);
+}
 
-#define writeb(v,a)                    __arch_putb(v,a)
-#define writew(v,a)                    __arch_putw(v,a)
-#define writel(v,a)                    __arch_putl(v,a)
+static inline void __raw_readsw(unsigned long addr, void *data, int wordlen)
+{
+       uint16_t *buf = (uint16_t *)data;
+       while(wordlen--)
+               *buf++ = __arch_getw(addr);
+}
 
-#define readb(a)                       __arch_getb(a)
-#define readw(a)                       __arch_getw(a)
-#define readl(a)                       __arch_getl(a)
+static inline void __raw_readsl(unsigned long addr, void *data, int longlen)
+{
+       uint32_t *buf = (uint32_t *)data;
+       while(longlen--)
+               *buf++ = __arch_getl(addr);
+}
+
+#define __raw_writeb(v,a)      __arch_putb(v,a)
+#define __raw_writew(v,a)      __arch_putw(v,a)
+#define __raw_writel(v,a)      __arch_putl(v,a)
+#define __raw_writeq(v,a)      __arch_putq(v,a)
+
+#define __raw_readb(a)         __arch_getb(a)
+#define __raw_readw(a)         __arch_getw(a)
+#define __raw_readl(a)         __arch_getl(a)
+#define __raw_readq(a)         __arch_getq(a)
+
+/*
+ * TODO: The kernel offers some more advanced versions of barriers, it might
+ * have some advantages to use them instead of the simple one here.
+ */
+#define mb()           asm volatile("dsb sy" : : : "memory")
+#define dmb()          __asm__ __volatile__ ("" : : : "memory")
+#define __iormb()      dmb()
+#define __iowmb()      dmb()
+
+#define writeb(v,c)    ({ u8  __v = v; __iowmb(); __arch_putb(__v,c); __v; })
+#define writew(v,c)    ({ u16 __v = v; __iowmb(); __arch_putw(__v,c); __v; })
+#define writel(v,c)    ({ u32 __v = v; __iowmb(); __arch_putl(__v,c); __v; })
+#define writeq(v,c)    ({ u64 __v = v; __iowmb(); __arch_putq(__v,c); __v; })
+
+#define readb(c)       ({ u8  __v = __arch_getb(c); __iormb(); __v; })
+#define readw(c)       ({ u16 __v = __arch_getw(c); __iormb(); __v; })
+#define readl(c)       ({ u32 __v = __arch_getl(c); __iormb(); __v; })
+#define readq(c)       ({ u64 __v = __arch_getq(c); __iormb(); __v; })
 
 /*
  * The compiler seems to be incapable of optimising constants
@@ -123,9 +175,11 @@ extern void __raw_readsl(unsigned int addr, void *data, int longlen);
 #define out_arch(type,endian,a,v)      __raw_write##type(cpu_to_##endian(v),a)
 #define in_arch(type,endian,a)         endian##_to_cpu(__raw_read##type(a))
 
+#define out_le64(a,v)  out_arch(q,le64,a,v)
 #define out_le32(a,v)  out_arch(l,le32,a,v)
 #define out_le16(a,v)  out_arch(w,le16,a,v)
 
+#define in_le64(a)     in_arch(q,le64,a)
 #define in_le32(a)     in_arch(l,le32,a)
 #define in_le16(a)     in_arch(w,le16,a)
 
@@ -248,13 +302,13 @@ extern void __iounmap(void *addr);
  *  iomem_to_phys(off)
  */
 #ifdef iomem_valid_addr
-#define __arch_ioremap(off,sz,nocache)                         \
- ({                                                            \
-       unsigned long _off = (off), _size = (sz);               \
-       void *_ret = (void *)0;                                 \
-       if (iomem_valid_addr(_off, _size))                      \
-               _ret = __ioremap(iomem_to_phys(_off),_size,0);  \
-       _ret;                                                   \
+#define __arch_ioremap(off,sz,nocache)                                 \
+ ({                                                                    \
+       unsigned long _off = (off), _size = (sz);                       \
+       void *_ret = (void *)0;                                         \
+       if (iomem_valid_addr(_off, _size))                              \
+               _ret = __ioremap(iomem_to_phys(_off),_size,nocache);    \
+       _ret;                                                           \
  })
 
 #define __arch_iounmap __iounmap
@@ -392,4 +446,7 @@ out:
 
 #endif /* __mem_isa */
 #endif /* __KERNEL__ */
+
+#include <iotrace.h>
+
 #endif /* __ASM_ARM_IO_H */