diff options
author | Luka Perkov <luka@openwrt.org> | 2014-02-11 02:07:44 +0000 |
---|---|---|
committer | Luka Perkov <luka@openwrt.org> | 2014-02-11 02:07:44 +0000 |
commit | c9ae111a20be4c9555128cced8edded660d133df (patch) | |
tree | fd4809b562d454394cbb9ec517bf3f1ef2d5b6f2 /target/linux/mvebu/patches-3.10/0184-of-irq-Replace-of_irq-with-of_phandle_args.patch | |
parent | 3af779eb172b0438f77e8a01a97dd0eb9a146076 (diff) | |
download | upstream-c9ae111a20be4c9555128cced8edded660d133df.tar.gz upstream-c9ae111a20be4c9555128cced8edded660d133df.tar.bz2 upstream-c9ae111a20be4c9555128cced8edded660d133df.zip |
mvebu: backport mainline patches from kernel 3.13
This is a backport of the patches accepted to the Linux mainline related to
mvebu SoC (Armada XP and Armada 370) between Linux v3.12, and Linux v3.13.
This work mainly covers:
* Finishes work for sharing the pxa nand driver(drivers/mtd/nand/pxa3xx_nand.c)
between the PXA family, and the Armada family.
* timer initialization update, and access function for the Armada family.
* Generic IRQ handling backporting.
* Some bug fixes.
Signed-off-by: Seif Mazareeb <seif.mazareeb@gmail.com>
CC: Luka Perkov <luka@openwrt.org>
SVN-Revision: 39566
Diffstat (limited to 'target/linux/mvebu/patches-3.10/0184-of-irq-Replace-of_irq-with-of_phandle_args.patch')
-rw-r--r-- | target/linux/mvebu/patches-3.10/0184-of-irq-Replace-of_irq-with-of_phandle_args.patch | 486 |
1 files changed, 486 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-3.10/0184-of-irq-Replace-of_irq-with-of_phandle_args.patch b/target/linux/mvebu/patches-3.10/0184-of-irq-Replace-of_irq-with-of_phandle_args.patch new file mode 100644 index 0000000000..f22da5fa90 --- /dev/null +++ b/target/linux/mvebu/patches-3.10/0184-of-irq-Replace-of_irq-with-of_phandle_args.patch @@ -0,0 +1,486 @@ +From 1baf727ee1d863a0eacd249cff6afc99022593c2 Mon Sep 17 00:00:00 2001 +From: Grant Likely <grant.likely@linaro.org> +Date: Thu, 19 Dec 2013 09:30:55 -0300 +Subject: [PATCH 184/203] of/irq: Replace of_irq with of_phandle_args + +struct of_irq and struct of_phandle_args are exactly the same structure. +This patch makes the kernel use of_phandle_args everywhere. This in +itself isn't a big deal, but it makes some follow-on patches simpler. + +Signed-off-by: Grant Likely <grant.likely@linaro.org> +Acked-by: Michal Simek <monstr@monstr.eu> +Acked-by: Tony Lindgren <tony@atomide.com> +Cc: Russell King <linux@arm.linux.org.uk> +Cc: Ralf Baechle <ralf@linux-mips.org> +Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> + +Conflicts: + arch/mips/pci/pci-rt3883.c +--- + arch/arm/mach-integrator/pci_v3.c | 5 ++--- + arch/microblaze/pci/pci-common.c | 9 ++++----- + arch/mips/pci/fixup-lantiq.c | 5 ++--- + arch/powerpc/kernel/pci-common.c | 9 ++++----- + arch/powerpc/platforms/cell/celleb_scc_pciex.c | 5 ++--- + arch/powerpc/platforms/cell/celleb_scc_sio.c | 5 ++--- + arch/powerpc/platforms/cell/spider-pic.c | 6 +++--- + arch/powerpc/platforms/cell/spu_manage.c | 12 ++++++------ + arch/powerpc/platforms/fsl_uli1575.c | 8 +++----- + arch/powerpc/platforms/powermac/pic.c | 8 ++++---- + arch/powerpc/platforms/pseries/event_sources.c | 7 +++---- + arch/powerpc/sysdev/mpic_msi.c | 6 +++--- + arch/x86/kernel/devicetree.c | 5 ++--- + drivers/of/irq.c | 15 +++++++-------- + drivers/of/of_pci_irq.c | 2 +- + drivers/pci/host/pci-mvebu.c | 5 ++--- + include/linux/of_irq.h | 24 ++++-------------------- + include/linux/of_pci.h | 4 ++-- + 18 files changed, 56 insertions(+), 84 deletions(-) + +--- a/arch/arm/mach-integrator/pci_v3.c ++++ b/arch/arm/mach-integrator/pci_v3.c +@@ -684,7 +684,7 @@ static struct hw_pci pci_v3 __initdata = + + static int __init pci_v3_map_irq_dt(const struct pci_dev *dev, u8 slot, u8 pin) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + int ret; + + ret = of_irq_parse_pci(dev, &oirq); +@@ -694,8 +694,7 @@ static int __init pci_v3_map_irq_dt(cons + return 0; + } + +- return irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ return irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + } + + static int __init pci_v3_dtprobe(struct platform_device *pdev, +--- a/arch/microblaze/pci/pci-common.c ++++ b/arch/microblaze/pci/pci-common.c +@@ -199,7 +199,7 @@ void pcibios_set_master(struct pci_dev * + */ + int pci_read_irq_line(struct pci_dev *pci_dev) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + unsigned int virq; + + /* The current device-tree that iSeries generates from the HV +@@ -243,11 +243,10 @@ int pci_read_irq_line(struct pci_dev *pc + irq_set_irq_type(virq, IRQ_TYPE_LEVEL_LOW); + } else { + pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n", +- oirq.size, oirq.specifier[0], oirq.specifier[1], +- of_node_full_name(oirq.controller)); ++ oirq.args_count, oirq.args[0], oirq.args[1], ++ of_node_full_name(oirq.np)); + +- virq = irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ virq = irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + } + if (!virq) { + pr_debug(" Failed to map !\n"); +--- a/arch/mips/pci/fixup-lantiq.c ++++ b/arch/mips/pci/fixup-lantiq.c +@@ -25,7 +25,7 @@ int pcibios_plat_dev_init(struct pci_dev + + int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) + { +- struct of_irq dev_irq; ++ struct of_phandle_args dev_irq; + int irq; + + if (of_irq_parse_pci(dev, &dev_irq)) { +@@ -33,8 +33,7 @@ int __init pcibios_map_irq(const struct + slot, pin); + return 0; + } +- irq = irq_create_of_mapping(dev_irq.controller, dev_irq.specifier, +- dev_irq.size); ++ irq = irq_create_of_mapping(dev_irq.np, dev_irq.args, dev_irq.args_count); + dev_info(&dev->dev, "SLOT:%d PIN:%d IRQ:%d\n", slot, pin, irq); + return irq; + } +--- a/arch/powerpc/kernel/pci-common.c ++++ b/arch/powerpc/kernel/pci-common.c +@@ -228,7 +228,7 @@ int pcibios_add_platform_entries(struct + */ + static int pci_read_irq_line(struct pci_dev *pci_dev) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + unsigned int virq; + + pr_debug("PCI: Try to map irq for %s...\n", pci_name(pci_dev)); +@@ -263,11 +263,10 @@ static int pci_read_irq_line(struct pci_ + irq_set_irq_type(virq, IRQ_TYPE_LEVEL_LOW); + } else { + pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n", +- oirq.size, oirq.specifier[0], oirq.specifier[1], +- of_node_full_name(oirq.controller)); ++ oirq.args_count, oirq.args[0], oirq.args[1], ++ of_node_full_name(oirq.np)); + +- virq = irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ virq = irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + } + if(virq == NO_IRQ) { + pr_debug(" Failed to map !\n"); +--- a/arch/powerpc/platforms/cell/celleb_scc_pciex.c ++++ b/arch/powerpc/platforms/cell/celleb_scc_pciex.c +@@ -486,7 +486,7 @@ static __init int celleb_setup_pciex(str + struct pci_controller *phb) + { + struct resource r; +- struct of_irq oirq; ++ struct of_phandle_args oirq; + int virq; + + /* SMMIO registers; used inside this file */ +@@ -511,8 +511,7 @@ static __init int celleb_setup_pciex(str + pr_err("PCIEXC:Failed to map irq\n"); + goto error; + } +- virq = irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ virq = irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + if (request_irq(virq, pciex_handle_internal_irq, + 0, "pciex", (void *)phb)) { + pr_err("PCIEXC:Failed to request irq\n"); +--- a/arch/powerpc/platforms/cell/celleb_scc_sio.c ++++ b/arch/powerpc/platforms/cell/celleb_scc_sio.c +@@ -45,7 +45,7 @@ static int __init txx9_serial_init(void) + struct device_node *node; + int i; + struct uart_port req; +- struct of_irq irq; ++ struct of_phandle_args irq; + struct resource res; + + for_each_compatible_node(node, "serial", "toshiba,sio-scc") { +@@ -66,8 +66,7 @@ static int __init txx9_serial_init(void) + #ifdef CONFIG_SERIAL_TXX9_CONSOLE + req.membase = ioremap(req.mapbase, 0x24); + #endif +- req.irq = irq_create_of_mapping(irq.controller, +- irq.specifier, irq.size); ++ req.irq = irq_create_of_mapping(irq.np, irq.args, irq.args_count); + req.flags |= UPF_IOREMAP | UPF_BUGGY_UART + /*HAVE_CTS_LINE*/; + req.uartclk = 83300000; +--- a/arch/powerpc/platforms/cell/spider-pic.c ++++ b/arch/powerpc/platforms/cell/spider-pic.c +@@ -235,10 +235,10 @@ static unsigned int __init spider_find_c + /* First, we check whether we have a real "interrupts" in the device + * tree in case the device-tree is ever fixed + */ +- struct of_irq oirq; ++ struct of_phandle_args oirq; + if (of_irq_parse_one(pic->host->of_node, 0, &oirq) == 0) { +- virq = irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ virq = irq_create_of_mapping(oirq.np, oirq.args, ++ oirq.args_count); + return virq; + } + +--- a/arch/powerpc/platforms/cell/spu_manage.c ++++ b/arch/powerpc/platforms/cell/spu_manage.c +@@ -177,7 +177,7 @@ out: + + static int __init spu_map_interrupts(struct spu *spu, struct device_node *np) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + int ret; + int i; + +@@ -188,10 +188,10 @@ static int __init spu_map_interrupts(str + goto err; + } + ret = -EINVAL; +- pr_debug(" irq %d no 0x%x on %s\n", i, oirq.specifier[0], +- oirq.controller->full_name); +- spu->irqs[i] = irq_create_of_mapping(oirq.controller, +- oirq.specifier, oirq.size); ++ pr_debug(" irq %d no 0x%x on %s\n", i, oirq.args[0], ++ oirq.np->full_name); ++ spu->irqs[i] = irq_create_of_mapping(oirq.np, ++ oirq.args, oirq.args_count); + if (spu->irqs[i] == NO_IRQ) { + pr_debug("spu_new: failed to map it !\n"); + goto err; +@@ -200,7 +200,7 @@ static int __init spu_map_interrupts(str + return 0; + + err: +- pr_debug("failed to map irq %x for spu %s\n", *oirq.specifier, ++ pr_debug("failed to map irq %x for spu %s\n", *oirq.args, + spu->name); + for (; i >= 0; i--) { + if (spu->irqs[i] != NO_IRQ) +--- a/arch/powerpc/platforms/fsl_uli1575.c ++++ b/arch/powerpc/platforms/fsl_uli1575.c +@@ -321,8 +321,8 @@ static void hpcd_final_uli5288(struct pc + { + struct pci_controller *hose = pci_bus_to_host(dev->bus); + struct device_node *hosenode = hose ? hose->dn : NULL; +- struct of_irq oirq; +- int virq, pin = 2; ++ struct of_phandle_args oirq; ++ int pin = 2; + u32 laddr[3]; + + if (!machine_is(mpc86xx_hpcd)) +@@ -334,9 +334,7 @@ static void hpcd_final_uli5288(struct pc + laddr[0] = (hose->first_busno << 16) | (PCI_DEVFN(31, 0) << 8); + laddr[1] = laddr[2] = 0; + of_irq_parse_raw(hosenode, &pin, 1, laddr, &oirq); +- virq = irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); +- dev->irq = virq; ++ dev->irq = irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + } + + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, hpcd_quirk_uli1575); +--- a/arch/powerpc/platforms/powermac/pic.c ++++ b/arch/powerpc/platforms/powermac/pic.c +@@ -394,7 +394,7 @@ static void __init pmac_pic_probe_oldsty + } + + int of_irq_parse_oldworld(struct device_node *device, int index, +- struct of_irq *out_irq) ++ struct of_phandle_args *out_irq) + { + const u32 *ints = NULL; + int intlen; +@@ -422,9 +422,9 @@ int of_irq_parse_oldworld(struct device_ + if (index >= intlen) + return -EINVAL; + +- out_irq->controller = NULL; +- out_irq->specifier[0] = ints[index]; +- out_irq->size = 1; ++ out_irq->np = NULL; ++ out_irq->args[0] = ints[index]; ++ out_irq->args_count = 1; + + return 0; + } +--- a/arch/powerpc/platforms/pseries/event_sources.c ++++ b/arch/powerpc/platforms/pseries/event_sources.c +@@ -25,7 +25,7 @@ void request_event_sources_irqs(struct d + const char *name) + { + int i, index, count = 0; +- struct of_irq oirq; ++ struct of_phandle_args oirq; + const u32 *opicprop; + unsigned int opicplen; + unsigned int virqs[16]; +@@ -59,9 +59,8 @@ void request_event_sources_irqs(struct d + index++) { + if (count > 15) + break; +- virqs[count] = irq_create_of_mapping(oirq.controller, +- oirq.specifier, +- oirq.size); ++ virqs[count] = irq_create_of_mapping(oirq.np, oirq.args, ++ oirq.args_count); + if (virqs[count] == NO_IRQ) { + pr_err("event-sources: Unable to allocate " + "interrupt number for %s\n", +--- a/arch/powerpc/sysdev/mpic_msi.c ++++ b/arch/powerpc/sysdev/mpic_msi.c +@@ -35,7 +35,7 @@ static int mpic_msi_reserve_u3_hwirqs(st + const struct irq_domain_ops *ops = mpic->irqhost->ops; + struct device_node *np; + int flags, index, i; +- struct of_irq oirq; ++ struct of_phandle_args oirq; + + pr_debug("mpic: found U3, guessing msi allocator setup\n"); + +@@ -64,8 +64,8 @@ static int mpic_msi_reserve_u3_hwirqs(st + + index = 0; + while (of_irq_parse_one(np, index++, &oirq) == 0) { +- ops->xlate(mpic->irqhost, NULL, oirq.specifier, +- oirq.size, &hwirq, &flags); ++ ops->xlate(mpic->irqhost, NULL, oirq.args, ++ oirq.args_count, &hwirq, &flags); + msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq); + } + } +--- a/arch/x86/kernel/devicetree.c ++++ b/arch/x86/kernel/devicetree.c +@@ -106,7 +106,7 @@ struct device_node *pcibios_get_phb_of_n + + static int x86_of_pci_irq_enable(struct pci_dev *dev) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + u32 virq; + int ret; + u8 pin; +@@ -121,8 +121,7 @@ static int x86_of_pci_irq_enable(struct + if (ret) + return ret; + +- virq = irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ virq = irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + if (virq == 0) + return -EINVAL; + dev->irq = virq; +--- a/drivers/of/irq.c ++++ b/drivers/of/irq.c +@@ -36,13 +36,12 @@ + */ + unsigned int irq_of_parse_and_map(struct device_node *dev, int index) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + + if (of_irq_parse_one(dev, index, &oirq)) + return 0; + +- return irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ return irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + } + EXPORT_SYMBOL_GPL(irq_of_parse_and_map); + +@@ -94,7 +93,7 @@ struct device_node *of_irq_find_parent(s + * node exist for the parent. + */ + int of_irq_parse_raw(struct device_node *parent, const __be32 *intspec, +- u32 ointsize, const __be32 *addr, struct of_irq *out_irq) ++ u32 ointsize, const __be32 *addr, struct of_phandle_args *out_irq) + { + struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL; + const __be32 *tmp, *imap, *imask; +@@ -156,10 +155,10 @@ int of_irq_parse_raw(struct device_node + NULL) { + pr_debug(" -> got it !\n"); + for (i = 0; i < intsize; i++) +- out_irq->specifier[i] = ++ out_irq->args[i] = + of_read_number(intspec +i, 1); +- out_irq->size = intsize; +- out_irq->controller = ipar; ++ out_irq->args_count = intsize; ++ out_irq->np = ipar; + of_node_put(old); + return 0; + } +@@ -280,7 +279,7 @@ EXPORT_SYMBOL_GPL(of_irq_parse_raw); + * This function resolves an interrupt, walking the tree, for a given + * device-tree node. It's the high level pendant to of_irq_parse_raw(). + */ +-int of_irq_parse_one(struct device_node *device, int index, struct of_irq *out_irq) ++int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_args *out_irq) + { + struct device_node *p; + const __be32 *intspec, *tmp, *addr; +--- a/drivers/of/of_pci_irq.c ++++ b/drivers/of/of_pci_irq.c +@@ -15,7 +15,7 @@ + * PCI tree until an device-node is found, at which point it will finish + * resolving using the OF tree walking. + */ +-int of_irq_parse_pci(const struct pci_dev *pdev, struct of_irq *out_irq) ++int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq) + { + struct device_node *dn, *ppnode; + struct pci_dev *ppdev; +--- a/drivers/pci/host/pci-mvebu.c ++++ b/drivers/pci/host/pci-mvebu.c +@@ -649,15 +649,14 @@ static int __init mvebu_pcie_setup(int n + + static int __init mvebu_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) + { +- struct of_irq oirq; ++ struct of_phandle_args oirq; + int ret; + + ret = of_irq_parse_pci(dev, &oirq); + if (ret) + return ret; + +- return irq_create_of_mapping(oirq.controller, oirq.specifier, +- oirq.size); ++ return irq_create_of_mapping(oirq.np, oirq.args, oirq.args_count); + } + + static struct pci_bus *mvebu_pcie_scan_bus(int nr, struct pci_sys_data *sys) +--- a/include/linux/of_irq.h ++++ b/include/linux/of_irq.h +@@ -8,22 +8,6 @@ + #include <linux/ioport.h> + #include <linux/of.h> + +-/** +- * of_irq - container for device_node/irq_specifier pair for an irq controller +- * @controller: pointer to interrupt controller device tree node +- * @size: size of interrupt specifier +- * @specifier: array of cells @size long specifing the specific interrupt +- * +- * This structure is returned when an interrupt is mapped. The controller +- * field needs to be put() after use +- */ +-#define OF_MAX_IRQ_SPEC 4 /* We handle specifiers of at most 4 cells */ +-struct of_irq { +- struct device_node *controller; /* Interrupt controller node */ +- u32 size; /* Specifier size */ +- u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ +-}; +- + typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *); + + /* +@@ -36,12 +20,12 @@ typedef int (*of_irq_init_cb_t)(struct d + extern unsigned int of_irq_workarounds; + extern struct device_node *of_irq_dflt_pic; + extern int of_irq_parse_oldworld(struct device_node *device, int index, +- struct of_irq *out_irq); ++ struct of_phandle_args *out_irq); + #else /* CONFIG_PPC32 && CONFIG_PPC_PMAC */ + #define of_irq_workarounds (0) + #define of_irq_dflt_pic (NULL) + static inline int of_irq_parse_oldworld(struct device_node *device, int index, +- struct of_irq *out_irq) ++ struct of_phandle_args *out_irq) + { + return -EINVAL; + } +@@ -50,9 +34,9 @@ static inline int of_irq_parse_oldworld( + + extern int of_irq_parse_raw(struct device_node *parent, const __be32 *intspec, + u32 ointsize, const __be32 *addr, +- struct of_irq *out_irq); ++ struct of_phandle_args *out_irq); + extern int of_irq_parse_one(struct device_node *device, int index, +- struct of_irq *out_irq); ++ struct of_phandle_args *out_irq); + extern unsigned int irq_create_of_mapping(struct device_node *controller, + const u32 *intspec, + unsigned int intsize); +--- a/include/linux/of_pci.h ++++ b/include/linux/of_pci.h +@@ -5,8 +5,8 @@ + #include <linux/msi.h> + + struct pci_dev; +-struct of_irq; +-int of_irq_parse_pci(const struct pci_dev *pdev, struct of_irq *out_irq); ++struct of_phandle_args; ++int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq); + + struct device_node; + struct device_node *of_pci_find_child_device(struct device_node *parent, |