Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / include / asm-arm / mach / irq.h
index bea9af3..131f337 100644 (file)
 #ifndef __ASM_ARM_MACH_IRQ_H
 #define __ASM_ARM_MACH_IRQ_H
 
-struct irqdesc;
-struct pt_regs;
-struct seq_file;
-
-typedef void (*irq_handler_t)(unsigned int, struct irqdesc *, struct pt_regs *);
-typedef void (*irq_control_t)(unsigned int);
-
-struct irqchip {
-       /*
-        * Acknowledge the IRQ.
-        * If this is a level-based IRQ, then it is expected to mask the IRQ
-        * as well.
-        */
-       void (*ack)(unsigned int);
-       /*
-        * Mask the IRQ in hardware.
-        */
-       void (*mask)(unsigned int);
-       /*
-        * Unmask the IRQ in hardware.
-        */
-       void (*unmask)(unsigned int);
-       /*
-        * Ask the hardware to re-trigger the IRQ.
-        * Note: This method _must_ _not_ call the interrupt handler.
-        * If you are unable to retrigger the interrupt, do not
-        * provide a function, or if you do, return non-zero.
-        */
-       int (*retrigger)(unsigned int);
-       /*
-        * Set the type of the IRQ.
-        */
-       int (*type)(unsigned int, unsigned int);
-       /*
-        * Set wakeup-enable on the selected IRQ
-        */
-       int (*wake)(unsigned int, unsigned int);
-};
-
-struct irqdesc {
-       irq_handler_t   handle;
-       struct irqchip  *chip;
-       struct irqaction *action;
-       struct list_head pend;
-       void            *chipdata;
-       void            *data;
-       unsigned int    disable_depth;
+#include <linux/irq.h>
 
-       unsigned int    triggered: 1;           /* IRQ has occurred           */
-       unsigned int    running  : 1;           /* IRQ is running             */
-       unsigned int    pending  : 1;           /* IRQ is pending             */
-       unsigned int    probing  : 1;           /* IRQ in use for a probe     */
-       unsigned int    probe_ok : 1;           /* IRQ can be used for probe  */
-       unsigned int    valid    : 1;           /* IRQ claimable              */
-       unsigned int    noautoenable : 1;       /* don't automatically enable IRQ */
-       unsigned int    unused   :25;
-
-       /*
-        * IRQ lock detection
-        */
-       unsigned int    lck_cnt;
-       unsigned int    lck_pc;
-       unsigned int    lck_jif;
-};
-
-extern struct irqdesc irq_desc[];
+struct seq_file;
 
 /*
  * This is internal.  Do not use it.
@@ -83,48 +20,48 @@ extern struct irqdesc irq_desc[];
 extern void (*init_arch_irq)(void);
 extern void init_FIQ(void);
 extern int show_fiq_list(struct seq_file *, void *);
-void __set_irq_handler(unsigned int irq, irq_handler_t, int);
 
 /*
- * External stuff.
+ * Function wrappers
  */
-#define set_irq_handler(irq,handler)           __set_irq_handler(irq,handler,0)
-#define set_irq_chained_handler(irq,handler)   __set_irq_handler(irq,handler,1)
-#define set_irq_data(irq,d)                    do { irq_desc[irq].data = d; } while (0)
-#define set_irq_chipdata(irq,d)                        do { irq_desc[irq].chipdata = d; } while (0)
-#define get_irq_chipdata(irq)                  (irq_desc[irq].chipdata)
-
-void set_irq_chip(unsigned int irq, struct irqchip *);
-void set_irq_flags(unsigned int irq, unsigned int flags);
+#define set_irq_chipdata(irq, d)       set_irq_chip_data(irq, d)
+#define get_irq_chipdata(irq)          get_irq_chip_data(irq)
 
-#ifdef not_yet
 /*
- * This is to be used by the top-level machine IRQ decoder only.
+ * Obsolete inline function for calling irq descriptor handlers.
  */
-static inline void call_irq(struct pt_regs *regs, unsigned int irq)
+static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc,
+                                  struct pt_regs *regs)
 {
-       struct irqdesc *desc = irq_desc + irq;
-
-       spin_lock(&irq_controller_lock);
-       desc->handle(irq, desc, regs);
-       spin_unlock(&irq_controller_lock);
-
-       if (softirq_pending(smp_processor_id()))
-               do_softirq();
+       desc->handle_irq(irq, desc, regs);
 }
-#endif
+
+void set_irq_flags(unsigned int irq, unsigned int flags);
 
 #define IRQF_VALID     (1 << 0)
 #define IRQF_PROBE     (1 << 1)
 #define IRQF_NOAUTOEN  (1 << 2)
 
 /*
- * Built-in IRQ handlers.
+ * This is for easy migration, but should be changed in the source
  */
-void do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
-void do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
-void do_simple_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
-void do_bad_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs);
-void dummy_mask_unmask_irq(unsigned int irq);
+#define do_level_IRQ   handle_level_irq
+#define do_edge_IRQ    handle_edge_irq
+#define do_simple_IRQ  handle_simple_irq
+#define irqdesc                irq_desc
+#define irqchip                irq_chip
+
+#define do_bad_IRQ(irq,desc,regs)                      \
+do {                                                   \
+       spin_lock(&desc->lock);                         \
+       handle_bad_irq(irq, desc, regs);                \
+       spin_unlock(&desc->lock);                       \
+} while(0)
+
+extern unsigned long irq_err_count;
+static inline void ack_bad_irq(int irq)
+{
+       irq_err_count++;
+}
 
 #endif