diff options
-rw-r--r-- | include/linux/irq.h | 27 | ||||
-rw-r--r-- | kernel/irq/chip.c | 26 |
2 files changed, 32 insertions, 21 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 80fdab208c13..e7e7ac83edd8 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -72,6 +72,10 @@ typedef void (*irq_flow_handler_t)(unsigned int irq, | |||
72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ | 72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ |
73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ | 73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ |
74 | 74 | ||
75 | #define IRQF_MODIFY_MASK \ | ||
76 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | ||
77 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL) | ||
78 | |||
75 | #ifdef CONFIG_IRQ_PER_CPU | 79 | #ifdef CONFIG_IRQ_PER_CPU |
76 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 80 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) |
77 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 81 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
@@ -289,8 +293,27 @@ set_irq_chained_handler(unsigned int irq, | |||
289 | 293 | ||
290 | extern void set_irq_nested_thread(unsigned int irq, int nest); | 294 | extern void set_irq_nested_thread(unsigned int irq, int nest); |
291 | 295 | ||
292 | extern void set_irq_noprobe(unsigned int irq); | 296 | void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set); |
293 | extern void set_irq_probe(unsigned int irq); | 297 | |
298 | static inline void irq_set_status_flags(unsigned int irq, unsigned long set) | ||
299 | { | ||
300 | irq_modify_status(irq, 0, set); | ||
301 | } | ||
302 | |||
303 | static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr) | ||
304 | { | ||
305 | irq_modify_status(irq, clr, 0); | ||
306 | } | ||
307 | |||
308 | static inline void set_irq_noprobe(unsigned int irq) | ||
309 | { | ||
310 | irq_modify_status(irq, 0, IRQ_NOPROBE); | ||
311 | } | ||
312 | |||
313 | static inline void set_irq_probe(unsigned int irq) | ||
314 | { | ||
315 | irq_modify_status(irq, IRQ_NOPROBE, 0); | ||
316 | } | ||
294 | 317 | ||
295 | /* Handle dynamic irq creation and destruction */ | 318 | /* Handle dynamic irq creation and destruction */ |
296 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); | 319 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 323547983f15..2b1f6906b824 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -851,32 +851,20 @@ set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, | |||
851 | __set_irq_handler(irq, handle, 0, name); | 851 | __set_irq_handler(irq, handle, 0, name); |
852 | } | 852 | } |
853 | 853 | ||
854 | void set_irq_noprobe(unsigned int irq) | 854 | void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set) |
855 | { | 855 | { |
856 | struct irq_desc *desc = irq_to_desc(irq); | 856 | struct irq_desc *desc = irq_to_desc(irq); |
857 | unsigned long flags; | 857 | unsigned long flags; |
858 | 858 | ||
859 | if (!desc) { | 859 | if (!desc) |
860 | printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq); | ||
861 | return; | 860 | return; |
862 | } | ||
863 | |||
864 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
865 | desc->status |= IRQ_NOPROBE; | ||
866 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
867 | } | ||
868 | 861 | ||
869 | void set_irq_probe(unsigned int irq) | 862 | /* Sanitize flags */ |
870 | { | 863 | set &= IRQF_MODIFY_MASK; |
871 | struct irq_desc *desc = irq_to_desc(irq); | 864 | clr &= IRQF_MODIFY_MASK; |
872 | unsigned long flags; | ||
873 | |||
874 | if (!desc) { | ||
875 | printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq); | ||
876 | return; | ||
877 | } | ||
878 | 865 | ||
879 | raw_spin_lock_irqsave(&desc->lock, flags); | 866 | raw_spin_lock_irqsave(&desc->lock, flags); |
880 | desc->status &= ~IRQ_NOPROBE; | 867 | desc->status &= ~clr; |
868 | desc->status |= set; | ||
881 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 869 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
882 | } | 870 | } |