Merge branch 'robherring/for-next' from git://sources.calxeda.com/kernel/linux.git
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
commit
d2f4ec1026
@ -14,6 +14,7 @@ bosch Bosch Sensortec GmbH
|
||||
brcm Broadcom Corporation
|
||||
cavium Cavium, Inc.
|
||||
chrp Common Hardware Reference Platform
|
||||
cirrus Cirrus Logic, Inc.
|
||||
cortina Cortina Systems, Inc.
|
||||
dallas Maxim Integrated Products (formerly Dallas Semiconductor)
|
||||
denx Denx Software Engineering
|
||||
@ -42,6 +43,7 @@ powervr PowerVR (deprecated, use img)
|
||||
qcom Qualcomm, Inc.
|
||||
ramtron Ramtron International
|
||||
realtek Realtek Semiconductor Corp.
|
||||
renesas Renesas Electronics Corporation
|
||||
samsung Samsung Semiconductor
|
||||
sbs Smart Battery System
|
||||
schindler Schindler
|
||||
@ -52,6 +54,7 @@ snps Synopsys, Inc.
|
||||
st STMicroelectronics
|
||||
stericsson ST-Ericsson
|
||||
ti Texas Instruments
|
||||
toshiba Toshiba Corporation
|
||||
via VIA Technologies, Inc.
|
||||
wlf Wolfson Microelectronics
|
||||
wm Wondermedia Technologies, Inc.
|
||||
|
@ -147,16 +147,14 @@ void of_node_put(struct device_node *node)
|
||||
EXPORT_SYMBOL(of_node_put);
|
||||
#endif /* CONFIG_OF_DYNAMIC */
|
||||
|
||||
struct property *of_find_property(const struct device_node *np,
|
||||
const char *name,
|
||||
int *lenp)
|
||||
static struct property *__of_find_property(const struct device_node *np,
|
||||
const char *name, int *lenp)
|
||||
{
|
||||
struct property *pp;
|
||||
|
||||
if (!np)
|
||||
return NULL;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
for (pp = np->properties; pp; pp = pp->next) {
|
||||
if (of_prop_cmp(pp->name, name) == 0) {
|
||||
if (lenp)
|
||||
@ -164,6 +162,18 @@ struct property *of_find_property(const struct device_node *np,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return pp;
|
||||
}
|
||||
|
||||
struct property *of_find_property(const struct device_node *np,
|
||||
const char *name,
|
||||
int *lenp)
|
||||
{
|
||||
struct property *pp;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
pp = __of_find_property(np, name, lenp);
|
||||
read_unlock(&devtree_lock);
|
||||
|
||||
return pp;
|
||||
@ -193,12 +203,24 @@ struct device_node *of_find_all_nodes(struct device_node *prev)
|
||||
}
|
||||
EXPORT_SYMBOL(of_find_all_nodes);
|
||||
|
||||
/*
|
||||
* Find a property with a given name for a given node
|
||||
* and return the value.
|
||||
*/
|
||||
static const void *__of_get_property(const struct device_node *np,
|
||||
const char *name, int *lenp)
|
||||
{
|
||||
struct property *pp = __of_find_property(np, name, lenp);
|
||||
|
||||
return pp ? pp->value : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find a property with a given name for a given node
|
||||
* and return the value.
|
||||
*/
|
||||
const void *of_get_property(const struct device_node *np, const char *name,
|
||||
int *lenp)
|
||||
int *lenp)
|
||||
{
|
||||
struct property *pp = of_find_property(np, name, lenp);
|
||||
|
||||
@ -209,13 +231,13 @@ EXPORT_SYMBOL(of_get_property);
|
||||
/** Checks if the given "compat" string matches one of the strings in
|
||||
* the device's "compatible" property
|
||||
*/
|
||||
int of_device_is_compatible(const struct device_node *device,
|
||||
const char *compat)
|
||||
static int __of_device_is_compatible(const struct device_node *device,
|
||||
const char *compat)
|
||||
{
|
||||
const char* cp;
|
||||
int cplen, l;
|
||||
|
||||
cp = of_get_property(device, "compatible", &cplen);
|
||||
cp = __of_get_property(device, "compatible", &cplen);
|
||||
if (cp == NULL)
|
||||
return 0;
|
||||
while (cplen > 0) {
|
||||
@ -228,6 +250,20 @@ int of_device_is_compatible(const struct device_node *device,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Checks if the given "compat" string matches one of the strings in
|
||||
* the device's "compatible" property
|
||||
*/
|
||||
int of_device_is_compatible(const struct device_node *device,
|
||||
const char *compat)
|
||||
{
|
||||
int res;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
res = __of_device_is_compatible(device, compat);
|
||||
read_unlock(&devtree_lock);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL(of_device_is_compatible);
|
||||
|
||||
/**
|
||||
@ -501,7 +537,8 @@ struct device_node *of_find_compatible_node(struct device_node *from,
|
||||
if (type
|
||||
&& !(np->type && (of_node_cmp(np->type, type) == 0)))
|
||||
continue;
|
||||
if (of_device_is_compatible(np, compatible) && of_node_get(np))
|
||||
if (__of_device_is_compatible(np, compatible) &&
|
||||
of_node_get(np))
|
||||
break;
|
||||
}
|
||||
of_node_put(from);
|
||||
@ -545,15 +582,9 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL(of_find_node_with_property);
|
||||
|
||||
/**
|
||||
* 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)
|
||||
static
|
||||
const struct of_device_id *__of_match_node(const struct of_device_id *matches,
|
||||
const struct device_node *node)
|
||||
{
|
||||
if (!matches)
|
||||
return NULL;
|
||||
@ -567,14 +598,32 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
||||
match &= node->type
|
||||
&& !strcmp(matches->type, node->type);
|
||||
if (matches->compatible[0])
|
||||
match &= of_device_is_compatible(node,
|
||||
matches->compatible);
|
||||
match &= __of_device_is_compatible(node,
|
||||
matches->compatible);
|
||||
if (match)
|
||||
return matches;
|
||||
matches++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
|
||||
read_lock(&devtree_lock);
|
||||
match = __of_match_node(matches, node);
|
||||
read_unlock(&devtree_lock);
|
||||
return match;
|
||||
}
|
||||
EXPORT_SYMBOL(of_match_node);
|
||||
|
||||
/**
|
||||
@ -595,6 +644,7 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
|
||||
const struct of_device_id **match)
|
||||
{
|
||||
struct device_node *np;
|
||||
const struct of_device_id *m;
|
||||
|
||||
if (match)
|
||||
*match = NULL;
|
||||
@ -602,9 +652,10 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
|
||||
read_lock(&devtree_lock);
|
||||
np = from ? from->allnext : of_allnodes;
|
||||
for (; np; np = np->allnext) {
|
||||
if (of_match_node(matches, np) && of_node_get(np)) {
|
||||
m = __of_match_node(matches, np);
|
||||
if (m && of_node_get(np)) {
|
||||
if (match)
|
||||
*match = matches;
|
||||
*match = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user