Commit d2f4ec10 authored by Grant Likely's avatar Grant Likely

Merge branch 'robherring/for-next' from git://sources.calxeda.com/kernel/linux.git

Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parents 12514aa0 eb7ccb81
...@@ -14,6 +14,7 @@ bosch Bosch Sensortec GmbH ...@@ -14,6 +14,7 @@ bosch Bosch Sensortec GmbH
brcm Broadcom Corporation brcm Broadcom Corporation
cavium Cavium, Inc. cavium Cavium, Inc.
chrp Common Hardware Reference Platform chrp Common Hardware Reference Platform
cirrus Cirrus Logic, Inc.
cortina Cortina Systems, Inc. cortina Cortina Systems, Inc.
dallas Maxim Integrated Products (formerly Dallas Semiconductor) dallas Maxim Integrated Products (formerly Dallas Semiconductor)
denx Denx Software Engineering denx Denx Software Engineering
...@@ -42,6 +43,7 @@ powervr PowerVR (deprecated, use img) ...@@ -42,6 +43,7 @@ powervr PowerVR (deprecated, use img)
qcom Qualcomm, Inc. qcom Qualcomm, Inc.
ramtron Ramtron International ramtron Ramtron International
realtek Realtek Semiconductor Corp. realtek Realtek Semiconductor Corp.
renesas Renesas Electronics Corporation
samsung Samsung Semiconductor samsung Samsung Semiconductor
sbs Smart Battery System sbs Smart Battery System
schindler Schindler schindler Schindler
...@@ -52,6 +54,7 @@ snps Synopsys, Inc. ...@@ -52,6 +54,7 @@ snps Synopsys, Inc.
st STMicroelectronics st STMicroelectronics
stericsson ST-Ericsson stericsson ST-Ericsson
ti Texas Instruments ti Texas Instruments
toshiba Toshiba Corporation
via VIA Technologies, Inc. via VIA Technologies, Inc.
wlf Wolfson Microelectronics wlf Wolfson Microelectronics
wm Wondermedia Technologies, Inc. wm Wondermedia Technologies, Inc.
......
...@@ -147,16 +147,14 @@ void of_node_put(struct device_node *node) ...@@ -147,16 +147,14 @@ void of_node_put(struct device_node *node)
EXPORT_SYMBOL(of_node_put); EXPORT_SYMBOL(of_node_put);
#endif /* CONFIG_OF_DYNAMIC */ #endif /* CONFIG_OF_DYNAMIC */
struct property *of_find_property(const struct device_node *np, static struct property *__of_find_property(const struct device_node *np,
const char *name, const char *name, int *lenp)
int *lenp)
{ {
struct property *pp; struct property *pp;
if (!np) if (!np)
return NULL; return NULL;
read_lock(&devtree_lock);
for (pp = np->properties; pp; pp = pp->next) { for (pp = np->properties; pp; pp = pp->next) {
if (of_prop_cmp(pp->name, name) == 0) { if (of_prop_cmp(pp->name, name) == 0) {
if (lenp) if (lenp)
...@@ -164,6 +162,18 @@ struct property *of_find_property(const struct device_node *np, ...@@ -164,6 +162,18 @@ struct property *of_find_property(const struct device_node *np,
break; 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); read_unlock(&devtree_lock);
return pp; return pp;
...@@ -193,12 +203,24 @@ struct device_node *of_find_all_nodes(struct device_node *prev) ...@@ -193,12 +203,24 @@ struct device_node *of_find_all_nodes(struct device_node *prev)
} }
EXPORT_SYMBOL(of_find_all_nodes); 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 * Find a property with a given name for a given node
* and return the value. * and return the value.
*/ */
const void *of_get_property(const struct device_node *np, const char *name, 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); struct property *pp = of_find_property(np, name, lenp);
...@@ -209,13 +231,13 @@ EXPORT_SYMBOL(of_get_property); ...@@ -209,13 +231,13 @@ EXPORT_SYMBOL(of_get_property);
/** Checks if the given "compat" string matches one of the strings in /** Checks if the given "compat" string matches one of the strings in
* the device's "compatible" property * the device's "compatible" property
*/ */
int of_device_is_compatible(const struct device_node *device, static int __of_device_is_compatible(const struct device_node *device,
const char *compat) const char *compat)
{ {
const char* cp; const char* cp;
int cplen, l; int cplen, l;
cp = of_get_property(device, "compatible", &cplen); cp = __of_get_property(device, "compatible", &cplen);
if (cp == NULL) if (cp == NULL)
return 0; return 0;
while (cplen > 0) { while (cplen > 0) {
...@@ -228,6 +250,20 @@ int of_device_is_compatible(const struct device_node *device, ...@@ -228,6 +250,20 @@ int of_device_is_compatible(const struct device_node *device,
return 0; 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); EXPORT_SYMBOL(of_device_is_compatible);
/** /**
...@@ -501,7 +537,8 @@ struct device_node *of_find_compatible_node(struct device_node *from, ...@@ -501,7 +537,8 @@ struct device_node *of_find_compatible_node(struct device_node *from,
if (type if (type
&& !(np->type && (of_node_cmp(np->type, type) == 0))) && !(np->type && (of_node_cmp(np->type, type) == 0)))
continue; continue;
if (of_device_is_compatible(np, compatible) && of_node_get(np)) if (__of_device_is_compatible(np, compatible) &&
of_node_get(np))
break; break;
} }
of_node_put(from); of_node_put(from);
...@@ -545,15 +582,9 @@ struct device_node *of_find_node_with_property(struct device_node *from, ...@@ -545,15 +582,9 @@ struct device_node *of_find_node_with_property(struct device_node *from,
} }
EXPORT_SYMBOL(of_find_node_with_property); EXPORT_SYMBOL(of_find_node_with_property);
/** static
* of_match_node - Tell if an device_node has a matching of_match structure const struct of_device_id *__of_match_node(const struct of_device_id *matches,
* @matches: array of of device match structures to search in const struct device_node *node)
* @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)
{ {
if (!matches) if (!matches)
return NULL; return NULL;
...@@ -567,14 +598,32 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches, ...@@ -567,14 +598,32 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches,
match &= node->type match &= node->type
&& !strcmp(matches->type, node->type); && !strcmp(matches->type, node->type);
if (matches->compatible[0]) if (matches->compatible[0])
match &= of_device_is_compatible(node, match &= __of_device_is_compatible(node,
matches->compatible); matches->compatible);
if (match) if (match)
return matches; return matches;
matches++; matches++;
} }
return NULL; 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); EXPORT_SYMBOL(of_match_node);
/** /**
...@@ -595,6 +644,7 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from, ...@@ -595,6 +644,7 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
const struct of_device_id **match) const struct of_device_id **match)
{ {
struct device_node *np; struct device_node *np;
const struct of_device_id *m;
if (match) if (match)
*match = NULL; *match = NULL;
...@@ -602,9 +652,10 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from, ...@@ -602,9 +652,10 @@ struct device_node *of_find_matching_node_and_match(struct device_node *from,
read_lock(&devtree_lock); read_lock(&devtree_lock);
np = from ? from->allnext : of_allnodes; np = from ? from->allnext : of_allnodes;
for (; np; np = np->allnext) { 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) if (match)
*match = matches; *match = m;
break; break;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment