]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-powerpc/dcr-native.h
Fix timerfd breakage on avr32
[linux-2.6-omap-h63xx.git] / include / asm-powerpc / dcr-native.h
index d7a1bc1551c603086c97a2ee1c85f9ad53803172..af5fb31af559d6dbf5a0ecb95f1705d952419fa5 100644 (file)
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 
-typedef struct {} dcr_host_t;
+#include <linux/spinlock.h>
+
+typedef struct {
+       unsigned int base;
+} dcr_host_t;
 
 #define DCR_MAP_OK(host)       (1)
 
-#define dcr_map(dev, dcr_n, dcr_c)     {}
-#define dcr_unmap(host, dcr_n, dcr_c)  {}
-#define dcr_read(host, dcr_n)          mfdcr(dcr_n)
-#define dcr_write(host, dcr_n, value)  mtdcr(dcr_n, value)
+#define dcr_map(dev, dcr_n, dcr_c)     ((dcr_host_t){ .base = (dcr_n) })
+#define dcr_unmap(host, dcr_c)         do {} while (0)
+#define dcr_read(host, dcr_n)          mfdcr(dcr_n + host.base)
+#define dcr_write(host, dcr_n, value)  mtdcr(dcr_n + host.base, value)
 
 /* Device Control Registers */
 void __mtdcr(int reg, unsigned int val);
@@ -53,20 +57,28 @@ do {                                                                \
 } while (0)
 
 /* R/W of indirect DCRs make use of standard naming conventions for DCRs */
-#define mfdcri(base, reg)                      \
-({                                             \
-       mtdcr(base ## _CFGADDR, base ## _ ## reg);      \
-       mfdcr(base ## _CFGDATA);                        \
+extern spinlock_t dcr_ind_lock;
+
+#define mfdcri(base, reg)                              \
+({                                                     \
+       unsigned long flags;                            \
+       unsigned int val;                               \
+       spin_lock_irqsave(&dcr_ind_lock, flags);        \
+       mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg);      \
+       val = mfdcr(DCRN_ ## base ## _CONFIG_DATA);     \
+       spin_unlock_irqrestore(&dcr_ind_lock, flags);   \
+       val;                                            \
 })
 
-#define mtdcri(base, reg, data)                        \
-do {                                           \
-       mtdcr(base ## _CFGADDR, base ## _ ## reg);      \
-       mtdcr(base ## _CFGDATA, data);          \
+#define mtdcri(base, reg, data)                                \
+do {                                                   \
+       unsigned long flags;                            \
+       spin_lock_irqsave(&dcr_ind_lock, flags);        \
+       mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg);      \
+       mtdcr(DCRN_ ## base ## _CONFIG_DATA, data);     \
+       spin_unlock_irqrestore(&dcr_ind_lock, flags);   \
 } while (0)
 
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_DCR_NATIVE_H */
-
-