mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
DeviceTree fixes for 3.14:
- Fix booting on PPC boards. Changes to of_match_node matching caused the serial port on some PPC boards to stop working. Reverted the change and reimplement to split matching between new style compatible only matching and fallback to old matching algorithm. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) iQEcBAABAgAGBQJTABFuAAoJEMhvYp4jgsXi2PkH/1F9qpuZ1MAHCqu5scBbozKt LST0Q2qfspl+PjEN30D2X4S6O0qhHeEjeC96AfNUqpJ6sDLws/XcTlfG3niszebi ldJHnLp4lOJHBby0XtYjyQTyfBnJUYzTfau6DfqpjhZa0ljUHCrbPjvjrp+mqblL LNmwlK3dzc9dTo925v3R6R+v6Zn5o2Fe9SrQIdNSBCVbJYLDIRK6qhRrI1fJaBwn rNjf6Bwlt5XJFR8hw9MYUmUQH6bBIhhQGbDKJwnGPaqTDCMXUcRj9KC0HEpOAiJU h2xROVs8dlnBSyKq/QTlVP2b8AHPNHt4p4HkmIuJFkEJHrnv0iy86ssKROt2dO4= =j9kb -----END PGP SIGNATURE----- Merge tag 'dt-fixes-for-3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux Pull devicetree fixes from Rob Herring: "Fix booting on PPC boards. Changes to of_match_node matching caused the serial port on some PPC boards to stop working. Reverted the change and reimplement to split matching between new style compatible only matching and fallback to old matching algorithm" * tag 'dt-fixes-for-3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: of: search the best compatible match first in __of_match_node() Revert "OF: base: match each node compatible against all given matches first"
This commit is contained in:
commit
4302a8750d
@ -730,46 +730,64 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL(of_find_node_with_property);
|
||||
|
||||
static const struct of_device_id *
|
||||
of_match_compatible(const struct of_device_id *matches,
|
||||
const struct device_node *node)
|
||||
{
|
||||
const char *cp;
|
||||
int cplen, l;
|
||||
const struct of_device_id *m;
|
||||
|
||||
cp = __of_get_property(node, "compatible", &cplen);
|
||||
while (cp && (cplen > 0)) {
|
||||
m = matches;
|
||||
while (m->name[0] || m->type[0] || m->compatible[0]) {
|
||||
/* Only match for the entries without type and name */
|
||||
if (m->name[0] || m->type[0] ||
|
||||
of_compat_cmp(m->compatible, cp,
|
||||
strlen(m->compatible)))
|
||||
m++;
|
||||
else
|
||||
return m;
|
||||
}
|
||||
|
||||
/* Get node's next compatible string */
|
||||
l = strlen(cp) + 1;
|
||||
cp += l;
|
||||
cplen -= l;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static
|
||||
const struct of_device_id *__of_match_node(const struct of_device_id *matches,
|
||||
const struct device_node *node)
|
||||
{
|
||||
const char *cp;
|
||||
int cplen, l;
|
||||
const struct of_device_id *m;
|
||||
|
||||
if (!matches)
|
||||
return NULL;
|
||||
|
||||
cp = __of_get_property(node, "compatible", &cplen);
|
||||
do {
|
||||
const struct of_device_id *m = matches;
|
||||
|
||||
/* Check against matches with current compatible string */
|
||||
while (m->name[0] || m->type[0] || m->compatible[0]) {
|
||||
int match = 1;
|
||||
if (m->name[0])
|
||||
match &= node->name
|
||||
&& !strcmp(m->name, node->name);
|
||||
if (m->type[0])
|
||||
match &= node->type
|
||||
&& !strcmp(m->type, node->type);
|
||||
if (m->compatible[0])
|
||||
match &= cp
|
||||
&& !of_compat_cmp(m->compatible, cp,
|
||||
strlen(m->compatible));
|
||||
if (match)
|
||||
return m;
|
||||
m++;
|
||||
}
|
||||
|
||||
/* Get node's next compatible string */
|
||||
if (cp) {
|
||||
l = strlen(cp) + 1;
|
||||
cp += l;
|
||||
cplen -= l;
|
||||
}
|
||||
} while (cp && (cplen > 0));
|
||||
m = of_match_compatible(matches, node);
|
||||
if (m)
|
||||
return m;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -778,10 +796,12 @@ const struct of_device_id *__of_match_node(const struct of_device_id *matches,
|
||||
* @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. Matching order
|
||||
* is to compare each of the node's compatibles with all given matches
|
||||
* first. This implies node's compatible is sorted from specific to
|
||||
* generic while matches can be in any order.
|
||||
* Low level utility function used by device matching. We have two ways
|
||||
* of matching:
|
||||
* - Try to find the best compatible match by comparing each compatible
|
||||
* string of device node with all the given matches respectively.
|
||||
* - If the above method failed, then try to match the compatible by using
|
||||
* __of_device_is_compatible() besides the match in type and name.
|
||||
*/
|
||||
const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
||||
const struct device_node *node)
|
||||
|
Loading…
Reference in New Issue
Block a user