aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-07-01 18:19:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-07-01 18:19:35 -0400
commitd5fb82137b6cd39e67c4321f4f5ce9b03d4d04e6 (patch)
treeaadb6cd1b654c0b45759111af74f3e7fc7a13705
parent8fff77551a9215a725650263e30fa105acca95ab (diff)
parent93b6eb77b49064ed1de5726560a0849f3ebccc2c (diff)
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Thomas Gleixner: "This contains: - a series of fixes for interrupt drivers to prevent a potential race when installing a chained interrupt handler - a fix for cpumask pointer misuse - a fix for using the wrong interrupt number from struct irq_data - removal of unused code and outdated comments - a few new helper functions which allow us to cleanup the interrupt handling code further in 4.3 I decided against doing the cleanup at the end of this merge window and rather do the preparatory steps for 4.3, so we can run the final ABI change at the end of the 4.3 merge window with less risk" * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (26 commits) ARM/LPC32xx: Use irq not hwirq for __irq_set_handler_locked() genirq: Implement irq_set_handler_locked()/irq_set_chip_handler_name_locked() genirq: Introduce helper irq_desc_get_irq() genirq: Remove irq_node() genirq: Clean up outdated comments related to include/linux/irqdesc.h mn10300: Fix incorrect use of irq_data->affinity MIPS/ralink: Fix race in installing chained IRQ handler MIPS/pci: Fix race in installing chained IRQ handler MIPS/ath25: Fix race in installing chained IRQ handler MIPS/ath25: Fix race in installing chained IRQ handler m68k/psc: Fix race in installing chained IRQ handler avr32/at32ap: Fix race in installing chained IRQ handler sh/intc: Fix race in installing chained IRQ handler sh/intc: Fix potential race in installing chained IRQ handler pinctrl/sun4i: Fix race in installing chained IRQ handler pinctrl/samsung: Fix race in installing chained IRQ handler pinctrl/samsung: Fix race in installing chained IRQ handler pinctrl/exynos: Fix race in installing chained IRQ handler pinctrl/st: Fix race in installing chained IRQ handler pinctrl/adi2: Fix race in installing chained IRQ handler ...
-rw-r--r--arch/arm/mach-lpc32xx/irq.c8
-rw-r--r--arch/avr32/mach-at32ap/extint.c3
-rw-r--r--arch/m68k/mac/psc.c12
-rw-r--r--arch/mips/ath25/ar2315.c4
-rw-r--r--arch/mips/ath25/ar5312.c4
-rw-r--r--arch/mips/pci/pci-ar2315.c4
-rw-r--r--arch/mips/ralink/irq.c3
-rw-r--r--arch/mn10300/kernel/irq.c6
-rw-r--r--drivers/gpio/gpio-bcm-kona.c5
-rw-r--r--drivers/gpio/gpio-dwapb.c4
-rw-r--r--drivers/gpio/gpio-msic.c3
-rw-r--r--drivers/mfd/asic3.c3
-rw-r--r--drivers/pci/host/pci-keystone.c7
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mtk-common.c3
-rw-r--r--drivers/pinctrl/pinctrl-adi2.c4
-rw-r--r--drivers/pinctrl/pinctrl-st.c4
-rw-r--r--drivers/pinctrl/samsung/pinctrl-exynos.c4
-rw-r--r--drivers/pinctrl/samsung/pinctrl-s3c24xx.c3
-rw-r--r--drivers/pinctrl/samsung/pinctrl-s3c64xx.c8
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sunxi.c6
-rw-r--r--drivers/sh/intc/core.c5
-rw-r--r--drivers/sh/intc/virq.c3
-rw-r--r--include/linux/irq.h1
-rw-r--r--include/linux/irqdesc.h49
-rw-r--r--include/linux/irqnr.h6
25 files changed, 95 insertions, 67 deletions
diff --git a/arch/arm/mach-lpc32xx/irq.c b/arch/arm/mach-lpc32xx/irq.c
index 9ecb8f9c4ef5..d4f7dc87042b 100644
--- a/arch/arm/mach-lpc32xx/irq.c
+++ b/arch/arm/mach-lpc32xx/irq.c
@@ -283,25 +283,25 @@ static int lpc32xx_set_irq_type(struct irq_data *d, unsigned int type)
283 case IRQ_TYPE_EDGE_RISING: 283 case IRQ_TYPE_EDGE_RISING:
284 /* Rising edge sensitive */ 284 /* Rising edge sensitive */
285 __lpc32xx_set_irq_type(d->hwirq, 1, 1); 285 __lpc32xx_set_irq_type(d->hwirq, 1, 1);
286 __irq_set_handler_locked(d->hwirq, handle_edge_irq); 286 __irq_set_handler_locked(d->irq, handle_edge_irq);
287 break; 287 break;
288 288
289 case IRQ_TYPE_EDGE_FALLING: 289 case IRQ_TYPE_EDGE_FALLING:
290 /* Falling edge sensitive */ 290 /* Falling edge sensitive */
291 __lpc32xx_set_irq_type(d->hwirq, 0, 1); 291 __lpc32xx_set_irq_type(d->hwirq, 0, 1);
292 __irq_set_handler_locked(d->hwirq, handle_edge_irq); 292 __irq_set_handler_locked(d->irq, handle_edge_irq);
293 break; 293 break;
294 294
295 case IRQ_TYPE_LEVEL_LOW: 295 case IRQ_TYPE_LEVEL_LOW:
296 /* Low level sensitive */ 296 /* Low level sensitive */
297 __lpc32xx_set_irq_type(d->hwirq, 0, 0); 297 __lpc32xx_set_irq_type(d->hwirq, 0, 0);
298 __irq_set_handler_locked(d->hwirq, handle_level_irq); 298 __irq_set_handler_locked(d->irq, handle_level_irq);
299 break; 299 break;
300 300
301 case IRQ_TYPE_LEVEL_HIGH: 301 case IRQ_TYPE_LEVEL_HIGH:
302 /* High level sensitive */ 302 /* High level sensitive */
303 __lpc32xx_set_irq_type(d->hwirq, 1, 0); 303 __lpc32xx_set_irq_type(d->hwirq, 1, 0);
304 __irq_set_handler_locked(d->hwirq, handle_level_irq); 304 __irq_set_handler_locked(d->irq, handle_level_irq);
305 break; 305 break;
306 306
307 /* Other modes are not supported */ 307 /* Other modes are not supported */
diff --git a/arch/avr32/mach-at32ap/extint.c b/arch/avr32/mach-at32ap/extint.c
index cfb298d66305..2d48b6a46166 100644
--- a/arch/avr32/mach-at32ap/extint.c
+++ b/arch/avr32/mach-at32ap/extint.c
@@ -231,8 +231,7 @@ static int __init eic_probe(struct platform_device *pdev)
231 irq_set_chip_data(eic->first_irq + i, eic); 231 irq_set_chip_data(eic->first_irq + i, eic);
232 } 232 }
233 233
234 irq_set_chained_handler(int_irq, demux_eic_irq); 234 irq_set_chained_handler_and_data(int_irq, demux_eic_irq, eic);
235 irq_set_handler_data(int_irq, eic);
236 235
237 if (pdev->id == 0) { 236 if (pdev->id == 0) {
238 nmi_eic = eic; 237 nmi_eic = eic;
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c
index 835fa04511c8..272dde481d17 100644
--- a/arch/m68k/mac/psc.c
+++ b/arch/m68k/mac/psc.c
@@ -148,14 +148,10 @@ static void psc_irq(unsigned int irq, struct irq_desc *desc)
148 148
149void __init psc_register_interrupts(void) 149void __init psc_register_interrupts(void)
150{ 150{
151 irq_set_chained_handler(IRQ_AUTO_3, psc_irq); 151 irq_set_chained_handler_and_data(IRQ_AUTO_3, psc_irq, (void *)0x30);
152 irq_set_handler_data(IRQ_AUTO_3, (void *)0x30); 152 irq_set_chained_handler_and_data(IRQ_AUTO_4, psc_irq, (void *)0x40);
153 irq_set_chained_handler(IRQ_AUTO_4, psc_irq); 153 irq_set_chained_handler_and_data(IRQ_AUTO_5, psc_irq, (void *)0x50);
154 irq_set_handler_data(IRQ_AUTO_4, (void *)0x40); 154 irq_set_chained_handler_and_data(IRQ_AUTO_6, psc_irq, (void *)0x60);
155 irq_set_chained_handler(IRQ_AUTO_5, psc_irq);
156 irq_set_handler_data(IRQ_AUTO_5, (void *)0x50);
157 irq_set_chained_handler(IRQ_AUTO_6, psc_irq);
158 irq_set_handler_data(IRQ_AUTO_6, (void *)0x60);
159} 155}
160 156
161void psc_irq_enable(int irq) { 157void psc_irq_enable(int irq) {
diff --git a/arch/mips/ath25/ar2315.c b/arch/mips/ath25/ar2315.c
index 8742e1cee492..ec9a371f1e62 100644
--- a/arch/mips/ath25/ar2315.c
+++ b/arch/mips/ath25/ar2315.c
@@ -161,8 +161,8 @@ void __init ar2315_arch_init_irq(void)
161 irq = irq_create_mapping(domain, AR2315_MISC_IRQ_AHB); 161 irq = irq_create_mapping(domain, AR2315_MISC_IRQ_AHB);
162 setup_irq(irq, &ar2315_ahb_err_interrupt); 162 setup_irq(irq, &ar2315_ahb_err_interrupt);
163 163
164 irq_set_chained_handler(AR2315_IRQ_MISC, ar2315_misc_irq_handler); 164 irq_set_chained_handler_and_data(AR2315_IRQ_MISC,
165 irq_set_handler_data(AR2315_IRQ_MISC, domain); 165 ar2315_misc_irq_handler, domain);
166 166
167 ar2315_misc_irq_domain = domain; 167 ar2315_misc_irq_domain = domain;
168} 168}
diff --git a/arch/mips/ath25/ar5312.c b/arch/mips/ath25/ar5312.c
index 094b938fd603..e63e38fa4880 100644
--- a/arch/mips/ath25/ar5312.c
+++ b/arch/mips/ath25/ar5312.c
@@ -156,8 +156,8 @@ void __init ar5312_arch_init_irq(void)
156 irq = irq_create_mapping(domain, AR5312_MISC_IRQ_AHB_PROC); 156 irq = irq_create_mapping(domain, AR5312_MISC_IRQ_AHB_PROC);
157 setup_irq(irq, &ar5312_ahb_err_interrupt); 157 setup_irq(irq, &ar5312_ahb_err_interrupt);
158 158
159 irq_set_chained_handler(AR5312_IRQ_MISC, ar5312_misc_irq_handler); 159 irq_set_chained_handler_and_data(AR5312_IRQ_MISC,
160 irq_set_handler_data(AR5312_IRQ_MISC, domain); 160 ar5312_misc_irq_handler, domain);
161 161
162 ar5312_misc_irq_domain = domain; 162 ar5312_misc_irq_domain = domain;
163} 163}
diff --git a/arch/mips/pci/pci-ar2315.c b/arch/mips/pci/pci-ar2315.c
index dadb30306a0a..f8d0acb4f973 100644
--- a/arch/mips/pci/pci-ar2315.c
+++ b/arch/mips/pci/pci-ar2315.c
@@ -384,8 +384,8 @@ static void ar2315_pci_irq_init(struct ar2315_pci_ctrl *apc)
384 384
385 apc->irq_ext = irq_create_mapping(apc->domain, AR2315_PCI_IRQ_EXT); 385 apc->irq_ext = irq_create_mapping(apc->domain, AR2315_PCI_IRQ_EXT);
386 386
387 irq_set_chained_handler(apc->irq, ar2315_pci_irq_handler); 387 irq_set_chained_handler_and_data(apc->irq, ar2315_pci_irq_handler,
388 irq_set_handler_data(apc->irq, apc); 388 apc);
389 389
390 /* Clear any pending Abort or external Interrupts 390 /* Clear any pending Abort or external Interrupts
391 * and enable interrupt processing */ 391 * and enable interrupt processing */
diff --git a/arch/mips/ralink/irq.c b/arch/mips/ralink/irq.c
index da301e0a2f1f..53707aacc0f8 100644
--- a/arch/mips/ralink/irq.c
+++ b/arch/mips/ralink/irq.c
@@ -184,8 +184,7 @@ static int __init intc_of_init(struct device_node *node,
184 184
185 rt_intc_w32(INTC_INT_GLOBAL, INTC_REG_ENABLE); 185 rt_intc_w32(INTC_INT_GLOBAL, INTC_REG_ENABLE);
186 186
187 irq_set_chained_handler(irq, ralink_intc_irq_handler); 187 irq_set_chained_handler_and_data(irq, ralink_intc_irq_handler, domain);
188 irq_set_handler_data(irq, domain);
189 188
190 /* tell the kernel which irq is used for performance monitoring */ 189 /* tell the kernel which irq is used for performance monitoring */
191 rt_perfcount_irq = irq_create_mapping(domain, 9); 190 rt_perfcount_irq = irq_create_mapping(domain, 9);
diff --git a/arch/mn10300/kernel/irq.c b/arch/mn10300/kernel/irq.c
index 6ab3b73efcf8..480de70f4059 100644
--- a/arch/mn10300/kernel/irq.c
+++ b/arch/mn10300/kernel/irq.c
@@ -320,11 +320,11 @@ void migrate_irqs(void)
320 if (irqd_is_per_cpu(data)) 320 if (irqd_is_per_cpu(data))
321 continue; 321 continue;
322 322
323 if (cpumask_test_cpu(self, &data->affinity) && 323 if (cpumask_test_cpu(self, data->affinity) &&
324 !cpumask_intersects(&irq_affinity[irq], cpu_online_mask)) { 324 !cpumask_intersects(&irq_affinity[irq], cpu_online_mask)) {
325 int cpu_id; 325 int cpu_id;
326 cpu_id = cpumask_first(cpu_online_mask); 326 cpu_id = cpumask_first(cpu_online_mask);
327 cpumask_set_cpu(cpu_id, &data->affinity); 327 cpumask_set_cpu(cpu_id, data->affinity);
328 } 328 }
329 /* We need to operate irq_affinity_online atomically. */ 329 /* We need to operate irq_affinity_online atomically. */
330 arch_local_cli_save(flags); 330 arch_local_cli_save(flags);
@@ -335,7 +335,7 @@ void migrate_irqs(void)
335 GxICR(irq) = x & GxICR_LEVEL; 335 GxICR(irq) = x & GxICR_LEVEL;
336 tmp = GxICR(irq); 336 tmp = GxICR(irq);
337 337
338 new = cpumask_any_and(&data->affinity, 338 new = cpumask_any_and(data->affinity,
339 cpu_online_mask); 339 cpu_online_mask);
340 irq_affinity_online[irq] = new; 340 irq_affinity_online[irq] = new;
341 341
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
index 8333f878919c..40343fa92c7b 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -657,8 +657,9 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
657 } 657 }
658 for (i = 0; i < kona_gpio->num_bank; i++) { 658 for (i = 0; i < kona_gpio->num_bank; i++) {
659 bank = &kona_gpio->banks[i]; 659 bank = &kona_gpio->banks[i];
660 irq_set_chained_handler(bank->irq, bcm_kona_gpio_irq_handler); 660 irq_set_chained_handler_and_data(bank->irq,
661 irq_set_handler_data(bank->irq, bank); 661 bcm_kona_gpio_irq_handler,
662 bank);
662 } 663 }
663 664
664 spin_lock_init(&kona_gpio->lock); 665 spin_lock_init(&kona_gpio->lock);
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index 58faf04fce5d..55fa9853a7f2 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -348,8 +348,8 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
348 irq_gc->chip_types[1].handler = handle_edge_irq; 348 irq_gc->chip_types[1].handler = handle_edge_irq;
349 349
350 if (!pp->irq_shared) { 350 if (!pp->irq_shared) {
351 irq_set_chained_handler(pp->irq, dwapb_irq_handler); 351 irq_set_chained_handler_and_data(pp->irq, dwapb_irq_handler,
352 irq_set_handler_data(pp->irq, gpio); 352 gpio);
353 } else { 353 } else {
354 /* 354 /*
355 * Request a shared IRQ since where MFD would have devices 355 * Request a shared IRQ since where MFD would have devices
diff --git a/drivers/gpio/gpio-msic.c b/drivers/gpio/gpio-msic.c
index 01acf0a8cdb1..7bcfb87a5fa6 100644
--- a/drivers/gpio/gpio-msic.c
+++ b/drivers/gpio/gpio-msic.c
@@ -309,8 +309,7 @@ static int platform_msic_gpio_probe(struct platform_device *pdev)
309 &msic_irqchip, 309 &msic_irqchip,
310 handle_simple_irq); 310 handle_simple_irq);
311 } 311 }
312 irq_set_chained_handler(mg->irq, msic_gpio_irq_handler); 312 irq_set_chained_handler_and_data(mg->irq, msic_gpio_irq_handler, mg);
313 irq_set_handler_data(mg->irq, mg);
314 313
315 return 0; 314 return 0;
316err: 315err:
diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c
index 977bd3a3eed0..120df5c08741 100644
--- a/drivers/mfd/asic3.c
+++ b/drivers/mfd/asic3.c
@@ -417,9 +417,8 @@ static int __init asic3_irq_probe(struct platform_device *pdev)
417 asic3_write_register(asic, ASIC3_OFFSET(INTR, INT_MASK), 417 asic3_write_register(asic, ASIC3_OFFSET(INTR, INT_MASK),
418 ASIC3_INTMASK_GINTMASK); 418 ASIC3_INTMASK_GINTMASK);
419 419
420 irq_set_chained_handler(asic->irq_nr, asic3_irq_demux); 420 irq_set_chained_handler_and_data(asic->irq_nr, asic3_irq_demux, asic);
421 irq_set_irq_type(asic->irq_nr, IRQ_TYPE_EDGE_RISING); 421 irq_set_irq_type(asic->irq_nr, IRQ_TYPE_EDGE_RISING);
422 irq_set_handler_data(asic->irq_nr, asic);
423 422
424 return 0; 423 return 0;
425} 424}
diff --git a/drivers/pci/host/pci-keystone.c b/drivers/pci/host/pci-keystone.c
index b75d684aefcd..734da589cdfb 100644
--- a/drivers/pci/host/pci-keystone.c
+++ b/drivers/pci/host/pci-keystone.c
@@ -221,10 +221,9 @@ static void ks_pcie_setup_interrupts(struct keystone_pcie *ks_pcie)
221 /* MSI IRQ */ 221 /* MSI IRQ */
222 if (IS_ENABLED(CONFIG_PCI_MSI)) { 222 if (IS_ENABLED(CONFIG_PCI_MSI)) {
223 for (i = 0; i < ks_pcie->num_msi_host_irqs; i++) { 223 for (i = 0; i < ks_pcie->num_msi_host_irqs; i++) {
224 irq_set_chained_handler(ks_pcie->msi_host_irqs[i], 224 irq_set_chained_handler_and_data(ks_pcie->msi_host_irqs[i],
225 ks_pcie_msi_irq_handler); 225 ks_pcie_msi_irq_handler,
226 irq_set_handler_data(ks_pcie->msi_host_irqs[i], 226 ks_pcie);
227 ks_pcie);
228 } 227 }
229 } 228 }
230} 229}
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index c4fc77aa766e..ad1ea1695b4a 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -1351,8 +1351,7 @@ int mtk_pctrl_init(struct platform_device *pdev,
1351 set_irq_flags(virq, IRQF_VALID); 1351 set_irq_flags(virq, IRQF_VALID);
1352 }; 1352 };
1353 1353
1354 irq_set_chained_handler(irq, mtk_eint_irq_handler); 1354 irq_set_chained_handler_and_data(irq, mtk_eint_irq_handler, pctl);
1355 irq_set_handler_data(irq, pctl);
1356 set_irq_flags(irq, IRQF_VALID); 1355 set_irq_flags(irq, IRQF_VALID);
1357 return 0; 1356 return 0;
1358 1357
diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c
index 873433da0f2c..c3c3d2345fc6 100644
--- a/drivers/pinctrl/pinctrl-adi2.c
+++ b/drivers/pinctrl/pinctrl-adi2.c
@@ -865,8 +865,8 @@ static int adi_gpio_pint_probe(struct platform_device *pdev)
865 pint->pint_map_port = adi_pint_map_port; 865 pint->pint_map_port = adi_pint_map_port;
866 platform_set_drvdata(pdev, pint); 866 platform_set_drvdata(pdev, pint);
867 867
868 irq_set_chained_handler(pint->irq, adi_gpio_handle_pint_irq); 868 irq_set_chained_handler_and_data(pint->irq, adi_gpio_handle_pint_irq,
869 irq_set_handler_data(pint->irq, pint); 869 pint);
870 870
871 list_add_tail(&pint->node, &adi_pint_list); 871 list_add_tail(&pint->node, &adi_pint_list);
872 872
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
index d34ac879af9e..c262e5f35c28 100644
--- a/drivers/pinctrl/pinctrl-st.c
+++ b/drivers/pinctrl/pinctrl-st.c
@@ -1661,8 +1661,8 @@ static int st_pctl_probe_dt(struct platform_device *pdev,
1661 if (IS_ERR(info->irqmux_base)) 1661 if (IS_ERR(info->irqmux_base))
1662 return PTR_ERR(info->irqmux_base); 1662 return PTR_ERR(info->irqmux_base);
1663 1663
1664 irq_set_chained_handler(irq, st_gpio_irqmux_handler); 1664 irq_set_chained_handler_and_data(irq, st_gpio_irqmux_handler,
1665 irq_set_handler_data(irq, info); 1665 info);
1666 1666
1667 } 1667 }
1668 1668
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c
index 0b7afa50121a..b18dabba03a4 100644
--- a/drivers/pinctrl/samsung/pinctrl-exynos.c
+++ b/drivers/pinctrl/samsung/pinctrl-exynos.c
@@ -563,8 +563,8 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
563 return -ENOMEM; 563 return -ENOMEM;
564 } 564 }
565 565
566 irq_set_chained_handler(irq, exynos_irq_demux_eint16_31); 566 irq_set_chained_handler_and_data(irq, exynos_irq_demux_eint16_31,
567 irq_set_handler_data(irq, muxed_data); 567 muxed_data);
568 568
569 bank = d->pin_banks; 569 bank = d->pin_banks;
570 idx = 0; 570 idx = 0;
diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
index f1993f42114c..01b43dbfb795 100644
--- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
+++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
@@ -514,8 +514,7 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d)
514 } 514 }
515 515
516 eint_data->parents[i] = irq; 516 eint_data->parents[i] = irq;
517 irq_set_chained_handler(irq, handlers[i]); 517 irq_set_chained_handler_and_data(irq, handlers[i], eint_data);
518 irq_set_handler_data(irq, eint_data);
519 } 518 }
520 519
521 bank = d->pin_banks; 520 bank = d->pin_banks;
diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
index 7756c1e9e763..ec8cc3b47621 100644
--- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
+++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
@@ -506,8 +506,7 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
506 data->domains[nr_domains++] = bank->irq_domain; 506 data->domains[nr_domains++] = bank->irq_domain;
507 } 507 }
508 508
509 irq_set_chained_handler(d->irq, s3c64xx_eint_gpio_irq); 509 irq_set_chained_handler_and_data(d->irq, s3c64xx_eint_gpio_irq, data);
510 irq_set_handler_data(d->irq, data);
511 510
512 return 0; 511 return 0;
513} 512}
@@ -731,8 +730,9 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)
731 return -ENXIO; 730 return -ENXIO;
732 } 731 }
733 732
734 irq_set_chained_handler(irq, s3c64xx_eint0_handlers[i]); 733 irq_set_chained_handler_and_data(irq,
735 irq_set_handler_data(irq, data); 734 s3c64xx_eint0_handlers[i],
735 data);
736 } 736 }
737 737
738 bank = d->pin_banks; 738 bank = d->pin_banks;
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
index d7857c72e627..f09573e13203 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
@@ -1005,9 +1005,9 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
1005 writel(0xffffffff, 1005 writel(0xffffffff,
1006 pctl->membase + sunxi_irq_status_reg_from_bank(i)); 1006 pctl->membase + sunxi_irq_status_reg_from_bank(i));
1007 1007
1008 irq_set_chained_handler(pctl->irq[i], 1008 irq_set_chained_handler_and_data(pctl->irq[i],
1009 sunxi_pinctrl_irq_handler); 1009 sunxi_pinctrl_irq_handler,
1010 irq_set_handler_data(pctl->irq[i], pctl); 1010 pctl);
1011 } 1011 }
1012 1012
1013 dev_info(&pdev->dev, "initialized sunXi PIO driver\n"); 1013 dev_info(&pdev->dev, "initialized sunXi PIO driver\n");
diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c
index 81f22980b2de..156b790072b4 100644
--- a/drivers/sh/intc/core.c
+++ b/drivers/sh/intc/core.c
@@ -366,8 +366,9 @@ int __init register_intc_controller(struct intc_desc *desc)
366 366
367 /* redirect this interrupts to the first one */ 367 /* redirect this interrupts to the first one */
368 irq_set_chip(irq2, &dummy_irq_chip); 368 irq_set_chip(irq2, &dummy_irq_chip);
369 irq_set_chained_handler(irq2, intc_redirect_irq); 369 irq_set_chained_handler_and_data(irq2,
370 irq_set_handler_data(irq2, (void *)irq); 370 intc_redirect_irq,
371 (void *)irq);
371 } 372 }
372 } 373 }
373 374
diff --git a/drivers/sh/intc/virq.c b/drivers/sh/intc/virq.c
index f30ac9354ff2..f5f1b821241a 100644
--- a/drivers/sh/intc/virq.c
+++ b/drivers/sh/intc/virq.c
@@ -243,8 +243,9 @@ restart:
243 */ 243 */
244 irq_set_nothread(irq); 244 irq_set_nothread(irq);
245 245
246 irq_set_chained_handler(entry->pirq, intc_virq_handler); 246 /* Set handler data before installing the handler */
247 add_virq_to_pirq(entry->pirq, irq); 247 add_virq_to_pirq(entry->pirq, irq);
248 irq_set_chained_handler(entry->pirq, intc_virq_handler);
248 249
249 radix_tree_tag_clear(&d->tree, entry->enum_id, 250 radix_tree_tag_clear(&d->tree, entry->enum_id,
250 INTC_TAG_VIRQ_NEEDS_ALLOC); 251 INTC_TAG_VIRQ_NEEDS_ALLOC);
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 812149160d3b..92188b0225bb 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -407,7 +407,6 @@ enum {
407 IRQCHIP_EOI_THREADED = (1 << 6), 407 IRQCHIP_EOI_THREADED = (1 << 6),
408}; 408};
409 409
410/* This include will go away once we isolated irq_desc usage to core code */
411#include <linux/irqdesc.h> 410#include <linux/irqdesc.h>
412 411
413/* 412/*
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h
index c52d1480f272..624a668e61f1 100644
--- a/include/linux/irqdesc.h
+++ b/include/linux/irqdesc.h
@@ -3,9 +3,6 @@
3 3
4/* 4/*
5 * Core internal functions to deal with irq descriptors 5 * Core internal functions to deal with irq descriptors
6 *
7 * This include will move to kernel/irq once we cleaned up the tree.
8 * For now it's included from <linux/irq.h>
9 */ 6 */
10 7
11struct irq_affinity_notify; 8struct irq_affinity_notify;
@@ -103,6 +100,11 @@ static inline struct irq_desc *irq_data_to_desc(struct irq_data *data)
103#endif 100#endif
104} 101}
105 102
103static inline unsigned int irq_desc_get_irq(struct irq_desc *desc)
104{
105 return desc->irq_data.irq;
106}
107
106static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc) 108static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc)
107{ 109{
108 return &desc->irq_data; 110 return &desc->irq_data;
@@ -188,6 +190,47 @@ __irq_set_chip_handler_name_locked(unsigned int irq, struct irq_chip *chip,
188 desc->name = name; 190 desc->name = name;
189} 191}
190 192
193/**
194 * irq_set_handler_locked - Set irq handler from a locked region
195 * @data: Pointer to the irq_data structure which identifies the irq
196 * @handler: Flow control handler function for this interrupt
197 *
198 * Sets the handler in the irq descriptor associated to @data.
199 *
200 * Must be called with irq_desc locked and valid parameters. Typical
201 * call site is the irq_set_type() callback.
202 */
203static inline void irq_set_handler_locked(struct irq_data *data,
204 irq_flow_handler_t handler)
205{
206 struct irq_desc *desc = irq_data_to_desc(data);
207
208 desc->handle_irq = handler;
209}
210
211/**
212 * irq_set_chip_handler_name_locked - Set chip, handler and name from a locked region
213 * @data: Pointer to the irq_data structure for which the chip is set
214 * @chip: Pointer to the new irq chip
215 * @handler: Flow control handler function for this interrupt
216 * @name: Name of the interrupt
217 *
218 * Replace the irq chip at the proper hierarchy level in @data and
219 * sets the handler and name in the associated irq descriptor.
220 *
221 * Must be called with irq_desc locked and valid parameters.
222 */
223static inline void
224irq_set_chip_handler_name_locked(struct irq_data *data, struct irq_chip *chip,
225 irq_flow_handler_t handler, const char *name)
226{
227 struct irq_desc *desc = irq_data_to_desc(data);
228
229 desc->handle_irq = handler;
230 desc->name = name;
231 data->chip = chip;
232}
233
191static inline int irq_balancing_disabled(unsigned int irq) 234static inline int irq_balancing_disabled(unsigned int irq)
192{ 235{
193 struct irq_desc *desc; 236 struct irq_desc *desc;
diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h
index fdd5cc16c9c4..9669bf9d4f48 100644
--- a/include/linux/irqnr.h
+++ b/include/linux/irqnr.h
@@ -23,12 +23,6 @@ unsigned int irq_get_next_irq(unsigned int offset);
23 ; \ 23 ; \
24 else 24 else
25 25
26#ifdef CONFIG_SMP
27#define irq_node(irq) (irq_get_irq_data(irq)->node)
28#else
29#define irq_node(irq) 0
30#endif
31
32# define for_each_active_irq(irq) \ 26# define for_each_active_irq(irq) \
33 for (irq = irq_get_next_irq(0); irq < nr_irqs; \ 27 for (irq = irq_get_next_irq(0); irq < nr_irqs; \
34 irq = irq_get_next_irq(irq + 1)) 28 irq = irq_get_next_irq(irq + 1))