summaryrefslogtreecommitdiff
path: root/include/asm-mips
diff options
context:
space:
mode:
authorGrant Likely <[email protected]>2007-11-16 21:01:19 -0700
committerGrant Likely <[email protected]>2007-11-16 21:01:19 -0700
commitefe33035acd5f7c13963a4d52e5aac1b68612ae4 (patch)
tree37d6ccca1c82953ae4c41451cb3ec5fe53e2dc3c /include/asm-mips
parent4d4faae65e115e327425cd514c1a35146a85166b (diff)
parent5947f6999aafa7c54c1390983d264a8463dfea8e (diff)
Merge branch 'origin' into kconfig-for-1.3.1
Conflicts: drivers/Makefile
Diffstat (limited to 'include/asm-mips')
-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 cd4d5dc9d9e..1e060f7c31d 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