[POWERPC] Add of_find_matching_node() helper function
Similar to of_find_compatible_node(), of_find_matching_node() and for_each_matching_node() allow you to iterate over the device tree looking for specific nodes, except that they take of_device_id tables instead of strings. This also moves of_match_node() from driver/of/device.c to driver/of/base.c to colocate it with the of_find_matching_node which depends on it. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
91bbbe22db
Коммит
283029d16a
|
@ -41,6 +41,7 @@
|
||||||
#include <linux/kobject.h>
|
#include <linux/kobject.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <asm/ibmebus.h>
|
#include <asm/ibmebus.h>
|
||||||
#include <asm/abs_addr.h>
|
#include <asm/abs_addr.h>
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/mod_devicetable.h>
|
#include <linux/mod_devicetable.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/pci_regs.h>
|
#include <linux/pci_regs.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <linux/mii.h>
|
#include <linux/mii.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
|
@ -273,3 +273,61 @@ struct device_node *of_find_compatible_node(struct device_node *from,
|
||||||
return np;
|
return np;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_find_compatible_node);
|
EXPORT_SYMBOL(of_find_compatible_node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* of_match_node - Tell if an device_node has a matching of_match structure
|
||||||
|
* @matches: array of of device match structures to search in
|
||||||
|
* @node: the of device structure to match against
|
||||||
|
*
|
||||||
|
* Low level utility function used by device matching.
|
||||||
|
*/
|
||||||
|
const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
||||||
|
const struct device_node *node)
|
||||||
|
{
|
||||||
|
while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
|
||||||
|
int match = 1;
|
||||||
|
if (matches->name[0])
|
||||||
|
match &= node->name
|
||||||
|
&& !strcmp(matches->name, node->name);
|
||||||
|
if (matches->type[0])
|
||||||
|
match &= node->type
|
||||||
|
&& !strcmp(matches->type, node->type);
|
||||||
|
if (matches->compatible[0])
|
||||||
|
match &= of_device_is_compatible(node,
|
||||||
|
matches->compatible);
|
||||||
|
if (match)
|
||||||
|
return matches;
|
||||||
|
matches++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(of_match_node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* of_find_matching_node - Find a node based on an of_device_id match
|
||||||
|
* table.
|
||||||
|
* @from: The node to start searching from or NULL, the node
|
||||||
|
* you pass will not be searched, only the next one
|
||||||
|
* will; typically, you pass what the previous call
|
||||||
|
* returned. of_node_put() will be called on it
|
||||||
|
* @matches: array of of device match structures to search in
|
||||||
|
*
|
||||||
|
* Returns a node pointer with refcount incremented, use
|
||||||
|
* of_node_put() on it when done.
|
||||||
|
*/
|
||||||
|
struct device_node *of_find_matching_node(struct device_node *from,
|
||||||
|
const struct of_device_id *matches)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
|
||||||
|
read_lock(&devtree_lock);
|
||||||
|
np = from ? from->allnext : allnodes;
|
||||||
|
for (; np; np = np->allnext) {
|
||||||
|
if (of_match_node(matches, np) && of_node_get(np))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
of_node_put(from);
|
||||||
|
read_unlock(&devtree_lock);
|
||||||
|
return np;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(of_find_matching_node);
|
||||||
|
|
|
@ -9,35 +9,6 @@
|
||||||
|
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
|
|
||||||
/**
|
|
||||||
* of_match_node - Tell if an device_node has a matching of_match structure
|
|
||||||
* @ids: array of of device match structures to search in
|
|
||||||
* @node: the of device structure to match against
|
|
||||||
*
|
|
||||||
* Low level utility function used by device matching.
|
|
||||||
*/
|
|
||||||
const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
|
||||||
const struct device_node *node)
|
|
||||||
{
|
|
||||||
while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
|
|
||||||
int match = 1;
|
|
||||||
if (matches->name[0])
|
|
||||||
match &= node->name
|
|
||||||
&& !strcmp(matches->name, node->name);
|
|
||||||
if (matches->type[0])
|
|
||||||
match &= node->type
|
|
||||||
&& !strcmp(matches->type, node->type);
|
|
||||||
if (matches->compatible[0])
|
|
||||||
match &= of_device_is_compatible(node,
|
|
||||||
matches->compatible);
|
|
||||||
if (match)
|
|
||||||
return matches;
|
|
||||||
matches++;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(of_match_node);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* of_match_device - Tell if an of_device structure has a matching
|
* of_match_device - Tell if an of_device structure has a matching
|
||||||
* of_match structure
|
* of_match structure
|
||||||
|
|
|
@ -72,7 +72,8 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
#if defined(CONFIG_PPC_MERGE)
|
#if defined(CONFIG_PPC_MERGE)
|
||||||
#include <asm/of_platform.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_platform.h>
|
||||||
#else
|
#else
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
|
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
|
|
||||||
|
@ -41,6 +42,11 @@ extern struct device_node *of_find_compatible_node(struct device_node *from,
|
||||||
#define for_each_compatible_node(dn, type, compatible) \
|
#define for_each_compatible_node(dn, type, compatible) \
|
||||||
for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
|
for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
|
||||||
dn = of_find_compatible_node(dn, type, compatible))
|
dn = of_find_compatible_node(dn, type, compatible))
|
||||||
|
extern struct device_node *of_find_matching_node(struct device_node *from,
|
||||||
|
const struct of_device_id *matches);
|
||||||
|
#define for_each_matching_node(dn, matches) \
|
||||||
|
for (dn = of_find_matching_node(NULL, matches); dn; \
|
||||||
|
dn = of_find_matching_node(dn, matches))
|
||||||
extern struct device_node *of_find_node_by_path(const char *path);
|
extern struct device_node *of_find_node_by_path(const char *path);
|
||||||
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
||||||
extern struct device_node *of_get_parent(const struct device_node *node);
|
extern struct device_node *of_get_parent(const struct device_node *node);
|
||||||
|
@ -60,5 +66,7 @@ extern const void *of_get_property(const struct device_node *node,
|
||||||
int *lenp);
|
int *lenp);
|
||||||
extern int of_n_addr_cells(struct device_node *np);
|
extern int of_n_addr_cells(struct device_node *np);
|
||||||
extern int of_n_size_cells(struct device_node *np);
|
extern int of_n_size_cells(struct device_node *np);
|
||||||
|
extern const struct of_device_id *of_match_node(
|
||||||
|
const struct of_device_id *matches, const struct device_node *node);
|
||||||
|
|
||||||
#endif /* _LINUX_OF_H */
|
#endif /* _LINUX_OF_H */
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
|
|
||||||
#define to_of_device(d) container_of(d, struct of_device, dev)
|
#define to_of_device(d) container_of(d, struct of_device, dev)
|
||||||
|
|
||||||
extern const struct of_device_id *of_match_node(
|
|
||||||
const struct of_device_id *matches, const struct device_node *node);
|
|
||||||
extern const struct of_device_id *of_match_device(
|
extern const struct of_device_id *of_match_device(
|
||||||
const struct of_device_id *matches, const struct of_device *dev);
|
const struct of_device_id *matches, const struct of_device *dev);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче