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,
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to