xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision 745dad466aeaf48f068b0bbd45b4e8bdbc5fe52a)
10125bcf0SSjoerd Simons /*
20125bcf0SSjoerd Simons  * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
30125bcf0SSjoerd Simons  *
40125bcf0SSjoerd Simons  * SPDX-License-Identifier:	GPL-2.0+
50125bcf0SSjoerd Simons  *
60125bcf0SSjoerd Simons  * Rockchip GMAC ethernet IP driver for U-Boot
70125bcf0SSjoerd Simons  */
80125bcf0SSjoerd Simons 
90125bcf0SSjoerd Simons #include <common.h>
100125bcf0SSjoerd Simons #include <dm.h>
110125bcf0SSjoerd Simons #include <clk.h>
12535678cdSDavid Wu #include <misc.h>
130125bcf0SSjoerd Simons #include <phy.h>
14491f3bfbSDavid Wu #include <reset.h>
150125bcf0SSjoerd Simons #include <syscon.h>
160125bcf0SSjoerd Simons #include <asm/io.h>
170125bcf0SSjoerd Simons #include <asm/arch/periph.h>
180125bcf0SSjoerd Simons #include <asm/arch/clock.h>
191f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h>
206f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21c563400aSDavid Wu #include <asm/arch/grf_rk3528.h>
2283f30531SDavid Wu #include <asm/arch/grf_rk3562.h>
2383f30531SDavid Wu #include <asm/arch/ioc_rk3562.h>
2433a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
25bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
26*745dad46SDavid Wu #include <asm/arch/grf_rv1103b.h>
2720bef841SDavid Wu #include <asm/arch/grf_rv1106.h>
28dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
296f0a52e9SDavid Wu #include "dwc_eth_qos.h"
306f0a52e9SDavid Wu #else
3118ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
32ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
33af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
340125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
3523adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
36c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
37793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
381f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
390a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
400125bcf0SSjoerd Simons #include "designware.h"
416f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
426f0a52e9SDavid Wu #endif
436f0a52e9SDavid Wu #include <dm/pinctrl.h>
44491f3bfbSDavid Wu #include <dm/of_access.h>
450125bcf0SSjoerd Simons 
460125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
470125bcf0SSjoerd Simons 
486f0a52e9SDavid Wu struct rockchip_eth_dev {
496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
506f0a52e9SDavid Wu 	struct eqos_priv eqos;
516f0a52e9SDavid Wu #else
526f0a52e9SDavid Wu 	struct dw_eth_dev dw;
536f0a52e9SDavid Wu #endif
54491f3bfbSDavid Wu 	int phy_interface;
556f0a52e9SDavid Wu };
566f0a52e9SDavid Wu 
570125bcf0SSjoerd Simons /*
580125bcf0SSjoerd Simons  * Platform data for the gmac
590125bcf0SSjoerd Simons  *
600125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
610125bcf0SSjoerd Simons  */
620125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
636f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
640125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
656f0a52e9SDavid Wu #else
666f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
676f0a52e9SDavid Wu #endif
68491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
69491f3bfbSDavid Wu 	bool integrated_phy;
700a33ce65SDavid Wu 	bool clock_input;
71491f3bfbSDavid Wu 	int phy_interface;
720125bcf0SSjoerd Simons 	int tx_delay;
730125bcf0SSjoerd Simons 	int rx_delay;
7433a014bdSDavid Wu 	int bus_id;
750125bcf0SSjoerd Simons };
760125bcf0SSjoerd Simons 
771f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
786f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
796f0a52e9SDavid Wu 	const struct eqos_config config;
806f0a52e9SDavid Wu #endif
81491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
82491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
830a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
841f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
85bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
86491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
871f08aa1cSPhilipp Tomsich };
881f08aa1cSPhilipp Tomsich 
89befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
90befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
91befcb627SDavid Wu 	.reg_access_always_ok = false,
92befcb627SDavid Wu 	.mdio_wait = 10000,
93befcb627SDavid Wu 	.swr_wait = 200,
94befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
95befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
96befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
97befcb627SDavid Wu };
98befcb627SDavid Wu #endif
99befcb627SDavid Wu 
1001eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
1011eb9d064SDavid Wu {
1021eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1031eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
1041eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
1051eb9d064SDavid Wu 
1061eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1071eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1081eb9d064SDavid Wu 
1091eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1101eb9d064SDavid Wu }
1111f08aa1cSPhilipp Tomsich 
1120125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1130125bcf0SSjoerd Simons {
1140125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
115491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
11654f7ad44SDavid Wu 	struct udevice *phydev;
1170a33ce65SDavid Wu 	const char *string;
118491f3bfbSDavid Wu 	int ret;
1190a33ce65SDavid Wu 
1200a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1210a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1220a33ce65SDavid Wu 		pdata->clock_input = true;
1230a33ce65SDavid Wu 	else
1240a33ce65SDavid Wu 		pdata->clock_input = false;
1250125bcf0SSjoerd Simons 
126491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
127491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
128491f3bfbSDavid Wu 	if (ret) {
129491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
130491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
131491f3bfbSDavid Wu 	} else {
132491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
133491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
134491f3bfbSDavid Wu 							 "phy-is-integrated");
135491f3bfbSDavid Wu 	}
136491f3bfbSDavid Wu 
137491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
138491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
139491f3bfbSDavid Wu 		if (ret) {
14054f7ad44SDavid Wu 			ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
14154f7ad44SDavid Wu 			if (ret) {
14254f7ad44SDavid Wu 				debug("Get phydev by ofnode failed: err=%d\n", ret);
14354f7ad44SDavid Wu 				return ret;
14454f7ad44SDavid Wu 			}
14554f7ad44SDavid Wu 
14654f7ad44SDavid Wu 			ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
14754f7ad44SDavid Wu 			if (ret) {
148491f3bfbSDavid Wu 				debug("No PHY reset control found: ret=%d\n", ret);
149491f3bfbSDavid Wu 				return ret;
150491f3bfbSDavid Wu 			}
151491f3bfbSDavid Wu 		}
15254f7ad44SDavid Wu 	}
153491f3bfbSDavid Wu 
1541f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1557ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1567ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1571f08aa1cSPhilipp Tomsich 
1581f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1591f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1607ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1611f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1627ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1630125bcf0SSjoerd Simons 
1646f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1656f0a52e9SDavid Wu 	return 0;
1666f0a52e9SDavid Wu #else
1670125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1686f0a52e9SDavid Wu #endif
1690125bcf0SSjoerd Simons }
1700125bcf0SSjoerd Simons 
1716f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
172491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
173491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
17418ae91c8SDavid Wu {
1756f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
17618ae91c8SDavid Wu 	struct px30_grf *grf;
17718ae91c8SDavid Wu 	struct clk clk_speed;
17818ae91c8SDavid Wu 	int speed, ret;
17918ae91c8SDavid Wu 	enum {
18018ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
18118ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
18218ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
18318ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
18418ae91c8SDavid Wu 	};
18518ae91c8SDavid Wu 
18618ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
18718ae91c8SDavid Wu 			      &clk_speed);
18818ae91c8SDavid Wu 	if (ret)
18918ae91c8SDavid Wu 		return ret;
19018ae91c8SDavid Wu 
19118ae91c8SDavid Wu 	switch (priv->phydev->speed) {
19218ae91c8SDavid Wu 	case 10:
19318ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
19418ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
19518ae91c8SDavid Wu 		if (ret)
19618ae91c8SDavid Wu 			return ret;
19718ae91c8SDavid Wu 		break;
19818ae91c8SDavid Wu 	case 100:
19918ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
20018ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
20118ae91c8SDavid Wu 		if (ret)
20218ae91c8SDavid Wu 			return ret;
20318ae91c8SDavid Wu 		break;
20418ae91c8SDavid Wu 	default:
20518ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
20618ae91c8SDavid Wu 		return -EINVAL;
20718ae91c8SDavid Wu 	}
20818ae91c8SDavid Wu 
20918ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
21018ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
21118ae91c8SDavid Wu 
21218ae91c8SDavid Wu 	return 0;
21318ae91c8SDavid Wu }
21418ae91c8SDavid Wu 
215491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
216491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
217ff86648dSDavid Wu {
2186f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
219ff86648dSDavid Wu 	struct clk clk_speed;
220ff86648dSDavid Wu 	int ret;
221ff86648dSDavid Wu 
222ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
223ff86648dSDavid Wu 			      &clk_speed);
224ff86648dSDavid Wu 	if (ret)
225ff86648dSDavid Wu 		return ret;
226ff86648dSDavid Wu 
227ff86648dSDavid Wu 	switch (priv->phydev->speed) {
228ff86648dSDavid Wu 	case 10:
229ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
230ff86648dSDavid Wu 		if (ret)
231ff86648dSDavid Wu 			return ret;
232ff86648dSDavid Wu 		break;
233ff86648dSDavid Wu 	case 100:
234ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
235ff86648dSDavid Wu 		if (ret)
236ff86648dSDavid Wu 			return ret;
237ff86648dSDavid Wu 		break;
238ff86648dSDavid Wu 	case 1000:
239ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
240ff86648dSDavid Wu 		if (ret)
241ff86648dSDavid Wu 			return ret;
242ff86648dSDavid Wu 		break;
243ff86648dSDavid Wu 	default:
244ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
245ff86648dSDavid Wu 		return -EINVAL;
246ff86648dSDavid Wu 	}
247ff86648dSDavid Wu 
248ff86648dSDavid Wu 	return 0;
249ff86648dSDavid Wu }
250ff86648dSDavid Wu 
251491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
252491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
253af166ffaSDavid Wu {
2546f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
255af166ffaSDavid Wu 	struct rk322x_grf *grf;
256af166ffaSDavid Wu 	int clk;
257af166ffaSDavid Wu 	enum {
258af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
259af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
260af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
261af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
262af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
263491f3bfbSDavid Wu 
264491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
265491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
266491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
267491f3bfbSDavid Wu 
268491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
269491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
270491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
271af166ffaSDavid Wu 	};
272af166ffaSDavid Wu 
273af166ffaSDavid Wu 	switch (priv->phydev->speed) {
274af166ffaSDavid Wu 	case 10:
275491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
276491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
277491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
278af166ffaSDavid Wu 		break;
279af166ffaSDavid Wu 	case 100:
280491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
281491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
282491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
283af166ffaSDavid Wu 		break;
284af166ffaSDavid Wu 	case 1000:
285af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
286af166ffaSDavid Wu 		break;
287af166ffaSDavid Wu 	default:
288af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
289af166ffaSDavid Wu 		return -EINVAL;
290af166ffaSDavid Wu 	}
291af166ffaSDavid Wu 
292af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
293491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
294491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
295491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
296491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
297491f3bfbSDavid Wu 		     clk);
298af166ffaSDavid Wu 
299af166ffaSDavid Wu 	return 0;
300af166ffaSDavid Wu }
301af166ffaSDavid Wu 
302491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
303491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
3040125bcf0SSjoerd Simons {
3056f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3060125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
3070125bcf0SSjoerd Simons 	int clk;
3080125bcf0SSjoerd Simons 
3090125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
3100125bcf0SSjoerd Simons 	case 10:
3111f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
3120125bcf0SSjoerd Simons 		break;
3130125bcf0SSjoerd Simons 	case 100:
3141f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
3150125bcf0SSjoerd Simons 		break;
3160125bcf0SSjoerd Simons 	case 1000:
3171f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3180125bcf0SSjoerd Simons 		break;
3190125bcf0SSjoerd Simons 	default:
3200125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3210125bcf0SSjoerd Simons 		return -EINVAL;
3220125bcf0SSjoerd Simons 	}
3230125bcf0SSjoerd Simons 
3240125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3251f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3260125bcf0SSjoerd Simons 
3270125bcf0SSjoerd Simons 	return 0;
3280125bcf0SSjoerd Simons }
3290125bcf0SSjoerd Simons 
330491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
331491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
33223adb58fSDavid Wu {
3336f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
33423adb58fSDavid Wu 	struct rk3308_grf *grf;
33523adb58fSDavid Wu 	struct clk clk_speed;
33623adb58fSDavid Wu 	int speed, ret;
33723adb58fSDavid Wu 	enum {
33823adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
33923adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
34023adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
34123adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
34223adb58fSDavid Wu 	};
34323adb58fSDavid Wu 
34423adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
34523adb58fSDavid Wu 			      &clk_speed);
34623adb58fSDavid Wu 	if (ret)
34723adb58fSDavid Wu 		return ret;
34823adb58fSDavid Wu 
34923adb58fSDavid Wu 	switch (priv->phydev->speed) {
35023adb58fSDavid Wu 	case 10:
35123adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
35223adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
35323adb58fSDavid Wu 		if (ret)
35423adb58fSDavid Wu 			return ret;
35523adb58fSDavid Wu 		break;
35623adb58fSDavid Wu 	case 100:
35723adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
35823adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
35923adb58fSDavid Wu 		if (ret)
36023adb58fSDavid Wu 			return ret;
36123adb58fSDavid Wu 		break;
36223adb58fSDavid Wu 	default:
36323adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
36423adb58fSDavid Wu 		return -EINVAL;
36523adb58fSDavid Wu 	}
36623adb58fSDavid Wu 
36723adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
36823adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
36923adb58fSDavid Wu 
37023adb58fSDavid Wu 	return 0;
37123adb58fSDavid Wu }
37223adb58fSDavid Wu 
373491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
374491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
375c36b26c0SDavid Wu {
3766f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
377c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
378c36b26c0SDavid Wu 	int clk;
379c36b26c0SDavid Wu 	enum {
380c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
381c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
382c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
383c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
384c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
385491f3bfbSDavid Wu 
386491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
387491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
388491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
389491f3bfbSDavid Wu 
390491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
391491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
392491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
393c36b26c0SDavid Wu 	};
394c36b26c0SDavid Wu 
395c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
396c36b26c0SDavid Wu 	case 10:
397491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
398491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
399491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
400c36b26c0SDavid Wu 		break;
401c36b26c0SDavid Wu 	case 100:
402491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
403491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
404491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
405c36b26c0SDavid Wu 		break;
406c36b26c0SDavid Wu 	case 1000:
407c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
408c36b26c0SDavid Wu 		break;
409c36b26c0SDavid Wu 	default:
410c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
411c36b26c0SDavid Wu 		return -EINVAL;
412c36b26c0SDavid Wu 	}
413c36b26c0SDavid Wu 
414c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
415491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
416491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
417491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
418491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
419491f3bfbSDavid Wu 		     clk);
420c36b26c0SDavid Wu 
421c36b26c0SDavid Wu 	return 0;
422c36b26c0SDavid Wu }
423c36b26c0SDavid Wu 
424491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
425491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
426793f2fd2SPhilipp Tomsich {
4276f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
428793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
429793f2fd2SPhilipp Tomsich 	int clk;
430793f2fd2SPhilipp Tomsich 	enum {
431793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
432793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
433793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
434793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
435793f2fd2SPhilipp Tomsich 	};
436793f2fd2SPhilipp Tomsich 
437793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
438793f2fd2SPhilipp Tomsich 	case 10:
439793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
440793f2fd2SPhilipp Tomsich 		break;
441793f2fd2SPhilipp Tomsich 	case 100:
442793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
443793f2fd2SPhilipp Tomsich 		break;
444793f2fd2SPhilipp Tomsich 	case 1000:
445793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
446793f2fd2SPhilipp Tomsich 		break;
447793f2fd2SPhilipp Tomsich 	default:
448793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
449793f2fd2SPhilipp Tomsich 		return -EINVAL;
450793f2fd2SPhilipp Tomsich 	}
451793f2fd2SPhilipp Tomsich 
452793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
453793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
454793f2fd2SPhilipp Tomsich 
455793f2fd2SPhilipp Tomsich 	return 0;
456793f2fd2SPhilipp Tomsich }
457793f2fd2SPhilipp Tomsich 
458491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
459491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4601f08aa1cSPhilipp Tomsich {
4616f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4621f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4631f08aa1cSPhilipp Tomsich 	int clk;
4641f08aa1cSPhilipp Tomsich 
4651f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4661f08aa1cSPhilipp Tomsich 	case 10:
4671f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4681f08aa1cSPhilipp Tomsich 		break;
4691f08aa1cSPhilipp Tomsich 	case 100:
4701f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4711f08aa1cSPhilipp Tomsich 		break;
4721f08aa1cSPhilipp Tomsich 	case 1000:
4731f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4741f08aa1cSPhilipp Tomsich 		break;
4751f08aa1cSPhilipp Tomsich 	default:
4761f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4771f08aa1cSPhilipp Tomsich 		return -EINVAL;
4781f08aa1cSPhilipp Tomsich 	}
4791f08aa1cSPhilipp Tomsich 
4801f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4811f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4821f08aa1cSPhilipp Tomsich 
4831f08aa1cSPhilipp Tomsich 	return 0;
4841f08aa1cSPhilipp Tomsich }
4851f08aa1cSPhilipp Tomsich 
486491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
487491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4880a33ce65SDavid Wu {
4896f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4900a33ce65SDavid Wu 	struct rv1108_grf *grf;
4910a33ce65SDavid Wu 	int clk, speed;
4920a33ce65SDavid Wu 	enum {
4930a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4940a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4950a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4960a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4970a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4980a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4990a33ce65SDavid Wu 	};
5000a33ce65SDavid Wu 
5010a33ce65SDavid Wu 	switch (priv->phydev->speed) {
5020a33ce65SDavid Wu 	case 10:
5030a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
5040a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
5050a33ce65SDavid Wu 		break;
5060a33ce65SDavid Wu 	case 100:
5070a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
5080a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
5090a33ce65SDavid Wu 		break;
5100a33ce65SDavid Wu 	default:
5110a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
5120a33ce65SDavid Wu 		return -EINVAL;
5130a33ce65SDavid Wu 	}
5140a33ce65SDavid Wu 
5150a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5160a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5170a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5180a33ce65SDavid Wu 		     clk | speed);
5190a33ce65SDavid Wu 
5200a33ce65SDavid Wu 	return 0;
5210a33ce65SDavid Wu }
522dcfb333aSDavid Wu #else
523c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
524c563400aSDavid Wu 				  struct rockchip_eth_dev *dev)
525c563400aSDavid Wu {
526c563400aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
527c563400aSDavid Wu 	struct rk3528_grf *grf;
528c563400aSDavid Wu 	unsigned int div;
529c563400aSDavid Wu 
530c563400aSDavid Wu 	enum {
531c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3,
532c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3),
533c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3),
534c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV20 = 0,
535c563400aSDavid Wu 	};
536c563400aSDavid Wu 
537c563400aSDavid Wu 	enum {
538c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10,
539c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10),
540c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV1 = 0,
541c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10),
542c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11),
543c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11),
544c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV20 = 0,
545c563400aSDavid Wu 	};
546c563400aSDavid Wu 
547c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
548c563400aSDavid Wu 
549c563400aSDavid Wu 	switch (priv->phy->speed) {
550c563400aSDavid Wu 	case 10:
551c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
552c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 :
553c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV20;
554c563400aSDavid Wu 		else
555c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV50;
556c563400aSDavid Wu 		break;
557c563400aSDavid Wu 	case 100:
558c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
559c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 :
560c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV2;
561c563400aSDavid Wu 		else
562c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV5;
563c563400aSDavid Wu 		break;
564c563400aSDavid Wu 	case 1000:
565c563400aSDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
566c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV1;
567c563400aSDavid Wu 		else
568c563400aSDavid Wu 			return -EINVAL;
569c563400aSDavid Wu 		break;
570c563400aSDavid Wu 	default:
571c563400aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
572c563400aSDavid Wu 		return -EINVAL;
573c563400aSDavid Wu 	}
574c563400aSDavid Wu 
575c563400aSDavid Wu 	if (pdata->bus_id)
576c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div);
577c563400aSDavid Wu 	else
578c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div);
579c563400aSDavid Wu 
580c563400aSDavid Wu 	return 0;
581c563400aSDavid Wu }
582c563400aSDavid Wu 
58383f30531SDavid Wu static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata,
58483f30531SDavid Wu 				 struct rockchip_eth_dev *dev)
58583f30531SDavid Wu {
58683f30531SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
58783f30531SDavid Wu 	struct rk3562_grf *grf;
58883f30531SDavid Wu 	unsigned int div;
58983f30531SDavid Wu 
59083f30531SDavid Wu 	enum {
59183f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7,
59283f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7),
59383f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV1 = 0,
59483f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7),
59583f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8),
59683f30531SDavid Wu 		RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7),
59783f30531SDavid Wu 		RK3562_GMAC0_CLK_RMII_DIV20 = 0,
59883f30531SDavid Wu 	};
59983f30531SDavid Wu 
60083f30531SDavid Wu 	enum {
60183f30531SDavid Wu 		RK3562_GMAC1_SPEED_SHIFT = 0x0,
60283f30531SDavid Wu 		RK3562_GMAC1_SPEED_MASK  = BIT(0),
60383f30531SDavid Wu 		RK3562_GMAC1_SPEED_10M   = 0,
60483f30531SDavid Wu 		RK3562_GMAC1_SPEED_100M  = BIT(0),
60583f30531SDavid Wu 	};
60683f30531SDavid Wu 
60783f30531SDavid Wu 	enum {
60883f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13,
60983f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13),
61083f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13),
61183f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV20 = 0,
61283f30531SDavid Wu 	};
61383f30531SDavid Wu 
61483f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
61583f30531SDavid Wu 
61683f30531SDavid Wu 	switch (priv->phy->speed) {
61783f30531SDavid Wu 	case 10:
61883f30531SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
61983f30531SDavid Wu 			if (pdata->bus_id > 0) {
62083f30531SDavid Wu 				div = RK3562_GMAC1_CLK_RMII_DIV20;
62183f30531SDavid Wu 				rk_clrsetreg(&grf->soc_con[0],
62283f30531SDavid Wu 					     RK3562_GMAC1_SPEED_MASK,
62383f30531SDavid Wu 					     RK3562_GMAC1_SPEED_10M);
62483f30531SDavid Wu 			} else {
62583f30531SDavid Wu 				div = RK3562_GMAC0_CLK_RMII_DIV20;
62683f30531SDavid Wu 			}
62783f30531SDavid Wu 		} else {
62883f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV50;
62983f30531SDavid Wu 		}
63083f30531SDavid Wu 		break;
63183f30531SDavid Wu 	case 100:
63283f30531SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
63383f30531SDavid Wu 			if (pdata->bus_id > 0) {
63483f30531SDavid Wu 				div = RK3562_GMAC1_CLK_RMII_DIV2;
63583f30531SDavid Wu 				rk_clrsetreg(&grf->soc_con[0],
63683f30531SDavid Wu 					     RK3562_GMAC1_SPEED_MASK,
63783f30531SDavid Wu 					     RK3562_GMAC1_SPEED_100M);
63883f30531SDavid Wu 			} else {
63983f30531SDavid Wu 				div = RK3562_GMAC0_CLK_RMII_DIV2;
64083f30531SDavid Wu 			}
64183f30531SDavid Wu 		} else {
64283f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV5;
64383f30531SDavid Wu 		}
64483f30531SDavid Wu 		break;
64583f30531SDavid Wu 	case 1000:
64683f30531SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
64783f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV1;
64883f30531SDavid Wu 		else
64983f30531SDavid Wu 			return -EINVAL;
65083f30531SDavid Wu 		break;
65183f30531SDavid Wu 	default:
65283f30531SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
65383f30531SDavid Wu 		return -EINVAL;
65483f30531SDavid Wu 	}
65583f30531SDavid Wu 
65683f30531SDavid Wu 	if (pdata->bus_id)
65783f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div);
65883f30531SDavid Wu 	else
65983f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div);
66083f30531SDavid Wu 
66183f30531SDavid Wu 	return 0;
66283f30531SDavid Wu }
66383f30531SDavid Wu 
664bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
665bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
666bf0e94d0SDavid Wu {
667bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
668bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
669bf0e94d0SDavid Wu 	unsigned int div, div_mask;
670bf0e94d0SDavid Wu 
671bf0e94d0SDavid Wu 	enum {
672bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
673bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
674bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
675a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
676bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
6776d863a16SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV2 = BIT(2),
678bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
6796d863a16SDavid Wu 		RK3588_GMAC1_ID_SHIFT = 5,
680bf0e94d0SDavid Wu 	};
681bf0e94d0SDavid Wu 
682bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
683bf0e94d0SDavid Wu 
684bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
685bf0e94d0SDavid Wu 	case 10:
686bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
687bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
688bf0e94d0SDavid Wu 		else
689bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
690bf0e94d0SDavid Wu 		break;
691bf0e94d0SDavid Wu 	case 100:
692bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
6936d863a16SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV2;
694bf0e94d0SDavid Wu 		else
695bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
696bf0e94d0SDavid Wu 		break;
697bf0e94d0SDavid Wu 	case 1000:
698bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
699bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
700bf0e94d0SDavid Wu 		else
701bf0e94d0SDavid Wu 			return -EINVAL;
702bf0e94d0SDavid Wu 		break;
703bf0e94d0SDavid Wu 	default:
704bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
705bf0e94d0SDavid Wu 		return -EINVAL;
706bf0e94d0SDavid Wu 	}
707bf0e94d0SDavid Wu 
708bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
709bf0e94d0SDavid Wu 		div <<= 5;
710bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
711bf0e94d0SDavid Wu 	}
712bf0e94d0SDavid Wu 
7136d863a16SDavid Wu 	div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0;
7146d863a16SDavid Wu 	div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) :
7156d863a16SDavid Wu 		   RK3588_GMAC_CLK_RGMII_DIV_MASK;
7166d863a16SDavid Wu 
717bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
718bf0e94d0SDavid Wu 
719bf0e94d0SDavid Wu 	return 0;
720bf0e94d0SDavid Wu }
721bf0e94d0SDavid Wu 
72220bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
72320bef841SDavid Wu 				 struct rockchip_eth_dev *dev)
72420bef841SDavid Wu {
72520bef841SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
726*745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B
727*745dad46SDavid Wu 	struct rv1103b_grf *grf;
728*745dad46SDavid Wu #else
72920bef841SDavid Wu 	struct rv1106_grf *grf;
730*745dad46SDavid Wu #endif
73120bef841SDavid Wu 	unsigned int div;
73220bef841SDavid Wu 
73320bef841SDavid Wu 	enum {
73420bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
73520bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
73620bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
73720bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV20 = 0,
73820bef841SDavid Wu 	};
73920bef841SDavid Wu 
74020bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
74120bef841SDavid Wu 
74220bef841SDavid Wu 	switch (priv->phy->speed) {
74320bef841SDavid Wu 	case 10:
74420bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV20;
74520bef841SDavid Wu 		break;
74620bef841SDavid Wu 	case 100:
74720bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV2;
74820bef841SDavid Wu 		break;
74920bef841SDavid Wu 	default:
75020bef841SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
75120bef841SDavid Wu 		return -EINVAL;
75220bef841SDavid Wu 	}
75320bef841SDavid Wu 
75420bef841SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
75520bef841SDavid Wu 
75620bef841SDavid Wu 	return 0;
75720bef841SDavid Wu }
75820bef841SDavid Wu 
759491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
760491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
761dcfb333aSDavid Wu {
762dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
763dcfb333aSDavid Wu 	struct clk clk_speed;
764dcfb333aSDavid Wu 	int ret;
765dcfb333aSDavid Wu 
766dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
767dcfb333aSDavid Wu 			      &clk_speed);
768dcfb333aSDavid Wu 	if (ret) {
76933a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
77033a014bdSDavid Wu 		       __func__, ret);
771dcfb333aSDavid Wu 		return ret;
772dcfb333aSDavid Wu 	}
773dcfb333aSDavid Wu 
774dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
775dcfb333aSDavid Wu 	case 10:
776dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
777dcfb333aSDavid Wu 		if (ret)
778dcfb333aSDavid Wu 			return ret;
779dcfb333aSDavid Wu 		break;
780dcfb333aSDavid Wu 	case 100:
781dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
782dcfb333aSDavid Wu 		if (ret)
783dcfb333aSDavid Wu 			return ret;
784dcfb333aSDavid Wu 		break;
785dcfb333aSDavid Wu 	case 1000:
786dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
787dcfb333aSDavid Wu 		if (ret)
788dcfb333aSDavid Wu 			return ret;
789dcfb333aSDavid Wu 		break;
790dcfb333aSDavid Wu 	default:
791dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
792dcfb333aSDavid Wu 		return -EINVAL;
793dcfb333aSDavid Wu 	}
794dcfb333aSDavid Wu 
795dcfb333aSDavid Wu 	return 0;
796dcfb333aSDavid Wu }
7976f0a52e9SDavid Wu #endif
7980a33ce65SDavid Wu 
7996f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
80018ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
80118ae91c8SDavid Wu {
80218ae91c8SDavid Wu 	struct px30_grf *grf;
80318ae91c8SDavid Wu 	enum {
80418ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
80518ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
80618ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
80718ae91c8SDavid Wu 	};
80818ae91c8SDavid Wu 
80918ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
81018ae91c8SDavid Wu 
81118ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
81218ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
81318ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
81418ae91c8SDavid Wu }
81518ae91c8SDavid Wu 
816ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
817ff86648dSDavid Wu {
818ff86648dSDavid Wu 	struct rk1808_grf *grf;
819ff86648dSDavid Wu 	enum {
820ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
821ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
822ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
823ff86648dSDavid Wu 
824ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
825ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
826ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
827ff86648dSDavid Wu 
828ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
829ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
830ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
831ff86648dSDavid Wu 	};
832ff86648dSDavid Wu 	enum {
833ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
834ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
835ff86648dSDavid Wu 
836ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
837ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
838ff86648dSDavid Wu 	};
839ff86648dSDavid Wu 
840ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
841ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
842ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
843ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
844ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
845ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
846ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
847ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
848ff86648dSDavid Wu 
849ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
850ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
851ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
852c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) |
853c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT));
854ff86648dSDavid Wu }
855ff86648dSDavid Wu 
856af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
857af166ffaSDavid Wu {
858af166ffaSDavid Wu 	struct rk322x_grf *grf;
859af166ffaSDavid Wu 	enum {
860af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
861af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
862af166ffaSDavid Wu 
863af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
864af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
865af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
866af166ffaSDavid Wu 
867af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
868af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
869af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
870af166ffaSDavid Wu 
871af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
872af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
873af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
874af166ffaSDavid Wu 	};
875af166ffaSDavid Wu 	enum {
876af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
877af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
878af166ffaSDavid Wu 
879af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
880af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
881af166ffaSDavid Wu 	};
882af166ffaSDavid Wu 
883af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
884af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
885af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
886af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
887af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
888af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
889af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
890af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
891af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
892af166ffaSDavid Wu 
893af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
894af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
895af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
896af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
897af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
898af166ffaSDavid Wu }
899af166ffaSDavid Wu 
900491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
901491f3bfbSDavid Wu {
902491f3bfbSDavid Wu 	struct rk322x_grf *grf;
903491f3bfbSDavid Wu 	enum {
904491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
905491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
906491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
907491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
908491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
909491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
910491f3bfbSDavid Wu 	};
911491f3bfbSDavid Wu 
912491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
913491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
914491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
915491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
916491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
917491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
918491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
919491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
920491f3bfbSDavid Wu }
921491f3bfbSDavid Wu 
9221f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
9231f08aa1cSPhilipp Tomsich {
9241f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
9251f08aa1cSPhilipp Tomsich 
9261f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9271f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
9281f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
9291f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
9301f08aa1cSPhilipp Tomsich 
9311f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
9321f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
9331f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
9341f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
9351f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
9361f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
9371f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
9381f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
9391f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
9401f08aa1cSPhilipp Tomsich }
9411f08aa1cSPhilipp Tomsich 
94223adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
94323adb58fSDavid Wu {
94423adb58fSDavid Wu 	struct rk3308_grf *grf;
94523adb58fSDavid Wu 	enum {
94623adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
94723adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
94823adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
94923adb58fSDavid Wu 	};
95023adb58fSDavid Wu 
95123adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
95223adb58fSDavid Wu 
95323adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
95423adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
95523adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
95623adb58fSDavid Wu }
95723adb58fSDavid Wu 
958c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
959c36b26c0SDavid Wu {
960c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
961c36b26c0SDavid Wu 	enum {
962c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
963c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
964c36b26c0SDavid Wu 
965c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
966c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
967c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
968c36b26c0SDavid Wu 
969c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
970c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
971c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
972c36b26c0SDavid Wu 
973c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
974c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
975c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
976c36b26c0SDavid Wu 	};
977c36b26c0SDavid Wu 	enum {
978c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
979c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
980c36b26c0SDavid Wu 
981c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
982c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
983c36b26c0SDavid Wu 	};
984c36b26c0SDavid Wu 
985c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
986c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
987c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
988c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
989c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
990c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
991c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
992c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
993c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
994c36b26c0SDavid Wu 
995c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
996c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
997c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
998c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
999c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
1000c36b26c0SDavid Wu }
1001c36b26c0SDavid Wu 
1002491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1003491f3bfbSDavid Wu {
1004491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1005491f3bfbSDavid Wu 	enum {
1006491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
1007491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
1008491f3bfbSDavid Wu 
1009491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1010491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1011491f3bfbSDavid Wu 	};
1012491f3bfbSDavid Wu 
1013491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1014491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
1015491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
1016491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
1017491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
1018491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
1019491f3bfbSDavid Wu }
1020491f3bfbSDavid Wu 
1021793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1022793f2fd2SPhilipp Tomsich {
1023793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
1024793f2fd2SPhilipp Tomsich 	enum {
1025793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
1026793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
1027793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
1028793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
1029793f2fd2SPhilipp Tomsich 	};
1030793f2fd2SPhilipp Tomsich 	enum {
1031793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
1032793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1033793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
1034793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
1035793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1036793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
1037793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
1038793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1039793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
1040793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1041793f2fd2SPhilipp Tomsich 	};
1042793f2fd2SPhilipp Tomsich 
1043793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1044793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
1045793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
1046793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
1047793f2fd2SPhilipp Tomsich 
1048793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
1049793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
1050793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
1051793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
1052793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
1053793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
1054793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
1055c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) |
1056c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT));
1057793f2fd2SPhilipp Tomsich }
1058793f2fd2SPhilipp Tomsich 
10591f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
10601f08aa1cSPhilipp Tomsich {
10611f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
10621f08aa1cSPhilipp Tomsich 
10631f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
10641f08aa1cSPhilipp Tomsich 
10651f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
10661f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
10671f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
10681f08aa1cSPhilipp Tomsich 
10691f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
10701f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
10711f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
10721f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
10731f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
10741f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
10751f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
1076c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) |
1077c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT));
10781f08aa1cSPhilipp Tomsich }
10791f08aa1cSPhilipp Tomsich 
10800a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
10810a33ce65SDavid Wu {
10820a33ce65SDavid Wu 	struct rv1108_grf *grf;
10830a33ce65SDavid Wu 
10840a33ce65SDavid Wu 	enum {
10850a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
10860a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
10870a33ce65SDavid Wu 	};
10880a33ce65SDavid Wu 
10890a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
10900a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
10910a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
10920a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
10930a33ce65SDavid Wu }
1094491f3bfbSDavid Wu 
1095491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1096491f3bfbSDavid Wu {
1097491f3bfbSDavid Wu 	struct rk322x_grf *grf;
1098491f3bfbSDavid Wu 	enum {
1099491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
1100491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
1101491f3bfbSDavid Wu 	};
1102491f3bfbSDavid Wu 	enum {
1103491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1104491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
1105491f3bfbSDavid Wu 
1106491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1107491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
1108491f3bfbSDavid Wu 
1109491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
1110491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
1111491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
1112491f3bfbSDavid Wu 	};
1113491f3bfbSDavid Wu 	enum {
1114491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1115491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
1116491f3bfbSDavid Wu 	};
1117491f3bfbSDavid Wu 	enum {
1118491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1119491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
1120491f3bfbSDavid Wu 	};
1121491f3bfbSDavid Wu 
1122491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1123491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
1124491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
1125491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
1126491f3bfbSDavid Wu 
1127491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1128491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
1129491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
1130491f3bfbSDavid Wu 
1131491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1132491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
1133491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
1134491f3bfbSDavid Wu 
1135491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1136491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1137491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
1138491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
1139491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1140491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
1141491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
1142491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
1143491f3bfbSDavid Wu 
1144491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1145491f3bfbSDavid Wu 	udelay(10);
1146491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1147491f3bfbSDavid Wu 	udelay(10);
1148491f3bfbSDavid Wu 
1149491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1150491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1151491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
1152491f3bfbSDavid Wu 	udelay(30 * 1000);
1153491f3bfbSDavid Wu }
1154491f3bfbSDavid Wu 
1155491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1156491f3bfbSDavid Wu {
1157491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1158491f3bfbSDavid Wu 	enum {
1159491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1160491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
1161491f3bfbSDavid Wu 	};
1162491f3bfbSDavid Wu 	enum {
1163491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1164491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1165491f3bfbSDavid Wu 
1166491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1167491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
1168491f3bfbSDavid Wu 
1169491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
1170491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
1171491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
1172491f3bfbSDavid Wu 	};
1173491f3bfbSDavid Wu 	enum {
1174491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1175491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1176491f3bfbSDavid Wu 	};
1177491f3bfbSDavid Wu 	enum {
1178491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1179491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1180491f3bfbSDavid Wu 	};
1181491f3bfbSDavid Wu 
1182491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1183491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
1184491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
1185491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
1186491f3bfbSDavid Wu 
1187491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1188491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1189491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
1190491f3bfbSDavid Wu 
1191491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1192491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1193491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
1194491f3bfbSDavid Wu 
1195491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1196491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1197491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
1198491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1199491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1200491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1201491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1202491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1203491f3bfbSDavid Wu 
1204491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1205491f3bfbSDavid Wu 	udelay(10);
1206491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1207491f3bfbSDavid Wu 	udelay(10);
1208491f3bfbSDavid Wu 
1209491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1210491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1211491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1212491f3bfbSDavid Wu 	udelay(30 * 1000);
1213491f3bfbSDavid Wu }
1214491f3bfbSDavid Wu 
1215dcfb333aSDavid Wu #else
1216c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1217c563400aSDavid Wu {
1218c563400aSDavid Wu 	struct rk3528_grf *grf;
1219c563400aSDavid Wu 	unsigned char bgs[1] = {0};
1220c563400aSDavid Wu 
1221c563400aSDavid Wu 	enum {
1222c563400aSDavid Wu 		RK3528_MACPHY_ENABLE_MASK = BIT(1),
1223c563400aSDavid Wu 		RK3528_MACPHY_DISENABLE = BIT(1),
1224c563400aSDavid Wu 		RK3528_MACPHY_ENABLE = 0,
1225c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
1226c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL = BIT(6),
1227c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
1228c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
1229c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
1230c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID = BIT(11),
1231c563400aSDavid Wu 	};
1232c563400aSDavid Wu 
1233c563400aSDavid Wu 	enum {
1234c563400aSDavid Wu 		RK3528_MACPHY_BGS_MASK = GENMASK(3, 0),
1235c563400aSDavid Wu 	};
1236c563400aSDavid Wu 
1237c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1238c563400aSDavid Wu 	struct udevice *dev;
1239c563400aSDavid Wu 	u32 regs[2] = {0};
1240c563400aSDavid Wu 	ofnode node;
1241c563400aSDavid Wu 	int ret = 0;
1242c563400aSDavid Wu 
1243c563400aSDavid Wu 	/* retrieve the device */
1244c563400aSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1245c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1246c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1247c563400aSDavid Wu 						  &dev);
1248c563400aSDavid Wu 	else
1249c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1250c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1251c563400aSDavid Wu 						  &dev);
1252c563400aSDavid Wu 	if (!ret) {
1253c563400aSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1254c563400aSDavid Wu 		if (ofnode_valid(node)) {
1255c563400aSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1256c563400aSDavid Wu 				/* read the bgs from the efuses */
1257c563400aSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1258c563400aSDavid Wu 				if (ret) {
1259c563400aSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1260c563400aSDavid Wu 					       ret);
1261c563400aSDavid Wu 					bgs[0] = 0;
1262c563400aSDavid Wu 				}
1263c563400aSDavid Wu 			}
1264c563400aSDavid Wu 		}
1265c563400aSDavid Wu 	}
1266c563400aSDavid Wu #endif
1267c563400aSDavid Wu 
1268c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1269c563400aSDavid Wu 
1270c563400aSDavid Wu 	reset_assert(&pdata->phy_reset);
1271c563400aSDavid Wu 	udelay(20);
1272c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
1273c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE_MASK |
1274c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL_MASK |
1275c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_MASK |
1276c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID_MASK,
1277c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE |
1278c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL |
1279c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_24M |
1280c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID);
1281c563400aSDavid Wu 
1282c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
1283c563400aSDavid Wu 		     RK3528_MACPHY_BGS_MASK,
1284c563400aSDavid Wu 		     bgs[0]);
1285c563400aSDavid Wu 	udelay(20);
1286c563400aSDavid Wu 	reset_deassert(&pdata->phy_reset);
1287c563400aSDavid Wu 	udelay(30 * 1000);
1288c563400aSDavid Wu }
1289c563400aSDavid Wu 
1290c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1291c563400aSDavid Wu {
1292c563400aSDavid Wu 	unsigned int clk_mode;
1293c563400aSDavid Wu 	struct rk3528_grf *grf;
1294c563400aSDavid Wu 
1295c563400aSDavid Wu 	enum {
1296c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1,
1297c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1),
1298c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE = 0x1,
1299c563400aSDavid Wu 	};
1300c563400aSDavid Wu 
1301c563400aSDavid Wu 	enum {
1302c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8,
1303c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8),
1304c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE = 0x1,
1305c563400aSDavid Wu 	};
1306c563400aSDavid Wu 
1307c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1308c563400aSDavid Wu 
1309c563400aSDavid Wu 	if (pdata->bus_id == 1) {
1310c563400aSDavid Wu 		clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT;
1311c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode);
1312c563400aSDavid Wu 	} else {
1313c563400aSDavid Wu 		clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT;
1314c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode);
1315c563400aSDavid Wu 	}
1316c563400aSDavid Wu }
1317c563400aSDavid Wu 
1318c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1319c563400aSDavid Wu {
1320c563400aSDavid Wu 	unsigned int rx_enable;
1321c563400aSDavid Wu 	unsigned int rx_delay;
1322c563400aSDavid Wu 	struct rk3528_grf *grf;
1323c563400aSDavid Wu 
1324c563400aSDavid Wu 	enum {
1325c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8,
1326c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_MASK = BIT(8),
1327c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE = 0x0,
1328c563400aSDavid Wu 
1329c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14),
1330c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0,
1331c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14),
1332c563400aSDavid Wu 
1333c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15),
1334c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0,
1335c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15),
1336c563400aSDavid Wu 	};
1337c563400aSDavid Wu 
1338c563400aSDavid Wu 	enum {
1339c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8,
1340c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8),
1341c563400aSDavid Wu 
1342c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0,
1343c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0),
1344c563400aSDavid Wu 	};
1345c563400aSDavid Wu 
1346c563400aSDavid Wu 	if (!pdata->bus_id)
1347c563400aSDavid Wu 		return;
1348c563400aSDavid Wu 
1349c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1350c563400aSDavid Wu 
1351c563400aSDavid Wu 	if (pdata->rx_delay < 0) {
1352c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE;
1353c563400aSDavid Wu 		rx_delay = 0;
1354c563400aSDavid Wu 	} else {
1355c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE;
1356c563400aSDavid Wu 		rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT;
1357c563400aSDavid Wu 	}
1358c563400aSDavid Wu 
1359c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0,
1360c563400aSDavid Wu 		     RK3528_GMAC1_TXCLK_DLY_ENA_MASK |
1361c563400aSDavid Wu 		     RK3528_GMAC1_RXCLK_DLY_ENA_MASK |
1362c563400aSDavid Wu 		     RK3528_GMAC1_RGMII_MODE_MASK,
1363c563400aSDavid Wu 		     rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE |
1364c563400aSDavid Wu 		     (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT));
1365c563400aSDavid Wu 
1366c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con1,
1367c563400aSDavid Wu 		     RK3528_GMAC1_RX_DL_CFG_MASK |
1368c563400aSDavid Wu 		     RK3528_GMAC1_TX_DL_CFG_MASK,
1369c563400aSDavid Wu 		     (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) |
1370c563400aSDavid Wu 		     rx_delay);
1371c563400aSDavid Wu }
1372c563400aSDavid Wu 
137383f30531SDavid Wu static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata)
137483f30531SDavid Wu {
137583f30531SDavid Wu 	struct rk3562_grf *grf;
137683f30531SDavid Wu 	unsigned int mode;
137783f30531SDavid Wu 
137883f30531SDavid Wu 	enum {
137983f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE_SHIFT = 0x5,
138083f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE_MASK = BIT(5),
138183f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE = 0x1,
138283f30531SDavid Wu 	};
138383f30531SDavid Wu 
138483f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
138583f30531SDavid Wu 
138683f30531SDavid Wu 	if (!pdata->bus_id) {
138783f30531SDavid Wu 		mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT;
138883f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode);
138983f30531SDavid Wu 	}
139083f30531SDavid Wu }
139183f30531SDavid Wu 
139283f30531SDavid Wu static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
139383f30531SDavid Wu {
139483f30531SDavid Wu 	struct rk3562_grf *grf;
139583f30531SDavid Wu 	struct rk3562_ioc *ioc;
139683f30531SDavid Wu 	unsigned int rx_enable;
139783f30531SDavid Wu 	unsigned int rx_delay;
139883f30531SDavid Wu 
139983f30531SDavid Wu 	enum {
140083f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5,
140183f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE_MASK = BIT(5),
140283f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE = 0x0,
140383f30531SDavid Wu 
140483f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0),
140583f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0,
140683f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0),
140783f30531SDavid Wu 
140883f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1),
140983f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0,
141083f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1),
141183f30531SDavid Wu 	};
141283f30531SDavid Wu 
141383f30531SDavid Wu 	enum {
141483f30531SDavid Wu 		RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8,
141583f30531SDavid Wu 		RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8),
141683f30531SDavid Wu 
141783f30531SDavid Wu 		RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0,
141883f30531SDavid Wu 		RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0),
141983f30531SDavid Wu 	};
142083f30531SDavid Wu 
142183f30531SDavid Wu 	if (pdata->bus_id)
142283f30531SDavid Wu 		return;
142383f30531SDavid Wu 
142483f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
142583f30531SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
142683f30531SDavid Wu 
142783f30531SDavid Wu 	rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK,
142883f30531SDavid Wu 		     RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT);
142983f30531SDavid Wu 
143083f30531SDavid Wu 	if (pdata->rx_delay < 0) {
143183f30531SDavid Wu 		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE;
143283f30531SDavid Wu 		rx_delay = 0;
143383f30531SDavid Wu 	} else {
143483f30531SDavid Wu 		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE;
143583f30531SDavid Wu 		rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT;
143683f30531SDavid Wu 	}
143783f30531SDavid Wu 
143883f30531SDavid Wu 	rk_clrsetreg(&ioc->mac0_io_con1,
143983f30531SDavid Wu 		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
144083f30531SDavid Wu 		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
144183f30531SDavid Wu 		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
144283f30531SDavid Wu 
144383f30531SDavid Wu 	rk_clrsetreg(&ioc->mac0_io_con0,
144483f30531SDavid Wu 		     RK3562_GMAC0_RX_DL_CFG_MASK |
144583f30531SDavid Wu 		     RK3562_GMAC0_TX_DL_CFG_MASK,
144683f30531SDavid Wu 		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
144783f30531SDavid Wu 		     rx_delay);
144883f30531SDavid Wu 
144983f30531SDavid Wu 	rk_clrsetreg(&ioc->mac1_io_con1,
145083f30531SDavid Wu 		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
145183f30531SDavid Wu 		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
145283f30531SDavid Wu 		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
145383f30531SDavid Wu 
145483f30531SDavid Wu 	rk_clrsetreg(&ioc->mac1_io_con0,
145583f30531SDavid Wu 		     RK3562_GMAC0_RX_DL_CFG_MASK |
145683f30531SDavid Wu 		     RK3562_GMAC0_TX_DL_CFG_MASK,
145783f30531SDavid Wu 		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
145883f30531SDavid Wu 		     rx_delay);
145983f30531SDavid Wu }
146083f30531SDavid Wu 
146133a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
146233a014bdSDavid Wu {
146333a014bdSDavid Wu 	struct rk3568_grf *grf;
146433a014bdSDavid Wu 	void *con1;
146533a014bdSDavid Wu 
146633a014bdSDavid Wu 	enum {
146733a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
146833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
146933a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
147033a014bdSDavid Wu 	};
147133a014bdSDavid Wu 
147233a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
147333a014bdSDavid Wu 
147433a014bdSDavid Wu 	if (pdata->bus_id == 1)
147533a014bdSDavid Wu 		con1 = &grf->mac1_con1;
147633a014bdSDavid Wu 	else
147733a014bdSDavid Wu 		con1 = &grf->mac0_con1;
147833a014bdSDavid Wu 
147933a014bdSDavid Wu 	rk_clrsetreg(con1,
148033a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
148133a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
148233a014bdSDavid Wu }
148333a014bdSDavid Wu 
148433a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
148533a014bdSDavid Wu {
148633a014bdSDavid Wu 	struct rk3568_grf *grf;
148733a014bdSDavid Wu 	void *con0, *con1;
148833a014bdSDavid Wu 
148933a014bdSDavid Wu 	enum {
149033a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
149133a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
149233a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
149333a014bdSDavid Wu 
149433a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
149533a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
149633a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
149733a014bdSDavid Wu 
149833a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
149933a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
150033a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
150133a014bdSDavid Wu 	};
150233a014bdSDavid Wu 
150333a014bdSDavid Wu 	enum {
150433a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
150533a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
150633a014bdSDavid Wu 
150733a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
150833a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
150933a014bdSDavid Wu 	};
151033a014bdSDavid Wu 
151133a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
151233a014bdSDavid Wu 
151333a014bdSDavid Wu 	if (pdata->bus_id == 1) {
151433a014bdSDavid Wu 		con0 = &grf->mac1_con0;
151533a014bdSDavid Wu 		con1 = &grf->mac1_con1;
151633a014bdSDavid Wu 	} else {
151733a014bdSDavid Wu 		con0 = &grf->mac0_con0;
151833a014bdSDavid Wu 		con1 = &grf->mac0_con1;
151933a014bdSDavid Wu 	}
152033a014bdSDavid Wu 
152133a014bdSDavid Wu 	rk_clrsetreg(con0,
152233a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
152333a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
1524c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) |
1525c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT));
152633a014bdSDavid Wu 
152733a014bdSDavid Wu 	rk_clrsetreg(con1,
152833a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
152933a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
153033a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
153133a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
153233a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
153333a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
153433a014bdSDavid Wu }
153533a014bdSDavid Wu 
1536bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1537bf0e94d0SDavid Wu {
1538bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1539bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1540bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1541bf0e94d0SDavid Wu 
1542bf0e94d0SDavid Wu 	enum {
1543bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1544bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1545bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1546bf0e94d0SDavid Wu 	};
1547bf0e94d0SDavid Wu 
1548bf0e94d0SDavid Wu 	enum {
1549bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1550bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1551bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1552bf0e94d0SDavid Wu 	};
1553bf0e94d0SDavid Wu 
1554bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1555bf0e94d0SDavid Wu 
1556bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1557bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1558bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1559bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1560bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1561bf0e94d0SDavid Wu 	} else {
1562bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1563bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1564bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1565bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1566bf0e94d0SDavid Wu 	}
1567bf0e94d0SDavid Wu 
1568bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1569bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1570bf0e94d0SDavid Wu }
1571bf0e94d0SDavid Wu 
1572bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1573bf0e94d0SDavid Wu {
1574bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1575bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1576bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1577bf0e94d0SDavid Wu 	unsigned int rx_delay;
1578bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1579bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1580bf0e94d0SDavid Wu 	void *offset_con;
1581bf0e94d0SDavid Wu 
1582bf0e94d0SDavid Wu 	enum {
1583bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1584bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1585bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1586bf0e94d0SDavid Wu 
1587bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1588bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1589bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1590bf0e94d0SDavid Wu 
1591bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1592bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1593bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1594bf0e94d0SDavid Wu 	};
1595bf0e94d0SDavid Wu 
1596bf0e94d0SDavid Wu 	enum {
1597bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1598bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1599bf0e94d0SDavid Wu 
1600bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1601bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1602bf0e94d0SDavid Wu 	};
1603bf0e94d0SDavid Wu 
1604bf0e94d0SDavid Wu 	enum {
1605bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1606bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1607bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1608bf0e94d0SDavid Wu 	};
1609bf0e94d0SDavid Wu 
1610bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1611bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1612bf0e94d0SDavid Wu 
1613bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1614bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1615bf0e94d0SDavid Wu 		rx_delay = 0;
1616bf0e94d0SDavid Wu 	} else {
1617bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1618bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1619bf0e94d0SDavid Wu 	}
1620bf0e94d0SDavid Wu 
1621bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1622bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1623bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1624bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1625bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1626bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1627bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1628bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1629bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1630bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1631bf0e94d0SDavid Wu 	} else {
1632bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1633bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1634bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1635bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1636bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1637bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1638bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1639bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1640bf0e94d0SDavid Wu 	}
1641bf0e94d0SDavid Wu 
1642bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1643bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1644bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1645c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) |
1646bf0e94d0SDavid Wu 		     rx_delay);
1647bf0e94d0SDavid Wu 
1648bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1649bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1650bf0e94d0SDavid Wu 
1651bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1652bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1653bf0e94d0SDavid Wu }
1654bf0e94d0SDavid Wu 
1655*745dad46SDavid Wu static void rv1103b_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1656*745dad46SDavid Wu {
1657*745dad46SDavid Wu 	struct rv1103b_grf *grf;
1658*745dad46SDavid Wu 	enum {
1659*745dad46SDavid Wu 		RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK = BIT(2),
1660*745dad46SDavid Wu 		RV1103B_SYSGRF_GMAC_CLK_RMII_50M = BIT(2),
1661*745dad46SDavid Wu 	};
1662*745dad46SDavid Wu 
1663*745dad46SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1664*745dad46SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
1665*745dad46SDavid Wu 		     RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK,
1666*745dad46SDavid Wu 		     RV1103B_SYSGRF_GMAC_CLK_RMII_50M);
1667*745dad46SDavid Wu };
1668*745dad46SDavid Wu 
166920bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
167020bef841SDavid Wu {
1671*745dad46SDavid Wu 	#ifdef CONFIG_ROCKCHIP_RV1103B
1672*745dad46SDavid Wu 		struct rv1103b_grf *grf;
1673*745dad46SDavid Wu 	#else
167420bef841SDavid Wu 		struct rv1106_grf *grf;
1675*745dad46SDavid Wu 	#endif
1676535678cdSDavid Wu 	unsigned char bgs[1] = {0};
1677535678cdSDavid Wu 
1678535678cdSDavid Wu 	enum {
1679535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1680535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1681535678cdSDavid Wu 	};
168254f7ad44SDavid Wu 
168354f7ad44SDavid Wu 	enum {
168420bef841SDavid Wu 		RV1106_MACPHY_ENABLE_MASK = BIT(1),
168554f7ad44SDavid Wu 		RV1106_MACPHY_DISENABLE = BIT(1),
168654f7ad44SDavid Wu 		RV1106_MACPHY_ENABLE = 0,
168720bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
168820bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL = BIT(6),
168920bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
169020bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
169120bef841SDavid Wu 		RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
169220bef841SDavid Wu 		RV1106_MACPHY_PHY_ID = BIT(11),
169320bef841SDavid Wu 	};
169420bef841SDavid Wu 
169520bef841SDavid Wu 	enum {
169620bef841SDavid Wu 		RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
169754f7ad44SDavid Wu 		RV1106_MACPHY_BGS = BIT(2),
169820bef841SDavid Wu 	};
169920bef841SDavid Wu 
1700535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1701535678cdSDavid Wu 	struct udevice *dev;
1702535678cdSDavid Wu 	u32 regs[2] = {0};
1703535678cdSDavid Wu 	ofnode node;
1704535678cdSDavid Wu 	int ret = 0;
1705535678cdSDavid Wu 
1706535678cdSDavid Wu 	/* retrieve the device */
1707535678cdSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1708535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1709535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1710535678cdSDavid Wu 						  &dev);
1711535678cdSDavid Wu 	else
1712535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1713535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1714535678cdSDavid Wu 						  &dev);
1715535678cdSDavid Wu 	if (!ret) {
1716535678cdSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1717535678cdSDavid Wu 		if (ofnode_valid(node)) {
1718535678cdSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1719535678cdSDavid Wu 				/* read the bgs from the efuses */
1720535678cdSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1721535678cdSDavid Wu 				if (ret) {
1722535678cdSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1723535678cdSDavid Wu 					       ret);
1724535678cdSDavid Wu 					bgs[0] = 0;
1725535678cdSDavid Wu 				}
1726535678cdSDavid Wu 			}
1727535678cdSDavid Wu 		}
1728535678cdSDavid Wu 	}
1729535678cdSDavid Wu #endif
1730535678cdSDavid Wu 
173120bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
173220bef841SDavid Wu 
173320bef841SDavid Wu 	reset_assert(&pdata->phy_reset);
173420bef841SDavid Wu 	udelay(20);
173520bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
173620bef841SDavid Wu 		     RV1106_MACPHY_ENABLE_MASK |
173720bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL_MASK |
173820bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_MASK |
173920bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID_MASK,
174020bef841SDavid Wu 		     RV1106_MACPHY_ENABLE |
174120bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL |
174220bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_24M |
174320bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID);
174420bef841SDavid Wu 
174520bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
174620bef841SDavid Wu 		     RV1106_MACPHY_BGS_MASK,
1747535678cdSDavid Wu 		     bgs[0]);
17488bafa3a1SDavid Wu 	udelay(20);
174920bef841SDavid Wu 	reset_deassert(&pdata->phy_reset);
175020bef841SDavid Wu 	udelay(30 * 1000);
175120bef841SDavid Wu }
175220bef841SDavid Wu 
17538bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
17548bafa3a1SDavid Wu {
17558bafa3a1SDavid Wu 	struct rv1106_grf *grf;
17568bafa3a1SDavid Wu 	enum {
17578bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
17588bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
17598bafa3a1SDavid Wu 	};
17608bafa3a1SDavid Wu 
17618bafa3a1SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
17628bafa3a1SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
17638bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
17648bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE);
17658bafa3a1SDavid Wu };
17668bafa3a1SDavid Wu 
1767e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1768e4e3f431SDavid Wu {
1769e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1770e4e3f431SDavid Wu 
1771e4e3f431SDavid Wu 	enum {
1772e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1773e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1774e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1775e4e3f431SDavid Wu 	};
1776e4e3f431SDavid Wu 
1777e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1778e4e3f431SDavid Wu 
1779e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1780e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1781e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1782e4e3f431SDavid Wu }
1783e4e3f431SDavid Wu 
1784dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1785dcfb333aSDavid Wu {
1786dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1787dcfb333aSDavid Wu 
1788dcfb333aSDavid Wu 	enum {
1789dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1790dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1791dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1792dcfb333aSDavid Wu 
1793dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1794dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1795dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1796dcfb333aSDavid Wu 
1797dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1798dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1799dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1800dcfb333aSDavid Wu 
1801dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1802dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1803dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1804dcfb333aSDavid Wu 
1805dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1806dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1807dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1808dcfb333aSDavid Wu 	};
1809dcfb333aSDavid Wu 	enum {
1810dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1811dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1812dcfb333aSDavid Wu 
1813dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1814dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1815dcfb333aSDavid Wu 	};
1816dcfb333aSDavid Wu 	enum {
1817dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1818dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1819dcfb333aSDavid Wu 
1820dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1821dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1822dcfb333aSDavid Wu 	};
1823dcfb333aSDavid Wu 
1824dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1825dcfb333aSDavid Wu 
1826dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1827dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1828dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1829dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1830dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1831dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1832dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1833dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1834dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1835dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1836dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1837dcfb333aSDavid Wu 
1838dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1839dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1840dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1841c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) |
1842c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT));
1843dcfb333aSDavid Wu 
1844dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1845dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1846dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1847c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) |
1848c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT));
1849dcfb333aSDavid Wu }
18506f0a52e9SDavid Wu #endif
18510a33ce65SDavid Wu 
1852bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1853c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1854c563400aSDavid Wu {
1855c563400aSDavid Wu 	struct rk3528_grf *grf;
1856c563400aSDavid Wu 	unsigned int val;
1857c563400aSDavid Wu 
1858c563400aSDavid Wu 	enum {
1859c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_SHIFT = 0x12,
1860c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_MASK = BIT(12),
1861c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_CRU = 0,
1862c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_IO = BIT(12),
1863c563400aSDavid Wu 	};
1864c563400aSDavid Wu 
1865c563400aSDavid Wu 	if (!pdata->bus_id)
1866c563400aSDavid Wu 		return;
1867c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1868c563400aSDavid Wu 
1869c563400aSDavid Wu 	val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO :
1870c563400aSDavid Wu 				   RK3528_GMAC1_CLK_SELET_CRU;
1871c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val);
1872c563400aSDavid Wu }
1873c563400aSDavid Wu 
187483f30531SDavid Wu static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata)
187583f30531SDavid Wu {
187683f30531SDavid Wu 	struct rk3562_grf *grf;
187783f30531SDavid Wu 	struct rk3562_ioc *ioc;
187883f30531SDavid Wu 	unsigned int val;
187983f30531SDavid Wu 
188083f30531SDavid Wu 	enum {
188183f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_SHIFT = 0x9,
188283f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_MASK = BIT(9),
188383f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_CRU = 0,
188483f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_IO = BIT(9),
188583f30531SDavid Wu 	};
188683f30531SDavid Wu 
188783f30531SDavid Wu 	enum {
188883f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_SHIFT = 15,
188983f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_MASK = BIT(15),
189083f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_CRU = 0,
189183f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_IO = BIT(15),
189283f30531SDavid Wu 	};
189383f30531SDavid Wu 
189483f30531SDavid Wu 	enum {
189583f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2,
189683f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2),
189783f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0,
189883f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2),
189983f30531SDavid Wu 	};
190083f30531SDavid Wu 
190183f30531SDavid Wu 	enum {
190283f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3,
190383f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3),
190483f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0,
190583f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3),
190683f30531SDavid Wu 	};
190783f30531SDavid Wu 
190883f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
190983f30531SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
191083f30531SDavid Wu 
191183f30531SDavid Wu 	if (!pdata->bus_id) {
191283f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO :
191383f30531SDavid Wu 					   RK3562_GMAC0_CLK_SELET_CRU;
191483f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val);
191583f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO :
191683f30531SDavid Wu 					   RK3562_GMAC0_IO_EXTCLK_SELET_CRU;
191783f30531SDavid Wu 		rk_clrsetreg(&ioc->mac1_io_con1,
191883f30531SDavid Wu 			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
191983f30531SDavid Wu 		rk_clrsetreg(&ioc->mac0_io_con1,
192083f30531SDavid Wu 			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
192183f30531SDavid Wu 
192283f30531SDavid Wu 	} else {
192383f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO :
192483f30531SDavid Wu 					   RK3562_GMAC1_CLK_SELET_CRU;
192583f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val);
192683f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO :
192783f30531SDavid Wu 					   RK3562_GMAC1_IO_EXTCLK_SELET_CRU;
192883f30531SDavid Wu 		rk_clrsetreg(&ioc->mac1_io_con1,
192983f30531SDavid Wu 			     RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val);
193083f30531SDavid Wu 	}
193183f30531SDavid Wu }
193283f30531SDavid Wu 
1933bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1934bf0e94d0SDavid Wu {
1935bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1936bf0e94d0SDavid Wu 	unsigned int val, mask;
1937bf0e94d0SDavid Wu 
1938bf0e94d0SDavid Wu 	enum {
1939bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
1940bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
1941bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
1942bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
1943bf0e94d0SDavid Wu 	};
1944bf0e94d0SDavid Wu 
1945bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1946bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
1947bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
1948bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
1949bf0e94d0SDavid Wu 
1950bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1951bf0e94d0SDavid Wu 		val <<= 5;
1952bf0e94d0SDavid Wu 		mask <<= 5;
1953bf0e94d0SDavid Wu 	}
1954bf0e94d0SDavid Wu 
1955bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
1956bf0e94d0SDavid Wu }
1957bf0e94d0SDavid Wu #endif
1958bf0e94d0SDavid Wu 
19590125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
19600125bcf0SSjoerd Simons {
19610125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
19621f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
19631f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
19646f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
19656f0a52e9SDavid Wu 	struct eqos_config *config;
19666f0a52e9SDavid Wu #else
19676f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
19686f0a52e9SDavid Wu #endif
19696f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
19700125bcf0SSjoerd Simons 	struct clk clk;
19710a33ce65SDavid Wu 	ulong rate;
19720125bcf0SSjoerd Simons 	int ret;
19730125bcf0SSjoerd Simons 
19746f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
19756f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
19766f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
1977befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
19786f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
19796f0a52e9SDavid Wu #else
19806f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
19816f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
19826f0a52e9SDavid Wu #endif
198333a014bdSDavid Wu 	pdata->bus_id = dev->seq;
198454f7ad44SDavid Wu 
1985cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1986cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
1987cadc8d74SKever Yang 	if (ret)
1988cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
1989cadc8d74SKever Yang 
19900125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
19910125bcf0SSjoerd Simons 	if (ret)
1992*745dad46SDavid Wu 		debug("%s clk_get_by_index failed %d\n", __func__, ret);
19930125bcf0SSjoerd Simons 
1994491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
1995491f3bfbSDavid Wu 
1996bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
1997bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
1998bf0e94d0SDavid Wu 
1999491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
2000491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
2001491f3bfbSDavid Wu 
20020a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
20030a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
2004bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
20050a33ce65SDavid Wu 		/*
20060a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
20070a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
20080a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
20090a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
20100a33ce65SDavid Wu 		 */
20110a33ce65SDavid Wu 		if (!pdata->clock_input) {
2012*745dad46SDavid Wu 			if (clk.id) {
20130a33ce65SDavid Wu 				rate = clk_set_rate(&clk, 125000000);
20140a33ce65SDavid Wu 				if (rate != 125000000)
20150a33ce65SDavid Wu 					return -EINVAL;
20160a33ce65SDavid Wu 			}
2017*745dad46SDavid Wu 		}
20180125bcf0SSjoerd Simons 
2019bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
2020bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
2021bf0e94d0SDavid Wu 
20220125bcf0SSjoerd Simons 		/* Set to RGMII mode */
20230a33ce65SDavid Wu 		if (ops->set_to_rgmii)
20241f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
20250a33ce65SDavid Wu 		else
20260a33ce65SDavid Wu 			return -EPERM;
20270a33ce65SDavid Wu 
20280a33ce65SDavid Wu 		break;
20290a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
20300a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
20310a33ce65SDavid Wu 		if (!pdata->clock_input) {
2032*745dad46SDavid Wu 			if (clk.id) {
20330a33ce65SDavid Wu 				rate = clk_set_rate(&clk, 50000000);
20340a33ce65SDavid Wu 				if (rate != 50000000)
20350a33ce65SDavid Wu 					return -EINVAL;
20360a33ce65SDavid Wu 			}
2037*745dad46SDavid Wu 		}
20380a33ce65SDavid Wu 
20390a33ce65SDavid Wu 		/* Set to RMII mode */
20400a33ce65SDavid Wu 		if (ops->set_to_rmii)
20410a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
20420a33ce65SDavid Wu 
20430a33ce65SDavid Wu 		break;
20440a33ce65SDavid Wu 	default:
20450a33ce65SDavid Wu 		debug("NO interface defined!\n");
20460a33ce65SDavid Wu 		return -ENXIO;
20470a33ce65SDavid Wu 	}
20480125bcf0SSjoerd Simons 
20496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
20506f0a52e9SDavid Wu 	return eqos_probe(dev);
20516f0a52e9SDavid Wu #else
20520125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
20536f0a52e9SDavid Wu #endif
20546f0a52e9SDavid Wu }
20556f0a52e9SDavid Wu 
20566f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
20576f0a52e9SDavid Wu {
20586f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
20596f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
20606f0a52e9SDavid Wu #else
20616f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
20626f0a52e9SDavid Wu #endif
20636f0a52e9SDavid Wu }
20646f0a52e9SDavid Wu 
20656f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
20666f0a52e9SDavid Wu 				      int length)
20676f0a52e9SDavid Wu {
20686f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
20696f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
20706f0a52e9SDavid Wu #else
20716f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
20726f0a52e9SDavid Wu #endif
20736f0a52e9SDavid Wu }
20746f0a52e9SDavid Wu 
20756f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
20766f0a52e9SDavid Wu 				  int length)
20776f0a52e9SDavid Wu {
20786f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
20796f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
20806f0a52e9SDavid Wu #else
20816f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
20826f0a52e9SDavid Wu #endif
20836f0a52e9SDavid Wu }
20846f0a52e9SDavid Wu 
20856f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
20866f0a52e9SDavid Wu 				  uchar **packetp)
20876f0a52e9SDavid Wu {
20886f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
20896f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
20906f0a52e9SDavid Wu #else
20916f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
20926f0a52e9SDavid Wu #endif
20930125bcf0SSjoerd Simons }
20940125bcf0SSjoerd Simons 
20950125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
20960125bcf0SSjoerd Simons {
20976f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
20981f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
20991f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
21006f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
2101491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
21026f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
21036f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
21046f0a52e9SDavid Wu #endif
21050125bcf0SSjoerd Simons 	int ret;
21060125bcf0SSjoerd Simons 
21076f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21086f0a52e9SDavid Wu 	ret = eqos_init(dev);
21096f0a52e9SDavid Wu #else
21106f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
21116f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
21126f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
21136f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
21146f0a52e9SDavid Wu #endif
21150125bcf0SSjoerd Simons 	if (ret)
21160125bcf0SSjoerd Simons 		return ret;
2117491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
21180125bcf0SSjoerd Simons 	if (ret)
21190125bcf0SSjoerd Simons 		return ret;
21206f0a52e9SDavid Wu 
21216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21226f0a52e9SDavid Wu 	eqos_enable(dev);
21236f0a52e9SDavid Wu #else
21246f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
21250125bcf0SSjoerd Simons 	if (ret)
21260125bcf0SSjoerd Simons 		return ret;
21276f0a52e9SDavid Wu #endif
21280125bcf0SSjoerd Simons 
21290125bcf0SSjoerd Simons 	return 0;
21300125bcf0SSjoerd Simons }
21310125bcf0SSjoerd Simons 
21326f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
21336f0a52e9SDavid Wu {
21346f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21356f0a52e9SDavid Wu 	eqos_stop(dev);
21366f0a52e9SDavid Wu #else
21376f0a52e9SDavid Wu 	designware_eth_stop(dev);
21386f0a52e9SDavid Wu #endif
21396f0a52e9SDavid Wu }
21406f0a52e9SDavid Wu 
21410125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
21420125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
21436f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
21446f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
21456f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
21466f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
21476f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
21480125bcf0SSjoerd Simons };
21490125bcf0SSjoerd Simons 
21506f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
215118ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
215218ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
215318ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
215418ae91c8SDavid Wu };
215518ae91c8SDavid Wu 
2156ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
2157ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
2158ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
2159ff86648dSDavid Wu };
2160ff86648dSDavid Wu 
2161af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
2162af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
2163491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
2164af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
2165491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
2166af166ffaSDavid Wu };
2167af166ffaSDavid Wu 
21681f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
21691f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
21701f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
21711f08aa1cSPhilipp Tomsich };
21721f08aa1cSPhilipp Tomsich 
217323adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
217423adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
217523adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
217623adb58fSDavid Wu };
217723adb58fSDavid Wu 
2178c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
2179c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
2180491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
2181c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
2182491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
2183c36b26c0SDavid Wu };
2184c36b26c0SDavid Wu 
2185793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
2186793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
2187793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
2188793f2fd2SPhilipp Tomsich };
2189793f2fd2SPhilipp Tomsich 
21901f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
21911f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
21921f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
21931f08aa1cSPhilipp Tomsich };
21941f08aa1cSPhilipp Tomsich 
21950a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
21960a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
21970a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
21980a33ce65SDavid Wu };
2199dcfb333aSDavid Wu #else
2200c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = {
2201c563400aSDavid Wu 	.fix_mac_speed = rk3528_set_rgmii_speed,
2202c563400aSDavid Wu 	.set_to_rgmii = rk3528_set_to_rgmii,
2203c563400aSDavid Wu 	.set_to_rmii = rk3528_set_to_rmii,
2204c563400aSDavid Wu 	.set_clock_selection = rk3528_set_clock_selection,
2205c563400aSDavid Wu 	.integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup,
2206c563400aSDavid Wu };
2207c563400aSDavid Wu 
220883f30531SDavid Wu const struct rk_gmac_ops rk3562_gmac_ops = {
220983f30531SDavid Wu 	.fix_mac_speed = rk3562_set_gmac_speed,
221083f30531SDavid Wu 	.set_to_rgmii = rk3562_set_to_rgmii,
221183f30531SDavid Wu 	.set_to_rmii = rk3562_set_to_rmii,
221283f30531SDavid Wu 	.set_clock_selection = rk3562_set_clock_selection,
221383f30531SDavid Wu };
221483f30531SDavid Wu 
221533a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
221633a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
221733a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
221833a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
221933a014bdSDavid Wu };
222033a014bdSDavid Wu 
2221bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
2222bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
2223bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
2224bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
2225bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
2226bf0e94d0SDavid Wu };
2227bf0e94d0SDavid Wu 
2228*745dad46SDavid Wu const struct rk_gmac_ops rv1103b_gmac_ops = {
2229*745dad46SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
2230*745dad46SDavid Wu 	.set_to_rmii = rv1103b_set_to_rmii,
2231*745dad46SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
2232*745dad46SDavid Wu };
2233*745dad46SDavid Wu 
223420bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = {
223520bef841SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
22368bafa3a1SDavid Wu 	.set_to_rmii = rv1106_set_to_rmii,
223720bef841SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
223820bef841SDavid Wu };
223920bef841SDavid Wu 
2240dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
2241dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
2242dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
2243e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
2244dcfb333aSDavid Wu };
22456f0a52e9SDavid Wu #endif
22460a33ce65SDavid Wu 
22470125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
22486f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
224984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
225018ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
225118ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
225284e90485SDavid Wu #endif
225384e90485SDavid Wu 
225484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
2255ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
2256ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
225784e90485SDavid Wu #endif
225884e90485SDavid Wu 
225984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
2260af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
2261af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
226284e90485SDavid Wu #endif
226384e90485SDavid Wu 
226484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
22651f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
22661f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
226784e90485SDavid Wu #endif
226884e90485SDavid Wu 
226984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
227023adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
227123adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
227284e90485SDavid Wu #endif
227384e90485SDavid Wu 
227484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
2275c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
2276c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
227784e90485SDavid Wu #endif
227884e90485SDavid Wu 
227984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
2280793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
2281793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
228284e90485SDavid Wu #endif
228384e90485SDavid Wu 
228484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
22851f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
22861f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
228784e90485SDavid Wu #endif
228884e90485SDavid Wu 
228984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
22900a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
22910a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
229284e90485SDavid Wu #endif
2293dcfb333aSDavid Wu #else
2294c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528
2295c563400aSDavid Wu 	{ .compatible = "rockchip,rk3528-gmac",
2296c563400aSDavid Wu 	  .data = (ulong)&rk3528_gmac_ops },
2297c563400aSDavid Wu #endif
2298c563400aSDavid Wu 
229983f30531SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3562
230083f30531SDavid Wu 	{ .compatible = "rockchip,rk3562-gmac",
230183f30531SDavid Wu 	  .data = (ulong)&rk3562_gmac_ops },
230283f30531SDavid Wu #endif
230383f30531SDavid Wu 
230484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
230533a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
230633a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
230784e90485SDavid Wu #endif
230884e90485SDavid Wu 
2309bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
2310bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
2311bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
2312bf0e94d0SDavid Wu #endif
2313bf0e94d0SDavid Wu 
2314*745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B
2315*745dad46SDavid Wu 	{ .compatible = "rockchip,rv1103b-gmac",
2316*745dad46SDavid Wu 	  .data = (ulong)&rv1103b_gmac_ops },
2317*745dad46SDavid Wu #endif
2318*745dad46SDavid Wu 
231920bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106
232020bef841SDavid Wu 	{ .compatible = "rockchip,rv1106-gmac",
232120bef841SDavid Wu 	  .data = (ulong)&rv1106_gmac_ops },
232220bef841SDavid Wu #endif
232320bef841SDavid Wu 
232484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
2325dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
2326dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
23276f0a52e9SDavid Wu #endif
232884e90485SDavid Wu #endif
23290125bcf0SSjoerd Simons 	{ }
23300125bcf0SSjoerd Simons };
23310125bcf0SSjoerd Simons 
23320125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
23330125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
23340125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
23350125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
23360125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
23370125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
23380125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
23396f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
23400125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
23410125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
23420125bcf0SSjoerd Simons };
2343