> Date: Tue, 22 Aug 2017 22:12:51 +0300
> From: Artturi Alm <[email protected]>
> 
> 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.)

All the nodes I have seen have a more specific string included in the
compatible property.  Also, many, if not all of the parameters have
sane default values or values that can be read from a configuration
register.

So no, I don't think what you're proposing is a good idea.

Regarding your mail from a few days ago.  I did try something like
your diff to get the usb ports on the rk3288-tinker to work but failed
so far.

> 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