Merge branch 'linus' into irq/core
authorThomas Gleixner <tglx@linutronix.de>
Wed, 29 Jul 2015 22:13:24 +0000 (00:13 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 29 Jul 2015 22:13:24 +0000 (00:13 +0200)
Pull in upstream fixes before applying conflicting changes

108 files changed:
arch/alpha/kernel/irq.c
arch/arm/mach-shmobile/intc-sh73a0.c
arch/arm/mach-shmobile/setup-r8a7779.c
arch/arm/mach-ux500/cpu.c
arch/arm/mach-zynq/common.c
arch/avr32/mach-at32ap/extint.c
arch/avr32/mach-at32ap/pio.c
arch/blackfin/mach-common/ints-priority.c
arch/c6x/platforms/megamod-pic.c
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/irq.c
arch/ia64/kernel/msi_ia64.c
arch/ia64/sn/kernel/msi_sn.c
arch/mips/pci/msi-octeon.c
arch/powerpc/platforms/cell/axon_msi.c
arch/powerpc/platforms/pasemi/msi.c
arch/powerpc/platforms/powernv/pci.c
arch/powerpc/platforms/pseries/msi.c
arch/powerpc/sysdev/fsl_msi.c
arch/powerpc/sysdev/mpic_u3msi.c
arch/powerpc/sysdev/ppc4xx_hsta_msi.c
arch/powerpc/sysdev/ppc4xx_msi.c
arch/powerpc/sysdev/xics/ics-opal.c
arch/powerpc/sysdev/xics/ics-rtas.c
arch/s390/pci/pci.c
arch/sh/boards/mach-se/7343/irq.c
arch/sh/boards/mach-se/7722/irq.c
arch/sh/boards/mach-se/7724/irq.c
arch/sh/boards/mach-x3proto/gpio.c
arch/sh/kernel/irq.c
arch/sparc/kernel/pci.c
arch/tile/kernel/pci_gx.c
arch/x86/pci/xen.c
arch/xtensa/kernel/irq.c
drivers/base/core.c
drivers/irqchip/exynos-combiner.c
drivers/irqchip/irq-armada-370-xp.c
drivers/irqchip/irq-atmel-aic.c
drivers/irqchip/irq-atmel-aic5.c
drivers/irqchip/irq-bcm2835.c
drivers/irqchip/irq-bcm7038-l1.c
drivers/irqchip/irq-bcm7120-l2.c
drivers/irqchip/irq-brcmstb-l2.c
drivers/irqchip/irq-clps711x.c
drivers/irqchip/irq-crossbar.c
drivers/irqchip/irq-digicolor.c
drivers/irqchip/irq-dw-apb-ictl.c
drivers/irqchip/irq-gic-v3-its.c
drivers/irqchip/irq-gic-v3.c
drivers/irqchip/irq-gic.c
drivers/irqchip/irq-hip04.c
drivers/irqchip/irq-imgpdc.c
drivers/irqchip/irq-ingenic.c
drivers/irqchip/irq-keystone.c
drivers/irqchip/irq-metag-ext.c
drivers/irqchip/irq-metag.c
drivers/irqchip/irq-mips-cpu.c
drivers/irqchip/irq-mips-gic.c
drivers/irqchip/irq-mmp.c
drivers/irqchip/irq-moxart.c
drivers/irqchip/irq-mtk-sysirq.c
drivers/irqchip/irq-mxs.c
drivers/irqchip/irq-nvic.c
drivers/irqchip/irq-omap-intc.c
drivers/irqchip/irq-or1k-pic.c
drivers/irqchip/irq-orion.c
drivers/irqchip/irq-renesas-h8300h.c
drivers/irqchip/irq-renesas-h8s.c
drivers/irqchip/irq-renesas-irqc.c
drivers/irqchip/irq-s3c24xx.c
drivers/irqchip/irq-sirfsoc.c
drivers/irqchip/irq-sun4i.c
drivers/irqchip/irq-sunxi-nmi.c
drivers/irqchip/irq-tb10x.c
drivers/irqchip/irq-tegra.c
drivers/irqchip/irq-versatile-fpga.c
drivers/irqchip/irq-vf610-mscm-ir.c
drivers/irqchip/irq-vic.c
drivers/irqchip/irq-vt8500.c
drivers/irqchip/irq-xtensa-mx.c
drivers/irqchip/irq-xtensa-pic.c
drivers/irqchip/irq-zevio.c
drivers/irqchip/spear-shirq.c
drivers/pci/host/pci-keystone-dw.c
drivers/pci/host/pci-keystone.c
drivers/pci/host/pcie-designware.c
drivers/pci/host/pcie-xilinx.c
drivers/pci/msi.c
drivers/pci/xen-pcifront.c
drivers/sh/intc/chip.c
drivers/sh/intc/core.c
drivers/sh/intc/virq.c
drivers/spmi/spmi-pmic-arb.c
include/linux/device.h
include/linux/irq.h
include/linux/irqchip/arm-gic.h
include/linux/msi.h
include/linux/pci.h
kernel/irq/chip.c
kernel/irq/generic-chip.c
kernel/irq/handle.c
kernel/irq/internals.h
kernel/irq/irqdesc.c
kernel/irq/manage.c
kernel/irq/msi.c
kernel/irq/pm.c
kernel/irq/resend.c
kernel/irq/spurious.c

index 51f2c8654253f2bd6667ccff24c0db09a7f80ccc..2804648c8ff4008d15761145b92167e721212935 100644 (file)
@@ -59,7 +59,7 @@ int irq_select_affinity(unsigned int irq)
                cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
        last_cpu = cpu;
 
-       cpumask_copy(data->affinity, cpumask_of(cpu));
+       cpumask_copy(irq_data_get_affinity_mask(data), cpumask_of(cpu));
        chip->irq_set_affinity(data, cpumask_of(cpu), false);
        return 0;
 }
index fd63ae6532fc9ab26149497f68870e81705ed7b7..151a71a41fe3bd868b77783478aeb22d20a9b098 100644 (file)
@@ -313,7 +313,6 @@ void __init sh73a0_init_irq(void)
        void __iomem *gic_cpu_base = IOMEM(0xf0000100);
        void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
 
-       gic_set_irqchip_flags(IRQCHIP_SKIP_SET_WAKE);
        gic_init(0, 29, gic_dist_base, gic_cpu_base);
 
        register_intc_controller(&intcs_desc);
index c03e562be12b17600e3492dc755a86449a222615..aea5cff9495de195148294f16941182d5b1a0166 100644 (file)
@@ -719,7 +719,6 @@ void __init r8a7779_init_irq_dt(void)
        void __iomem *gic_dist_base = ioremap_nocache(0xf0001000, 0x1000);
        void __iomem *gic_cpu_base = ioremap_nocache(0xf0000100, 0x1000);
 #endif
-       gic_set_irqchip_flags(IRQCHIP_SKIP_SET_WAKE);
 
 #ifdef CONFIG_ARCH_SHMOBILE_LEGACY
        gic_init(0, 29, gic_dist_base, gic_cpu_base);
index e31d3d61c9988a645bf081f7462fffaee3db67dd..6cb10c77afd84893839f5e1c7903493241530943 100644 (file)
@@ -56,7 +56,6 @@ void __init ux500_init_irq(void)
        struct device_node *np;
        struct resource r;
 
-       gic_set_irqchip_flags(IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND);
        irqchip_init();
        np = of_find_compatible_node(NULL, NULL, "stericsson,db8500-prcmu");
        of_address_to_resource(np, 0, &r);
index 616d5840fc2e4aefe2af918a56aa48a85f3c931c..2ad1accfba35bfe089447715059f58f254410d7d 100644 (file)
@@ -186,7 +186,6 @@ static void __init zynq_map_io(void)
 
 static void __init zynq_irq_init(void)
 {
-       gic_set_irqchip_flags(IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND);
        irqchip_init();
 }
 
index 2d48b6a461664e5fd03d775cc4ba922dd56dacf7..d51ff8f1c541dd8cded2935f6890ce5c48dcb85e 100644 (file)
@@ -128,9 +128,9 @@ static int eic_set_irq_type(struct irq_data *d, unsigned int flow_type)
 
        irqd_set_trigger_type(d, flow_type);
        if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
-               __irq_set_handler_locked(irq, handle_level_irq);
+               irq_set_handler_locked(d, handle_level_irq);
        else
-               __irq_set_handler_locked(irq, handle_edge_irq);
+               irq_set_handler_locked(d, handle_edge_irq);
 
        return IRQ_SET_MASK_OK_NOCOPY;
 }
index 903c7d81d0d521a1b8bcf523c609f83516d8e952..157a5e0e789f6744d62672dd0a03ca066d960079 100644 (file)
@@ -286,7 +286,7 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)
        struct pio_device       *pio = irq_desc_get_chip_data(desc);
        unsigned                gpio_irq;
 
-       gpio_irq = (unsigned) irq_get_handler_data(irq);
+       gpio_irq = (unsigned) irq_desc_get_handler_data(desc);
        for (;;) {
                u32             isr;
 
@@ -312,7 +312,6 @@ gpio_irq_setup(struct pio_device *pio, int irq, int gpio_irq)
        unsigned        i;
 
        irq_set_chip_data(irq, pio);
-       irq_set_handler_data(irq, (void *)gpio_irq);
 
        for (i = 0; i < 32; i++, gpio_irq++) {
                irq_set_chip_data(gpio_irq, pio);
@@ -320,7 +319,8 @@ gpio_irq_setup(struct pio_device *pio, int irq, int gpio_irq)
                                         handle_simple_irq);
        }
 
-       irq_set_chained_handler(irq, gpio_irq_handler);
+       irq_set_chained_handler_and_data(irq, gpio_irq_handler,
+                                        (void *)gpio_irq);
 }
 
 /*--------------------------------------------------------------------------*/
index 7236bdfc71e6ae330efa1efb29ffbb8b79c3cf47..2eaf83a1a9814e482d213e4cf8199868d6007be2 100644 (file)
@@ -194,7 +194,8 @@ void bfin_internal_unmask_irq(unsigned int irq)
 #ifdef CONFIG_SMP
 static void bfin_internal_unmask_irq_chip(struct irq_data *d)
 {
-       bfin_internal_unmask_irq_affinity(d->irq, d->affinity);
+       bfin_internal_unmask_irq_affinity(d->irq,
+                                         irq_data_get_affinity_mask(d));
 }
 
 static int bfin_internal_set_affinity(struct irq_data *d,
@@ -685,12 +686,12 @@ void bfin_demux_mac_status_irq(unsigned int int_err_irq,
 }
 #endif
 
-static inline void bfin_set_irq_handler(unsigned irq, irq_flow_handler_t handle)
+static inline void bfin_set_irq_handler(struct irq_data *d, irq_flow_handler_t handle)
 {
 #ifdef CONFIG_IPIPE
        handle = handle_level_irq;
 #endif
-       __irq_set_handler_locked(irq, handle);
+       irq_set_handler_locked(d, handle);
 }
 
 #ifdef CONFIG_GPIO_ADI
@@ -802,9 +803,9 @@ static int bfin_gpio_irq_type(struct irq_data *d, unsigned int type)
        }
 
        if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
-               bfin_set_irq_handler(irq, handle_edge_irq);
+               bfin_set_irq_handler(d, handle_edge_irq);
        else
-               bfin_set_irq_handler(irq, handle_level_irq);
+               bfin_set_irq_handler(d, handle_level_irq);
 
        return 0;
 }
index 74e3371eb8245bc4c769eff1b8923707c0fc883f..349bc01fc76c129b0ca577871a6ebf9768167520 100644 (file)
@@ -282,8 +282,8 @@ static struct megamod_pic * __init init_megamod_pic(struct device_node *np)
                soc_writel(~0, &pic->regs->evtmask[i]);
                soc_writel(~0, &pic->regs->evtclr[i]);
 
-               irq_set_handler_data(irq, &cascade_data[i]);
-               irq_set_chained_handler(irq, megamod_irq_cascade);
+               irq_set_chained_handler_and_data(irq, megamod_irq_cascade,
+                                                &cascade_data[i]);
        }
 
        /* Finally, set up the MUX registers */
index bc9501e36e776257c53f190df8db2411c7cac273..d2fae054d988cdc9326ad249434bb8ec50b0b45e 100644 (file)
@@ -610,9 +610,9 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
                               chip->name, irq_type->name);
                chip = irq_type;
        }
-       __irq_set_chip_handler_name_locked(irq, chip, trigger == IOSAPIC_EDGE ?
-                                          handle_edge_irq : handle_level_irq,
-                                          NULL);
+       irq_set_chip_handler_name_locked(irq_get_irq_data(irq), chip,
+               trigger == IOSAPIC_EDGE ? handle_edge_irq : handle_level_irq,
+               NULL);
        return 0;
 }
 
