1
2
3
4
5
6
7
8#include <linux/etherdevice.h>
9#include <linux/kernel.h>
10#include <linux/nvmem-consumer.h>
11#include <linux/of_net.h>
12#include <linux/phy.h>
13#include <linux/export.h>
14
15
16
17
18
19
20
21
22
23int of_get_phy_mode(struct device_node *np)
24{
25 const char *pm;
26 int err, i;
27
28 err = of_property_read_string(np, "phy-mode", &pm);
29 if (err < 0)
30 err = of_property_read_string(np, "phy-connection-type", &pm);
31 if (err < 0)
32 return err;
33
34 for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++)
35 if (!strcasecmp(pm, phy_modes(i)))
36 return i;
37
38 return -ENODEV;
39}
40EXPORT_SYMBOL_GPL(of_get_phy_mode);
41
42static const void *of_get_mac_addr(struct device_node *np, const char *name)
43{
44 struct property *pp = of_find_property(np, name, NULL);
45
46 if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value))
47 return pp->value;
48 return NULL;
49}
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69const void *of_get_mac_address(struct device_node *np)
70{
71 const void *addr;
72
73 addr = of_get_mac_addr(np, "mac-address");
74 if (addr)
75 return addr;
76
77 addr = of_get_mac_addr(np, "local-mac-address");
78 if (addr)
79 return addr;
80
81 return of_get_mac_addr(np, "address");
82}
83EXPORT_SYMBOL(of_get_mac_address);
84
85
86
87
88
89
90
91
92
93int of_get_nvmem_mac_address(struct device_node *np, void *addr)
94{
95 struct nvmem_cell *cell;
96 const void *mac;
97 size_t len;
98 int ret;
99
100 cell = of_nvmem_cell_get(np, "mac-address");
101 if (IS_ERR(cell))
102 return PTR_ERR(cell);
103
104 mac = nvmem_cell_read(cell, &len);
105
106 nvmem_cell_put(cell);
107
108 if (IS_ERR(mac))
109 return PTR_ERR(mac);
110
111 if (len < ETH_ALEN || !is_valid_ether_addr(mac)) {
112 ret = -EINVAL;
113 } else {
114 ether_addr_copy(addr, mac);
115 ret = 0;
116 }
117
118 kfree(mac);
119
120 return ret;
121}
122EXPORT_SYMBOL(of_get_nvmem_mac_address);
123