#include <asm/ptrace.h>
 #include <asm/irq_regs.h>
 
+struct seq_file;
 struct irq_desc;
 struct irq_data;
 typedef        void (*irq_flow_handler_t)(unsigned int irq,
  * @irq_set_wake:      enable/disable power-management wake-on of an IRQ
  * @irq_bus_lock:      function to lock access to slow bus (i2c) chips
  * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
+ * @irq_print_chip:    optional to print special chip info in show_interrupts
  * @flags:             chip specific flags
  *
  * @release:           release function solely used by UML
        void            (*irq_bus_lock)(struct irq_data *data);
        void            (*irq_bus_sync_unlock)(struct irq_data *data);
 
+       void            (*irq_print_chip)(struct irq_data *data, struct seq_file *p);
+
        unsigned long   flags;
 
        /* Currently used only by UML, might disappear one day.*/
 
 config GENERIC_IRQ_SHOW
        bool
 
+# Print level/edge extra information
+config GENERIC_IRQ_SHOW_LEVEL
+       bool
+
 # Support for delayed migration from interrupt context
 config GENERIC_PENDING_IRQ
        bool
 
        seq_printf(p, "%*d: ", prec, i);
        for_each_online_cpu(j)
                seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
-       seq_printf(p, " %8s", desc->irq_data.chip->name);
+
+       if (desc->irq_data.chip) {
+               if (desc->irq_data.chip->irq_print_chip)
+                       desc->irq_data.chip->irq_print_chip(&desc->irq_data, p);
+               else if (desc->irq_data.chip->name)
+                       seq_printf(p, " %8s", desc->irq_data.chip->name);
+               else
+                       seq_printf(p, " %8s", "-");
+       } else {
+               seq_printf(p, " %8s", "None");
+       }
+#ifdef CONFIG_GENIRC_IRQ_SHOW_LEVEL
+       seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge");
+#endif
        if (desc->name)
                seq_printf(p, "-%-8s", desc->name);