xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision c563400a37d6b591b309462a65ec9b887f82327f)
10125bcf0SSjoerd Simons /*
20125bcf0SSjoerd Simons  * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
30125bcf0SSjoerd Simons  *
40125bcf0SSjoerd Simons  * SPDX-License-Identifier:	GPL-2.0+
50125bcf0SSjoerd Simons  *
60125bcf0SSjoerd Simons  * Rockchip GMAC ethernet IP driver for U-Boot
70125bcf0SSjoerd Simons  */
80125bcf0SSjoerd Simons 
90125bcf0SSjoerd Simons #include <common.h>
100125bcf0SSjoerd Simons #include <dm.h>
110125bcf0SSjoerd Simons #include <clk.h>
12535678cdSDavid Wu #include <misc.h>
130125bcf0SSjoerd Simons #include <phy.h>
14491f3bfbSDavid Wu #include <reset.h>
150125bcf0SSjoerd Simons #include <syscon.h>
160125bcf0SSjoerd Simons #include <asm/io.h>
170125bcf0SSjoerd Simons #include <asm/arch/periph.h>
180125bcf0SSjoerd Simons #include <asm/arch/clock.h>
191f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h>
206f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
21*c563400aSDavid Wu #include <asm/arch/grf_rk3528.h>
2233a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
23bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
2420bef841SDavid Wu #include <asm/arch/grf_rv1106.h>
25dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
266f0a52e9SDavid Wu #include "dwc_eth_qos.h"
276f0a52e9SDavid Wu #else
2818ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
29ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
30af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
310125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
3223adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
33c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
34793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
351f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
360a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
370125bcf0SSjoerd Simons #include "designware.h"
386f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
396f0a52e9SDavid Wu #endif
406f0a52e9SDavid Wu #include <dm/pinctrl.h>
41491f3bfbSDavid Wu #include <dm/of_access.h>
420125bcf0SSjoerd Simons 
430125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
440125bcf0SSjoerd Simons 
456f0a52e9SDavid Wu struct rockchip_eth_dev {
466f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
476f0a52e9SDavid Wu 	struct eqos_priv eqos;
486f0a52e9SDavid Wu #else
496f0a52e9SDavid Wu 	struct dw_eth_dev dw;
506f0a52e9SDavid Wu #endif
51491f3bfbSDavid Wu 	int phy_interface;
526f0a52e9SDavid Wu };
536f0a52e9SDavid Wu 
540125bcf0SSjoerd Simons /*
550125bcf0SSjoerd Simons  * Platform data for the gmac
560125bcf0SSjoerd Simons  *
570125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
580125bcf0SSjoerd Simons  */
590125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
606f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
610125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
626f0a52e9SDavid Wu #else
636f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
646f0a52e9SDavid Wu #endif
65491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
66491f3bfbSDavid Wu 	bool integrated_phy;
670a33ce65SDavid Wu 	bool clock_input;
68491f3bfbSDavid Wu 	int phy_interface;
690125bcf0SSjoerd Simons 	int tx_delay;
700125bcf0SSjoerd Simons 	int rx_delay;
7133a014bdSDavid Wu 	int bus_id;
720125bcf0SSjoerd Simons };
730125bcf0SSjoerd Simons 
741f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
756f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
766f0a52e9SDavid Wu 	const struct eqos_config config;
776f0a52e9SDavid Wu #endif
78491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
79491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
800a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
811f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
82bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
83491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
841f08aa1cSPhilipp Tomsich };
851f08aa1cSPhilipp Tomsich 
86befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
87befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
88befcb627SDavid Wu 	.reg_access_always_ok = false,
89befcb627SDavid Wu 	.mdio_wait = 10000,
90befcb627SDavid Wu 	.swr_wait = 200,
91befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
92befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
93befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
94befcb627SDavid Wu };
95befcb627SDavid Wu #endif
96befcb627SDavid Wu 
971eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
981eb9d064SDavid Wu {
991eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1001eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
1011eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
1021eb9d064SDavid Wu 
1031eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1041eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1051eb9d064SDavid Wu 
1061eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1071eb9d064SDavid Wu }
1081f08aa1cSPhilipp Tomsich 
1090125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1100125bcf0SSjoerd Simons {
1110125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
112491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
11354f7ad44SDavid Wu 	struct udevice *phydev;
1140a33ce65SDavid Wu 	const char *string;
115491f3bfbSDavid Wu 	int ret;
1160a33ce65SDavid Wu 
1170a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1180a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1190a33ce65SDavid Wu 		pdata->clock_input = true;
1200a33ce65SDavid Wu 	else
1210a33ce65SDavid Wu 		pdata->clock_input = false;
1220125bcf0SSjoerd Simons 
123491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
124491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
125491f3bfbSDavid Wu 	if (ret) {
126491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
127491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
128491f3bfbSDavid Wu 	} else {
129491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
130491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
131491f3bfbSDavid Wu 							 "phy-is-integrated");
132491f3bfbSDavid Wu 	}
133491f3bfbSDavid Wu 
134491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
135491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
136491f3bfbSDavid Wu 		if (ret) {
13754f7ad44SDavid Wu 			ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
13854f7ad44SDavid Wu 			if (ret) {
13954f7ad44SDavid Wu 				debug("Get phydev by ofnode failed: err=%d\n", ret);
14054f7ad44SDavid Wu 				return ret;
14154f7ad44SDavid Wu 			}
14254f7ad44SDavid Wu 
14354f7ad44SDavid Wu 			ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
14454f7ad44SDavid Wu 			if (ret) {
145491f3bfbSDavid Wu 				debug("No PHY reset control found: ret=%d\n", ret);
146491f3bfbSDavid Wu 				return ret;
147491f3bfbSDavid Wu 			}
148491f3bfbSDavid Wu 		}
14954f7ad44SDavid Wu 	}
150491f3bfbSDavid Wu 
1511f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1527ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1537ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1541f08aa1cSPhilipp Tomsich 
1551f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1561f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1577ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1581f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1597ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1600125bcf0SSjoerd Simons 
1616f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1626f0a52e9SDavid Wu 	return 0;
1636f0a52e9SDavid Wu #else
1640125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1656f0a52e9SDavid Wu #endif
1660125bcf0SSjoerd Simons }
1670125bcf0SSjoerd Simons 
1686f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
169491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
170491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
17118ae91c8SDavid Wu {
1726f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
17318ae91c8SDavid Wu 	struct px30_grf *grf;
17418ae91c8SDavid Wu 	struct clk clk_speed;
17518ae91c8SDavid Wu 	int speed, ret;
17618ae91c8SDavid Wu 	enum {
17718ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
17818ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
17918ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
18018ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
18118ae91c8SDavid Wu 	};
18218ae91c8SDavid Wu 
18318ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
18418ae91c8SDavid Wu 			      &clk_speed);
18518ae91c8SDavid Wu 	if (ret)
18618ae91c8SDavid Wu 		return ret;
18718ae91c8SDavid Wu 
18818ae91c8SDavid Wu 	switch (priv->phydev->speed) {
18918ae91c8SDavid Wu 	case 10:
19018ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
19118ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
19218ae91c8SDavid Wu 		if (ret)
19318ae91c8SDavid Wu 			return ret;
19418ae91c8SDavid Wu 		break;
19518ae91c8SDavid Wu 	case 100:
19618ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
19718ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
19818ae91c8SDavid Wu 		if (ret)
19918ae91c8SDavid Wu 			return ret;
20018ae91c8SDavid Wu 		break;
20118ae91c8SDavid Wu 	default:
20218ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
20318ae91c8SDavid Wu 		return -EINVAL;
20418ae91c8SDavid Wu 	}
20518ae91c8SDavid Wu 
20618ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
20718ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
20818ae91c8SDavid Wu 
20918ae91c8SDavid Wu 	return 0;
21018ae91c8SDavid Wu }
21118ae91c8SDavid Wu 
212491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
213491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
214ff86648dSDavid Wu {
2156f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
216ff86648dSDavid Wu 	struct clk clk_speed;
217ff86648dSDavid Wu 	int ret;
218ff86648dSDavid Wu 
219ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
220ff86648dSDavid Wu 			      &clk_speed);
221ff86648dSDavid Wu 	if (ret)
222ff86648dSDavid Wu 		return ret;
223ff86648dSDavid Wu 
224ff86648dSDavid Wu 	switch (priv->phydev->speed) {
225ff86648dSDavid Wu 	case 10:
226ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
227ff86648dSDavid Wu 		if (ret)
228ff86648dSDavid Wu 			return ret;
229ff86648dSDavid Wu 		break;
230ff86648dSDavid Wu 	case 100:
231ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
232ff86648dSDavid Wu 		if (ret)
233ff86648dSDavid Wu 			return ret;
234ff86648dSDavid Wu 		break;
235ff86648dSDavid Wu 	case 1000:
236ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
237ff86648dSDavid Wu 		if (ret)
238ff86648dSDavid Wu 			return ret;
239ff86648dSDavid Wu 		break;
240ff86648dSDavid Wu 	default:
241ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
242ff86648dSDavid Wu 		return -EINVAL;
243ff86648dSDavid Wu 	}
244ff86648dSDavid Wu 
245ff86648dSDavid Wu 	return 0;
246ff86648dSDavid Wu }
247ff86648dSDavid Wu 
248491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
249491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
250af166ffaSDavid Wu {
2516f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
252af166ffaSDavid Wu 	struct rk322x_grf *grf;
253af166ffaSDavid Wu 	int clk;
254af166ffaSDavid Wu 	enum {
255af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
256af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
257af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
258af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
259af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
260491f3bfbSDavid Wu 
261491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
262491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
263491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
264491f3bfbSDavid Wu 
265491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
266491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
267491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
268af166ffaSDavid Wu 	};
269af166ffaSDavid Wu 
270af166ffaSDavid Wu 	switch (priv->phydev->speed) {
271af166ffaSDavid Wu 	case 10:
272491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
273491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
274491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
275af166ffaSDavid Wu 		break;
276af166ffaSDavid Wu 	case 100:
277491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
278491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
279491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
280af166ffaSDavid Wu 		break;
281af166ffaSDavid Wu 	case 1000:
282af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
283af166ffaSDavid Wu 		break;
284af166ffaSDavid Wu 	default:
285af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
286af166ffaSDavid Wu 		return -EINVAL;
287af166ffaSDavid Wu 	}
288af166ffaSDavid Wu 
289af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
290491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
291491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
292491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
293491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
294491f3bfbSDavid Wu 		     clk);
295af166ffaSDavid Wu 
296af166ffaSDavid Wu 	return 0;
297af166ffaSDavid Wu }
298af166ffaSDavid Wu 
299491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
300491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
3010125bcf0SSjoerd Simons {
3026f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3030125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
3040125bcf0SSjoerd Simons 	int clk;
3050125bcf0SSjoerd Simons 
3060125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
3070125bcf0SSjoerd Simons 	case 10:
3081f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
3090125bcf0SSjoerd Simons 		break;
3100125bcf0SSjoerd Simons 	case 100:
3111f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
3120125bcf0SSjoerd Simons 		break;
3130125bcf0SSjoerd Simons 	case 1000:
3141f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3150125bcf0SSjoerd Simons 		break;
3160125bcf0SSjoerd Simons 	default:
3170125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3180125bcf0SSjoerd Simons 		return -EINVAL;
3190125bcf0SSjoerd Simons 	}
3200125bcf0SSjoerd Simons 
3210125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3221f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3230125bcf0SSjoerd Simons 
3240125bcf0SSjoerd Simons 	return 0;
3250125bcf0SSjoerd Simons }
3260125bcf0SSjoerd Simons 
327491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
328491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
32923adb58fSDavid Wu {
3306f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
33123adb58fSDavid Wu 	struct rk3308_grf *grf;
33223adb58fSDavid Wu 	struct clk clk_speed;
33323adb58fSDavid Wu 	int speed, ret;
33423adb58fSDavid Wu 	enum {
33523adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
33623adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
33723adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
33823adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
33923adb58fSDavid Wu 	};
34023adb58fSDavid Wu 
34123adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
34223adb58fSDavid Wu 			      &clk_speed);
34323adb58fSDavid Wu 	if (ret)
34423adb58fSDavid Wu 		return ret;
34523adb58fSDavid Wu 
34623adb58fSDavid Wu 	switch (priv->phydev->speed) {
34723adb58fSDavid Wu 	case 10:
34823adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
34923adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
35023adb58fSDavid Wu 		if (ret)
35123adb58fSDavid Wu 			return ret;
35223adb58fSDavid Wu 		break;
35323adb58fSDavid Wu 	case 100:
35423adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
35523adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
35623adb58fSDavid Wu 		if (ret)
35723adb58fSDavid Wu 			return ret;
35823adb58fSDavid Wu 		break;
35923adb58fSDavid Wu 	default:
36023adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
36123adb58fSDavid Wu 		return -EINVAL;
36223adb58fSDavid Wu 	}
36323adb58fSDavid Wu 
36423adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
36523adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
36623adb58fSDavid Wu 
36723adb58fSDavid Wu 	return 0;
36823adb58fSDavid Wu }
36923adb58fSDavid Wu 
370491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
371491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
372c36b26c0SDavid Wu {
3736f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
374c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
375c36b26c0SDavid Wu 	int clk;
376c36b26c0SDavid Wu 	enum {
377c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
378c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
379c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
380c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
381c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
382491f3bfbSDavid Wu 
383491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
384491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
385491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
386491f3bfbSDavid Wu 
387491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
388491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
389491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
390c36b26c0SDavid Wu 	};
391c36b26c0SDavid Wu 
392c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
393c36b26c0SDavid Wu 	case 10:
394491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
395491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
396491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
397c36b26c0SDavid Wu 		break;
398c36b26c0SDavid Wu 	case 100:
399491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
400491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
401491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
402c36b26c0SDavid Wu 		break;
403c36b26c0SDavid Wu 	case 1000:
404c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
405c36b26c0SDavid Wu 		break;
406c36b26c0SDavid Wu 	default:
407c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
408c36b26c0SDavid Wu 		return -EINVAL;
409c36b26c0SDavid Wu 	}
410c36b26c0SDavid Wu 
411c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
412491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
413491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
414491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
415491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
416491f3bfbSDavid Wu 		     clk);
417c36b26c0SDavid Wu 
418c36b26c0SDavid Wu 	return 0;
419c36b26c0SDavid Wu }
420c36b26c0SDavid Wu 
421491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
422491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
423793f2fd2SPhilipp Tomsich {
4246f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
425793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
426793f2fd2SPhilipp Tomsich 	int clk;
427793f2fd2SPhilipp Tomsich 	enum {
428793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
429793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
430793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
431793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
432793f2fd2SPhilipp Tomsich 	};
433793f2fd2SPhilipp Tomsich 
434793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
435793f2fd2SPhilipp Tomsich 	case 10:
436793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
437793f2fd2SPhilipp Tomsich 		break;
438793f2fd2SPhilipp Tomsich 	case 100:
439793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
440793f2fd2SPhilipp Tomsich 		break;
441793f2fd2SPhilipp Tomsich 	case 1000:
442793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
443793f2fd2SPhilipp Tomsich 		break;
444793f2fd2SPhilipp Tomsich 	default:
445793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
446793f2fd2SPhilipp Tomsich 		return -EINVAL;
447793f2fd2SPhilipp Tomsich 	}
448793f2fd2SPhilipp Tomsich 
449793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
450793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
451793f2fd2SPhilipp Tomsich 
452793f2fd2SPhilipp Tomsich 	return 0;
453793f2fd2SPhilipp Tomsich }
454793f2fd2SPhilipp Tomsich 
455491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
456491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4571f08aa1cSPhilipp Tomsich {
4586f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4591f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4601f08aa1cSPhilipp Tomsich 	int clk;
4611f08aa1cSPhilipp Tomsich 
4621f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4631f08aa1cSPhilipp Tomsich 	case 10:
4641f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4651f08aa1cSPhilipp Tomsich 		break;
4661f08aa1cSPhilipp Tomsich 	case 100:
4671f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4681f08aa1cSPhilipp Tomsich 		break;
4691f08aa1cSPhilipp Tomsich 	case 1000:
4701f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4711f08aa1cSPhilipp Tomsich 		break;
4721f08aa1cSPhilipp Tomsich 	default:
4731f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4741f08aa1cSPhilipp Tomsich 		return -EINVAL;
4751f08aa1cSPhilipp Tomsich 	}
4761f08aa1cSPhilipp Tomsich 
4771f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4781f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4791f08aa1cSPhilipp Tomsich 
4801f08aa1cSPhilipp Tomsich 	return 0;
4811f08aa1cSPhilipp Tomsich }
4821f08aa1cSPhilipp Tomsich 
483491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
484491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4850a33ce65SDavid Wu {
4866f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4870a33ce65SDavid Wu 	struct rv1108_grf *grf;
4880a33ce65SDavid Wu 	int clk, speed;
4890a33ce65SDavid Wu 	enum {
4900a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4910a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4920a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4930a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4940a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4950a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4960a33ce65SDavid Wu 	};
4970a33ce65SDavid Wu 
4980a33ce65SDavid Wu 	switch (priv->phydev->speed) {
4990a33ce65SDavid Wu 	case 10:
5000a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
5010a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
5020a33ce65SDavid Wu 		break;
5030a33ce65SDavid Wu 	case 100:
5040a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
5050a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
5060a33ce65SDavid Wu 		break;
5070a33ce65SDavid Wu 	default:
5080a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
5090a33ce65SDavid Wu 		return -EINVAL;
5100a33ce65SDavid Wu 	}
5110a33ce65SDavid Wu 
5120a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5130a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5140a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5150a33ce65SDavid Wu 		     clk | speed);
5160a33ce65SDavid Wu 
5170a33ce65SDavid Wu 	return 0;
5180a33ce65SDavid Wu }
519dcfb333aSDavid Wu #else
520*c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
521*c563400aSDavid Wu 				  struct rockchip_eth_dev *dev)
522*c563400aSDavid Wu {
523*c563400aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
524*c563400aSDavid Wu 	struct rk3528_grf *grf;
525*c563400aSDavid Wu 	unsigned int div;
526*c563400aSDavid Wu 
527*c563400aSDavid Wu 	enum {
528*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3,
529*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3),
530*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3),
531*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV20 = 0,
532*c563400aSDavid Wu 	};
533*c563400aSDavid Wu 
534*c563400aSDavid Wu 	enum {
535*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10,
536*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10),
537*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV1 = 0,
538*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10),
539*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11),
540*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11),
541*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV20 = 0,
542*c563400aSDavid Wu 	};
543*c563400aSDavid Wu 
544*c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
545*c563400aSDavid Wu 
546*c563400aSDavid Wu 	switch (priv->phy->speed) {
547*c563400aSDavid Wu 	case 10:
548*c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
549*c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 :
550*c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV20;
551*c563400aSDavid Wu 		else
552*c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV50;
553*c563400aSDavid Wu 		break;
554*c563400aSDavid Wu 	case 100:
555*c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
556*c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 :
557*c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV2;
558*c563400aSDavid Wu 		else
559*c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV5;
560*c563400aSDavid Wu 		break;
561*c563400aSDavid Wu 	case 1000:
562*c563400aSDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
563*c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV1;
564*c563400aSDavid Wu 		else
565*c563400aSDavid Wu 			return -EINVAL;
566*c563400aSDavid Wu 		break;
567*c563400aSDavid Wu 	default:
568*c563400aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
569*c563400aSDavid Wu 		return -EINVAL;
570*c563400aSDavid Wu 	}
571*c563400aSDavid Wu 
572*c563400aSDavid Wu 	if (pdata->bus_id)
573*c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div);
574*c563400aSDavid Wu 	else
575*c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div);
576*c563400aSDavid Wu 
577*c563400aSDavid Wu 	return 0;
578*c563400aSDavid Wu }
579*c563400aSDavid Wu 
580bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
581bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
582bf0e94d0SDavid Wu {
583bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
584bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
585bf0e94d0SDavid Wu 	unsigned int div, div_mask;
586bf0e94d0SDavid Wu 
587bf0e94d0SDavid Wu 	enum {
588bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
589bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
590bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
591a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
592bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
5936d863a16SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV2 = BIT(2),
594bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
5956d863a16SDavid Wu 		RK3588_GMAC1_ID_SHIFT = 5,
596bf0e94d0SDavid Wu 	};
597bf0e94d0SDavid Wu 
598bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
599bf0e94d0SDavid Wu 
600bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
601bf0e94d0SDavid Wu 	case 10:
602bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
603bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
604bf0e94d0SDavid Wu 		else
605bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
606bf0e94d0SDavid Wu 		break;
607bf0e94d0SDavid Wu 	case 100:
608bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
6096d863a16SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV2;
610bf0e94d0SDavid Wu 		else
611bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
612bf0e94d0SDavid Wu 		break;
613bf0e94d0SDavid Wu 	case 1000:
614bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
615bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
616bf0e94d0SDavid Wu 		else
617bf0e94d0SDavid Wu 			return -EINVAL;
618bf0e94d0SDavid Wu 		break;
619bf0e94d0SDavid Wu 	default:
620bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
621bf0e94d0SDavid Wu 		return -EINVAL;
622bf0e94d0SDavid Wu 	}
623bf0e94d0SDavid Wu 
624bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
625bf0e94d0SDavid Wu 		div <<= 5;
626bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
627bf0e94d0SDavid Wu 	}
628bf0e94d0SDavid Wu 
6296d863a16SDavid Wu 	div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0;
6306d863a16SDavid Wu 	div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) :
6316d863a16SDavid Wu 		   RK3588_GMAC_CLK_RGMII_DIV_MASK;
6326d863a16SDavid Wu 
633bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
634bf0e94d0SDavid Wu 
635bf0e94d0SDavid Wu 	return 0;
636bf0e94d0SDavid Wu }
637bf0e94d0SDavid Wu 
63820bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
63920bef841SDavid Wu 				 struct rockchip_eth_dev *dev)
64020bef841SDavid Wu {
64120bef841SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
64220bef841SDavid Wu 	struct rv1106_grf *grf;
64320bef841SDavid Wu 	unsigned int div;
64420bef841SDavid Wu 
64520bef841SDavid Wu 	enum {
64620bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
64720bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
64820bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
64920bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV20 = 0,
65020bef841SDavid Wu 	};
65120bef841SDavid Wu 
65220bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
65320bef841SDavid Wu 
65420bef841SDavid Wu 	switch (priv->phy->speed) {
65520bef841SDavid Wu 	case 10:
65620bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV20;
65720bef841SDavid Wu 		break;
65820bef841SDavid Wu 	case 100:
65920bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV2;
66020bef841SDavid Wu 		break;
66120bef841SDavid Wu 	default:
66220bef841SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
66320bef841SDavid Wu 		return -EINVAL;
66420bef841SDavid Wu 	}
66520bef841SDavid Wu 
66620bef841SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
66720bef841SDavid Wu 
66820bef841SDavid Wu 	return 0;
66920bef841SDavid Wu }
67020bef841SDavid Wu 
671491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
672491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
673dcfb333aSDavid Wu {
674dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
675dcfb333aSDavid Wu 	struct clk clk_speed;
676dcfb333aSDavid Wu 	int ret;
677dcfb333aSDavid Wu 
678dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
679dcfb333aSDavid Wu 			      &clk_speed);
680dcfb333aSDavid Wu 	if (ret) {
68133a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
68233a014bdSDavid Wu 		       __func__, ret);
683dcfb333aSDavid Wu 		return ret;
684dcfb333aSDavid Wu 	}
685dcfb333aSDavid Wu 
686dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
687dcfb333aSDavid Wu 	case 10:
688dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
689dcfb333aSDavid Wu 		if (ret)
690dcfb333aSDavid Wu 			return ret;
691dcfb333aSDavid Wu 		break;
692dcfb333aSDavid Wu 	case 100:
693dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
694dcfb333aSDavid Wu 		if (ret)
695dcfb333aSDavid Wu 			return ret;
696dcfb333aSDavid Wu 		break;
697dcfb333aSDavid Wu 	case 1000:
698dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
699dcfb333aSDavid Wu 		if (ret)
700dcfb333aSDavid Wu 			return ret;
701dcfb333aSDavid Wu 		break;
702dcfb333aSDavid Wu 	default:
703dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
704dcfb333aSDavid Wu 		return -EINVAL;
705dcfb333aSDavid Wu 	}
706dcfb333aSDavid Wu 
707dcfb333aSDavid Wu 	return 0;
708dcfb333aSDavid Wu }
7096f0a52e9SDavid Wu #endif
7100a33ce65SDavid Wu 
7116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
71218ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
71318ae91c8SDavid Wu {
71418ae91c8SDavid Wu 	struct px30_grf *grf;
71518ae91c8SDavid Wu 	enum {
71618ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
71718ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
71818ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
71918ae91c8SDavid Wu 	};
72018ae91c8SDavid Wu 
72118ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
72218ae91c8SDavid Wu 
72318ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
72418ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
72518ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
72618ae91c8SDavid Wu }
72718ae91c8SDavid Wu 
728ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
729ff86648dSDavid Wu {
730ff86648dSDavid Wu 	struct rk1808_grf *grf;
731ff86648dSDavid Wu 	enum {
732ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
733ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
734ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
735ff86648dSDavid Wu 
736ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
737ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
738ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
739ff86648dSDavid Wu 
740ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
741ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
742ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
743ff86648dSDavid Wu 	};
744ff86648dSDavid Wu 	enum {
745ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
746ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
747ff86648dSDavid Wu 
748ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
749ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
750ff86648dSDavid Wu 	};
751ff86648dSDavid Wu 
752ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
753ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
754ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
755ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
756ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
757ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
758ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
759ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
760ff86648dSDavid Wu 
761ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
762ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
763ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
764c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) |
765c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT));
766ff86648dSDavid Wu }
767ff86648dSDavid Wu 
768af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
769af166ffaSDavid Wu {
770af166ffaSDavid Wu 	struct rk322x_grf *grf;
771af166ffaSDavid Wu 	enum {
772af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
773af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
774af166ffaSDavid Wu 
775af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
776af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
777af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
778af166ffaSDavid Wu 
779af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
780af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
781af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
782af166ffaSDavid Wu 
783af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
784af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
785af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
786af166ffaSDavid Wu 	};
787af166ffaSDavid Wu 	enum {
788af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
789af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
790af166ffaSDavid Wu 
791af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
792af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
793af166ffaSDavid Wu 	};
794af166ffaSDavid Wu 
795af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
796af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
797af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
798af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
799af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
800af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
801af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
802af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
803af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
804af166ffaSDavid Wu 
805af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
806af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
807af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
808af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
809af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
810af166ffaSDavid Wu }
811af166ffaSDavid Wu 
812491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
813491f3bfbSDavid Wu {
814491f3bfbSDavid Wu 	struct rk322x_grf *grf;
815491f3bfbSDavid Wu 	enum {
816491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
817491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
818491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
819491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
820491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
821491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
822491f3bfbSDavid Wu 	};
823491f3bfbSDavid Wu 
824491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
825491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
826491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
827491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
828491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
829491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
830491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
831491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
832491f3bfbSDavid Wu }
833491f3bfbSDavid Wu 
8341f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
8351f08aa1cSPhilipp Tomsich {
8361f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
8371f08aa1cSPhilipp Tomsich 
8381f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
8391f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
8401f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
8411f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
8421f08aa1cSPhilipp Tomsich 
8431f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
8441f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
8451f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
8461f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
8471f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
8481f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
8491f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
8501f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
8511f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
8521f08aa1cSPhilipp Tomsich }
8531f08aa1cSPhilipp Tomsich 
85423adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
85523adb58fSDavid Wu {
85623adb58fSDavid Wu 	struct rk3308_grf *grf;
85723adb58fSDavid Wu 	enum {
85823adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
85923adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
86023adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
86123adb58fSDavid Wu 	};
86223adb58fSDavid Wu 
86323adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
86423adb58fSDavid Wu 
86523adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
86623adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
86723adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
86823adb58fSDavid Wu }
86923adb58fSDavid Wu 
870c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
871c36b26c0SDavid Wu {
872c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
873c36b26c0SDavid Wu 	enum {
874c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
875c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
876c36b26c0SDavid Wu 
877c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
878c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
879c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
880c36b26c0SDavid Wu 
881c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
882c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
883c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
884c36b26c0SDavid Wu 
885c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
886c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
887c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
888c36b26c0SDavid Wu 	};
889c36b26c0SDavid Wu 	enum {
890c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
891c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
892c36b26c0SDavid Wu 
893c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
894c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
895c36b26c0SDavid Wu 	};
896c36b26c0SDavid Wu 
897c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
898c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
899c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
900c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
901c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
902c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
903c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
904c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
905c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
906c36b26c0SDavid Wu 
907c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
908c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
909c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
910c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
911c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
912c36b26c0SDavid Wu }
913c36b26c0SDavid Wu 
914491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
915491f3bfbSDavid Wu {
916491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
917491f3bfbSDavid Wu 	enum {
918491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
919491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
920491f3bfbSDavid Wu 
921491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
922491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
923491f3bfbSDavid Wu 	};
924491f3bfbSDavid Wu 
925491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
926491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
927491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
928491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
929491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
930491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
931491f3bfbSDavid Wu }
932491f3bfbSDavid Wu 
933793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
934793f2fd2SPhilipp Tomsich {
935793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
936793f2fd2SPhilipp Tomsich 	enum {
937793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
938793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
939793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
940793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
941793f2fd2SPhilipp Tomsich 	};
942793f2fd2SPhilipp Tomsich 	enum {
943793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
944793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
945793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
946793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
947793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
948793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
949793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
950793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
951793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
952793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
953793f2fd2SPhilipp Tomsich 	};
954793f2fd2SPhilipp Tomsich 
955793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
956793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
957793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
958793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
959793f2fd2SPhilipp Tomsich 
960793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
961793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
962793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
963793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
964793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
965793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
966793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
967c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) |
968c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT));
969793f2fd2SPhilipp Tomsich }
970793f2fd2SPhilipp Tomsich 
9711f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
9721f08aa1cSPhilipp Tomsich {
9731f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
9741f08aa1cSPhilipp Tomsich 
9751f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9761f08aa1cSPhilipp Tomsich 
9771f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
9781f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
9791f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
9801f08aa1cSPhilipp Tomsich 
9811f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
9821f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
9831f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
9841f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
9851f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
9861f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
9871f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
988c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) |
989c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT));
9901f08aa1cSPhilipp Tomsich }
9911f08aa1cSPhilipp Tomsich 
9920a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
9930a33ce65SDavid Wu {
9940a33ce65SDavid Wu 	struct rv1108_grf *grf;
9950a33ce65SDavid Wu 
9960a33ce65SDavid Wu 	enum {
9970a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
9980a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
9990a33ce65SDavid Wu 	};
10000a33ce65SDavid Wu 
10010a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
10020a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
10030a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
10040a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
10050a33ce65SDavid Wu }
1006491f3bfbSDavid Wu 
1007491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1008491f3bfbSDavid Wu {
1009491f3bfbSDavid Wu 	struct rk322x_grf *grf;
1010491f3bfbSDavid Wu 	enum {
1011491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
1012491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
1013491f3bfbSDavid Wu 	};
1014491f3bfbSDavid Wu 	enum {
1015491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1016491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
1017491f3bfbSDavid Wu 
1018491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1019491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
1020491f3bfbSDavid Wu 
1021491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
1022491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
1023491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
1024491f3bfbSDavid Wu 	};
1025491f3bfbSDavid Wu 	enum {
1026491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1027491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
1028491f3bfbSDavid Wu 	};
1029491f3bfbSDavid Wu 	enum {
1030491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1031491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
1032491f3bfbSDavid Wu 	};
1033491f3bfbSDavid Wu 
1034491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1035491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
1036491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
1037491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
1038491f3bfbSDavid Wu 
1039491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1040491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
1041491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
1042491f3bfbSDavid Wu 
1043491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1044491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
1045491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
1046491f3bfbSDavid Wu 
1047491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1048491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1049491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
1050491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
1051491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1052491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
1053491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
1054491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
1055491f3bfbSDavid Wu 
1056491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1057491f3bfbSDavid Wu 	udelay(10);
1058491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1059491f3bfbSDavid Wu 	udelay(10);
1060491f3bfbSDavid Wu 
1061491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1062491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1063491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
1064491f3bfbSDavid Wu 	udelay(30 * 1000);
1065491f3bfbSDavid Wu }
1066491f3bfbSDavid Wu 
1067491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1068491f3bfbSDavid Wu {
1069491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1070491f3bfbSDavid Wu 	enum {
1071491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1072491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
1073491f3bfbSDavid Wu 	};
1074491f3bfbSDavid Wu 	enum {
1075491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1076491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1077491f3bfbSDavid Wu 
1078491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1079491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
1080491f3bfbSDavid Wu 
1081491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
1082491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
1083491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
1084491f3bfbSDavid Wu 	};
1085491f3bfbSDavid Wu 	enum {
1086491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1087491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1088491f3bfbSDavid Wu 	};
1089491f3bfbSDavid Wu 	enum {
1090491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1091491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1092491f3bfbSDavid Wu 	};
1093491f3bfbSDavid Wu 
1094491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1095491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
1096491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
1097491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
1098491f3bfbSDavid Wu 
1099491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1100491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1101491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
1102491f3bfbSDavid Wu 
1103491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1104491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1105491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
1106491f3bfbSDavid Wu 
1107491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1108491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1109491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
1110491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1111491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1112491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1113491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1114491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1115491f3bfbSDavid Wu 
1116491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1117491f3bfbSDavid Wu 	udelay(10);
1118491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1119491f3bfbSDavid Wu 	udelay(10);
1120491f3bfbSDavid Wu 
1121491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1122491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1123491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1124491f3bfbSDavid Wu 	udelay(30 * 1000);
1125491f3bfbSDavid Wu }
1126491f3bfbSDavid Wu 
1127dcfb333aSDavid Wu #else
1128*c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1129*c563400aSDavid Wu {
1130*c563400aSDavid Wu 	struct rk3528_grf *grf;
1131*c563400aSDavid Wu 	unsigned char bgs[1] = {0};
1132*c563400aSDavid Wu 
1133*c563400aSDavid Wu 	enum {
1134*c563400aSDavid Wu 		RK3528_MACPHY_ENABLE_MASK = BIT(1),
1135*c563400aSDavid Wu 		RK3528_MACPHY_DISENABLE = BIT(1),
1136*c563400aSDavid Wu 		RK3528_MACPHY_ENABLE = 0,
1137*c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
1138*c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL = BIT(6),
1139*c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
1140*c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
1141*c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
1142*c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID = BIT(11),
1143*c563400aSDavid Wu 	};
1144*c563400aSDavid Wu 
1145*c563400aSDavid Wu 	enum {
1146*c563400aSDavid Wu 		RK3528_MACPHY_BGS_MASK = GENMASK(3, 0),
1147*c563400aSDavid Wu 	};
1148*c563400aSDavid Wu 
1149*c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1150*c563400aSDavid Wu 	struct udevice *dev;
1151*c563400aSDavid Wu 	u32 regs[2] = {0};
1152*c563400aSDavid Wu 	ofnode node;
1153*c563400aSDavid Wu 	int ret = 0;
1154*c563400aSDavid Wu 
1155*c563400aSDavid Wu 	/* retrieve the device */
1156*c563400aSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1157*c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1158*c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1159*c563400aSDavid Wu 						  &dev);
1160*c563400aSDavid Wu 	else
1161*c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1162*c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1163*c563400aSDavid Wu 						  &dev);
1164*c563400aSDavid Wu 	if (!ret) {
1165*c563400aSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1166*c563400aSDavid Wu 		if (ofnode_valid(node)) {
1167*c563400aSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1168*c563400aSDavid Wu 				/* read the bgs from the efuses */
1169*c563400aSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1170*c563400aSDavid Wu 				if (ret) {
1171*c563400aSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1172*c563400aSDavid Wu 					       ret);
1173*c563400aSDavid Wu 					bgs[0] = 0;
1174*c563400aSDavid Wu 				}
1175*c563400aSDavid Wu 			}
1176*c563400aSDavid Wu 		}
1177*c563400aSDavid Wu 	}
1178*c563400aSDavid Wu #endif
1179*c563400aSDavid Wu 
1180*c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1181*c563400aSDavid Wu 
1182*c563400aSDavid Wu 	reset_assert(&pdata->phy_reset);
1183*c563400aSDavid Wu 	udelay(20);
1184*c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
1185*c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE_MASK |
1186*c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL_MASK |
1187*c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_MASK |
1188*c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID_MASK,
1189*c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE |
1190*c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL |
1191*c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_24M |
1192*c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID);
1193*c563400aSDavid Wu 
1194*c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
1195*c563400aSDavid Wu 		     RK3528_MACPHY_BGS_MASK,
1196*c563400aSDavid Wu 		     bgs[0]);
1197*c563400aSDavid Wu 	udelay(20);
1198*c563400aSDavid Wu 	reset_deassert(&pdata->phy_reset);
1199*c563400aSDavid Wu 	udelay(30 * 1000);
1200*c563400aSDavid Wu }
1201*c563400aSDavid Wu 
1202*c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1203*c563400aSDavid Wu {
1204*c563400aSDavid Wu 	unsigned int clk_mode;
1205*c563400aSDavid Wu 	struct rk3528_grf *grf;
1206*c563400aSDavid Wu 
1207*c563400aSDavid Wu 	enum {
1208*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1,
1209*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1),
1210*c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE = 0x1,
1211*c563400aSDavid Wu 	};
1212*c563400aSDavid Wu 
1213*c563400aSDavid Wu 	enum {
1214*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8,
1215*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8),
1216*c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE = 0x1,
1217*c563400aSDavid Wu 	};
1218*c563400aSDavid Wu 
1219*c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1220*c563400aSDavid Wu 
1221*c563400aSDavid Wu 	if (pdata->bus_id == 1) {
1222*c563400aSDavid Wu 		clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT;
1223*c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode);
1224*c563400aSDavid Wu 	} else {
1225*c563400aSDavid Wu 		clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT;
1226*c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode);
1227*c563400aSDavid Wu 	}
1228*c563400aSDavid Wu }
1229*c563400aSDavid Wu 
1230*c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1231*c563400aSDavid Wu {
1232*c563400aSDavid Wu 	unsigned int rx_enable;
1233*c563400aSDavid Wu 	unsigned int rx_delay;
1234*c563400aSDavid Wu 	struct rk3528_grf *grf;
1235*c563400aSDavid Wu 
1236*c563400aSDavid Wu 	enum {
1237*c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8,
1238*c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_MASK = BIT(8),
1239*c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE = 0x0,
1240*c563400aSDavid Wu 
1241*c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14),
1242*c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0,
1243*c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14),
1244*c563400aSDavid Wu 
1245*c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15),
1246*c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0,
1247*c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15),
1248*c563400aSDavid Wu 	};
1249*c563400aSDavid Wu 
1250*c563400aSDavid Wu 	enum {
1251*c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8,
1252*c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8),
1253*c563400aSDavid Wu 
1254*c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0,
1255*c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0),
1256*c563400aSDavid Wu 	};
1257*c563400aSDavid Wu 
1258*c563400aSDavid Wu 	if (!pdata->bus_id)
1259*c563400aSDavid Wu 		return;
1260*c563400aSDavid Wu 
1261*c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1262*c563400aSDavid Wu 
1263*c563400aSDavid Wu 	if (pdata->rx_delay < 0) {
1264*c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE;
1265*c563400aSDavid Wu 		rx_delay = 0;
1266*c563400aSDavid Wu 	} else {
1267*c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE;
1268*c563400aSDavid Wu 		rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT;
1269*c563400aSDavid Wu 	}
1270*c563400aSDavid Wu 
1271*c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0,
1272*c563400aSDavid Wu 		     RK3528_GMAC1_TXCLK_DLY_ENA_MASK |
1273*c563400aSDavid Wu 		     RK3528_GMAC1_RXCLK_DLY_ENA_MASK |
1274*c563400aSDavid Wu 		     RK3528_GMAC1_RGMII_MODE_MASK,
1275*c563400aSDavid Wu 		     rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE |
1276*c563400aSDavid Wu 		     (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT));
1277*c563400aSDavid Wu 
1278*c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con1,
1279*c563400aSDavid Wu 		     RK3528_GMAC1_RX_DL_CFG_MASK |
1280*c563400aSDavid Wu 		     RK3528_GMAC1_TX_DL_CFG_MASK,
1281*c563400aSDavid Wu 		     (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) |
1282*c563400aSDavid Wu 		     rx_delay);
1283*c563400aSDavid Wu }
1284*c563400aSDavid Wu 
128533a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
128633a014bdSDavid Wu {
128733a014bdSDavid Wu 	struct rk3568_grf *grf;
128833a014bdSDavid Wu 	void *con1;
128933a014bdSDavid Wu 
129033a014bdSDavid Wu 	enum {
129133a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
129233a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
129333a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
129433a014bdSDavid Wu 	};
129533a014bdSDavid Wu 
129633a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
129733a014bdSDavid Wu 
129833a014bdSDavid Wu 	if (pdata->bus_id == 1)
129933a014bdSDavid Wu 		con1 = &grf->mac1_con1;
130033a014bdSDavid Wu 	else
130133a014bdSDavid Wu 		con1 = &grf->mac0_con1;
130233a014bdSDavid Wu 
130333a014bdSDavid Wu 	rk_clrsetreg(con1,
130433a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
130533a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
130633a014bdSDavid Wu }
130733a014bdSDavid Wu 
130833a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
130933a014bdSDavid Wu {
131033a014bdSDavid Wu 	struct rk3568_grf *grf;
131133a014bdSDavid Wu 	void *con0, *con1;
131233a014bdSDavid Wu 
131333a014bdSDavid Wu 	enum {
131433a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
131533a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
131633a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
131733a014bdSDavid Wu 
131833a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
131933a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
132033a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
132133a014bdSDavid Wu 
132233a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
132333a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
132433a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
132533a014bdSDavid Wu 	};
132633a014bdSDavid Wu 
132733a014bdSDavid Wu 	enum {
132833a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
132933a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
133033a014bdSDavid Wu 
133133a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
133233a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
133333a014bdSDavid Wu 	};
133433a014bdSDavid Wu 
133533a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
133633a014bdSDavid Wu 
133733a014bdSDavid Wu 	if (pdata->bus_id == 1) {
133833a014bdSDavid Wu 		con0 = &grf->mac1_con0;
133933a014bdSDavid Wu 		con1 = &grf->mac1_con1;
134033a014bdSDavid Wu 	} else {
134133a014bdSDavid Wu 		con0 = &grf->mac0_con0;
134233a014bdSDavid Wu 		con1 = &grf->mac0_con1;
134333a014bdSDavid Wu 	}
134433a014bdSDavid Wu 
134533a014bdSDavid Wu 	rk_clrsetreg(con0,
134633a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
134733a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
1348c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) |
1349c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT));
135033a014bdSDavid Wu 
135133a014bdSDavid Wu 	rk_clrsetreg(con1,
135233a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
135333a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
135433a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
135533a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
135633a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
135733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
135833a014bdSDavid Wu }
135933a014bdSDavid Wu 
1360bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1361bf0e94d0SDavid Wu {
1362bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1363bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1364bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1365bf0e94d0SDavid Wu 
1366bf0e94d0SDavid Wu 	enum {
1367bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1368bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1369bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1370bf0e94d0SDavid Wu 	};
1371bf0e94d0SDavid Wu 
1372bf0e94d0SDavid Wu 	enum {
1373bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1374bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1375bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1376bf0e94d0SDavid Wu 	};
1377bf0e94d0SDavid Wu 
1378bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1379bf0e94d0SDavid Wu 
1380bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1381bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1382bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1383bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1384bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1385bf0e94d0SDavid Wu 	} else {
1386bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1387bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1388bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1389bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1390bf0e94d0SDavid Wu 	}
1391bf0e94d0SDavid Wu 
1392bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1393bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1394bf0e94d0SDavid Wu }
1395bf0e94d0SDavid Wu 
1396bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1397bf0e94d0SDavid Wu {
1398bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1399bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1400bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1401bf0e94d0SDavid Wu 	unsigned int rx_delay;
1402bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1403bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1404bf0e94d0SDavid Wu 	void *offset_con;
1405bf0e94d0SDavid Wu 
1406bf0e94d0SDavid Wu 	enum {
1407bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1408bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1409bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1410bf0e94d0SDavid Wu 
1411bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1412bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1413bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1414bf0e94d0SDavid Wu 
1415bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1416bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1417bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1418bf0e94d0SDavid Wu 	};
1419bf0e94d0SDavid Wu 
1420bf0e94d0SDavid Wu 	enum {
1421bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1422bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1423bf0e94d0SDavid Wu 
1424bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1425bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1426bf0e94d0SDavid Wu 	};
1427bf0e94d0SDavid Wu 
1428bf0e94d0SDavid Wu 	enum {
1429bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1430bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1431bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1432bf0e94d0SDavid Wu 	};
1433bf0e94d0SDavid Wu 
1434bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1435bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1436bf0e94d0SDavid Wu 
1437bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1438bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1439bf0e94d0SDavid Wu 		rx_delay = 0;
1440bf0e94d0SDavid Wu 	} else {
1441bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1442bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1443bf0e94d0SDavid Wu 	}
1444bf0e94d0SDavid Wu 
1445bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1446bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1447bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1448bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1449bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1450bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1451bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1452bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1453bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1454bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1455bf0e94d0SDavid Wu 	} else {
1456bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1457bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1458bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1459bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1460bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1461bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1462bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1463bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1464bf0e94d0SDavid Wu 	}
1465bf0e94d0SDavid Wu 
1466bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1467bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1468bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1469c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) |
1470bf0e94d0SDavid Wu 		     rx_delay);
1471bf0e94d0SDavid Wu 
1472bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1473bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1474bf0e94d0SDavid Wu 
1475bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1476bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1477bf0e94d0SDavid Wu }
1478bf0e94d0SDavid Wu 
147920bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
148020bef841SDavid Wu {
148120bef841SDavid Wu 	struct rv1106_grf *grf;
1482535678cdSDavid Wu 	unsigned char bgs[1] = {0};
1483535678cdSDavid Wu 
1484535678cdSDavid Wu 	enum {
1485535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1486535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1487535678cdSDavid Wu 	};
148854f7ad44SDavid Wu 
148954f7ad44SDavid Wu 	enum {
149020bef841SDavid Wu 		RV1106_MACPHY_ENABLE_MASK = BIT(1),
149154f7ad44SDavid Wu 		RV1106_MACPHY_DISENABLE = BIT(1),
149254f7ad44SDavid Wu 		RV1106_MACPHY_ENABLE = 0,
149320bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
149420bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL = BIT(6),
149520bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
149620bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
149720bef841SDavid Wu 		RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
149820bef841SDavid Wu 		RV1106_MACPHY_PHY_ID = BIT(11),
149920bef841SDavid Wu 	};
150020bef841SDavid Wu 
150120bef841SDavid Wu 	enum {
150220bef841SDavid Wu 		RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
150354f7ad44SDavid Wu 		RV1106_MACPHY_BGS = BIT(2),
150420bef841SDavid Wu 	};
150520bef841SDavid Wu 
1506535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1507535678cdSDavid Wu 	struct udevice *dev;
1508535678cdSDavid Wu 	u32 regs[2] = {0};
1509535678cdSDavid Wu 	ofnode node;
1510535678cdSDavid Wu 	int ret = 0;
1511535678cdSDavid Wu 
1512535678cdSDavid Wu 	/* retrieve the device */
1513535678cdSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1514535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1515535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1516535678cdSDavid Wu 						  &dev);
1517535678cdSDavid Wu 	else
1518535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1519535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1520535678cdSDavid Wu 						  &dev);
1521535678cdSDavid Wu 	if (!ret) {
1522535678cdSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1523535678cdSDavid Wu 		if (ofnode_valid(node)) {
1524535678cdSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1525535678cdSDavid Wu 				/* read the bgs from the efuses */
1526535678cdSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1527535678cdSDavid Wu 				if (ret) {
1528535678cdSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1529535678cdSDavid Wu 					       ret);
1530535678cdSDavid Wu 					bgs[0] = 0;
1531535678cdSDavid Wu 				}
1532535678cdSDavid Wu 			}
1533535678cdSDavid Wu 		}
1534535678cdSDavid Wu 	}
1535535678cdSDavid Wu #endif
1536535678cdSDavid Wu 
153720bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
153820bef841SDavid Wu 
153920bef841SDavid Wu 	reset_assert(&pdata->phy_reset);
154020bef841SDavid Wu 	udelay(20);
154120bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
154220bef841SDavid Wu 		     RV1106_MACPHY_ENABLE_MASK |
154320bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL_MASK |
154420bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_MASK |
154520bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID_MASK,
154620bef841SDavid Wu 		     RV1106_MACPHY_ENABLE |
154720bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL |
154820bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_24M |
154920bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID);
155020bef841SDavid Wu 
155120bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
155220bef841SDavid Wu 		     RV1106_MACPHY_BGS_MASK,
1553535678cdSDavid Wu 		     bgs[0]);
15548bafa3a1SDavid Wu 	udelay(20);
155520bef841SDavid Wu 	reset_deassert(&pdata->phy_reset);
155620bef841SDavid Wu 	udelay(30 * 1000);
155720bef841SDavid Wu }
155820bef841SDavid Wu 
15598bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
15608bafa3a1SDavid Wu {
15618bafa3a1SDavid Wu 	struct rv1106_grf *grf;
15628bafa3a1SDavid Wu 	enum {
15638bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
15648bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
15658bafa3a1SDavid Wu 	};
15668bafa3a1SDavid Wu 
15678bafa3a1SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
15688bafa3a1SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
15698bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
15708bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE);
15718bafa3a1SDavid Wu };
15728bafa3a1SDavid Wu 
1573e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1574e4e3f431SDavid Wu {
1575e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1576e4e3f431SDavid Wu 
1577e4e3f431SDavid Wu 	enum {
1578e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1579e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1580e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1581e4e3f431SDavid Wu 	};
1582e4e3f431SDavid Wu 
1583e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1584e4e3f431SDavid Wu 
1585e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1586e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1587e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1588e4e3f431SDavid Wu }
1589e4e3f431SDavid Wu 
1590dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1591dcfb333aSDavid Wu {
1592dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1593dcfb333aSDavid Wu 
1594dcfb333aSDavid Wu 	enum {
1595dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1596dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1597dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1598dcfb333aSDavid Wu 
1599dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1600dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1601dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1602dcfb333aSDavid Wu 
1603dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1604dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1605dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1606dcfb333aSDavid Wu 
1607dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1608dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1609dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1610dcfb333aSDavid Wu 
1611dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1612dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1613dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1614dcfb333aSDavid Wu 	};
1615dcfb333aSDavid Wu 	enum {
1616dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1617dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1618dcfb333aSDavid Wu 
1619dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1620dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1621dcfb333aSDavid Wu 	};
1622dcfb333aSDavid Wu 	enum {
1623dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1624dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1625dcfb333aSDavid Wu 
1626dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1627dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1628dcfb333aSDavid Wu 	};
1629dcfb333aSDavid Wu 
1630dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1631dcfb333aSDavid Wu 
1632dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1633dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1634dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1635dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1636dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1637dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1638dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1639dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1640dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1641dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1642dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1643dcfb333aSDavid Wu 
1644dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1645dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1646dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1647c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) |
1648c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT));
1649dcfb333aSDavid Wu 
1650dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1651dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1652dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1653c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) |
1654c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT));
1655dcfb333aSDavid Wu }
16566f0a52e9SDavid Wu #endif
16570a33ce65SDavid Wu 
1658bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1659*c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1660*c563400aSDavid Wu {
1661*c563400aSDavid Wu 	struct rk3528_grf *grf;
1662*c563400aSDavid Wu 	unsigned int val;
1663*c563400aSDavid Wu 
1664*c563400aSDavid Wu 	enum {
1665*c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_SHIFT = 0x12,
1666*c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_MASK = BIT(12),
1667*c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_CRU = 0,
1668*c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_IO = BIT(12),
1669*c563400aSDavid Wu 	};
1670*c563400aSDavid Wu 
1671*c563400aSDavid Wu 	if (!pdata->bus_id)
1672*c563400aSDavid Wu 		return;
1673*c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1674*c563400aSDavid Wu 
1675*c563400aSDavid Wu 	val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO :
1676*c563400aSDavid Wu 				   RK3528_GMAC1_CLK_SELET_CRU;
1677*c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val);
1678*c563400aSDavid Wu }
1679*c563400aSDavid Wu 
1680bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1681bf0e94d0SDavid Wu {
1682bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1683bf0e94d0SDavid Wu 	unsigned int val, mask;
1684bf0e94d0SDavid Wu 
1685bf0e94d0SDavid Wu 	enum {
1686bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
1687bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
1688bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
1689bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
1690bf0e94d0SDavid Wu 	};
1691bf0e94d0SDavid Wu 
1692bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1693bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
1694bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
1695bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
1696bf0e94d0SDavid Wu 
1697bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1698bf0e94d0SDavid Wu 		val <<= 5;
1699bf0e94d0SDavid Wu 		mask <<= 5;
1700bf0e94d0SDavid Wu 	}
1701bf0e94d0SDavid Wu 
1702bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
1703bf0e94d0SDavid Wu }
1704bf0e94d0SDavid Wu #endif
1705bf0e94d0SDavid Wu 
17060125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
17070125bcf0SSjoerd Simons {
17080125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
17091f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
17101f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
17116f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
17126f0a52e9SDavid Wu 	struct eqos_config *config;
17136f0a52e9SDavid Wu #else
17146f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
17156f0a52e9SDavid Wu #endif
17166f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
17170125bcf0SSjoerd Simons 	struct clk clk;
17180a33ce65SDavid Wu 	ulong rate;
17190125bcf0SSjoerd Simons 	int ret;
17200125bcf0SSjoerd Simons 
17216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
17226f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
17236f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
1724befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
17256f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
17266f0a52e9SDavid Wu #else
17276f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
17286f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
17296f0a52e9SDavid Wu #endif
173033a014bdSDavid Wu 	pdata->bus_id = dev->seq;
173154f7ad44SDavid Wu 
1732cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1733cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
1734cadc8d74SKever Yang 	if (ret)
1735cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
1736cadc8d74SKever Yang 
17370125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
17380125bcf0SSjoerd Simons 	if (ret)
17390125bcf0SSjoerd Simons 		return ret;
17400125bcf0SSjoerd Simons 
1741491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
1742491f3bfbSDavid Wu 
1743bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
1744bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
1745bf0e94d0SDavid Wu 
1746491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
1747491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
1748491f3bfbSDavid Wu 
17490a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
17500a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
1751bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
17520a33ce65SDavid Wu 		/*
17530a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
17540a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
17550a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
17560a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
17570a33ce65SDavid Wu 		 */
17580a33ce65SDavid Wu 		if (!pdata->clock_input) {
17590a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 125000000);
17600a33ce65SDavid Wu 			if (rate != 125000000)
17610a33ce65SDavid Wu 				return -EINVAL;
17620a33ce65SDavid Wu 		}
17630125bcf0SSjoerd Simons 
1764bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
1765bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
1766bf0e94d0SDavid Wu 
17670125bcf0SSjoerd Simons 		/* Set to RGMII mode */
17680a33ce65SDavid Wu 		if (ops->set_to_rgmii)
17691f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
17700a33ce65SDavid Wu 		else
17710a33ce65SDavid Wu 			return -EPERM;
17720a33ce65SDavid Wu 
17730a33ce65SDavid Wu 		break;
17740a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
17750a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
17760a33ce65SDavid Wu 		if (!pdata->clock_input) {
17770a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 50000000);
17780a33ce65SDavid Wu 			if (rate != 50000000)
17790a33ce65SDavid Wu 				return -EINVAL;
17800a33ce65SDavid Wu 		}
17810a33ce65SDavid Wu 
17820a33ce65SDavid Wu 		/* Set to RMII mode */
17830a33ce65SDavid Wu 		if (ops->set_to_rmii)
17840a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
17850a33ce65SDavid Wu 
17860a33ce65SDavid Wu 		break;
17870a33ce65SDavid Wu 	default:
17880a33ce65SDavid Wu 		debug("NO interface defined!\n");
17890a33ce65SDavid Wu 		return -ENXIO;
17900a33ce65SDavid Wu 	}
17910125bcf0SSjoerd Simons 
17926f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
17936f0a52e9SDavid Wu 	return eqos_probe(dev);
17946f0a52e9SDavid Wu #else
17950125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
17966f0a52e9SDavid Wu #endif
17976f0a52e9SDavid Wu }
17986f0a52e9SDavid Wu 
17996f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
18006f0a52e9SDavid Wu {
18016f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
18026f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
18036f0a52e9SDavid Wu #else
18046f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
18056f0a52e9SDavid Wu #endif
18066f0a52e9SDavid Wu }
18076f0a52e9SDavid Wu 
18086f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
18096f0a52e9SDavid Wu 				      int length)
18106f0a52e9SDavid Wu {
18116f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
18126f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
18136f0a52e9SDavid Wu #else
18146f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
18156f0a52e9SDavid Wu #endif
18166f0a52e9SDavid Wu }
18176f0a52e9SDavid Wu 
18186f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
18196f0a52e9SDavid Wu 				  int length)
18206f0a52e9SDavid Wu {
18216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
18226f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
18236f0a52e9SDavid Wu #else
18246f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
18256f0a52e9SDavid Wu #endif
18266f0a52e9SDavid Wu }
18276f0a52e9SDavid Wu 
18286f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
18296f0a52e9SDavid Wu 				  uchar **packetp)
18306f0a52e9SDavid Wu {
18316f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
18326f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
18336f0a52e9SDavid Wu #else
18346f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
18356f0a52e9SDavid Wu #endif
18360125bcf0SSjoerd Simons }
18370125bcf0SSjoerd Simons 
18380125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
18390125bcf0SSjoerd Simons {
18406f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
18411f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
18421f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
18436f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1844491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
18456f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
18466f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
18476f0a52e9SDavid Wu #endif
18480125bcf0SSjoerd Simons 	int ret;
18490125bcf0SSjoerd Simons 
18506f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
18516f0a52e9SDavid Wu 	ret = eqos_init(dev);
18526f0a52e9SDavid Wu #else
18536f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
18546f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
18556f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
18566f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
18576f0a52e9SDavid Wu #endif
18580125bcf0SSjoerd Simons 	if (ret)
18590125bcf0SSjoerd Simons 		return ret;
1860491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
18610125bcf0SSjoerd Simons 	if (ret)
18620125bcf0SSjoerd Simons 		return ret;
18636f0a52e9SDavid Wu 
18646f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
18656f0a52e9SDavid Wu 	eqos_enable(dev);
18666f0a52e9SDavid Wu #else
18676f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
18680125bcf0SSjoerd Simons 	if (ret)
18690125bcf0SSjoerd Simons 		return ret;
18706f0a52e9SDavid Wu #endif
18710125bcf0SSjoerd Simons 
18720125bcf0SSjoerd Simons 	return 0;
18730125bcf0SSjoerd Simons }
18740125bcf0SSjoerd Simons 
18756f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
18766f0a52e9SDavid Wu {
18776f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
18786f0a52e9SDavid Wu 	eqos_stop(dev);
18796f0a52e9SDavid Wu #else
18806f0a52e9SDavid Wu 	designware_eth_stop(dev);
18816f0a52e9SDavid Wu #endif
18826f0a52e9SDavid Wu }
18836f0a52e9SDavid Wu 
18840125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
18850125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
18866f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
18876f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
18886f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
18896f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
18906f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
18910125bcf0SSjoerd Simons };
18920125bcf0SSjoerd Simons 
18936f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
189418ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
189518ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
189618ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
189718ae91c8SDavid Wu };
189818ae91c8SDavid Wu 
1899ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
1900ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
1901ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
1902ff86648dSDavid Wu };
1903ff86648dSDavid Wu 
1904af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
1905af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
1906491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
1907af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
1908491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
1909af166ffaSDavid Wu };
1910af166ffaSDavid Wu 
19111f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
19121f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
19131f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
19141f08aa1cSPhilipp Tomsich };
19151f08aa1cSPhilipp Tomsich 
191623adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
191723adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
191823adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
191923adb58fSDavid Wu };
192023adb58fSDavid Wu 
1921c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
1922c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
1923491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
1924c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
1925491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
1926c36b26c0SDavid Wu };
1927c36b26c0SDavid Wu 
1928793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
1929793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
1930793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
1931793f2fd2SPhilipp Tomsich };
1932793f2fd2SPhilipp Tomsich 
19331f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
19341f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
19351f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
19361f08aa1cSPhilipp Tomsich };
19371f08aa1cSPhilipp Tomsich 
19380a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
19390a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
19400a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
19410a33ce65SDavid Wu };
1942dcfb333aSDavid Wu #else
1943*c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = {
1944*c563400aSDavid Wu 	.fix_mac_speed = rk3528_set_rgmii_speed,
1945*c563400aSDavid Wu 	.set_to_rgmii = rk3528_set_to_rgmii,
1946*c563400aSDavid Wu 	.set_to_rmii = rk3528_set_to_rmii,
1947*c563400aSDavid Wu 	.set_clock_selection = rk3528_set_clock_selection,
1948*c563400aSDavid Wu 	.integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup,
1949*c563400aSDavid Wu };
1950*c563400aSDavid Wu 
195133a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
195233a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
195333a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
195433a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
195533a014bdSDavid Wu };
195633a014bdSDavid Wu 
1957bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
1958bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
1959bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
1960bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
1961bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
1962bf0e94d0SDavid Wu };
1963bf0e94d0SDavid Wu 
196420bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = {
196520bef841SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
19668bafa3a1SDavid Wu 	.set_to_rmii = rv1106_set_to_rmii,
196720bef841SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
196820bef841SDavid Wu };
196920bef841SDavid Wu 
1970dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
1971dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
1972dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
1973e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
1974dcfb333aSDavid Wu };
19756f0a52e9SDavid Wu #endif
19760a33ce65SDavid Wu 
19770125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
19786f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
197984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
198018ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
198118ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
198284e90485SDavid Wu #endif
198384e90485SDavid Wu 
198484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
1985ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
1986ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
198784e90485SDavid Wu #endif
198884e90485SDavid Wu 
198984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
1990af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
1991af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
199284e90485SDavid Wu #endif
199384e90485SDavid Wu 
199484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
19951f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
19961f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
199784e90485SDavid Wu #endif
199884e90485SDavid Wu 
199984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
200023adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
200123adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
200284e90485SDavid Wu #endif
200384e90485SDavid Wu 
200484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
2005c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
2006c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
200784e90485SDavid Wu #endif
200884e90485SDavid Wu 
200984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
2010793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
2011793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
201284e90485SDavid Wu #endif
201384e90485SDavid Wu 
201484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
20151f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
20161f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
201784e90485SDavid Wu #endif
201884e90485SDavid Wu 
201984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
20200a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
20210a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
202284e90485SDavid Wu #endif
2023dcfb333aSDavid Wu #else
2024*c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528
2025*c563400aSDavid Wu 	{ .compatible = "rockchip,rk3528-gmac",
2026*c563400aSDavid Wu 	  .data = (ulong)&rk3528_gmac_ops },
2027*c563400aSDavid Wu #endif
2028*c563400aSDavid Wu 
202984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
203033a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
203133a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
203284e90485SDavid Wu #endif
203384e90485SDavid Wu 
2034bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
2035bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
2036bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
2037bf0e94d0SDavid Wu #endif
2038bf0e94d0SDavid Wu 
203920bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106
204020bef841SDavid Wu 	{ .compatible = "rockchip,rv1106-gmac",
204120bef841SDavid Wu 	  .data = (ulong)&rv1106_gmac_ops },
204220bef841SDavid Wu #endif
204320bef841SDavid Wu 
204484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
2045dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
2046dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
20476f0a52e9SDavid Wu #endif
204884e90485SDavid Wu #endif
20490125bcf0SSjoerd Simons 	{ }
20500125bcf0SSjoerd Simons };
20510125bcf0SSjoerd Simons 
20520125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
20530125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
20540125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
20550125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
20560125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
20570125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
20580125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
20596f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
20600125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
20610125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
20620125bcf0SSjoerd Simons };
2063