]> err.no Git - linux-2.6/blobdiff - include/asm-powerpc/hw_irq.h
[POWERPC] mpc512x: Basic platform support
[linux-2.6] / include / asm-powerpc / hw_irq.h
index c4a1ab608f6f07cc96d72e2f61b35fcdc4bfe482..a7b60bf639e0896f5b1099ee29c664c20fa0d33a 100644 (file)
@@ -18,15 +18,25 @@ extern void timer_interrupt(struct pt_regs *);
 
 static inline unsigned long local_get_flags(void)
 {
-       return get_paca()->soft_enabled;
+       unsigned long flags;
+
+       __asm__ __volatile__("lbz %0,%1(13)"
+       : "=r" (flags)
+       : "i" (offsetof(struct paca_struct, soft_enabled)));
+
+       return flags;
 }
 
 static inline unsigned long local_irq_disable(void)
 {
-       unsigned long flag = get_paca()->soft_enabled;
-       get_paca()->soft_enabled = 0;
-       barrier();
-       return flag;
+       unsigned long flags, zero;
+
+       __asm__ __volatile__("li %1,0; lbz %0,%2(13); stb %1,%2(13)"
+       : "=r" (flags), "=&r" (zero)
+       : "i" (offsetof(struct paca_struct, soft_enabled))
+       : "memory");
+
+       return flags;
 }
 
 extern void local_irq_restore(unsigned long);
@@ -38,8 +48,15 @@ extern void iseries_handle_interrupts(void);
 
 #define irqs_disabled()                (local_get_flags() == 0)
 
-#define hard_irq_enable()      __mtmsrd(mfmsr() | MSR_EE, 1)
-#define hard_irq_disable()     __mtmsrd(mfmsr() & ~MSR_EE, 1)
+#define __hard_irq_enable()    __mtmsrd(mfmsr() | MSR_EE, 1)
+#define __hard_irq_disable()   __mtmsrd(mfmsr() & ~MSR_EE, 1)
+
+#define  hard_irq_disable()                    \
+       do {                                    \
+               __hard_irq_disable();           \
+               get_paca()->soft_enabled = 0;   \
+               get_paca()->hard_enabled = 0;   \
+       } while(0)
 
 #else
 
@@ -92,26 +109,10 @@ static inline void local_irq_save_ptr(unsigned long *flags)
 #define local_irq_save(flags)  local_irq_save_ptr(&flags)
 #define irqs_disabled()                ((mfmsr() & MSR_EE) == 0)
 
-#endif /* CONFIG_PPC64 */
+#define hard_irq_enable()      local_irq_enable()
+#define hard_irq_disable()     local_irq_disable()
 
-#define mask_irq(irq)                                          \
-       ({                                                      \
-               irq_desc_t *desc = get_irq_desc(irq);           \
-               if (desc->chip && desc->chip->disable)  \
-                       desc->chip->disable(irq);               \
-       })
-#define unmask_irq(irq)                                                \
-       ({                                                      \
-               irq_desc_t *desc = get_irq_desc(irq);           \
-               if (desc->chip && desc->chip->enable)   \
-                       desc->chip->enable(irq);                \
-       })
-#define ack_irq(irq)                                           \
-       ({                                                      \
-               irq_desc_t *desc = get_irq_desc(irq);           \
-               if (desc->chip && desc->chip->ack)      \
-                       desc->chip->ack(irq);           \
-       })
+#endif /* CONFIG_PPC64 */
 
 /*
  * interrupt-retrigger: should we handle this via lost interrupts and IPIs