dm: net: macb: Implement link speed change callback
At present the link speed change callback is a nop. According to macb device tree bindings, an optional "tx_clk" is used to clock the ethernet controller's TX_CLK under different link speed. In 10/100 MII mode, transmit logic must be clocked from a free running clock generated by the external PHY. In gigabit GMII mode, the controller, not the external PHY, must generate the 125 MHz transmit clock towards the PHY. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Tested-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
a5e3d2350b
commit
3ef64444de
@ -497,6 +497,41 @@ static int macb_phy_find(struct macb_device *macb, const char *name)
|
||||
#ifdef CONFIG_DM_ETH
|
||||
int __weak macb_linkspd_cb(struct udevice *dev, unsigned int speed)
|
||||
{
|
||||
#ifdef CONFIG_CLK
|
||||
struct clk tx_clk;
|
||||
ulong rate;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* "tx_clk" is an optional clock source for MACB.
|
||||
* Ignore if it does not exist in DT.
|
||||
*/
|
||||
ret = clk_get_by_name(dev, "tx_clk", &tx_clk);
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
switch (speed) {
|
||||
case _10BASET:
|
||||
rate = 2500000; /* 2.5 MHz */
|
||||
break;
|
||||
case _100BASET:
|
||||
rate = 25000000; /* 25 MHz */
|
||||
break;
|
||||
case _1000BASET:
|
||||
rate = 125000000; /* 125 MHz */
|
||||
break;
|
||||
default:
|
||||
/* does not change anything */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tx_clk.dev) {
|
||||
ret = clk_set_rate(&tx_clk, rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user