svn commit: r239366 - head/sys/dev/ofw

Hiroki Sato hrs at FreeBSD.org
Sat Aug 18 11:25:08 UTC 2012


Author: hrs
Date: Sat Aug 18 11:25:07 2012
New Revision: 239366
URL: http://svn.freebsd.org/changeset/base/239366

Log:
  - 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

Modified:
  head/sys/dev/ofw/ofw_bus_subr.c
  head/sys/dev/ofw/ofw_bus_subr.h
  head/sys/dev/ofw/openfirm.c
  head/sys/dev/ofw/openfirm.h

Modified: head/sys/dev/ofw/ofw_bus_subr.c
==============================================================================
--- head/sys/dev/ofw/ofw_bus_subr.c	Sat Aug 18 11:15:30 2012	(r239365)
+++ head/sys/dev/ofw/ofw_bus_subr.c	Sat Aug 18 11:25:07 2012	(r239366)
@@ -167,7 +167,8 @@ ofw_bus_is_compatible(device_t dev, cons
 	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)

Modified: head/sys/dev/ofw/ofw_bus_subr.h
==============================================================================
--- head/sys/dev/ofw/ofw_bus_subr.h	Sat Aug 18 11:15:30 2012	(r239365)
+++ head/sys/dev/ofw/ofw_bus_subr.h	Sat Aug 18 11:25:07 2012	(r239366)
@@ -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_ */

Modified: head/sys/dev/ofw/openfirm.c
==============================================================================
--- head/sys/dev/ofw/openfirm.c	Sat Aug 18 11:15:30 2012	(r239365)
+++ head/sys/dev/ofw/openfirm.c	Sat Aug 18 11:25:07 2012	(r239366)
@@ -261,6 +261,14 @@ OF_getproplen(phandle_t package, const c
 	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)

Modified: head/sys/dev/ofw/openfirm.h
==============================================================================
--- head/sys/dev/ofw/openfirm.h	Sat Aug 18 11:15:30 2012	(r239365)
+++ head/sys/dev/ofw/openfirm.h	Sat Aug 18 11:25:07 2012	(r239366)
@@ -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,


More information about the svn-src-all mailing list