]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/include/asm/io.h
ARM: tegra: move CONFIG_TEGRAnn
[karo-tx-uboot.git] / arch / arm / include / asm / io.h
index e8f3eb13aa4c9550140c440c756a42e7e7f2f081..6a1f05ac3efd5326723a94440fc21feee285034c 100644 (file)
@@ -75,29 +75,74 @@ static inline phys_addr_t virt_to_phys(void * vaddr)
 #define __arch_putw(v,a)               (*(volatile unsigned short *)(a) = (v))
 #define __arch_putl(v,a)               (*(volatile unsigned int *)(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);
+extern 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 inline void __raw_writesw(unsigned long addr, const void *data,
+                                int wordlen)
+{
+       uint16_t *buf = (uint16_t *)data;
+       while(wordlen--)
+               __arch_putw(*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);
+extern 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_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)
+extern inline void __raw_readsb(unsigned long addr, void *data, int bytelen)
+{
+       uint8_t *buf = (uint8_t *)data;
+       while(bytelen--)
+               *buf++ = __arch_getb(addr);
+}
 
-#define __raw_readb(a)                 __arch_getb(a)
-#define __raw_readw(a)                 __arch_getw(a)
-#define __raw_readl(a)                 __arch_getl(a)
+extern inline void __raw_readsw(unsigned long addr, void *data, int wordlen)
+{
+       uint16_t *buf = (uint16_t *)data;
+       while(wordlen--)
+               *buf++ = __arch_getw(addr);
+}
+
+extern 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_readb(a)         __arch_getb(a)
+#define __raw_readw(a)         __arch_getw(a)
+#define __raw_readl(a)         __arch_getl(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 dmb()          __asm__ __volatile__ ("" : : : "memory")
+#define __iormb()      dmb()
+#define __iowmb()      dmb()
 
-#define writeb(v,a)                    __arch_putb(v,a)
-#define writew(v,a)                    __arch_putw(v,a)
-#define writel(v,a)                    __arch_putl(v,a)
+#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 readb(a)                       __arch_getb(a)
-#define readw(a)                       __arch_getw(a)
-#define readl(a)                       __arch_getl(a)
+#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; })
 
 /*
  * The compiler seems to be incapable of optimising constants