1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | |
3 | #include <linux/kernel.h> |
4 | #include <linux/module.h> |
5 | #include <linux/of.h> |
6 | #include <linux/regmap.h> |
7 | #include <linux/mfd/syscon.h> |
8 | |
9 | #include "cpsw.h" |
10 | |
11 | #define CTRL_MAC_LO_REG(offset, id) ((offset) + 0x8 * (id)) |
12 | #define CTRL_MAC_HI_REG(offset, id) ((offset) + 0x8 * (id) + 0x4) |
13 | |
14 | static int davinci_emac_3517_get_macid(struct device *dev, u16 offset, |
15 | int slave, u8 *mac_addr) |
16 | { |
17 | u32 macid_lsb; |
18 | u32 macid_msb; |
19 | struct regmap *syscon; |
20 | |
21 | syscon = syscon_regmap_lookup_by_phandle(np: dev->of_node, property: "syscon" ); |
22 | if (IS_ERR(ptr: syscon)) { |
23 | if (PTR_ERR(ptr: syscon) == -ENODEV) |
24 | return 0; |
25 | return PTR_ERR(ptr: syscon); |
26 | } |
27 | |
28 | regmap_read(map: syscon, CTRL_MAC_LO_REG(offset, slave), val: &macid_lsb); |
29 | regmap_read(map: syscon, CTRL_MAC_HI_REG(offset, slave), val: &macid_msb); |
30 | |
31 | mac_addr[0] = (macid_msb >> 16) & 0xff; |
32 | mac_addr[1] = (macid_msb >> 8) & 0xff; |
33 | mac_addr[2] = macid_msb & 0xff; |
34 | mac_addr[3] = (macid_lsb >> 16) & 0xff; |
35 | mac_addr[4] = (macid_lsb >> 8) & 0xff; |
36 | mac_addr[5] = macid_lsb & 0xff; |
37 | |
38 | return 0; |
39 | } |
40 | |
41 | static int cpsw_am33xx_cm_get_macid(struct device *dev, u16 offset, int slave, |
42 | u8 *mac_addr) |
43 | { |
44 | u32 macid_lo; |
45 | u32 macid_hi; |
46 | struct regmap *syscon; |
47 | |
48 | syscon = syscon_regmap_lookup_by_phandle(np: dev->of_node, property: "syscon" ); |
49 | if (IS_ERR(ptr: syscon)) { |
50 | if (PTR_ERR(ptr: syscon) == -ENODEV) |
51 | return 0; |
52 | return PTR_ERR(ptr: syscon); |
53 | } |
54 | |
55 | regmap_read(map: syscon, CTRL_MAC_LO_REG(offset, slave), val: &macid_lo); |
56 | regmap_read(map: syscon, CTRL_MAC_HI_REG(offset, slave), val: &macid_hi); |
57 | |
58 | mac_addr[5] = (macid_lo >> 8) & 0xff; |
59 | mac_addr[4] = macid_lo & 0xff; |
60 | mac_addr[3] = (macid_hi >> 24) & 0xff; |
61 | mac_addr[2] = (macid_hi >> 16) & 0xff; |
62 | mac_addr[1] = (macid_hi >> 8) & 0xff; |
63 | mac_addr[0] = macid_hi & 0xff; |
64 | |
65 | return 0; |
66 | } |
67 | |
68 | int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr) |
69 | { |
70 | if (of_machine_is_compatible(compat: "ti,dm8148" )) |
71 | return cpsw_am33xx_cm_get_macid(dev, offset: 0x630, slave, mac_addr); |
72 | |
73 | if (of_machine_is_compatible(compat: "ti,am33xx" )) |
74 | return cpsw_am33xx_cm_get_macid(dev, offset: 0x630, slave, mac_addr); |
75 | |
76 | if (of_device_is_compatible(device: dev->of_node, "ti,am3517-emac" )) |
77 | return davinci_emac_3517_get_macid(dev, offset: 0x110, slave, mac_addr); |
78 | |
79 | if (of_device_is_compatible(device: dev->of_node, "ti,dm816-emac" )) |
80 | return cpsw_am33xx_cm_get_macid(dev, offset: 0x30, slave, mac_addr); |
81 | |
82 | if (of_machine_is_compatible(compat: "ti,am43" )) |
83 | return cpsw_am33xx_cm_get_macid(dev, offset: 0x630, slave, mac_addr); |
84 | |
85 | if (of_machine_is_compatible(compat: "ti,dra7" )) |
86 | return davinci_emac_3517_get_macid(dev, offset: 0x514, slave, mac_addr); |
87 | |
88 | dev_info(dev, "incompatible machine/device type for reading mac address\n" ); |
89 | return -ENOENT; |
90 | } |
91 | EXPORT_SYMBOL_GPL(ti_cm_get_macid); |
92 | |
93 | MODULE_LICENSE("GPL" ); |
94 | |