diff --git a/src/dtblint.c b/src/dtblint.c index cea2953..59cb11f 100644 --- a/src/dtblint.c +++ b/src/dtblint.c @@ -13,6 +13,55 @@ #include "dtblint.h" +static const char * const fsl_fec_compatibles[] = { + "fsl,imx25-fec", + "fsl,imx27-fec", + "fsl,imx28-fec", + "fsl,imx6q-fec", + "fsl,imx6sx-fec", + "fsl,mvf600-fec", +}; + +static void fsl_fec_reset_polarity(void) +{ + size_t i; + /* + * For historical reasons the gpio flag in the phy-reset-gpios property + * isn't evaluated and the gpio is assumed to be active low. Inversion + * can be accomplished by adding the property phy-reset-active-high. + * The gpio flag should match the presence of this property. + */ + struct device_node *np; + int ret; + + for (i = 0; i < ARRAY_SIZE(fsl_fec_compatibles); ++i) { + for_each_compatible_node(np, NULL, fsl_fec_compatibles[i]) { + struct of_phandle_args out_args[MAX_PHANDLE_ARGS]; + + bool active_high_property = + of_property_read_bool(np, + "phy-reset-active-high"); + bool active_high_gpio_flag; + + ret = of_parse_phandle_with_args(np, "phy-reset-gpios", + "#gpio-cells", 0, + out_args); + if (ret < 0) + continue; + + if (out_args->args_count < 2) + continue; + + active_high_gpio_flag = out_args->args[1] == 0; + + if (active_high_gpio_flag != active_high_property) { + printf("E: phy-reset-gpios flags don't match presence of phy-reset-active-high property (%s)\n", + np->full_name); + } + } + } +} + int main(int argc, const char *argv[]) { void *fdt; @@ -31,10 +80,12 @@ root = of_unflatten_dtb(fdt); if (IS_ERR(root)) { - fprintf(stderr, "failed to unflatten device tree (%ld)\n", PTR_ERR(root)); + fprintf(stderr, "failed to unflatten device tree (%ld)\n", + PTR_ERR(root)); return EXIT_FAILURE; } of_set_root_node(root); dtblint_imx_pinmux(); + fsl_fec_reset_polarity(); }