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