kernel/3.10: backport of_pci_get_devfn function from 3.11
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 23 Aug 2013 17:07:20 +0000 (17:07 +0000)
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 23 Aug 2013 17:07:20 +0000 (17:07 +0000)
Fixes the following build error on ramips/rt3883:

  arch/mips/pci/pci-rt3883.c:488:3: error: implicit declaration of function \
  'of_pci_get_devfn' [-Werror=implicit-function-declaration]
  cc1: some warnings being treated as errors

Although the function is only used by the PCI driver
of the RT3883 SoC but at the moment but it might be
useful for other targets as well.

Signed-off-by: Michael Lee <igvtee@gmail.com>
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@37826 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/generic/patches-3.10/003-of-pci-Add-of_pci_get_devfn-function.patch [new file with mode: 0644]

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 (file)
index 0000000..d786d6b
--- /dev/null
@@ -0,0 +1,78 @@
+From 45ab9702fb47d18dca116b3a0509efa19fbcb27a Mon Sep 17 00:00:00 2001
+From: Thierry Reding <thierry.reding@avionic-design.de>
+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 <thierry.reding@avionic-design.de>
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Signed-off-by: Jason Cooper <jason@lakedaemon.net>
+---
+ 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 <asm/prom.h>
+ 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(&reg[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