xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision a116113dcd78d29eee847334543457a59cd9e95c)
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>
120125bcf0SSjoerd Simons #include <phy.h>
13491f3bfbSDavid Wu #include <reset.h>
140125bcf0SSjoerd Simons #include <syscon.h>
150125bcf0SSjoerd Simons #include <asm/io.h>
160125bcf0SSjoerd Simons #include <asm/arch/periph.h>
170125bcf0SSjoerd Simons #include <asm/arch/clock.h>
181f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h>
196f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
2033a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
21bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
22dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
236f0a52e9SDavid Wu #include "dwc_eth_qos.h"
246f0a52e9SDavid Wu #else
2518ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
26ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
27af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
280125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
2923adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
30c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
31793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
321f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
330a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
340125bcf0SSjoerd Simons #include "designware.h"
356f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
366f0a52e9SDavid Wu #endif
376f0a52e9SDavid Wu #include <dm/pinctrl.h>
38491f3bfbSDavid Wu #include <dm/of_access.h>
390125bcf0SSjoerd Simons 
400125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
410125bcf0SSjoerd Simons 
426f0a52e9SDavid Wu struct rockchip_eth_dev {
436f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
446f0a52e9SDavid Wu 	struct eqos_priv eqos;
456f0a52e9SDavid Wu #else
466f0a52e9SDavid Wu 	struct dw_eth_dev dw;
476f0a52e9SDavid Wu #endif
48491f3bfbSDavid Wu 	int phy_interface;
496f0a52e9SDavid Wu };
506f0a52e9SDavid Wu 
510125bcf0SSjoerd Simons /*
520125bcf0SSjoerd Simons  * Platform data for the gmac
530125bcf0SSjoerd Simons  *
540125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
550125bcf0SSjoerd Simons  */
560125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
576f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
580125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
596f0a52e9SDavid Wu #else
606f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
616f0a52e9SDavid Wu #endif
62491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
63491f3bfbSDavid Wu 	bool integrated_phy;
640a33ce65SDavid Wu 	bool clock_input;
65491f3bfbSDavid Wu 	int phy_interface;
660125bcf0SSjoerd Simons 	int tx_delay;
670125bcf0SSjoerd Simons 	int rx_delay;
6833a014bdSDavid Wu 	int bus_id;
690125bcf0SSjoerd Simons };
700125bcf0SSjoerd Simons 
711f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
726f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
736f0a52e9SDavid Wu 	const struct eqos_config config;
746f0a52e9SDavid Wu #endif
75491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
76491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
770a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
781f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
79bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
80491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
811f08aa1cSPhilipp Tomsich };
821f08aa1cSPhilipp Tomsich 
83befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
84befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
85befcb627SDavid Wu 	.reg_access_always_ok = false,
86befcb627SDavid Wu 	.mdio_wait = 10000,
87befcb627SDavid Wu 	.swr_wait = 200,
88befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
89befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
90befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
91befcb627SDavid Wu };
92befcb627SDavid Wu #endif
93befcb627SDavid Wu 
941eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
951eb9d064SDavid Wu {
961eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
971eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
981eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
991eb9d064SDavid Wu 
1001eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1011eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1021eb9d064SDavid Wu 
1031eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1041eb9d064SDavid Wu }
1051f08aa1cSPhilipp Tomsich 
1060125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1070125bcf0SSjoerd Simons {
1080125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
109491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
1100a33ce65SDavid Wu 	const char *string;
111491f3bfbSDavid Wu 	int ret;
1120a33ce65SDavid Wu 
1130a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1140a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1150a33ce65SDavid Wu 		pdata->clock_input = true;
1160a33ce65SDavid Wu 	else
1170a33ce65SDavid Wu 		pdata->clock_input = false;
1180125bcf0SSjoerd Simons 
119491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
120491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
121491f3bfbSDavid Wu 	if (ret) {
122491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
123491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
124491f3bfbSDavid Wu 	} else {
125491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
126491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
127491f3bfbSDavid Wu 							 "phy-is-integrated");
128491f3bfbSDavid Wu 	}
129491f3bfbSDavid Wu 
130491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
131491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
132491f3bfbSDavid Wu 		if (ret) {
133491f3bfbSDavid Wu 			debug("No PHY reset control found: ret=%d\n", ret);
134491f3bfbSDavid Wu 			return ret;
135491f3bfbSDavid Wu 		}
136491f3bfbSDavid Wu 	}
137491f3bfbSDavid Wu 
1381f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1397ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1407ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1411f08aa1cSPhilipp Tomsich 
1421f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1431f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1447ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1451f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1467ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1470125bcf0SSjoerd Simons 
1486f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1496f0a52e9SDavid Wu 	return 0;
1506f0a52e9SDavid Wu #else
1510125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1526f0a52e9SDavid Wu #endif
1530125bcf0SSjoerd Simons }
1540125bcf0SSjoerd Simons 
1556f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
156491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
157491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
15818ae91c8SDavid Wu {
1596f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
16018ae91c8SDavid Wu 	struct px30_grf *grf;
16118ae91c8SDavid Wu 	struct clk clk_speed;
16218ae91c8SDavid Wu 	int speed, ret;
16318ae91c8SDavid Wu 	enum {
16418ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
16518ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
16618ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
16718ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
16818ae91c8SDavid Wu 	};
16918ae91c8SDavid Wu 
17018ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
17118ae91c8SDavid Wu 			      &clk_speed);
17218ae91c8SDavid Wu 	if (ret)
17318ae91c8SDavid Wu 		return ret;
17418ae91c8SDavid Wu 
17518ae91c8SDavid Wu 	switch (priv->phydev->speed) {
17618ae91c8SDavid Wu 	case 10:
17718ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
17818ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
17918ae91c8SDavid Wu 		if (ret)
18018ae91c8SDavid Wu 			return ret;
18118ae91c8SDavid Wu 		break;
18218ae91c8SDavid Wu 	case 100:
18318ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
18418ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
18518ae91c8SDavid Wu 		if (ret)
18618ae91c8SDavid Wu 			return ret;
18718ae91c8SDavid Wu 		break;
18818ae91c8SDavid Wu 	default:
18918ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
19018ae91c8SDavid Wu 		return -EINVAL;
19118ae91c8SDavid Wu 	}
19218ae91c8SDavid Wu 
19318ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
19418ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
19518ae91c8SDavid Wu 
19618ae91c8SDavid Wu 	return 0;
19718ae91c8SDavid Wu }
19818ae91c8SDavid Wu 
199491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
200491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
201ff86648dSDavid Wu {
2026f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
203ff86648dSDavid Wu 	struct clk clk_speed;
204ff86648dSDavid Wu 	int ret;
205ff86648dSDavid Wu 
206ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
207ff86648dSDavid Wu 			      &clk_speed);
208ff86648dSDavid Wu 	if (ret)
209ff86648dSDavid Wu 		return ret;
210ff86648dSDavid Wu 
211ff86648dSDavid Wu 	switch (priv->phydev->speed) {
212ff86648dSDavid Wu 	case 10:
213ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
214ff86648dSDavid Wu 		if (ret)
215ff86648dSDavid Wu 			return ret;
216ff86648dSDavid Wu 		break;
217ff86648dSDavid Wu 	case 100:
218ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
219ff86648dSDavid Wu 		if (ret)
220ff86648dSDavid Wu 			return ret;
221ff86648dSDavid Wu 		break;
222ff86648dSDavid Wu 	case 1000:
223ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
224ff86648dSDavid Wu 		if (ret)
225ff86648dSDavid Wu 			return ret;
226ff86648dSDavid Wu 		break;
227ff86648dSDavid Wu 	default:
228ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
229ff86648dSDavid Wu 		return -EINVAL;
230ff86648dSDavid Wu 	}
231ff86648dSDavid Wu 
232ff86648dSDavid Wu 	return 0;
233ff86648dSDavid Wu }
234ff86648dSDavid Wu 
235491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
236491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
237af166ffaSDavid Wu {
2386f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
239af166ffaSDavid Wu 	struct rk322x_grf *grf;
240af166ffaSDavid Wu 	int clk;
241af166ffaSDavid Wu 	enum {
242af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
243af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
244af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
245af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
246af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
247491f3bfbSDavid Wu 
248491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
249491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
250491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
251491f3bfbSDavid Wu 
252491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
253491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
254491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
255af166ffaSDavid Wu 	};
256af166ffaSDavid Wu 
257af166ffaSDavid Wu 	switch (priv->phydev->speed) {
258af166ffaSDavid Wu 	case 10:
259491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
260491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
261491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
262af166ffaSDavid Wu 		break;
263af166ffaSDavid Wu 	case 100:
264491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
265491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
266491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
267af166ffaSDavid Wu 		break;
268af166ffaSDavid Wu 	case 1000:
269af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
270af166ffaSDavid Wu 		break;
271af166ffaSDavid Wu 	default:
272af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
273af166ffaSDavid Wu 		return -EINVAL;
274af166ffaSDavid Wu 	}
275af166ffaSDavid Wu 
276af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
277491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
278491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
279491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
280491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
281491f3bfbSDavid Wu 		     clk);
282af166ffaSDavid Wu 
283af166ffaSDavid Wu 	return 0;
284af166ffaSDavid Wu }
285af166ffaSDavid Wu 
286491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
287491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
2880125bcf0SSjoerd Simons {
2896f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
2900125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
2910125bcf0SSjoerd Simons 	int clk;
2920125bcf0SSjoerd Simons 
2930125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
2940125bcf0SSjoerd Simons 	case 10:
2951f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
2960125bcf0SSjoerd Simons 		break;
2970125bcf0SSjoerd Simons 	case 100:
2981f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
2990125bcf0SSjoerd Simons 		break;
3000125bcf0SSjoerd Simons 	case 1000:
3011f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3020125bcf0SSjoerd Simons 		break;
3030125bcf0SSjoerd Simons 	default:
3040125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3050125bcf0SSjoerd Simons 		return -EINVAL;
3060125bcf0SSjoerd Simons 	}
3070125bcf0SSjoerd Simons 
3080125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3091f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3100125bcf0SSjoerd Simons 
3110125bcf0SSjoerd Simons 	return 0;
3120125bcf0SSjoerd Simons }
3130125bcf0SSjoerd Simons 
314491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
315491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
31623adb58fSDavid Wu {
3176f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
31823adb58fSDavid Wu 	struct rk3308_grf *grf;
31923adb58fSDavid Wu 	struct clk clk_speed;
32023adb58fSDavid Wu 	int speed, ret;
32123adb58fSDavid Wu 	enum {
32223adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
32323adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
32423adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
32523adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
32623adb58fSDavid Wu 	};
32723adb58fSDavid Wu 
32823adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
32923adb58fSDavid Wu 			      &clk_speed);
33023adb58fSDavid Wu 	if (ret)
33123adb58fSDavid Wu 		return ret;
33223adb58fSDavid Wu 
33323adb58fSDavid Wu 	switch (priv->phydev->speed) {
33423adb58fSDavid Wu 	case 10:
33523adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
33623adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
33723adb58fSDavid Wu 		if (ret)
33823adb58fSDavid Wu 			return ret;
33923adb58fSDavid Wu 		break;
34023adb58fSDavid Wu 	case 100:
34123adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
34223adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
34323adb58fSDavid Wu 		if (ret)
34423adb58fSDavid Wu 			return ret;
34523adb58fSDavid Wu 		break;
34623adb58fSDavid Wu 	default:
34723adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
34823adb58fSDavid Wu 		return -EINVAL;
34923adb58fSDavid Wu 	}
35023adb58fSDavid Wu 
35123adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
35223adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
35323adb58fSDavid Wu 
35423adb58fSDavid Wu 	return 0;
35523adb58fSDavid Wu }
35623adb58fSDavid Wu 
357491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
358491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
359c36b26c0SDavid Wu {
3606f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
361c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
362c36b26c0SDavid Wu 	int clk;
363c36b26c0SDavid Wu 	enum {
364c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
365c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
366c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
367c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
368c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
369491f3bfbSDavid Wu 
370491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
371491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
372491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
373491f3bfbSDavid Wu 
374491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
375491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
376491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
377c36b26c0SDavid Wu 	};
378c36b26c0SDavid Wu 
379c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
380c36b26c0SDavid Wu 	case 10:
381491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
382491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
383491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
384c36b26c0SDavid Wu 		break;
385c36b26c0SDavid Wu 	case 100:
386491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
387491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
388491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
389c36b26c0SDavid Wu 		break;
390c36b26c0SDavid Wu 	case 1000:
391c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
392c36b26c0SDavid Wu 		break;
393c36b26c0SDavid Wu 	default:
394c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
395c36b26c0SDavid Wu 		return -EINVAL;
396c36b26c0SDavid Wu 	}
397c36b26c0SDavid Wu 
398c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
399491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
400491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
401491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
402491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
403491f3bfbSDavid Wu 		     clk);
404c36b26c0SDavid Wu 
405c36b26c0SDavid Wu 	return 0;
406c36b26c0SDavid Wu }
407c36b26c0SDavid Wu 
408491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
409491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
410793f2fd2SPhilipp Tomsich {
4116f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
412793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
413793f2fd2SPhilipp Tomsich 	int clk;
414793f2fd2SPhilipp Tomsich 	enum {
415793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
416793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
417793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
418793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
419793f2fd2SPhilipp Tomsich 	};
420793f2fd2SPhilipp Tomsich 
421793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
422793f2fd2SPhilipp Tomsich 	case 10:
423793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
424793f2fd2SPhilipp Tomsich 		break;
425793f2fd2SPhilipp Tomsich 	case 100:
426793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
427793f2fd2SPhilipp Tomsich 		break;
428793f2fd2SPhilipp Tomsich 	case 1000:
429793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
430793f2fd2SPhilipp Tomsich 		break;
431793f2fd2SPhilipp Tomsich 	default:
432793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
433793f2fd2SPhilipp Tomsich 		return -EINVAL;
434793f2fd2SPhilipp Tomsich 	}
435793f2fd2SPhilipp Tomsich 
436793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
437793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
438793f2fd2SPhilipp Tomsich 
439793f2fd2SPhilipp Tomsich 	return 0;
440793f2fd2SPhilipp Tomsich }
441793f2fd2SPhilipp Tomsich 
442491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
443491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4441f08aa1cSPhilipp Tomsich {
4456f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4461f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4471f08aa1cSPhilipp Tomsich 	int clk;
4481f08aa1cSPhilipp Tomsich 
4491f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4501f08aa1cSPhilipp Tomsich 	case 10:
4511f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4521f08aa1cSPhilipp Tomsich 		break;
4531f08aa1cSPhilipp Tomsich 	case 100:
4541f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4551f08aa1cSPhilipp Tomsich 		break;
4561f08aa1cSPhilipp Tomsich 	case 1000:
4571f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4581f08aa1cSPhilipp Tomsich 		break;
4591f08aa1cSPhilipp Tomsich 	default:
4601f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4611f08aa1cSPhilipp Tomsich 		return -EINVAL;
4621f08aa1cSPhilipp Tomsich 	}
4631f08aa1cSPhilipp Tomsich 
4641f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4651f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4661f08aa1cSPhilipp Tomsich 
4671f08aa1cSPhilipp Tomsich 	return 0;
4681f08aa1cSPhilipp Tomsich }
4691f08aa1cSPhilipp Tomsich 
470491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
471491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4720a33ce65SDavid Wu {
4736f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4740a33ce65SDavid Wu 	struct rv1108_grf *grf;
4750a33ce65SDavid Wu 	int clk, speed;
4760a33ce65SDavid Wu 	enum {
4770a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4780a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4790a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4800a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4810a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4820a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4830a33ce65SDavid Wu 	};
4840a33ce65SDavid Wu 
4850a33ce65SDavid Wu 	switch (priv->phydev->speed) {
4860a33ce65SDavid Wu 	case 10:
4870a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
4880a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
4890a33ce65SDavid Wu 		break;
4900a33ce65SDavid Wu 	case 100:
4910a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
4920a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
4930a33ce65SDavid Wu 		break;
4940a33ce65SDavid Wu 	default:
4950a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4960a33ce65SDavid Wu 		return -EINVAL;
4970a33ce65SDavid Wu 	}
4980a33ce65SDavid Wu 
4990a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5000a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5010a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5020a33ce65SDavid Wu 		     clk | speed);
5030a33ce65SDavid Wu 
5040a33ce65SDavid Wu 	return 0;
5050a33ce65SDavid Wu }
506dcfb333aSDavid Wu #else
507bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
508bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
509bf0e94d0SDavid Wu {
510bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
511bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
512bf0e94d0SDavid Wu 	unsigned int div, div_mask;
513bf0e94d0SDavid Wu 
514bf0e94d0SDavid Wu 	enum {
515bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
516bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
517bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
518*a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
519bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
520bf0e94d0SDavid Wu 		RK3588_GMA_CLK_RMII_DIV2 = BIT(2),
521bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
522bf0e94d0SDavid Wu 	};
523bf0e94d0SDavid Wu 
524bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
525bf0e94d0SDavid Wu 
526bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
527bf0e94d0SDavid Wu 	case 10:
528bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
529bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
530bf0e94d0SDavid Wu 		else
531bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
532bf0e94d0SDavid Wu 		break;
533bf0e94d0SDavid Wu 	case 100:
534bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
535bf0e94d0SDavid Wu 			div = RK3588_GMA_CLK_RMII_DIV2;
536bf0e94d0SDavid Wu 		else
537bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
538bf0e94d0SDavid Wu 		break;
539bf0e94d0SDavid Wu 	case 1000:
540bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
541bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
542bf0e94d0SDavid Wu 		else
543bf0e94d0SDavid Wu 			return -EINVAL;
544bf0e94d0SDavid Wu 		break;
545bf0e94d0SDavid Wu 	default:
546bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
547bf0e94d0SDavid Wu 		return -EINVAL;
548bf0e94d0SDavid Wu 	}
549bf0e94d0SDavid Wu 
550bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
551bf0e94d0SDavid Wu 		div <<= 5;
552bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
553bf0e94d0SDavid Wu 	}
554bf0e94d0SDavid Wu 
555bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
556bf0e94d0SDavid Wu 
557bf0e94d0SDavid Wu 	return 0;
558bf0e94d0SDavid Wu }
559bf0e94d0SDavid Wu 
560491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
561491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
562dcfb333aSDavid Wu {
563dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
564dcfb333aSDavid Wu 	struct clk clk_speed;
565dcfb333aSDavid Wu 	int ret;
566dcfb333aSDavid Wu 
567dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
568dcfb333aSDavid Wu 			      &clk_speed);
569dcfb333aSDavid Wu 	if (ret) {
57033a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
57133a014bdSDavid Wu 		       __func__, ret);
572dcfb333aSDavid Wu 		return ret;
573dcfb333aSDavid Wu 	}
574dcfb333aSDavid Wu 
575dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
576dcfb333aSDavid Wu 	case 10:
577dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
578dcfb333aSDavid Wu 		if (ret)
579dcfb333aSDavid Wu 			return ret;
580dcfb333aSDavid Wu 		break;
581dcfb333aSDavid Wu 	case 100:
582dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
583dcfb333aSDavid Wu 		if (ret)
584dcfb333aSDavid Wu 			return ret;
585dcfb333aSDavid Wu 		break;
586dcfb333aSDavid Wu 	case 1000:
587dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
588dcfb333aSDavid Wu 		if (ret)
589dcfb333aSDavid Wu 			return ret;
590dcfb333aSDavid Wu 		break;
591dcfb333aSDavid Wu 	default:
592dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
593dcfb333aSDavid Wu 		return -EINVAL;
594dcfb333aSDavid Wu 	}
595dcfb333aSDavid Wu 
596dcfb333aSDavid Wu 	return 0;
597dcfb333aSDavid Wu }
5986f0a52e9SDavid Wu #endif
5990a33ce65SDavid Wu 
6006f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
60118ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
60218ae91c8SDavid Wu {
60318ae91c8SDavid Wu 	struct px30_grf *grf;
60418ae91c8SDavid Wu 	enum {
60518ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
60618ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
60718ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
60818ae91c8SDavid Wu 	};
60918ae91c8SDavid Wu 
61018ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
61118ae91c8SDavid Wu 
61218ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
61318ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
61418ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
61518ae91c8SDavid Wu }
61618ae91c8SDavid Wu 
617ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
618ff86648dSDavid Wu {
619ff86648dSDavid Wu 	struct rk1808_grf *grf;
620ff86648dSDavid Wu 	enum {
621ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
622ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
623ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
624ff86648dSDavid Wu 
625ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
626ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
627ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
628ff86648dSDavid Wu 
629ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
630ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
631ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
632ff86648dSDavid Wu 	};
633ff86648dSDavid Wu 	enum {
634ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
635ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
636ff86648dSDavid Wu 
637ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
638ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
639ff86648dSDavid Wu 	};
640ff86648dSDavid Wu 
641ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
642ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
643ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
644ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
645ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
646ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
647ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
648ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
649ff86648dSDavid Wu 
650ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
651ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
652ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
653ff86648dSDavid Wu 		     pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT |
654ff86648dSDavid Wu 		     pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT);
655ff86648dSDavid Wu }
656ff86648dSDavid Wu 
657af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
658af166ffaSDavid Wu {
659af166ffaSDavid Wu 	struct rk322x_grf *grf;
660af166ffaSDavid Wu 	enum {
661af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
662af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
663af166ffaSDavid Wu 
664af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
665af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
666af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
667af166ffaSDavid Wu 
668af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
669af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
670af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
671af166ffaSDavid Wu 
672af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
673af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
674af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
675af166ffaSDavid Wu 	};
676af166ffaSDavid Wu 	enum {
677af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
678af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
679af166ffaSDavid Wu 
680af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
681af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
682af166ffaSDavid Wu 	};
683af166ffaSDavid Wu 
684af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
685af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
686af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
687af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
688af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
689af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
690af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
691af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
692af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
693af166ffaSDavid Wu 
694af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
695af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
696af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
697af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
698af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
699af166ffaSDavid Wu }
700af166ffaSDavid Wu 
701491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
702491f3bfbSDavid Wu {
703491f3bfbSDavid Wu 	struct rk322x_grf *grf;
704491f3bfbSDavid Wu 	enum {
705491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
706491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
707491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
708491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
709491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
710491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
711491f3bfbSDavid Wu 	};
712491f3bfbSDavid Wu 
713491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
714491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
715491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
716491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
717491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
718491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
719491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
720491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
721491f3bfbSDavid Wu }
722491f3bfbSDavid Wu 
7231f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
7241f08aa1cSPhilipp Tomsich {
7251f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
7261f08aa1cSPhilipp Tomsich 
7271f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
7281f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
7291f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
7301f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
7311f08aa1cSPhilipp Tomsich 
7321f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
7331f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
7341f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
7351f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
7361f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
7371f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
7381f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
7391f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
7401f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
7411f08aa1cSPhilipp Tomsich }
7421f08aa1cSPhilipp Tomsich 
74323adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
74423adb58fSDavid Wu {
74523adb58fSDavid Wu 	struct rk3308_grf *grf;
74623adb58fSDavid Wu 	enum {
74723adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
74823adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
74923adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
75023adb58fSDavid Wu 	};
75123adb58fSDavid Wu 
75223adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
75323adb58fSDavid Wu 
75423adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
75523adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
75623adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
75723adb58fSDavid Wu }
75823adb58fSDavid Wu 
759c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
760c36b26c0SDavid Wu {
761c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
762c36b26c0SDavid Wu 	enum {
763c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
764c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
765c36b26c0SDavid Wu 
766c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
767c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
768c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
769c36b26c0SDavid Wu 
770c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
771c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
772c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
773c36b26c0SDavid Wu 
774c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
775c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
776c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
777c36b26c0SDavid Wu 	};
778c36b26c0SDavid Wu 	enum {
779c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
780c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
781c36b26c0SDavid Wu 
782c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
783c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
784c36b26c0SDavid Wu 	};
785c36b26c0SDavid Wu 
786c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
787c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
788c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
789c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
790c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
791c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
792c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
793c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
794c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
795c36b26c0SDavid Wu 
796c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
797c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
798c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
799c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
800c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
801c36b26c0SDavid Wu }
802c36b26c0SDavid Wu 
803491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
804491f3bfbSDavid Wu {
805491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
806491f3bfbSDavid Wu 	enum {
807491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
808491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
809491f3bfbSDavid Wu 
810491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
811491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
812491f3bfbSDavid Wu 	};
813491f3bfbSDavid Wu 
814491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
815491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
816491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
817491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
818491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
819491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
820491f3bfbSDavid Wu }
821491f3bfbSDavid Wu 
822793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
823793f2fd2SPhilipp Tomsich {
824793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
825793f2fd2SPhilipp Tomsich 	enum {
826793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
827793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
828793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
829793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
830793f2fd2SPhilipp Tomsich 	};
831793f2fd2SPhilipp Tomsich 	enum {
832793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
833793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
834793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
835793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
836793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
837793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
838793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
839793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
840793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
841793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
842793f2fd2SPhilipp Tomsich 	};
843793f2fd2SPhilipp Tomsich 
844793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
845793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
846793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
847793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
848793f2fd2SPhilipp Tomsich 
849793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
850793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
851793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
852793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
853793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
854793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
855793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
856793f2fd2SPhilipp Tomsich 		     pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT |
857793f2fd2SPhilipp Tomsich 		     pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT);
858793f2fd2SPhilipp Tomsich }
859793f2fd2SPhilipp Tomsich 
8601f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
8611f08aa1cSPhilipp Tomsich {
8621f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
8631f08aa1cSPhilipp Tomsich 
8641f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
8651f08aa1cSPhilipp Tomsich 
8661f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
8671f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
8681f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
8691f08aa1cSPhilipp Tomsich 
8701f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
8711f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
8721f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
8731f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
8741f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
8751f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
8761f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
8771f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT |
8781f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT);
8791f08aa1cSPhilipp Tomsich }
8801f08aa1cSPhilipp Tomsich 
8810a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
8820a33ce65SDavid Wu {
8830a33ce65SDavid Wu 	struct rv1108_grf *grf;
8840a33ce65SDavid Wu 
8850a33ce65SDavid Wu 	enum {
8860a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
8870a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
8880a33ce65SDavid Wu 	};
8890a33ce65SDavid Wu 
8900a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
8910a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
8920a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
8930a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
8940a33ce65SDavid Wu }
895491f3bfbSDavid Wu 
896491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
897491f3bfbSDavid Wu {
898491f3bfbSDavid Wu 	struct rk322x_grf *grf;
899491f3bfbSDavid Wu 	enum {
900491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
901491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
902491f3bfbSDavid Wu 	};
903491f3bfbSDavid Wu 	enum {
904491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
905491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
906491f3bfbSDavid Wu 
907491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
908491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
909491f3bfbSDavid Wu 
910491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
911491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
912491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
913491f3bfbSDavid Wu 	};
914491f3bfbSDavid Wu 	enum {
915491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
916491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
917491f3bfbSDavid Wu 	};
918491f3bfbSDavid Wu 	enum {
919491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
920491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
921491f3bfbSDavid Wu 	};
922491f3bfbSDavid Wu 
923491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
924491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
925491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
926491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
927491f3bfbSDavid Wu 
928491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
929491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
930491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
931491f3bfbSDavid Wu 
932491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
933491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
934491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
935491f3bfbSDavid Wu 
936491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
937491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
938491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
939491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
940491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
941491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
942491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
943491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
944491f3bfbSDavid Wu 
945491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
946491f3bfbSDavid Wu 	udelay(10);
947491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
948491f3bfbSDavid Wu 	udelay(10);
949491f3bfbSDavid Wu 
950491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
951491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
952491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
953491f3bfbSDavid Wu 	udelay(30 * 1000);
954491f3bfbSDavid Wu }
955491f3bfbSDavid Wu 
956491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
957491f3bfbSDavid Wu {
958491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
959491f3bfbSDavid Wu 	enum {
960491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
961491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
962491f3bfbSDavid Wu 	};
963491f3bfbSDavid Wu 	enum {
964491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
965491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
966491f3bfbSDavid Wu 
967491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
968491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
969491f3bfbSDavid Wu 
970491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
971491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
972491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
973491f3bfbSDavid Wu 	};
974491f3bfbSDavid Wu 	enum {
975491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
976491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
977491f3bfbSDavid Wu 	};
978491f3bfbSDavid Wu 	enum {
979491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
980491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
981491f3bfbSDavid Wu 	};
982491f3bfbSDavid Wu 
983491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
984491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
985491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
986491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
987491f3bfbSDavid Wu 
988491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
989491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
990491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
991491f3bfbSDavid Wu 
992491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
993491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
994491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
995491f3bfbSDavid Wu 
996491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
997491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
998491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
999491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1000491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1001491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1002491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1003491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1004491f3bfbSDavid Wu 
1005491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1006491f3bfbSDavid Wu 	udelay(10);
1007491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1008491f3bfbSDavid Wu 	udelay(10);
1009491f3bfbSDavid Wu 
1010491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1011491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1012491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1013491f3bfbSDavid Wu 	udelay(30 * 1000);
1014491f3bfbSDavid Wu }
1015491f3bfbSDavid Wu 
1016dcfb333aSDavid Wu #else
101733a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
101833a014bdSDavid Wu {
101933a014bdSDavid Wu 	struct rk3568_grf *grf;
102033a014bdSDavid Wu 	void *con1;
102133a014bdSDavid Wu 
102233a014bdSDavid Wu 	enum {
102333a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
102433a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
102533a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
102633a014bdSDavid Wu 	};
102733a014bdSDavid Wu 
102833a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
102933a014bdSDavid Wu 
103033a014bdSDavid Wu 	if (pdata->bus_id == 1)
103133a014bdSDavid Wu 		con1 = &grf->mac1_con1;
103233a014bdSDavid Wu 	else
103333a014bdSDavid Wu 		con1 = &grf->mac0_con1;
103433a014bdSDavid Wu 
103533a014bdSDavid Wu 	rk_clrsetreg(con1,
103633a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
103733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
103833a014bdSDavid Wu }
103933a014bdSDavid Wu 
104033a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
104133a014bdSDavid Wu {
104233a014bdSDavid Wu 	struct rk3568_grf *grf;
104333a014bdSDavid Wu 	void *con0, *con1;
104433a014bdSDavid Wu 
104533a014bdSDavid Wu 	enum {
104633a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
104733a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
104833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
104933a014bdSDavid Wu 
105033a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
105133a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
105233a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
105333a014bdSDavid Wu 
105433a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
105533a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
105633a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
105733a014bdSDavid Wu 	};
105833a014bdSDavid Wu 
105933a014bdSDavid Wu 	enum {
106033a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
106133a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
106233a014bdSDavid Wu 
106333a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
106433a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
106533a014bdSDavid Wu 	};
106633a014bdSDavid Wu 
106733a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
106833a014bdSDavid Wu 
106933a014bdSDavid Wu 	if (pdata->bus_id == 1) {
107033a014bdSDavid Wu 		con0 = &grf->mac1_con0;
107133a014bdSDavid Wu 		con1 = &grf->mac1_con1;
107233a014bdSDavid Wu 	} else {
107333a014bdSDavid Wu 		con0 = &grf->mac0_con0;
107433a014bdSDavid Wu 		con1 = &grf->mac0_con1;
107533a014bdSDavid Wu 	}
107633a014bdSDavid Wu 
107733a014bdSDavid Wu 	rk_clrsetreg(con0,
107833a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
107933a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
108033a014bdSDavid Wu 		     pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT |
108133a014bdSDavid Wu 		     pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT);
108233a014bdSDavid Wu 
108333a014bdSDavid Wu 	rk_clrsetreg(con1,
108433a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
108533a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
108633a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
108733a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
108833a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
108933a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
109033a014bdSDavid Wu }
109133a014bdSDavid Wu 
1092bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1093bf0e94d0SDavid Wu {
1094bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1095bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1096bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1097bf0e94d0SDavid Wu 
1098bf0e94d0SDavid Wu 	enum {
1099bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1100bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1101bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1102bf0e94d0SDavid Wu 	};
1103bf0e94d0SDavid Wu 
1104bf0e94d0SDavid Wu 	enum {
1105bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1106bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1107bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1108bf0e94d0SDavid Wu 	};
1109bf0e94d0SDavid Wu 
1110bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1111bf0e94d0SDavid Wu 
1112bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1113bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1114bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1115bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1116bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1117bf0e94d0SDavid Wu 	} else {
1118bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1119bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1120bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1121bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1122bf0e94d0SDavid Wu 	}
1123bf0e94d0SDavid Wu 
1124bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1125bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1126bf0e94d0SDavid Wu }
1127bf0e94d0SDavid Wu 
1128bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1129bf0e94d0SDavid Wu {
1130bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1131bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1132bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1133bf0e94d0SDavid Wu 	unsigned int rx_delay;
1134bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1135bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1136bf0e94d0SDavid Wu 	void *offset_con;
1137bf0e94d0SDavid Wu 
1138bf0e94d0SDavid Wu 	enum {
1139bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1140bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1141bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1142bf0e94d0SDavid Wu 
1143bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1144bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1145bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1146bf0e94d0SDavid Wu 
1147bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1148bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1149bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1150bf0e94d0SDavid Wu 	};
1151bf0e94d0SDavid Wu 
1152bf0e94d0SDavid Wu 	enum {
1153bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1154bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1155bf0e94d0SDavid Wu 
1156bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1157bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1158bf0e94d0SDavid Wu 	};
1159bf0e94d0SDavid Wu 
1160bf0e94d0SDavid Wu 	enum {
1161bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1162bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1163bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1164bf0e94d0SDavid Wu 	};
1165bf0e94d0SDavid Wu 
1166bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1167bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1168bf0e94d0SDavid Wu 
1169bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1170bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1171bf0e94d0SDavid Wu 		rx_delay = 0;
1172bf0e94d0SDavid Wu 	} else {
1173bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1174bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1175bf0e94d0SDavid Wu 	}
1176bf0e94d0SDavid Wu 
1177bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1178bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1179bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1180bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1181bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1182bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1183bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1184bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1185bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1186bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1187bf0e94d0SDavid Wu 	} else {
1188bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1189bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1190bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1191bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1192bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1193bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1194bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1195bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1196bf0e94d0SDavid Wu 	}
1197bf0e94d0SDavid Wu 
1198bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1199bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1200bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1201bf0e94d0SDavid Wu 		     pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT |
1202bf0e94d0SDavid Wu 		     rx_delay);
1203bf0e94d0SDavid Wu 
1204bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1205bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1206bf0e94d0SDavid Wu 
1207bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1208bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1209bf0e94d0SDavid Wu }
1210bf0e94d0SDavid Wu 
1211e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1212e4e3f431SDavid Wu {
1213e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1214e4e3f431SDavid Wu 
1215e4e3f431SDavid Wu 	enum {
1216e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1217e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1218e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1219e4e3f431SDavid Wu 	};
1220e4e3f431SDavid Wu 
1221e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1222e4e3f431SDavid Wu 
1223e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1224e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1225e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1226e4e3f431SDavid Wu }
1227e4e3f431SDavid Wu 
1228dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1229dcfb333aSDavid Wu {
1230dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1231dcfb333aSDavid Wu 
1232dcfb333aSDavid Wu 	enum {
1233dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1234dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1235dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1236dcfb333aSDavid Wu 
1237dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1238dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1239dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1240dcfb333aSDavid Wu 
1241dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1242dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1243dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1244dcfb333aSDavid Wu 
1245dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1246dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1247dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1248dcfb333aSDavid Wu 
1249dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1250dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1251dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1252dcfb333aSDavid Wu 	};
1253dcfb333aSDavid Wu 	enum {
1254dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1255dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1256dcfb333aSDavid Wu 
1257dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1258dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1259dcfb333aSDavid Wu 	};
1260dcfb333aSDavid Wu 	enum {
1261dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1262dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1263dcfb333aSDavid Wu 
1264dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1265dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1266dcfb333aSDavid Wu 	};
1267dcfb333aSDavid Wu 
1268dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1269dcfb333aSDavid Wu 
1270dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1271dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1272dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1273dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1274dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1275dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1276dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1277dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1278dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1279dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1280dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1281dcfb333aSDavid Wu 
1282dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1283dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1284dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1285dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT |
1286dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT);
1287dcfb333aSDavid Wu 
1288dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1289dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1290dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1291dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT |
1292dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT);
1293dcfb333aSDavid Wu }
12946f0a52e9SDavid Wu #endif
12950a33ce65SDavid Wu 
1296bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1297bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1298bf0e94d0SDavid Wu {
1299bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1300bf0e94d0SDavid Wu 	unsigned int val, mask;
1301bf0e94d0SDavid Wu 
1302bf0e94d0SDavid Wu 	enum {
1303bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
1304bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
1305bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
1306bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
1307bf0e94d0SDavid Wu 	};
1308bf0e94d0SDavid Wu 
1309bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1310bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
1311bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
1312bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
1313bf0e94d0SDavid Wu 
1314bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1315bf0e94d0SDavid Wu 		val <<= 5;
1316bf0e94d0SDavid Wu 		mask <<= 5;
1317bf0e94d0SDavid Wu 	}
1318bf0e94d0SDavid Wu 
1319bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
1320bf0e94d0SDavid Wu }
1321bf0e94d0SDavid Wu #endif
1322bf0e94d0SDavid Wu 
13230125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
13240125bcf0SSjoerd Simons {
13250125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
13261f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
13271f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
13286f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
13296f0a52e9SDavid Wu 	struct eqos_config *config;
13306f0a52e9SDavid Wu #else
13316f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
13326f0a52e9SDavid Wu #endif
13336f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
13340125bcf0SSjoerd Simons 	struct clk clk;
13350a33ce65SDavid Wu 	ulong rate;
13360125bcf0SSjoerd Simons 	int ret;
13370125bcf0SSjoerd Simons 
13386f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
13396f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
13406f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
1341befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
13426f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
13436f0a52e9SDavid Wu #else
13446f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
13456f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
13466f0a52e9SDavid Wu #endif
134733a014bdSDavid Wu 	pdata->bus_id = dev->seq;
1348cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1349cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
1350cadc8d74SKever Yang 	if (ret)
1351cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
1352cadc8d74SKever Yang 
13530125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
13540125bcf0SSjoerd Simons 	if (ret)
13550125bcf0SSjoerd Simons 		return ret;
13560125bcf0SSjoerd Simons 
1357491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
1358491f3bfbSDavid Wu 
1359bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
1360bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
1361bf0e94d0SDavid Wu 
1362491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
1363491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
1364491f3bfbSDavid Wu 
13650a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
13660a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
1367bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
13680a33ce65SDavid Wu 		/*
13690a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
13700a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
13710a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
13720a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
13730a33ce65SDavid Wu 		 */
13740a33ce65SDavid Wu 		if (!pdata->clock_input) {
13750a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 125000000);
13760a33ce65SDavid Wu 			if (rate != 125000000)
13770a33ce65SDavid Wu 				return -EINVAL;
13780a33ce65SDavid Wu 		}
13790125bcf0SSjoerd Simons 
1380bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
1381bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
1382bf0e94d0SDavid Wu 
13830125bcf0SSjoerd Simons 		/* Set to RGMII mode */
13840a33ce65SDavid Wu 		if (ops->set_to_rgmii)
13851f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
13860a33ce65SDavid Wu 		else
13870a33ce65SDavid Wu 			return -EPERM;
13880a33ce65SDavid Wu 
13890a33ce65SDavid Wu 		break;
13900a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
13910a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
13920a33ce65SDavid Wu 		if (!pdata->clock_input) {
13930a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 50000000);
13940a33ce65SDavid Wu 			if (rate != 50000000)
13950a33ce65SDavid Wu 				return -EINVAL;
13960a33ce65SDavid Wu 		}
13970a33ce65SDavid Wu 
13980a33ce65SDavid Wu 		/* Set to RMII mode */
13990a33ce65SDavid Wu 		if (ops->set_to_rmii)
14000a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
14010a33ce65SDavid Wu 		else
14020a33ce65SDavid Wu 			return -EPERM;
14030a33ce65SDavid Wu 
14040a33ce65SDavid Wu 		break;
14050a33ce65SDavid Wu 	default:
14060a33ce65SDavid Wu 		debug("NO interface defined!\n");
14070a33ce65SDavid Wu 		return -ENXIO;
14080a33ce65SDavid Wu 	}
14090125bcf0SSjoerd Simons 
14106f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14116f0a52e9SDavid Wu 	return eqos_probe(dev);
14126f0a52e9SDavid Wu #else
14130125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
14146f0a52e9SDavid Wu #endif
14156f0a52e9SDavid Wu }
14166f0a52e9SDavid Wu 
14176f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
14186f0a52e9SDavid Wu {
14196f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
14206f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
14216f0a52e9SDavid Wu #else
14226f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
14236f0a52e9SDavid Wu #endif
14246f0a52e9SDavid Wu }
14256f0a52e9SDavid Wu 
14266f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
14276f0a52e9SDavid Wu 				      int length)
14286f0a52e9SDavid Wu {
14296f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14306f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
14316f0a52e9SDavid Wu #else
14326f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
14336f0a52e9SDavid Wu #endif
14346f0a52e9SDavid Wu }
14356f0a52e9SDavid Wu 
14366f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
14376f0a52e9SDavid Wu 				  int length)
14386f0a52e9SDavid Wu {
14396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14406f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
14416f0a52e9SDavid Wu #else
14426f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
14436f0a52e9SDavid Wu #endif
14446f0a52e9SDavid Wu }
14456f0a52e9SDavid Wu 
14466f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
14476f0a52e9SDavid Wu 				  uchar **packetp)
14486f0a52e9SDavid Wu {
14496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14506f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
14516f0a52e9SDavid Wu #else
14526f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
14536f0a52e9SDavid Wu #endif
14540125bcf0SSjoerd Simons }
14550125bcf0SSjoerd Simons 
14560125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
14570125bcf0SSjoerd Simons {
14586f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
14591f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
14601f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
14616f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1462491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
14636f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
14646f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
14656f0a52e9SDavid Wu #endif
14660125bcf0SSjoerd Simons 	int ret;
14670125bcf0SSjoerd Simons 
14686f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14696f0a52e9SDavid Wu 	ret = eqos_init(dev);
14706f0a52e9SDavid Wu #else
14716f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
14726f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
14736f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
14746f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
14756f0a52e9SDavid Wu #endif
14760125bcf0SSjoerd Simons 	if (ret)
14770125bcf0SSjoerd Simons 		return ret;
1478491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
14790125bcf0SSjoerd Simons 	if (ret)
14800125bcf0SSjoerd Simons 		return ret;
14816f0a52e9SDavid Wu 
14826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14836f0a52e9SDavid Wu 	eqos_enable(dev);
14846f0a52e9SDavid Wu #else
14856f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
14860125bcf0SSjoerd Simons 	if (ret)
14870125bcf0SSjoerd Simons 		return ret;
14886f0a52e9SDavid Wu #endif
14890125bcf0SSjoerd Simons 
14900125bcf0SSjoerd Simons 	return 0;
14910125bcf0SSjoerd Simons }
14920125bcf0SSjoerd Simons 
14936f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
14946f0a52e9SDavid Wu {
14956f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14966f0a52e9SDavid Wu 	eqos_stop(dev);
14976f0a52e9SDavid Wu #else
14986f0a52e9SDavid Wu 	designware_eth_stop(dev);
14996f0a52e9SDavid Wu #endif
15006f0a52e9SDavid Wu }
15016f0a52e9SDavid Wu 
15020125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
15030125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
15046f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
15056f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
15066f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
15076f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
15086f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
15090125bcf0SSjoerd Simons };
15100125bcf0SSjoerd Simons 
15116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
151218ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
151318ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
151418ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
151518ae91c8SDavid Wu };
151618ae91c8SDavid Wu 
1517ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
1518ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
1519ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
1520ff86648dSDavid Wu };
1521ff86648dSDavid Wu 
1522af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
1523af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
1524491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
1525af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
1526491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
1527af166ffaSDavid Wu };
1528af166ffaSDavid Wu 
15291f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
15301f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
15311f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
15321f08aa1cSPhilipp Tomsich };
15331f08aa1cSPhilipp Tomsich 
153423adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
153523adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
153623adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
153723adb58fSDavid Wu };
153823adb58fSDavid Wu 
1539c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
1540c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
1541491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
1542c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
1543491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
1544c36b26c0SDavid Wu };
1545c36b26c0SDavid Wu 
1546793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
1547793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
1548793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
1549793f2fd2SPhilipp Tomsich };
1550793f2fd2SPhilipp Tomsich 
15511f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
15521f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
15531f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
15541f08aa1cSPhilipp Tomsich };
15551f08aa1cSPhilipp Tomsich 
15560a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
15570a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
15580a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
15590a33ce65SDavid Wu };
1560dcfb333aSDavid Wu #else
156133a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
156233a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
156333a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
156433a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
156533a014bdSDavid Wu };
156633a014bdSDavid Wu 
1567bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
1568bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
1569bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
1570bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
1571bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
1572bf0e94d0SDavid Wu };
1573bf0e94d0SDavid Wu 
1574dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
1575dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
1576dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
1577e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
1578dcfb333aSDavid Wu };
15796f0a52e9SDavid Wu #endif
15800a33ce65SDavid Wu 
15810125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
15826f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
158384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
158418ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
158518ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
158684e90485SDavid Wu #endif
158784e90485SDavid Wu 
158884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
1589ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
1590ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
159184e90485SDavid Wu #endif
159284e90485SDavid Wu 
159384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
1594af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
1595af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
159684e90485SDavid Wu #endif
159784e90485SDavid Wu 
159884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
15991f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
16001f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
160184e90485SDavid Wu #endif
160284e90485SDavid Wu 
160384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
160423adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
160523adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
160684e90485SDavid Wu #endif
160784e90485SDavid Wu 
160884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
1609c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
1610c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
161184e90485SDavid Wu #endif
161284e90485SDavid Wu 
161384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
1614793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
1615793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
161684e90485SDavid Wu #endif
161784e90485SDavid Wu 
161884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
16191f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
16201f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
162184e90485SDavid Wu #endif
162284e90485SDavid Wu 
162384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
16240a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
16250a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
162684e90485SDavid Wu #endif
1627dcfb333aSDavid Wu #else
162884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
162933a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
163033a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
163184e90485SDavid Wu #endif
163284e90485SDavid Wu 
1633bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
1634bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
1635bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
1636bf0e94d0SDavid Wu #endif
1637bf0e94d0SDavid Wu 
163884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
1639dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
1640dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
16416f0a52e9SDavid Wu #endif
164284e90485SDavid Wu #endif
16430125bcf0SSjoerd Simons 	{ }
16440125bcf0SSjoerd Simons };
16450125bcf0SSjoerd Simons 
16460125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
16470125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
16480125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
16490125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
16500125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
16510125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
16520125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
16536f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
16540125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
16550125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
16560125bcf0SSjoerd Simons };
1657