summaryrefslogtreecommitdiff
path: root/include/asm-mips/io.h
diff options
context:
space:
mode:
authorStefan Roese <sr@denx.de>2007-12-11 10:34:54 (GMT)
committerStefan Roese <sr@denx.de>2007-12-11 10:34:54 (GMT)
commit9caeaadf508cd0e11ac5dfc56ab0f72e3b89a105 (patch)
tree1afcc9c20c04e19870ab5e2996104877695c54a3 /include/asm-mips/io.h
parent7cfc12a7dcfdb350e2ab76db4dafcc30f7e77c2b (diff)
parent41be969f4957115ed7b1fe8b890bfaee99d7a7a2 (diff)
downloadu-boot-9caeaadf508cd0e11ac5dfc56ab0f72e3b89a105.tar.xz
Merge commit 'u-boot/master' into for-1.3.1
Conflicts: drivers/rtc/Makefile
Diffstat (limited to 'include/asm-mips/io.h')
-rw-r--r--include/asm-mips/io.h16
1 files changed, 15 insertions, 1 deletions
diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h
index cd4d5dc..1e060f7 100644
--- a/include/asm-mips/io.h
+++ b/include/asm-mips/io.h
@@ -71,7 +71,21 @@
* instruction, so the lower 16 bits must be zero. Should be true on
* on any sane architecture; generic code does not use this assumption.
*/
-extern unsigned long mips_io_port_base;
+extern const unsigned long mips_io_port_base;
+
+/*
+ * Gcc will generate code to load the value of mips_io_port_base after each
+ * function call which may be fairly wasteful in some cases. So we don't
+ * play quite by the book. We tell gcc mips_io_port_base is a long variable
+ * which solves the code generation issue. Now we need to violate the
+ * aliasing rules a little to make initialization possible and finally we
+ * will need the barrier() to fight side effects of the aliasing chat.
+ * This trickery will eventually collapse under gcc's optimizer. Oh well.
+ */
+static inline void set_io_port_base(unsigned long base)
+{
+ * (unsigned long *) &mips_io_port_base = base;
+}
/*
* Thanks to James van Artsdalen for a better timing-fix than