> 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));
> }
>
>