Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.7-rc4 42 lines 1.1 kB view raw
1#include <linux/kernel.h> 2#include <linux/export.h> 3#include <linux/of.h> 4#include <linux/of_pci.h> 5#include <asm/prom.h> 6 7static inline int __of_pci_pci_compare(struct device_node *node, 8 unsigned int devfn) 9{ 10 unsigned int size; 11 const __be32 *reg = of_get_property(node, "reg", &size); 12 13 if (!reg || size < 5 * sizeof(__be32)) 14 return 0; 15 return ((be32_to_cpup(&reg[0]) >> 8) & 0xff) == devfn; 16} 17 18struct device_node *of_pci_find_child_device(struct device_node *parent, 19 unsigned int devfn) 20{ 21 struct device_node *node, *node2; 22 23 for_each_child_of_node(parent, node) { 24 if (__of_pci_pci_compare(node, devfn)) 25 return node; 26 /* 27 * Some OFs create a parent node "multifunc-device" as 28 * a fake root for all functions of a multi-function 29 * device we go down them as well. 30 */ 31 if (!strcmp(node->name, "multifunc-device")) { 32 for_each_child_of_node(node, node2) { 33 if (__of_pci_pci_compare(node2, devfn)) { 34 of_node_put(node); 35 return node2; 36 } 37 } 38 } 39 } 40 return NULL; 41} 42EXPORT_SYMBOL_GPL(of_pci_find_child_device);