Merge branch 'for-2.6.37/misc' of git://git.kernel.dk/linux-2.6-block
[pandora-kernel.git] / arch / score / include / asm / irqflags.h
1 #ifndef _ASM_SCORE_IRQFLAGS_H
2 #define _ASM_SCORE_IRQFLAGS_H
3
4 #ifndef __ASSEMBLY__
5
6 #include <linux/types.h>
7
8 static inline unsigned long arch_local_save_flags(void)
9 {
10         unsigned long flags;
11
12         asm volatile(
13                 "       mfcr    r8, cr0         \n"
14                 "       nop                     \n"
15                 "       nop                     \n"
16                 "       mv      %0, r8          \n"
17                 "       nop                     \n"
18                 "       nop                     \n"
19                 "       nop                     \n"
20                 "       nop                     \n"
21                 "       nop                     \n"
22                 "       ldi     r9, 0x1         \n"
23                 "       and     %0, %0, r9      \n"
24                 : "=r" (flags)
25                 :
26                 : "r8", "r9");
27         return flags;
28 }
29
30 static inline unsigned long arch_local_irq_save(void)
31 {
32         unsigned long flags
33
34         asm volatile(
35                 "       mfcr    r8, cr0         \n"
36                 "       li      r9, 0xfffffffe  \n"
37                 "       nop                     \n"
38                 "       mv      %0, r8          \n"
39                 "       and     r8, r8, r9      \n"
40                 "       mtcr    r8, cr0         \n"
41                 "       nop                     \n"
42                 "       nop                     \n"
43                 "       nop                     \n"
44                 "       nop                     \n"
45                 "       nop                     \n"
46                 : "=r" (flags)
47                 :
48                 : "r8", "r9", "memory");
49
50         return flags;
51 }
52
53 static inline void arch_local_irq_restore(unsigned long flags)
54 {
55         asm volatile(
56                 "       mfcr    r8, cr0         \n"
57                 "       ldi     r9, 0x1         \n"
58                 "       and     %0, %0, r9      \n"
59                 "       or      r8, r8, %0      \n"
60                 "       mtcr    r8, cr0         \n"
61                 "       nop                     \n"
62                 "       nop                     \n"
63                 "       nop                     \n"
64                 "       nop                     \n"
65                 "       nop                     \n"
66                 :
67                 : "r"(flags)
68                 : "r8", "r9", "memory");
69 }
70
71 static inline void arch_local_irq_enable(void)
72 {
73         asm volatile(
74                 "       mfcr    r8,cr0          \n"
75                 "       nop                     \n"
76                 "       nop                     \n"
77                 "       ori     r8,0x1          \n"
78                 "       mtcr    r8,cr0          \n"
79                 "       nop                     \n"
80                 "       nop                     \n"
81                 "       nop                     \n"
82                 "       nop                     \n"
83                 "       nop                     \n"
84                 :
85                 :
86                 : "r8", "memory");
87 }
88
89 static inline void arch_local_irq_disable(void)
90 {
91         asm volatile(
92                 "       mfcr    r8,cr0          \n"
93                 "       nop                     \n"
94                 "       nop                     \n"
95                 "       srli    r8,r8,1         \n"
96                 "       slli    r8,r8,1         \n"
97                 "       mtcr    r8,cr0          \n"
98                 "       nop                     \n"
99                 "       nop                     \n"
100                 "       nop                     \n"
101                 "       nop                     \n"
102                 "       nop                     \n"
103                 :
104                 :
105                 : "r8", "memory");
106 }
107
108 static inline bool arch_irqs_disabled_flags(unsigned long flags)
109 {
110         return !(flags & 1);
111 }
112
113 static inline bool arch_irqs_disabled(void)
114 {
115         return arch_irqs_disabled_flags(arch_local_save_flags());
116 }
117
118 #endif /* __ASSEMBLY__ */
119
120 #endif /* _ASM_SCORE_IRQFLAGS_H */