Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / kernel / irq / internals.h
index 70c3053bc1f69a5167981511fd34ab79a92c01f3..3924fbe829d4a8aeaa32750580212b0f008d7f39 100644 (file)
@@ -82,6 +82,7 @@ extern int irq_activate_and_startup(struct irq_desc *desc, bool resend);
 extern int irq_startup(struct irq_desc *desc, bool resend, bool force);
 
 extern void irq_shutdown(struct irq_desc *desc);
+extern void irq_shutdown_and_deactivate(struct irq_desc *desc);
 extern void irq_enable(struct irq_desc *desc);
 extern void irq_disable(struct irq_desc *desc);
 extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu);
@@ -96,6 +97,10 @@ static inline void irq_mark_irq(unsigned int irq) { }
 extern void irq_mark_irq(unsigned int irq);
 #endif
 
+extern int __irq_get_irqchip_state(struct irq_data *data,
+                                  enum irqchip_irq_state which,
+                                  bool *state);
+
 extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr);
 
 irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc, unsigned int *flags);
@@ -354,6 +359,16 @@ static inline int irq_timing_decode(u64 value, u64 *timestamp)
        return value & U16_MAX;
 }
 
+static __always_inline void irq_timings_push(u64 ts, int irq)
+{
+       struct irq_timings *timings = this_cpu_ptr(&irq_timings);
+
+       timings->values[timings->count & IRQ_TIMINGS_MASK] =
+               irq_timing_encode(ts, irq);
+
+       timings->count++;
+}
+
 /*
  * The function record_irq_time is only called in one place in the
  * interrupts handler. We want this function always inline so the code
@@ -367,15 +382,8 @@ static __always_inline void record_irq_time(struct irq_desc *desc)
        if (!static_branch_likely(&irq_timing_enabled))
                return;
 
-       if (desc->istate & IRQS_TIMINGS) {
-               struct irq_timings *timings = this_cpu_ptr(&irq_timings);
-
-               timings->values[timings->count & IRQ_TIMINGS_MASK] =
-                       irq_timing_encode(local_clock(),
-                                         irq_desc_get_irq(desc));
-
-               timings->count++;
-       }
+       if (desc->istate & IRQS_TIMINGS)
+               irq_timings_push(local_clock(), irq_desc_get_irq(desc));
 }
 #else
 static inline void irq_remove_timings(struct irq_desc *desc) {}