|
@@ -20,8 +20,7 @@
|
|
|
#ifndef _ASM_POWERPC_DCR_NATIVE_H
|
|
|
#define _ASM_POWERPC_DCR_NATIVE_H
|
|
|
#ifdef __KERNEL__
|
|
|
-
|
|
|
-#include <asm/reg.h>
|
|
|
+#ifndef __ASSEMBLY__
|
|
|
|
|
|
typedef struct {} dcr_host_t;
|
|
|
|
|
@@ -32,7 +31,41 @@ typedef struct {} dcr_host_t;
|
|
|
#define dcr_read(host, dcr_n) mfdcr(dcr_n)
|
|
|
#define dcr_write(host, dcr_n, value) mtdcr(dcr_n, value)
|
|
|
|
|
|
+/* Device Control Registers */
|
|
|
+void __mtdcr(int reg, unsigned int val);
|
|
|
+unsigned int __mfdcr(int reg);
|
|
|
+#define mfdcr(rn) \
|
|
|
+ ({unsigned int rval; \
|
|
|
+ if (__builtin_constant_p(rn)) \
|
|
|
+ asm volatile("mfdcr %0," __stringify(rn) \
|
|
|
+ : "=r" (rval)); \
|
|
|
+ else \
|
|
|
+ rval = __mfdcr(rn); \
|
|
|
+ rval;})
|
|
|
+
|
|
|
+#define mtdcr(rn, v) \
|
|
|
+do { \
|
|
|
+ if (__builtin_constant_p(rn)) \
|
|
|
+ asm volatile("mtdcr " __stringify(rn) ",%0" \
|
|
|
+ : : "r" (v)); \
|
|
|
+ else \
|
|
|
+ __mtdcr(rn, v); \
|
|
|
+} 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); \
|
|
|
+})
|
|
|
+
|
|
|
+#define mtdcri(base, reg, data) \
|
|
|
+do { \
|
|
|
+ mtdcr(base ## _CFGADDR, base ## _ ## reg); \
|
|
|
+ mtdcr(base ## _CFGDATA, data); \
|
|
|
+} while (0)
|
|
|
|
|
|
+#endif /* __ASSEMBLY__ */
|
|
|
#endif /* __KERNEL__ */
|
|
|
#endif /* _ASM_POWERPC_DCR_NATIVE_H */
|
|
|
|