1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/*
* Copyright (C) 2016 Pengutronix, Uwe Kleine-König <kernel@pengutronix.de>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by the
* Free Software Foundation.
*/
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <dt/dt.h>
#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;
struct device_node *root;
if (argc < 2) {
fprintf(stderr, "No filename given\n");
return EXIT_FAILURE;
}
fdt = read_file(argv[1], NULL);
if (!fdt) {
fprintf(stderr, "failed to read dtb\n");
return EXIT_FAILURE;
}
root = of_unflatten_dtb(fdt);
if (IS_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();
}
|