diff options
Diffstat (limited to 'include/linux/irq.h')
-rw-r--r-- | include/linux/irq.h | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 59517300a315..bff29c58da23 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -23,13 +23,13 @@ | |||
23 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
24 | #include <linux/topology.h> | 24 | #include <linux/topology.h> |
25 | #include <linux/wait.h> | 25 | #include <linux/wait.h> |
26 | #include <linux/module.h> | ||
27 | 26 | ||
28 | #include <asm/irq.h> | 27 | #include <asm/irq.h> |
29 | #include <asm/ptrace.h> | 28 | #include <asm/ptrace.h> |
30 | #include <asm/irq_regs.h> | 29 | #include <asm/irq_regs.h> |
31 | 30 | ||
32 | struct seq_file; | 31 | struct seq_file; |
32 | struct module; | ||
33 | struct irq_desc; | 33 | struct irq_desc; |
34 | struct irq_data; | 34 | struct irq_data; |
35 | typedef void (*irq_flow_handler_t)(unsigned int irq, | 35 | typedef void (*irq_flow_handler_t)(unsigned int irq, |
@@ -66,6 +66,7 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data); | |||
66 | * IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set) | 66 | * IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set) |
67 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context | 67 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context |
68 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread | 68 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread |
69 | * IRQ_PER_CPU_DEVID - Dev_id is a per-cpu variable | ||
69 | */ | 70 | */ |
70 | enum { | 71 | enum { |
71 | IRQ_TYPE_NONE = 0x00000000, | 72 | IRQ_TYPE_NONE = 0x00000000, |
@@ -88,12 +89,13 @@ enum { | |||
88 | IRQ_MOVE_PCNTXT = (1 << 14), | 89 | IRQ_MOVE_PCNTXT = (1 << 14), |
89 | IRQ_NESTED_THREAD = (1 << 15), | 90 | IRQ_NESTED_THREAD = (1 << 15), |
90 | IRQ_NOTHREAD = (1 << 16), | 91 | IRQ_NOTHREAD = (1 << 16), |
92 | IRQ_PER_CPU_DEVID = (1 << 17), | ||
91 | }; | 93 | }; |
92 | 94 | ||
93 | #define IRQF_MODIFY_MASK \ | 95 | #define IRQF_MODIFY_MASK \ |
94 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | 96 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ |
95 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ | 97 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ |
96 | IRQ_PER_CPU | IRQ_NESTED_THREAD) | 98 | IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID) |
97 | 99 | ||
98 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 100 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
99 | 101 | ||
@@ -336,12 +338,14 @@ struct irq_chip { | |||
336 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path | 338 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path |
337 | * IRQCHIP_ONOFFLINE_ENABLED: Only call irq_on/off_line callbacks | 339 | * IRQCHIP_ONOFFLINE_ENABLED: Only call irq_on/off_line callbacks |
338 | * when irq enabled | 340 | * when irq enabled |
341 | * IRQCHIP_SKIP_SET_WAKE: Skip chip.irq_set_wake(), for this irq chip | ||
339 | */ | 342 | */ |
340 | enum { | 343 | enum { |
341 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | 344 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), |
342 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), | 345 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), |
343 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), | 346 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), |
344 | IRQCHIP_ONOFFLINE_ENABLED = (1 << 3), | 347 | IRQCHIP_ONOFFLINE_ENABLED = (1 << 3), |
348 | IRQCHIP_SKIP_SET_WAKE = (1 << 4), | ||
345 | }; | 349 | }; |
346 | 350 | ||
347 | /* This include will go away once we isolated irq_desc usage to core code */ | 351 | /* This include will go away once we isolated irq_desc usage to core code */ |
@@ -365,6 +369,8 @@ enum { | |||
365 | struct irqaction; | 369 | struct irqaction; |
366 | extern int setup_irq(unsigned int irq, struct irqaction *new); | 370 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
367 | extern void remove_irq(unsigned int irq, struct irqaction *act); | 371 | extern void remove_irq(unsigned int irq, struct irqaction *act); |
372 | extern int setup_percpu_irq(unsigned int irq, struct irqaction *new); | ||
373 | extern void remove_percpu_irq(unsigned int irq, struct irqaction *act); | ||
368 | 374 | ||
369 | extern void irq_cpu_online(void); | 375 | extern void irq_cpu_online(void); |
370 | extern void irq_cpu_offline(void); | 376 | extern void irq_cpu_offline(void); |
@@ -392,6 +398,7 @@ extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc); | |||
392 | extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc); | 398 | extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc); |
393 | extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); | 399 | extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); |
394 | extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); | 400 | extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); |
401 | extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc); | ||
395 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); | 402 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); |
396 | extern void handle_nested_irq(unsigned int irq); | 403 | extern void handle_nested_irq(unsigned int irq); |
397 | 404 | ||
@@ -420,6 +427,8 @@ static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *c | |||
420 | irq_set_chip_and_handler_name(irq, chip, handle, NULL); | 427 | irq_set_chip_and_handler_name(irq, chip, handle, NULL); |
421 | } | 428 | } |
422 | 429 | ||
430 | extern int irq_set_percpu_devid(unsigned int irq); | ||
431 | |||
423 | extern void | 432 | extern void |
424 | __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | 433 | __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, |
425 | const char *name); | 434 | const char *name); |
@@ -481,6 +490,13 @@ static inline void irq_set_nested_thread(unsigned int irq, bool nest) | |||
481 | irq_clear_status_flags(irq, IRQ_NESTED_THREAD); | 490 | irq_clear_status_flags(irq, IRQ_NESTED_THREAD); |
482 | } | 491 | } |
483 | 492 | ||
493 | static inline void irq_set_percpu_devid_flags(unsigned int irq) | ||
494 | { | ||
495 | irq_set_status_flags(irq, | ||
496 | IRQ_NOAUTOEN | IRQ_PER_CPU | IRQ_NOTHREAD | | ||
497 | IRQ_NOPROBE | IRQ_PER_CPU_DEVID); | ||
498 | } | ||
499 | |||
484 | /* Handle dynamic irq creation and destruction */ | 500 | /* Handle dynamic irq creation and destruction */ |
485 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); | 501 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
486 | extern int create_irq(void); | 502 | extern int create_irq(void); |
@@ -551,29 +567,21 @@ static inline struct msi_desc *irq_data_get_msi(struct irq_data *d) | |||
551 | int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, | 567 | int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, |
552 | struct module *owner); | 568 | struct module *owner); |
553 | 569 | ||
554 | static inline int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, | 570 | /* use macros to avoid needing export.h for THIS_MODULE */ |
555 | int node) | 571 | #define irq_alloc_descs(irq, from, cnt, node) \ |
556 | { | 572 | __irq_alloc_descs(irq, from, cnt, node, THIS_MODULE) |
557 | return __irq_alloc_descs(irq, from, cnt, node, THIS_MODULE); | ||
558 | } | ||
559 | 573 | ||
560 | void irq_free_descs(unsigned int irq, unsigned int cnt); | 574 | #define irq_alloc_desc(node) \ |
561 | int irq_reserve_irqs(unsigned int from, unsigned int cnt); | 575 | irq_alloc_descs(-1, 0, 1, node) |
562 | 576 | ||
563 | static inline int irq_alloc_desc(int node) | 577 | #define irq_alloc_desc_at(at, node) \ |
564 | { | 578 | irq_alloc_descs(at, at, 1, node) |
565 | return irq_alloc_descs(-1, 0, 1, node); | ||
566 | } | ||
567 | 579 | ||
568 | static inline int irq_alloc_desc_at(unsigned int at, int node) | 580 | #define irq_alloc_desc_from(from, node) \ |
569 | { | 581 | irq_alloc_descs(-1, from, 1, node) |
570 | return irq_alloc_descs(at, at, 1, node); | ||
571 | } | ||
572 | 582 | ||
573 | static inline int irq_alloc_desc_from(unsigned int from, int node) | 583 | void irq_free_descs(unsigned int irq, unsigned int cnt); |
574 | { | 584 | int irq_reserve_irqs(unsigned int from, unsigned int cnt); |
575 | return irq_alloc_descs(-1, from, 1, node); | ||
576 | } | ||
577 | 585 | ||
578 | static inline void irq_free_desc(unsigned int irq) | 586 | static inline void irq_free_desc(unsigned int irq) |
579 | { | 587 | { |