Hi,

i came across dwc2 usb node like this:

        usb@101c0000 {
                compatible = "snps,dwc2";
                reg = <0x101c0000 0x40000>;
                interrupts = <0x0 0x11 0x4>;
                clocks = <0x2 0x1c9>;
                clock-names = "otg";
                dr_mode = "host";
                phys = <0x6>;
                phy-names = "usb2-phy";
                status = "okay";
        };


and as it's at /-root, there's not much i could use to identify between
broadcom & rockchip while keeping the code simple for future additions,
and not mess w/each SoC compat string individually when applying vendor-
specific things..

i guess this should not be abused ever alone w/o some && in any _match(),
but when used responsibly may make some _attach() funcs prettier:)

to export the _vend variant, or keep as strchr hack like below?
(untested diff rly, for just the discussion atm.)

-Artturi


diff --git a/sys/dev/ofw/fdt.c b/sys/dev/ofw/fdt.c
index d6a64499e88..f22ed7a9f49 100644
--- a/sys/dev/ofw/fdt.c
+++ b/sys/dev/ofw/fdt.c
@@ -42,6 +42,7 @@ int    fdt_translate_reg(void *, struct fdt_reg *);
 #ifdef DEBUG
 void    fdt_print_node_recurse(void *, int);
 #endif
+static int fdt_is_compatible_vend(void *, const char *);
 
 static int tree_inited = 0;
 static struct fdt tree;
@@ -634,6 +635,24 @@ fdt_is_compatible(void *node, const char *name)
        return 0;
 }
 
+int
+fdt_is_compatible_vend(void *node, const char *name)
+{
+       size_t vlen = strlen(name);
+       char *data;
+       int len;
+
+       len = fdt_node_property(node, "compatible", &data);
+       while (len > 0) {
+               if (strncmp(data, name, vlen) == 0)
+                       return 1;
+               len -= strlen(data) + 1;
+               data += strlen(data) + 1;
+       }
+
+       return 0;
+}
+
 #ifdef DEBUG
 /*
  * Debug methods for printing whole tree, particular odes and properies
@@ -902,6 +921,8 @@ int
 OF_is_compatible(int handle, const char *name)
 {
        void *node = (char *)tree.header + handle;
+       if (strchr(name, ',') == NULL)
+               return fdt_is_compatible_vend(node, name);
        return (fdt_is_compatible(node, name));
 }
 

Reply via email to