Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fixes from Thomas Gleixner:
"Two patches from Boris which address a potential deadlock in the atmel
irq chip driver"

* 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
irqchip/atmel-aic: Fix potential deadlock in ->xlate()
genirq: Provide irq_gc_{lock_irqsave,unlock_irqrestore}() helpers

Changed files
+16 -4
drivers
include
linux
+3 -2
drivers/irqchip/irq-atmel-aic.c
··· 176 176 { 177 177 struct irq_domain_chip_generic *dgc = d->gc; 178 178 struct irq_chip_generic *gc; 179 + unsigned long flags; 179 180 unsigned smr; 180 181 int idx; 181 182 int ret; ··· 195 194 196 195 gc = dgc->gc[idx]; 197 196 198 - irq_gc_lock(gc); 197 + irq_gc_lock_irqsave(gc, flags); 199 198 smr = irq_reg_readl(gc, AT91_AIC_SMR(*out_hwirq)); 200 199 aic_common_set_priority(intspec[2], &smr); 201 200 irq_reg_writel(gc, smr, AT91_AIC_SMR(*out_hwirq)); 202 - irq_gc_unlock(gc); 201 + irq_gc_unlock_irqrestore(gc, flags); 203 202 204 203 return ret; 205 204 }
+3 -2
drivers/irqchip/irq-atmel-aic5.c
··· 258 258 unsigned int *out_type) 259 259 { 260 260 struct irq_chip_generic *bgc = irq_get_domain_generic_chip(d, 0); 261 + unsigned long flags; 261 262 unsigned smr; 262 263 int ret; 263 264 ··· 270 269 if (ret) 271 270 return ret; 272 271 273 - irq_gc_lock(bgc); 272 + irq_gc_lock_irqsave(bgc, flags); 274 273 irq_reg_writel(bgc, *out_hwirq, AT91_AIC5_SSR); 275 274 smr = irq_reg_readl(bgc, AT91_AIC5_SMR); 276 275 aic_common_set_priority(intspec[2], &smr); 277 276 irq_reg_writel(bgc, smr, AT91_AIC5_SMR); 278 - irq_gc_unlock(bgc); 277 + irq_gc_unlock_irqrestore(bgc, flags); 279 278 280 279 return ret; 281 280 }
+10
include/linux/irq.h
··· 945 945 static inline void irq_gc_unlock(struct irq_chip_generic *gc) { } 946 946 #endif 947 947 948 + /* 949 + * The irqsave variants are for usage in non interrupt code. Do not use 950 + * them in irq_chip callbacks. Use irq_gc_lock() instead. 951 + */ 952 + #define irq_gc_lock_irqsave(gc, flags) \ 953 + raw_spin_lock_irqsave(&(gc)->lock, flags) 954 + 955 + #define irq_gc_unlock_irqrestore(gc, flags) \ 956 + raw_spin_unlock_irqrestore(&(gc)->lock, flags) 957 + 948 958 static inline void irq_reg_writel(struct irq_chip_generic *gc, 949 959 u32 val, int reg_offset) 950 960 {