summaryrefslogtreecommitdiffstats
path: root/drivers/of/of_pci_irq.c
diff options
context:
space:
mode:
authorGrant Likely2013-09-15 23:32:39 +0200
committerGrant Likely2013-10-24 12:43:04 +0200
commit2361613206e66ce59cc0e08efa8d98ec15b84ed1 (patch)
tree5e4f5fc33f715202f71770890dcc09ac09a2d851 /drivers/of/of_pci_irq.c
parentof/irq: simplify args to irq_create_of_mapping (diff)
downloadkernel-qcow2-linux-2361613206e66ce59cc0e08efa8d98ec15b84ed1.tar.gz
kernel-qcow2-linux-2361613206e66ce59cc0e08efa8d98ec15b84ed1.tar.xz
kernel-qcow2-linux-2361613206e66ce59cc0e08efa8d98ec15b84ed1.zip
of/irq: Refactor interrupt-map parsing
All the users of of_irq_parse_raw pass in a raw interrupt specifier from the device tree and expect it to be returned (possibly modified) in an of_phandle_args structure. However, the primary function of of_irq_parse_raw() is to check for translations due to the presence of one or more interrupt-map properties. The actual placing of the data into an of_phandle_args structure is trivial. If it is refactored to accept an of_phandle_args structure directly, then it becomes possible to consume of_phandle_args from other sources. This is important for an upcoming patch that allows a device to be connected to more than one interrupt parent. It also simplifies the code a bit. The biggest complication with this patch is that the old version works on the interrupt specifiers in __be32 form, but the of_phandle_args structure is intended to carry it in the cpu-native version. A bit of churn was required to make this work. In the end it results in tighter code, so the churn is worth it. Signed-off-by: Grant Likely <grant.likely@linaro.org> Acked-by: Tony Lindgren <tony@atomide.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'drivers/of/of_pci_irq.c')
-rw-r--r--drivers/of/of_pci_irq.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/of/of_pci_irq.c b/drivers/of/of_pci_irq.c
index ee3293d4b66b..303afebc247a 100644
--- a/drivers/of/of_pci_irq.c
+++ b/drivers/of/of_pci_irq.c
@@ -85,9 +85,12 @@ int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq
pdev = ppdev;
}
+ out_irq->np = ppnode;
+ out_irq->args_count = 1;
+ out_irq->args[0] = lspec;
lspec_be = cpu_to_be32(lspec);
laddr[0] = cpu_to_be32((pdev->bus->number << 16) | (pdev->devfn << 8));
- laddr[1] = laddr[2] = cpu_to_be32(0);
- return of_irq_parse_raw(ppnode, &lspec_be, 1, laddr, out_irq);
+ laddr[1] = laddr[2] = cpu_to_be32(0);
+ return of_irq_parse_raw(laddr, out_irq);
}
EXPORT_SYMBOL_GPL(of_irq_parse_pci);