aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/irq.h27
-rw-r--r--kernel/irq/chip.c26
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
290extern void set_irq_nested_thread(unsigned int irq, int nest); 294extern void set_irq_nested_thread(unsigned int irq, int nest);
291 295
292extern void set_irq_noprobe(unsigned int irq); 296void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
293extern void set_irq_probe(unsigned int irq); 297
298static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
299{
300 irq_modify_status(irq, 0, set);
301}
302
303static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr)
304{
305 irq_modify_status(irq, clr, 0);
306}
307
308static inline void set_irq_noprobe(unsigned int irq)
309{
310 irq_modify_status(irq, 0, IRQ_NOPROBE);
311}
312
313static 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 */
296extern unsigned int create_irq_nr(unsigned int irq_want, int node); 319extern 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
854void set_irq_noprobe(unsigned int irq) 854void 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
869void 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}