diff options
author | hrs <hrs@FreeBSD.org> | 2012-08-18 11:25:07 +0000 |
---|---|---|
committer | hrs <hrs@FreeBSD.org> | 2012-08-18 11:25:07 +0000 |
commit | 5320d21e5403e54eded0635a6f0ac20db93b0467 (patch) | |
tree | 657dcbee585c6196cbe6bbd7d3d64099648074ba | |
parent | 95e0d3cd6b4ea0f2eddfdc9d5fa993e0ac3f309d (diff) | |
download | FreeBSD-src-5320d21e5403e54eded0635a6f0ac20db93b0467.zip FreeBSD-src-5320d21e5403e54eded0635a6f0ac20db93b0467.tar.gz |
- Add OF_hasprop() and ofw_bus_has_prop(). These can be used to check
existence of the property.
- Fix ofw_bus_is_compatible{,_strict}() to prevent substring match in the
compatible string.
Reviewed by: raj
-rw-r--r-- | sys/dev/ofw/ofw_bus_subr.c | 19 | ||||
-rw-r--r-- | sys/dev/ofw/ofw_bus_subr.h | 3 | ||||
-rw-r--r-- | sys/dev/ofw/openfirm.c | 8 | ||||
-rw-r--r-- | sys/dev/ofw/openfirm.h | 1 |
4 files changed, 29 insertions, 2 deletions
diff --git a/sys/dev/ofw/ofw_bus_subr.c b/sys/dev/ofw/ofw_bus_subr.c index afe1393..a1bd8b3 100644 --- a/sys/dev/ofw/ofw_bus_subr.c +++ b/sys/dev/ofw/ofw_bus_subr.c @@ -167,7 +167,8 @@ ofw_bus_is_compatible(device_t dev, const char *onecompat) onelen = strlen(onecompat); while (len > 0) { - if (strncasecmp(compat, onecompat, onelen) == 0) + if (strlen(compat) == onelen && + strncasecmp(compat, onecompat, onelen) == 0) /* Found it. */ return (1); @@ -183,16 +184,30 @@ int ofw_bus_is_compatible_strict(device_t dev, const char *compatible) { const char *compat; + size_t len; if ((compat = ofw_bus_get_compat(dev)) == NULL) return (0); - if (strncasecmp(compat, compatible, strlen(compatible)) == 0) + len = strlen(compatible); + if (strlen(compat) == len && + strncasecmp(compat, compatible, len) == 0) return (1); return (0); } +int +ofw_bus_has_prop(device_t dev, const char *propname) +{ + phandle_t node; + + if ((node = ofw_bus_get_node(dev)) == -1) + return (0); + + return (OF_hasprop(node, propname)); +} + #ifndef FDT void ofw_bus_setup_iinfo(phandle_t node, struct ofw_bus_iinfo *ii, int intrsz) diff --git a/sys/dev/ofw/ofw_bus_subr.h b/sys/dev/ofw/ofw_bus_subr.h index 512e8b3..b777f77 100644 --- a/sys/dev/ofw/ofw_bus_subr.h +++ b/sys/dev/ofw/ofw_bus_subr.h @@ -74,4 +74,7 @@ void ofw_bus_find_iparent(phandle_t); int ofw_bus_is_compatible(device_t, const char *); int ofw_bus_is_compatible_strict(device_t, const char *); +/* Helper routine for checking existence of a prop */ +int ofw_bus_has_prop(device_t, const char *); + #endif /* !_DEV_OFW_OFW_BUS_SUBR_H_ */ diff --git a/sys/dev/ofw/openfirm.c b/sys/dev/ofw/openfirm.c index 4be2d2b..d63edce 100644 --- a/sys/dev/ofw/openfirm.c +++ b/sys/dev/ofw/openfirm.c @@ -261,6 +261,14 @@ OF_getproplen(phandle_t package, const char *propname) return (OFW_GETPROPLEN(ofw_obj, package, propname)); } +/* Check existence of a property of a package. */ +int +OF_hasprop(phandle_t package, const char *propname) +{ + + return (OF_getproplen(package, propname) >= 0 ? 1 : 0); +} + /* Get the value of a property of a package. */ ssize_t OF_getprop(phandle_t package, const char *propname, void *buf, size_t buflen) diff --git a/sys/dev/ofw/openfirm.h b/sys/dev/ofw/openfirm.h index feac840..17a0b87 100644 --- a/sys/dev/ofw/openfirm.h +++ b/sys/dev/ofw/openfirm.h @@ -105,6 +105,7 @@ phandle_t OF_parent(phandle_t node); ssize_t OF_getproplen(phandle_t node, const char *propname); ssize_t OF_getprop(phandle_t node, const char *propname, void *buf, size_t len); +int OF_hasprop(phandle_t node, const char *propname); ssize_t OF_searchprop(phandle_t node, const char *propname, void *buf, size_t len); ssize_t OF_getprop_alloc(phandle_t node, const char *propname, |