2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
13 #include <linux/kernel.h>
14 #include <linux/module.h>
16 #include <linux/of_device.h>
17 #include <linux/regmap.h>
18 #include <linux/mfd/syscon.h>
22 #define CTRL_MAC_LO_REG(offset, id) ((offset) + 0x8 * (id))
23 #define CTRL_MAC_HI_REG(offset, id) ((offset) + 0x8 * (id) + 0x4)
25 static int davinci_emac_3517_get_macid(struct device
*dev
, u16 offset
,
26 int slave
, u8
*mac_addr
)
30 struct regmap
*syscon
;
32 syscon
= syscon_regmap_lookup_by_phandle(dev
->of_node
, "syscon");
34 if (PTR_ERR(syscon
) == -ENODEV
)
36 return PTR_ERR(syscon
);
39 regmap_read(syscon
, CTRL_MAC_LO_REG(offset
, slave
), &macid_lsb
);
40 regmap_read(syscon
, CTRL_MAC_HI_REG(offset
, slave
), &macid_msb
);
42 mac_addr
[0] = (macid_msb
>> 16) & 0xff;
43 mac_addr
[1] = (macid_msb
>> 8) & 0xff;
44 mac_addr
[2] = macid_msb
& 0xff;
45 mac_addr
[3] = (macid_lsb
>> 16) & 0xff;
46 mac_addr
[4] = (macid_lsb
>> 8) & 0xff;
47 mac_addr
[5] = macid_lsb
& 0xff;
52 static int cpsw_am33xx_cm_get_macid(struct device
*dev
, u16 offset
, int slave
,
57 struct regmap
*syscon
;
59 syscon
= syscon_regmap_lookup_by_phandle(dev
->of_node
, "syscon");
61 if (PTR_ERR(syscon
) == -ENODEV
)
63 return PTR_ERR(syscon
);
66 regmap_read(syscon
, CTRL_MAC_LO_REG(offset
, slave
), &macid_lo
);
67 regmap_read(syscon
, CTRL_MAC_HI_REG(offset
, slave
), &macid_hi
);
69 mac_addr
[5] = (macid_lo
>> 8) & 0xff;
70 mac_addr
[4] = macid_lo
& 0xff;
71 mac_addr
[3] = (macid_hi
>> 24) & 0xff;
72 mac_addr
[2] = (macid_hi
>> 16) & 0xff;
73 mac_addr
[1] = (macid_hi
>> 8) & 0xff;
74 mac_addr
[0] = macid_hi
& 0xff;
79 int ti_cm_get_macid(struct device
*dev
, int slave
, u8
*mac_addr
)
81 if (of_machine_is_compatible("ti,dm8148"))
82 return cpsw_am33xx_cm_get_macid(dev
, 0x630, slave
, mac_addr
);
84 if (of_machine_is_compatible("ti,am33xx"))
85 return cpsw_am33xx_cm_get_macid(dev
, 0x630, slave
, mac_addr
);
87 if (of_device_is_compatible(dev
->of_node
, "ti,am3517-emac"))
88 return davinci_emac_3517_get_macid(dev
, 0x110, slave
, mac_addr
);
90 if (of_device_is_compatible(dev
->of_node
, "ti,dm816-emac"))
91 return cpsw_am33xx_cm_get_macid(dev
, 0x30, slave
, mac_addr
);
93 if (of_machine_is_compatible("ti,am43"))
94 return cpsw_am33xx_cm_get_macid(dev
, 0x630, slave
, mac_addr
);
96 if (of_machine_is_compatible("ti,dra7"))
97 return davinci_emac_3517_get_macid(dev
, 0x514, slave
, mac_addr
);
99 dev_info(dev
, "incompatible machine/device type for reading mac address\n");
102 EXPORT_SYMBOL_GPL(ti_cm_get_macid
);
104 MODULE_LICENSE("GPL");