xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision 491f3bfbf44a780862ac564f34d6d2c1c828d188)
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>
13*491f3bfbSDavid 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>
21dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
226f0a52e9SDavid Wu #include "dwc_eth_qos.h"
236f0a52e9SDavid Wu #else
2418ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
25ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
26af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
270125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
2823adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
29c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
30793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
311f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
320a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
330125bcf0SSjoerd Simons #include "designware.h"
346f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
356f0a52e9SDavid Wu #endif
366f0a52e9SDavid Wu #include <dm/pinctrl.h>
37*491f3bfbSDavid Wu #include <dm/of_access.h>
380125bcf0SSjoerd Simons 
390125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
400125bcf0SSjoerd Simons 
416f0a52e9SDavid Wu struct rockchip_eth_dev {
426f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
436f0a52e9SDavid Wu 	struct eqos_priv eqos;
446f0a52e9SDavid Wu #else
456f0a52e9SDavid Wu 	struct dw_eth_dev dw;
466f0a52e9SDavid Wu #endif
47*491f3bfbSDavid Wu 	int phy_interface;
486f0a52e9SDavid Wu };
496f0a52e9SDavid Wu 
500125bcf0SSjoerd Simons /*
510125bcf0SSjoerd Simons  * Platform data for the gmac
520125bcf0SSjoerd Simons  *
530125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
540125bcf0SSjoerd Simons  */
550125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
566f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
570125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
586f0a52e9SDavid Wu #else
596f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
606f0a52e9SDavid Wu #endif
61*491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
62*491f3bfbSDavid Wu 	bool integrated_phy;
630a33ce65SDavid Wu 	bool clock_input;
64*491f3bfbSDavid Wu 	int phy_interface;
650125bcf0SSjoerd Simons 	int tx_delay;
660125bcf0SSjoerd Simons 	int rx_delay;
6733a014bdSDavid Wu 	int bus_id;
680125bcf0SSjoerd Simons };
690125bcf0SSjoerd Simons 
701f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
716f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
726f0a52e9SDavid Wu 	const struct eqos_config config;
736f0a52e9SDavid Wu #endif
74*491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
75*491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
760a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
771f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
78*491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
791f08aa1cSPhilipp Tomsich };
801f08aa1cSPhilipp Tomsich 
81befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
82befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
83befcb627SDavid Wu 	.reg_access_always_ok = false,
84befcb627SDavid Wu 	.mdio_wait = 10000,
85befcb627SDavid Wu 	.swr_wait = 200,
86befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
87befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
88befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
89befcb627SDavid Wu };
90befcb627SDavid Wu #endif
91befcb627SDavid Wu 
921eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
931eb9d064SDavid Wu {
941eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
951eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
961eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
971eb9d064SDavid Wu 
981eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
991eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1001eb9d064SDavid Wu 
1011eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1021eb9d064SDavid Wu }
1031f08aa1cSPhilipp Tomsich 
1040125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1050125bcf0SSjoerd Simons {
1060125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
107*491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
1080a33ce65SDavid Wu 	const char *string;
109*491f3bfbSDavid Wu 	int ret;
1100a33ce65SDavid Wu 
1110a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1120a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1130a33ce65SDavid Wu 		pdata->clock_input = true;
1140a33ce65SDavid Wu 	else
1150a33ce65SDavid Wu 		pdata->clock_input = false;
1160125bcf0SSjoerd Simons 
117*491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
118*491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
119*491f3bfbSDavid Wu 	if (ret) {
120*491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
121*491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
122*491f3bfbSDavid Wu 	} else {
123*491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
124*491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
125*491f3bfbSDavid Wu 							 "phy-is-integrated");
126*491f3bfbSDavid Wu 	}
127*491f3bfbSDavid Wu 
128*491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
129*491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
130*491f3bfbSDavid Wu 		if (ret) {
131*491f3bfbSDavid Wu 			debug("No PHY reset control found: ret=%d\n", ret);
132*491f3bfbSDavid Wu 			return ret;
133*491f3bfbSDavid Wu 		}
134*491f3bfbSDavid Wu 	}
135*491f3bfbSDavid Wu 
1361f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1377ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1387ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1391f08aa1cSPhilipp Tomsich 
1401f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1411f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1427ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1431f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1447ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1450125bcf0SSjoerd Simons 
1466f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1476f0a52e9SDavid Wu 	return 0;
1486f0a52e9SDavid Wu #else
1490125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1506f0a52e9SDavid Wu #endif
1510125bcf0SSjoerd Simons }
1520125bcf0SSjoerd Simons 
1536f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
154*491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
155*491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
15618ae91c8SDavid Wu {
1576f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
15818ae91c8SDavid Wu 	struct px30_grf *grf;
15918ae91c8SDavid Wu 	struct clk clk_speed;
16018ae91c8SDavid Wu 	int speed, ret;
16118ae91c8SDavid Wu 	enum {
16218ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
16318ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
16418ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
16518ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
16618ae91c8SDavid Wu 	};
16718ae91c8SDavid Wu 
16818ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
16918ae91c8SDavid Wu 			      &clk_speed);
17018ae91c8SDavid Wu 	if (ret)
17118ae91c8SDavid Wu 		return ret;
17218ae91c8SDavid Wu 
17318ae91c8SDavid Wu 	switch (priv->phydev->speed) {
17418ae91c8SDavid Wu 	case 10:
17518ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
17618ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
17718ae91c8SDavid Wu 		if (ret)
17818ae91c8SDavid Wu 			return ret;
17918ae91c8SDavid Wu 		break;
18018ae91c8SDavid Wu 	case 100:
18118ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
18218ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
18318ae91c8SDavid Wu 		if (ret)
18418ae91c8SDavid Wu 			return ret;
18518ae91c8SDavid Wu 		break;
18618ae91c8SDavid Wu 	default:
18718ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
18818ae91c8SDavid Wu 		return -EINVAL;
18918ae91c8SDavid Wu 	}
19018ae91c8SDavid Wu 
19118ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
19218ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
19318ae91c8SDavid Wu 
19418ae91c8SDavid Wu 	return 0;
19518ae91c8SDavid Wu }
19618ae91c8SDavid Wu 
197*491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
198*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
199ff86648dSDavid Wu {
2006f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
201ff86648dSDavid Wu 	struct clk clk_speed;
202ff86648dSDavid Wu 	int ret;
203ff86648dSDavid Wu 
204ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
205ff86648dSDavid Wu 			      &clk_speed);
206ff86648dSDavid Wu 	if (ret)
207ff86648dSDavid Wu 		return ret;
208ff86648dSDavid Wu 
209ff86648dSDavid Wu 	switch (priv->phydev->speed) {
210ff86648dSDavid Wu 	case 10:
211ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
212ff86648dSDavid Wu 		if (ret)
213ff86648dSDavid Wu 			return ret;
214ff86648dSDavid Wu 		break;
215ff86648dSDavid Wu 	case 100:
216ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
217ff86648dSDavid Wu 		if (ret)
218ff86648dSDavid Wu 			return ret;
219ff86648dSDavid Wu 		break;
220ff86648dSDavid Wu 	case 1000:
221ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
222ff86648dSDavid Wu 		if (ret)
223ff86648dSDavid Wu 			return ret;
224ff86648dSDavid Wu 		break;
225ff86648dSDavid Wu 	default:
226ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
227ff86648dSDavid Wu 		return -EINVAL;
228ff86648dSDavid Wu 	}
229ff86648dSDavid Wu 
230ff86648dSDavid Wu 	return 0;
231ff86648dSDavid Wu }
232ff86648dSDavid Wu 
233*491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
234*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
235af166ffaSDavid Wu {
2366f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
237af166ffaSDavid Wu 	struct rk322x_grf *grf;
238af166ffaSDavid Wu 	int clk;
239af166ffaSDavid Wu 	enum {
240af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
241af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
242af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
243af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
244af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
245*491f3bfbSDavid Wu 
246*491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
247*491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
248*491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
249*491f3bfbSDavid Wu 
250*491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
251*491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
252*491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
253af166ffaSDavid Wu 	};
254af166ffaSDavid Wu 
255af166ffaSDavid Wu 	switch (priv->phydev->speed) {
256af166ffaSDavid Wu 	case 10:
257*491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
258*491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
259*491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
260af166ffaSDavid Wu 		break;
261af166ffaSDavid Wu 	case 100:
262*491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
263*491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
264*491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
265af166ffaSDavid Wu 		break;
266af166ffaSDavid Wu 	case 1000:
267af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
268af166ffaSDavid Wu 		break;
269af166ffaSDavid Wu 	default:
270af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
271af166ffaSDavid Wu 		return -EINVAL;
272af166ffaSDavid Wu 	}
273af166ffaSDavid Wu 
274af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
275*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
276*491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
277*491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
278*491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
279*491f3bfbSDavid Wu 		     clk);
280af166ffaSDavid Wu 
281af166ffaSDavid Wu 	return 0;
282af166ffaSDavid Wu }
283af166ffaSDavid Wu 
284*491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
285*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
2860125bcf0SSjoerd Simons {
2876f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
2880125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
2890125bcf0SSjoerd Simons 	int clk;
2900125bcf0SSjoerd Simons 
2910125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
2920125bcf0SSjoerd Simons 	case 10:
2931f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
2940125bcf0SSjoerd Simons 		break;
2950125bcf0SSjoerd Simons 	case 100:
2961f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
2970125bcf0SSjoerd Simons 		break;
2980125bcf0SSjoerd Simons 	case 1000:
2991f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3000125bcf0SSjoerd Simons 		break;
3010125bcf0SSjoerd Simons 	default:
3020125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3030125bcf0SSjoerd Simons 		return -EINVAL;
3040125bcf0SSjoerd Simons 	}
3050125bcf0SSjoerd Simons 
3060125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3071f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3080125bcf0SSjoerd Simons 
3090125bcf0SSjoerd Simons 	return 0;
3100125bcf0SSjoerd Simons }
3110125bcf0SSjoerd Simons 
312*491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
313*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
31423adb58fSDavid Wu {
3156f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
31623adb58fSDavid Wu 	struct rk3308_grf *grf;
31723adb58fSDavid Wu 	struct clk clk_speed;
31823adb58fSDavid Wu 	int speed, ret;
31923adb58fSDavid Wu 	enum {
32023adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
32123adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
32223adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
32323adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
32423adb58fSDavid Wu 	};
32523adb58fSDavid Wu 
32623adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
32723adb58fSDavid Wu 			      &clk_speed);
32823adb58fSDavid Wu 	if (ret)
32923adb58fSDavid Wu 		return ret;
33023adb58fSDavid Wu 
33123adb58fSDavid Wu 	switch (priv->phydev->speed) {
33223adb58fSDavid Wu 	case 10:
33323adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
33423adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
33523adb58fSDavid Wu 		if (ret)
33623adb58fSDavid Wu 			return ret;
33723adb58fSDavid Wu 		break;
33823adb58fSDavid Wu 	case 100:
33923adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
34023adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
34123adb58fSDavid Wu 		if (ret)
34223adb58fSDavid Wu 			return ret;
34323adb58fSDavid Wu 		break;
34423adb58fSDavid Wu 	default:
34523adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
34623adb58fSDavid Wu 		return -EINVAL;
34723adb58fSDavid Wu 	}
34823adb58fSDavid Wu 
34923adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
35023adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
35123adb58fSDavid Wu 
35223adb58fSDavid Wu 	return 0;
35323adb58fSDavid Wu }
35423adb58fSDavid Wu 
355*491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
356*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
357c36b26c0SDavid Wu {
3586f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
359c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
360c36b26c0SDavid Wu 	int clk;
361c36b26c0SDavid Wu 	enum {
362c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
363c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
364c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
365c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
366c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
367*491f3bfbSDavid Wu 
368*491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
369*491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
370*491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
371*491f3bfbSDavid Wu 
372*491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
373*491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
374*491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
375c36b26c0SDavid Wu 	};
376c36b26c0SDavid Wu 
377c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
378c36b26c0SDavid Wu 	case 10:
379*491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
380*491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
381*491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
382c36b26c0SDavid Wu 		break;
383c36b26c0SDavid Wu 	case 100:
384*491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
385*491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
386*491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
387c36b26c0SDavid Wu 		break;
388c36b26c0SDavid Wu 	case 1000:
389c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
390c36b26c0SDavid Wu 		break;
391c36b26c0SDavid Wu 	default:
392c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
393c36b26c0SDavid Wu 		return -EINVAL;
394c36b26c0SDavid Wu 	}
395c36b26c0SDavid Wu 
396c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
397*491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
398*491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
399*491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
400*491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
401*491f3bfbSDavid Wu 		     clk);
402c36b26c0SDavid Wu 
403c36b26c0SDavid Wu 	return 0;
404c36b26c0SDavid Wu }
405c36b26c0SDavid Wu 
406*491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
407*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
408793f2fd2SPhilipp Tomsich {
4096f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
410793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
411793f2fd2SPhilipp Tomsich 	int clk;
412793f2fd2SPhilipp Tomsich 	enum {
413793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
414793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
415793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
416793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
417793f2fd2SPhilipp Tomsich 	};
418793f2fd2SPhilipp Tomsich 
419793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
420793f2fd2SPhilipp Tomsich 	case 10:
421793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
422793f2fd2SPhilipp Tomsich 		break;
423793f2fd2SPhilipp Tomsich 	case 100:
424793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
425793f2fd2SPhilipp Tomsich 		break;
426793f2fd2SPhilipp Tomsich 	case 1000:
427793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
428793f2fd2SPhilipp Tomsich 		break;
429793f2fd2SPhilipp Tomsich 	default:
430793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
431793f2fd2SPhilipp Tomsich 		return -EINVAL;
432793f2fd2SPhilipp Tomsich 	}
433793f2fd2SPhilipp Tomsich 
434793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
435793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
436793f2fd2SPhilipp Tomsich 
437793f2fd2SPhilipp Tomsich 	return 0;
438793f2fd2SPhilipp Tomsich }
439793f2fd2SPhilipp Tomsich 
440*491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
441*491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4421f08aa1cSPhilipp Tomsich {
4436f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4441f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4451f08aa1cSPhilipp Tomsich 	int clk;
4461f08aa1cSPhilipp Tomsich 
4471f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4481f08aa1cSPhilipp Tomsich 	case 10:
4491f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4501f08aa1cSPhilipp Tomsich 		break;
4511f08aa1cSPhilipp Tomsich 	case 100:
4521f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4531f08aa1cSPhilipp Tomsich 		break;
4541f08aa1cSPhilipp Tomsich 	case 1000:
4551f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4561f08aa1cSPhilipp Tomsich 		break;
4571f08aa1cSPhilipp Tomsich 	default:
4581f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4591f08aa1cSPhilipp Tomsich 		return -EINVAL;
4601f08aa1cSPhilipp Tomsich 	}
4611f08aa1cSPhilipp Tomsich 
4621f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4631f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4641f08aa1cSPhilipp Tomsich 
4651f08aa1cSPhilipp Tomsich 	return 0;
4661f08aa1cSPhilipp Tomsich }
4671f08aa1cSPhilipp Tomsich 
468*491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
469*491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4700a33ce65SDavid Wu {
4716f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4720a33ce65SDavid Wu 	struct rv1108_grf *grf;
4730a33ce65SDavid Wu 	int clk, speed;
4740a33ce65SDavid Wu 	enum {
4750a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4760a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4770a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4780a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4790a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4800a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4810a33ce65SDavid Wu 	};
4820a33ce65SDavid Wu 
4830a33ce65SDavid Wu 	switch (priv->phydev->speed) {
4840a33ce65SDavid Wu 	case 10:
4850a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
4860a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
4870a33ce65SDavid Wu 		break;
4880a33ce65SDavid Wu 	case 100:
4890a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
4900a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
4910a33ce65SDavid Wu 		break;
4920a33ce65SDavid Wu 	default:
4930a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4940a33ce65SDavid Wu 		return -EINVAL;
4950a33ce65SDavid Wu 	}
4960a33ce65SDavid Wu 
4970a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4980a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
4990a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5000a33ce65SDavid Wu 		     clk | speed);
5010a33ce65SDavid Wu 
5020a33ce65SDavid Wu 	return 0;
5030a33ce65SDavid Wu }
504dcfb333aSDavid Wu #else
505*491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
506*491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
507dcfb333aSDavid Wu {
508dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
509dcfb333aSDavid Wu 	struct clk clk_speed;
510dcfb333aSDavid Wu 	int ret;
511dcfb333aSDavid Wu 
512dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
513dcfb333aSDavid Wu 			      &clk_speed);
514dcfb333aSDavid Wu 	if (ret) {
51533a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
51633a014bdSDavid Wu 		       __func__, ret);
517dcfb333aSDavid Wu 		return ret;
518dcfb333aSDavid Wu 	}
519dcfb333aSDavid Wu 
520dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
521dcfb333aSDavid Wu 	case 10:
522dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
523dcfb333aSDavid Wu 		if (ret)
524dcfb333aSDavid Wu 			return ret;
525dcfb333aSDavid Wu 		break;
526dcfb333aSDavid Wu 	case 100:
527dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
528dcfb333aSDavid Wu 		if (ret)
529dcfb333aSDavid Wu 			return ret;
530dcfb333aSDavid Wu 		break;
531dcfb333aSDavid Wu 	case 1000:
532dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
533dcfb333aSDavid Wu 		if (ret)
534dcfb333aSDavid Wu 			return ret;
535dcfb333aSDavid Wu 		break;
536dcfb333aSDavid Wu 	default:
537dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
538dcfb333aSDavid Wu 		return -EINVAL;
539dcfb333aSDavid Wu 	}
540dcfb333aSDavid Wu 
541dcfb333aSDavid Wu 	return 0;
542dcfb333aSDavid Wu }
5436f0a52e9SDavid Wu #endif
5440a33ce65SDavid Wu 
5456f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
54618ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
54718ae91c8SDavid Wu {
54818ae91c8SDavid Wu 	struct px30_grf *grf;
54918ae91c8SDavid Wu 	enum {
55018ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
55118ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
55218ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
55318ae91c8SDavid Wu 	};
55418ae91c8SDavid Wu 
55518ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
55618ae91c8SDavid Wu 
55718ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
55818ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
55918ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
56018ae91c8SDavid Wu }
56118ae91c8SDavid Wu 
562ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
563ff86648dSDavid Wu {
564ff86648dSDavid Wu 	struct rk1808_grf *grf;
565ff86648dSDavid Wu 	enum {
566ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
567ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
568ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
569ff86648dSDavid Wu 
570ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
571ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
572ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
573ff86648dSDavid Wu 
574ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
575ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
576ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
577ff86648dSDavid Wu 	};
578ff86648dSDavid Wu 	enum {
579ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
580ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
581ff86648dSDavid Wu 
582ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
583ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
584ff86648dSDavid Wu 	};
585ff86648dSDavid Wu 
586ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
587ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
588ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
589ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
590ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
591ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
592ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
593ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
594ff86648dSDavid Wu 
595ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
596ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
597ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
598ff86648dSDavid Wu 		     pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT |
599ff86648dSDavid Wu 		     pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT);
600ff86648dSDavid Wu }
601ff86648dSDavid Wu 
602af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
603af166ffaSDavid Wu {
604af166ffaSDavid Wu 	struct rk322x_grf *grf;
605af166ffaSDavid Wu 	enum {
606af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
607af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
608af166ffaSDavid Wu 
609af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
610af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
611af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
612af166ffaSDavid Wu 
613af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
614af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
615af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
616af166ffaSDavid Wu 
617af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
618af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
619af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
620af166ffaSDavid Wu 	};
621af166ffaSDavid Wu 	enum {
622af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
623af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
624af166ffaSDavid Wu 
625af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
626af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
627af166ffaSDavid Wu 	};
628af166ffaSDavid Wu 
629af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
630af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
631af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
632af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
633af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
634af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
635af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
636af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
637af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
638af166ffaSDavid Wu 
639af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
640af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
641af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
642af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
643af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
644af166ffaSDavid Wu }
645af166ffaSDavid Wu 
646*491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
647*491f3bfbSDavid Wu {
648*491f3bfbSDavid Wu 	struct rk322x_grf *grf;
649*491f3bfbSDavid Wu 	enum {
650*491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
651*491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
652*491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
653*491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
654*491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
655*491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
656*491f3bfbSDavid Wu 	};
657*491f3bfbSDavid Wu 
658*491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
659*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
660*491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
661*491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
662*491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
663*491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
664*491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
665*491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
666*491f3bfbSDavid Wu }
667*491f3bfbSDavid Wu 
6681f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
6691f08aa1cSPhilipp Tomsich {
6701f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
6711f08aa1cSPhilipp Tomsich 
6721f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
6731f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
6741f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
6751f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
6761f08aa1cSPhilipp Tomsich 
6771f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
6781f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
6791f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
6801f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
6811f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
6821f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
6831f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
6841f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
6851f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
6861f08aa1cSPhilipp Tomsich }
6871f08aa1cSPhilipp Tomsich 
68823adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
68923adb58fSDavid Wu {
69023adb58fSDavid Wu 	struct rk3308_grf *grf;
69123adb58fSDavid Wu 	enum {
69223adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
69323adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
69423adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
69523adb58fSDavid Wu 	};
69623adb58fSDavid Wu 
69723adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
69823adb58fSDavid Wu 
69923adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
70023adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
70123adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
70223adb58fSDavid Wu }
70323adb58fSDavid Wu 
704c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
705c36b26c0SDavid Wu {
706c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
707c36b26c0SDavid Wu 	enum {
708c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
709c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
710c36b26c0SDavid Wu 
711c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
712c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
713c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
714c36b26c0SDavid Wu 
715c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
716c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
717c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
718c36b26c0SDavid Wu 
719c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
720c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
721c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
722c36b26c0SDavid Wu 	};
723c36b26c0SDavid Wu 	enum {
724c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
725c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
726c36b26c0SDavid Wu 
727c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
728c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
729c36b26c0SDavid Wu 	};
730c36b26c0SDavid Wu 
731c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
732c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
733c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
734c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
735c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
736c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
737c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
738c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
739c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
740c36b26c0SDavid Wu 
741c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
742c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
743c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
744c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
745c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
746c36b26c0SDavid Wu }
747c36b26c0SDavid Wu 
748*491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
749*491f3bfbSDavid Wu {
750*491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
751*491f3bfbSDavid Wu 	enum {
752*491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
753*491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
754*491f3bfbSDavid Wu 
755*491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
756*491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
757*491f3bfbSDavid Wu 	};
758*491f3bfbSDavid Wu 
759*491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
760*491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
761*491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
762*491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
763*491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
764*491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
765*491f3bfbSDavid Wu }
766*491f3bfbSDavid Wu 
767793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
768793f2fd2SPhilipp Tomsich {
769793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
770793f2fd2SPhilipp Tomsich 	enum {
771793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
772793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
773793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
774793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
775793f2fd2SPhilipp Tomsich 	};
776793f2fd2SPhilipp Tomsich 	enum {
777793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
778793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
779793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
780793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
781793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
782793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
783793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
784793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
785793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
786793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
787793f2fd2SPhilipp Tomsich 	};
788793f2fd2SPhilipp Tomsich 
789793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
790793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
791793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
792793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
793793f2fd2SPhilipp Tomsich 
794793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
795793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
796793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
797793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
798793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
799793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
800793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
801793f2fd2SPhilipp Tomsich 		     pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT |
802793f2fd2SPhilipp Tomsich 		     pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT);
803793f2fd2SPhilipp Tomsich }
804793f2fd2SPhilipp Tomsich 
8051f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
8061f08aa1cSPhilipp Tomsich {
8071f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
8081f08aa1cSPhilipp Tomsich 
8091f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
8101f08aa1cSPhilipp Tomsich 
8111f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
8121f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
8131f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
8141f08aa1cSPhilipp Tomsich 
8151f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
8161f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
8171f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
8181f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
8191f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
8201f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
8211f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
8221f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT |
8231f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT);
8241f08aa1cSPhilipp Tomsich }
8251f08aa1cSPhilipp Tomsich 
8260a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
8270a33ce65SDavid Wu {
8280a33ce65SDavid Wu 	struct rv1108_grf *grf;
8290a33ce65SDavid Wu 
8300a33ce65SDavid Wu 	enum {
8310a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
8320a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
8330a33ce65SDavid Wu 	};
8340a33ce65SDavid Wu 
8350a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
8360a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
8370a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
8380a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
8390a33ce65SDavid Wu }
840*491f3bfbSDavid Wu 
841*491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
842*491f3bfbSDavid Wu {
843*491f3bfbSDavid Wu 	struct rk322x_grf *grf;
844*491f3bfbSDavid Wu 	enum {
845*491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
846*491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
847*491f3bfbSDavid Wu 	};
848*491f3bfbSDavid Wu 	enum {
849*491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
850*491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
851*491f3bfbSDavid Wu 
852*491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
853*491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
854*491f3bfbSDavid Wu 
855*491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
856*491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
857*491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
858*491f3bfbSDavid Wu 	};
859*491f3bfbSDavid Wu 	enum {
860*491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
861*491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
862*491f3bfbSDavid Wu 	};
863*491f3bfbSDavid Wu 	enum {
864*491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
865*491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
866*491f3bfbSDavid Wu 	};
867*491f3bfbSDavid Wu 
868*491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
869*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
870*491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
871*491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
872*491f3bfbSDavid Wu 
873*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
874*491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
875*491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
876*491f3bfbSDavid Wu 
877*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
878*491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
879*491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
880*491f3bfbSDavid Wu 
881*491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
882*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
883*491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
884*491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
885*491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
886*491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
887*491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
888*491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
889*491f3bfbSDavid Wu 
890*491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
891*491f3bfbSDavid Wu 	udelay(10);
892*491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
893*491f3bfbSDavid Wu 	udelay(10);
894*491f3bfbSDavid Wu 
895*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
896*491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
897*491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
898*491f3bfbSDavid Wu 	udelay(30 * 1000);
899*491f3bfbSDavid Wu }
900*491f3bfbSDavid Wu 
901*491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
902*491f3bfbSDavid Wu {
903*491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
904*491f3bfbSDavid Wu 	enum {
905*491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
906*491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
907*491f3bfbSDavid Wu 	};
908*491f3bfbSDavid Wu 	enum {
909*491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
910*491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
911*491f3bfbSDavid Wu 
912*491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
913*491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
914*491f3bfbSDavid Wu 
915*491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
916*491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
917*491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
918*491f3bfbSDavid Wu 	};
919*491f3bfbSDavid Wu 	enum {
920*491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
921*491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
922*491f3bfbSDavid Wu 	};
923*491f3bfbSDavid Wu 	enum {
924*491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
925*491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
926*491f3bfbSDavid Wu 	};
927*491f3bfbSDavid Wu 
928*491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
929*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
930*491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
931*491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
932*491f3bfbSDavid Wu 
933*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
934*491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
935*491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
936*491f3bfbSDavid Wu 
937*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
938*491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
939*491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
940*491f3bfbSDavid Wu 
941*491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
942*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
943*491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
944*491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
945*491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
946*491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
947*491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
948*491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
949*491f3bfbSDavid Wu 
950*491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
951*491f3bfbSDavid Wu 	udelay(10);
952*491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
953*491f3bfbSDavid Wu 	udelay(10);
954*491f3bfbSDavid Wu 
955*491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
956*491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
957*491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
958*491f3bfbSDavid Wu 	udelay(30 * 1000);
959*491f3bfbSDavid Wu }
960*491f3bfbSDavid Wu 
961dcfb333aSDavid Wu #else
96233a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
96333a014bdSDavid Wu {
96433a014bdSDavid Wu 	struct rk3568_grf *grf;
96533a014bdSDavid Wu 	void *con1;
96633a014bdSDavid Wu 
96733a014bdSDavid Wu 	enum {
96833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
96933a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
97033a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
97133a014bdSDavid Wu 	};
97233a014bdSDavid Wu 
97333a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
97433a014bdSDavid Wu 
97533a014bdSDavid Wu 	if (pdata->bus_id == 1)
97633a014bdSDavid Wu 		con1 = &grf->mac1_con1;
97733a014bdSDavid Wu 	else
97833a014bdSDavid Wu 		con1 = &grf->mac0_con1;
97933a014bdSDavid Wu 
98033a014bdSDavid Wu 	rk_clrsetreg(con1,
98133a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
98233a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
98333a014bdSDavid Wu }
98433a014bdSDavid Wu 
98533a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
98633a014bdSDavid Wu {
98733a014bdSDavid Wu 	struct rk3568_grf *grf;
98833a014bdSDavid Wu 	void *con0, *con1;
98933a014bdSDavid Wu 
99033a014bdSDavid Wu 	enum {
99133a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
99233a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
99333a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
99433a014bdSDavid Wu 
99533a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
99633a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
99733a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
99833a014bdSDavid Wu 
99933a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
100033a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
100133a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
100233a014bdSDavid Wu 	};
100333a014bdSDavid Wu 
100433a014bdSDavid Wu 	enum {
100533a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
100633a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
100733a014bdSDavid Wu 
100833a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
100933a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
101033a014bdSDavid Wu 	};
101133a014bdSDavid Wu 
101233a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
101333a014bdSDavid Wu 
101433a014bdSDavid Wu 	if (pdata->bus_id == 1) {
101533a014bdSDavid Wu 		con0 = &grf->mac1_con0;
101633a014bdSDavid Wu 		con1 = &grf->mac1_con1;
101733a014bdSDavid Wu 	} else {
101833a014bdSDavid Wu 		con0 = &grf->mac0_con0;
101933a014bdSDavid Wu 		con1 = &grf->mac0_con1;
102033a014bdSDavid Wu 	}
102133a014bdSDavid Wu 
102233a014bdSDavid Wu 	rk_clrsetreg(con0,
102333a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
102433a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
102533a014bdSDavid Wu 		     pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT |
102633a014bdSDavid Wu 		     pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT);
102733a014bdSDavid Wu 
102833a014bdSDavid Wu 	rk_clrsetreg(con1,
102933a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
103033a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
103133a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
103233a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
103333a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
103433a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
103533a014bdSDavid Wu }
103633a014bdSDavid Wu 
1037e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1038e4e3f431SDavid Wu {
1039e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1040e4e3f431SDavid Wu 
1041e4e3f431SDavid Wu 	enum {
1042e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1043e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1044e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1045e4e3f431SDavid Wu 	};
1046e4e3f431SDavid Wu 
1047e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1048e4e3f431SDavid Wu 
1049e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1050e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1051e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1052e4e3f431SDavid Wu }
1053e4e3f431SDavid Wu 
1054dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1055dcfb333aSDavid Wu {
1056dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1057dcfb333aSDavid Wu 
1058dcfb333aSDavid Wu 	enum {
1059dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1060dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1061dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1062dcfb333aSDavid Wu 
1063dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1064dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1065dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1066dcfb333aSDavid Wu 
1067dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1068dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1069dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1070dcfb333aSDavid Wu 
1071dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1072dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1073dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1074dcfb333aSDavid Wu 
1075dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1076dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1077dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1078dcfb333aSDavid Wu 	};
1079dcfb333aSDavid Wu 	enum {
1080dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1081dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1082dcfb333aSDavid Wu 
1083dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1084dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1085dcfb333aSDavid Wu 	};
1086dcfb333aSDavid Wu 	enum {
1087dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1088dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1089dcfb333aSDavid Wu 
1090dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1091dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1092dcfb333aSDavid Wu 	};
1093dcfb333aSDavid Wu 
1094dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1095dcfb333aSDavid Wu 
1096dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1097dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1098dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1099dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1100dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1101dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1102dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1103dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1104dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1105dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1106dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1107dcfb333aSDavid Wu 
1108dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1109dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1110dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1111dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT |
1112dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT);
1113dcfb333aSDavid Wu 
1114dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1115dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1116dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1117dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT |
1118dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT);
1119dcfb333aSDavid Wu }
11206f0a52e9SDavid Wu #endif
11210a33ce65SDavid Wu 
11220125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
11230125bcf0SSjoerd Simons {
11240125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
11251f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
11261f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
11276f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
11286f0a52e9SDavid Wu 	struct eqos_config *config;
11296f0a52e9SDavid Wu #else
11306f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
11316f0a52e9SDavid Wu #endif
11326f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
11330125bcf0SSjoerd Simons 	struct clk clk;
11340a33ce65SDavid Wu 	ulong rate;
11350125bcf0SSjoerd Simons 	int ret;
11360125bcf0SSjoerd Simons 
11376f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
11386f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
11396f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
1140befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
11416f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
11426f0a52e9SDavid Wu #else
11436f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
11446f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
11456f0a52e9SDavid Wu #endif
114633a014bdSDavid Wu 	pdata->bus_id = dev->seq;
1147cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1148cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
1149cadc8d74SKever Yang 	if (ret)
1150cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
1151cadc8d74SKever Yang 
11520125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
11530125bcf0SSjoerd Simons 	if (ret)
11540125bcf0SSjoerd Simons 		return ret;
11550125bcf0SSjoerd Simons 
1156*491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
1157*491f3bfbSDavid Wu 
1158*491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
1159*491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
1160*491f3bfbSDavid Wu 
11610a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
11620a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
11630a33ce65SDavid Wu 		/*
11640a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
11650a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
11660a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
11670a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
11680a33ce65SDavid Wu 		 */
11690a33ce65SDavid Wu 		if (!pdata->clock_input) {
11700a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 125000000);
11710a33ce65SDavid Wu 			if (rate != 125000000)
11720a33ce65SDavid Wu 				return -EINVAL;
11730a33ce65SDavid Wu 		}
11740125bcf0SSjoerd Simons 
11750125bcf0SSjoerd Simons 		/* Set to RGMII mode */
11760a33ce65SDavid Wu 		if (ops->set_to_rgmii)
11771f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
11780a33ce65SDavid Wu 		else
11790a33ce65SDavid Wu 			return -EPERM;
11800a33ce65SDavid Wu 
11810a33ce65SDavid Wu 		break;
11820a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
11830a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
11840a33ce65SDavid Wu 		if (!pdata->clock_input) {
11850a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 50000000);
11860a33ce65SDavid Wu 			if (rate != 50000000)
11870a33ce65SDavid Wu 				return -EINVAL;
11880a33ce65SDavid Wu 		}
11890a33ce65SDavid Wu 
11900a33ce65SDavid Wu 		/* Set to RMII mode */
11910a33ce65SDavid Wu 		if (ops->set_to_rmii)
11920a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
11930a33ce65SDavid Wu 		else
11940a33ce65SDavid Wu 			return -EPERM;
11950a33ce65SDavid Wu 
11960a33ce65SDavid Wu 		break;
11970a33ce65SDavid Wu 	default:
11980a33ce65SDavid Wu 		debug("NO interface defined!\n");
11990a33ce65SDavid Wu 		return -ENXIO;
12000a33ce65SDavid Wu 	}
12010125bcf0SSjoerd Simons 
12026f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12036f0a52e9SDavid Wu 	return eqos_probe(dev);
12046f0a52e9SDavid Wu #else
12050125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
12066f0a52e9SDavid Wu #endif
12076f0a52e9SDavid Wu }
12086f0a52e9SDavid Wu 
12096f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
12106f0a52e9SDavid Wu {
12116f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
12126f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
12136f0a52e9SDavid Wu #else
12146f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
12156f0a52e9SDavid Wu #endif
12166f0a52e9SDavid Wu }
12176f0a52e9SDavid Wu 
12186f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
12196f0a52e9SDavid Wu 				      int length)
12206f0a52e9SDavid Wu {
12216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12226f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
12236f0a52e9SDavid Wu #else
12246f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
12256f0a52e9SDavid Wu #endif
12266f0a52e9SDavid Wu }
12276f0a52e9SDavid Wu 
12286f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
12296f0a52e9SDavid Wu 				  int length)
12306f0a52e9SDavid Wu {
12316f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12326f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
12336f0a52e9SDavid Wu #else
12346f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
12356f0a52e9SDavid Wu #endif
12366f0a52e9SDavid Wu }
12376f0a52e9SDavid Wu 
12386f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
12396f0a52e9SDavid Wu 				  uchar **packetp)
12406f0a52e9SDavid Wu {
12416f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12426f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
12436f0a52e9SDavid Wu #else
12446f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
12456f0a52e9SDavid Wu #endif
12460125bcf0SSjoerd Simons }
12470125bcf0SSjoerd Simons 
12480125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
12490125bcf0SSjoerd Simons {
12506f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
12511f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
12521f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
12536f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1254*491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
12556f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
12566f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
12576f0a52e9SDavid Wu #endif
12580125bcf0SSjoerd Simons 	int ret;
12590125bcf0SSjoerd Simons 
12606f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12616f0a52e9SDavid Wu 	ret = eqos_init(dev);
12626f0a52e9SDavid Wu #else
12636f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
12646f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
12656f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
12666f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
12676f0a52e9SDavid Wu #endif
12680125bcf0SSjoerd Simons 	if (ret)
12690125bcf0SSjoerd Simons 		return ret;
1270*491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
12710125bcf0SSjoerd Simons 	if (ret)
12720125bcf0SSjoerd Simons 		return ret;
12736f0a52e9SDavid Wu 
12746f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12756f0a52e9SDavid Wu 	eqos_enable(dev);
12766f0a52e9SDavid Wu #else
12776f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
12780125bcf0SSjoerd Simons 	if (ret)
12790125bcf0SSjoerd Simons 		return ret;
12806f0a52e9SDavid Wu #endif
12810125bcf0SSjoerd Simons 
12820125bcf0SSjoerd Simons 	return 0;
12830125bcf0SSjoerd Simons }
12840125bcf0SSjoerd Simons 
12856f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
12866f0a52e9SDavid Wu {
12876f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
12886f0a52e9SDavid Wu 	eqos_stop(dev);
12896f0a52e9SDavid Wu #else
12906f0a52e9SDavid Wu 	designware_eth_stop(dev);
12916f0a52e9SDavid Wu #endif
12926f0a52e9SDavid Wu }
12936f0a52e9SDavid Wu 
12940125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
12950125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
12966f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
12976f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
12986f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
12996f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
13006f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
13010125bcf0SSjoerd Simons };
13020125bcf0SSjoerd Simons 
13036f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
130418ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
130518ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
130618ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
130718ae91c8SDavid Wu };
130818ae91c8SDavid Wu 
1309ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
1310ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
1311ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
1312ff86648dSDavid Wu };
1313ff86648dSDavid Wu 
1314af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
1315af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
1316*491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
1317af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
1318*491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
1319af166ffaSDavid Wu };
1320af166ffaSDavid Wu 
13211f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
13221f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
13231f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
13241f08aa1cSPhilipp Tomsich };
13251f08aa1cSPhilipp Tomsich 
132623adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
132723adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
132823adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
132923adb58fSDavid Wu };
133023adb58fSDavid Wu 
1331c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
1332c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
1333*491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
1334c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
1335*491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
1336c36b26c0SDavid Wu };
1337c36b26c0SDavid Wu 
1338793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
1339793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
1340793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
1341793f2fd2SPhilipp Tomsich };
1342793f2fd2SPhilipp Tomsich 
13431f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
13441f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
13451f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
13461f08aa1cSPhilipp Tomsich };
13471f08aa1cSPhilipp Tomsich 
13480a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
13490a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
13500a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
13510a33ce65SDavid Wu };
1352dcfb333aSDavid Wu #else
135333a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
135433a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
135533a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
135633a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
135733a014bdSDavid Wu };
135833a014bdSDavid Wu 
1359dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
1360dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
1361dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
1362e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
1363dcfb333aSDavid Wu };
13646f0a52e9SDavid Wu #endif
13650a33ce65SDavid Wu 
13660125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
13676f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
136818ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
136918ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
1370ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
1371ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
1372af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
1373af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
13741f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
13751f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
137623adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
137723adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
1378c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
1379c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
1380793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
1381793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
13821f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
13831f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
13840a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
13850a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
1386dcfb333aSDavid Wu #else
138733a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
138833a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
1389dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
1390dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
13916f0a52e9SDavid Wu #endif
13920125bcf0SSjoerd Simons 	{ }
13930125bcf0SSjoerd Simons };
13940125bcf0SSjoerd Simons 
13950125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
13960125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
13970125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
13980125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
13990125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
14000125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
14010125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
14026f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
14030125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
14040125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
14050125bcf0SSjoerd Simons };
1406