Commit bd151412263a67b5321e9dd1d5b4bf6d96fdebf3
1 parent
21e2b8c62c
Exists in
master
and in
20 other branches
genirq: Provide config option to disable deprecated code
This option covers now the old chip functions and the irq_desc data fields which are moving to struct irq_data. More stuff will follow. Pretty handy for testing a conversion, whether something broke or not. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ingo Molnar <mingo@elte.hu>
Showing 6 changed files with 39 additions and 6 deletions Side-by-side Diff
include/linux/irq.h
... | ... | @@ -155,6 +155,7 @@ |
155 | 155 | */ |
156 | 156 | struct irq_chip { |
157 | 157 | const char *name; |
158 | +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
158 | 159 | unsigned int (*startup)(unsigned int irq); |
159 | 160 | void (*shutdown)(unsigned int irq); |
160 | 161 | void (*enable)(unsigned int irq); |
... | ... | @@ -175,7 +176,7 @@ |
175 | 176 | |
176 | 177 | void (*bus_lock)(unsigned int irq); |
177 | 178 | void (*bus_sync_unlock)(unsigned int irq); |
178 | - | |
179 | +#endif | |
179 | 180 | unsigned int (*irq_startup)(struct irq_data *data); |
180 | 181 | void (*irq_shutdown)(struct irq_data *data); |
181 | 182 | void (*irq_enable)(struct irq_data *data); |
... | ... | @@ -225,6 +226,9 @@ |
225 | 226 | */ |
226 | 227 | struct irq_desc { |
227 | 228 | |
229 | +#ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
230 | + struct irq_data irq_data; | |
231 | +#else | |
228 | 232 | /* |
229 | 233 | * This union will go away, once we fixed the direct access to |
230 | 234 | * irq_desc all over the place. The direct fields are a 1:1 |
... | ... | @@ -247,6 +251,8 @@ |
247 | 251 | #endif |
248 | 252 | }; |
249 | 253 | }; |
254 | +#endif | |
255 | + | |
250 | 256 | struct timer_rand_state *timer_rand_state; |
251 | 257 | unsigned int *kstat_irqs; |
252 | 258 | irq_flow_handler_t handle_irq; |
kernel/irq/Kconfig
... | ... | @@ -12,6 +12,10 @@ |
12 | 12 | config GENERIC_HARDIRQS_NO__DO_IRQ |
13 | 13 | def_bool y |
14 | 14 | |
15 | +# Select this to disable the deprecated stuff | |
16 | +config GENERIC_HARDIRQS_NO_DEPRECATED | |
17 | + def_bool n | |
18 | + | |
15 | 19 | # Options selectable by the architecture code |
16 | 20 | config HAVE_SPARSE_IRQ |
17 | 21 | def_bool n |
kernel/irq/chip.c
... | ... | @@ -324,6 +324,7 @@ |
324 | 324 | desc->status |= IRQ_MASKED; |
325 | 325 | } |
326 | 326 | |
327 | +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
327 | 328 | /* Temporary migration helpers */ |
328 | 329 | static void compat_irq_mask(struct irq_data *data) |
329 | 330 | { |
330 | 331 | |
... | ... | @@ -400,12 +401,14 @@ |
400 | 401 | { |
401 | 402 | data->chip->bus_sync_unlock(data->irq); |
402 | 403 | } |
404 | +#endif | |
403 | 405 | |
404 | 406 | /* |
405 | 407 | * Fixup enable/disable function pointers |
406 | 408 | */ |
407 | 409 | void irq_chip_set_defaults(struct irq_chip *chip) |
408 | 410 | { |
411 | +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
409 | 412 | /* |
410 | 413 | * Compat fixup functions need to be before we set the |
411 | 414 | * defaults for enable/disable/startup/shutdown |
... | ... | @@ -418,7 +421,7 @@ |
418 | 421 | chip->irq_shutdown = compat_irq_shutdown; |
419 | 422 | if (chip->startup) |
420 | 423 | chip->irq_startup = compat_irq_startup; |
421 | - | |
424 | +#endif | |
422 | 425 | /* |
423 | 426 | * The real defaults |
424 | 427 | */ |
... | ... | @@ -437,6 +440,8 @@ |
437 | 440 | if (!chip->irq_shutdown) |
438 | 441 | chip->irq_shutdown = chip->irq_disable != default_disable ? |
439 | 442 | chip->irq_disable : default_shutdown; |
443 | + | |
444 | +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
440 | 445 | if (!chip->end) |
441 | 446 | chip->end = dummy_irq_chip.end; |
442 | 447 | |
... | ... | @@ -465,6 +470,7 @@ |
465 | 470 | chip->irq_set_wake = compat_irq_set_wake; |
466 | 471 | if (chip->retrigger) |
467 | 472 | chip->irq_retrigger = compat_irq_retrigger; |
473 | +#endif | |
468 | 474 | } |
469 | 475 | |
470 | 476 | static inline void mask_ack_irq(struct irq_desc *desc) |
kernel/irq/handle.c
... | ... | @@ -309,7 +309,12 @@ |
309 | 309 | return 0; |
310 | 310 | } |
311 | 311 | |
312 | +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
312 | 313 | static 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 | 320 | * Generic no controller implementation |
... | ... | @@ -321,7 +326,7 @@ |
321 | 326 | .irq_enable = noop, |
322 | 327 | .irq_disable = noop, |
323 | 328 | .irq_ack = ack_bad, |
324 | - .end = compat_noop, | |
329 | + END_INIT | |
325 | 330 | }; |
326 | 331 | |
327 | 332 | /* |
... | ... | @@ -337,7 +342,7 @@ |
337 | 342 | .irq_ack = noop, |
338 | 343 | .irq_mask = noop, |
339 | 344 | .irq_unmask = noop, |
340 | - .end = compat_noop, | |
345 | + END_INIT | |
341 | 346 | }; |
342 | 347 | |
343 | 348 | /* |
kernel/irq/internals.h
... | ... | @@ -42,6 +42,16 @@ |
42 | 42 | |
43 | 43 | extern void irq_set_thread_affinity(struct irq_desc *desc); |
44 | 44 | |
45 | +#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED | |
46 | +static 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 | |
52 | +static inline void irq_end(unsigned int irq, struct irq_desc *desc) { } | |
53 | +#endif | |
54 | + | |
45 | 55 | /* Inline functions for support of irq chips on slow busses */ |
46 | 56 | static inline void chip_bus_lock(struct irq_desc *desc) |
47 | 57 | { |
kernel/irq/spurious.c
... | ... | @@ -14,6 +14,8 @@ |
14 | 14 | #include <linux/moduleparam.h> |
15 | 15 | #include <linux/timer.h> |
16 | 16 | |
17 | +#include "internals.h" | |
18 | + | |
17 | 19 | static int irqfixup __read_mostly; |
18 | 20 | |
19 | 21 | #define POLL_SPURIOUS_IRQ_INTERVAL (HZ/10) |
... | ... | @@ -78,8 +80,8 @@ |
78 | 80 | * If we did actual work for the real IRQ line we must let the |
79 | 81 | * IRQ controller clean up too |
80 | 82 | */ |
81 | - if (work && desc->irq_data.chip && desc->irq_data.chip->end) | |
82 | - desc->irq_data.chip->end(irq); | |
83 | + if (work) | |
84 | + irq_end(irq, desc); | |
83 | 85 | raw_spin_unlock(&desc->lock); |
84 | 86 | |
85 | 87 | return ok; |