diff --git a/target/linux/generic/patches-3.10/003-of-pci-Add-of_pci_get_devfn-function.patch b/target/linux/generic/patches-3.10/003-of-pci-Add-of_pci_get_devfn-function.patch new file mode 100644 index 0000000000..d786d6b5c5 --- /dev/null +++ b/target/linux/generic/patches-3.10/003-of-pci-Add-of_pci_get_devfn-function.patch @@ -0,0 +1,78 @@ +From 45ab9702fb47d18dca116b3a0509efa19fbcb27a Mon Sep 17 00:00:00 2001 +From: Thierry Reding +Date: Thu, 16 May 2013 17:55:18 +0200 +Subject: [PATCH] of/pci: Add of_pci_get_devfn() function + +commit 45ab9702fb47d18dca116b3a0509efa19fbcb27a upstream. + +This function can be used to parse the device and function number from a +standard 5-cell PCI resource. PCI_SLOT() and PCI_FUNC() can be used on +the returned value obtain the device and function numbers respectively. + +Signed-off-by: Thierry Reding +Signed-off-by: Thomas Petazzoni +Signed-off-by: Jason Cooper +--- + drivers/of/of_pci.c | 34 +++++++++++++++++++++++++++++----- + include/linux/of_pci.h | 1 + + 2 files changed, 30 insertions(+), 5 deletions(-) + +--- a/drivers/of/of_pci.c ++++ b/drivers/of/of_pci.c +@@ -5,14 +5,15 @@ + #include + + static inline int __of_pci_pci_compare(struct device_node *node, +- unsigned int devfn) ++ unsigned int data) + { +- unsigned int size; +- const __be32 *reg = of_get_property(node, "reg", &size); ++ int devfn; + +- if (!reg || size < 5 * sizeof(__be32)) ++ devfn = of_pci_get_devfn(node); ++ if (devfn < 0) + return 0; +- return ((be32_to_cpup(®[0]) >> 8) & 0xff) == devfn; ++ ++ return devfn == data; + } + + struct device_node *of_pci_find_child_device(struct device_node *parent, +@@ -40,3 +41,26 @@ struct device_node *of_pci_find_child_de + return NULL; + } + EXPORT_SYMBOL_GPL(of_pci_find_child_device); ++ ++/** ++ * of_pci_get_devfn() - Get device and function numbers for a device node ++ * @np: device node ++ * ++ * Parses a standard 5-cell PCI resource and returns an 8-bit value that can ++ * be passed to the PCI_SLOT() and PCI_FUNC() macros to extract the device ++ * and function numbers respectively. On error a negative error code is ++ * returned. ++ */ ++int of_pci_get_devfn(struct device_node *np) ++{ ++ unsigned int size; ++ const __be32 *reg; ++ ++ reg = of_get_property(np, "reg", &size); ++ ++ if (!reg || size < 5 * sizeof(__be32)) ++ return -EINVAL; ++ ++ return (be32_to_cpup(reg) >> 8) & 0xff; ++} ++EXPORT_SYMBOL_GPL(of_pci_get_devfn); +--- a/include/linux/of_pci.h ++++ b/include/linux/of_pci.h +@@ -10,5 +10,6 @@ int of_irq_map_pci(const struct pci_dev + struct device_node; + struct device_node *of_pci_find_child_device(struct device_node *parent, + unsigned int devfn); ++int of_pci_get_devfn(struct device_node *np); + + #endif