xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision befcb6277d8625f35a25bbd24b2e3eb11578d018)
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>
130125bcf0SSjoerd Simons #include <syscon.h>
140125bcf0SSjoerd Simons #include <asm/io.h>
150125bcf0SSjoerd Simons #include <asm/arch/periph.h>
160125bcf0SSjoerd Simons #include <asm/arch/clock.h>
171f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h>
186f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
19dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
206f0a52e9SDavid Wu #include "dwc_eth_qos.h"
216f0a52e9SDavid Wu #else
2218ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
23ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
24af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
250125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
2623adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
27c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
28793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
291f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
300a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
310125bcf0SSjoerd Simons #include "designware.h"
326f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
336f0a52e9SDavid Wu #endif
346f0a52e9SDavid Wu #include <dm/pinctrl.h>
350125bcf0SSjoerd Simons 
360125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
370125bcf0SSjoerd Simons 
386f0a52e9SDavid Wu struct rockchip_eth_dev {
396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
406f0a52e9SDavid Wu 	struct eqos_priv eqos;
416f0a52e9SDavid Wu #else
426f0a52e9SDavid Wu 	struct dw_eth_dev dw;
436f0a52e9SDavid Wu #endif
446f0a52e9SDavid Wu };
456f0a52e9SDavid Wu 
460125bcf0SSjoerd Simons /*
470125bcf0SSjoerd Simons  * Platform data for the gmac
480125bcf0SSjoerd Simons  *
490125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
500125bcf0SSjoerd Simons  */
510125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
526f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
530125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
546f0a52e9SDavid Wu #else
556f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
566f0a52e9SDavid Wu #endif
570a33ce65SDavid Wu 	bool clock_input;
580125bcf0SSjoerd Simons 	int tx_delay;
590125bcf0SSjoerd Simons 	int rx_delay;
600125bcf0SSjoerd Simons };
610125bcf0SSjoerd Simons 
621f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
636f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
646f0a52e9SDavid Wu 	const struct eqos_config config;
656f0a52e9SDavid Wu #endif
666f0a52e9SDavid Wu 	int (*fix_mac_speed)(struct rockchip_eth_dev *dev);
670a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
681f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
691f08aa1cSPhilipp Tomsich };
701f08aa1cSPhilipp Tomsich 
71*befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
72*befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
73*befcb627SDavid Wu 	.reg_access_always_ok = false,
74*befcb627SDavid Wu 	.mdio_wait = 10000,
75*befcb627SDavid Wu 	.swr_wait = 200,
76*befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
77*befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
78*befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
79*befcb627SDavid Wu };
80*befcb627SDavid Wu #endif
81*befcb627SDavid Wu 
821eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
831eb9d064SDavid Wu {
841eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
851eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
861eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
871eb9d064SDavid Wu 
881eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
891eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
901eb9d064SDavid Wu 
911eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
921eb9d064SDavid Wu }
931f08aa1cSPhilipp Tomsich 
940125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
950125bcf0SSjoerd Simons {
960125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
970a33ce65SDavid Wu 	const char *string;
980a33ce65SDavid Wu 
990a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1000a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1010a33ce65SDavid Wu 		pdata->clock_input = true;
1020a33ce65SDavid Wu 	else
1030a33ce65SDavid Wu 		pdata->clock_input = false;
1040125bcf0SSjoerd Simons 
1051f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1067ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1077ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1081f08aa1cSPhilipp Tomsich 
1091f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1101f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1117ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1121f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1137ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1140125bcf0SSjoerd Simons 
1156f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1166f0a52e9SDavid Wu 	return 0;
1176f0a52e9SDavid Wu #else
1180125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1196f0a52e9SDavid Wu #endif
1200125bcf0SSjoerd Simons }
1210125bcf0SSjoerd Simons 
1226f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
1236f0a52e9SDavid Wu static int px30_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
12418ae91c8SDavid Wu {
1256f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
12618ae91c8SDavid Wu 	struct px30_grf *grf;
12718ae91c8SDavid Wu 	struct clk clk_speed;
12818ae91c8SDavid Wu 	int speed, ret;
12918ae91c8SDavid Wu 	enum {
13018ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
13118ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
13218ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
13318ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
13418ae91c8SDavid Wu 	};
13518ae91c8SDavid Wu 
13618ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
13718ae91c8SDavid Wu 			      &clk_speed);
13818ae91c8SDavid Wu 	if (ret)
13918ae91c8SDavid Wu 		return ret;
14018ae91c8SDavid Wu 
14118ae91c8SDavid Wu 	switch (priv->phydev->speed) {
14218ae91c8SDavid Wu 	case 10:
14318ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
14418ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
14518ae91c8SDavid Wu 		if (ret)
14618ae91c8SDavid Wu 			return ret;
14718ae91c8SDavid Wu 		break;
14818ae91c8SDavid Wu 	case 100:
14918ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
15018ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
15118ae91c8SDavid Wu 		if (ret)
15218ae91c8SDavid Wu 			return ret;
15318ae91c8SDavid Wu 		break;
15418ae91c8SDavid Wu 	default:
15518ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
15618ae91c8SDavid Wu 		return -EINVAL;
15718ae91c8SDavid Wu 	}
15818ae91c8SDavid Wu 
15918ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
16018ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
16118ae91c8SDavid Wu 
16218ae91c8SDavid Wu 	return 0;
16318ae91c8SDavid Wu }
16418ae91c8SDavid Wu 
1656f0a52e9SDavid Wu static int rk1808_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
166ff86648dSDavid Wu {
1676f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
168ff86648dSDavid Wu 	struct clk clk_speed;
169ff86648dSDavid Wu 	int ret;
170ff86648dSDavid Wu 
171ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
172ff86648dSDavid Wu 			      &clk_speed);
173ff86648dSDavid Wu 	if (ret)
174ff86648dSDavid Wu 		return ret;
175ff86648dSDavid Wu 
176ff86648dSDavid Wu 	switch (priv->phydev->speed) {
177ff86648dSDavid Wu 	case 10:
178ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
179ff86648dSDavid Wu 		if (ret)
180ff86648dSDavid Wu 			return ret;
181ff86648dSDavid Wu 		break;
182ff86648dSDavid Wu 	case 100:
183ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
184ff86648dSDavid Wu 		if (ret)
185ff86648dSDavid Wu 			return ret;
186ff86648dSDavid Wu 		break;
187ff86648dSDavid Wu 	case 1000:
188ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
189ff86648dSDavid Wu 		if (ret)
190ff86648dSDavid Wu 			return ret;
191ff86648dSDavid Wu 		break;
192ff86648dSDavid Wu 	default:
193ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
194ff86648dSDavid Wu 		return -EINVAL;
195ff86648dSDavid Wu 	}
196ff86648dSDavid Wu 
197ff86648dSDavid Wu 	return 0;
198ff86648dSDavid Wu }
199ff86648dSDavid Wu 
2006f0a52e9SDavid Wu static int rk3228_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
201af166ffaSDavid Wu {
2026f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
203af166ffaSDavid Wu 	struct rk322x_grf *grf;
204af166ffaSDavid Wu 	int clk;
205af166ffaSDavid Wu 	enum {
206af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
207af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
208af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
209af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
210af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
211af166ffaSDavid Wu 	};
212af166ffaSDavid Wu 
213af166ffaSDavid Wu 	switch (priv->phydev->speed) {
214af166ffaSDavid Wu 	case 10:
215af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_2_5M;
216af166ffaSDavid Wu 		break;
217af166ffaSDavid Wu 	case 100:
218af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_25M;
219af166ffaSDavid Wu 		break;
220af166ffaSDavid Wu 	case 1000:
221af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
222af166ffaSDavid Wu 		break;
223af166ffaSDavid Wu 	default:
224af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
225af166ffaSDavid Wu 		return -EINVAL;
226af166ffaSDavid Wu 	}
227af166ffaSDavid Wu 
228af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
229af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1], RK3228_GMAC_CLK_SEL_MASK, clk);
230af166ffaSDavid Wu 
231af166ffaSDavid Wu 	return 0;
232af166ffaSDavid Wu }
233af166ffaSDavid Wu 
2346f0a52e9SDavid Wu static int rk3288_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
2350125bcf0SSjoerd Simons {
2366f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
2370125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
2380125bcf0SSjoerd Simons 	int clk;
2390125bcf0SSjoerd Simons 
2400125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
2410125bcf0SSjoerd Simons 	case 10:
2421f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
2430125bcf0SSjoerd Simons 		break;
2440125bcf0SSjoerd Simons 	case 100:
2451f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
2460125bcf0SSjoerd Simons 		break;
2470125bcf0SSjoerd Simons 	case 1000:
2481f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
2490125bcf0SSjoerd Simons 		break;
2500125bcf0SSjoerd Simons 	default:
2510125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
2520125bcf0SSjoerd Simons 		return -EINVAL;
2530125bcf0SSjoerd Simons 	}
2540125bcf0SSjoerd Simons 
2550125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2561f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
2570125bcf0SSjoerd Simons 
2580125bcf0SSjoerd Simons 	return 0;
2590125bcf0SSjoerd Simons }
2600125bcf0SSjoerd Simons 
2616f0a52e9SDavid Wu static int rk3308_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
26223adb58fSDavid Wu {
2636f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
26423adb58fSDavid Wu 	struct rk3308_grf *grf;
26523adb58fSDavid Wu 	struct clk clk_speed;
26623adb58fSDavid Wu 	int speed, ret;
26723adb58fSDavid Wu 	enum {
26823adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
26923adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
27023adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
27123adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
27223adb58fSDavid Wu 	};
27323adb58fSDavid Wu 
27423adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
27523adb58fSDavid Wu 			      &clk_speed);
27623adb58fSDavid Wu 	if (ret)
27723adb58fSDavid Wu 		return ret;
27823adb58fSDavid Wu 
27923adb58fSDavid Wu 	switch (priv->phydev->speed) {
28023adb58fSDavid Wu 	case 10:
28123adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
28223adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
28323adb58fSDavid Wu 		if (ret)
28423adb58fSDavid Wu 			return ret;
28523adb58fSDavid Wu 		break;
28623adb58fSDavid Wu 	case 100:
28723adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
28823adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
28923adb58fSDavid Wu 		if (ret)
29023adb58fSDavid Wu 			return ret;
29123adb58fSDavid Wu 		break;
29223adb58fSDavid Wu 	default:
29323adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
29423adb58fSDavid Wu 		return -EINVAL;
29523adb58fSDavid Wu 	}
29623adb58fSDavid Wu 
29723adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
29823adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
29923adb58fSDavid Wu 
30023adb58fSDavid Wu 	return 0;
30123adb58fSDavid Wu }
30223adb58fSDavid Wu 
3036f0a52e9SDavid Wu static int rk3328_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
304c36b26c0SDavid Wu {
3056f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
306c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
307c36b26c0SDavid Wu 	int clk;
308c36b26c0SDavid Wu 	enum {
309c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
310c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
311c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
312c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
313c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
314c36b26c0SDavid Wu 	};
315c36b26c0SDavid Wu 
316c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
317c36b26c0SDavid Wu 	case 10:
318c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_2_5M;
319c36b26c0SDavid Wu 		break;
320c36b26c0SDavid Wu 	case 100:
321c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_25M;
322c36b26c0SDavid Wu 		break;
323c36b26c0SDavid Wu 	case 1000:
324c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
325c36b26c0SDavid Wu 		break;
326c36b26c0SDavid Wu 	default:
327c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
328c36b26c0SDavid Wu 		return -EINVAL;
329c36b26c0SDavid Wu 	}
330c36b26c0SDavid Wu 
331c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
332c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1], RK3328_GMAC_CLK_SEL_MASK, clk);
333c36b26c0SDavid Wu 
334c36b26c0SDavid Wu 	return 0;
335c36b26c0SDavid Wu }
336c36b26c0SDavid Wu 
3376f0a52e9SDavid Wu static int rk3368_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
338793f2fd2SPhilipp Tomsich {
3396f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
340793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
341793f2fd2SPhilipp Tomsich 	int clk;
342793f2fd2SPhilipp Tomsich 	enum {
343793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
344793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
345793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
346793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
347793f2fd2SPhilipp Tomsich 	};
348793f2fd2SPhilipp Tomsich 
349793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
350793f2fd2SPhilipp Tomsich 	case 10:
351793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
352793f2fd2SPhilipp Tomsich 		break;
353793f2fd2SPhilipp Tomsich 	case 100:
354793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
355793f2fd2SPhilipp Tomsich 		break;
356793f2fd2SPhilipp Tomsich 	case 1000:
357793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
358793f2fd2SPhilipp Tomsich 		break;
359793f2fd2SPhilipp Tomsich 	default:
360793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
361793f2fd2SPhilipp Tomsich 		return -EINVAL;
362793f2fd2SPhilipp Tomsich 	}
363793f2fd2SPhilipp Tomsich 
364793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
365793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
366793f2fd2SPhilipp Tomsich 
367793f2fd2SPhilipp Tomsich 	return 0;
368793f2fd2SPhilipp Tomsich }
369793f2fd2SPhilipp Tomsich 
3706f0a52e9SDavid Wu static int rk3399_gmac_fix_mac_speed(struct rockchip_eth_dev *dev)
3711f08aa1cSPhilipp Tomsich {
3726f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3731f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
3741f08aa1cSPhilipp Tomsich 	int clk;
3751f08aa1cSPhilipp Tomsich 
3761f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
3771f08aa1cSPhilipp Tomsich 	case 10:
3781f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
3791f08aa1cSPhilipp Tomsich 		break;
3801f08aa1cSPhilipp Tomsich 	case 100:
3811f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
3821f08aa1cSPhilipp Tomsich 		break;
3831f08aa1cSPhilipp Tomsich 	case 1000:
3841f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
3851f08aa1cSPhilipp Tomsich 		break;
3861f08aa1cSPhilipp Tomsich 	default:
3871f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3881f08aa1cSPhilipp Tomsich 		return -EINVAL;
3891f08aa1cSPhilipp Tomsich 	}
3901f08aa1cSPhilipp Tomsich 
3911f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3921f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
3931f08aa1cSPhilipp Tomsich 
3941f08aa1cSPhilipp Tomsich 	return 0;
3951f08aa1cSPhilipp Tomsich }
3961f08aa1cSPhilipp Tomsich 
3976f0a52e9SDavid Wu static int rv1108_set_rmii_speed(struct rockchip_eth_dev *dev)
3980a33ce65SDavid Wu {
3996f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4000a33ce65SDavid Wu 	struct rv1108_grf *grf;
4010a33ce65SDavid Wu 	int clk, speed;
4020a33ce65SDavid Wu 	enum {
4030a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4040a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4050a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4060a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4070a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4080a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4090a33ce65SDavid Wu 	};
4100a33ce65SDavid Wu 
4110a33ce65SDavid Wu 	switch (priv->phydev->speed) {
4120a33ce65SDavid Wu 	case 10:
4130a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
4140a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
4150a33ce65SDavid Wu 		break;
4160a33ce65SDavid Wu 	case 100:
4170a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
4180a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
4190a33ce65SDavid Wu 		break;
4200a33ce65SDavid Wu 	default:
4210a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4220a33ce65SDavid Wu 		return -EINVAL;
4230a33ce65SDavid Wu 	}
4240a33ce65SDavid Wu 
4250a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4260a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
4270a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
4280a33ce65SDavid Wu 		     clk | speed);
4290a33ce65SDavid Wu 
4300a33ce65SDavid Wu 	return 0;
4310a33ce65SDavid Wu }
432dcfb333aSDavid Wu #else
433dcfb333aSDavid Wu static int rv1126_set_rgmii_speed(struct rockchip_eth_dev *dev)
434dcfb333aSDavid Wu {
435dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
436dcfb333aSDavid Wu 	struct clk clk_speed;
437dcfb333aSDavid Wu 	int ret;
438dcfb333aSDavid Wu 
439dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
440dcfb333aSDavid Wu 			      &clk_speed);
441dcfb333aSDavid Wu 	if (ret) {
442dcfb333aSDavid Wu 			printf("%s~(ret=%d):\n", __func__, ret);
443dcfb333aSDavid Wu 		return ret;
444dcfb333aSDavid Wu 	}
445dcfb333aSDavid Wu 
446dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
447dcfb333aSDavid Wu 	case 10:
448dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
449dcfb333aSDavid Wu 		if (ret)
450dcfb333aSDavid Wu 			return ret;
451dcfb333aSDavid Wu 		break;
452dcfb333aSDavid Wu 	case 100:
453dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
454dcfb333aSDavid Wu 		if (ret)
455dcfb333aSDavid Wu 			return ret;
456dcfb333aSDavid Wu 		break;
457dcfb333aSDavid Wu 	case 1000:
458dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
459dcfb333aSDavid Wu 		if (ret)
460dcfb333aSDavid Wu 			return ret;
461dcfb333aSDavid Wu 		break;
462dcfb333aSDavid Wu 	default:
463dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
464dcfb333aSDavid Wu 		return -EINVAL;
465dcfb333aSDavid Wu 	}
466dcfb333aSDavid Wu 
467dcfb333aSDavid Wu 	return 0;
468dcfb333aSDavid Wu }
4696f0a52e9SDavid Wu #endif
4700a33ce65SDavid Wu 
4716f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
47218ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
47318ae91c8SDavid Wu {
47418ae91c8SDavid Wu 	struct px30_grf *grf;
47518ae91c8SDavid Wu 	enum {
47618ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
47718ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
47818ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
47918ae91c8SDavid Wu 	};
48018ae91c8SDavid Wu 
48118ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
48218ae91c8SDavid Wu 
48318ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
48418ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
48518ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
48618ae91c8SDavid Wu }
48718ae91c8SDavid Wu 
488ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
489ff86648dSDavid Wu {
490ff86648dSDavid Wu 	struct rk1808_grf *grf;
491ff86648dSDavid Wu 	enum {
492ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
493ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
494ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
495ff86648dSDavid Wu 
496ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
497ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
498ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
499ff86648dSDavid Wu 
500ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
501ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
502ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
503ff86648dSDavid Wu 	};
504ff86648dSDavid Wu 	enum {
505ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
506ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
507ff86648dSDavid Wu 
508ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
509ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
510ff86648dSDavid Wu 	};
511ff86648dSDavid Wu 
512ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
513ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
514ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
515ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
516ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
517ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
518ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
519ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
520ff86648dSDavid Wu 
521ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
522ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
523ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
524ff86648dSDavid Wu 		     pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT |
525ff86648dSDavid Wu 		     pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT);
526ff86648dSDavid Wu }
527ff86648dSDavid Wu 
528af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
529af166ffaSDavid Wu {
530af166ffaSDavid Wu 	struct rk322x_grf *grf;
531af166ffaSDavid Wu 	enum {
532af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
533af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
534af166ffaSDavid Wu 
535af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
536af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
537af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
538af166ffaSDavid Wu 
539af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
540af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
541af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
542af166ffaSDavid Wu 
543af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
544af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
545af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
546af166ffaSDavid Wu 	};
547af166ffaSDavid Wu 	enum {
548af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
549af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
550af166ffaSDavid Wu 
551af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
552af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
553af166ffaSDavid Wu 	};
554af166ffaSDavid Wu 
555af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
556af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
557af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
558af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
559af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
560af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
561af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
562af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
563af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
564af166ffaSDavid Wu 
565af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
566af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
567af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
568af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
569af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
570af166ffaSDavid Wu }
571af166ffaSDavid Wu 
5721f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
5731f08aa1cSPhilipp Tomsich {
5741f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
5751f08aa1cSPhilipp Tomsich 
5761f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5771f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
5781f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
5791f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
5801f08aa1cSPhilipp Tomsich 
5811f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
5821f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
5831f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
5841f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
5851f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
5861f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
5871f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
5881f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
5891f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
5901f08aa1cSPhilipp Tomsich }
5911f08aa1cSPhilipp Tomsich 
59223adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
59323adb58fSDavid Wu {
59423adb58fSDavid Wu 	struct rk3308_grf *grf;
59523adb58fSDavid Wu 	enum {
59623adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
59723adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
59823adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
59923adb58fSDavid Wu 	};
60023adb58fSDavid Wu 
60123adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
60223adb58fSDavid Wu 
60323adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
60423adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
60523adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
60623adb58fSDavid Wu }
60723adb58fSDavid Wu 
608c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
609c36b26c0SDavid Wu {
610c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
611c36b26c0SDavid Wu 	enum {
612c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
613c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
614c36b26c0SDavid Wu 
615c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
616c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
617c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
618c36b26c0SDavid Wu 
619c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
620c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
621c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
622c36b26c0SDavid Wu 
623c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
624c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
625c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
626c36b26c0SDavid Wu 	};
627c36b26c0SDavid Wu 	enum {
628c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
629c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
630c36b26c0SDavid Wu 
631c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
632c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
633c36b26c0SDavid Wu 	};
634c36b26c0SDavid Wu 
635c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
636c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
637c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
638c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
639c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
640c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
641c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
642c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
643c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
644c36b26c0SDavid Wu 
645c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
646c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
647c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
648c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
649c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
650c36b26c0SDavid Wu }
651c36b26c0SDavid Wu 
652793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
653793f2fd2SPhilipp Tomsich {
654793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
655793f2fd2SPhilipp Tomsich 	enum {
656793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
657793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
658793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
659793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
660793f2fd2SPhilipp Tomsich 	};
661793f2fd2SPhilipp Tomsich 	enum {
662793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
663793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
664793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
665793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
666793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
667793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
668793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
669793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
670793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
671793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
672793f2fd2SPhilipp Tomsich 	};
673793f2fd2SPhilipp Tomsich 
674793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
675793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
676793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
677793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
678793f2fd2SPhilipp Tomsich 
679793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
680793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
681793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
682793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
683793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
684793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
685793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
686793f2fd2SPhilipp Tomsich 		     pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT |
687793f2fd2SPhilipp Tomsich 		     pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT);
688793f2fd2SPhilipp Tomsich }
689793f2fd2SPhilipp Tomsich 
6901f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
6911f08aa1cSPhilipp Tomsich {
6921f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
6931f08aa1cSPhilipp Tomsich 
6941f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
6951f08aa1cSPhilipp Tomsich 
6961f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
6971f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
6981f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
6991f08aa1cSPhilipp Tomsich 
7001f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
7011f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
7021f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
7031f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
7041f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
7051f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
7061f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
7071f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT |
7081f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT);
7091f08aa1cSPhilipp Tomsich }
7101f08aa1cSPhilipp Tomsich 
7110a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
7120a33ce65SDavid Wu {
7130a33ce65SDavid Wu 	struct rv1108_grf *grf;
7140a33ce65SDavid Wu 
7150a33ce65SDavid Wu 	enum {
7160a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
7170a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
7180a33ce65SDavid Wu 	};
7190a33ce65SDavid Wu 
7200a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
7210a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
7220a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
7230a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
7240a33ce65SDavid Wu }
725dcfb333aSDavid Wu #else
726e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
727e4e3f431SDavid Wu {
728e4e3f431SDavid Wu 	struct rv1126_grf *grf;
729e4e3f431SDavid Wu 
730e4e3f431SDavid Wu 	enum {
731e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
732e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
733e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
734e4e3f431SDavid Wu 	};
735e4e3f431SDavid Wu 
736e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
737e4e3f431SDavid Wu 
738e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
739e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
740e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
741e4e3f431SDavid Wu }
742e4e3f431SDavid Wu 
743dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
744dcfb333aSDavid Wu {
745dcfb333aSDavid Wu 	struct rv1126_grf *grf;
746dcfb333aSDavid Wu 
747dcfb333aSDavid Wu 	enum {
748dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
749dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
750dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
751dcfb333aSDavid Wu 
752dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
753dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
754dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
755dcfb333aSDavid Wu 
756dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
757dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
758dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
759dcfb333aSDavid Wu 
760dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
761dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
762dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
763dcfb333aSDavid Wu 
764dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
765dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
766dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
767dcfb333aSDavid Wu 	};
768dcfb333aSDavid Wu 	enum {
769dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
770dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
771dcfb333aSDavid Wu 
772dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
773dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
774dcfb333aSDavid Wu 	};
775dcfb333aSDavid Wu 	enum {
776dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
777dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
778dcfb333aSDavid Wu 
779dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
780dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
781dcfb333aSDavid Wu 	};
782dcfb333aSDavid Wu 
783dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
784dcfb333aSDavid Wu 
785dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
786dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
787dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
788dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
789dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
790dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
791dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
792dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
793dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
794dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
795dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
796dcfb333aSDavid Wu 
797dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
798dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
799dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
800dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT |
801dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT);
802dcfb333aSDavid Wu 
803dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
804dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
805dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
806dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT |
807dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT);
808dcfb333aSDavid Wu }
8096f0a52e9SDavid Wu #endif
8100a33ce65SDavid Wu 
8110125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
8120125bcf0SSjoerd Simons {
8130125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
8141f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
8151f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
8166f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
8176f0a52e9SDavid Wu 	struct eqos_config *config;
8186f0a52e9SDavid Wu #else
8196f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
8206f0a52e9SDavid Wu #endif
8216f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
8220125bcf0SSjoerd Simons 	struct clk clk;
8230a33ce65SDavid Wu 	ulong rate;
8240125bcf0SSjoerd Simons 	int ret;
8250125bcf0SSjoerd Simons 
8266f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
8276f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
8286f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
829*befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
8306f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
8316f0a52e9SDavid Wu #else
8326f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
8336f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
8346f0a52e9SDavid Wu #endif
835cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
836cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
837cadc8d74SKever Yang 	if (ret)
838cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
839cadc8d74SKever Yang 
8400125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
8410125bcf0SSjoerd Simons 	if (ret)
8420125bcf0SSjoerd Simons 		return ret;
8430125bcf0SSjoerd Simons 
8440a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
8450a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
8460a33ce65SDavid Wu 		/*
8470a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
8480a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
8490a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
8500a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
8510a33ce65SDavid Wu 		 */
8520a33ce65SDavid Wu 		if (!pdata->clock_input) {
8530a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 125000000);
8540a33ce65SDavid Wu 			if (rate != 125000000)
8550a33ce65SDavid Wu 				return -EINVAL;
8560a33ce65SDavid Wu 		}
8570125bcf0SSjoerd Simons 
8580125bcf0SSjoerd Simons 		/* Set to RGMII mode */
8590a33ce65SDavid Wu 		if (ops->set_to_rgmii)
8601f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
8610a33ce65SDavid Wu 		else
8620a33ce65SDavid Wu 			return -EPERM;
8630a33ce65SDavid Wu 
8640a33ce65SDavid Wu 		break;
8650a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
8660a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
8670a33ce65SDavid Wu 		if (!pdata->clock_input) {
8680a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 50000000);
8690a33ce65SDavid Wu 			if (rate != 50000000)
8700a33ce65SDavid Wu 				return -EINVAL;
8710a33ce65SDavid Wu 		}
8720a33ce65SDavid Wu 
8730a33ce65SDavid Wu 		/* Set to RMII mode */
8740a33ce65SDavid Wu 		if (ops->set_to_rmii)
8750a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
8760a33ce65SDavid Wu 		else
8770a33ce65SDavid Wu 			return -EPERM;
8780a33ce65SDavid Wu 
8790a33ce65SDavid Wu 		break;
8800a33ce65SDavid Wu 	default:
8810a33ce65SDavid Wu 		debug("NO interface defined!\n");
8820a33ce65SDavid Wu 		return -ENXIO;
8830a33ce65SDavid Wu 	}
8840125bcf0SSjoerd Simons 
8856f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
8866f0a52e9SDavid Wu 	return eqos_probe(dev);
8876f0a52e9SDavid Wu #else
8880125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
8896f0a52e9SDavid Wu #endif
8906f0a52e9SDavid Wu }
8916f0a52e9SDavid Wu 
8926f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
8936f0a52e9SDavid Wu {
8946f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
8956f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
8966f0a52e9SDavid Wu #else
8976f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
8986f0a52e9SDavid Wu #endif
8996f0a52e9SDavid Wu }
9006f0a52e9SDavid Wu 
9016f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
9026f0a52e9SDavid Wu 				      int length)
9036f0a52e9SDavid Wu {
9046f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
9056f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
9066f0a52e9SDavid Wu #else
9076f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
9086f0a52e9SDavid Wu #endif
9096f0a52e9SDavid Wu }
9106f0a52e9SDavid Wu 
9116f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
9126f0a52e9SDavid Wu 				  int length)
9136f0a52e9SDavid Wu {
9146f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
9156f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
9166f0a52e9SDavid Wu #else
9176f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
9186f0a52e9SDavid Wu #endif
9196f0a52e9SDavid Wu }
9206f0a52e9SDavid Wu 
9216f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
9226f0a52e9SDavid Wu 				  uchar **packetp)
9236f0a52e9SDavid Wu {
9246f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
9256f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
9266f0a52e9SDavid Wu #else
9276f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
9286f0a52e9SDavid Wu #endif
9290125bcf0SSjoerd Simons }
9300125bcf0SSjoerd Simons 
9310125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
9320125bcf0SSjoerd Simons {
9336f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
9341f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
9351f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
9366f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
9376f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
9386f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
9396f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
9406f0a52e9SDavid Wu #endif
9410125bcf0SSjoerd Simons 	int ret;
9420125bcf0SSjoerd Simons 
9436f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
9446f0a52e9SDavid Wu 	ret = eqos_init(dev);
9456f0a52e9SDavid Wu #else
9466f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
9476f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
9486f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
9496f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
9506f0a52e9SDavid Wu #endif
9510125bcf0SSjoerd Simons 	if (ret)
9520125bcf0SSjoerd Simons 		return ret;
9531f08aa1cSPhilipp Tomsich 	ret = ops->fix_mac_speed(priv);
9540125bcf0SSjoerd Simons 	if (ret)
9550125bcf0SSjoerd Simons 		return ret;
9566f0a52e9SDavid Wu 
9576f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
9586f0a52e9SDavid Wu 	eqos_enable(dev);
9596f0a52e9SDavid Wu #else
9606f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
9610125bcf0SSjoerd Simons 	if (ret)
9620125bcf0SSjoerd Simons 		return ret;
9636f0a52e9SDavid Wu #endif
9640125bcf0SSjoerd Simons 
9650125bcf0SSjoerd Simons 	return 0;
9660125bcf0SSjoerd Simons }
9670125bcf0SSjoerd Simons 
9686f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
9696f0a52e9SDavid Wu {
9706f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
9716f0a52e9SDavid Wu 	eqos_stop(dev);
9726f0a52e9SDavid Wu #else
9736f0a52e9SDavid Wu 	designware_eth_stop(dev);
9746f0a52e9SDavid Wu #endif
9756f0a52e9SDavid Wu }
9766f0a52e9SDavid Wu 
9770125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
9780125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
9796f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
9806f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
9816f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
9826f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
9836f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
9840125bcf0SSjoerd Simons };
9850125bcf0SSjoerd Simons 
9866f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
98718ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
98818ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
98918ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
99018ae91c8SDavid Wu };
99118ae91c8SDavid Wu 
992ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
993ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
994ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
995ff86648dSDavid Wu };
996ff86648dSDavid Wu 
997af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
998af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
999af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
1000af166ffaSDavid Wu };
1001af166ffaSDavid Wu 
10021f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
10031f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
10041f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
10051f08aa1cSPhilipp Tomsich };
10061f08aa1cSPhilipp Tomsich 
100723adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
100823adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
100923adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
101023adb58fSDavid Wu };
101123adb58fSDavid Wu 
1012c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
1013c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
1014c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
1015c36b26c0SDavid Wu };
1016c36b26c0SDavid Wu 
1017793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
1018793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
1019793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
1020793f2fd2SPhilipp Tomsich };
1021793f2fd2SPhilipp Tomsich 
10221f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
10231f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
10241f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
10251f08aa1cSPhilipp Tomsich };
10261f08aa1cSPhilipp Tomsich 
10270a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
10280a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
10290a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
10300a33ce65SDavid Wu };
1031dcfb333aSDavid Wu #else
1032dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
1033dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
1034dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
1035e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
1036dcfb333aSDavid Wu };
10376f0a52e9SDavid Wu #endif
10380a33ce65SDavid Wu 
10390125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
10406f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
104118ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
104218ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
1043ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
1044ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
1045af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
1046af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
10471f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
10481f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
104923adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
105023adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
1051c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
1052c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
1053793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
1054793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
10551f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
10561f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
10570a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
10580a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
1059dcfb333aSDavid Wu #else
1060dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
1061dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
10626f0a52e9SDavid Wu #endif
10630125bcf0SSjoerd Simons 	{ }
10640125bcf0SSjoerd Simons };
10650125bcf0SSjoerd Simons 
10660125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
10670125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
10680125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
10690125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
10700125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
10710125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
10720125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
10736f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
10740125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
10750125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
10760125bcf0SSjoerd Simons };
1077