@@ -838,7 +838,7 @@ iosapic_unregister_intr (unsigned int gsi)
        if (iosapic_intr_info[irq].count == 0) {
 #ifdef CONFIG_SMP
                /* Clear affinity */
-               cpumask_setall(irq_get_irq_data(irq)->affinity);
+               cpumask_setall(irq_get_affinity_mask(irq));
 #endif
                /* Clear the interrupt information */
                iosapic_intr_info[irq].dest = 0;
index 812a1e6b317966610811bb10d97e7c1cdab84a80..de4fc00dea98a8a6208cf7d50c805e7c5cd1bd0b 100644 (file)
@@ -67,7 +67,7 @@ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 };
 void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
 {
        if (irq < NR_IRQS) {
-               cpumask_copy(irq_get_irq_data(irq)->affinity,
+               cpumask_copy(irq_get_affinity_mask(irq),
                             cpumask_of(cpu_logical_id(hwid)));
                irq_redir[irq] = (char) (redir & 0xff);
        }
@@ -119,8 +119,8 @@ static void migrate_irqs(void)
                if (irqd_is_per_cpu(data))
                        continue;
 
-               if (cpumask_any_and(data->affinity, cpu_online_mask)
-                   >= nr_cpu_ids) {
+               if (cpumask_any_and(irq_data_get_affinity_mask(data),
+                                   cpu_online_mask) >= nr_cpu_ids) {
                        /*
                         * Save it for phase 2 processing
                         */
index d70bf15c690a53227142b6027ce7bb116475ed9d..af4eaec0f7c348019eb787ef2224106925bfac35 100644 (file)
@@ -23,7 +23,7 @@ static int ia64_set_msi_irq_affinity(struct irq_data *idata,
        if (irq_prepare_move(irq, cpu))
                return -1;
 
-       __get_cached_msi_msg(idata->msi_desc, &msg);
+       __get_cached_msi_msg(irq_data_get_msi_desc(idata), &msg);
 
        addr = msg.address_lo;
        addr &= MSI_ADDR_DEST_ID_MASK;
@@ -36,7 +36,7 @@ static int ia64_set_msi_irq_affinity(struct irq_data *idata,
        msg.data = data;
 
        pci_write_msi_msg(irq, &msg);
-       cpumask_copy(idata->affinity, cpumask_of(cpu));
+       cpumask_copy(irq_data_get_affinity_mask(idata), cpumask_of(cpu));
 
        return 0;
 }
@@ -148,7 +148,7 @@ static int dmar_msi_set_affinity(struct irq_data *data,
        msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu));
 
        dmar_msi_write(irq, &msg);
-       cpumask_copy(data->affinity, mask);
+       cpumask_copy(irq_data_get_affinity_mask(data), mask);
 
        return 0;
 }
index a0eb27b66d13c8aa88005066adaf8ef6bd2d314d..fb25065b22c626d8af13b29f29a3a8b3248b96bf 100644 (file)
@@ -175,7 +175,7 @@ static int sn_set_msi_irq_affinity(struct irq_data *data,
         * Release XIO resources for the old MSI PCI address
         */
 
-       __get_cached_msi_msg(data->msi_desc, &msg);
+       __get_cached_msi_msg(irq_data_get_msi_desc(data), &msg);
        sn_pdev = (struct pcidev_info *)sn_irq_info->irq_pciioinfo;
        pdev = sn_pdev->pdi_linux_pcidev;
        provider = SN_PCIDEV_BUSPROVIDER(pdev);
@@ -206,7 +206,7 @@ static int sn_set_msi_irq_affinity(struct irq_data *data,
        msg.address_lo = (u32)(bus_addr & 0x00000000ffffffff);
 
        pci_write_msi_msg(irq, &msg);
-       cpumask_copy(data->affinity, cpu_mask);
+       cpumask_copy(irq_data_get_affinity_mask(data), cpu_mask);
 
        return 0;
 }
index cffaaf4aae3cb294da6c62c6492e38aba21d2e26..2a5bb849b10efa742a82f8855708b4afcc8a9c4e 100644 (file)
@@ -200,7 +200,7 @@ int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        if (type == PCI_CAP_ID_MSI && nvec > 1)
                return 1;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                ret = arch_setup_msi_irq(dev, entry);
                if (ret < 0)
                        return ret;
index fe51de4fcf135a1d1b355efcd8c20915c3a1b80e..306888acb737a0d94a11fc70497b93e7c173e55d 100644 (file)
@@ -213,7 +213,7 @@ static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
                return -ENODEV;
        }
 
-       entry = list_first_entry(&dev->msi_list, struct msi_desc, list);
+       entry = first_pci_msi_entry(dev);
 
        for (; dn; dn = of_get_next_parent(dn)) {
                if (entry->msi_attrib.is_64) {
@@ -269,7 +269,7 @@ static int axon_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        if (rc)
                return rc;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                virq = irq_create_direct_mapping(msic->irq_domain);
                if (virq == NO_IRQ) {
                        dev_warn(&dev->dev,
@@ -292,7 +292,7 @@ static void axon_msi_teardown_msi_irqs(struct pci_dev *dev)
 
        dev_dbg(&dev->dev, "axon_msi: tearing down msi irqs\n");
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                if (entry->irq == NO_IRQ)
                        continue;
 
index 27f2b187a91b5a17a15f4630defab5216eaf3e2d..e66ef19433387854820e91a2b515d737fd7fd270 100644 (file)
@@ -66,7 +66,7 @@ static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
 
        pr_debug("pasemi_msi_teardown_msi_irqs, pdev %p\n", pdev);
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (entry->irq == NO_IRQ)
                        continue;
 
@@ -94,7 +94,7 @@ static int pasemi_msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        msg.address_hi = 0;
        msg.address_lo = PASEMI_MSI_ADDR;
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                /* Allocate 16 interrupts for now, since that's the grouping for
                 * affinity. This can be changed later if it turns out 32 is too
                 * few MSIs for someone, but restrictions will apply to how the
index 765d8ed558d0e16a6dddc16dc7d67d6b6b44b2ce..bc6d4e02e29c1dbc356d2722ba137234221d5a10 100644 (file)
@@ -61,7 +61,7 @@ int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        if (pdev->no_64bit_msi && !phb->msi32_support)
                return -ENODEV;
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (!entry->msi_attrib.is_64 && !phb->msi32_support) {
                        pr_warn("%s: Supports only 64-bit MSIs\n",
                                pci_name(pdev));
@@ -103,7 +103,7 @@ void pnv_teardown_msi_irqs(struct pci_dev *pdev)
        if (WARN_ON(!phb))
                return;
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (entry->irq == NO_IRQ)
                        continue;
                irq_set_msi_desc(entry->irq, NULL);
index c22bb647cce678cdc9eac5121d1efddeaf00e37e..272e9ec1ab54173b95db1c57f93dff60cf2276fe 100644 (file)
@@ -118,7 +118,7 @@ static void rtas_teardown_msi_irqs(struct pci_dev *pdev)
 {
        struct msi_desc *entry;
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (entry->irq == NO_IRQ)
                        continue;
 
@@ -350,7 +350,7 @@ static int check_msix_entries(struct pci_dev *pdev)
         * So we must reject such requests. */
 
        expected = 0;
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (entry->msi_attrib.entry_nr != expected) {
                        pr_debug("rtas_msi: bad MSI-X entries.\n");
                        return -EINVAL;
@@ -462,7 +462,7 @@ again:
        }
 
        i = 0;
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                hwirq = rtas_query_irq_number(pdn, i++);
                if (hwirq < 0) {
                        pr_debug("rtas_msi: error (%d) getting hwirq\n", rc);
index 5236e5427c38c2c922a2266a16ea4d172db3ef21..5916da1856a78d924230ede7353ed84a8b1fa8a0 100644 (file)
@@ -129,7 +129,7 @@ static void fsl_teardown_msi_irqs(struct pci_dev *pdev)
        struct msi_desc *entry;
        struct fsl_msi *msi_data;
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (entry->irq == NO_IRQ)
                        continue;
                msi_data = irq_get_chip_data(entry->irq);
@@ -219,7 +219,7 @@ static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
                }
        }
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                /*
                 * Loop over all the MSI devices until we find one that has an
                 * available interrupt.
index fc46ef3b816eb3ee6b0796775c4eb77b4e9bcbd5..70fbd5694a8bcd3c171bc9615edf14e86cdde7b1 100644 (file)
@@ -108,7 +108,7 @@ static void u3msi_teardown_msi_irqs(struct pci_dev *pdev)
 {
        struct msi_desc *entry;
 
-        list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                if (entry->irq == NO_IRQ)
                        continue;
 
@@ -140,7 +140,7 @@ static int u3msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
                return -ENXIO;
        }
 
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                hwirq = msi_bitmap_alloc_hwirqs(&msi_mpic->msi_bitmap, 1);
                if (hwirq < 0) {
                        pr_debug("u3msi: failed allocating hwirq\n");
index 87f9623ca805d6ba601919784df3c7e6d38e488f..af3c144b92c14ffd870d64a36558414287c799b2 100644 (file)
@@ -51,7 +51,7 @@ static int hsta_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
                return -EINVAL;
        }
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                irq = msi_bitmap_alloc_hwirqs(&ppc4xx_hsta_msi.bmp, 1);
                if (irq < 0) {
                        pr_debug("%s: Failed to allocate msi interrupt\n",
@@ -109,7 +109,7 @@ static void hsta_teardown_msi_irqs(struct pci_dev *dev)
        struct msi_desc *entry;
        int irq;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                if (entry->irq == NO_IRQ)
                        continue;
 
index 6eb21f2ea5857295d33bc5f9e8da87b7f0d9071f..24d0470c1698fb2bbbe81008e575ca54a35c33ce 100644 (file)
@@ -93,7 +93,7 @@ static int ppc4xx_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        if (!msi_data->msi_virqs)
                return -ENOMEM;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                int_no = msi_bitmap_alloc_hwirqs(&msi_data->bitmap, 1);
                if (int_no >= 0)
                        break;
@@ -127,7 +127,7 @@ void ppc4xx_teardown_msi_irqs(struct pci_dev *dev)
 
        dev_dbg(&dev->dev, "PCIE-MSI: tearing down msi irqs\n");
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                if (entry->irq == NO_IRQ)
                        continue;
                irq_set_msi_desc(entry->irq, NULL);
index 68c7e5cc98e09c3175b7e7ade03734887bc5c805..11ac964d51752f3ce4c55a9953b02e0ee9936e08 100644 (file)
@@ -72,7 +72,7 @@ static unsigned int ics_opal_startup(struct irq_data *d)
         * card, using the MSI mask bits. Firmware doesn't appear to unmask
         * at that level, so we do it here by hand.
         */
-       if (d->msi_desc)
+       if (irq_data_get_msi_desc(d))
                pci_msi_unmask_irq(d);
 #endif
 
index 0af97deb83f31db04c1d2f33612529a923c76a8a..d1c625c4cc5a4081686f2c83f7d2f0a51dbdd53e 100644 (file)
@@ -75,7 +75,7 @@ static unsigned int ics_rtas_startup(struct irq_data *d)
         * card, using the MSI mask bits. Firmware doesn't appear to unmask
         * at that level, so we do it here by hand.
         */
-       if (d->msi_desc)
+       if (irq_data_get_msi_desc(d))
                pci_msi_unmask_irq(d);
 #endif
        /* unmask it */
index 598f023cf8a6b9bf81634ea4db543f5b3bcb9884..34f16275340326540c68c07fcc72993e387f5e65 100644 (file)
@@ -414,7 +414,7 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
 
        /* Request MSI interrupts */
        hwirq = 0;
-       list_for_each_entry(msi, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(msi, pdev) {
                rc = -EIO;
                irq = irq_alloc_desc(0);        /* Alloc irq on node 0 */
                if (irq < 0)
@@ -440,7 +440,7 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        return (msi_vecs == nvec) ? 0 : msi_vecs;
 
 out_msi:
-       list_for_each_entry(msi, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(msi, pdev) {
                if (hwirq-- == 0)
                        break;
                irq_set_msi_desc(msi->irq, NULL);
@@ -470,7 +470,7 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev)
                return;
 
        /* Release MSI interrupts */
-       list_for_each_entry(msi, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(msi, pdev) {
                if (msi->msi_attrib.is_msix)
                        __pci_msix_desc_mask_irq(msi, 1);
                else
index 1087dba9b0152317c2b806ccd627db8ab4173f47..6f97a8f0d0d65718c09282fd146e8ca2d3a0c96e 100644 (file)
@@ -31,7 +31,7 @@ struct irq_domain *se7343_irq_domain;
 
 static void se7343_irq_demux(unsigned int irq, struct irq_desc *desc)
 {
-       struct irq_data *data = irq_get_irq_data(irq);
+       struct irq_data *data = irq_desc_get_irq_data(desc);
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        unsigned long mask;
        int bit;
index 00e699232621dccf9c67beaf3eb6d145c25f0d9b..60aebd14ccf8c5cd44e287d0ec958a78a136ca4f 100644 (file)
@@ -30,7 +30,7 @@ struct irq_domain *se7722_irq_domain;
 
 static void se7722_irq_demux(unsigned int irq, struct irq_desc *desc)
 {
-       struct irq_data *data = irq_get_irq_data(irq);
+       struct irq_data *data = irq_desc_get_irq_data(desc);
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        unsigned long mask;
        int bit;
index 5d1d3ec9a6cdd26de792e3538020fb7c45a9f073..9f20338986521ba2d81b89a5a2f3b3c9d3fdfcd8 100644 (file)
@@ -92,8 +92,9 @@ static struct irq_chip se7724_irq_chip __read_mostly = {
        .irq_unmask     = enable_se7724_irq,
 };
 
-static void se7724_irq_demux(unsigned int irq, struct irq_desc *desc)
+static void se7724_irq_demux(unsigned int __irq, struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct fpga_irq set = get_fpga_irq(irq);
        unsigned short intv = __raw_readw(set.sraddr);
        unsigned int ext_irq = set.base;
index f035a7ac6456213f94d0ddae409f8746d4b9b9f5..24555c364d5bccfd0ff4e8ffa737d757a421aa3f 100644 (file)
@@ -62,7 +62,7 @@ static int x3proto_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
 
 static void x3proto_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
-       struct irq_data *data = irq_get_irq_data(irq);
+       struct irq_data *data = irq_desc_get_irq_data(desc);
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        unsigned long mask;
        int pin;
index eb10ff84015c4c92f28e03756f90859705802d70..6c0378c0b8b5cc179cbf06269e94a02a5d1283c2 100644 (file)
@@ -227,16 +227,17 @@ void migrate_irqs(void)
        for_each_active_irq(irq) {
                struct irq_data *data = irq_get_irq_data(irq);
 
-               if (data->node == cpu) {
-                       unsigned int newcpu = cpumask_any_and(data->affinity,
+               if (irq_data_get_node(data) == cpu) {
+                       struct cpumask *mask = irq_data_get_affinity_mask(data);
+                       unsigned int newcpu = cpumask_any_and(mask,
                                                              cpu_online_mask);
                        if (newcpu >= nr_cpu_ids) {
                                pr_info_ratelimited("IRQ%u no longer affine to CPU%u\n",
                                                    irq, cpu);
 
-                               cpumask_setall(data->affinity);
+                               cpumask_setall(mask);
                        }
-                       irq_set_affinity(irq, data->affinity);
+                       irq_set_affinity(irq, mask);
                }
        }
 }
index c928bc64b4bac1b1c5eb88c71c348469796883c5..048b406d9e02af274facb987b3f3d981ca78b707 100644 (file)
@@ -918,7 +918,7 @@ int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
 void arch_teardown_msi_irq(unsigned int irq)
 {
        struct msi_desc *entry = irq_get_msi_desc(irq);
-       struct pci_dev *pdev = entry->dev;
+       struct pci_dev *pdev = msi_desc_to_pci_dev(entry);
        struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
 
        if (pbm->teardown_msi_irq)
index b1df847d0686706e455580293fe692255745282b..65b701b3b5ed09165cbedaad7ba5481397ffe099 100644 (file)
@@ -1442,7 +1442,7 @@ static struct pci_ops tile_cfg_ops = {
 /* MSI support starts here. */
 static unsigned int tilegx_msi_startup(struct irq_data *d)
 {
-       if (d->msi_desc)
+       if (irq_data_get_msi_desc(d))
                pci_msi_unmask_irq(d);
 
        return 0;
index d22f4b5bbc04d896088558b65026303e714f16c8..ff31ab464213fc49f21d0dde5bdcb14cc0763020 100644 (file)
@@ -179,7 +179,7 @@ static int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        if (ret)
                goto error;
        i = 0;
-       list_for_each_entry(msidesc, &dev->msi_list, list) {
+       for_each_pci_msi_entry(msidesc, dev) {
                irq = xen_bind_pirq_msi_to_irq(dev, msidesc, v[i],
                                               (type == PCI_CAP_ID_MSI) ? nvec : 1,
                                               (type == PCI_CAP_ID_MSIX) ?
@@ -230,7 +230,7 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        if (type == PCI_CAP_ID_MSI && nvec > 1)
                return 1;
 
-       list_for_each_entry(msidesc, &dev->msi_list, list) {
+       for_each_pci_msi_entry(msidesc, dev) {
                __pci_read_msi_msg(msidesc, &msg);
                pirq = MSI_ADDR_EXT_DEST_ID(msg.address_hi) |
                        ((msg.address_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
@@ -274,7 +274,7 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        int ret = 0;
        struct msi_desc *msidesc;
 
-       list_for_each_entry(msidesc, &dev->msi_list, list) {
+       for_each_pci_msi_entry(msidesc, dev) {
                struct physdev_map_pirq map_irq;
                domid_t domid;
 
@@ -386,7 +386,7 @@ static void xen_teardown_msi_irqs(struct pci_dev *dev)
 {
        struct msi_desc *msidesc;
 
-       msidesc = list_entry(dev->msi_list.next, struct msi_desc, list);
+       msidesc = first_pci_msi_entry(dev);
        if (msidesc->msi_attrib.is_msix)
                xen_pci_frontend_disable_msix(dev);
        else
index 3eee94f621ebd723195d326965cb6afc6998c85f..d7b5a4c8ae5d9b6efa5dc1b223b5098cdad322dc 100644 (file)
@@ -166,23 +166,25 @@ void migrate_irqs(void)
 
        for_each_active_irq(i) {
                struct irq_data *data = irq_get_irq_data(i);
+               struct cpumask *mask;
                unsigned int newcpu;
 
                if (irqd_is_per_cpu(data))
                        continue;
 
-               if (!cpumask_test_cpu(cpu, data->affinity))
+               mask = irq_data_get_affinity_mask(data);
+               if (!cpumask_test_cpu(cpu, mask))
                        continue;
 
-               newcpu = cpumask_any_and(data->affinity, cpu_online_mask);
+               newcpu = cpumask_any_and(mask, cpu_online_mask);
 
                if (newcpu >= nr_cpu_ids) {
                        pr_info_ratelimited("IRQ%u no longer affine to CPU%u\n",
                                            i, cpu);
 
-                       cpumask_setall(data->affinity);
+                       cpumask_setall(mask);
                }
-               irq_set_affinity(i, data->affinity);
+               irq_set_affinity(i, mask);
        }
 }
 #endif /* CONFIG_HOTPLUG_CPU */
index dafae6d2f7ace1fd2941fcbc26ca50fa6450b0f9..18e2a89aa138945cf1154cfa1c1c2c71546a89b0 100644 (file)
@@ -662,6 +662,9 @@ void device_initialize(struct device *dev)
        INIT_LIST_HEAD(&dev->devres_head);
        device_pm_init(dev);
        set_dev_node(dev, -1);
+#ifdef CONFIG_GENERIC_MSI_IRQ
+       INIT_LIST_HEAD(&dev->msi_list);
+#endif
 }
 EXPORT_SYMBOL_GPL(device_initialize);
 
index 5c82e3bdafdf0f61f054b7ea14144346a4390002..e9c6f2a5b52de0958ec334f0a011f3883edf6bf3 100644 (file)
 #include <linux/slab.h>
 #include <linux/syscore_ops.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/interrupt.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 
-#include "irqchip.h"
-
 #define COMBINER_ENABLE_SET    0x0
 #define COMBINER_ENABLE_CLEAR  0x4
 #define COMBINER_INT_STATUS    0xC
@@ -66,10 +65,12 @@ static void combiner_unmask_irq(struct irq_data *data)
        __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET);
 }
 
-static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
+static void combiner_handle_cascade_irq(unsigned int __irq,
+                                       struct irq_desc *desc)
 {
-       struct combiner_chip_data *chip_data = irq_get_handler_data(irq);
-       struct irq_chip *chip = irq_get_chip(irq);
+       struct combiner_chip_data *chip_data = irq_desc_get_handler_data(desc);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
+       unsigned int irq = irq_desc_get_irq(desc);
        unsigned int cascade_irq, combiner_irq;
        unsigned long status;
 
@@ -122,9 +123,8 @@ static struct irq_chip combiner_chip = {
 static void __init combiner_cascade_irq(struct combiner_chip_data *combiner_data,
                                        unsigned int irq)
 {
-       if (irq_set_handler_data(irq, combiner_data) != 0)
-               BUG();
-       irq_set_chained_handler(irq, combiner_handle_cascade_irq);
+       irq_set_chained_handler_and_data(irq, combiner_handle_cascade_irq,
+                                        combiner_data);
 }
 
 static void __init combiner_init_one(struct combiner_chip_data *combiner_data,
@@ -185,14 +185,14 @@ static void __init combiner_init(void __iomem *combiner_base,
 
        combiner_data = kcalloc(max_nr, sizeof (*combiner_data), GFP_KERNEL);
        if (!combiner_data) {
-               pr_warning("%s: could not allocate combiner data\n", __func__);
+               pr_warn("%s: could not allocate combiner data\n", __func__);
                return;
        }
 
        combiner_irq_domain = irq_domain_add_linear(np, nr_irq,
                                &combiner_irq_domain_ops, combiner_data);
        if (WARN_ON(!combiner_irq_domain)) {
-               pr_warning("%s: irq domain init failed\n", __func__);
+               pr_warn("%s: irq domain init failed\n", __func__);
                return;
        }
 
index 0d3b0fe2f175e89912db13bc38e6d7235d60d835..39b72da0c1437fc4caf658a85c0e2ba62dc70694 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/cpu.h>
 #include <linux/io.h>
@@ -33,8 +34,6 @@
 #include <asm/smp_plat.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 /* Interrupt Controller Registers Map */
 #define ARMADA_370_XP_INT_SET_MASK_OFFS                (0x48)
 #define ARMADA_370_XP_INT_CLEAR_MASK_OFFS      (0x4C)
@@ -451,7 +450,7 @@ static void armada_370_xp_handle_msi_irq(struct pt_regs *r, bool b) {}
 static void armada_370_xp_mpic_handle_cascade_irq(unsigned int irq,
                                                  struct irq_desc *desc)
 {
-       struct irq_chip *chip = irq_get_chip(irq);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
        unsigned long irqmap, irqn, irqsrc, cpuid;
        unsigned int cascade_irq;
 
index dae3604b32a900ab71c0d098eb4790a4ff4e4af7..8a0c7f28819841a83e1afb0e3eccf71d4aa287a7 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/bitmap.h>
 #include <linux/types.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -31,7 +32,6 @@
 #include <asm/mach/irq.h>
 
 #include "irq-atmel-aic-common.h"
-#include "irqchip.h"
 
 /* Number of irq lines managed by AIC */
 #define NR_AIC_IRQS    32
@@ -225,7 +225,7 @@ static void __init at91sam9g45_aic_irq_fixup(struct device_node *root)
        aic_common_rtt_irq_fixup(root);
 }
 
-static const struct of_device_id __initdata aic_irq_fixups[] = {
+static const struct of_device_id aic_irq_fixups[] __initconst = {
        { .compatible = "atmel,at91rm9200", .data = at91rm9200_aic_irq_fixup },
        { .compatible = "atmel,at91sam9g45", .data = at91sam9g45_aic_irq_fixup },
        { .compatible = "atmel,at91sam9n12", .data = at91rm9200_aic_irq_fixup },
index 459bf4429d365794d4f84c19116cb0d57755c646..9da9942ac83c9e4ce861e193061f0f29df8b5700 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/bitmap.h>
 #include <linux/types.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -31,7 +32,6 @@
 #include <asm/mach/irq.h>
 
 #include "irq-atmel-aic-common.h"
-#include "irqchip.h"
 
 /* Number of irq lines managed by AIC */
 #define NR_AIC5_IRQS   128
@@ -290,7 +290,7 @@ static void __init sama5d3_aic_irq_fixup(struct device_node *root)
        aic_common_rtc_irq_fixup(root);
 }
 
-static const struct of_device_id __initdata aic5_irq_fixups[] = {
+static const struct of_device_id aic5_irq_fixups[] __initconst = {
        { .compatible = "atmel,sama5d3", .data = sama5d3_aic_irq_fixup },
        { .compatible = "atmel,sama5d4", .data = sama5d3_aic_irq_fixup },
        { /* sentinel */ },
index e68c3b60a681ba460b24dd17499de544ea4a35fc..ca35171e8afc511a0c033e851f4bc1f30d0c80b6 100644 (file)
 #include <linux/slab.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 /* Put the bank and irq (32 bits) into the hwirq */
 #define MAKE_HWIRQ(b, n)       ((b << 5) | (n))
 #define HWIRQ_BANK(i)          (i >> 5)
 #define NR_BANKS               3
 #define IRQS_PER_BANK          32
 
-static int reg_pending[] __initconst = { 0x00, 0x04, 0x08 };
-static int reg_enable[] __initconst = { 0x18, 0x10, 0x14 };
-static int reg_disable[] __initconst = { 0x24, 0x1c, 0x20 };
-static int bank_irqs[] __initconst = { 8, 32, 32 };
+static const int reg_pending[] __initconst = { 0x00, 0x04, 0x08 };
+static const int reg_enable[] __initconst = { 0x18, 0x10, 0x14 };
+static const int reg_disable[] __initconst = { 0x24, 0x1c, 0x20 };
+static const int bank_irqs[] __initconst = { 8, 32, 32 };
 
 static const int shortcuts[] = {
        7, 9, 10, 18, 19,               /* Bank 1 */
index d3b8c8be15f67460023b7483b69ced1050aa2a08..409bdc6366c20a3ba909aae5b770dfe71dac08d9 100644 (file)
 #include <linux/slab.h>
 #include <linux/smp.h>
 #include <linux/types.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 
-#include "irqchip.h"
-
 #define IRQS_PER_WORD          32
 #define REG_BYTES_PER_IRQ_WORD (sizeof(u32) * 4)
 #define MAX_WORDS              8
@@ -257,8 +256,8 @@ static int __init bcm7038_l1_init_one(struct device_node *dn,
                pr_err("failed to map parent interrupt %d\n", parent_irq);
                return -EINVAL;
        }
-       irq_set_handler_data(parent_irq, intc);
-       irq_set_chained_handler(parent_irq, bcm7038_l1_irq_handle);
+       irq_set_chained_handler_and_data(parent_irq, bcm7038_l1_irq_handle,
+                                        intc);
 
        return 0;
 }
index 3ba5cc780fcbbba4568db2557df8828b63d5d4d9..d3f976913a6fbd9bb2af3ff4c4b1e906f5bae61e 100644 (file)
 #include <linux/irqdomain.h>
 #include <linux/reboot.h>
 #include <linux/bitops.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 
-#include "irqchip.h"
-
 /* Register offset in the L2 interrupt controller */
 #define IRQEN          0x00
 #define IRQSTAT                0x04
 #define MAX_MAPPINGS   (MAX_WORDS * 2)
 #define IRQS_PER_WORD  32
 
+struct bcm7120_l1_intc_data {
+       struct bcm7120_l2_intc_data *b;
+       u32 irq_map_mask[MAX_WORDS];
+};
+
 struct bcm7120_l2_intc_data {
        unsigned int n_words;
        void __iomem *map_base[MAX_MAPPINGS];
@@ -47,14 +51,15 @@ struct bcm7120_l2_intc_data {
        struct irq_domain *domain;
        bool can_wake;
        u32 irq_fwd_mask[MAX_WORDS];
-       u32 irq_map_mask[MAX_WORDS];
+       struct bcm7120_l1_intc_data *l1_data;
        int num_parent_irqs;
        const __be32 *map_mask_prop;
 };
 
 static void bcm7120_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc)
 {
-       struct bcm7120_l2_intc_data *b = irq_desc_get_handler_data(desc);
+       struct bcm7120_l1_intc_data *data = irq_desc_get_handler_data(desc);
+       struct bcm7120_l2_intc_data *b = data->b;
        struct irq_chip *chip = irq_desc_get_chip(desc);
        unsigned int idx;
 
@@ -69,7 +74,8 @@ static void bcm7120_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc)
 
                irq_gc_lock(gc);
                pending = irq_reg_readl(gc, b->stat_offset[idx]) &
-                                           gc->mask_cache;
+                                           gc->mask_cache &
+                                           data->irq_map_mask[idx];
                irq_gc_unlock(gc);
 
                for_each_set_bit(hwirq, &pending, IRQS_PER_WORD) {
@@ -81,11 +87,10 @@ static void bcm7120_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc)
        chained_irq_exit(chip, desc);
 }
 
-static void bcm7120_l2_intc_suspend(struct irq_data *d)
+static void bcm7120_l2_intc_suspend(struct irq_chip_generic *gc)
 {
-       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
-       struct irq_chip_type *ct = irq_data_get_chip_type(d);
        struct bcm7120_l2_intc_data *b = gc->private;
+       struct irq_chip_type *ct = gc->chip_types;
 
        irq_gc_lock(gc);
        if (b->can_wake)
@@ -94,10 +99,9 @@ static void bcm7120_l2_intc_suspend(struct irq_data *d)
        irq_gc_unlock(gc);
 }
 
-static void bcm7120_l2_intc_resume(struct irq_data *d)
+static void bcm7120_l2_intc_resume(struct irq_chip_generic *gc)
 {
-       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
-       struct irq_chip_type *ct = irq_data_get_chip_type(d);
+       struct irq_chip_type *ct = gc->chip_types;
 
        /* Restore the saved mask */
        irq_gc_lock(gc);
@@ -107,8 +111,9 @@ static void bcm7120_l2_intc_resume(struct irq_data *d)
 
 static int bcm7120_l2_intc_init_one(struct device_node *dn,
                                        struct bcm7120_l2_intc_data *data,
-                                       int irq)
+                                       int irq, u32 *valid_mask)
 {
+       struct bcm7120_l1_intc_data *l1_data = &data->l1_data[irq];
        int parent_irq;
        unsigned int idx;
 
@@ -120,20 +125,28 @@ static int bcm7120_l2_intc_init_one(struct device_node *dn,
 
        /* For multiple parent IRQs with multiple words, this looks like:
         * <irq0_w0 irq0_w1 irq1_w0 irq1_w1 ...>
+        *
+        * We need to associate a given parent interrupt with its corresponding
+        * map_mask in order to mask the status register with it because we
+        * have the same handler being called for multiple parent interrupts.
+        *
+        * This is typically something needed on BCM7xxx (STB chips).
         */
        for (idx = 0; idx < data->n_words; idx++) {
                if (data->map_mask_prop) {
-                       data->irq_map_mask[idx] |=
+                       l1_data->irq_map_mask[idx] |=
                                be32_to_cpup(data->map_mask_prop +
                                             irq * data->n_words + idx);
                } else {
-                       data->irq_map_mask[idx] = 0xffffffff;
+                       l1_data->irq_map_mask[idx] = 0xffffffff;
                }
+               valid_mask[idx] |= l1_data->irq_map_mask[idx];
        }
 
-       irq_set_handler_data(parent_irq, data);
-       irq_set_chained_handler(parent_irq, bcm7120_l2_intc_irq_handle);
+       l1_data->b = data;
 
+       irq_set_chained_handler_and_data(parent_irq,
+                                        bcm7120_l2_intc_irq_handle, l1_data);
        return 0;
 }
 
@@ -214,6 +227,7 @@ int __init bcm7120_l2_intc_probe(struct device_node *dn,
        struct irq_chip_type *ct;
        int ret = 0;
        unsigned int idx, irq, flags;
+       u32 valid_mask[MAX_WORDS] = { };
 
        data = kzalloc(sizeof(*data), GFP_KERNEL);
        if (!data)
@@ -226,9 +240,16 @@ int __init bcm7120_l2_intc_probe(struct device_node *dn,
                goto out_unmap;
        }
 
+       data->l1_data = kcalloc(data->num_parent_irqs, sizeof(*data->l1_data),
+                               GFP_KERNEL);
+       if (!data->l1_data) {
+               ret = -ENOMEM;
+               goto out_free_l1_data;
+       }
+
        ret = iomap_regs_fn(dn, data);
        if (ret < 0)
-               goto out_unmap;
+               goto out_free_l1_data;
 
        for (idx = 0; idx < data->n_words; idx++) {
                __raw_writel(data->irq_fwd_mask[idx],
@@ -237,16 +258,16 @@ int __init bcm7120_l2_intc_probe(struct device_node *dn,
        }
 
        for (irq = 0; irq < data->num_parent_irqs; irq++) {
-               ret = bcm7120_l2_intc_init_one(dn, data, irq);
+               ret = bcm7120_l2_intc_init_one(dn, data, irq, valid_mask);
                if (ret)
-                       goto out_unmap;
+                       goto out_free_l1_data;
        }
 
        data->domain = irq_domain_add_linear(dn, IRQS_PER_WORD * data->n_words,
                                             &irq_generic_chip_ops, NULL);
        if (!data->domain) {
                ret = -ENOMEM;
-               goto out_unmap;
+               goto out_free_l1_data;
        }
 
        /* MIPS chips strapped for BE will automagically configure the
@@ -270,7 +291,7 @@ int __init bcm7120_l2_intc_probe(struct device_node *dn,
                irq = idx * IRQS_PER_WORD;
                gc = irq_get_domain_generic_chip(data->domain, irq);
 
-               gc->unused = 0xffffffff & ~data->irq_map_mask[idx];
+               gc->unused = 0xffffffff & ~valid_mask[idx];
                gc->private = data;
                ct = gc->chip_types;
 
@@ -280,8 +301,15 @@ int __init bcm7120_l2_intc_probe(struct device_node *dn,
                ct->chip.irq_mask = irq_gc_mask_clr_bit;
                ct->chip.irq_unmask = irq_gc_mask_set_bit;
                ct->chip.irq_ack = irq_gc_noop;
-               ct->chip.irq_suspend = bcm7120_l2_intc_suspend;
-               ct->chip.irq_resume = bcm7120_l2_intc_resume;
+               gc->suspend = bcm7120_l2_intc_suspend;
+               gc->resume = bcm7120_l2_intc_resume;
+
+               /*
+                * Initialize mask-cache, in case we need it for
+                * saving/restoring fwd mask even w/o any child interrupts
+                * installed
+                */
+               gc->mask_cache = irq_reg_readl(gc, ct->regs.mask);
 
                if (data->can_wake) {
                        /* This IRQ chip can wake the system, set all
@@ -300,6 +328,8 @@ int __init bcm7120_l2_intc_probe(struct device_node *dn,
 
 out_free_domain:
        irq_domain_remove(data->domain);
+out_free_l1_data:
+       kfree(data->l1_data);
 out_unmap:
        for (idx = 0; idx < MAX_MAPPINGS; idx++) {
                if (data->map_base[idx])
index d6bcc6be077777551bf5a970938d3703fdc477d0..aedda06191eb08cdf0a688a9a7fbe63959e021f1 100644 (file)
@@ -32,8 +32,6 @@
 #include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 
-#include "irqchip.h"
-
 /* Register offsets in the L2 interrupt controller */
 #define CPU_STATUS     0x00
 #define CPU_SET                0x04
@@ -51,11 +49,13 @@ struct brcmstb_l2_intc_data {
        u32 saved_mask; /* for suspend/resume */
 };
 
-static void brcmstb_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc)
+static void brcmstb_l2_intc_irq_handle(unsigned int __irq,
+                                      struct irq_desc *desc)
 {
        struct brcmstb_l2_intc_data *b = irq_desc_get_handler_data(desc);
        struct irq_chip_generic *gc = irq_get_domain_generic_chip(b->domain, 0);
        struct irq_chip *chip = irq_desc_get_chip(desc);
+       unsigned int irq = irq_desc_get_irq(desc);
        u32 status;
 
        chained_irq_enter(chip, desc);
@@ -172,8 +172,8 @@ int __init brcmstb_l2_intc_of_init(struct device_node *np,
        }
 
        /* Set the IRQ chaining logic */
-       irq_set_handler_data(data->parent_irq, data);
-       irq_set_chained_handler(data->parent_irq, brcmstb_l2_intc_irq_handle);
+       irq_set_chained_handler_and_data(data->parent_irq,
+                                        brcmstb_l2_intc_irq_handle, data);
 
        gc = irq_get_domain_generic_chip(data->domain, 0);
        gc->reg_base = data->base;
index 33127f131d7840b0c0ec4c8ca15b0aa46b9ab5ba..2dd929eed9e0516fca48845f83720578622609be 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -19,8 +20,6 @@
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 #define CLPS711X_INTSR1        (0x0240)
 #define CLPS711X_INTMR1        (0x0280)
 #define CLPS711X_BLEOI (0x0600)
index 692fe2bc81979b6b48f984ec6d88c117fbfdebdd..1240c4deda7517d63c789e53d49951ed82336452 100644 (file)
  */
 #include <linux/err.h>
 #include <linux/io.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/slab.h>
 
-#include "irqchip.h"
-
 #define IRQ_FREE       -1
 #define IRQ_RESERVED   -2
 #define IRQ_SKIP       -3
index 3cbc658afe27a4f7d28875373a1816afad86ac8b..dad85e74c37c051c02ea1b859db6aa5e66047731 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -20,8 +21,6 @@
 
 #include <asm/exception.h>
 
-#include "irqchip.h"
-
 #define UC_IRQ_CONTROL         0x04
 
 #define IC_FLAG_CLEAR_LO       0x00
index 53bb7326a60a6a597c159032627daa7d46d8ffe9..efd95d9955e7e3b5a0be532f36fa64c8a7c4da47 100644 (file)
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 
-#include "irqchip.h"
-
 #define APB_INT_ENABLE_L       0x00
 #define APB_INT_ENABLE_H       0x04
 #define APB_INT_MASK_L         0x08
 #define APB_INT_MASK_H         0x0c
 #define APB_INT_FINALSTATUS_L  0x30
 #define APB_INT_FINALSTATUS_H  0x34
+#define APB_INT_BASE_OFFSET    0x04
 
 static void dw_apb_ictl_handler(unsigned int irq, struct irq_desc *desc)
 {
-       struct irq_chip *chip = irq_get_chip(irq);
-       struct irq_chip_generic *gc = irq_get_handler_data(irq);
-       struct irq_domain *d = gc->private;
-       u32 stat;
+       struct irq_domain *d = irq_desc_get_handler_data(desc);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
        int n;
 
        chained_irq_enter(chip, desc);
 
-       for (n = 0; n < gc->num_ct; n++) {
-               stat = readl_relaxed(gc->reg_base +
-                                    APB_INT_FINALSTATUS_L + 4 * n);
+       for (n = 0; n < d->revmap_size; n += 32) {
+               struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, n);
+               u32 stat = readl_relaxed(gc->reg_base + APB_INT_FINALSTATUS_L);
+
                while (stat) {
                        u32 hwirq = ffs(stat) - 1;
-                       generic_handle_irq(irq_find_mapping(d,
-                                           gc->irq_base + hwirq + 32 * n));
+                       u32 virq = irq_find_mapping(d, gc->irq_base + hwirq);
+
+                       generic_handle_irq(virq);
                        stat &= ~(1 << hwirq);
                }
        }
@@ -73,7 +73,7 @@ static int __init dw_apb_ictl_init(struct device_node *np,
        struct irq_domain *domain;
        struct irq_chip_generic *gc;
        void __iomem *iobase;
-       int ret, nrirqs, irq;
+       int ret, nrirqs, irq, i;
        u32 reg;
 
        /* Map the parent interrupt for the chained handler */
@@ -128,35 +128,25 @@ static int __init dw_apb_ictl_init(struct device_node *np,
                goto err_unmap;
        }
 
-       ret = irq_alloc_domain_generic_chips(domain, 32, (nrirqs > 32) ? 2 : 1,
-                                            np->name, handle_level_irq, clr, 0,
-                                            IRQ_GC_MASK_CACHE_PER_TYPE |
+       ret = irq_alloc_domain_generic_chips(domain, 32, 1, np->name,
+                                            handle_level_irq, clr, 0,
                                             IRQ_GC_INIT_MASK_CACHE);
        if (ret) {
                pr_err("%s: unable to alloc irq domain gc\n", np->full_name);
                goto err_unmap;
        }
 
-       gc = irq_get_domain_generic_chip(domain, 0);
-       gc->private = domain;
-       gc->reg_base = iobase;
-
-       gc->chip_types[0].regs.mask = APB_INT_MASK_L;
-       gc->chip_types[0].regs.enable = APB_INT_ENABLE_L;
-       gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit;
-       gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit;
-       gc->chip_types[0].chip.irq_resume = dw_apb_ictl_resume;
-
-       if (nrirqs > 32) {
-               gc->chip_types[1].regs.mask = APB_INT_MASK_H;
-               gc->chip_types[1].regs.enable = APB_INT_ENABLE_H;
-               gc->chip_types[1].chip.irq_mask = irq_gc_mask_set_bit;
-               gc->chip_types[1].chip.irq_unmask = irq_gc_mask_clr_bit;
-               gc->chip_types[1].chip.irq_resume = dw_apb_ictl_resume;
+       for (i = 0; i < DIV_ROUND_UP(nrirqs, 32); i++) {
+               gc = irq_get_domain_generic_chip(domain, i * 32);
+               gc->reg_base = iobase + i * APB_INT_BASE_OFFSET;
+               gc->chip_types[0].regs.mask = APB_INT_MASK_L;
+               gc->chip_types[0].regs.enable = APB_INT_ENABLE_L;
+               gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit;
+               gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit;
+               gc->chip_types[0].chip.irq_resume = dw_apb_ictl_resume;
        }
 
-       irq_set_handler_data(irq, gc);
-       irq_set_chained_handler(irq, dw_apb_ictl_handler);
+       irq_set_chained_handler_and_data(irq, dw_apb_ictl_handler, domain);
 
        return 0;
 
index c00e2db351ba5aec327ebb1e98085b25b9b4d056..1df956afb9379f64ca11a7312478d8ce705f3e2e 100644 (file)
 #include <linux/percpu.h>
 #include <linux/slab.h>
 
+#include <linux/irqchip.h>
 #include <linux/irqchip/arm-gic-v3.h>
 
 #include <asm/cacheflush.h>
 #include <asm/cputype.h>
 #include <asm/exception.h>
 
-#include "irqchip.h"
-
 #define ITS_FLAGS_CMDQ_NEEDS_FLUSHING          (1 << 0)
 
 #define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING    (1 << 0)
index c52f7ba205b4c872205323868ecf0349f8174b20..e406bc5f13e4f10083ff2d91aa9d81785a8cc2fe 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/percpu.h>
 #include <linux/slab.h>
 
+#include <linux/irqchip.h>
 #include <linux/irqchip/arm-gic-v3.h>
 
 #include <asm/cputype.h>
@@ -32,7 +33,6 @@
 #include <asm/smp_plat.h>
 
 #include "irq-gic-common.h"
-#include "irqchip.h"
 
 struct redist_region {
        void __iomem            *redist_base;
index 4dd88264dff55c0c95efd813c82fe762d7216263..29c544d0aaa9259fec6876f5b8bba5b725c75123 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/interrupt.h>
 #include <linux/percpu.h>
 #include <linux/slab.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqchip/arm-gic.h>
 #include <linux/irqchip/arm-gic-acpi.h>
@@ -48,7 +49,6 @@
 #include <asm/smp_plat.h>
 
 #include "irq-gic-common.h"
-#include "irqchip.h"
 
 union gic_base {
        void __iomem *common_base;
@@ -288,8 +288,8 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
 
 static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
 {
-       struct gic_chip_data *chip_data = irq_get_handler_data(irq);
-       struct irq_chip *chip = irq_get_chip(irq);
+       struct gic_chip_data *chip_data = irq_desc_get_handler_data(desc);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
        unsigned int cascade_irq, gic_irq;
        unsigned long status;
 
@@ -324,16 +324,17 @@ static struct irq_chip gic_chip = {
 #endif
        .irq_get_irqchip_state  = gic_irq_get_irqchip_state,
        .irq_set_irqchip_state  = gic_irq_set_irqchip_state,
-       .flags                  = IRQCHIP_SET_TYPE_MASKED,
+       .flags                  = IRQCHIP_SET_TYPE_MASKED |
+                                 IRQCHIP_SKIP_SET_WAKE |
+                                 IRQCHIP_MASK_ON_SUSPEND,
 };
 
 void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
 {
        if (gic_nr >= MAX_GIC_NR)
                BUG();
-       if (irq_set_handler_data(irq, &gic_data[gic_nr]) != 0)
-               BUG();
-       irq_set_chained_handler(irq, gic_handle_cascade_irq);
+       irq_set_chained_handler_and_data(irq, gic_handle_cascade_irq,
+                                        &gic_data[gic_nr]);
 }
 
 static u8 gic_get_cpumask(struct gic_chip_data *gic)
@@ -880,11 +881,6 @@ static const struct irq_domain_ops gic_irq_domain_ops = {
        .xlate = gic_irq_domain_xlate,
 };
 
-void gic_set_irqchip_flags(unsigned long flags)
-{
-       gic_chip.flags |= flags;
-}
-
 void __init gic_init_bases(unsigned int gic_nr, int irq_start,
                           void __iomem *dist_base, void __iomem *cpu_base,
                           u32 percpu_offset, struct device_node *node)
index 0cae45d106950783108b60c31432a9149e75f638..a0128c7c98dd5d6e62335894b3369a2709856248 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/irqdomain.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/arm-gic.h>
 
 #include <asm/irq.h>
@@ -48,7 +49,6 @@
 #include <asm/smp_plat.h>
 
 #include "irq-gic-common.h"
-#include "irqchip.h"
 
 #define HIP04_MAX_IRQS         510
 
@@ -202,7 +202,9 @@ static struct irq_chip hip04_irq_chip = {
 #ifdef CONFIG_SMP
        .irq_set_affinity       = hip04_irq_set_affinity,
 #endif
-       .flags                  = IRQCHIP_SET_TYPE_MASKED,
+       .flags                  = IRQCHIP_SET_TYPE_MASKED |
+                                 IRQCHIP_SKIP_SET_WAKE |
+                                 IRQCHIP_MASK_ON_SUSPEND,
 };
 
 static u16 hip04_get_cpumask(struct hip04_irq_data *intc)
index 8071c2eb02487f2f6a681f0ad2b62df01b418d58..841604b81004f415473a91f970ae74a02d3a8052 100644 (file)
@@ -218,8 +218,9 @@ static int pdc_irq_set_wake(struct irq_data *data, unsigned int on)
        return 0;
 }
 
-static void pdc_intc_perip_isr(unsigned int irq, struct irq_desc *desc)
+static void pdc_intc_perip_isr(unsigned int __irq, struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct pdc_intc_priv *priv;
        unsigned int i, irq_no;
 
@@ -451,13 +452,13 @@ static int pdc_intc_probe(struct platform_device *pdev)
        /* Setup chained handlers for the peripheral IRQs */
        for (i = 0; i < priv->nr_perips; ++i) {
                irq = priv->perip_irqs[i];
-               irq_set_handler_data(irq, priv);
-               irq_set_chained_handler(irq, pdc_intc_perip_isr);
+               irq_set_chained_handler_and_data(irq, pdc_intc_perip_isr,
+                                                priv);
        }
 
        /* Setup chained handler for the syswake IRQ */
-       irq_set_handler_data(priv->syswake_irq, priv);
-       irq_set_chained_handler(priv->syswake_irq, pdc_intc_syswake_isr);
+       irq_set_chained_handler_and_data(priv->syswake_irq,
+                                        pdc_intc_syswake_isr, priv);
 
        dev_info(&pdev->dev,
                 "PDC IRQ controller initialised (%u perip IRQs, %u syswake IRQs)\n",
index 005de3f932ae8807a2a7af66a40c2c421e425996..fc5953dea509af10b38abf783dac4fbd83efdaaa 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/ingenic.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -28,8 +29,6 @@
 #include <asm/io.h>
 #include <asm/mach-jz4740/irq.h>
 
-#include "irqchip.h"
-
 struct ingenic_intc_data {
        void __iomem *base;
        unsigned num_chips;
index 81e3cf5b9a1faa07ddbb1ab52b714aa08e0a4e09..c1517267b5dbcf48aac50c9930db4c54cec762ae 100644 (file)
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/mfd/syscon.h>
 #include <linux/regmap.h>
-#include "irqchip.h"
-
 
 /* The source ID bits start from 4 to 31 (total 28 bits)*/
 #define BIT_OFS                        4
@@ -84,8 +83,9 @@ static void keystone_irq_ack(struct irq_data *d)
        /* nothing to do here */
 }
 
-static void keystone_irq_handler(unsigned irq, struct irq_desc *desc)
+static void keystone_irq_handler(unsigned __irq, struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct keystone_irq_device *kirq = irq_desc_get_handler_data(desc);
        unsigned long pending;
        int src, virq;
index 2cb474ad8809faa2fadaf5b08a7b06b087e73794..5f4c52928d1671b99cfc759552562bd5b8d09691 100644 (file)
@@ -404,7 +404,6 @@ static int meta_intc_irq_set_type(struct irq_data *data, unsigned int flow_type)
 #ifdef CONFIG_METAG_SUSPEND_MEM
        struct meta_intc_priv *priv = &meta_intc_priv;
 #endif
-       unsigned int irq = data->irq;
        irq_hw_number_t hw = data->hwirq;
        unsigned int bit = 1 << meta_intc_offset(hw);
        void __iomem *level_addr = meta_intc_level_addr(hw);
@@ -413,11 +412,11 @@ static int meta_intc_irq_set_type(struct irq_data *data, unsigned int flow_type)
 
        /* update the chip/handler */
        if (flow_type & IRQ_TYPE_LEVEL_MASK)
-               __irq_set_chip_handler_name_locked(irq, &meta_intc_level_chip,
-                                                  handle_level_irq, NULL);
+               irq_set_chip_handler_name_locked(data, &meta_intc_level_chip,
+                                                handle_level_irq, NULL);
        else
-               __irq_set_chip_handler_name_locked(irq, &meta_intc_edge_chip,
-                                                  handle_edge_irq, NULL);
+               irq_set_chip_handler_name_locked(data, &meta_intc_edge_chip,
+                                                handle_edge_irq, NULL);
 
        /* and clear/set the bit in HWLEVELEXT */
        __global_lock2(flags);
index c16c186d97d35f4246fa2acbd17942789922d6d7..3d23ce3edb5cccc8b50073af72633e0b3b3ed11f 100644 (file)
@@ -286,8 +286,7 @@ static void metag_internal_irq_init_cpu(struct metag_internal_irq_priv *priv,
        int irq = tbisig_map(signum);
 
        /* Register the multiplexed IRQ handler */
-       irq_set_handler_data(irq, priv);
-       irq_set_chained_handler(irq, metag_internal_irq_demux);
+       irq_set_chained_handler_and_data(irq, metag_internal_irq_demux, priv);
        irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
 }
 
index a43c41988009c644400a164b7e893e2621d54568..8c504f562e9dcdb5c5fd2a9b88ab591dd763782c 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 
 #include <asm/irq_cpu.h>
@@ -38,8 +39,6 @@
 #include <asm/mipsmtregs.h>
 #include <asm/setup.h>
 
-#include "irqchip.h"
-
 static inline void unmask_mips_irq(struct irq_data *d)
 {
        set_c0_status(0x100 << (d->irq - MIPS_CPU_IRQ_BASE));
index b7d54d428b5e55d1520d52e68b95202593cf4b53..2d36eca76bef82aa2b88d725cc8a4cb6e25e6fd6 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/mips-gic.h>
 #include <linux/of_address.h>
 #include <linux/sched.h>
@@ -22,8 +23,6 @@
 
 #include <dt-bindings/interrupt-controller/mips-gic.h>
 
-#include "irqchip.h"
-
 unsigned int gic_present;
 
 struct gic_pcpu_mask {
@@ -358,15 +357,12 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
                break;
        }
 
-       if (is_edge) {
-               __irq_set_chip_handler_name_locked(d->irq,
-                                                  &gic_edge_irq_controller,
-                                                  handle_edge_irq, NULL);
-       } else {
-               __irq_set_chip_handler_name_locked(d->irq,
-                                                  &gic_level_irq_controller,
-                                                  handle_level_irq, NULL);
-       }
+       if (is_edge)
+               irq_set_chip_handler_name_locked(d, &gic_edge_irq_controller,
+                                                handle_edge_irq, NULL);
+       else
+               irq_set_chip_handler_name_locked(d, &gic_level_irq_controller,
+                                                handle_level_irq, NULL);
        spin_unlock_irqrestore(&gic_lock, flags);
 
        return 0;
@@ -396,7 +392,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
                clear_bit(irq, pcpu_masks[i].pcpu_mask);
        set_bit(irq, pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
 
-       cpumask_copy(d->affinity, cpumask);
+       cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
        spin_unlock_irqrestore(&gic_lock, flags);
 
        return IRQ_SET_MASK_OK_NOCOPY;
index c0da57bdb89dfcf0c0e2224180715989a88086a6..781ed6e71dbb3d1343440229b725db4e5eca3e1b 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/io.h>
 #include <linux/ioport.h>
@@ -24,8 +25,6 @@
 #include <asm/exception.h>
 #include <asm/hardirq.h>
 
-#include "irqchip.h"
-
 #define MAX_ICU_NR             16
 
 #define PJ1_INT_SEL            0x10c
@@ -130,8 +129,9 @@ struct irq_chip icu_irq_chip = {
        .irq_unmask     = icu_unmask_irq,
 };
 
-static void icu_mux_irq_demux(unsigned int irq, struct irq_desc *desc)
+static void icu_mux_irq_demux(unsigned int __irq, struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct irq_domain *domain;
        struct icu_chip_data *data;
        int i;
index 00b3cc908f762d58fd92720d73fd2e3f1cb28e3f..a24b06a1718b6fd7e6bd90f4269d47d14722a225 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -19,8 +20,6 @@
 
 #include <asm/exception.h>
 
-#include "irqchip.h"
-
 #define IRQ_SOURCE_REG         0
 #define IRQ_MASK_REG           0x04
 #define IRQ_CLEAR_REG          0x08
index 15c13039bba211b53a309d05ba4fd0f333364065..c8753da4c156ee9e2fa1b3b5ddfde63561733d30 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
@@ -21,8 +22,6 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 
-#include "irqchip.h"
-
 struct mtk_sysirq_chip_data {
        spinlock_t lock;
        void __iomem *intpol_base;
index 04bf97b289cf4a10a6c4d4344247e6d26e4a22f5..1faf812f3dc8e4a8da4e8d9a2b4f214216705041 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/io.h>
 #include <linux/of.h>
@@ -27,8 +28,6 @@
 #include <linux/stmp_device.h>
 #include <asm/exception.h>
 
-#include "irqchip.h"
-
 #define HW_ICOLL_VECTOR                                0x0000
 #define HW_ICOLL_LEVELACK                      0x0010
 #define HW_ICOLL_CTRL                          0x0020
index 5fac9100f6cbee9f7abf144eb4dcb9efeb3aaee0..a878b8d03868823a222af0ee4d0f296793673a7d 100644 (file)
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 
 #include <asm/v7m.h>
 #include <asm/exception.h>
 
-#include "irqchip.h"
-
 #define NVIC_ISER              0x000
 #define NVIC_ICER              0x080
 #define NVIC_IPR               0x300
index a569c6dbd1d16ee92bffabb6e45f9a6a2cbed4be..8587d0f8d8c03300e6ece2da0f252b767d31f781 100644 (file)
 #include <linux/io.h>
 
 #include <asm/exception.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 
-#include "irqchip.h"
-
 /* Define these here for now until we drop all board-files */
 #define OMAP24XX_IC_BASE       0x480fe000
 #define OMAP34XX_IC_BASE       0x48200000
@@ -331,37 +330,12 @@ static int __init omap_init_irq(u32 base, struct device_node *node)
 static asmlinkage void __exception_irq_entry
 omap_intc_handle_irq(struct pt_regs *regs)
 {
-       u32 irqnr = 0;
-       int handled_irq = 0;
-       int i;
-
-       do {
-               for (i = 0; i < omap_nr_pending; i++) {
-                       irqnr = intc_readl(INTC_PENDING_IRQ0 + (0x20 * i));
-                       if (irqnr)
-                               goto out;
-               }
-
-out:
-               if (!irqnr)
-                       break;
+       u32 irqnr;
 
-               irqnr = intc_readl(INTC_SIR);
-               irqnr &= ACTIVEIRQ_MASK;
-
-               if (irqnr) {
-                       handle_domain_irq(domain, irqnr, regs);
-                       handled_irq = 1;
-               }
-       } while (irqnr);
-
-       /*
-        * If an irq is masked or deasserted while active, we will
-        * keep ending up here with no irq handled. So remove it from
-        * the INTC with an ack.
-        */
-       if (!handled_irq)
-               omap_ack_irq(NULL);
+       irqnr = intc_readl(INTC_SIR);
+       irqnr &= ACTIVEIRQ_MASK;
+       WARN_ONCE(!irqnr, "Spurious IRQ ?\n");
+       handle_domain_irq(domain, irqnr, regs);
 }
 
 void __init omap3_init_irq(void)
index e93d079fe069eb11a55f6ff422063ec19620a826..6a9a3e79218b0fc623f99ad8f347362a92319300 100644 (file)
@@ -9,12 +9,11 @@
  */
 
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
 
-#include "irqchip.h"
-
 /* OR1K PIC implementation */
 
 struct or1k_pic_dev {
index ad0c0f6f1d65ac6b4cf7d8db80f635cf698a9875..5ea999a724b5db93ade94d5a8daa57f7b19da55b 100644 (file)
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 /*
  * Orion SoC main interrupt controller
  */
@@ -109,7 +108,7 @@ IRQCHIP_DECLARE(orion_intc, "marvell,orion-intc", orion_irq_init);
 
 static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
-       struct irq_domain *d = irq_get_handler_data(irq);
+       struct irq_domain *d = irq_desc_get_handler_data(desc);
 
        struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, 0);
        u32 stat = readl_relaxed(gc->reg_base + ORION_BRIDGE_IRQ_CAUSE) &
@@ -198,8 +197,8 @@ static int __init orion_bridge_irq_init(struct device_node *np,
        writel(0, gc->reg_base + ORION_BRIDGE_IRQ_MASK);
        writel(0, gc->reg_base + ORION_BRIDGE_IRQ_CAUSE);
 
-       irq_set_handler_data(irq, domain);
-       irq_set_chained_handler(irq, orion_bridge_irq_handler);
+       irq_set_chained_handler_and_data(irq, orion_bridge_irq_handler,
+                                        domain);
 
        return 0;
 }
index 1870e6bd3dd9ef3c21170bfc9ae0aa0fec541b12..6fd30d5ee14dddcd7a35169632a26d2156c2e34c 100644 (file)
@@ -11,8 +11,6 @@
 #include <linux/of_irq.h>
 #include <asm/io.h>
 
-#include "irqchip.h"
-
 static const char ipr_bit[] = {
         7,  6,  5,  5,
         4,  4,  4,  4,  3,  3,  3,  3,
index 64425f4de7d9542468708bd5bb7b5a2aef97dcfa..8098ead1eb22aa8600c8a6b25bf3c3eb8f0c486d 100644 (file)
@@ -5,10 +5,10 @@
  */
 
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <asm/io.h>
-#include "irqchip.h"
 
 static void *intc_baseaddr;
 #define IPRA ((unsigned long)intc_baseaddr)
index 778bd076aeea759a12fcfc49da0df952ffbc352a..2aa3add711a6612af6c1653c976a043e743d9058 100644 (file)
@@ -53,7 +53,6 @@
 struct irqc_irq {
        int hw_irq;
        int requested_irq;
-       int domain_irq;
        struct irqc_priv *p;
 };
 
@@ -70,8 +69,8 @@ struct irqc_priv {
 
 static void irqc_dbg(struct irqc_irq *i, char *str)
 {
-       dev_dbg(&i->p->pdev->dev, "%s (%d:%d:%d)\n",
-               str, i->requested_irq, i->hw_irq, i->domain_irq);
+       dev_dbg(&i->p->pdev->dev, "%s (%d:%d)\n",
+               str, i->requested_irq, i->hw_irq);
 }
 
 static void irqc_irq_enable(struct irq_data *d)
@@ -145,7 +144,7 @@ static irqreturn_t irqc_irq_handler(int irq, void *dev_id)
        if (ioread32(p->iomem + DETECT_STATUS) & bit) {
                iowrite32(bit, p->iomem + DETECT_STATUS);
                irqc_dbg(i, "demux2");
-               generic_handle_irq(i->domain_irq);
+               generic_handle_irq(irq_find_mapping(p->irq_domain, i->hw_irq));
                return IRQ_HANDLED;
        }
        return IRQ_NONE;
@@ -156,13 +155,9 @@ static int irqc_irq_domain_map(struct irq_domain *h, unsigned int virq,
 {
        struct irqc_priv *p = h->host_data;
 
-       p->irq[hw].domain_irq = virq;
-       p->irq[hw].hw_irq = hw;
-
        irqc_dbg(&p->irq[hw], "map");
        irq_set_chip_data(virq, h->host_data);
        irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq);
-       set_irq_flags(virq, IRQF_VALID); /* kill me now */
        return 0;
 }
 
@@ -215,6 +210,7 @@ static int irqc_probe(struct platform_device *pdev)
                        break;
 
                p->irq[k].p = p;
+               p->irq[k].hw_irq = k;
                p->irq[k].requested_irq = irq->start;
        }
 
@@ -243,8 +239,8 @@ static int irqc_probe(struct platform_device *pdev)
        irq_chip->irq_set_wake = irqc_irq_set_wake;
        irq_chip->flags = IRQCHIP_MASK_ON_SUSPEND;
 
-       p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,
-                                             p->number_of_irqs, 0,
+       p->irq_domain = irq_domain_add_linear(pdev->dev.of_node,
+                                             p->number_of_irqs,
                                              &irqc_irq_domain_ops, p);
        if (!p->irq_domain) {
                ret = -ENXIO;
index e96717f45ea15148adb46aefe5f74428a46b97a9..506d9f20ca51950e481148c4b3d91c49e1766173 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/ioport.h>
 #include <linux/device.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
@@ -40,8 +41,6 @@
 #include <plat/regs-irqtype.h>
 #include <plat/pm.h>
 
-#include "irqchip.h"
-
 #define S3C_IRQTYPE_NONE       0
 #define S3C_IRQTYPE_EINT       1
 #define S3C_IRQTYPE_EDGE       2
@@ -299,16 +298,14 @@ static struct irq_chip s3c_irq_eint0t4 = {
        .irq_set_type   = s3c_irqext0_type,
 };
 
-static void s3c_irq_demux(unsigned int irq, struct irq_desc *desc)
+static void s3c_irq_demux(unsigned int __irq, struct irq_desc *desc)
 {
        struct irq_chip *chip = irq_desc_get_chip(desc);
        struct s3c_irq_data *irq_data = irq_desc_get_chip_data(desc);
        struct s3c_irq_intc *intc = irq_data->intc;
        struct s3c_irq_intc *sub_intc = irq_data->sub_intc;
-       unsigned long src;
-       unsigned long msk;
-       unsigned int n;
-       unsigned int offset;
+       unsigned int n, offset, irq;
+       unsigned long src, msk;
 
        /* we're using individual domains for the non-dt case
         * and one big domain for the dt case where the subintc
index a469355df352723cc415753c4e4ec7111c51d3ff..10cb21b9ba3d6779c1f0a593f3a715ef6857cc89 100644 (file)
 #include <linux/irq.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/syscore_ops.h>
 #include <asm/mach/irq.h>
 #include <asm/exception.h>
-#include "irqchip.h"
 
-#define SIRFSOC_INT_RISC_MASK0          0x0018
-#define SIRFSOC_INT_RISC_MASK1          0x001C
-#define SIRFSOC_INT_RISC_LEVEL0         0x0020
-#define SIRFSOC_INT_RISC_LEVEL1         0x0024
+#define SIRFSOC_INT_RISC_MASK0         0x0018
+#define SIRFSOC_INT_RISC_MASK1         0x001C
+#define SIRFSOC_INT_RISC_LEVEL0                0x0020
+#define SIRFSOC_INT_RISC_LEVEL1                0x0024
 #define SIRFSOC_INIT_IRQ_ID            0x0038
+#define SIRFSOC_INT_BASE_OFFSET                0x0004
 
 #define SIRFSOC_NUM_IRQS               64
+#define SIRFSOC_NUM_BANKS              (SIRFSOC_NUM_IRQS / 32)
 
 static struct irq_domain *sirfsoc_irqdomain;
 
-static __init void
-sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
+static __init void sirfsoc_alloc_gc(void __iomem *base)
 {
-       struct irq_chip_generic *gc;
-       struct irq_chip_type *ct;
-       int ret;
        unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
        unsigned int set = IRQ_LEVEL;
-
-       ret = irq_alloc_domain_generic_chips(sirfsoc_irqdomain, num, 1, "irq_sirfsoc",
-               handle_level_irq, clr, set, IRQ_GC_INIT_MASK_CACHE);
-
-       gc = irq_get_domain_generic_chip(sirfsoc_irqdomain, irq_start);
-       gc->reg_base = base;
-       ct = gc->chip_types;
-       ct->chip.irq_mask = irq_gc_mask_clr_bit;
-       ct->chip.irq_unmask = irq_gc_mask_set_bit;
-       ct->regs.mask = SIRFSOC_INT_RISC_MASK0;
+       struct irq_chip_generic *gc;
+       struct irq_chip_type *ct;
+       int i;
+
+       irq_alloc_domain_generic_chips(sirfsoc_irqdomain, 32, 1, "irq_sirfsoc",
+                                      handle_level_irq, clr, set,
+                                      IRQ_GC_INIT_MASK_CACHE);
+
+       for (i = 0; i < SIRFSOC_NUM_BANKS; i++) {
+               gc = irq_get_domain_generic_chip(sirfsoc_irqdomain, i * 32);
+               gc->reg_base = base + i * SIRFSOC_INT_BASE_OFFSET;
+               ct = gc->chip_types;
+               ct->chip.irq_mask = irq_gc_mask_clr_bit;
+               ct->chip.irq_unmask = irq_gc_mask_set_bit;
+               ct->regs.mask = SIRFSOC_INT_RISC_MASK0;
+       }
 }
 
 static void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs)
@@ -64,10 +68,8 @@ static int __init sirfsoc_irq_init(struct device_node *np,
                panic("unable to map intc cpu registers\n");
 
        sirfsoc_irqdomain = irq_domain_add_linear(np, SIRFSOC_NUM_IRQS,
-               &irq_generic_chip_ops, base);
-
-       sirfsoc_alloc_gc(base, 0, 32);
-       sirfsoc_alloc_gc(base + 4, 32, SIRFSOC_NUM_IRQS - 32);
+                                                 &irq_generic_chip_ops, base);
+       sirfsoc_alloc_gc(base);
 
        writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL0);
        writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL1);
index 83d6aa6464ee0b688c3b777c5eda519f0091af4e..4ad3e7c69aa779e2f53b039fb1138807ce9f1ae2 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -23,8 +24,6 @@
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 #define SUN4I_IRQ_VECTOR_REG           0x00
 #define SUN4I_IRQ_PROTECTION_REG       0x08
 #define SUN4I_IRQ_NMI_CTRL_REG         0x0c
index 6b2b582433bde95062e85d17403e4a505c5a4ef9..772a82cacbf7a7b2cbb37b263327f86848413d88 100644 (file)
@@ -17,8 +17,8 @@
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
 #include <linux/of_platform.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
-#include "irqchip.h"
 
 #define SUNXI_NMI_SRC_TYPE_MASK        0x00000003
 
@@ -61,7 +61,7 @@ static inline u32 sunxi_sc_nmi_read(struct irq_chip_generic *gc, u32 off)
 static void sunxi_sc_nmi_handle_irq(unsigned int irq, struct irq_desc *desc)
 {
        struct irq_domain *domain = irq_desc_get_handler_data(desc);
-       struct irq_chip *chip = irq_get_chip(irq);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
        unsigned int virq = irq_find_mapping(domain, 0);
 
        chained_irq_enter(chip, desc);
@@ -182,8 +182,7 @@ static int __init sunxi_sc_nmi_irq_init(struct device_node *node,
        sunxi_sc_nmi_write(gc, reg_offs->enable, 0);
        sunxi_sc_nmi_write(gc, reg_offs->pend, 0x1);
 
-       irq_set_handler_data(irq, domain);
-       irq_set_chained_handler(irq, sunxi_sc_nmi_handle_irq);
+       irq_set_chained_handler_and_data(irq, sunxi_sc_nmi_handle_irq, domain);
 
        return 0;
 
index accc20036a3c6580eb7320554f4603306c72b1ac..3318296613669c1c489f848ac36e399760a0d312 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/irqdomain.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/io.h>
 #include <linux/slab.h>
 #include <linux/bitops.h>
-#include "irqchip.h"
 
 #define AB_IRQCTL_INT_ENABLE   0x00
 #define AB_IRQCTL_INT_STATUS   0x04
@@ -97,9 +97,10 @@ static int tb10x_irq_set_type(struct irq_data *data, unsigned int flow_type)
        return IRQ_SET_MASK_OK;
 }
 
-static void tb10x_irq_cascade(unsigned int irq, struct irq_desc *desc)
+static void tb10x_irq_cascade(unsigned int __irq, struct irq_desc *desc)
 {
        struct irq_domain *domain = irq_desc_get_handler_data(desc);
+       unsigned int irq = irq_desc_get_irq(desc);
 
        generic_handle_irq(irq_find_mapping(domain, irq));
 }
@@ -173,8 +174,8 @@ static int __init of_tb10x_init_irq(struct device_node *ictl,
        for (i = 0; i < nrirqs; i++) {
                unsigned int irq = irq_of_parse_and_map(ictl, i);
 
-               irq_set_handler_data(irq, domain);
-               irq_set_chained_handler(irq, tb10x_irq_cascade);
+               irq_set_chained_handler_and_data(irq, tb10x_irq_cascade,
+                                                domain);
        }
 
        ab_irqctl_writereg(gc, AB_IRQCTL_INT_ENABLE, 0);
index f67bbd80433e8c90527a9b911a2656987b800b96..2fd89eb88f3a29bc716ec1daf76ad4085e6a743d 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/of_address.h>
 #include <linux/slab.h>
@@ -31,8 +32,6 @@
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 
-#include "irqchip.h"
-
 #define ICTLR_CPU_IEP_VFIQ     0x08
 #define ICTLR_CPU_IEP_FIR      0x14
 #define ICTLR_CPU_IEP_FIR_SET  0x18
index 888111b76ea0dd525c44ab46f68f96206be8e05d..16123f688768f24585653171b87de1785b764400 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/bitops.h>
 #include <linux/irq.h>
 #include <linux/io.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/versatile-fpga.h>
 #include <linux/irqdomain.h>
 #include <linux/module.h>
@@ -14,8 +15,6 @@
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 #define IRQ_STATUS             0x00
 #define IRQ_RAW_STATUS         0x04
 #define IRQ_ENABLE_SET         0x08
@@ -66,9 +65,10 @@ static void fpga_irq_unmask(struct irq_data *d)
        writel(mask, f->base + IRQ_ENABLE_SET);
 }
 
-static void fpga_irq_handle(unsigned int irq, struct irq_desc *desc)
+static void fpga_irq_handle(unsigned int __irq, struct irq_desc *desc)
 {
        struct fpga_irq_data *f = irq_desc_get_handler_data(desc);
+       unsigned int irq = irq_desc_get_irq(desc);
        u32 status = readl(f->base + IRQ_STATUS);
 
        if (status == 0) {
@@ -156,8 +156,8 @@ void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,
        f->valid = valid;
 
        if (parent_irq != -1) {
-               irq_set_handler_data(parent_irq, f);
-               irq_set_chained_handler(parent_irq, fpga_irq_handle);
+               irq_set_chained_handler_and_data(parent_irq, fpga_irq_handle,
+                                                f);
        }
 
        /* This will also allocate irq descriptors */
index f5c01cbcc73ac1376627cf31aa227a9cf5c25179..2c22558864012efe6425ab1f058ea0e07a9f0728 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/cpu_pm.h>
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/mfd/syscon.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
@@ -34,8 +35,6 @@
 #include <linux/slab.h>
 #include <linux/regmap.h>
 
-#include "irqchip.h"
-
 #define MSCM_CPxNUM            0x4
 
 #define MSCM_IRSPRC(n)         (0x80 + 2 * (n))
index d4ce331ea4a08eadbd447e61486eff0d124d842c..03846dff42123c96079489f998ed18e7623ff576 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/list.h>
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
@@ -37,8 +38,6 @@
 #include <asm/exception.h>
 #include <asm/irq.h>
 
-#include "irqchip.h"
-
 #define VIC_IRQ_STATUS                 0x00
 #define VIC_FIQ_STATUS                 0x04
 #define VIC_INT_SELECT                 0x0c    /* 1 = FIQ, 0 = IRQ */
@@ -297,8 +296,8 @@ static void __init vic_register(void __iomem *base, unsigned int parent_irq,
        vic_id++;
 
        if (parent_irq) {
-               irq_set_handler_data(parent_irq, v);
-               irq_set_chained_handler(parent_irq, vic_handle_irq_cascaded);
+               irq_set_chained_handler_and_data(parent_irq,
+                                                vic_handle_irq_cascaded, v);
        }
 
        v->domain = irq_domain_add_simple(node, fls(valid_sources), irq,
index 0b297009b85662888fbe29af6dd18b5bd45b5151..8371d9978d31d9db5550ed1cdbf5cb28936b4fbd 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/slab.h>
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
@@ -39,8 +40,6 @@
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
-#include "irqchip.h"
-
 #define VT8500_ICPC_IRQ                0x20
 #define VT8500_ICPC_FIQ                0x24
 #define VT8500_ICDC            0x40            /* Destination Control 64*u32 */
@@ -127,15 +126,15 @@ static int vt8500_irq_set_type(struct irq_data *d, unsigned int flow_type)
                return -EINVAL;
        case IRQF_TRIGGER_HIGH:
                dctr |= VT8500_TRIGGER_HIGH;
-               __irq_set_handler_locked(d->irq, handle_level_irq);
+               irq_set_handler_locked(d, handle_level_irq);
                break;
        case IRQF_TRIGGER_FALLING:
                dctr |= VT8500_TRIGGER_FALLING;
-               __irq_set_handler_locked(d->irq, handle_edge_irq);
+               irq_set_handler_locked(d, handle_edge_irq);
                break;
        case IRQF_TRIGGER_RISING:
                dctr |= VT8500_TRIGGER_RISING;
-               __irq_set_handler_locked(d->irq, handle_edge_irq);
+               irq_set_handler_locked(d, handle_edge_irq);
                break;
        }
        writeb(dctr, base + VT8500_ICDC + d->hwirq);
index e1c2f963289374b38a3a7bce93c930cb6565b376..bb3ac5fe5846b9e2d27b71bea9bf0bff9bcb8e2d 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/irqdomain.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 
 #include <asm/mxregs.h>
 
-#include "irqchip.h"
-
 #define HW_IRQ_IPI_COUNT 2
 #define HW_IRQ_MX_BASE 2
 #define HW_IRQ_EXTERN_BASE 3
index 7d71126d1ce5596668176ea7b03b541292ded9d1..472ae17709647201606a10344fd741d77e81e988 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/irqdomain.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 
-#include "irqchip.h"
-
 unsigned int cached_irq_mask;
 
 /*
index e4ef74ed454a8d6826947924523498191efb474a..4c48fa88a03d9b54651276cfe95a8fc2d5e287af 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
@@ -18,8 +19,6 @@
 #include <asm/mach/irq.h>
 #include <asm/exception.h>
 
-#include "irqchip.h"
-
 #define IO_STATUS      0x000
 #define IO_RAW_STATUS  0x004
 #define IO_ENABLE      0x008
index acb721b31bcfc4972921ff4c7f6afe1e1c8026cc..4cbd9c5dc1e6fc1e65810c28c61c3a780942a8a1 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/spinlock.h>
 
-#include "irqchip.h"
-
 /*
  * struct spear_shirq: shared irq structure
  *
@@ -183,9 +182,9 @@ static struct spear_shirq *spear320_shirq_blocks[] = {
        &spear320_shirq_intrcomm_ras,
 };
 
-static void shirq_handler(unsigned irq, struct irq_desc *desc)
+static void shirq_handler(unsigned __irq, struct irq_desc *desc)
 {
-       struct spear_shirq *shirq = irq_get_handler_data(irq);
+       struct spear_shirq *shirq = irq_desc_get_handler_data(desc);
        u32 pend;
 
        pend = readl(shirq->base + shirq->status_reg) & shirq->mask;
index f34892e0edb4f973e4dd3e9ab39b24cf0c2f0716..6f3abc2c73169d60d11c046c4dcb2baa2c46bcfc 100644 (file)
@@ -104,14 +104,13 @@ static void ks_dw_pcie_msi_irq_ack(struct irq_data *d)
 {
        u32 offset, reg_offset, bit_pos;
        struct keystone_pcie *ks_pcie;
-       unsigned int irq = d->irq;
        struct msi_desc *msi;
        struct pcie_port *pp;
 
-       msi = irq_get_msi_desc(irq);
-       pp = sys_to_pcie(msi->dev->bus->sysdata);
+       msi = irq_data_get_msi_desc(d);
+       pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
        ks_pcie = to_keystone_pcie(pp);
-       offset = irq - irq_linear_revmap(pp->irq_domain, 0);
+       offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
        update_reg_offset_bit_pos(offset, &reg_offset, &bit_pos);
 
        writel(BIT(bit_pos),
@@ -142,15 +141,14 @@ void ks_dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq)
 static void ks_dw_pcie_msi_irq_mask(struct irq_data *d)
 {
        struct keystone_pcie *ks_pcie;
-       unsigned int irq = d->irq;
        struct msi_desc *msi;
        struct pcie_port *pp;
        u32 offset;
 
-       msi = irq_get_msi_desc(irq);
-       pp = sys_to_pcie(msi->dev->bus->sysdata);
+       msi = irq_data_get_msi_desc(d);
+       pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
        ks_pcie = to_keystone_pcie(pp);
-       offset = irq - irq_linear_revmap(pp->irq_domain, 0);
+       offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
 
        /* Mask the end point if PVM implemented */
        if (IS_ENABLED(CONFIG_PCI_MSI)) {
@@ -164,15 +162,14 @@ static void ks_dw_pcie_msi_irq_mask(struct irq_data *d)
 static void ks_dw_pcie_msi_irq_unmask(struct irq_data *d)
 {
        struct keystone_pcie *ks_pcie;
-       unsigned int irq = d->irq;
        struct msi_desc *msi;
        struct pcie_port *pp;
        u32 offset;
 
-       msi = irq_get_msi_desc(irq);
-       pp = sys_to_pcie(msi->dev->bus->sysdata);
+       msi = irq_data_get_msi_desc(d);
+       pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
        ks_pcie = to_keystone_pcie(pp);
-       offset = irq - irq_linear_revmap(pp->irq_domain, 0);
+       offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
 
        /* Mask the end point if PVM implemented */
        if (IS_ENABLED(CONFIG_PCI_MSI)) {
index 734da589cdfb94b4312c3a8cd13dbe06c9c5604c..81253e70b1c5441b41544a58f682caa73f84dbc8 100644 (file)
@@ -110,8 +110,9 @@ static int ks_pcie_establish_link(struct keystone_pcie *ks_pcie)
        return -EINVAL;
 }
 
-static void ks_pcie_msi_irq_handler(unsigned int irq, struct irq_desc *desc)
+static void ks_pcie_msi_irq_handler(unsigned int __irq, struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct keystone_pcie *ks_pcie = irq_desc_get_handler_data(desc);
        u32 offset = irq - ks_pcie->msi_host_irqs[0];
        struct pcie_port *pp = &ks_pcie->pp;
@@ -137,8 +138,10 @@ static void ks_pcie_msi_irq_handler(unsigned int irq, struct irq_desc *desc)
  * Traverse through pending legacy interrupts and invoke handler for each. Also
  * takes care of interrupt controller level mask/ack operation.
  */
-static void ks_pcie_legacy_irq_handler(unsigned int irq, struct irq_desc *desc)
+static void ks_pcie_legacy_irq_handler(unsigned int __irq,
+                                      struct irq_desc *desc)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct keystone_pcie *ks_pcie = irq_desc_get_handler_data(desc);
        struct pcie_port *pp = &ks_pcie->pp;
        u32 irq_offset = irq - ks_pcie->legacy_host_irqs[0];
@@ -212,9 +215,9 @@ static void ks_pcie_setup_interrupts(struct keystone_pcie *ks_pcie)
 
        /* Legacy IRQ */
        for (i = 0; i < ks_pcie->num_legacy_host_irqs; i++) {
-               irq_set_handler_data(ks_pcie->legacy_host_irqs[i], ks_pcie);
-               irq_set_chained_handler(ks_pcie->legacy_host_irqs[i],
-                                       ks_pcie_legacy_irq_handler);
+               irq_set_chained_handler_and_data(ks_pcie->legacy_host_irqs[i],
+                                                ks_pcie_legacy_irq_handler,
+                                                ks_pcie);
        }
        ks_dw_pcie_enable_legacy_irqs(ks_pcie);
 
index 69486be7181e18287a8a8bd421055b902233e3c4..aae6dcb528c1faef1b4d74dc6b8c82553ba0c6f5 100644 (file)
@@ -255,7 +255,7 @@ static void dw_pcie_msi_set_irq(struct pcie_port *pp, int irq)
 static int assign_irq(int no_irqs, struct msi_desc *desc, int *pos)
 {
        int irq, pos0, i;
-       struct pcie_port *pp = sys_to_pcie(desc->dev->bus->sysdata);
+       struct pcie_port *pp = sys_to_pcie(msi_desc_to_pci_sysdata(desc));
 
        pos0 = bitmap_find_free_region(pp->msi_irq_in_use, MAX_MSI_IRQS,
                                       order_base_2(no_irqs));
@@ -326,8 +326,8 @@ static int dw_msi_setup_irq(struct msi_controller *chip, struct pci_dev *pdev,
 static void dw_msi_teardown_irq(struct msi_controller *chip, unsigned int irq)
 {
        struct irq_data *data = irq_get_irq_data(irq);
-       struct msi_desc *msi = irq_data_get_msi(data);
-       struct pcie_port *pp = sys_to_pcie(msi->dev->bus->sysdata);
+       struct msi_desc *msi = irq_data_get_msi_desc(data);
+       struct pcie_port *pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
 
        clear_irq_range(pp, irq, 1, data->hwirq);
 }
index f1a06a091ccb578359656b1d9c4b32c0e99b2d99..64454f4166396104126608f3c6cc001444695255 100644 (file)
@@ -227,18 +227,16 @@ static struct pci_ops xilinx_pcie_ops = {
  */
 static void xilinx_pcie_destroy_msi(unsigned int irq)
 {
-       struct irq_desc *desc;
        struct msi_desc *msi;
        struct xilinx_pcie_port *port;
 
-       desc = irq_to_desc(irq);
-       msi = irq_desc_get_msi_desc(desc);
-       port = sys_to_pcie(msi->dev->bus->sysdata);
-
-       if (!test_bit(irq, msi_irq_in_use))
+       if (!test_bit(irq, msi_irq_in_use)) {
+               msi = irq_get_msi_desc(irq);
+               port = sys_to_pcie(msi_desc_to_pci_sys_data(msi));
                dev_err(port->dev, "Trying to free unused MSI#%d\n", irq);
-       else
+       } else {
                clear_bit(irq, msi_irq_in_use);
+       }
 }
 
 /**
index f66be868ad2122efdb40e742f8ecb9fc43cbc508..cd4c78c193de16ce07bf544fe3f65e29bf516f30 100644 (file)
@@ -131,7 +131,7 @@ int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
        if (type == PCI_CAP_ID_MSI && nvec > 1)
                return 1;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                ret = arch_setup_msi_irq(dev, entry);
                if (ret < 0)
                        return ret;
@@ -151,7 +151,7 @@ void default_teardown_msi_irqs(struct pci_dev *dev)
        int i;
        struct msi_desc *entry;
 
-       list_for_each_entry(entry, &dev->msi_list, list)
+       for_each_pci_msi_entry(entry, dev)
                if (entry->irq)
                        for (i = 0; i < entry->nvec_used; i++)
                                arch_teardown_msi_irq(entry->irq + i);
@@ -168,7 +168,7 @@ static void default_restore_msi_irq(struct pci_dev *dev, int irq)
 
        entry = NULL;
        if (dev->msix_enabled) {
-               list_for_each_entry(entry, &dev->msi_list, list) {
+               for_each_pci_msi_entry(entry, dev) {
                        if (irq == entry->irq)
                                break;
                }
@@ -208,7 +208,8 @@ u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
 
        mask_bits &= ~mask;
        mask_bits |= flag;
-       pci_write_config_dword(desc->dev, desc->mask_pos, mask_bits);
+       pci_write_config_dword(msi_desc_to_pci_dev(desc), desc->mask_pos,
+                              mask_bits);
 
        return mask_bits;
 }
@@ -249,7 +250,7 @@ static void msix_mask_irq(struct msi_desc *desc, u32 flag)
 
 static void msi_set_mask_bit(struct irq_data *data, u32 flag)
 {
-       struct msi_desc *desc = irq_data_get_msi(data);
+       struct msi_desc *desc = irq_data_get_msi_desc(data);
 
        if (desc->msi_attrib.is_msix) {
                msix_mask_irq(desc, flag);
@@ -282,13 +283,15 @@ void default_restore_msi_irqs(struct pci_dev *dev)
 {
        struct msi_desc *entry;
 
-       list_for_each_entry(entry, &dev->msi_list, list)
+       for_each_pci_msi_entry(entry, dev)
                default_restore_msi_irq(dev, entry->irq);
 }
 
 void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 {
-       BUG_ON(entry->dev->current_state != PCI_D0);
+       struct pci_dev *dev = msi_desc_to_pci_dev(entry);
+
+       BUG_ON(dev->current_state != PCI_D0);
 
        if (entry->msi_attrib.is_msix) {
                void __iomem *base = entry->mask_base +
@@ -298,7 +301,6 @@ void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
                msg->address_hi = readl(base + PCI_MSIX_ENTRY_UPPER_ADDR);
                msg->data = readl(base + PCI_MSIX_ENTRY_DATA);
        } else {
-               struct pci_dev *dev = entry->dev;
                int pos = dev->msi_cap;
                u16 data;
 
@@ -318,7 +320,9 @@ void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 
 void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 {
-       if (entry->dev->current_state != PCI_D0) {
+       struct pci_dev *dev = msi_desc_to_pci_dev(entry);
+
+       if (dev->current_state != PCI_D0) {
                /* Don't touch the hardware now */
        } else if (entry->msi_attrib.is_msix) {
                void __iomem *base;
@@ -329,7 +333,6 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
                writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR);
                writel(msg->data, base + PCI_MSIX_ENTRY_DATA);
        } else {
-               struct pci_dev *dev = entry->dev;
                int pos = dev->msi_cap;
                u16 msgctl;
 
@@ -363,21 +366,22 @@ EXPORT_SYMBOL_GPL(pci_write_msi_msg);
 
 static void free_msi_irqs(struct pci_dev *dev)
 {
+       struct list_head *msi_list = dev_to_msi_list(&dev->dev);
        struct msi_desc *entry, *tmp;
        struct attribute **msi_attrs;
        struct device_attribute *dev_attr;
        int i, count = 0;
 
-       list_for_each_entry(entry, &dev->msi_list, list)
+       for_each_pci_msi_entry(entry, dev)
                if (entry->irq)
                        for (i = 0; i < entry->nvec_used; i++)
                                BUG_ON(irq_has_action(entry->irq + i));
 
        pci_msi_teardown_msi_irqs(dev);
 
-       list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) {
+       list_for_each_entry_safe(entry, tmp, msi_list, list) {
                if (entry->msi_attrib.is_msix) {
-                       if (list_is_last(&entry->list, &dev->msi_list))
+                       if (list_is_last(&entry->list, msi_list))
                                iounmap(entry->mask_base);
                }
 
@@ -402,18 +406,6 @@ static void free_msi_irqs(struct pci_dev *dev)
        }
 }
 
-static struct msi_desc *alloc_msi_entry(struct pci_dev *dev)
-{
-       struct msi_desc *desc = kzalloc(sizeof(*desc), GFP_KERNEL);
-       if (!desc)
-               return NULL;
-
-       INIT_LIST_HEAD(&desc->list);
-       desc->dev = dev;
-
-       return desc;
-}
-
 static void pci_intx_for_msi(struct pci_dev *dev, int enable)
 {
        if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG))
@@ -448,7 +440,7 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
 
        if (!dev->msix_enabled)
                return;
-       BUG_ON(list_empty(&dev->msi_list));
+       BUG_ON(list_empty(dev_to_msi_list(&dev->dev)));
 
        /* route the table */
        pci_intx_for_msi(dev, 0);
@@ -456,7 +448,7 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
                                PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
 
        arch_restore_msi_irqs(dev);
-       list_for_each_entry(entry, &dev->msi_list, list)
+       for_each_pci_msi_entry(entry, dev)
                msix_mask_irq(entry, entry->masked);
 
        pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
@@ -501,7 +493,7 @@ static int populate_msi_sysfs(struct pci_dev *pdev)
        int count = 0;
 
        /* Determine how many msi entries we have */
-       list_for_each_entry(entry, &pdev->msi_list, list)
+       for_each_pci_msi_entry(entry, pdev)
                ++num_msi;
        if (!num_msi)
                return 0;
@@ -510,7 +502,7 @@ static int populate_msi_sysfs(struct pci_dev *pdev)
        msi_attrs = kzalloc(sizeof(void *) * (num_msi + 1), GFP_KERNEL);
        if (!msi_attrs)
                return -ENOMEM;
-       list_for_each_entry(entry, &pdev->msi_list, list) {
+       for_each_pci_msi_entry(entry, pdev) {
                msi_dev_attr = kzalloc(sizeof(*msi_dev_attr), GFP_KERNEL);
                if (!msi_dev_attr)
                        goto error_attrs;
@@ -568,7 +560,7 @@ static struct msi_desc *msi_setup_entry(struct pci_dev *dev, int nvec)
        struct msi_desc *entry;
 
        /* MSI Entry Initialization */
-       entry = alloc_msi_entry(dev);
+       entry = alloc_msi_entry(&dev->dev);
        if (!entry)
                return NULL;
 
@@ -599,7 +591,7 @@ static int msi_verify_entries(struct pci_dev *dev)
 {
        struct msi_desc *entry;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                if (!dev->no_64bit_msi || !entry->msg.address_hi)
                        continue;
                dev_err(&dev->dev, "Device has broken 64-bit MSI but arch"
@@ -636,7 +628,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
        mask = msi_mask(entry->msi_attrib.multi_cap);
        msi_mask_irq(entry, mask, mask);
 
-       list_add_tail(&entry->list, &dev->msi_list);
+       list_add_tail(&entry->list, dev_to_msi_list(&dev->dev));
 
        /* Configure MSI capability structure */
        ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
@@ -696,7 +688,7 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
        int i;
 
        for (i = 0; i < nvec; i++) {
-               entry = alloc_msi_entry(dev);
+               entry = alloc_msi_entry(&dev->dev);
                if (!entry) {
                        if (!i)
                                iounmap(base);
@@ -713,7 +705,7 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
                entry->mask_base                = base;
                entry->nvec_used                = 1;
 
-               list_add_tail(&entry->list, &dev->msi_list);
+               list_add_tail(&entry->list, dev_to_msi_list(&dev->dev));
        }
 
        return 0;
@@ -725,7 +717,7 @@ static void msix_program_entries(struct pci_dev *dev,
        struct msi_desc *entry;
        int i = 0;
 
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                int offset = entries[i].entry * PCI_MSIX_ENTRY_SIZE +
                                                PCI_MSIX_ENTRY_VECTOR_CTRL;
 
@@ -806,7 +798,7 @@ out_avail:
                struct msi_desc *entry;
                int avail = 0;
 
-               list_for_each_entry(entry, &dev->msi_list, list) {
+               for_each_pci_msi_entry(entry, dev) {
                        if (entry->irq != 0)
                                avail++;
                }
@@ -895,8 +887,8 @@ void pci_msi_shutdown(struct pci_dev *dev)
        if (!pci_msi_enable || !dev || !dev->msi_enabled)
                return;
 
-       BUG_ON(list_empty(&dev->msi_list));
-       desc = list_first_entry(&dev->msi_list, struct msi_desc, list);
+       BUG_ON(list_empty(dev_to_msi_list(&dev->dev)));
+       desc = first_pci_msi_entry(dev);
 
        pci_msi_set_enable(dev, 0);
        pci_intx_for_msi(dev, 1);
@@ -1001,7 +993,7 @@ void pci_msix_shutdown(struct pci_dev *dev)
                return;
 
        /* Return the device with MSI-X masked as initial states */
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                /* Keep cached states to be restored */
                __pci_msix_desc_mask_irq(entry, 1);
        }
@@ -1040,7 +1032,6 @@ EXPORT_SYMBOL(pci_msi_enabled);
 
 void pci_msi_init_pci_dev(struct pci_dev *dev)
 {
-       INIT_LIST_HEAD(&dev->msi_list);
 }
 
 /**
@@ -1137,6 +1128,19 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
 }
 EXPORT_SYMBOL(pci_enable_msix_range);
 
+struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
+{
+       return to_pci_dev(desc->dev);
+}
+
+void *msi_desc_to_pci_sysdata(struct msi_desc *desc)
+{
+       struct pci_dev *dev = msi_desc_to_pci_dev(desc);
+
+       return dev->bus->sysdata;
+}
+EXPORT_SYMBOL_GPL(msi_desc_to_pci_sysdata);
+
 #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
 /**
  * pci_msi_domain_write_msg - Helper to write MSI message to PCI config space
@@ -1145,7 +1149,7 @@ EXPORT_SYMBOL(pci_enable_msix_range);
  */
 void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg)
 {
-       struct msi_desc *desc = irq_data->msi_desc;
+       struct msi_desc *desc = irq_data_get_msi_desc(irq_data);
 
        /*
         * For MSI-X desc->irq is always equal to irq_data->irq. For
index 8b7a900cd28b25e5a8d52a10357768df1d6513aa..c777b97207d5378936a8f25a54be603d76691ab9 100644 (file)
@@ -265,7 +265,7 @@ static int pci_frontend_enable_msix(struct pci_dev *dev,
        }
 
        i = 0;
-       list_for_each_entry(entry, &dev->msi_list, list) {
+       for_each_pci_msi_entry(entry, dev) {
                op.msix_entries[i].entry = entry->msi_attrib.entry_nr;
                /* Vector is useless at this point. */
                op.msix_entries[i].vector = -1;
index 46427b48e2f1767fcc1fa8732aff3536fb38ec66..358df75101860090808775a62661fce0313219d4 100644 (file)
@@ -22,7 +22,7 @@ void _intc_enable(struct irq_data *data, unsigned long handle)
 
        for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_E(handle)); cpu++) {
 #ifdef CONFIG_SMP
-               if (!cpumask_test_cpu(cpu, data->affinity))
+               if (!cpumask_test_cpu(cpu, irq_data_get_affinity_mask(data)))
                        continue;
 #endif
                addr = INTC_REG(d, _INTC_ADDR_E(handle), cpu);
@@ -50,7 +50,7 @@ static void intc_disable(struct irq_data *data)
 
        for (cpu = 0; cpu < SMP_NR(d, _INTC_ADDR_D(handle)); cpu++) {
 #ifdef CONFIG_SMP
-               if (!cpumask_test_cpu(cpu, data->affinity))
+               if (!cpumask_test_cpu(cpu, irq_data_get_affinity_mask(data)))
                        continue;
 #endif
                addr = INTC_REG(d, _INTC_ADDR_D(handle), cpu);
@@ -72,7 +72,7 @@ static int intc_set_affinity(struct irq_data *data,
        if (!cpumask_intersects(cpumask, cpu_online_mask))
                return -1;
 
-       cpumask_copy(data->affinity, cpumask);
+       cpumask_copy(irq_data_get_affinity_mask(data), cpumask);
 
        return IRQ_SET_MASK_OK_NOCOPY;
 }
index 156b790072b47263f5c9aec874e02694e6bb1c9b..043419dcee92306eb93c52b6240df0a48071c272 100644 (file)
@@ -67,7 +67,7 @@ void intc_set_prio_level(unsigned int irq, unsigned int level)
 
 static void intc_redirect_irq(unsigned int irq, struct irq_desc *desc)
 {
-       generic_handle_irq((unsigned int)irq_get_handler_data(irq));
+       generic_handle_irq((unsigned int)irq_desc_get_handler_data(desc));
 }
 
 static void __init intc_register_irq(struct intc_desc *desc,
index f5f1b821241afc92e6854788262d13f665a0dd45..bafc51c6f0bacbe2fdb99e033d89a46dd07d37ea 100644 (file)
@@ -83,12 +83,11 @@ EXPORT_SYMBOL_GPL(intc_irq_lookup);
 
 static int add_virq_to_pirq(unsigned int irq, unsigned int virq)
 {
-       struct intc_virq_list **last, *entry;
-       struct irq_data *data = irq_get_irq_data(irq);
+       struct intc_virq_list *entry;
+       struct intc_virq_list **last = NULL;
 
        /* scan for duplicates */
-       last = (struct intc_virq_list **)&data->handler_data;
-       for_each_virq(entry, data->handler_data) {
+       for_each_virq(entry, irq_get_handler_data(irq)) {
                if (entry->irq == virq)
                        return 0;
                last = &entry->next;
@@ -102,14 +101,18 @@ static int add_virq_to_pirq(unsigned int irq, unsigned int virq)
 
        entry->irq = virq;
 
-       *last = entry;
+       if (last)
+               *last = entry;
+       else
+               irq_set_handler_data(irq, entry);
 
        return 0;
 }
 
-static void intc_virq_handler(unsigned int irq, struct irq_desc *desc)
+static void intc_virq_handler(unsigned int __irq, struct irq_desc *desc)
 {
-       struct irq_data *data = irq_get_irq_data(irq);
+       unsigned int irq = irq_desc_get_irq(desc);
+       struct irq_data *data = irq_desc_get_irq_data(desc);
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        struct intc_virq_list *entry, *vlist = irq_data_get_irq_handler_data(data);
        struct intc_desc_int *d = get_intc_desc(irq);
@@ -118,12 +121,14 @@ static void intc_virq_handler(unsigned int irq, struct irq_desc *desc)
 
        for_each_virq(entry, vlist) {
                unsigned long addr, handle;
+               struct irq_desc *vdesc = irq_to_desc(entry->irq);
 
-               handle = (unsigned long)irq_get_handler_data(entry->irq);
-               addr = INTC_REG(d, _INTC_ADDR_E(handle), 0);
-
-               if (intc_reg_fns[_INTC_FN(handle)](addr, handle, 0))
-                       generic_handle_irq(entry->irq);
+               if (vdesc) {
+                       handle = (unsigned long)irq_desc_get_handler_data(vdesc);
+                       addr = INTC_REG(d, _INTC_ADDR_E(handle), 0);
+                       if (intc_reg_fns[_INTC_FN(handle)](addr, handle, 0))
+                               generic_handle_irq_desc(entry->irq, vdesc);
+               }
        }
 
        chip->irq_unmask(data);
index d7119db49cfe561b5cd534ccf5c0c1bf45ac0ce0..48394845976501ea7b137e2f6794627997ad20d5 100644 (file)
@@ -453,8 +453,8 @@ static void periph_interrupt(struct spmi_pmic_arb_dev *pa, u8 apid)
 
 static void pmic_arb_chained_irq(unsigned int irq, struct irq_desc *desc)
 {
-       struct spmi_pmic_arb_dev *pa = irq_get_handler_data(irq);
-       struct irq_chip *chip = irq_get_chip(irq);
+       struct spmi_pmic_arb_dev *pa = irq_desc_get_handler_data(desc);
+       struct irq_chip *chip = irq_desc_get_chip(desc);
        void __iomem *intr = pa->intr;
        int first = pa->min_apid >> 5;
        int last = pa->max_apid >> 5;
@@ -928,8 +928,7 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
                goto err_put_ctrl;
        }
 
-       irq_set_handler_data(pa->irq, pa);
-       irq_set_chained_handler(pa->irq, pmic_arb_chained_irq);
+       irq_set_chained_handler_and_data(pa->irq, pmic_arb_chained_irq, pa);
 
        err = spmi_controller_add(ctrl);
        if (err)
@@ -938,8 +937,7 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
        return 0;
 
 err_domain_remove:
-       irq_set_chained_handler(pa->irq, NULL);
-       irq_set_handler_data(pa->irq, NULL);
+       irq_set_chained_handler_and_data(pa->irq, NULL, NULL);
        irq_domain_remove(pa->domain);
 err_put_ctrl:
        spmi_controller_put(ctrl);
@@ -951,8 +949,7 @@ static int spmi_pmic_arb_remove(struct platform_device *pdev)
        struct spmi_controller *ctrl = platform_get_drvdata(pdev);
        struct spmi_pmic_arb_dev *pa = spmi_controller_get_drvdata(ctrl);
        spmi_controller_remove(ctrl);
-       irq_set_chained_handler(pa->irq, NULL);
-       irq_set_handler_data(pa->irq, NULL);
+       irq_set_chained_handler_and_data(pa->irq, NULL, NULL);
        irq_domain_remove(pa->domain);
        spmi_controller_put(ctrl);
        return 0;
index a2b4ea70a9467520d93a556190ca8995183e4af9..3d3139ad5705e6c2420193f6a4019ae242740942 100644 (file)
@@ -714,6 +714,7 @@ struct device_dma_parameters {
  *             along with subsystem-level and driver-level callbacks.
  * @pins:      For device pin management.
  *             See Documentation/pinctrl.txt for details.
+ * @msi_list:  Hosts MSI descriptors
  * @numa_node: NUMA node this device is close to.
  * @dma_mask:  Dma mask (if dma'ble device).
  * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all
@@ -777,6 +778,9 @@ struct device {
 #ifdef CONFIG_PINCTRL
        struct dev_pin_info     *pins;
 #endif
+#ifdef CONFIG_GENERIC_MSI_IRQ
+       struct list_head        msi_list;
+#endif
 
 #ifdef CONFIG_NUMA
        int             numa_node;      /* NUMA node this device is close to */
index 92188b0225bb31f33eba9deacc4b9b88036c1d8e..2c8730a108be2777a7471b883cb062e548b623b1 100644 (file)
@@ -324,8 +324,10 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
  * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
  * @irq_cpu_online:    configure an interrupt source for a secondary CPU
  * @irq_cpu_offline:   un-configure an interrupt source for a secondary CPU
- * @irq_suspend:       function called from core code on suspend once per chip
- * @irq_resume:                function called from core code on resume once per chip
+ * @irq_suspend:       function called from core code on suspend once per
+ *                     chip, when one or more interrupts are installed
+ * @irq_resume:                function called from core code on resume once per chip,
+ *                     when one ore more interrupts are installed
  * @irq_pm_shutdown:   function called from core code on shutdown once per chip
  * @irq_calc_mask:     Optional function to set irq_data.mask for special cases
  * @irq_print_chip:    optional to print special chip info in show_interrupts
@@ -487,8 +489,7 @@ extern int irq_chip_set_vcpu_affinity_parent(struct irq_data *data,
 #endif
 
 /* Handling of unhandled and spurious interrupts: */
-extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
-                          irqreturn_t action_ret);
+extern void note_interrupt(struct irq_desc *desc, irqreturn_t action_ret);
 
 
 /* Enable/disable irq debugging output: */
@@ -639,7 +640,7 @@ static inline struct msi_desc *irq_get_msi_desc(unsigned int irq)
        return d ? d->msi_desc : NULL;
 }
 
-static inline struct msi_desc *irq_data_get_msi(struct irq_data *d)
+static inline struct msi_desc *irq_data_get_msi_desc(struct irq_data *d)
 {
        return d->msi_desc;
 }
@@ -761,6 +762,12 @@ struct irq_chip_type {
  * @reg_base:          Register base address (virtual)
  * @reg_readl:         Alternate I/O accessor (defaults to readl if NULL)
  * @reg_writel:                Alternate I/O accessor (defaults to writel if NULL)
+ * @suspend:           Function called from core code on suspend once per
+ *                     chip; can be useful instead of irq_chip::suspend to
+ *                     handle chip details even when no interrupts are in use
+ * @resume:            Function called from core code on resume once per chip;
+ *                     can be useful instead of irq_chip::suspend to handle
+ *                     chip details even when no interrupts are in use
  * @irq_base:          Interrupt base nr for this chip
  * @irq_cnt:           Number of interrupts handled by this chip
  * @mask_cache:                Cached mask register shared between all chip types
@@ -787,6 +794,8 @@ struct irq_chip_generic {
        void __iomem            *reg_base;
        u32                     (*reg_readl)(void __iomem *addr);
        void                    (*reg_writel)(u32 val, void __iomem *addr);
+       void                    (*suspend)(struct irq_chip_generic *gc);
+       void                    (*resume)(struct irq_chip_generic *gc);
        unsigned int            irq_base;
        unsigned int            irq_cnt;
        u32                     mask_cache;
index 9de976b4f9a79c8ef8bb43e7a150a2533e74f39a..61a2007eb49ade6907ffc9fae07b26a1a3a9a784 100644 (file)
@@ -95,7 +95,6 @@
 
 struct device_node;
 
-void gic_set_irqchip_flags(unsigned long flags);
 void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *,
                    u32 offset, struct device_node *);
 void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
index 8ac4a68ffae2d928f677e0a9535402eb8978636a..f83c87e447bc5f63802743eb9e7875f594396e9a 100644 (file)
@@ -14,38 +14,69 @@ extern int pci_msi_ignore_mask;
 /* Helper functions */
 struct irq_data;
 struct msi_desc;
+struct pci_dev;
 void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
 
+/**
+ * struct msi_desc - Descriptor structure for MSI based interrupts
+ * @list:      List head for management
+ * @irq:       The base interrupt number
+ * @nvec_used: The number of vectors used
+ * @dev:       Pointer to the device which uses this descriptor
+ * @msg:       The last set MSI message cached for reuse
+ *
+ * @masked:    [PCI MSI/X] Mask bits
+ * @is_msix:   [PCI MSI/X] True if MSI-X
+ * @multiple:  [PCI MSI/X] log2 num of messages allocated
+ * @multi_cap: [PCI MSI/X] log2 num of messages supported
+ * @maskbit:   [PCI MSI/X] Mask-Pending bit supported?
+ * @is_64:     [PCI MSI/X] Address size: 0=32bit 1=64bit
+ * @entry_nr:  [PCI MSI/X] Entry which is described by this descriptor
+ * @default_irq:[PCI MSI/X] The default pre-assigned non-MSI irq
+ * @mask_pos:  [PCI MSI]   Mask register position
+ * @mask_base: [PCI MSI-X] Mask register base address
+ */
 struct msi_desc {
-       struct {
-               __u8    is_msix : 1;
-               __u8    multiple: 3;    /* log2 num of messages allocated */
-               __u8    multi_cap : 3;  /* log2 num of messages supported */
-               __u8    maskbit : 1;    /* mask-pending bit supported ? */
-               __u8    is_64   : 1;    /* Address size: 0=32bit 1=64bit */
-               __u16   entry_nr;       /* specific enabled entry */
-               unsigned default_irq;   /* default pre-assigned irq */
-       } msi_attrib;
-
-       u32 masked;                     /* mask bits */
-       unsigned int irq;
-       unsigned int nvec_used;         /* number of messages */
-       struct list_head list;
+       /* Shared device/bus type independent data */
+       struct list_head                list;
+       unsigned int                    irq;
+       unsigned int                    nvec_used;
+       struct device                   *dev;
+       struct msi_msg                  msg;
 
        union {
-               void __iomem *mask_base;
-               u8 mask_pos;
-       };
-       struct pci_dev *dev;
+               /* PCI MSI/X specific data */
+               struct {
+                       u32 masked;
+                       struct {
+                               __u8    is_msix         : 1;
+                               __u8    multiple        : 3;
+                               __u8    multi_cap       : 3;
+                               __u8    maskbit         : 1;
+                               __u8    is_64           : 1;
+                               __u16   entry_nr;
+                               unsigned default_irq;
+                       } msi_attrib;
+                       union {
+                               u8      mask_pos;
+                               void __iomem *mask_base;
+                       };
+               };
 
-       /* Last set MSI message */
-       struct msi_msg msg;
+               /*
+                * Non PCI variants add their data structure here. New
+                * entries need to use a named structure. We want
+                * proper name spaces for this. The PCI part is
+                * anonymous for now as it would require an immediate
+                * tree wide cleanup.
+                */
+       };
 };
 
 /* Helpers to hide struct msi_desc implementation details */
-#define msi_desc_to_dev(desc)          (&(desc)->dev.dev)
-#define dev_to_msi_list(dev)           (&to_pci_dev((dev))->msi_list)
+#define msi_desc_to_dev(desc)          ((desc)->dev)
+#define dev_to_msi_list(dev)           (&(dev)->msi_list)
 #define first_msi_entry(dev)           \
        list_first_entry(dev_to_msi_list((dev)), struct msi_desc, list)
 #define for_each_msi_entry(desc, dev)  \
@@ -56,12 +87,17 @@ struct msi_desc {
 #define for_each_pci_msi_entry(desc, pdev)     \
        for_each_msi_entry((desc), &(pdev)->dev)
 
-static inline struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
+struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
+void *msi_desc_to_pci_sysdata(struct msi_desc *desc);
+#else /* CONFIG_PCI_MSI */
+static inline void *msi_desc_to_pci_sysdata(struct msi_desc *desc)
 {
-       return desc->dev;
+       return NULL;
 }
 #endif /* CONFIG_PCI_MSI */
 
+struct msi_desc *alloc_msi_entry(struct device *dev);
+void free_msi_entry(struct msi_desc *entry);
 void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
index 8a0321a8fb595892c5e80910d5c914c89ded63de..fbf245f5eba78535ab4151ee131065dbbfe3c845 100644 (file)
@@ -366,7 +366,6 @@ struct pci_dev {
        struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
        struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
 #ifdef CONFIG_PCI_MSI
-       struct list_head msi_list;
        const struct attribute_group **msi_irq_groups;
 #endif
        struct pci_vpd *vpd;
index 27f4332c7f84ea8b3d7ec8bb3466a64f225a8487..76f199dc6a5e38bb5b12e92d5ad14843bfd3b650 100644 (file)
@@ -63,7 +63,7 @@ int irq_set_irq_type(unsigned int irq, unsigned int type)
                return -EINVAL;
 
        type &= IRQ_TYPE_SENSE_MASK;
-       ret = __irq_set_trigger(desc, irq, type);
+       ret = __irq_set_trigger(desc, type);
        irq_put_desc_busunlock(desc, flags);
        return ret;
 }
@@ -187,7 +187,7 @@ int irq_startup(struct irq_desc *desc, bool resend)
                irq_enable(desc);
        }
        if (resend)
-               check_irq_resend(desc, desc->irq_data.irq);
+               check_irq_resend(desc);
        return ret;
 }
 
@@ -315,7 +315,7 @@ void handle_nested_irq(unsigned int irq)
        raw_spin_lock_irq(&desc->lock);
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        action = desc->action;
        if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) {
@@ -328,7 +328,7 @@ void handle_nested_irq(unsigned int irq)
 
        action_ret = action->thread_fn(action->irq, action->dev_id);
        if (!noirqdebug)
-               note_interrupt(irq, desc, action_ret);
+               note_interrupt(desc, action_ret);
 
        raw_spin_lock_irq(&desc->lock);
        irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);
@@ -391,7 +391,7 @@ handle_simple_irq(unsigned int irq, struct irq_desc *desc)
                goto out_unlock;
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
                desc->istate |= IRQS_PENDING;
@@ -443,7 +443,7 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc)
                goto out_unlock;
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        /*
         * If its disabled or no action available
@@ -515,7 +515,7 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
                goto out;
 
        desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        /*
         * If its disabled or no action available
@@ -583,7 +583,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc)
                goto out_unlock;
        }
 
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        /* Start handling the irq */
        desc->irq_data.chip->irq_ack(&desc->irq_data);
@@ -646,7 +646,7 @@ void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc)
                goto out_eoi;
        }
 
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        do {
                if (unlikely(!desc->action))
@@ -675,7 +675,7 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
 {
        struct irq_chip *chip = irq_desc_get_chip(desc);
 
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        if (chip->irq_ack)
                chip->irq_ack(&desc->irq_data);
@@ -705,7 +705,7 @@ void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc)
        void *dev_id = raw_cpu_ptr(action->percpu_dev_id);
        irqreturn_t res;
 
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
 
        if (chip->irq_ack)
                chip->irq_ack(&desc->irq_data);
index 15b370daf23446d3a6b5213cbeac4d9559fb095d..abd286afbd2732544e54a4653053a4d9ce785286 100644 (file)
@@ -553,6 +553,9 @@ static int irq_gc_suspend(void)
                        if (data)
                                ct->chip.irq_suspend(data);
                }
+
+               if (gc->suspend)
+                       gc->suspend(gc);
        }
        return 0;
 }
@@ -564,6 +567,9 @@ static void irq_gc_resume(void)
        list_for_each_entry(gc, &gc_list, list) {
                struct irq_chip_type *ct = gc->chip_types;
 
+               if (gc->resume)
+                       gc->resume(gc);
+
                if (ct->chip.irq_resume) {
                        struct irq_data *data = irq_gc_get_irq_data(gc);
 
index 635480270858448064b1afa54bf616f074744d60..b6eeea8a80c5bbb7143b41ebcaa6f1132eedc7b4 100644 (file)
@@ -30,7 +30,7 @@
 void handle_bad_irq(unsigned int irq, struct irq_desc *desc)
 {
        print_irq_desc(irq, desc);
-       kstat_incr_irqs_this_cpu(irq, desc);
+       kstat_incr_irqs_this_cpu(desc);
        ack_bad_irq(irq);
 }
 
@@ -176,7 +176,7 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
        add_interrupt_randomness(irq, flags);
 
        if (!noirqdebug)
-               note_interrupt(irq, desc, retval);
+               note_interrupt(desc, retval);
        return retval;
 }
 
index 61008b8433ab78f5364ac2512d956fd554614690..eee4b385cffb46f260db19bfd9f9f5fbf7044224 100644 (file)
@@ -59,10 +59,9 @@ enum {
 #include "debug.h"
 #include "settings.h"
 
-extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
-               unsigned long flags);
-extern void __disable_irq(struct irq_desc *desc, unsigned int irq);
-extern void __enable_irq(struct irq_desc *desc, unsigned int irq);
+extern int __irq_set_trigger(struct irq_desc *desc, unsigned long flags);
+extern void __disable_irq(struct irq_desc *desc);
+extern void __enable_irq(struct irq_desc *desc);
 
 extern int irq_startup(struct irq_desc *desc, bool resend);
 extern void irq_shutdown(struct irq_desc *desc);
@@ -86,7 +85,7 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *act
 irqreturn_t handle_irq_event(struct irq_desc *desc);
 
 /* Resending of interrupts :*/
-void check_irq_resend(struct irq_desc *desc, unsigned int irq);
+void check_irq_resend(struct irq_desc *desc);
 bool irq_wait_for_poll(struct irq_desc *desc);
 void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action);
 
@@ -187,7 +186,7 @@ static inline bool irqd_has_set(struct irq_data *d, unsigned int mask)
        return __irqd_to_state(d) & mask;
 }
 
-static inline void kstat_incr_irqs_this_cpu(unsigned int irq, struct irq_desc *desc)
+static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc)
 {
        __this_cpu_inc(*desc->kstat_irqs);
        __this_cpu_inc(kstat.irqs_sum);
index 4afc457613ddf7da1bd845733e68ec22af099ec0..0a2a4b697bcbffcc219b024a04113e1358d109d9 100644 (file)
@@ -582,7 +582,7 @@ int irq_set_percpu_devid(unsigned int irq)
 
 void kstat_incr_irq_this_cpu(unsigned int irq)
 {
-       kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq));
+       kstat_incr_irqs_this_cpu(irq_to_desc(irq));
 }
 
 /**
index f9744853b656976bc4fdc49e006464a08a7d5395..ad1b064f94fee7cf19e1d6c5592832184fcda3ff 100644 (file)
@@ -115,6 +115,14 @@ EXPORT_SYMBOL(synchronize_irq);
 #ifdef CONFIG_SMP
 cpumask_var_t irq_default_affinity;
 
+static int __irq_can_set_affinity(struct irq_desc *desc)
+{
+       if (!desc || !irqd_can_balance(&desc->irq_data) ||
+           !desc->irq_data.chip || !desc->irq_data.chip->irq_set_affinity)
+               return 0;
+       return 1;
+}
+
 /**
  *     irq_can_set_affinity - Check if the affinity of a given irq can be set
  *     @irq:           Interrupt to check
@@ -122,13 +130,7 @@ cpumask_var_t irq_default_affinity;
  */
 int irq_can_set_affinity(unsigned int irq)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
-
-       if (!desc || !irqd_can_balance(&desc->irq_data) ||
-           !desc->irq_data.chip || !desc->irq_data.chip->irq_set_affinity)
-               return 0;
-
-       return 1;
+       return __irq_can_set_affinity(irq_to_desc(irq));
 }
 
 /**
@@ -359,14 +361,13 @@ EXPORT_SYMBOL_GPL(irq_set_affinity_notifier);
 /*
  * Generic version of the affinity autoselector.
  */
-static int
-setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
+static int setup_affinity(struct irq_desc *desc, struct cpumask *mask)
 {
        struct cpumask *set = irq_default_affinity;
        int node = irq_desc_get_node(desc);
 
        /* Excludes PER_CPU and NO_BALANCE interrupts */
-       if (!irq_can_set_affinity(irq))
+       if (!__irq_can_set_affinity(desc))
                return 0;
 
        /*
@@ -393,10 +394,10 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
        return 0;
 }
 #else
-static inline int
-setup_affinity(unsigned int irq, struct irq_desc *d, struct cpumask *mask)
+/* Wrapper for ALPHA specific affinity selector magic */
+static inline int setup_affinity(struct irq_desc *d, struct cpumask *mask)
 {
-       return irq_select_affinity(irq);
+       return irq_select_affinity(irq_desc_get_irq(d));
 }
 #endif
 
@@ -410,20 +411,20 @@ int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask)
        int ret;
 
        raw_spin_lock_irqsave(&desc->lock, flags);
-       ret = setup_affinity(irq, desc, mask);
+       ret = setup_affinity(desc, mask);
        raw_spin_unlock_irqrestore(&desc->lock, flags);
        return ret;
 }
 
 #else
 static inline int
-setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
+setup_affinity(struct irq_desc *desc, struct cpumask *mask)
 {
        return 0;
 }
 #endif
 
-void __disable_irq(struct irq_desc *desc, unsigned int irq)
+void __disable_irq(struct irq_desc *desc)
 {
        if (!desc->depth++)
                irq_disable(desc);
@@ -436,7 +437,7 @@ static int __disable_irq_nosync(unsigned int irq)
 
        if (!desc)
                return -EINVAL;
-       __disable_irq(desc, irq);
+       __disable_irq(desc);
        irq_put_desc_busunlock(desc, flags);
        return 0;
 }
@@ -503,12 +504,13 @@ bool disable_hardirq(unsigned int irq)
 }
 EXPORT_SYMBOL_GPL(disable_hardirq);
 
-void __enable_irq(struct irq_desc *desc, unsigned int irq)
+void __enable_irq(struct irq_desc *desc)
 {
        switch (desc->depth) {
        case 0:
  err_out:
-               WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq);
+               WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n",
+                    irq_desc_get_irq(desc));
                break;
        case 1: {
                if (desc->istate & IRQS_SUSPENDED)
@@ -516,7 +518,7 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq)
                /* Prevent probing on this irq: */
                irq_settings_set_noprobe(desc);
                irq_enable(desc);
-               check_irq_resend(desc, irq);
+               check_irq_resend(desc);
                /* fall-through */
        }
        default:
@@ -546,7 +548,7 @@ void enable_irq(unsigned int irq)
                 KERN_ERR "enable_irq before setup/request_irq: irq %u\n", irq))
                goto out;
 
-       __enable_irq(desc, irq);
+       __enable_irq(desc);
 out:
        irq_put_desc_busunlock(desc, flags);
 }
@@ -637,8 +639,7 @@ int can_request_irq(unsigned int irq, unsigned long irqflags)
        return canrequest;
 }
 
-int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
-                     unsigned long flags)
+int __irq_set_trigger(struct irq_desc *desc, unsigned long flags)
 {
        struct irq_chip *chip = desc->irq_data.chip;
        int ret, unmask = 0;
@@ -648,7 +649,8 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
                 * IRQF_TRIGGER_* but the PIC does not support multiple
                 * flow-types?
                 */
-               pr_debug("No set_type function for IRQ %d (%s)\n", irq,
+               pr_debug("No set_type function for IRQ %d (%s)\n",
+                        irq_desc_get_irq(desc),
                         chip ? (chip->name ? : "unknown") : "unknown");
                return 0;
        }
@@ -685,7 +687,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
                break;
        default:
                pr_err("Setting trigger mode %lu for irq %u failed (%pF)\n",
-                      flags, irq, chip->irq_set_type);
+                      flags, irq_desc_get_irq(desc), chip->irq_set_type);
        }
        if (unmask)
                unmask_irq(desc);
@@ -1221,8 +1223,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 
                /* Setup the type (level, edge polarity) if configured: */
                if (new->flags & IRQF_TRIGGER_MASK) {
-                       ret = __irq_set_trigger(desc, irq,
-                                       new->flags & IRQF_TRIGGER_MASK);
+                       ret = __irq_set_trigger(desc,
+                                               new->flags & IRQF_TRIGGER_MASK);
 
                        if (ret)
                                goto out_mask;
@@ -1253,7 +1255,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
                }
 
                /* Set default affinity mask once everything is setup */
-               setup_affinity(irq, desc, mask);
+               setup_affinity(desc, mask);
 
        } else if (new->flags & IRQF_TRIGGER_MASK) {
                unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK;
@@ -1280,7 +1282,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
         */
        if (shared && (desc->istate & IRQS_SPURIOUS_DISABLED)) {
                desc->istate &= ~IRQS_SPURIOUS_DISABLED;
-               __enable_irq(desc, irq);
+               __enable_irq(desc);
        }
 
        raw_spin_unlock_irqrestore(&desc->lock, flags);
@@ -1650,7 +1652,7 @@ void enable_percpu_irq(unsigned int irq, unsigned int type)
        if (type != IRQ_TYPE_NONE) {
                int ret;
 
-               ret = __irq_set_trigger(desc, irq, type);
+               ret = __irq_set_trigger(desc, type);
 
                if (ret) {
                        WARN(1, "failed to set type for IRQ%d\n", irq);
@@ -1875,6 +1877,7 @@ int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
        irq_put_desc_busunlock(desc, flags);
        return err;
 }
+EXPORT_SYMBOL_GPL(irq_get_irqchip_state);
 
 /**
  *     irq_set_irqchip_state - set the state of a forwarded interrupt.
@@ -1920,3 +1923,4 @@ int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
        irq_put_desc_busunlock(desc, flags);
        return err;
 }
+EXPORT_SYMBOL_GPL(irq_set_irqchip_state);
index 7bf1f1bbb7fa5620a270ca1d42d9d54e54b61288..7e6512b9dc1ff2682394cdd0fea9a8c6d01cf6e9 100644 (file)
 /* Temparory solution for building, will be removed later */
 #include <linux/pci.h>
 
+struct msi_desc *alloc_msi_entry(struct device *dev)
+{
+       struct msi_desc *desc = kzalloc(sizeof(*desc), GFP_KERNEL);
+       if (!desc)
+               return NULL;
+
+       INIT_LIST_HEAD(&desc->list);
+       desc->dev = dev;
+
+       return desc;
+}
+
+void free_msi_entry(struct msi_desc *entry)
+{
+       kfree(entry);
+}
+
 void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 {
        *msg = entry->msg;
index d22786a6dbde92eec5cc6b17a198cf309328b27a..21c62617a35a6dae316b22221b3b4896317faedd 100644 (file)
@@ -68,7 +68,7 @@ void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action)
                desc->cond_suspend_depth--;
 }
 
-static bool suspend_device_irq(struct irq_desc *desc, int irq)
+static bool suspend_device_irq(struct irq_desc *desc)
 {
        if (!desc->action || desc->no_suspend_depth)
                return false;
@@ -85,7 +85,7 @@ static bool suspend_device_irq(struct irq_desc *desc, int irq)
        }
 
        desc->istate |= IRQS_SUSPENDED;
-       __disable_irq(desc, irq);
+       __disable_irq(desc);
 
        /*
         * Hardware which has no wakeup source configuration facility
@@ -126,7 +126,7 @@ void suspend_device_irqs(void)
                if (irq_settings_is_nested_thread(desc))
                        continue;
                raw_spin_lock_irqsave(&desc->lock, flags);
-               sync = suspend_device_irq(desc, irq);
+               sync = suspend_device_irq(desc);
                raw_spin_unlock_irqrestore(&desc->lock, flags);
 
                if (sync)
@@ -135,7 +135,7 @@ void suspend_device_irqs(void)
 }
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
-static void resume_irq(struct irq_desc *desc, int irq)
+static void resume_irq(struct irq_desc *desc)
 {
        irqd_clear(&desc->irq_data, IRQD_WAKEUP_ARMED);
 
@@ -150,7 +150,7 @@ static void resume_irq(struct irq_desc *desc, int irq)
        desc->depth++;
 resume:
        desc->istate &= ~IRQS_SUSPENDED;
-       __enable_irq(desc, irq);
+       __enable_irq(desc);
 }
 
 static void resume_irqs(bool want_early)
@@ -169,7 +169,7 @@ static void resume_irqs(bool want_early)
                        continue;
 
                raw_spin_lock_irqsave(&desc->lock, flags);
-               resume_irq(desc, irq);
+               resume_irq(desc);
                raw_spin_unlock_irqrestore(&desc->lock, flags);
        }
 }
index 7a5237a1bce5b5626d74cdb377f8e5a900d06f7a..dd95f44f99b226d8f44f3a2a3ba5284e2f6ecdf5 100644 (file)
@@ -53,7 +53,7 @@ static DECLARE_TASKLET(resend_tasklet, resend_irqs, 0);
  *
  * Is called with interrupts disabled and desc->lock held.
  */
-void check_irq_resend(struct irq_desc *desc, unsigned int irq)
+void check_irq_resend(struct irq_desc *desc)
 {
        /*
         * We do not resend level type interrupts. Level type
@@ -74,6 +74,8 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)
                if (!desc->irq_data.chip->irq_retrigger ||
                    !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
 #ifdef CONFIG_HARDIRQS_SW_RESEND
+                       unsigned int irq = irq_desc_get_irq(desc);
+
                        /*
                         * If the interrupt is running in the thread
                         * context of the parent irq we need to be
index e2514b0e439e942e19245558e0fad10918f84371..32144175458d77d39dc65353770aa187818dfe6f 100644 (file)
@@ -60,7 +60,7 @@ bool irq_wait_for_poll(struct irq_desc *desc)
 /*
  * Recovery handler for misrouted interrupts.
  */
-static int try_one_irq(int irq, struct irq_desc *desc, bool force)
+static int try_one_irq(struct irq_desc *desc, bool force)
 {
        irqreturn_t ret = IRQ_NONE;
        struct irqaction *action;
@@ -133,7 +133,7 @@ static int misrouted_irq(int irq)
                if (i == irq)   /* Already tried */
                        continue;
 
-               if (try_one_irq(i, desc, false))
+               if (try_one_irq(desc, false))
                        ok = 1;
        }
 out:
@@ -164,7 +164,7 @@ static void poll_spurious_irqs(unsigned long dummy)
                        continue;
 
                local_irq_disable();
-               try_one_irq(i, desc, true);
+               try_one_irq(desc, true);
                local_irq_enable();
        }
 out:
@@ -188,10 +188,9 @@ static inline int bad_action_ret(irqreturn_t action_ret)
  * (The other 100-of-100,000 interrupts may have been a correctly
  *  functioning device sharing an IRQ with the failing one)
  */
-static void
-__report_bad_irq(unsigned int irq, struct irq_desc *desc,
-                irqreturn_t action_ret)
+static void __report_bad_irq(struct irq_desc *desc, irqreturn_t action_ret)
 {
+       unsigned int irq = irq_desc_get_irq(desc);
        struct irqaction *action;
        unsigned long flags;
 
@@ -224,14 +223,13 @@ __report_bad_irq(unsigned int irq, struct irq_desc *desc,
        raw_spin_unlock_irqrestore(&desc->lock, flags);
 }
 
-static void
-report_bad_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret)
+static void report_bad_irq(struct irq_desc *desc, irqreturn_t action_ret)
 {
        static int count = 100;
 
        if (count > 0) {
                count--;
-               __report_bad_irq(irq, desc, action_ret);
+               __report_bad_irq(desc, action_ret);
        }
 }
 
@@ -272,15 +270,16 @@ try_misrouted_irq(unsigned int irq, struct irq_desc *desc,
 
 #define SPURIOUS_DEFERRED      0x80000000
 
-void note_interrupt(unsigned int irq, struct irq_desc *desc,
-                   irqreturn_t action_ret)
+void note_interrupt(struct irq_desc *desc, irqreturn_t action_ret)
 {
+       unsigned int irq;
+
        if (desc->istate & IRQS_POLL_INPROGRESS ||
            irq_settings_is_polled(desc))
                return;
 
        if (bad_action_ret(action_ret)) {
-               report_bad_irq(irq, desc, action_ret);
+               report_bad_irq(desc, action_ret);
                return;
        }
 
@@ -398,6 +397,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
                desc->last_unhandled = jiffies;
        }
 
+       irq = irq_desc_get_irq(desc);
        if (unlikely(try_misrouted_irq(irq, desc, action_ret))) {
                int ok = misrouted_irq(irq);
                if (action_ret == IRQ_NONE)
@@ -413,7 +413,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
                /*
                 * The interrupt is stuck
                 */
-               __report_bad_irq(irq, desc, action_ret);
+               __report_bad_irq(desc, action_ret);
                /*
                 * Now kill the IRQ
                 */