diff options
author | Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp> | 2012-02-06 21:45:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-21 19:47:28 -0500 |
commit | 797a796a13df6b84a4791e57306737059b5b2384 (patch) | |
tree | 400d13deef98fdf3fc893e9e55f208c5716b8ba9 /drivers/platform/x86/ibm_rtl.c | |
parent | 27e74da9800289e69ba907777df1e2085231eff7 (diff) |
asm-generic: architecture independent readq/writeq for 32bit environment
This provides unified readq()/writeq() helper functions for 32-bit
drivers.
For some cases, readq/writeq without atomicity is harmful, and order of
io access has to be specified explicitly. So in this patch, new two
header files which contain non-atomic readq/writeq are added.
- <asm-generic/io-64-nonatomic-lo-hi.h> provides non-atomic readq/
writeq with the order of lower address -> higher address
- <asm-generic/io-64-nonatomic-hi-lo.h> provides non-atomic readq/
writeq with reversed order
This allows us to remove some readq()s that were added drivers when the
default non-atomic ones were removed in commit dbee8a0affd5 ("x86:
remove 32-bit versions of readq()/writeq()")
The drivers which need readq/writeq but can do with the non-atomic ones
must add the line:
#include <asm-generic/io-64-nonatomic-lo-hi.h> /* or hi-lo.h */
But this will be nop in 64-bit environments, and no other #ifdefs are
required. So I believe that this patch can solve the problem of
1. driver-specific readq/writeq
2. atomicity and order of io access
This patch is tested with building allyesconfig and allmodconfig as
ARCH=x86 and ARCH=i386 on top of tip/master.
Cc: Kashyap Desai <Kashyap.Desai@lsi.com>
Cc: Len Brown <lenb@kernel.org>
Cc: Ravi Anand <ravi.anand@qlogic.com>
Cc: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Cc: Matthew Garrett <mjg@redhat.com>
Cc: Jason Uhlenkott <juhlenko@akamai.com>
Cc: James Bottomley <James.Bottomley@parallels.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Roland Dreier <roland@purestorage.com>
Cc: James Bottomley <jbottomley@parallels.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Matthew Wilcox <matthew.r.wilcox@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Hitoshi Mitake <h.mitake@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/platform/x86/ibm_rtl.c')
-rw-r--r-- | drivers/platform/x86/ibm_rtl.c | 15 |
1 files changed, 2 insertions, 13 deletions
diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c index 42a7d603c870..7481146a5b47 100644 --- a/drivers/platform/x86/ibm_rtl.c +++ b/drivers/platform/x86/ibm_rtl.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <linux/mutex.h> | 33 | #include <linux/mutex.h> |
34 | #include <asm/bios_ebda.h> | 34 | #include <asm/bios_ebda.h> |
35 | 35 | ||
36 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
37 | |||
36 | static bool force; | 38 | static bool force; |
37 | module_param(force, bool, 0); | 39 | module_param(force, bool, 0); |
38 | MODULE_PARM_DESC(force, "Force driver load, ignore DMI data"); | 40 | MODULE_PARM_DESC(force, "Force driver load, ignore DMI data"); |
@@ -83,19 +85,6 @@ static void __iomem *rtl_cmd_addr; | |||
83 | static u8 rtl_cmd_type; | 85 | static u8 rtl_cmd_type; |
84 | static u8 rtl_cmd_width; | 86 | static u8 rtl_cmd_width; |
85 | 87 | ||
86 | #ifndef readq | ||
87 | static inline __u64 readq(const volatile void __iomem *addr) | ||
88 | { | ||
89 | const volatile u32 __iomem *p = addr; | ||
90 | u32 low, high; | ||
91 | |||
92 | low = readl(p); | ||
93 | high = readl(p + 1); | ||
94 | |||
95 | return low + ((u64)high << 32); | ||
96 | } | ||
97 | #endif | ||
98 | |||
99 | static void __iomem *rtl_port_map(phys_addr_t addr, unsigned long len) | 88 | static void __iomem *rtl_port_map(phys_addr_t addr, unsigned long len) |
100 | { | 89 | { |
101 | if (rtl_cmd_type == RTL_ADDR_TYPE_MMIO) | 90 | if (rtl_cmd_type == RTL_ADDR_TYPE_MMIO) |