aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/irq.h8
-rw-r--r--kernel/irq/Kconfig4
-rw-r--r--kernel/irq/chip.c8
-rw-r--r--kernel/irq/handle.c9
-rw-r--r--kernel/irq/internals.h10
-rw-r--r--kernel/irq/spurious.c6
6 files changed, 39 insertions, 6 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 0c83cbd2df4e..82ed8231394a 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -155,6 +155,7 @@ struct irq_data {
155 */ 155 */
156struct irq_chip { 156struct irq_chip {
157 const char *name; 157 const char *name;
158#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
158 unsigned int (*startup)(unsigned int irq); 159 unsigned int (*startup)(unsigned int irq);
159 void (*shutdown)(unsigned int irq); 160 void (*shutdown)(unsigned int irq);
160 void (*enable)(unsigned int irq); 161 void (*enable)(unsigned int irq);
@@ -175,7 +176,7 @@ struct irq_chip {
175 176
176 void (*bus_lock)(unsigned int irq); 177 void (*bus_lock)(unsigned int irq);
177 void (*bus_sync_unlock)(unsigned int irq); 178 void (*bus_sync_unlock)(unsigned int irq);
178 179#endif
179 unsigned int (*irq_startup)(struct irq_data *data); 180 unsigned int (*irq_startup)(struct irq_data *data);
180 void (*irq_shutdown)(struct irq_data *data); 181 void (*irq_shutdown)(struct irq_data *data);
181 void (*irq_enable)(struct irq_data *data); 182 void (*irq_enable)(struct irq_data *data);
@@ -225,6 +226,9 @@ struct irq_2_iommu;
225 */ 226 */
226struct irq_desc { 227struct irq_desc {
227 228
229#ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
230 struct irq_data irq_data;
231#else
228 /* 232 /*
229 * This union will go away, once we fixed the direct access to 233 * This union will go away, once we fixed the direct access to
230 * irq_desc all over the place. The direct fields are a 1:1 234 * irq_desc all over the place. The direct fields are a 1:1
@@ -247,6 +251,8 @@ struct irq_desc {
247#endif 251#endif
248 }; 252 };
249 }; 253 };
254#endif
255
250 struct timer_rand_state *timer_rand_state; 256 struct timer_rand_state *timer_rand_state;
251 unsigned int *kstat_irqs; 257 unsigned int *kstat_irqs;
252 irq_flow_handler_t handle_irq; 258 irq_flow_handler_t handle_irq;
diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig
index e0fc6cd78aa0..a42c0191d71a 100644
--- a/kernel/irq/Kconfig
+++ b/kernel/irq/Kconfig
@@ -12,6 +12,10 @@ config GENERIC_HARDIRQS
12config GENERIC_HARDIRQS_NO__DO_IRQ 12config GENERIC_HARDIRQS_NO__DO_IRQ
13 def_bool y 13 def_bool y
14 14
15# Select this to disable the deprecated stuff
16config GENERIC_HARDIRQS_NO_DEPRECATED
17 def_bool n
18
15# Options selectable by the architecture code 19# Options selectable by the architecture code
16config HAVE_SPARSE_IRQ 20config HAVE_SPARSE_IRQ
17 def_bool n 21 def_bool n
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index f2c4d28c508a..323547983f15 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -324,6 +324,7 @@ static void default_shutdown(struct irq_data *data)
324 desc->status |= IRQ_MASKED; 324 desc->status |= IRQ_MASKED;
325} 325}
326 326
327#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
327/* Temporary migration helpers */ 328/* Temporary migration helpers */
328static void compat_irq_mask(struct irq_data *data) 329static void compat_irq_mask(struct irq_data *data)
329{ 330{
@@ -400,12 +401,14 @@ static void compat_bus_sync_unlock(struct irq_data *data)
400{ 401{
401 data->chip->bus_sync_unlock(data->irq); 402 data->chip->bus_sync_unlock(data->irq);
402} 403}
404#endif
403 405
404/* 406/*
405 * Fixup enable/disable function pointers 407 * Fixup enable/disable function pointers
406 */ 408 */
407void irq_chip_set_defaults(struct irq_chip *chip) 409void irq_chip_set_defaults(struct irq_chip *chip)
408{ 410{
411#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
409 /* 412 /*
410 * Compat fixup functions need to be before we set the 413 * Compat fixup functions need to be before we set the
411 * defaults for enable/disable/startup/shutdown 414 * defaults for enable/disable/startup/shutdown
@@ -418,7 +421,7 @@ void irq_chip_set_defaults(struct irq_chip *chip)
418 chip->irq_shutdown = compat_irq_shutdown; 421 chip->irq_shutdown = compat_irq_shutdown;
419 if (chip->startup) 422 if (chip->startup)
420 chip->irq_startup = compat_irq_startup; 423 chip->irq_startup = compat_irq_startup;
421 424#endif
422 /* 425 /*
423 * The real defaults 426 * The real defaults
424 */ 427 */
@@ -437,6 +440,8 @@ void irq_chip_set_defaults(struct irq_chip *chip)
437 if (!chip->irq_shutdown) 440 if (!chip->irq_shutdown)
438 chip->irq_shutdown = chip->irq_disable != default_disable ? 441 chip->irq_shutdown = chip->irq_disable != default_disable ?
439 chip->irq_disable : default_shutdown; 442 chip->irq_disable : default_shutdown;
443
444#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
440 if (!chip->end) 445 if (!chip->end)
441 chip->end = dummy_irq_chip.end; 446 chip->end = dummy_irq_chip.end;
442 447
@@ -465,6 +470,7 @@ void irq_chip_set_defaults(struct irq_chip *chip)
465 chip->irq_set_wake = compat_irq_set_wake; 470 chip->irq_set_wake = compat_irq_set_wake;
466 if (chip->retrigger) 471 if (chip->retrigger)
467 chip->irq_retrigger = compat_irq_retrigger; 472 chip->irq_retrigger = compat_irq_retrigger;
473#endif
468} 474}
469 475
470static inline void mask_ack_irq(struct irq_desc *desc) 476static inline void mask_ack_irq(struct irq_desc *desc)
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index 8d0697f892a2..3fcef37154a1 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -309,7 +309,12 @@ static unsigned int noop_ret(struct irq_data *data)
309 return 0; 309 return 0;
310} 310}
311 311
312#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
312static void compat_noop(unsigned int irq) { } 313static void compat_noop(unsigned int irq) { }
314#define END_INIT .end = compat_noop
315#else
316#define END_INIT
317#endif
313 318
314/* 319/*
315 * Generic no controller implementation 320 * Generic no controller implementation
@@ -321,7 +326,7 @@ struct irq_chip no_irq_chip = {
321 .irq_enable = noop, 326 .irq_enable = noop,
322 .irq_disable = noop, 327 .irq_disable = noop,
323 .irq_ack = ack_bad, 328 .irq_ack = ack_bad,
324 .end = compat_noop, 329 END_INIT
325}; 330};
326 331
327/* 332/*
@@ -337,7 +342,7 @@ struct irq_chip dummy_irq_chip = {
337 .irq_ack = noop, 342 .irq_ack = noop,
338 .irq_mask = noop, 343 .irq_mask = noop,
339 .irq_unmask = noop, 344 .irq_unmask = noop,
340 .end = compat_noop, 345 END_INIT
341}; 346};
342 347
343/* 348/*
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index ecafbfee5b12..b905f0ab1bb2 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -42,6 +42,16 @@ extern int irq_select_affinity_usr(unsigned int irq);
42 42
43extern void irq_set_thread_affinity(struct irq_desc *desc); 43extern void irq_set_thread_affinity(struct irq_desc *desc);
44 44
45#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED
46static inline void irq_end(unsigned int irq, struct irq_desc *desc)
47{
48 if (desc->irq_data.chip && desc->irq_data.chip->end)
49 desc->irq_data.chip->end(irq);
50}
51#else
52static inline void irq_end(unsigned int irq, struct irq_desc *desc) { }
53#endif
54
45/* Inline functions for support of irq chips on slow busses */ 55/* Inline functions for support of irq chips on slow busses */
46static inline void chip_bus_lock(struct irq_desc *desc) 56static inline void chip_bus_lock(struct irq_desc *desc)
47{ 57{
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c
index 9ee704d3a23c..3089d3b9d5f3 100644
--- a/kernel/irq/spurious.c
+++ b/kernel/irq/spurious.c
@@ -14,6 +14,8 @@
14#include <linux/moduleparam.h> 14#include <linux/moduleparam.h>
15#include <linux/timer.h> 15#include <linux/timer.h>
16 16
17#include "internals.h"
18
17static int irqfixup __read_mostly; 19static int irqfixup __read_mostly;
18 20
19#define POLL_SPURIOUS_IRQ_INTERVAL (HZ/10) 21#define POLL_SPURIOUS_IRQ_INTERVAL (HZ/10)
@@ -78,8 +80,8 @@ static int try_one_irq(int irq, struct irq_desc *desc)
78 * If we did actual work for the real IRQ line we must let the 80 * If we did actual work for the real IRQ line we must let the
79 * IRQ controller clean up too 81 * IRQ controller clean up too
80 */ 82 */
81 if (work && desc->irq_data.chip && desc->irq_data.chip->end) 83 if (work)
82 desc->irq_data.chip->end(irq); 84 irq_end(irq, desc);
83 raw_spin_unlock(&desc->lock); 85 raw_spin_unlock(&desc->lock);
84 86
85 return ok; 87 return ok;