xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision 6d863a16d2f875eaec83d337f5a6d2b28e300278)
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
2133a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
22bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
2320bef841SDavid Wu #include <asm/arch/grf_rv1106.h>
24dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
256f0a52e9SDavid Wu #include "dwc_eth_qos.h"
266f0a52e9SDavid Wu #else
2718ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
28ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
29af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
300125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
3123adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
32c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
33793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
341f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
350a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
360125bcf0SSjoerd Simons #include "designware.h"
376f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
386f0a52e9SDavid Wu #endif
396f0a52e9SDavid Wu #include <dm/pinctrl.h>
40491f3bfbSDavid Wu #include <dm/of_access.h>
410125bcf0SSjoerd Simons 
420125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
430125bcf0SSjoerd Simons 
446f0a52e9SDavid Wu struct rockchip_eth_dev {
456f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
466f0a52e9SDavid Wu 	struct eqos_priv eqos;
476f0a52e9SDavid Wu #else
486f0a52e9SDavid Wu 	struct dw_eth_dev dw;
496f0a52e9SDavid Wu #endif
50491f3bfbSDavid Wu 	int phy_interface;
516f0a52e9SDavid Wu };
526f0a52e9SDavid Wu 
530125bcf0SSjoerd Simons /*
540125bcf0SSjoerd Simons  * Platform data for the gmac
550125bcf0SSjoerd Simons  *
560125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
570125bcf0SSjoerd Simons  */
580125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
596f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
600125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
616f0a52e9SDavid Wu #else
626f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
636f0a52e9SDavid Wu #endif
64491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
65491f3bfbSDavid Wu 	bool integrated_phy;
660a33ce65SDavid Wu 	bool clock_input;
67491f3bfbSDavid Wu 	int phy_interface;
680125bcf0SSjoerd Simons 	int tx_delay;
690125bcf0SSjoerd Simons 	int rx_delay;
7033a014bdSDavid Wu 	int bus_id;
710125bcf0SSjoerd Simons };
720125bcf0SSjoerd Simons 
731f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
746f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
756f0a52e9SDavid Wu 	const struct eqos_config config;
766f0a52e9SDavid Wu #endif
77491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
78491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
790a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
801f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
81bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
82491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
831f08aa1cSPhilipp Tomsich };
841f08aa1cSPhilipp Tomsich 
85befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
86befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
87befcb627SDavid Wu 	.reg_access_always_ok = false,
88befcb627SDavid Wu 	.mdio_wait = 10000,
89befcb627SDavid Wu 	.swr_wait = 200,
90befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
91befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
92befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
93befcb627SDavid Wu };
94befcb627SDavid Wu #endif
95befcb627SDavid Wu 
961eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
971eb9d064SDavid Wu {
981eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
991eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
1001eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
1011eb9d064SDavid Wu 
1021eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1031eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1041eb9d064SDavid Wu 
1051eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1061eb9d064SDavid Wu }
1071f08aa1cSPhilipp Tomsich 
1080125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1090125bcf0SSjoerd Simons {
1100125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
111491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
11254f7ad44SDavid Wu 	struct udevice *phydev;
1130a33ce65SDavid Wu 	const char *string;
114491f3bfbSDavid Wu 	int ret;
1150a33ce65SDavid Wu 
1160a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1170a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1180a33ce65SDavid Wu 		pdata->clock_input = true;
1190a33ce65SDavid Wu 	else
1200a33ce65SDavid Wu 		pdata->clock_input = false;
1210125bcf0SSjoerd Simons 
122491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
123491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
124491f3bfbSDavid Wu 	if (ret) {
125491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
126491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
127491f3bfbSDavid Wu 	} else {
128491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
129491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
130491f3bfbSDavid Wu 							 "phy-is-integrated");
131491f3bfbSDavid Wu 	}
132491f3bfbSDavid Wu 
133491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
134491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
135491f3bfbSDavid Wu 		if (ret) {
13654f7ad44SDavid Wu 			ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
13754f7ad44SDavid Wu 			if (ret) {
13854f7ad44SDavid Wu 				debug("Get phydev by ofnode failed: err=%d\n", ret);
13954f7ad44SDavid Wu 				return ret;
14054f7ad44SDavid Wu 			}
14154f7ad44SDavid Wu 
14254f7ad44SDavid Wu 			ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
14354f7ad44SDavid Wu 			if (ret) {
144491f3bfbSDavid Wu 				debug("No PHY reset control found: ret=%d\n", ret);
145491f3bfbSDavid Wu 				return ret;
146491f3bfbSDavid Wu 			}
147491f3bfbSDavid Wu 		}
14854f7ad44SDavid Wu 	}
149491f3bfbSDavid Wu 
1501f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1517ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1527ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1531f08aa1cSPhilipp Tomsich 
1541f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1551f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1567ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1571f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1587ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1590125bcf0SSjoerd Simons 
1606f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1616f0a52e9SDavid Wu 	return 0;
1626f0a52e9SDavid Wu #else
1630125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1646f0a52e9SDavid Wu #endif
1650125bcf0SSjoerd Simons }
1660125bcf0SSjoerd Simons 
1676f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
168491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
169491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
17018ae91c8SDavid Wu {
1716f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
17218ae91c8SDavid Wu 	struct px30_grf *grf;
17318ae91c8SDavid Wu 	struct clk clk_speed;
17418ae91c8SDavid Wu 	int speed, ret;
17518ae91c8SDavid Wu 	enum {
17618ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
17718ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
17818ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
17918ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
18018ae91c8SDavid Wu 	};
18118ae91c8SDavid Wu 
18218ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
18318ae91c8SDavid Wu 			      &clk_speed);
18418ae91c8SDavid Wu 	if (ret)
18518ae91c8SDavid Wu 		return ret;
18618ae91c8SDavid Wu 
18718ae91c8SDavid Wu 	switch (priv->phydev->speed) {
18818ae91c8SDavid Wu 	case 10:
18918ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
19018ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
19118ae91c8SDavid Wu 		if (ret)
19218ae91c8SDavid Wu 			return ret;
19318ae91c8SDavid Wu 		break;
19418ae91c8SDavid Wu 	case 100:
19518ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
19618ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
19718ae91c8SDavid Wu 		if (ret)
19818ae91c8SDavid Wu 			return ret;
19918ae91c8SDavid Wu 		break;
20018ae91c8SDavid Wu 	default:
20118ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
20218ae91c8SDavid Wu 		return -EINVAL;
20318ae91c8SDavid Wu 	}
20418ae91c8SDavid Wu 
20518ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
20618ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
20718ae91c8SDavid Wu 
20818ae91c8SDavid Wu 	return 0;
20918ae91c8SDavid Wu }
21018ae91c8SDavid Wu 
211491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
212491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
213ff86648dSDavid Wu {
2146f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
215ff86648dSDavid Wu 	struct clk clk_speed;
216ff86648dSDavid Wu 	int ret;
217ff86648dSDavid Wu 
218ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
219ff86648dSDavid Wu 			      &clk_speed);
220ff86648dSDavid Wu 	if (ret)
221ff86648dSDavid Wu 		return ret;
222ff86648dSDavid Wu 
223ff86648dSDavid Wu 	switch (priv->phydev->speed) {
224ff86648dSDavid Wu 	case 10:
225ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
226ff86648dSDavid Wu 		if (ret)
227ff86648dSDavid Wu 			return ret;
228ff86648dSDavid Wu 		break;
229ff86648dSDavid Wu 	case 100:
230ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
231ff86648dSDavid Wu 		if (ret)
232ff86648dSDavid Wu 			return ret;
233ff86648dSDavid Wu 		break;
234ff86648dSDavid Wu 	case 1000:
235ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
236ff86648dSDavid Wu 		if (ret)
237ff86648dSDavid Wu 			return ret;
238ff86648dSDavid Wu 		break;
239ff86648dSDavid Wu 	default:
240ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
241ff86648dSDavid Wu 		return -EINVAL;
242ff86648dSDavid Wu 	}
243ff86648dSDavid Wu 
244ff86648dSDavid Wu 	return 0;
245ff86648dSDavid Wu }
246ff86648dSDavid Wu 
247491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
248491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
249af166ffaSDavid Wu {
2506f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
251af166ffaSDavid Wu 	struct rk322x_grf *grf;
252af166ffaSDavid Wu 	int clk;
253af166ffaSDavid Wu 	enum {
254af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
255af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
256af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
257af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
258af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
259491f3bfbSDavid Wu 
260491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
261491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
262491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
263491f3bfbSDavid Wu 
264491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
265491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
266491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
267af166ffaSDavid Wu 	};
268af166ffaSDavid Wu 
269af166ffaSDavid Wu 	switch (priv->phydev->speed) {
270af166ffaSDavid Wu 	case 10:
271491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
272491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
273491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
274af166ffaSDavid Wu 		break;
275af166ffaSDavid Wu 	case 100:
276491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
277491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
278491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
279af166ffaSDavid Wu 		break;
280af166ffaSDavid Wu 	case 1000:
281af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
282af166ffaSDavid Wu 		break;
283af166ffaSDavid Wu 	default:
284af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
285af166ffaSDavid Wu 		return -EINVAL;
286af166ffaSDavid Wu 	}
287af166ffaSDavid Wu 
288af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
289491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
290491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
291491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
292491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
293491f3bfbSDavid Wu 		     clk);
294af166ffaSDavid Wu 
295af166ffaSDavid Wu 	return 0;
296af166ffaSDavid Wu }
297af166ffaSDavid Wu 
298491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
299491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
3000125bcf0SSjoerd Simons {
3016f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3020125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
3030125bcf0SSjoerd Simons 	int clk;
3040125bcf0SSjoerd Simons 
3050125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
3060125bcf0SSjoerd Simons 	case 10:
3071f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
3080125bcf0SSjoerd Simons 		break;
3090125bcf0SSjoerd Simons 	case 100:
3101f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
3110125bcf0SSjoerd Simons 		break;
3120125bcf0SSjoerd Simons 	case 1000:
3131f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3140125bcf0SSjoerd Simons 		break;
3150125bcf0SSjoerd Simons 	default:
3160125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3170125bcf0SSjoerd Simons 		return -EINVAL;
3180125bcf0SSjoerd Simons 	}
3190125bcf0SSjoerd Simons 
3200125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3211f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3220125bcf0SSjoerd Simons 
3230125bcf0SSjoerd Simons 	return 0;
3240125bcf0SSjoerd Simons }
3250125bcf0SSjoerd Simons 
326491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
327491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
32823adb58fSDavid Wu {
3296f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
33023adb58fSDavid Wu 	struct rk3308_grf *grf;
33123adb58fSDavid Wu 	struct clk clk_speed;
33223adb58fSDavid Wu 	int speed, ret;
33323adb58fSDavid Wu 	enum {
33423adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
33523adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
33623adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
33723adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
33823adb58fSDavid Wu 	};
33923adb58fSDavid Wu 
34023adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
34123adb58fSDavid Wu 			      &clk_speed);
34223adb58fSDavid Wu 	if (ret)
34323adb58fSDavid Wu 		return ret;
34423adb58fSDavid Wu 
34523adb58fSDavid Wu 	switch (priv->phydev->speed) {
34623adb58fSDavid Wu 	case 10:
34723adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
34823adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
34923adb58fSDavid Wu 		if (ret)
35023adb58fSDavid Wu 			return ret;
35123adb58fSDavid Wu 		break;
35223adb58fSDavid Wu 	case 100:
35323adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
35423adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
35523adb58fSDavid Wu 		if (ret)
35623adb58fSDavid Wu 			return ret;
35723adb58fSDavid Wu 		break;
35823adb58fSDavid Wu 	default:
35923adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
36023adb58fSDavid Wu 		return -EINVAL;
36123adb58fSDavid Wu 	}
36223adb58fSDavid Wu 
36323adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
36423adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
36523adb58fSDavid Wu 
36623adb58fSDavid Wu 	return 0;
36723adb58fSDavid Wu }
36823adb58fSDavid Wu 
369491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
370491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
371c36b26c0SDavid Wu {
3726f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
373c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
374c36b26c0SDavid Wu 	int clk;
375c36b26c0SDavid Wu 	enum {
376c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
377c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
378c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
379c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
380c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
381491f3bfbSDavid Wu 
382491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
383491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
384491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
385491f3bfbSDavid Wu 
386491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
387491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
388491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
389c36b26c0SDavid Wu 	};
390c36b26c0SDavid Wu 
391c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
392c36b26c0SDavid Wu 	case 10:
393491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
394491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
395491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
396c36b26c0SDavid Wu 		break;
397c36b26c0SDavid Wu 	case 100:
398491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
399491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
400491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
401c36b26c0SDavid Wu 		break;
402c36b26c0SDavid Wu 	case 1000:
403c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
404c36b26c0SDavid Wu 		break;
405c36b26c0SDavid Wu 	default:
406c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
407c36b26c0SDavid Wu 		return -EINVAL;
408c36b26c0SDavid Wu 	}
409c36b26c0SDavid Wu 
410c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
411491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
412491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
413491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
414491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
415491f3bfbSDavid Wu 		     clk);
416c36b26c0SDavid Wu 
417c36b26c0SDavid Wu 	return 0;
418c36b26c0SDavid Wu }
419c36b26c0SDavid Wu 
420491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
421491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
422793f2fd2SPhilipp Tomsich {
4236f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
424793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
425793f2fd2SPhilipp Tomsich 	int clk;
426793f2fd2SPhilipp Tomsich 	enum {
427793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
428793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
429793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
430793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
431793f2fd2SPhilipp Tomsich 	};
432793f2fd2SPhilipp Tomsich 
433793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
434793f2fd2SPhilipp Tomsich 	case 10:
435793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
436793f2fd2SPhilipp Tomsich 		break;
437793f2fd2SPhilipp Tomsich 	case 100:
438793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
439793f2fd2SPhilipp Tomsich 		break;
440793f2fd2SPhilipp Tomsich 	case 1000:
441793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
442793f2fd2SPhilipp Tomsich 		break;
443793f2fd2SPhilipp Tomsich 	default:
444793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
445793f2fd2SPhilipp Tomsich 		return -EINVAL;
446793f2fd2SPhilipp Tomsich 	}
447793f2fd2SPhilipp Tomsich 
448793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
449793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
450793f2fd2SPhilipp Tomsich 
451793f2fd2SPhilipp Tomsich 	return 0;
452793f2fd2SPhilipp Tomsich }
453793f2fd2SPhilipp Tomsich 
454491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
455491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4561f08aa1cSPhilipp Tomsich {
4576f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4581f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4591f08aa1cSPhilipp Tomsich 	int clk;
4601f08aa1cSPhilipp Tomsich 
4611f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4621f08aa1cSPhilipp Tomsich 	case 10:
4631f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4641f08aa1cSPhilipp Tomsich 		break;
4651f08aa1cSPhilipp Tomsich 	case 100:
4661f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4671f08aa1cSPhilipp Tomsich 		break;
4681f08aa1cSPhilipp Tomsich 	case 1000:
4691f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4701f08aa1cSPhilipp Tomsich 		break;
4711f08aa1cSPhilipp Tomsich 	default:
4721f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4731f08aa1cSPhilipp Tomsich 		return -EINVAL;
4741f08aa1cSPhilipp Tomsich 	}
4751f08aa1cSPhilipp Tomsich 
4761f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4771f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4781f08aa1cSPhilipp Tomsich 
4791f08aa1cSPhilipp Tomsich 	return 0;
4801f08aa1cSPhilipp Tomsich }
4811f08aa1cSPhilipp Tomsich 
482491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
483491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4840a33ce65SDavid Wu {
4856f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4860a33ce65SDavid Wu 	struct rv1108_grf *grf;
4870a33ce65SDavid Wu 	int clk, speed;
4880a33ce65SDavid Wu 	enum {
4890a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4900a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4910a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4920a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4930a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4940a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4950a33ce65SDavid Wu 	};
4960a33ce65SDavid Wu 
4970a33ce65SDavid Wu 	switch (priv->phydev->speed) {
4980a33ce65SDavid Wu 	case 10:
4990a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
5000a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
5010a33ce65SDavid Wu 		break;
5020a33ce65SDavid Wu 	case 100:
5030a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
5040a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
5050a33ce65SDavid Wu 		break;
5060a33ce65SDavid Wu 	default:
5070a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
5080a33ce65SDavid Wu 		return -EINVAL;
5090a33ce65SDavid Wu 	}
5100a33ce65SDavid Wu 
5110a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5120a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5130a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5140a33ce65SDavid Wu 		     clk | speed);
5150a33ce65SDavid Wu 
5160a33ce65SDavid Wu 	return 0;
5170a33ce65SDavid Wu }
518dcfb333aSDavid Wu #else
519bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
520bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
521bf0e94d0SDavid Wu {
522bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
523bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
524bf0e94d0SDavid Wu 	unsigned int div, div_mask;
525bf0e94d0SDavid Wu 
526bf0e94d0SDavid Wu 	enum {
527bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
528bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
529bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
530a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
531bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
532*6d863a16SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV2 = BIT(2),
533bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
534*6d863a16SDavid Wu 		RK3588_GMAC1_ID_SHIFT = 5,
535bf0e94d0SDavid Wu 	};
536bf0e94d0SDavid Wu 
537bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
538bf0e94d0SDavid Wu 
539bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
540bf0e94d0SDavid Wu 	case 10:
541bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
542bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
543bf0e94d0SDavid Wu 		else
544bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
545bf0e94d0SDavid Wu 		break;
546bf0e94d0SDavid Wu 	case 100:
547bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
548*6d863a16SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV2;
549bf0e94d0SDavid Wu 		else
550bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
551bf0e94d0SDavid Wu 		break;
552bf0e94d0SDavid Wu 	case 1000:
553bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
554bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
555bf0e94d0SDavid Wu 		else
556bf0e94d0SDavid Wu 			return -EINVAL;
557bf0e94d0SDavid Wu 		break;
558bf0e94d0SDavid Wu 	default:
559bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
560bf0e94d0SDavid Wu 		return -EINVAL;
561bf0e94d0SDavid Wu 	}
562bf0e94d0SDavid Wu 
563bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
564bf0e94d0SDavid Wu 		div <<= 5;
565bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
566bf0e94d0SDavid Wu 	}
567bf0e94d0SDavid Wu 
568*6d863a16SDavid Wu 	div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0;
569*6d863a16SDavid Wu 	div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) :
570*6d863a16SDavid Wu 		   RK3588_GMAC_CLK_RGMII_DIV_MASK;
571*6d863a16SDavid Wu 
572bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
573bf0e94d0SDavid Wu 
574bf0e94d0SDavid Wu 	return 0;
575bf0e94d0SDavid Wu }
576bf0e94d0SDavid Wu 
57720bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
57820bef841SDavid Wu 				 struct rockchip_eth_dev *dev)
57920bef841SDavid Wu {
58020bef841SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
58120bef841SDavid Wu 	struct rv1106_grf *grf;
58220bef841SDavid Wu 	unsigned int div;
58320bef841SDavid Wu 
58420bef841SDavid Wu 	enum {
58520bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
58620bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
58720bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
58820bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV20 = 0,
58920bef841SDavid Wu 	};
59020bef841SDavid Wu 
59120bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
59220bef841SDavid Wu 
59320bef841SDavid Wu 	switch (priv->phy->speed) {
59420bef841SDavid Wu 	case 10:
59520bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV20;
59620bef841SDavid Wu 		break;
59720bef841SDavid Wu 	case 100:
59820bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV2;
59920bef841SDavid Wu 		break;
60020bef841SDavid Wu 	default:
60120bef841SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
60220bef841SDavid Wu 		return -EINVAL;
60320bef841SDavid Wu 	}
60420bef841SDavid Wu 
60520bef841SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
60620bef841SDavid Wu 
60720bef841SDavid Wu 	return 0;
60820bef841SDavid Wu }
60920bef841SDavid Wu 
610491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
611491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
612dcfb333aSDavid Wu {
613dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
614dcfb333aSDavid Wu 	struct clk clk_speed;
615dcfb333aSDavid Wu 	int ret;
616dcfb333aSDavid Wu 
617dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
618dcfb333aSDavid Wu 			      &clk_speed);
619dcfb333aSDavid Wu 	if (ret) {
62033a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
62133a014bdSDavid Wu 		       __func__, ret);
622dcfb333aSDavid Wu 		return ret;
623dcfb333aSDavid Wu 	}
624dcfb333aSDavid Wu 
625dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
626dcfb333aSDavid Wu 	case 10:
627dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
628dcfb333aSDavid Wu 		if (ret)
629dcfb333aSDavid Wu 			return ret;
630dcfb333aSDavid Wu 		break;
631dcfb333aSDavid Wu 	case 100:
632dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
633dcfb333aSDavid Wu 		if (ret)
634dcfb333aSDavid Wu 			return ret;
635dcfb333aSDavid Wu 		break;
636dcfb333aSDavid Wu 	case 1000:
637dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
638dcfb333aSDavid Wu 		if (ret)
639dcfb333aSDavid Wu 			return ret;
640dcfb333aSDavid Wu 		break;
641dcfb333aSDavid Wu 	default:
642dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
643dcfb333aSDavid Wu 		return -EINVAL;
644dcfb333aSDavid Wu 	}
645dcfb333aSDavid Wu 
646dcfb333aSDavid Wu 	return 0;
647dcfb333aSDavid Wu }
6486f0a52e9SDavid Wu #endif
6490a33ce65SDavid Wu 
6506f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
65118ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
65218ae91c8SDavid Wu {
65318ae91c8SDavid Wu 	struct px30_grf *grf;
65418ae91c8SDavid Wu 	enum {
65518ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
65618ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
65718ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
65818ae91c8SDavid Wu 	};
65918ae91c8SDavid Wu 
66018ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
66118ae91c8SDavid Wu 
66218ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
66318ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
66418ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
66518ae91c8SDavid Wu }
66618ae91c8SDavid Wu 
667ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
668ff86648dSDavid Wu {
669ff86648dSDavid Wu 	struct rk1808_grf *grf;
670ff86648dSDavid Wu 	enum {
671ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
672ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
673ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
674ff86648dSDavid Wu 
675ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
676ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
677ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
678ff86648dSDavid Wu 
679ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
680ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
681ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
682ff86648dSDavid Wu 	};
683ff86648dSDavid Wu 	enum {
684ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
685ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
686ff86648dSDavid Wu 
687ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
688ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
689ff86648dSDavid Wu 	};
690ff86648dSDavid Wu 
691ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
692ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
693ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
694ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
695ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
696ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
697ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
698ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
699ff86648dSDavid Wu 
700ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
701ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
702ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
703c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) |
704c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT));
705ff86648dSDavid Wu }
706ff86648dSDavid Wu 
707af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
708af166ffaSDavid Wu {
709af166ffaSDavid Wu 	struct rk322x_grf *grf;
710af166ffaSDavid Wu 	enum {
711af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
712af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
713af166ffaSDavid Wu 
714af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
715af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
716af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
717af166ffaSDavid Wu 
718af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
719af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
720af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
721af166ffaSDavid Wu 
722af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
723af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
724af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
725af166ffaSDavid Wu 	};
726af166ffaSDavid Wu 	enum {
727af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
728af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
729af166ffaSDavid Wu 
730af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
731af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
732af166ffaSDavid Wu 	};
733af166ffaSDavid Wu 
734af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
735af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
736af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
737af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
738af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
739af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
740af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
741af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
742af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
743af166ffaSDavid Wu 
744af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
745af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
746af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
747af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
748af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
749af166ffaSDavid Wu }
750af166ffaSDavid Wu 
751491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
752491f3bfbSDavid Wu {
753491f3bfbSDavid Wu 	struct rk322x_grf *grf;
754491f3bfbSDavid Wu 	enum {
755491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
756491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
757491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
758491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
759491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
760491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
761491f3bfbSDavid Wu 	};
762491f3bfbSDavid Wu 
763491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
764491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
765491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
766491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
767491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
768491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
769491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
770491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
771491f3bfbSDavid Wu }
772491f3bfbSDavid Wu 
7731f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
7741f08aa1cSPhilipp Tomsich {
7751f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
7761f08aa1cSPhilipp Tomsich 
7771f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
7781f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
7791f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
7801f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
7811f08aa1cSPhilipp Tomsich 
7821f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
7831f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
7841f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
7851f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
7861f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
7871f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
7881f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
7891f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
7901f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
7911f08aa1cSPhilipp Tomsich }
7921f08aa1cSPhilipp Tomsich 
79323adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
79423adb58fSDavid Wu {
79523adb58fSDavid Wu 	struct rk3308_grf *grf;
79623adb58fSDavid Wu 	enum {
79723adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
79823adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
79923adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
80023adb58fSDavid Wu 	};
80123adb58fSDavid Wu 
80223adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
80323adb58fSDavid Wu 
80423adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
80523adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
80623adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
80723adb58fSDavid Wu }
80823adb58fSDavid Wu 
809c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
810c36b26c0SDavid Wu {
811c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
812c36b26c0SDavid Wu 	enum {
813c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
814c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
815c36b26c0SDavid Wu 
816c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
817c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
818c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
819c36b26c0SDavid Wu 
820c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
821c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
822c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
823c36b26c0SDavid Wu 
824c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
825c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
826c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
827c36b26c0SDavid Wu 	};
828c36b26c0SDavid Wu 	enum {
829c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
830c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
831c36b26c0SDavid Wu 
832c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
833c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
834c36b26c0SDavid Wu 	};
835c36b26c0SDavid Wu 
836c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
837c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
838c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
839c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
840c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
841c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
842c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
843c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
844c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
845c36b26c0SDavid Wu 
846c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
847c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
848c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
849c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
850c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
851c36b26c0SDavid Wu }
852c36b26c0SDavid Wu 
853491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
854491f3bfbSDavid Wu {
855491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
856491f3bfbSDavid Wu 	enum {
857491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
858491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
859491f3bfbSDavid Wu 
860491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
861491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
862491f3bfbSDavid Wu 	};
863491f3bfbSDavid Wu 
864491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
865491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
866491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
867491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
868491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
869491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
870491f3bfbSDavid Wu }
871491f3bfbSDavid Wu 
872793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
873793f2fd2SPhilipp Tomsich {
874793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
875793f2fd2SPhilipp Tomsich 	enum {
876793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
877793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
878793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
879793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
880793f2fd2SPhilipp Tomsich 	};
881793f2fd2SPhilipp Tomsich 	enum {
882793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
883793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
884793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
885793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
886793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
887793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
888793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
889793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
890793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
891793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
892793f2fd2SPhilipp Tomsich 	};
893793f2fd2SPhilipp Tomsich 
894793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
895793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
896793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
897793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
898793f2fd2SPhilipp Tomsich 
899793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
900793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
901793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
902793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
903793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
904793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
905793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
906c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) |
907c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT));
908793f2fd2SPhilipp Tomsich }
909793f2fd2SPhilipp Tomsich 
9101f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
9111f08aa1cSPhilipp Tomsich {
9121f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
9131f08aa1cSPhilipp Tomsich 
9141f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9151f08aa1cSPhilipp Tomsich 
9161f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
9171f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
9181f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
9191f08aa1cSPhilipp Tomsich 
9201f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
9211f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
9221f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
9231f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
9241f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
9251f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
9261f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
927c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) |
928c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT));
9291f08aa1cSPhilipp Tomsich }
9301f08aa1cSPhilipp Tomsich 
9310a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
9320a33ce65SDavid Wu {
9330a33ce65SDavid Wu 	struct rv1108_grf *grf;
9340a33ce65SDavid Wu 
9350a33ce65SDavid Wu 	enum {
9360a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
9370a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
9380a33ce65SDavid Wu 	};
9390a33ce65SDavid Wu 
9400a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9410a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
9420a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
9430a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
9440a33ce65SDavid Wu }
945491f3bfbSDavid Wu 
946491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
947491f3bfbSDavid Wu {
948491f3bfbSDavid Wu 	struct rk322x_grf *grf;
949491f3bfbSDavid Wu 	enum {
950491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
951491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
952491f3bfbSDavid Wu 	};
953491f3bfbSDavid Wu 	enum {
954491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
955491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
956491f3bfbSDavid Wu 
957491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
958491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
959491f3bfbSDavid Wu 
960491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
961491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
962491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
963491f3bfbSDavid Wu 	};
964491f3bfbSDavid Wu 	enum {
965491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
966491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
967491f3bfbSDavid Wu 	};
968491f3bfbSDavid Wu 	enum {
969491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
970491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
971491f3bfbSDavid Wu 	};
972491f3bfbSDavid Wu 
973491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
974491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
975491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
976491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
977491f3bfbSDavid Wu 
978491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
979491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
980491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
981491f3bfbSDavid Wu 
982491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
983491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
984491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
985491f3bfbSDavid Wu 
986491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
987491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
988491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
989491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
990491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
991491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
992491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
993491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
994491f3bfbSDavid Wu 
995491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
996491f3bfbSDavid Wu 	udelay(10);
997491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
998491f3bfbSDavid Wu 	udelay(10);
999491f3bfbSDavid Wu 
1000491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1001491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1002491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
1003491f3bfbSDavid Wu 	udelay(30 * 1000);
1004491f3bfbSDavid Wu }
1005491f3bfbSDavid Wu 
1006491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1007491f3bfbSDavid Wu {
1008491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1009491f3bfbSDavid Wu 	enum {
1010491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1011491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
1012491f3bfbSDavid Wu 	};
1013491f3bfbSDavid Wu 	enum {
1014491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1015491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1016491f3bfbSDavid Wu 
1017491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1018491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
1019491f3bfbSDavid Wu 
1020491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
1021491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
1022491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
1023491f3bfbSDavid Wu 	};
1024491f3bfbSDavid Wu 	enum {
1025491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1026491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1027491f3bfbSDavid Wu 	};
1028491f3bfbSDavid Wu 	enum {
1029491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1030491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1031491f3bfbSDavid Wu 	};
1032491f3bfbSDavid Wu 
1033491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1034491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
1035491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
1036491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
1037491f3bfbSDavid Wu 
1038491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1039491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1040491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
1041491f3bfbSDavid Wu 
1042491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1043491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1044491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
1045491f3bfbSDavid Wu 
1046491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1047491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1048491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
1049491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1050491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1051491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1052491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1053491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1054491f3bfbSDavid Wu 
1055491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1056491f3bfbSDavid Wu 	udelay(10);
1057491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1058491f3bfbSDavid Wu 	udelay(10);
1059491f3bfbSDavid Wu 
1060491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1061491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1062491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1063491f3bfbSDavid Wu 	udelay(30 * 1000);
1064491f3bfbSDavid Wu }
1065491f3bfbSDavid Wu 
1066dcfb333aSDavid Wu #else
106733a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
106833a014bdSDavid Wu {
106933a014bdSDavid Wu 	struct rk3568_grf *grf;
107033a014bdSDavid Wu 	void *con1;
107133a014bdSDavid Wu 
107233a014bdSDavid Wu 	enum {
107333a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
107433a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
107533a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
107633a014bdSDavid Wu 	};
107733a014bdSDavid Wu 
107833a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
107933a014bdSDavid Wu 
108033a014bdSDavid Wu 	if (pdata->bus_id == 1)
108133a014bdSDavid Wu 		con1 = &grf->mac1_con1;
108233a014bdSDavid Wu 	else
108333a014bdSDavid Wu 		con1 = &grf->mac0_con1;
108433a014bdSDavid Wu 
108533a014bdSDavid Wu 	rk_clrsetreg(con1,
108633a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
108733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
108833a014bdSDavid Wu }
108933a014bdSDavid Wu 
109033a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
109133a014bdSDavid Wu {
109233a014bdSDavid Wu 	struct rk3568_grf *grf;
109333a014bdSDavid Wu 	void *con0, *con1;
109433a014bdSDavid Wu 
109533a014bdSDavid Wu 	enum {
109633a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
109733a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
109833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
109933a014bdSDavid Wu 
110033a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
110133a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
110233a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
110333a014bdSDavid Wu 
110433a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
110533a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
110633a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
110733a014bdSDavid Wu 	};
110833a014bdSDavid Wu 
110933a014bdSDavid Wu 	enum {
111033a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
111133a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
111233a014bdSDavid Wu 
111333a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
111433a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
111533a014bdSDavid Wu 	};
111633a014bdSDavid Wu 
111733a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
111833a014bdSDavid Wu 
111933a014bdSDavid Wu 	if (pdata->bus_id == 1) {
112033a014bdSDavid Wu 		con0 = &grf->mac1_con0;
112133a014bdSDavid Wu 		con1 = &grf->mac1_con1;
112233a014bdSDavid Wu 	} else {
112333a014bdSDavid Wu 		con0 = &grf->mac0_con0;
112433a014bdSDavid Wu 		con1 = &grf->mac0_con1;
112533a014bdSDavid Wu 	}
112633a014bdSDavid Wu 
112733a014bdSDavid Wu 	rk_clrsetreg(con0,
112833a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
112933a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
1130c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) |
1131c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT));
113233a014bdSDavid Wu 
113333a014bdSDavid Wu 	rk_clrsetreg(con1,
113433a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
113533a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
113633a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
113733a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
113833a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
113933a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
114033a014bdSDavid Wu }
114133a014bdSDavid Wu 
1142bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1143bf0e94d0SDavid Wu {
1144bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1145bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1146bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1147bf0e94d0SDavid Wu 
1148bf0e94d0SDavid Wu 	enum {
1149bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1150bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1151bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1152bf0e94d0SDavid Wu 	};
1153bf0e94d0SDavid Wu 
1154bf0e94d0SDavid Wu 	enum {
1155bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1156bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1157bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1158bf0e94d0SDavid Wu 	};
1159bf0e94d0SDavid Wu 
1160bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1161bf0e94d0SDavid Wu 
1162bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1163bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1164bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1165bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1166bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1167bf0e94d0SDavid Wu 	} else {
1168bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1169bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1170bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1171bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1172bf0e94d0SDavid Wu 	}
1173bf0e94d0SDavid Wu 
1174bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1175bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1176bf0e94d0SDavid Wu }
1177bf0e94d0SDavid Wu 
1178bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1179bf0e94d0SDavid Wu {
1180bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1181bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1182bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1183bf0e94d0SDavid Wu 	unsigned int rx_delay;
1184bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1185bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1186bf0e94d0SDavid Wu 	void *offset_con;
1187bf0e94d0SDavid Wu 
1188bf0e94d0SDavid Wu 	enum {
1189bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1190bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1191bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1192bf0e94d0SDavid Wu 
1193bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1194bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1195bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1196bf0e94d0SDavid Wu 
1197bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1198bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1199bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1200bf0e94d0SDavid Wu 	};
1201bf0e94d0SDavid Wu 
1202bf0e94d0SDavid Wu 	enum {
1203bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1204bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1205bf0e94d0SDavid Wu 
1206bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1207bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1208bf0e94d0SDavid Wu 	};
1209bf0e94d0SDavid Wu 
1210bf0e94d0SDavid Wu 	enum {
1211bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1212bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1213bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1214bf0e94d0SDavid Wu 	};
1215bf0e94d0SDavid Wu 
1216bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1217bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1218bf0e94d0SDavid Wu 
1219bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1220bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1221bf0e94d0SDavid Wu 		rx_delay = 0;
1222bf0e94d0SDavid Wu 	} else {
1223bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1224bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1225bf0e94d0SDavid Wu 	}
1226bf0e94d0SDavid Wu 
1227bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1228bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1229bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1230bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1231bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1232bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1233bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1234bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1235bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1236bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1237bf0e94d0SDavid Wu 	} else {
1238bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1239bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1240bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1241bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1242bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1243bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1244bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1245bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1246bf0e94d0SDavid Wu 	}
1247bf0e94d0SDavid Wu 
1248bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1249bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1250bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1251c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) |
1252bf0e94d0SDavid Wu 		     rx_delay);
1253bf0e94d0SDavid Wu 
1254bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1255bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1256bf0e94d0SDavid Wu 
1257bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1258bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1259bf0e94d0SDavid Wu }
1260bf0e94d0SDavid Wu 
126120bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
126220bef841SDavid Wu {
126320bef841SDavid Wu 	struct rv1106_grf *grf;
1264535678cdSDavid Wu 	unsigned char bgs[1] = {0};
1265535678cdSDavid Wu 
1266535678cdSDavid Wu 	enum {
1267535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1268535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1269535678cdSDavid Wu 	};
127054f7ad44SDavid Wu 
127154f7ad44SDavid Wu 	enum {
127220bef841SDavid Wu 		RV1106_MACPHY_ENABLE_MASK = BIT(1),
127354f7ad44SDavid Wu 		RV1106_MACPHY_DISENABLE = BIT(1),
127454f7ad44SDavid Wu 		RV1106_MACPHY_ENABLE = 0,
127520bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
127620bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL = BIT(6),
127720bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
127820bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
127920bef841SDavid Wu 		RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
128020bef841SDavid Wu 		RV1106_MACPHY_PHY_ID = BIT(11),
128120bef841SDavid Wu 	};
128220bef841SDavid Wu 
128320bef841SDavid Wu 	enum {
128420bef841SDavid Wu 		RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
128554f7ad44SDavid Wu 		RV1106_MACPHY_BGS = BIT(2),
128620bef841SDavid Wu 	};
128720bef841SDavid Wu 
1288535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1289535678cdSDavid Wu 	struct udevice *dev;
1290535678cdSDavid Wu 	u32 regs[2] = {0};
1291535678cdSDavid Wu 	ofnode node;
1292535678cdSDavid Wu 	int ret = 0;
1293535678cdSDavid Wu 
1294535678cdSDavid Wu 	/* retrieve the device */
1295535678cdSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1296535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1297535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1298535678cdSDavid Wu 						  &dev);
1299535678cdSDavid Wu 	else
1300535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1301535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1302535678cdSDavid Wu 						  &dev);
1303535678cdSDavid Wu 	if (!ret) {
1304535678cdSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1305535678cdSDavid Wu 		if (ofnode_valid(node)) {
1306535678cdSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1307535678cdSDavid Wu 				/* read the bgs from the efuses */
1308535678cdSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1309535678cdSDavid Wu 				if (ret) {
1310535678cdSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1311535678cdSDavid Wu 					       ret);
1312535678cdSDavid Wu 					bgs[0] = 0;
1313535678cdSDavid Wu 				}
1314535678cdSDavid Wu 			}
1315535678cdSDavid Wu 		}
1316535678cdSDavid Wu 	}
1317535678cdSDavid Wu #endif
1318535678cdSDavid Wu 
131920bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
132020bef841SDavid Wu 
132120bef841SDavid Wu 	reset_assert(&pdata->phy_reset);
132220bef841SDavid Wu 	udelay(20);
132320bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
132420bef841SDavid Wu 		     RV1106_MACPHY_ENABLE_MASK |
132520bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL_MASK |
132620bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_MASK |
132720bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID_MASK,
132820bef841SDavid Wu 		     RV1106_MACPHY_ENABLE |
132920bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL |
133020bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_24M |
133120bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID);
133220bef841SDavid Wu 
133320bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
133420bef841SDavid Wu 		     RV1106_MACPHY_BGS_MASK,
1335535678cdSDavid Wu 		     bgs[0]);
13368bafa3a1SDavid Wu 	udelay(20);
133720bef841SDavid Wu 	reset_deassert(&pdata->phy_reset);
133820bef841SDavid Wu 	udelay(30 * 1000);
133920bef841SDavid Wu }
134020bef841SDavid Wu 
13418bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
13428bafa3a1SDavid Wu {
13438bafa3a1SDavid Wu 	struct rv1106_grf *grf;
13448bafa3a1SDavid Wu 	enum {
13458bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
13468bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
13478bafa3a1SDavid Wu 	};
13488bafa3a1SDavid Wu 
13498bafa3a1SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
13508bafa3a1SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
13518bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
13528bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE);
13538bafa3a1SDavid Wu };
13548bafa3a1SDavid Wu 
1355e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1356e4e3f431SDavid Wu {
1357e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1358e4e3f431SDavid Wu 
1359e4e3f431SDavid Wu 	enum {
1360e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1361e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1362e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1363e4e3f431SDavid Wu 	};
1364e4e3f431SDavid Wu 
1365e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1366e4e3f431SDavid Wu 
1367e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1368e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1369e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1370e4e3f431SDavid Wu }
1371e4e3f431SDavid Wu 
1372dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1373dcfb333aSDavid Wu {
1374dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1375dcfb333aSDavid Wu 
1376dcfb333aSDavid Wu 	enum {
1377dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1378dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1379dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1380dcfb333aSDavid Wu 
1381dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1382dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1383dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1384dcfb333aSDavid Wu 
1385dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1386dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1387dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1388dcfb333aSDavid Wu 
1389dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1390dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1391dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1392dcfb333aSDavid Wu 
1393dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1394dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1395dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1396dcfb333aSDavid Wu 	};
1397dcfb333aSDavid Wu 	enum {
1398dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1399dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1400dcfb333aSDavid Wu 
1401dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1402dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1403dcfb333aSDavid Wu 	};
1404dcfb333aSDavid Wu 	enum {
1405dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1406dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1407dcfb333aSDavid Wu 
1408dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1409dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1410dcfb333aSDavid Wu 	};
1411dcfb333aSDavid Wu 
1412dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1413dcfb333aSDavid Wu 
1414dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1415dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1416dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1417dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1418dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1419dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1420dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1421dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1422dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1423dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1424dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1425dcfb333aSDavid Wu 
1426dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1427dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1428dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1429c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) |
1430c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT));
1431dcfb333aSDavid Wu 
1432dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1433dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1434dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1435c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) |
1436c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT));
1437dcfb333aSDavid Wu }
14386f0a52e9SDavid Wu #endif
14390a33ce65SDavid Wu 
1440bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1441bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1442bf0e94d0SDavid Wu {
1443bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1444bf0e94d0SDavid Wu 	unsigned int val, mask;
1445bf0e94d0SDavid Wu 
1446bf0e94d0SDavid Wu 	enum {
1447bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
1448bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
1449bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
1450bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
1451bf0e94d0SDavid Wu 	};
1452bf0e94d0SDavid Wu 
1453bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1454bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
1455bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
1456bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
1457bf0e94d0SDavid Wu 
1458bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1459bf0e94d0SDavid Wu 		val <<= 5;
1460bf0e94d0SDavid Wu 		mask <<= 5;
1461bf0e94d0SDavid Wu 	}
1462bf0e94d0SDavid Wu 
1463bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
1464bf0e94d0SDavid Wu }
1465bf0e94d0SDavid Wu #endif
1466bf0e94d0SDavid Wu 
14670125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
14680125bcf0SSjoerd Simons {
14690125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
14701f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
14711f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
14726f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14736f0a52e9SDavid Wu 	struct eqos_config *config;
14746f0a52e9SDavid Wu #else
14756f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
14766f0a52e9SDavid Wu #endif
14776f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
14780125bcf0SSjoerd Simons 	struct clk clk;
14790a33ce65SDavid Wu 	ulong rate;
14800125bcf0SSjoerd Simons 	int ret;
14810125bcf0SSjoerd Simons 
14826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14836f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
14846f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
1485befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
14866f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
14876f0a52e9SDavid Wu #else
14886f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
14896f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
14906f0a52e9SDavid Wu #endif
149133a014bdSDavid Wu 	pdata->bus_id = dev->seq;
149254f7ad44SDavid Wu 
1493cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1494cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
1495cadc8d74SKever Yang 	if (ret)
1496cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
1497cadc8d74SKever Yang 
14980125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
14990125bcf0SSjoerd Simons 	if (ret)
15000125bcf0SSjoerd Simons 		return ret;
15010125bcf0SSjoerd Simons 
1502491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
1503491f3bfbSDavid Wu 
1504bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
1505bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
1506bf0e94d0SDavid Wu 
1507491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
1508491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
1509491f3bfbSDavid Wu 
15100a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
15110a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
1512bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
15130a33ce65SDavid Wu 		/*
15140a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
15150a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
15160a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
15170a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
15180a33ce65SDavid Wu 		 */
15190a33ce65SDavid Wu 		if (!pdata->clock_input) {
15200a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 125000000);
15210a33ce65SDavid Wu 			if (rate != 125000000)
15220a33ce65SDavid Wu 				return -EINVAL;
15230a33ce65SDavid Wu 		}
15240125bcf0SSjoerd Simons 
1525bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
1526bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
1527bf0e94d0SDavid Wu 
15280125bcf0SSjoerd Simons 		/* Set to RGMII mode */
15290a33ce65SDavid Wu 		if (ops->set_to_rgmii)
15301f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
15310a33ce65SDavid Wu 		else
15320a33ce65SDavid Wu 			return -EPERM;
15330a33ce65SDavid Wu 
15340a33ce65SDavid Wu 		break;
15350a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
15360a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
15370a33ce65SDavid Wu 		if (!pdata->clock_input) {
15380a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 50000000);
15390a33ce65SDavid Wu 			if (rate != 50000000)
15400a33ce65SDavid Wu 				return -EINVAL;
15410a33ce65SDavid Wu 		}
15420a33ce65SDavid Wu 
15430a33ce65SDavid Wu 		/* Set to RMII mode */
15440a33ce65SDavid Wu 		if (ops->set_to_rmii)
15450a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
15460a33ce65SDavid Wu 
15470a33ce65SDavid Wu 		break;
15480a33ce65SDavid Wu 	default:
15490a33ce65SDavid Wu 		debug("NO interface defined!\n");
15500a33ce65SDavid Wu 		return -ENXIO;
15510a33ce65SDavid Wu 	}
15520125bcf0SSjoerd Simons 
15536f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15546f0a52e9SDavid Wu 	return eqos_probe(dev);
15556f0a52e9SDavid Wu #else
15560125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
15576f0a52e9SDavid Wu #endif
15586f0a52e9SDavid Wu }
15596f0a52e9SDavid Wu 
15606f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
15616f0a52e9SDavid Wu {
15626f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
15636f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
15646f0a52e9SDavid Wu #else
15656f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
15666f0a52e9SDavid Wu #endif
15676f0a52e9SDavid Wu }
15686f0a52e9SDavid Wu 
15696f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
15706f0a52e9SDavid Wu 				      int length)
15716f0a52e9SDavid Wu {
15726f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15736f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
15746f0a52e9SDavid Wu #else
15756f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
15766f0a52e9SDavid Wu #endif
15776f0a52e9SDavid Wu }
15786f0a52e9SDavid Wu 
15796f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
15806f0a52e9SDavid Wu 				  int length)
15816f0a52e9SDavid Wu {
15826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15836f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
15846f0a52e9SDavid Wu #else
15856f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
15866f0a52e9SDavid Wu #endif
15876f0a52e9SDavid Wu }
15886f0a52e9SDavid Wu 
15896f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
15906f0a52e9SDavid Wu 				  uchar **packetp)
15916f0a52e9SDavid Wu {
15926f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15936f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
15946f0a52e9SDavid Wu #else
15956f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
15966f0a52e9SDavid Wu #endif
15970125bcf0SSjoerd Simons }
15980125bcf0SSjoerd Simons 
15990125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
16000125bcf0SSjoerd Simons {
16016f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
16021f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
16031f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
16046f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1605491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
16066f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
16076f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
16086f0a52e9SDavid Wu #endif
16090125bcf0SSjoerd Simons 	int ret;
16100125bcf0SSjoerd Simons 
16116f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
16126f0a52e9SDavid Wu 	ret = eqos_init(dev);
16136f0a52e9SDavid Wu #else
16146f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
16156f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
16166f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
16176f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
16186f0a52e9SDavid Wu #endif
16190125bcf0SSjoerd Simons 	if (ret)
16200125bcf0SSjoerd Simons 		return ret;
1621491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
16220125bcf0SSjoerd Simons 	if (ret)
16230125bcf0SSjoerd Simons 		return ret;
16246f0a52e9SDavid Wu 
16256f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
16266f0a52e9SDavid Wu 	eqos_enable(dev);
16276f0a52e9SDavid Wu #else
16286f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
16290125bcf0SSjoerd Simons 	if (ret)
16300125bcf0SSjoerd Simons 		return ret;
16316f0a52e9SDavid Wu #endif
16320125bcf0SSjoerd Simons 
16330125bcf0SSjoerd Simons 	return 0;
16340125bcf0SSjoerd Simons }
16350125bcf0SSjoerd Simons 
16366f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
16376f0a52e9SDavid Wu {
16386f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
16396f0a52e9SDavid Wu 	eqos_stop(dev);
16406f0a52e9SDavid Wu #else
16416f0a52e9SDavid Wu 	designware_eth_stop(dev);
16426f0a52e9SDavid Wu #endif
16436f0a52e9SDavid Wu }
16446f0a52e9SDavid Wu 
16450125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
16460125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
16476f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
16486f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
16496f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
16506f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
16516f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
16520125bcf0SSjoerd Simons };
16530125bcf0SSjoerd Simons 
16546f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
165518ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
165618ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
165718ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
165818ae91c8SDavid Wu };
165918ae91c8SDavid Wu 
1660ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
1661ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
1662ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
1663ff86648dSDavid Wu };
1664ff86648dSDavid Wu 
1665af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
1666af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
1667491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
1668af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
1669491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
1670af166ffaSDavid Wu };
1671af166ffaSDavid Wu 
16721f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
16731f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
16741f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
16751f08aa1cSPhilipp Tomsich };
16761f08aa1cSPhilipp Tomsich 
167723adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
167823adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
167923adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
168023adb58fSDavid Wu };
168123adb58fSDavid Wu 
1682c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
1683c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
1684491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
1685c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
1686491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
1687c36b26c0SDavid Wu };
1688c36b26c0SDavid Wu 
1689793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
1690793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
1691793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
1692793f2fd2SPhilipp Tomsich };
1693793f2fd2SPhilipp Tomsich 
16941f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
16951f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
16961f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
16971f08aa1cSPhilipp Tomsich };
16981f08aa1cSPhilipp Tomsich 
16990a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
17000a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
17010a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
17020a33ce65SDavid Wu };
1703dcfb333aSDavid Wu #else
170433a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
170533a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
170633a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
170733a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
170833a014bdSDavid Wu };
170933a014bdSDavid Wu 
1710bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
1711bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
1712bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
1713bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
1714bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
1715bf0e94d0SDavid Wu };
1716bf0e94d0SDavid Wu 
171720bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = {
171820bef841SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
17198bafa3a1SDavid Wu 	.set_to_rmii = rv1106_set_to_rmii,
172020bef841SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
172120bef841SDavid Wu };
172220bef841SDavid Wu 
1723dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
1724dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
1725dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
1726e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
1727dcfb333aSDavid Wu };
17286f0a52e9SDavid Wu #endif
17290a33ce65SDavid Wu 
17300125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
17316f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
173284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
173318ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
173418ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
173584e90485SDavid Wu #endif
173684e90485SDavid Wu 
173784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
1738ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
1739ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
174084e90485SDavid Wu #endif
174184e90485SDavid Wu 
174284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
1743af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
1744af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
174584e90485SDavid Wu #endif
174684e90485SDavid Wu 
174784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
17481f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
17491f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
175084e90485SDavid Wu #endif
175184e90485SDavid Wu 
175284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
175323adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
175423adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
175584e90485SDavid Wu #endif
175684e90485SDavid Wu 
175784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
1758c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
1759c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
176084e90485SDavid Wu #endif
176184e90485SDavid Wu 
176284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
1763793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
1764793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
176584e90485SDavid Wu #endif
176684e90485SDavid Wu 
176784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
17681f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
17691f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
177084e90485SDavid Wu #endif
177184e90485SDavid Wu 
177284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
17730a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
17740a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
177584e90485SDavid Wu #endif
1776dcfb333aSDavid Wu #else
177784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
177833a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
177933a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
178084e90485SDavid Wu #endif
178184e90485SDavid Wu 
1782bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
1783bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
1784bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
1785bf0e94d0SDavid Wu #endif
1786bf0e94d0SDavid Wu 
178720bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106
178820bef841SDavid Wu 	{ .compatible = "rockchip,rv1106-gmac",
178920bef841SDavid Wu 	  .data = (ulong)&rv1106_gmac_ops },
179020bef841SDavid Wu #endif
179120bef841SDavid Wu 
179284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
1793dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
1794dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
17956f0a52e9SDavid Wu #endif
179684e90485SDavid Wu #endif
17970125bcf0SSjoerd Simons 	{ }
17980125bcf0SSjoerd Simons };
17990125bcf0SSjoerd Simons 
18000125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
18010125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
18020125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
18030125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
18040125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
18050125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
18060125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
18076f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
18080125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
18090125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
18100125bcf0SSjoerd Simons };
1811