|
@@ -86,3 +86,89 @@ static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
|
|
|
}
|
|
|
|
|
|
static inline void __raw_writel(u32 val, volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ asm volatile("str %1, %0"
|
|
|
+ : "+Qo" (*(volatile u32 __force *)addr)
|
|
|
+ : "r" (val));
|
|
|
+}
|
|
|
+
|
|
|
+static inline u8 __raw_readb(const volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ u8 val;
|
|
|
+ asm volatile("ldrb %1, %0"
|
|
|
+ : "+Qo" (*(volatile u8 __force *)addr),
|
|
|
+ "=r" (val));
|
|
|
+ return val;
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 __raw_readl(const volatile void __iomem *addr)
|
|
|
+{
|
|
|
+ u32 val;
|
|
|
+ asm volatile("ldr %1, %0"
|
|
|
+ : "+Qo" (*(volatile u32 __force *)addr),
|
|
|
+ "=r" (val));
|
|
|
+ return val;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Architecture ioremap implementation.
|
|
|
+ */
|
|
|
+#define MT_DEVICE 0
|
|
|
+#define MT_DEVICE_NONSHARED 1
|
|
|
+#define MT_DEVICE_CACHED 2
|
|
|
+#define MT_DEVICE_WC 3
|
|
|
+/*
|
|
|
+ * types 4 onwards can be found in asm/mach/map.h and are undefined
|
|
|
+ * for ioremap
|
|
|
+ */
|
|
|
+
|
|
|
+/*
|
|
|
+ * __arm_ioremap takes CPU physical address.
|
|
|
+ * __arm_ioremap_pfn takes a Page Frame Number and an offset into that page
|
|
|
+ * The _caller variety takes a __builtin_return_address(0) value for
|
|
|
+ * /proc/vmalloc to use - and should only be used in non-inline functions.
|
|
|
+ */
|
|
|
+extern void __iomem *__arm_ioremap_pfn_caller(unsigned long, unsigned long,
|
|
|
+ size_t, unsigned int, void *);
|
|
|
+extern void __iomem *__arm_ioremap_caller(unsigned long, size_t, unsigned int,
|
|
|
+ void *);
|
|
|
+
|
|
|
+extern void __iomem *__arm_ioremap_pfn(unsigned long, unsigned long, size_t, unsigned int);
|
|
|
+extern void __iomem *__arm_ioremap(unsigned long, size_t, unsigned int);
|
|
|
+extern void __iomem *__arm_ioremap_exec(unsigned long, size_t, bool cached);
|
|
|
+extern void __iounmap(volatile void __iomem *addr);
|
|
|
+extern void __arm_iounmap(volatile void __iomem *addr);
|
|
|
+
|
|
|
+extern void __iomem * (*arch_ioremap_caller)(unsigned long, size_t,
|
|
|
+ unsigned int, void *);
|
|
|
+extern void (*arch_iounmap)(volatile void __iomem *);
|
|
|
+
|
|
|
+/*
|
|
|
+ * Bad read/write accesses...
|
|
|
+ */
|
|
|
+extern void __readwrite_bug(const char *fn);
|
|
|
+
|
|
|
+/*
|
|
|
+ * A typesafe __io() helper
|
|
|
+ */
|
|
|
+static inline void __iomem *__typesafe_io(unsigned long addr)
|
|
|
+{
|
|
|
+ return (void __iomem *)addr;
|
|
|
+}
|
|
|
+
|
|
|
+#define IOMEM(x) ((void __force __iomem *)(x))
|
|
|
+
|
|
|
+/* IO barriers */
|
|
|
+#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
|
|
+#include <asm/barrier.h>
|
|
|
+#define __iormb() rmb()
|
|
|
+#define __iowmb() wmb()
|
|
|
+#else
|
|
|
+#define __iormb() do { } while (0)
|
|
|
+#define __iowmb() do { } while (0)
|
|
|
+#endif
|
|
|
+
|
|
|
+/* PCI fixed i/o mapping */
|
|
|
+#define PCI_IO_VIRT_BASE 0xfee00000
|
|
|
+
|
|
|
+extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
|