xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision bcf26c57c7870fb39f2fdede0690bae805b40458)
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
21*bcf26c57SDavid Wu #include <asm/arch/grf_rk3506.h>
22c563400aSDavid Wu #include <asm/arch/grf_rk3528.h>
2383f30531SDavid Wu #include <asm/arch/grf_rk3562.h>
2483f30531SDavid Wu #include <asm/arch/ioc_rk3562.h>
2533a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
26bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
27745dad46SDavid Wu #include <asm/arch/grf_rv1103b.h>
2820bef841SDavid Wu #include <asm/arch/grf_rv1106.h>
29dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
306f0a52e9SDavid Wu #include "dwc_eth_qos.h"
316f0a52e9SDavid Wu #else
3218ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
33ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
34af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
350125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
3623adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
37c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
38793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
391f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
400a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
410125bcf0SSjoerd Simons #include "designware.h"
426f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
436f0a52e9SDavid Wu #endif
446f0a52e9SDavid Wu #include <dm/pinctrl.h>
45491f3bfbSDavid Wu #include <dm/of_access.h>
460125bcf0SSjoerd Simons 
470125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
480125bcf0SSjoerd Simons 
496f0a52e9SDavid Wu struct rockchip_eth_dev {
506f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
516f0a52e9SDavid Wu 	struct eqos_priv eqos;
526f0a52e9SDavid Wu #else
536f0a52e9SDavid Wu 	struct dw_eth_dev dw;
546f0a52e9SDavid Wu #endif
55491f3bfbSDavid Wu 	int phy_interface;
566f0a52e9SDavid Wu };
576f0a52e9SDavid Wu 
580125bcf0SSjoerd Simons /*
590125bcf0SSjoerd Simons  * Platform data for the gmac
600125bcf0SSjoerd Simons  *
610125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
620125bcf0SSjoerd Simons  */
630125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
646f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
650125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
666f0a52e9SDavid Wu #else
676f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
686f0a52e9SDavid Wu #endif
69491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
70491f3bfbSDavid Wu 	bool integrated_phy;
710a33ce65SDavid Wu 	bool clock_input;
72491f3bfbSDavid Wu 	int phy_interface;
730125bcf0SSjoerd Simons 	int tx_delay;
740125bcf0SSjoerd Simons 	int rx_delay;
7533a014bdSDavid Wu 	int bus_id;
760125bcf0SSjoerd Simons };
770125bcf0SSjoerd Simons 
781f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
796f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
806f0a52e9SDavid Wu 	const struct eqos_config config;
816f0a52e9SDavid Wu #endif
82491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
83491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
840a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
851f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
86bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
87491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
881f08aa1cSPhilipp Tomsich };
891f08aa1cSPhilipp Tomsich 
90befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
91befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
92befcb627SDavid Wu 	.reg_access_always_ok = false,
93befcb627SDavid Wu 	.mdio_wait = 10000,
94befcb627SDavid Wu 	.swr_wait = 200,
95befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
96befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
97befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
98befcb627SDavid Wu };
99befcb627SDavid Wu #endif
100befcb627SDavid Wu 
1011eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
1021eb9d064SDavid Wu {
1031eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1041eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
1051eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
1061eb9d064SDavid Wu 
1071eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1081eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1091eb9d064SDavid Wu 
1101eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1111eb9d064SDavid Wu }
1121f08aa1cSPhilipp Tomsich 
1130125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1140125bcf0SSjoerd Simons {
1150125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
116491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
11754f7ad44SDavid Wu 	struct udevice *phydev;
1180a33ce65SDavid Wu 	const char *string;
119491f3bfbSDavid Wu 	int ret;
1200a33ce65SDavid Wu 
1210a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1220a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1230a33ce65SDavid Wu 		pdata->clock_input = true;
1240a33ce65SDavid Wu 	else
1250a33ce65SDavid Wu 		pdata->clock_input = false;
1260125bcf0SSjoerd Simons 
127491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
128491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
129491f3bfbSDavid Wu 	if (ret) {
130491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
131491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
132491f3bfbSDavid Wu 	} else {
133491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
134491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
135491f3bfbSDavid Wu 							 "phy-is-integrated");
136491f3bfbSDavid Wu 	}
137491f3bfbSDavid Wu 
138491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
139491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
140491f3bfbSDavid Wu 		if (ret) {
14154f7ad44SDavid Wu 			ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
14254f7ad44SDavid Wu 			if (ret) {
14354f7ad44SDavid Wu 				debug("Get phydev by ofnode failed: err=%d\n", ret);
14454f7ad44SDavid Wu 				return ret;
14554f7ad44SDavid Wu 			}
14654f7ad44SDavid Wu 
14754f7ad44SDavid Wu 			ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
14854f7ad44SDavid Wu 			if (ret) {
149491f3bfbSDavid Wu 				debug("No PHY reset control found: ret=%d\n", ret);
150491f3bfbSDavid Wu 				return ret;
151491f3bfbSDavid Wu 			}
152491f3bfbSDavid Wu 		}
15354f7ad44SDavid Wu 	}
154491f3bfbSDavid Wu 
1551f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1567ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1577ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1581f08aa1cSPhilipp Tomsich 
1591f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1601f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1617ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1621f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1637ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1640125bcf0SSjoerd Simons 
1656f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1666f0a52e9SDavid Wu 	return 0;
1676f0a52e9SDavid Wu #else
1680125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1696f0a52e9SDavid Wu #endif
1700125bcf0SSjoerd Simons }
1710125bcf0SSjoerd Simons 
1726f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
173491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
174491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
17518ae91c8SDavid Wu {
1766f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
17718ae91c8SDavid Wu 	struct px30_grf *grf;
17818ae91c8SDavid Wu 	struct clk clk_speed;
17918ae91c8SDavid Wu 	int speed, ret;
18018ae91c8SDavid Wu 	enum {
18118ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
18218ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
18318ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
18418ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
18518ae91c8SDavid Wu 	};
18618ae91c8SDavid Wu 
18718ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
18818ae91c8SDavid Wu 			      &clk_speed);
18918ae91c8SDavid Wu 	if (ret)
19018ae91c8SDavid Wu 		return ret;
19118ae91c8SDavid Wu 
19218ae91c8SDavid Wu 	switch (priv->phydev->speed) {
19318ae91c8SDavid Wu 	case 10:
19418ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
19518ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
19618ae91c8SDavid Wu 		if (ret)
19718ae91c8SDavid Wu 			return ret;
19818ae91c8SDavid Wu 		break;
19918ae91c8SDavid Wu 	case 100:
20018ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
20118ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
20218ae91c8SDavid Wu 		if (ret)
20318ae91c8SDavid Wu 			return ret;
20418ae91c8SDavid Wu 		break;
20518ae91c8SDavid Wu 	default:
20618ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
20718ae91c8SDavid Wu 		return -EINVAL;
20818ae91c8SDavid Wu 	}
20918ae91c8SDavid Wu 
21018ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
21118ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
21218ae91c8SDavid Wu 
21318ae91c8SDavid Wu 	return 0;
21418ae91c8SDavid Wu }
21518ae91c8SDavid Wu 
216491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
217491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
218ff86648dSDavid Wu {
2196f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
220ff86648dSDavid Wu 	struct clk clk_speed;
221ff86648dSDavid Wu 	int ret;
222ff86648dSDavid Wu 
223ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
224ff86648dSDavid Wu 			      &clk_speed);
225ff86648dSDavid Wu 	if (ret)
226ff86648dSDavid Wu 		return ret;
227ff86648dSDavid Wu 
228ff86648dSDavid Wu 	switch (priv->phydev->speed) {
229ff86648dSDavid Wu 	case 10:
230ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
231ff86648dSDavid Wu 		if (ret)
232ff86648dSDavid Wu 			return ret;
233ff86648dSDavid Wu 		break;
234ff86648dSDavid Wu 	case 100:
235ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
236ff86648dSDavid Wu 		if (ret)
237ff86648dSDavid Wu 			return ret;
238ff86648dSDavid Wu 		break;
239ff86648dSDavid Wu 	case 1000:
240ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
241ff86648dSDavid Wu 		if (ret)
242ff86648dSDavid Wu 			return ret;
243ff86648dSDavid Wu 		break;
244ff86648dSDavid Wu 	default:
245ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
246ff86648dSDavid Wu 		return -EINVAL;
247ff86648dSDavid Wu 	}
248ff86648dSDavid Wu 
249ff86648dSDavid Wu 	return 0;
250ff86648dSDavid Wu }
251ff86648dSDavid Wu 
252491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
253491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
254af166ffaSDavid Wu {
2556f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
256af166ffaSDavid Wu 	struct rk322x_grf *grf;
257af166ffaSDavid Wu 	int clk;
258af166ffaSDavid Wu 	enum {
259af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
260af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
261af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
262af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
263af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
264491f3bfbSDavid Wu 
265491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
266491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
267491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
268491f3bfbSDavid Wu 
269491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
270491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
271491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
272af166ffaSDavid Wu 	};
273af166ffaSDavid Wu 
274af166ffaSDavid Wu 	switch (priv->phydev->speed) {
275af166ffaSDavid Wu 	case 10:
276491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
277491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
278491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
279af166ffaSDavid Wu 		break;
280af166ffaSDavid Wu 	case 100:
281491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
282491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
283491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
284af166ffaSDavid Wu 		break;
285af166ffaSDavid Wu 	case 1000:
286af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
287af166ffaSDavid Wu 		break;
288af166ffaSDavid Wu 	default:
289af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
290af166ffaSDavid Wu 		return -EINVAL;
291af166ffaSDavid Wu 	}
292af166ffaSDavid Wu 
293af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
294491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
295491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
296491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
297491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
298491f3bfbSDavid Wu 		     clk);
299af166ffaSDavid Wu 
300af166ffaSDavid Wu 	return 0;
301af166ffaSDavid Wu }
302af166ffaSDavid Wu 
303491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
304491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
3050125bcf0SSjoerd Simons {
3066f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3070125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
3080125bcf0SSjoerd Simons 	int clk;
3090125bcf0SSjoerd Simons 
3100125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
3110125bcf0SSjoerd Simons 	case 10:
3121f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
3130125bcf0SSjoerd Simons 		break;
3140125bcf0SSjoerd Simons 	case 100:
3151f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
3160125bcf0SSjoerd Simons 		break;
3170125bcf0SSjoerd Simons 	case 1000:
3181f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3190125bcf0SSjoerd Simons 		break;
3200125bcf0SSjoerd Simons 	default:
3210125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3220125bcf0SSjoerd Simons 		return -EINVAL;
3230125bcf0SSjoerd Simons 	}
3240125bcf0SSjoerd Simons 
3250125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3261f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3270125bcf0SSjoerd Simons 
3280125bcf0SSjoerd Simons 	return 0;
3290125bcf0SSjoerd Simons }
3300125bcf0SSjoerd Simons 
331491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
332491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
33323adb58fSDavid Wu {
3346f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
33523adb58fSDavid Wu 	struct rk3308_grf *grf;
33623adb58fSDavid Wu 	struct clk clk_speed;
33723adb58fSDavid Wu 	int speed, ret;
33823adb58fSDavid Wu 	enum {
33923adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
34023adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
34123adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
34223adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
34323adb58fSDavid Wu 	};
34423adb58fSDavid Wu 
34523adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
34623adb58fSDavid Wu 			      &clk_speed);
34723adb58fSDavid Wu 	if (ret)
34823adb58fSDavid Wu 		return ret;
34923adb58fSDavid Wu 
35023adb58fSDavid Wu 	switch (priv->phydev->speed) {
35123adb58fSDavid Wu 	case 10:
35223adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
35323adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
35423adb58fSDavid Wu 		if (ret)
35523adb58fSDavid Wu 			return ret;
35623adb58fSDavid Wu 		break;
35723adb58fSDavid Wu 	case 100:
35823adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
35923adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
36023adb58fSDavid Wu 		if (ret)
36123adb58fSDavid Wu 			return ret;
36223adb58fSDavid Wu 		break;
36323adb58fSDavid Wu 	default:
36423adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
36523adb58fSDavid Wu 		return -EINVAL;
36623adb58fSDavid Wu 	}
36723adb58fSDavid Wu 
36823adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
36923adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
37023adb58fSDavid Wu 
37123adb58fSDavid Wu 	return 0;
37223adb58fSDavid Wu }
37323adb58fSDavid Wu 
374491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
375491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
376c36b26c0SDavid Wu {
3776f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
378c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
379c36b26c0SDavid Wu 	int clk;
380c36b26c0SDavid Wu 	enum {
381c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
382c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
383c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
384c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
385c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
386491f3bfbSDavid Wu 
387491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
388491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
389491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
390491f3bfbSDavid Wu 
391491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
392491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
393491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
394c36b26c0SDavid Wu 	};
395c36b26c0SDavid Wu 
396c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
397c36b26c0SDavid Wu 	case 10:
398491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
399491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
400491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
401c36b26c0SDavid Wu 		break;
402c36b26c0SDavid Wu 	case 100:
403491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
404491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
405491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
406c36b26c0SDavid Wu 		break;
407c36b26c0SDavid Wu 	case 1000:
408c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
409c36b26c0SDavid Wu 		break;
410c36b26c0SDavid Wu 	default:
411c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
412c36b26c0SDavid Wu 		return -EINVAL;
413c36b26c0SDavid Wu 	}
414c36b26c0SDavid Wu 
415c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
416491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
417491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
418491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
419491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
420491f3bfbSDavid Wu 		     clk);
421c36b26c0SDavid Wu 
422c36b26c0SDavid Wu 	return 0;
423c36b26c0SDavid Wu }
424c36b26c0SDavid Wu 
425491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
426491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
427793f2fd2SPhilipp Tomsich {
4286f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
429793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
430793f2fd2SPhilipp Tomsich 	int clk;
431793f2fd2SPhilipp Tomsich 	enum {
432793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
433793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
434793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
435793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
436793f2fd2SPhilipp Tomsich 	};
437793f2fd2SPhilipp Tomsich 
438793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
439793f2fd2SPhilipp Tomsich 	case 10:
440793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
441793f2fd2SPhilipp Tomsich 		break;
442793f2fd2SPhilipp Tomsich 	case 100:
443793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
444793f2fd2SPhilipp Tomsich 		break;
445793f2fd2SPhilipp Tomsich 	case 1000:
446793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
447793f2fd2SPhilipp Tomsich 		break;
448793f2fd2SPhilipp Tomsich 	default:
449793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
450793f2fd2SPhilipp Tomsich 		return -EINVAL;
451793f2fd2SPhilipp Tomsich 	}
452793f2fd2SPhilipp Tomsich 
453793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
454793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
455793f2fd2SPhilipp Tomsich 
456793f2fd2SPhilipp Tomsich 	return 0;
457793f2fd2SPhilipp Tomsich }
458793f2fd2SPhilipp Tomsich 
459491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
460491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4611f08aa1cSPhilipp Tomsich {
4626f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4631f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4641f08aa1cSPhilipp Tomsich 	int clk;
4651f08aa1cSPhilipp Tomsich 
4661f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4671f08aa1cSPhilipp Tomsich 	case 10:
4681f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4691f08aa1cSPhilipp Tomsich 		break;
4701f08aa1cSPhilipp Tomsich 	case 100:
4711f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4721f08aa1cSPhilipp Tomsich 		break;
4731f08aa1cSPhilipp Tomsich 	case 1000:
4741f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4751f08aa1cSPhilipp Tomsich 		break;
4761f08aa1cSPhilipp Tomsich 	default:
4771f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4781f08aa1cSPhilipp Tomsich 		return -EINVAL;
4791f08aa1cSPhilipp Tomsich 	}
4801f08aa1cSPhilipp Tomsich 
4811f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4821f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4831f08aa1cSPhilipp Tomsich 
4841f08aa1cSPhilipp Tomsich 	return 0;
4851f08aa1cSPhilipp Tomsich }
4861f08aa1cSPhilipp Tomsich 
487491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
488491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4890a33ce65SDavid Wu {
4906f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4910a33ce65SDavid Wu 	struct rv1108_grf *grf;
4920a33ce65SDavid Wu 	int clk, speed;
4930a33ce65SDavid Wu 	enum {
4940a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4950a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4960a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4970a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4980a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4990a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
5000a33ce65SDavid Wu 	};
5010a33ce65SDavid Wu 
5020a33ce65SDavid Wu 	switch (priv->phydev->speed) {
5030a33ce65SDavid Wu 	case 10:
5040a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
5050a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
5060a33ce65SDavid Wu 		break;
5070a33ce65SDavid Wu 	case 100:
5080a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
5090a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
5100a33ce65SDavid Wu 		break;
5110a33ce65SDavid Wu 	default:
5120a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
5130a33ce65SDavid Wu 		return -EINVAL;
5140a33ce65SDavid Wu 	}
5150a33ce65SDavid Wu 
5160a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5170a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5180a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5190a33ce65SDavid Wu 		     clk | speed);
5200a33ce65SDavid Wu 
5210a33ce65SDavid Wu 	return 0;
5220a33ce65SDavid Wu }
523dcfb333aSDavid Wu #else
524*bcf26c57SDavid Wu static int rk3506_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
525*bcf26c57SDavid Wu 				 struct rockchip_eth_dev *dev)
526*bcf26c57SDavid Wu {
527*bcf26c57SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
528*bcf26c57SDavid Wu 	struct rk3506_grf_reg *grf;
529*bcf26c57SDavid Wu 	unsigned int div;
530*bcf26c57SDavid Wu 
531*bcf26c57SDavid Wu 	enum {
532*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV_SHIFT = 3,
533*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV_MASK = BIT(3),
534*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV2 = BIT(3),
535*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV20 = 0,
536*bcf26c57SDavid Wu 	};
537*bcf26c57SDavid Wu 
538*bcf26c57SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
539*bcf26c57SDavid Wu 
540*bcf26c57SDavid Wu 	switch (priv->phy->speed) {
541*bcf26c57SDavid Wu 	case 10:
542*bcf26c57SDavid Wu 		div = RK3506_GMAC_CLK_RMII_DIV20;
543*bcf26c57SDavid Wu 		break;
544*bcf26c57SDavid Wu 	case 100:
545*bcf26c57SDavid Wu 		div = RK3506_GMAC_CLK_RMII_DIV2;
546*bcf26c57SDavid Wu 		break;
547*bcf26c57SDavid Wu 	default:
548*bcf26c57SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
549*bcf26c57SDavid Wu 		return -EINVAL;
550*bcf26c57SDavid Wu 	}
551*bcf26c57SDavid Wu 
552*bcf26c57SDavid Wu 	if (pdata->bus_id)
553*bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_DIV_MASK, div);
554*bcf26c57SDavid Wu 	else
555*bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_DIV_MASK, div);
556*bcf26c57SDavid Wu 
557*bcf26c57SDavid Wu 	return 0;
558*bcf26c57SDavid Wu }
559*bcf26c57SDavid Wu 
560c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
561c563400aSDavid Wu 				  struct rockchip_eth_dev *dev)
562c563400aSDavid Wu {
563c563400aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
564c563400aSDavid Wu 	struct rk3528_grf *grf;
565c563400aSDavid Wu 	unsigned int div;
566c563400aSDavid Wu 
567c563400aSDavid Wu 	enum {
568c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3,
569c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3),
570c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3),
571c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV20 = 0,
572c563400aSDavid Wu 	};
573c563400aSDavid Wu 
574c563400aSDavid Wu 	enum {
575c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10,
576c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10),
577c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV1 = 0,
578c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10),
579c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11),
580c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11),
581c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV20 = 0,
582c563400aSDavid Wu 	};
583c563400aSDavid Wu 
584c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
585c563400aSDavid Wu 
586c563400aSDavid Wu 	switch (priv->phy->speed) {
587c563400aSDavid Wu 	case 10:
588c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
589c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 :
590c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV20;
591c563400aSDavid Wu 		else
592c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV50;
593c563400aSDavid Wu 		break;
594c563400aSDavid Wu 	case 100:
595c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
596c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 :
597c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV2;
598c563400aSDavid Wu 		else
599c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV5;
600c563400aSDavid Wu 		break;
601c563400aSDavid Wu 	case 1000:
602c563400aSDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
603c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV1;
604c563400aSDavid Wu 		else
605c563400aSDavid Wu 			return -EINVAL;
606c563400aSDavid Wu 		break;
607c563400aSDavid Wu 	default:
608c563400aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
609c563400aSDavid Wu 		return -EINVAL;
610c563400aSDavid Wu 	}
611c563400aSDavid Wu 
612c563400aSDavid Wu 	if (pdata->bus_id)
613c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div);
614c563400aSDavid Wu 	else
615c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div);
616c563400aSDavid Wu 
617c563400aSDavid Wu 	return 0;
618c563400aSDavid Wu }
619c563400aSDavid Wu 
62083f30531SDavid Wu static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata,
62183f30531SDavid Wu 				 struct rockchip_eth_dev *dev)
62283f30531SDavid Wu {
62383f30531SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
62483f30531SDavid Wu 	struct rk3562_grf *grf;
62583f30531SDavid Wu 	unsigned int div;
62683f30531SDavid Wu 
62783f30531SDavid Wu 	enum {
62883f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7,
62983f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7),
63083f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV1 = 0,
63183f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7),
63283f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8),
63383f30531SDavid Wu 		RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7),
63483f30531SDavid Wu 		RK3562_GMAC0_CLK_RMII_DIV20 = 0,
63583f30531SDavid Wu 	};
63683f30531SDavid Wu 
63783f30531SDavid Wu 	enum {
63883f30531SDavid Wu 		RK3562_GMAC1_SPEED_SHIFT = 0x0,
63983f30531SDavid Wu 		RK3562_GMAC1_SPEED_MASK  = BIT(0),
64083f30531SDavid Wu 		RK3562_GMAC1_SPEED_10M   = 0,
64183f30531SDavid Wu 		RK3562_GMAC1_SPEED_100M  = BIT(0),
64283f30531SDavid Wu 	};
64383f30531SDavid Wu 
64483f30531SDavid Wu 	enum {
64583f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13,
64683f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13),
64783f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13),
64883f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV20 = 0,
64983f30531SDavid Wu 	};
65083f30531SDavid Wu 
65183f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
65283f30531SDavid Wu 
65383f30531SDavid Wu 	switch (priv->phy->speed) {
65483f30531SDavid Wu 	case 10:
65583f30531SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
65683f30531SDavid Wu 			if (pdata->bus_id > 0) {
65783f30531SDavid Wu 				div = RK3562_GMAC1_CLK_RMII_DIV20;
65883f30531SDavid Wu 				rk_clrsetreg(&grf->soc_con[0],
65983f30531SDavid Wu 					     RK3562_GMAC1_SPEED_MASK,
66083f30531SDavid Wu 					     RK3562_GMAC1_SPEED_10M);
66183f30531SDavid Wu 			} else {
66283f30531SDavid Wu 				div = RK3562_GMAC0_CLK_RMII_DIV20;
66383f30531SDavid Wu 			}
66483f30531SDavid Wu 		} else {
66583f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV50;
66683f30531SDavid Wu 		}
66783f30531SDavid Wu 		break;
66883f30531SDavid Wu 	case 100:
66983f30531SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
67083f30531SDavid Wu 			if (pdata->bus_id > 0) {
67183f30531SDavid Wu 				div = RK3562_GMAC1_CLK_RMII_DIV2;
67283f30531SDavid Wu 				rk_clrsetreg(&grf->soc_con[0],
67383f30531SDavid Wu 					     RK3562_GMAC1_SPEED_MASK,
67483f30531SDavid Wu 					     RK3562_GMAC1_SPEED_100M);
67583f30531SDavid Wu 			} else {
67683f30531SDavid Wu 				div = RK3562_GMAC0_CLK_RMII_DIV2;
67783f30531SDavid Wu 			}
67883f30531SDavid Wu 		} else {
67983f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV5;
68083f30531SDavid Wu 		}
68183f30531SDavid Wu 		break;
68283f30531SDavid Wu 	case 1000:
68383f30531SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
68483f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV1;
68583f30531SDavid Wu 		else
68683f30531SDavid Wu 			return -EINVAL;
68783f30531SDavid Wu 		break;
68883f30531SDavid Wu 	default:
68983f30531SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
69083f30531SDavid Wu 		return -EINVAL;
69183f30531SDavid Wu 	}
69283f30531SDavid Wu 
69383f30531SDavid Wu 	if (pdata->bus_id)
69483f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div);
69583f30531SDavid Wu 	else
69683f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div);
69783f30531SDavid Wu 
69883f30531SDavid Wu 	return 0;
69983f30531SDavid Wu }
70083f30531SDavid Wu 
701bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
702bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
703bf0e94d0SDavid Wu {
704bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
705bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
706bf0e94d0SDavid Wu 	unsigned int div, div_mask;
707bf0e94d0SDavid Wu 
708bf0e94d0SDavid Wu 	enum {
709bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
710bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
711bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
712a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
713bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
7146d863a16SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV2 = BIT(2),
715bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
7166d863a16SDavid Wu 		RK3588_GMAC1_ID_SHIFT = 5,
717bf0e94d0SDavid Wu 	};
718bf0e94d0SDavid Wu 
719bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
720bf0e94d0SDavid Wu 
721bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
722bf0e94d0SDavid Wu 	case 10:
723bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
724bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
725bf0e94d0SDavid Wu 		else
726bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
727bf0e94d0SDavid Wu 		break;
728bf0e94d0SDavid Wu 	case 100:
729bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
7306d863a16SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV2;
731bf0e94d0SDavid Wu 		else
732bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
733bf0e94d0SDavid Wu 		break;
734bf0e94d0SDavid Wu 	case 1000:
735bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
736bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
737bf0e94d0SDavid Wu 		else
738bf0e94d0SDavid Wu 			return -EINVAL;
739bf0e94d0SDavid Wu 		break;
740bf0e94d0SDavid Wu 	default:
741bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
742bf0e94d0SDavid Wu 		return -EINVAL;
743bf0e94d0SDavid Wu 	}
744bf0e94d0SDavid Wu 
745bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
746bf0e94d0SDavid Wu 		div <<= 5;
747bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
748bf0e94d0SDavid Wu 	}
749bf0e94d0SDavid Wu 
7506d863a16SDavid Wu 	div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0;
7516d863a16SDavid Wu 	div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) :
7526d863a16SDavid Wu 		   RK3588_GMAC_CLK_RGMII_DIV_MASK;
7536d863a16SDavid Wu 
754bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
755bf0e94d0SDavid Wu 
756bf0e94d0SDavid Wu 	return 0;
757bf0e94d0SDavid Wu }
758bf0e94d0SDavid Wu 
75920bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
76020bef841SDavid Wu 				 struct rockchip_eth_dev *dev)
76120bef841SDavid Wu {
76220bef841SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
763745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B
764745dad46SDavid Wu 	struct rv1103b_grf *grf;
765745dad46SDavid Wu #else
76620bef841SDavid Wu 	struct rv1106_grf *grf;
767745dad46SDavid Wu #endif
76820bef841SDavid Wu 	unsigned int div;
76920bef841SDavid Wu 
77020bef841SDavid Wu 	enum {
77120bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
77220bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
77320bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
77420bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV20 = 0,
77520bef841SDavid Wu 	};
77620bef841SDavid Wu 
77720bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
77820bef841SDavid Wu 
77920bef841SDavid Wu 	switch (priv->phy->speed) {
78020bef841SDavid Wu 	case 10:
78120bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV20;
78220bef841SDavid Wu 		break;
78320bef841SDavid Wu 	case 100:
78420bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV2;
78520bef841SDavid Wu 		break;
78620bef841SDavid Wu 	default:
78720bef841SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
78820bef841SDavid Wu 		return -EINVAL;
78920bef841SDavid Wu 	}
79020bef841SDavid Wu 
79120bef841SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
79220bef841SDavid Wu 
79320bef841SDavid Wu 	return 0;
79420bef841SDavid Wu }
79520bef841SDavid Wu 
796491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
797491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
798dcfb333aSDavid Wu {
799dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
800dcfb333aSDavid Wu 	struct clk clk_speed;
801dcfb333aSDavid Wu 	int ret;
802dcfb333aSDavid Wu 
803dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
804dcfb333aSDavid Wu 			      &clk_speed);
805dcfb333aSDavid Wu 	if (ret) {
80633a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
80733a014bdSDavid Wu 		       __func__, ret);
808dcfb333aSDavid Wu 		return ret;
809dcfb333aSDavid Wu 	}
810dcfb333aSDavid Wu 
811dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
812dcfb333aSDavid Wu 	case 10:
813dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
814dcfb333aSDavid Wu 		if (ret)
815dcfb333aSDavid Wu 			return ret;
816dcfb333aSDavid Wu 		break;
817dcfb333aSDavid Wu 	case 100:
818dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
819dcfb333aSDavid Wu 		if (ret)
820dcfb333aSDavid Wu 			return ret;
821dcfb333aSDavid Wu 		break;
822dcfb333aSDavid Wu 	case 1000:
823dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
824dcfb333aSDavid Wu 		if (ret)
825dcfb333aSDavid Wu 			return ret;
826dcfb333aSDavid Wu 		break;
827dcfb333aSDavid Wu 	default:
828dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
829dcfb333aSDavid Wu 		return -EINVAL;
830dcfb333aSDavid Wu 	}
831dcfb333aSDavid Wu 
832dcfb333aSDavid Wu 	return 0;
833dcfb333aSDavid Wu }
8346f0a52e9SDavid Wu #endif
8350a33ce65SDavid Wu 
8366f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
83718ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
83818ae91c8SDavid Wu {
83918ae91c8SDavid Wu 	struct px30_grf *grf;
84018ae91c8SDavid Wu 	enum {
84118ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
84218ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
84318ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
84418ae91c8SDavid Wu 	};
84518ae91c8SDavid Wu 
84618ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
84718ae91c8SDavid Wu 
84818ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
84918ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
85018ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
85118ae91c8SDavid Wu }
85218ae91c8SDavid Wu 
853ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
854ff86648dSDavid Wu {
855ff86648dSDavid Wu 	struct rk1808_grf *grf;
856ff86648dSDavid Wu 	enum {
857ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
858ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
859ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
860ff86648dSDavid Wu 
861ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
862ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
863ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
864ff86648dSDavid Wu 
865ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
866ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
867ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
868ff86648dSDavid Wu 	};
869ff86648dSDavid Wu 	enum {
870ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
871ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
872ff86648dSDavid Wu 
873ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
874ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
875ff86648dSDavid Wu 	};
876ff86648dSDavid Wu 
877ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
878ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
879ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
880ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
881ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
882ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
883ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
884ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
885ff86648dSDavid Wu 
886ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
887ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
888ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
889c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) |
890c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT));
891ff86648dSDavid Wu }
892ff86648dSDavid Wu 
893af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
894af166ffaSDavid Wu {
895af166ffaSDavid Wu 	struct rk322x_grf *grf;
896af166ffaSDavid Wu 	enum {
897af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
898af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
899af166ffaSDavid Wu 
900af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
901af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
902af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
903af166ffaSDavid Wu 
904af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
905af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
906af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
907af166ffaSDavid Wu 
908af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
909af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
910af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
911af166ffaSDavid Wu 	};
912af166ffaSDavid Wu 	enum {
913af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
914af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
915af166ffaSDavid Wu 
916af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
917af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
918af166ffaSDavid Wu 	};
919af166ffaSDavid Wu 
920af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
921af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
922af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
923af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
924af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
925af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
926af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
927af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
928af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
929af166ffaSDavid Wu 
930af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
931af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
932af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
933af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
934af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
935af166ffaSDavid Wu }
936af166ffaSDavid Wu 
937491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
938491f3bfbSDavid Wu {
939491f3bfbSDavid Wu 	struct rk322x_grf *grf;
940491f3bfbSDavid Wu 	enum {
941491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
942491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
943491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
944491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
945491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
946491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
947491f3bfbSDavid Wu 	};
948491f3bfbSDavid Wu 
949491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
950491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
951491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
952491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
953491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
954491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
955491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
956491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
957491f3bfbSDavid Wu }
958491f3bfbSDavid Wu 
9591f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
9601f08aa1cSPhilipp Tomsich {
9611f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
9621f08aa1cSPhilipp Tomsich 
9631f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9641f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
9651f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
9661f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
9671f08aa1cSPhilipp Tomsich 
9681f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
9691f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
9701f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
9711f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
9721f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
9731f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
9741f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
9751f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
9761f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
9771f08aa1cSPhilipp Tomsich }
9781f08aa1cSPhilipp Tomsich 
97923adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
98023adb58fSDavid Wu {
98123adb58fSDavid Wu 	struct rk3308_grf *grf;
98223adb58fSDavid Wu 	enum {
98323adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
98423adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
98523adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
98623adb58fSDavid Wu 	};
98723adb58fSDavid Wu 
98823adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
98923adb58fSDavid Wu 
99023adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
99123adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
99223adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
99323adb58fSDavid Wu }
99423adb58fSDavid Wu 
995c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
996c36b26c0SDavid Wu {
997c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
998c36b26c0SDavid Wu 	enum {
999c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
1000c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
1001c36b26c0SDavid Wu 
1002c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
1003c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1004c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1005c36b26c0SDavid Wu 
1006c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
1007c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1008c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
1009c36b26c0SDavid Wu 
1010c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
1011c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1012c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
1013c36b26c0SDavid Wu 	};
1014c36b26c0SDavid Wu 	enum {
1015c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
1016c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
1017c36b26c0SDavid Wu 
1018c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1019c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1020c36b26c0SDavid Wu 	};
1021c36b26c0SDavid Wu 
1022c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1023c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
1024c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
1025c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
1026c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
1027c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
1028c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
1029c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
1030c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
1031c36b26c0SDavid Wu 
1032c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
1033c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
1034c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
1035c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
1036c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
1037c36b26c0SDavid Wu }
1038c36b26c0SDavid Wu 
1039491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1040491f3bfbSDavid Wu {
1041491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1042491f3bfbSDavid Wu 	enum {
1043491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
1044491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
1045491f3bfbSDavid Wu 
1046491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1047491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1048491f3bfbSDavid Wu 	};
1049491f3bfbSDavid Wu 
1050491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1051491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
1052491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
1053491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
1054491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
1055491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
1056491f3bfbSDavid Wu }
1057491f3bfbSDavid Wu 
1058793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1059793f2fd2SPhilipp Tomsich {
1060793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
1061793f2fd2SPhilipp Tomsich 	enum {
1062793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
1063793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
1064793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
1065793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
1066793f2fd2SPhilipp Tomsich 	};
1067793f2fd2SPhilipp Tomsich 	enum {
1068793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
1069793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1070793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
1071793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
1072793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1073793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
1074793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
1075793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1076793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
1077793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1078793f2fd2SPhilipp Tomsich 	};
1079793f2fd2SPhilipp Tomsich 
1080793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1081793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
1082793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
1083793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
1084793f2fd2SPhilipp Tomsich 
1085793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
1086793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
1087793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
1088793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
1089793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
1090793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
1091793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
1092c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) |
1093c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT));
1094793f2fd2SPhilipp Tomsich }
1095793f2fd2SPhilipp Tomsich 
10961f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
10971f08aa1cSPhilipp Tomsich {
10981f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
10991f08aa1cSPhilipp Tomsich 
11001f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
11011f08aa1cSPhilipp Tomsich 
11021f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
11031f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
11041f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
11051f08aa1cSPhilipp Tomsich 
11061f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
11071f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
11081f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
11091f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
11101f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
11111f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
11121f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
1113c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) |
1114c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT));
11151f08aa1cSPhilipp Tomsich }
11161f08aa1cSPhilipp Tomsich 
11170a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
11180a33ce65SDavid Wu {
11190a33ce65SDavid Wu 	struct rv1108_grf *grf;
11200a33ce65SDavid Wu 
11210a33ce65SDavid Wu 	enum {
11220a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
11230a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
11240a33ce65SDavid Wu 	};
11250a33ce65SDavid Wu 
11260a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
11270a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
11280a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
11290a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
11300a33ce65SDavid Wu }
1131491f3bfbSDavid Wu 
1132491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1133491f3bfbSDavid Wu {
1134491f3bfbSDavid Wu 	struct rk322x_grf *grf;
1135491f3bfbSDavid Wu 	enum {
1136491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
1137491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
1138491f3bfbSDavid Wu 	};
1139491f3bfbSDavid Wu 	enum {
1140491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1141491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
1142491f3bfbSDavid Wu 
1143491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1144491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
1145491f3bfbSDavid Wu 
1146491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
1147491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
1148491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
1149491f3bfbSDavid Wu 	};
1150491f3bfbSDavid Wu 	enum {
1151491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1152491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
1153491f3bfbSDavid Wu 	};
1154491f3bfbSDavid Wu 	enum {
1155491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1156491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
1157491f3bfbSDavid Wu 	};
1158491f3bfbSDavid Wu 
1159491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1160491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
1161491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
1162491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
1163491f3bfbSDavid Wu 
1164491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1165491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
1166491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
1167491f3bfbSDavid Wu 
1168491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1169491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
1170491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
1171491f3bfbSDavid Wu 
1172491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1173491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1174491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
1175491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
1176491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1177491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
1178491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
1179491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
1180491f3bfbSDavid Wu 
1181491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1182491f3bfbSDavid Wu 	udelay(10);
1183491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1184491f3bfbSDavid Wu 	udelay(10);
1185491f3bfbSDavid Wu 
1186491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1187491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1188491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
1189491f3bfbSDavid Wu 	udelay(30 * 1000);
1190491f3bfbSDavid Wu }
1191491f3bfbSDavid Wu 
1192491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1193491f3bfbSDavid Wu {
1194491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1195491f3bfbSDavid Wu 	enum {
1196491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1197491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
1198491f3bfbSDavid Wu 	};
1199491f3bfbSDavid Wu 	enum {
1200491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1201491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1202491f3bfbSDavid Wu 
1203491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1204491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
1205491f3bfbSDavid Wu 
1206491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
1207491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
1208491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
1209491f3bfbSDavid Wu 	};
1210491f3bfbSDavid Wu 	enum {
1211491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1212491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1213491f3bfbSDavid Wu 	};
1214491f3bfbSDavid Wu 	enum {
1215491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1216491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1217491f3bfbSDavid Wu 	};
1218491f3bfbSDavid Wu 
1219491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1220491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
1221491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
1222491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
1223491f3bfbSDavid Wu 
1224491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1225491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1226491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
1227491f3bfbSDavid Wu 
1228491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1229491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1230491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
1231491f3bfbSDavid Wu 
1232491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1233491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1234491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
1235491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1236491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1237491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1238491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1239491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1240491f3bfbSDavid Wu 
1241491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1242491f3bfbSDavid Wu 	udelay(10);
1243491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1244491f3bfbSDavid Wu 	udelay(10);
1245491f3bfbSDavid Wu 
1246491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1247491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1248491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1249491f3bfbSDavid Wu 	udelay(30 * 1000);
1250491f3bfbSDavid Wu }
1251491f3bfbSDavid Wu 
1252dcfb333aSDavid Wu #else
1253*bcf26c57SDavid Wu static void rk3506_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1254*bcf26c57SDavid Wu {
1255*bcf26c57SDavid Wu 	unsigned int clk_mode;
1256*bcf26c57SDavid Wu 	struct rk3506_grf_reg *grf;
1257*bcf26c57SDavid Wu 
1258*bcf26c57SDavid Wu 	enum {
1259*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_MODE_SHIFT = 0x1,
1260*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_MODE_MASK = BIT(1),
1261*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_MODE = BIT(1),
1262*bcf26c57SDavid Wu 	};
1263*bcf26c57SDavid Wu 
1264*bcf26c57SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1265*bcf26c57SDavid Wu 	clk_mode = RK3506_GMAC_CLK_RMII_MODE;
1266*bcf26c57SDavid Wu 
1267*bcf26c57SDavid Wu 	if (pdata->bus_id == 1)
1268*bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode);
1269*bcf26c57SDavid Wu 	else
1270*bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode);
1271*bcf26c57SDavid Wu }
1272*bcf26c57SDavid Wu 
1273c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1274c563400aSDavid Wu {
1275c563400aSDavid Wu 	struct rk3528_grf *grf;
1276c563400aSDavid Wu 	unsigned char bgs[1] = {0};
1277c563400aSDavid Wu 
1278c563400aSDavid Wu 	enum {
1279c563400aSDavid Wu 		RK3528_MACPHY_ENABLE_MASK = BIT(1),
1280c563400aSDavid Wu 		RK3528_MACPHY_DISENABLE = BIT(1),
1281c563400aSDavid Wu 		RK3528_MACPHY_ENABLE = 0,
1282c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
1283c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL = BIT(6),
1284c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
1285c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
1286c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
1287c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID = BIT(11),
1288c563400aSDavid Wu 	};
1289c563400aSDavid Wu 
1290c563400aSDavid Wu 	enum {
1291c563400aSDavid Wu 		RK3528_MACPHY_BGS_MASK = GENMASK(3, 0),
1292c563400aSDavid Wu 	};
1293c563400aSDavid Wu 
1294c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1295c563400aSDavid Wu 	struct udevice *dev;
1296c563400aSDavid Wu 	u32 regs[2] = {0};
1297c563400aSDavid Wu 	ofnode node;
1298c563400aSDavid Wu 	int ret = 0;
1299c563400aSDavid Wu 
1300c563400aSDavid Wu 	/* retrieve the device */
1301c563400aSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1302c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1303c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1304c563400aSDavid Wu 						  &dev);
1305c563400aSDavid Wu 	else
1306c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1307c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1308c563400aSDavid Wu 						  &dev);
1309c563400aSDavid Wu 	if (!ret) {
1310c563400aSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1311c563400aSDavid Wu 		if (ofnode_valid(node)) {
1312c563400aSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1313c563400aSDavid Wu 				/* read the bgs from the efuses */
1314c563400aSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1315c563400aSDavid Wu 				if (ret) {
1316c563400aSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1317c563400aSDavid Wu 					       ret);
1318c563400aSDavid Wu 					bgs[0] = 0;
1319c563400aSDavid Wu 				}
1320c563400aSDavid Wu 			}
1321c563400aSDavid Wu 		}
1322c563400aSDavid Wu 	}
1323c563400aSDavid Wu #endif
1324c563400aSDavid Wu 
1325c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1326c563400aSDavid Wu 
1327c563400aSDavid Wu 	reset_assert(&pdata->phy_reset);
1328c563400aSDavid Wu 	udelay(20);
1329c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
1330c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE_MASK |
1331c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL_MASK |
1332c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_MASK |
1333c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID_MASK,
1334c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE |
1335c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL |
1336c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_24M |
1337c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID);
1338c563400aSDavid Wu 
1339c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
1340c563400aSDavid Wu 		     RK3528_MACPHY_BGS_MASK,
1341c563400aSDavid Wu 		     bgs[0]);
1342c563400aSDavid Wu 	udelay(20);
1343c563400aSDavid Wu 	reset_deassert(&pdata->phy_reset);
1344c563400aSDavid Wu 	udelay(30 * 1000);
1345c563400aSDavid Wu }
1346c563400aSDavid Wu 
1347c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1348c563400aSDavid Wu {
1349c563400aSDavid Wu 	unsigned int clk_mode;
1350c563400aSDavid Wu 	struct rk3528_grf *grf;
1351c563400aSDavid Wu 
1352c563400aSDavid Wu 	enum {
1353c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1,
1354c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1),
1355c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE = 0x1,
1356c563400aSDavid Wu 	};
1357c563400aSDavid Wu 
1358c563400aSDavid Wu 	enum {
1359c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8,
1360c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8),
1361c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE = 0x1,
1362c563400aSDavid Wu 	};
1363c563400aSDavid Wu 
1364c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1365c563400aSDavid Wu 
1366c563400aSDavid Wu 	if (pdata->bus_id == 1) {
1367c563400aSDavid Wu 		clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT;
1368c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode);
1369c563400aSDavid Wu 	} else {
1370c563400aSDavid Wu 		clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT;
1371c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode);
1372c563400aSDavid Wu 	}
1373c563400aSDavid Wu }
1374c563400aSDavid Wu 
1375c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1376c563400aSDavid Wu {
1377c563400aSDavid Wu 	unsigned int rx_enable;
1378c563400aSDavid Wu 	unsigned int rx_delay;
1379c563400aSDavid Wu 	struct rk3528_grf *grf;
1380c563400aSDavid Wu 
1381c563400aSDavid Wu 	enum {
1382c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8,
1383c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_MASK = BIT(8),
1384c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE = 0x0,
1385c563400aSDavid Wu 
1386c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14),
1387c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0,
1388c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14),
1389c563400aSDavid Wu 
1390c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15),
1391c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0,
1392c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15),
1393c563400aSDavid Wu 	};
1394c563400aSDavid Wu 
1395c563400aSDavid Wu 	enum {
1396c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8,
1397c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8),
1398c563400aSDavid Wu 
1399c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0,
1400c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0),
1401c563400aSDavid Wu 	};
1402c563400aSDavid Wu 
1403c563400aSDavid Wu 	if (!pdata->bus_id)
1404c563400aSDavid Wu 		return;
1405c563400aSDavid Wu 
1406c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1407c563400aSDavid Wu 
1408c563400aSDavid Wu 	if (pdata->rx_delay < 0) {
1409c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE;
1410c563400aSDavid Wu 		rx_delay = 0;
1411c563400aSDavid Wu 	} else {
1412c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE;
1413c563400aSDavid Wu 		rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT;
1414c563400aSDavid Wu 	}
1415c563400aSDavid Wu 
1416c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0,
1417c563400aSDavid Wu 		     RK3528_GMAC1_TXCLK_DLY_ENA_MASK |
1418c563400aSDavid Wu 		     RK3528_GMAC1_RXCLK_DLY_ENA_MASK |
1419c563400aSDavid Wu 		     RK3528_GMAC1_RGMII_MODE_MASK,
1420c563400aSDavid Wu 		     rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE |
1421c563400aSDavid Wu 		     (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT));
1422c563400aSDavid Wu 
1423c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con1,
1424c563400aSDavid Wu 		     RK3528_GMAC1_RX_DL_CFG_MASK |
1425c563400aSDavid Wu 		     RK3528_GMAC1_TX_DL_CFG_MASK,
1426c563400aSDavid Wu 		     (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) |
1427c563400aSDavid Wu 		     rx_delay);
1428c563400aSDavid Wu }
1429c563400aSDavid Wu 
143083f30531SDavid Wu static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata)
143183f30531SDavid Wu {
143283f30531SDavid Wu 	struct rk3562_grf *grf;
143383f30531SDavid Wu 	unsigned int mode;
143483f30531SDavid Wu 
143583f30531SDavid Wu 	enum {
143683f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE_SHIFT = 0x5,
143783f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE_MASK = BIT(5),
143883f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE = 0x1,
143983f30531SDavid Wu 	};
144083f30531SDavid Wu 
144183f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
144283f30531SDavid Wu 
144383f30531SDavid Wu 	if (!pdata->bus_id) {
144483f30531SDavid Wu 		mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT;
144583f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode);
144683f30531SDavid Wu 	}
144783f30531SDavid Wu }
144883f30531SDavid Wu 
144983f30531SDavid Wu static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
145083f30531SDavid Wu {
145183f30531SDavid Wu 	struct rk3562_grf *grf;
145283f30531SDavid Wu 	struct rk3562_ioc *ioc;
145383f30531SDavid Wu 	unsigned int rx_enable;
145483f30531SDavid Wu 	unsigned int rx_delay;
145583f30531SDavid Wu 
145683f30531SDavid Wu 	enum {
145783f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5,
145883f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE_MASK = BIT(5),
145983f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE = 0x0,
146083f30531SDavid Wu 
146183f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0),
146283f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0,
146383f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0),
146483f30531SDavid Wu 
146583f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1),
146683f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0,
146783f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1),
146883f30531SDavid Wu 	};
146983f30531SDavid Wu 
147083f30531SDavid Wu 	enum {
147183f30531SDavid Wu 		RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8,
147283f30531SDavid Wu 		RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8),
147383f30531SDavid Wu 
147483f30531SDavid Wu 		RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0,
147583f30531SDavid Wu 		RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0),
147683f30531SDavid Wu 	};
147783f30531SDavid Wu 
147883f30531SDavid Wu 	if (pdata->bus_id)
147983f30531SDavid Wu 		return;
148083f30531SDavid Wu 
148183f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
148283f30531SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
148383f30531SDavid Wu 
148483f30531SDavid Wu 	rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK,
148583f30531SDavid Wu 		     RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT);
148683f30531SDavid Wu 
148783f30531SDavid Wu 	if (pdata->rx_delay < 0) {
148883f30531SDavid Wu 		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE;
148983f30531SDavid Wu 		rx_delay = 0;
149083f30531SDavid Wu 	} else {
149183f30531SDavid Wu 		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE;
149283f30531SDavid Wu 		rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT;
149383f30531SDavid Wu 	}
149483f30531SDavid Wu 
149583f30531SDavid Wu 	rk_clrsetreg(&ioc->mac0_io_con1,
149683f30531SDavid Wu 		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
149783f30531SDavid Wu 		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
149883f30531SDavid Wu 		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
149983f30531SDavid Wu 
150083f30531SDavid Wu 	rk_clrsetreg(&ioc->mac0_io_con0,
150183f30531SDavid Wu 		     RK3562_GMAC0_RX_DL_CFG_MASK |
150283f30531SDavid Wu 		     RK3562_GMAC0_TX_DL_CFG_MASK,
150383f30531SDavid Wu 		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
150483f30531SDavid Wu 		     rx_delay);
150583f30531SDavid Wu 
150683f30531SDavid Wu 	rk_clrsetreg(&ioc->mac1_io_con1,
150783f30531SDavid Wu 		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
150883f30531SDavid Wu 		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
150983f30531SDavid Wu 		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
151083f30531SDavid Wu 
151183f30531SDavid Wu 	rk_clrsetreg(&ioc->mac1_io_con0,
151283f30531SDavid Wu 		     RK3562_GMAC0_RX_DL_CFG_MASK |
151383f30531SDavid Wu 		     RK3562_GMAC0_TX_DL_CFG_MASK,
151483f30531SDavid Wu 		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
151583f30531SDavid Wu 		     rx_delay);
151683f30531SDavid Wu }
151783f30531SDavid Wu 
151833a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
151933a014bdSDavid Wu {
152033a014bdSDavid Wu 	struct rk3568_grf *grf;
152133a014bdSDavid Wu 	void *con1;
152233a014bdSDavid Wu 
152333a014bdSDavid Wu 	enum {
152433a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
152533a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
152633a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
152733a014bdSDavid Wu 	};
152833a014bdSDavid Wu 
152933a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
153033a014bdSDavid Wu 
153133a014bdSDavid Wu 	if (pdata->bus_id == 1)
153233a014bdSDavid Wu 		con1 = &grf->mac1_con1;
153333a014bdSDavid Wu 	else
153433a014bdSDavid Wu 		con1 = &grf->mac0_con1;
153533a014bdSDavid Wu 
153633a014bdSDavid Wu 	rk_clrsetreg(con1,
153733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
153833a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
153933a014bdSDavid Wu }
154033a014bdSDavid Wu 
154133a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
154233a014bdSDavid Wu {
154333a014bdSDavid Wu 	struct rk3568_grf *grf;
154433a014bdSDavid Wu 	void *con0, *con1;
154533a014bdSDavid Wu 
154633a014bdSDavid Wu 	enum {
154733a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
154833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
154933a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
155033a014bdSDavid Wu 
155133a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
155233a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
155333a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
155433a014bdSDavid Wu 
155533a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
155633a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
155733a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
155833a014bdSDavid Wu 	};
155933a014bdSDavid Wu 
156033a014bdSDavid Wu 	enum {
156133a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
156233a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
156333a014bdSDavid Wu 
156433a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
156533a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
156633a014bdSDavid Wu 	};
156733a014bdSDavid Wu 
156833a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
156933a014bdSDavid Wu 
157033a014bdSDavid Wu 	if (pdata->bus_id == 1) {
157133a014bdSDavid Wu 		con0 = &grf->mac1_con0;
157233a014bdSDavid Wu 		con1 = &grf->mac1_con1;
157333a014bdSDavid Wu 	} else {
157433a014bdSDavid Wu 		con0 = &grf->mac0_con0;
157533a014bdSDavid Wu 		con1 = &grf->mac0_con1;
157633a014bdSDavid Wu 	}
157733a014bdSDavid Wu 
157833a014bdSDavid Wu 	rk_clrsetreg(con0,
157933a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
158033a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
1581c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) |
1582c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT));
158333a014bdSDavid Wu 
158433a014bdSDavid Wu 	rk_clrsetreg(con1,
158533a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
158633a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
158733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
158833a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
158933a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
159033a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
159133a014bdSDavid Wu }
159233a014bdSDavid Wu 
1593bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1594bf0e94d0SDavid Wu {
1595bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1596bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1597bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1598bf0e94d0SDavid Wu 
1599bf0e94d0SDavid Wu 	enum {
1600bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1601bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1602bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1603bf0e94d0SDavid Wu 	};
1604bf0e94d0SDavid Wu 
1605bf0e94d0SDavid Wu 	enum {
1606bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1607bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1608bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1609bf0e94d0SDavid Wu 	};
1610bf0e94d0SDavid Wu 
1611bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1612bf0e94d0SDavid Wu 
1613bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1614bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1615bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1616bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1617bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1618bf0e94d0SDavid Wu 	} else {
1619bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1620bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1621bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1622bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1623bf0e94d0SDavid Wu 	}
1624bf0e94d0SDavid Wu 
1625bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1626bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1627bf0e94d0SDavid Wu }
1628bf0e94d0SDavid Wu 
1629bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1630bf0e94d0SDavid Wu {
1631bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1632bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1633bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1634bf0e94d0SDavid Wu 	unsigned int rx_delay;
1635bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1636bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1637bf0e94d0SDavid Wu 	void *offset_con;
1638bf0e94d0SDavid Wu 
1639bf0e94d0SDavid Wu 	enum {
1640bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1641bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1642bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1643bf0e94d0SDavid Wu 
1644bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1645bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1646bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1647bf0e94d0SDavid Wu 
1648bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1649bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1650bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1651bf0e94d0SDavid Wu 	};
1652bf0e94d0SDavid Wu 
1653bf0e94d0SDavid Wu 	enum {
1654bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1655bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1656bf0e94d0SDavid Wu 
1657bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1658bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1659bf0e94d0SDavid Wu 	};
1660bf0e94d0SDavid Wu 
1661bf0e94d0SDavid Wu 	enum {
1662bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1663bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1664bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1665bf0e94d0SDavid Wu 	};
1666bf0e94d0SDavid Wu 
1667bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1668bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1669bf0e94d0SDavid Wu 
1670bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1671bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1672bf0e94d0SDavid Wu 		rx_delay = 0;
1673bf0e94d0SDavid Wu 	} else {
1674bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1675bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1676bf0e94d0SDavid Wu 	}
1677bf0e94d0SDavid Wu 
1678bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1679bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1680bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1681bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1682bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1683bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1684bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1685bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1686bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1687bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1688bf0e94d0SDavid Wu 	} else {
1689bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1690bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1691bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1692bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1693bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1694bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1695bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1696bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1697bf0e94d0SDavid Wu 	}
1698bf0e94d0SDavid Wu 
1699bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1700bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1701bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1702c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) |
1703bf0e94d0SDavid Wu 		     rx_delay);
1704bf0e94d0SDavid Wu 
1705bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1706bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1707bf0e94d0SDavid Wu 
1708bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1709bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1710bf0e94d0SDavid Wu }
1711bf0e94d0SDavid Wu 
1712745dad46SDavid Wu static void rv1103b_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1713745dad46SDavid Wu {
1714745dad46SDavid Wu 	struct rv1103b_grf *grf;
1715745dad46SDavid Wu 	enum {
1716745dad46SDavid Wu 		RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK = BIT(2),
1717745dad46SDavid Wu 		RV1103B_SYSGRF_GMAC_CLK_RMII_50M = BIT(2),
1718745dad46SDavid Wu 	};
1719745dad46SDavid Wu 
1720745dad46SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1721745dad46SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
1722745dad46SDavid Wu 		     RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK,
1723745dad46SDavid Wu 		     RV1103B_SYSGRF_GMAC_CLK_RMII_50M);
1724745dad46SDavid Wu };
1725745dad46SDavid Wu 
172620bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
172720bef841SDavid Wu {
1728745dad46SDavid Wu 	#ifdef CONFIG_ROCKCHIP_RV1103B
1729745dad46SDavid Wu 		struct rv1103b_grf *grf;
1730745dad46SDavid Wu 	#else
173120bef841SDavid Wu 		struct rv1106_grf *grf;
1732745dad46SDavid Wu 	#endif
1733535678cdSDavid Wu 	unsigned char bgs[1] = {0};
1734535678cdSDavid Wu 
1735535678cdSDavid Wu 	enum {
1736535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1737535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1738535678cdSDavid Wu 	};
173954f7ad44SDavid Wu 
174054f7ad44SDavid Wu 	enum {
174120bef841SDavid Wu 		RV1106_MACPHY_ENABLE_MASK = BIT(1),
174254f7ad44SDavid Wu 		RV1106_MACPHY_DISENABLE = BIT(1),
174354f7ad44SDavid Wu 		RV1106_MACPHY_ENABLE = 0,
174420bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
174520bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL = BIT(6),
174620bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
174720bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
174820bef841SDavid Wu 		RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
174920bef841SDavid Wu 		RV1106_MACPHY_PHY_ID = BIT(11),
175020bef841SDavid Wu 	};
175120bef841SDavid Wu 
175220bef841SDavid Wu 	enum {
175320bef841SDavid Wu 		RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
175454f7ad44SDavid Wu 		RV1106_MACPHY_BGS = BIT(2),
175520bef841SDavid Wu 	};
175620bef841SDavid Wu 
1757535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1758535678cdSDavid Wu 	struct udevice *dev;
1759535678cdSDavid Wu 	u32 regs[2] = {0};
1760535678cdSDavid Wu 	ofnode node;
1761535678cdSDavid Wu 	int ret = 0;
1762535678cdSDavid Wu 
1763535678cdSDavid Wu 	/* retrieve the device */
1764535678cdSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1765535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1766535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1767535678cdSDavid Wu 						  &dev);
1768535678cdSDavid Wu 	else
1769535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1770535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1771535678cdSDavid Wu 						  &dev);
1772535678cdSDavid Wu 	if (!ret) {
1773535678cdSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1774535678cdSDavid Wu 		if (ofnode_valid(node)) {
1775535678cdSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1776535678cdSDavid Wu 				/* read the bgs from the efuses */
1777535678cdSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1778535678cdSDavid Wu 				if (ret) {
1779535678cdSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1780535678cdSDavid Wu 					       ret);
1781535678cdSDavid Wu 					bgs[0] = 0;
1782535678cdSDavid Wu 				}
1783535678cdSDavid Wu 			}
1784535678cdSDavid Wu 		}
1785535678cdSDavid Wu 	}
1786535678cdSDavid Wu #endif
1787535678cdSDavid Wu 
178820bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
178920bef841SDavid Wu 
179020bef841SDavid Wu 	reset_assert(&pdata->phy_reset);
179120bef841SDavid Wu 	udelay(20);
179220bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
179320bef841SDavid Wu 		     RV1106_MACPHY_ENABLE_MASK |
179420bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL_MASK |
179520bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_MASK |
179620bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID_MASK,
179720bef841SDavid Wu 		     RV1106_MACPHY_ENABLE |
179820bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL |
179920bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_24M |
180020bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID);
180120bef841SDavid Wu 
180220bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
180320bef841SDavid Wu 		     RV1106_MACPHY_BGS_MASK,
1804535678cdSDavid Wu 		     bgs[0]);
18058bafa3a1SDavid Wu 	udelay(20);
180620bef841SDavid Wu 	reset_deassert(&pdata->phy_reset);
180720bef841SDavid Wu 	udelay(30 * 1000);
180820bef841SDavid Wu }
180920bef841SDavid Wu 
18108bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
18118bafa3a1SDavid Wu {
18128bafa3a1SDavid Wu 	struct rv1106_grf *grf;
18138bafa3a1SDavid Wu 	enum {
18148bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
18158bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
18168bafa3a1SDavid Wu 	};
18178bafa3a1SDavid Wu 
18188bafa3a1SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
18198bafa3a1SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
18208bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
18218bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE);
18228bafa3a1SDavid Wu };
18238bafa3a1SDavid Wu 
1824e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1825e4e3f431SDavid Wu {
1826e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1827e4e3f431SDavid Wu 
1828e4e3f431SDavid Wu 	enum {
1829e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1830e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1831e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1832e4e3f431SDavid Wu 	};
1833e4e3f431SDavid Wu 
1834e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1835e4e3f431SDavid Wu 
1836e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1837e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1838e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1839e4e3f431SDavid Wu }
1840e4e3f431SDavid Wu 
1841dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1842dcfb333aSDavid Wu {
1843dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1844dcfb333aSDavid Wu 
1845dcfb333aSDavid Wu 	enum {
1846dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1847dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1848dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1849dcfb333aSDavid Wu 
1850dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1851dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1852dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1853dcfb333aSDavid Wu 
1854dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1855dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1856dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1857dcfb333aSDavid Wu 
1858dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1859dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1860dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1861dcfb333aSDavid Wu 
1862dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1863dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1864dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1865dcfb333aSDavid Wu 	};
1866dcfb333aSDavid Wu 	enum {
1867dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1868dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1869dcfb333aSDavid Wu 
1870dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1871dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1872dcfb333aSDavid Wu 	};
1873dcfb333aSDavid Wu 	enum {
1874dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1875dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1876dcfb333aSDavid Wu 
1877dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1878dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1879dcfb333aSDavid Wu 	};
1880dcfb333aSDavid Wu 
1881dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1882dcfb333aSDavid Wu 
1883dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1884dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1885dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1886dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1887dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1888dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1889dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1890dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1891dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1892dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1893dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1894dcfb333aSDavid Wu 
1895dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1896dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1897dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1898c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) |
1899c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT));
1900dcfb333aSDavid Wu 
1901dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1902dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1903dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1904c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) |
1905c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT));
1906dcfb333aSDavid Wu }
19076f0a52e9SDavid Wu #endif
19080a33ce65SDavid Wu 
1909bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1910*bcf26c57SDavid Wu static void rk3506_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1911*bcf26c57SDavid Wu {
1912*bcf26c57SDavid Wu 	struct rk3506_grf_reg *grf;
1913*bcf26c57SDavid Wu 	unsigned int val;
1914*bcf26c57SDavid Wu 
1915*bcf26c57SDavid Wu 	enum {
1916*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_SHIFT = 5,
1917*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_MASK = BIT(5),
1918*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_CRU = 0,
1919*bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_IO = BIT(5),
1920*bcf26c57SDavid Wu 	};
1921*bcf26c57SDavid Wu 
1922*bcf26c57SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1923*bcf26c57SDavid Wu 
1924*bcf26c57SDavid Wu 	val = pdata->clock_input ? RK3506_GMAC_CLK_SELET_IO :
1925*bcf26c57SDavid Wu 				   RK3506_GMAC_CLK_SELET_CRU;
1926*bcf26c57SDavid Wu 
1927*bcf26c57SDavid Wu 	if (pdata->bus_id)
1928*bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_SELET_MASK, val);
1929*bcf26c57SDavid Wu 	else
1930*bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_SELET_MASK, val);
1931*bcf26c57SDavid Wu }
1932*bcf26c57SDavid Wu 
1933c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1934c563400aSDavid Wu {
1935c563400aSDavid Wu 	struct rk3528_grf *grf;
1936c563400aSDavid Wu 	unsigned int val;
1937c563400aSDavid Wu 
1938c563400aSDavid Wu 	enum {
1939c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_SHIFT = 0x12,
1940c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_MASK = BIT(12),
1941c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_CRU = 0,
1942c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_IO = BIT(12),
1943c563400aSDavid Wu 	};
1944c563400aSDavid Wu 
1945c563400aSDavid Wu 	if (!pdata->bus_id)
1946c563400aSDavid Wu 		return;
1947c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1948c563400aSDavid Wu 
1949c563400aSDavid Wu 	val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO :
1950c563400aSDavid Wu 				   RK3528_GMAC1_CLK_SELET_CRU;
1951c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val);
1952c563400aSDavid Wu }
1953c563400aSDavid Wu 
195483f30531SDavid Wu static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata)
195583f30531SDavid Wu {
195683f30531SDavid Wu 	struct rk3562_grf *grf;
195783f30531SDavid Wu 	struct rk3562_ioc *ioc;
195883f30531SDavid Wu 	unsigned int val;
195983f30531SDavid Wu 
196083f30531SDavid Wu 	enum {
196183f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_SHIFT = 0x9,
196283f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_MASK = BIT(9),
196383f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_CRU = 0,
196483f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_IO = BIT(9),
196583f30531SDavid Wu 	};
196683f30531SDavid Wu 
196783f30531SDavid Wu 	enum {
196883f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_SHIFT = 15,
196983f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_MASK = BIT(15),
197083f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_CRU = 0,
197183f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_IO = BIT(15),
197283f30531SDavid Wu 	};
197383f30531SDavid Wu 
197483f30531SDavid Wu 	enum {
197583f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2,
197683f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2),
197783f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0,
197883f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2),
197983f30531SDavid Wu 	};
198083f30531SDavid Wu 
198183f30531SDavid Wu 	enum {
198283f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3,
198383f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3),
198483f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0,
198583f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3),
198683f30531SDavid Wu 	};
198783f30531SDavid Wu 
198883f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
198983f30531SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
199083f30531SDavid Wu 
199183f30531SDavid Wu 	if (!pdata->bus_id) {
199283f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO :
199383f30531SDavid Wu 					   RK3562_GMAC0_CLK_SELET_CRU;
199483f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val);
199583f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO :
199683f30531SDavid Wu 					   RK3562_GMAC0_IO_EXTCLK_SELET_CRU;
199783f30531SDavid Wu 		rk_clrsetreg(&ioc->mac1_io_con1,
199883f30531SDavid Wu 			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
199983f30531SDavid Wu 		rk_clrsetreg(&ioc->mac0_io_con1,
200083f30531SDavid Wu 			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
200183f30531SDavid Wu 
200283f30531SDavid Wu 	} else {
200383f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO :
200483f30531SDavid Wu 					   RK3562_GMAC1_CLK_SELET_CRU;
200583f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val);
200683f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO :
200783f30531SDavid Wu 					   RK3562_GMAC1_IO_EXTCLK_SELET_CRU;
200883f30531SDavid Wu 		rk_clrsetreg(&ioc->mac1_io_con1,
200983f30531SDavid Wu 			     RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val);
201083f30531SDavid Wu 	}
201183f30531SDavid Wu }
201283f30531SDavid Wu 
2013bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
2014bf0e94d0SDavid Wu {
2015bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
2016bf0e94d0SDavid Wu 	unsigned int val, mask;
2017bf0e94d0SDavid Wu 
2018bf0e94d0SDavid Wu 	enum {
2019bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
2020bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
2021bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
2022bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
2023bf0e94d0SDavid Wu 	};
2024bf0e94d0SDavid Wu 
2025bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
2026bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
2027bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
2028bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
2029bf0e94d0SDavid Wu 
2030bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
2031bf0e94d0SDavid Wu 		val <<= 5;
2032bf0e94d0SDavid Wu 		mask <<= 5;
2033bf0e94d0SDavid Wu 	}
2034bf0e94d0SDavid Wu 
2035bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
2036bf0e94d0SDavid Wu }
2037bf0e94d0SDavid Wu #endif
2038bf0e94d0SDavid Wu 
20390125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
20400125bcf0SSjoerd Simons {
20410125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
20421f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
20431f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
20446f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
20456f0a52e9SDavid Wu 	struct eqos_config *config;
20466f0a52e9SDavid Wu #else
20476f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
20486f0a52e9SDavid Wu #endif
20496f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
20500125bcf0SSjoerd Simons 	struct clk clk;
20510a33ce65SDavid Wu 	ulong rate;
20520125bcf0SSjoerd Simons 	int ret;
20530125bcf0SSjoerd Simons 
20546f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
20556f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
20566f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
2057befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
20586f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
20596f0a52e9SDavid Wu #else
20606f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
20616f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
20626f0a52e9SDavid Wu #endif
206333a014bdSDavid Wu 	pdata->bus_id = dev->seq;
206454f7ad44SDavid Wu 
2065cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
2066cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
2067cadc8d74SKever Yang 	if (ret)
2068cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
2069cadc8d74SKever Yang 
20700125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
20710125bcf0SSjoerd Simons 	if (ret)
2072745dad46SDavid Wu 		debug("%s clk_get_by_index failed %d\n", __func__, ret);
20730125bcf0SSjoerd Simons 
2074491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
2075491f3bfbSDavid Wu 
2076bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
2077bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
2078bf0e94d0SDavid Wu 
2079491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
2080491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
2081491f3bfbSDavid Wu 
20820a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
20830a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
2084bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
20850a33ce65SDavid Wu 		/*
20860a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
20870a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
20880a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
20890a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
20900a33ce65SDavid Wu 		 */
20910a33ce65SDavid Wu 		if (!pdata->clock_input) {
2092745dad46SDavid Wu 			if (clk.id) {
20930a33ce65SDavid Wu 				rate = clk_set_rate(&clk, 125000000);
20940a33ce65SDavid Wu 				if (rate != 125000000)
20950a33ce65SDavid Wu 					return -EINVAL;
20960a33ce65SDavid Wu 			}
2097745dad46SDavid Wu 		}
20980125bcf0SSjoerd Simons 
2099bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
2100bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
2101bf0e94d0SDavid Wu 
21020125bcf0SSjoerd Simons 		/* Set to RGMII mode */
21030a33ce65SDavid Wu 		if (ops->set_to_rgmii)
21041f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
21050a33ce65SDavid Wu 		else
21060a33ce65SDavid Wu 			return -EPERM;
21070a33ce65SDavid Wu 
21080a33ce65SDavid Wu 		break;
21090a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
21100a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
21110a33ce65SDavid Wu 		if (!pdata->clock_input) {
2112*bcf26c57SDavid Wu 			printf("%s line: %d\n", __func__, __LINE__);
2113745dad46SDavid Wu 			if (clk.id) {
21140a33ce65SDavid Wu 				rate = clk_set_rate(&clk, 50000000);
2115*bcf26c57SDavid Wu 				printf("%s line: %d\n", __func__, __LINE__);
21160a33ce65SDavid Wu 				if (rate != 50000000)
21170a33ce65SDavid Wu 					return -EINVAL;
21180a33ce65SDavid Wu 			}
2119745dad46SDavid Wu 		}
21200a33ce65SDavid Wu 
21210a33ce65SDavid Wu 		/* Set to RMII mode */
21220a33ce65SDavid Wu 		if (ops->set_to_rmii)
21230a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
21240a33ce65SDavid Wu 
21250a33ce65SDavid Wu 		break;
21260a33ce65SDavid Wu 	default:
21270a33ce65SDavid Wu 		debug("NO interface defined!\n");
21280a33ce65SDavid Wu 		return -ENXIO;
21290a33ce65SDavid Wu 	}
21300125bcf0SSjoerd Simons 
21316f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21326f0a52e9SDavid Wu 	return eqos_probe(dev);
21336f0a52e9SDavid Wu #else
21340125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
21356f0a52e9SDavid Wu #endif
21366f0a52e9SDavid Wu }
21376f0a52e9SDavid Wu 
21386f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
21396f0a52e9SDavid Wu {
21406f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
21416f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
21426f0a52e9SDavid Wu #else
21436f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
21446f0a52e9SDavid Wu #endif
21456f0a52e9SDavid Wu }
21466f0a52e9SDavid Wu 
21476f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
21486f0a52e9SDavid Wu 				      int length)
21496f0a52e9SDavid Wu {
21506f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21516f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
21526f0a52e9SDavid Wu #else
21536f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
21546f0a52e9SDavid Wu #endif
21556f0a52e9SDavid Wu }
21566f0a52e9SDavid Wu 
21576f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
21586f0a52e9SDavid Wu 				  int length)
21596f0a52e9SDavid Wu {
21606f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21616f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
21626f0a52e9SDavid Wu #else
21636f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
21646f0a52e9SDavid Wu #endif
21656f0a52e9SDavid Wu }
21666f0a52e9SDavid Wu 
21676f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
21686f0a52e9SDavid Wu 				  uchar **packetp)
21696f0a52e9SDavid Wu {
21706f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21716f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
21726f0a52e9SDavid Wu #else
21736f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
21746f0a52e9SDavid Wu #endif
21750125bcf0SSjoerd Simons }
21760125bcf0SSjoerd Simons 
21770125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
21780125bcf0SSjoerd Simons {
21796f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
21801f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
21811f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
21826f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
2183491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
21846f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
21856f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
21866f0a52e9SDavid Wu #endif
21870125bcf0SSjoerd Simons 	int ret;
21880125bcf0SSjoerd Simons 
21896f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21906f0a52e9SDavid Wu 	ret = eqos_init(dev);
21916f0a52e9SDavid Wu #else
21926f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
21936f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
21946f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
21956f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
21966f0a52e9SDavid Wu #endif
21970125bcf0SSjoerd Simons 	if (ret)
21980125bcf0SSjoerd Simons 		return ret;
2199491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
22000125bcf0SSjoerd Simons 	if (ret)
22010125bcf0SSjoerd Simons 		return ret;
22026f0a52e9SDavid Wu 
22036f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
22046f0a52e9SDavid Wu 	eqos_enable(dev);
22056f0a52e9SDavid Wu #else
22066f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
22070125bcf0SSjoerd Simons 	if (ret)
22080125bcf0SSjoerd Simons 		return ret;
22096f0a52e9SDavid Wu #endif
22100125bcf0SSjoerd Simons 
22110125bcf0SSjoerd Simons 	return 0;
22120125bcf0SSjoerd Simons }
22130125bcf0SSjoerd Simons 
22146f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
22156f0a52e9SDavid Wu {
22166f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
22176f0a52e9SDavid Wu 	eqos_stop(dev);
22186f0a52e9SDavid Wu #else
22196f0a52e9SDavid Wu 	designware_eth_stop(dev);
22206f0a52e9SDavid Wu #endif
22216f0a52e9SDavid Wu }
22226f0a52e9SDavid Wu 
22230125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
22240125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
22256f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
22266f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
22276f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
22286f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
22296f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
22300125bcf0SSjoerd Simons };
22310125bcf0SSjoerd Simons 
22326f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
223318ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
223418ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
223518ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
223618ae91c8SDavid Wu };
223718ae91c8SDavid Wu 
2238ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
2239ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
2240ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
2241ff86648dSDavid Wu };
2242ff86648dSDavid Wu 
2243af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
2244af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
2245491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
2246af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
2247491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
2248af166ffaSDavid Wu };
2249af166ffaSDavid Wu 
22501f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
22511f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
22521f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
22531f08aa1cSPhilipp Tomsich };
22541f08aa1cSPhilipp Tomsich 
225523adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
225623adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
225723adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
225823adb58fSDavid Wu };
225923adb58fSDavid Wu 
2260c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
2261c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
2262491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
2263c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
2264491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
2265c36b26c0SDavid Wu };
2266c36b26c0SDavid Wu 
2267793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
2268793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
2269793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
2270793f2fd2SPhilipp Tomsich };
2271793f2fd2SPhilipp Tomsich 
22721f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
22731f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
22741f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
22751f08aa1cSPhilipp Tomsich };
22761f08aa1cSPhilipp Tomsich 
22770a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
22780a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
22790a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
22800a33ce65SDavid Wu };
2281dcfb333aSDavid Wu #else
2282*bcf26c57SDavid Wu const struct rk_gmac_ops rk3506_gmac_ops = {
2283*bcf26c57SDavid Wu 	.fix_mac_speed = rk3506_set_rmii_speed,
2284*bcf26c57SDavid Wu 	.set_to_rmii = rk3506_set_to_rmii,
2285*bcf26c57SDavid Wu 	.set_clock_selection = rk3506_set_clock_selection,
2286*bcf26c57SDavid Wu };
2287*bcf26c57SDavid Wu 
2288c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = {
2289c563400aSDavid Wu 	.fix_mac_speed = rk3528_set_rgmii_speed,
2290c563400aSDavid Wu 	.set_to_rgmii = rk3528_set_to_rgmii,
2291c563400aSDavid Wu 	.set_to_rmii = rk3528_set_to_rmii,
2292c563400aSDavid Wu 	.set_clock_selection = rk3528_set_clock_selection,
2293c563400aSDavid Wu 	.integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup,
2294c563400aSDavid Wu };
2295c563400aSDavid Wu 
229683f30531SDavid Wu const struct rk_gmac_ops rk3562_gmac_ops = {
229783f30531SDavid Wu 	.fix_mac_speed = rk3562_set_gmac_speed,
229883f30531SDavid Wu 	.set_to_rgmii = rk3562_set_to_rgmii,
229983f30531SDavid Wu 	.set_to_rmii = rk3562_set_to_rmii,
230083f30531SDavid Wu 	.set_clock_selection = rk3562_set_clock_selection,
230183f30531SDavid Wu };
230283f30531SDavid Wu 
230333a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
230433a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
230533a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
230633a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
230733a014bdSDavid Wu };
230833a014bdSDavid Wu 
2309bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
2310bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
2311bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
2312bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
2313bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
2314bf0e94d0SDavid Wu };
2315bf0e94d0SDavid Wu 
2316745dad46SDavid Wu const struct rk_gmac_ops rv1103b_gmac_ops = {
2317745dad46SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
2318745dad46SDavid Wu 	.set_to_rmii = rv1103b_set_to_rmii,
2319745dad46SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
2320745dad46SDavid Wu };
2321745dad46SDavid Wu 
232220bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = {
232320bef841SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
23248bafa3a1SDavid Wu 	.set_to_rmii = rv1106_set_to_rmii,
232520bef841SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
232620bef841SDavid Wu };
232720bef841SDavid Wu 
2328dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
2329dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
2330dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
2331e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
2332dcfb333aSDavid Wu };
23336f0a52e9SDavid Wu #endif
23340a33ce65SDavid Wu 
23350125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
23366f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
233784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
233818ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
233918ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
234084e90485SDavid Wu #endif
234184e90485SDavid Wu 
234284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
2343ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
2344ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
234584e90485SDavid Wu #endif
234684e90485SDavid Wu 
234784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
2348af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
2349af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
235084e90485SDavid Wu #endif
235184e90485SDavid Wu 
235284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
23531f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
23541f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
235584e90485SDavid Wu #endif
235684e90485SDavid Wu 
235784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
235823adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
235923adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
236084e90485SDavid Wu #endif
236184e90485SDavid Wu 
236284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
2363c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
2364c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
236584e90485SDavid Wu #endif
236684e90485SDavid Wu 
236784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
2368793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
2369793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
237084e90485SDavid Wu #endif
237184e90485SDavid Wu 
237284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
23731f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
23741f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
237584e90485SDavid Wu #endif
237684e90485SDavid Wu 
237784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
23780a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
23790a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
238084e90485SDavid Wu #endif
2381dcfb333aSDavid Wu #else
2382*bcf26c57SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3506
2383*bcf26c57SDavid Wu 	{ .compatible = "rockchip,rk3506-gmac",
2384*bcf26c57SDavid Wu 	  .data = (ulong)&rk3506_gmac_ops },
2385*bcf26c57SDavid Wu #endif
2386*bcf26c57SDavid Wu 
2387c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528
2388c563400aSDavid Wu 	{ .compatible = "rockchip,rk3528-gmac",
2389c563400aSDavid Wu 	  .data = (ulong)&rk3528_gmac_ops },
2390c563400aSDavid Wu #endif
2391c563400aSDavid Wu 
239283f30531SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3562
239383f30531SDavid Wu 	{ .compatible = "rockchip,rk3562-gmac",
239483f30531SDavid Wu 	  .data = (ulong)&rk3562_gmac_ops },
239583f30531SDavid Wu #endif
239683f30531SDavid Wu 
239784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
239833a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
239933a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
240084e90485SDavid Wu #endif
240184e90485SDavid Wu 
2402bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
2403bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
2404bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
2405bf0e94d0SDavid Wu #endif
2406bf0e94d0SDavid Wu 
2407745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B
2408745dad46SDavid Wu 	{ .compatible = "rockchip,rv1103b-gmac",
2409745dad46SDavid Wu 	  .data = (ulong)&rv1103b_gmac_ops },
2410745dad46SDavid Wu #endif
2411745dad46SDavid Wu 
241220bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106
241320bef841SDavid Wu 	{ .compatible = "rockchip,rv1106-gmac",
241420bef841SDavid Wu 	  .data = (ulong)&rv1106_gmac_ops },
241520bef841SDavid Wu #endif
241620bef841SDavid Wu 
241784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
2418dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
2419dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
24206f0a52e9SDavid Wu #endif
242184e90485SDavid Wu #endif
24220125bcf0SSjoerd Simons 	{ }
24230125bcf0SSjoerd Simons };
24240125bcf0SSjoerd Simons 
24250125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
24260125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
24270125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
24280125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
24290125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
24300125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
24310125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
24326f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
24330125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
24340125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
24350125bcf0SSjoerd Simons };
2436