summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2012-08-18 11:25:07 +0000
committerhrs <hrs@FreeBSD.org>2012-08-18 11:25:07 +0000
commit5320d21e5403e54eded0635a6f0ac20db93b0467 (patch)
tree657dcbee585c6196cbe6bbd7d3d64099648074ba
parent95e0d3cd6b4ea0f2eddfdc9d5fa993e0ac3f309d (diff)
downloadFreeBSD-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.c19
-rw-r--r--sys/dev/ofw/ofw_bus_subr.h3
-rw-r--r--sys/dev/ofw/openfirm.c8
-rw-r--r--sys/dev/ofw/openfirm.h1
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,
OpenPOWER on IntegriCloud