xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision 8bafa3a1c26b7b7235f7d26c9fe230c973d1e202)
10125bcf0SSjoerd Simons /*
20125bcf0SSjoerd Simons  * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
30125bcf0SSjoerd Simons  *
40125bcf0SSjoerd Simons  * SPDX-License-Identifier:	GPL-2.0+
50125bcf0SSjoerd Simons  *
60125bcf0SSjoerd Simons  * Rockchip GMAC ethernet IP driver for U-Boot
70125bcf0SSjoerd Simons  */
80125bcf0SSjoerd Simons 
90125bcf0SSjoerd Simons #include <common.h>
100125bcf0SSjoerd Simons #include <dm.h>
110125bcf0SSjoerd Simons #include <clk.h>
120125bcf0SSjoerd Simons #include <phy.h>
13491f3bfbSDavid Wu #include <reset.h>
140125bcf0SSjoerd Simons #include <syscon.h>
150125bcf0SSjoerd Simons #include <asm/io.h>
160125bcf0SSjoerd Simons #include <asm/arch/periph.h>
170125bcf0SSjoerd Simons #include <asm/arch/clock.h>
181f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h>
196f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
2033a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
21bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
2220bef841SDavid Wu #include <asm/arch/grf_rv1106.h>
23dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
246f0a52e9SDavid Wu #include "dwc_eth_qos.h"
256f0a52e9SDavid Wu #else
2618ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
27ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
28af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
290125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
3023adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
31c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
32793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
331f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
340a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
350125bcf0SSjoerd Simons #include "designware.h"
366f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
376f0a52e9SDavid Wu #endif
386f0a52e9SDavid Wu #include <dm/pinctrl.h>
39491f3bfbSDavid Wu #include <dm/of_access.h>
400125bcf0SSjoerd Simons 
410125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
420125bcf0SSjoerd Simons 
436f0a52e9SDavid Wu struct rockchip_eth_dev {
446f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
456f0a52e9SDavid Wu 	struct eqos_priv eqos;
466f0a52e9SDavid Wu #else
476f0a52e9SDavid Wu 	struct dw_eth_dev dw;
486f0a52e9SDavid Wu #endif
49491f3bfbSDavid Wu 	int phy_interface;
506f0a52e9SDavid Wu };
516f0a52e9SDavid Wu 
520125bcf0SSjoerd Simons /*
530125bcf0SSjoerd Simons  * Platform data for the gmac
540125bcf0SSjoerd Simons  *
550125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
560125bcf0SSjoerd Simons  */
570125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
586f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
590125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
606f0a52e9SDavid Wu #else
616f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
626f0a52e9SDavid Wu #endif
63491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
64491f3bfbSDavid Wu 	bool integrated_phy;
650a33ce65SDavid Wu 	bool clock_input;
66491f3bfbSDavid Wu 	int phy_interface;
670125bcf0SSjoerd Simons 	int tx_delay;
680125bcf0SSjoerd Simons 	int rx_delay;
6933a014bdSDavid Wu 	int bus_id;
700125bcf0SSjoerd Simons };
710125bcf0SSjoerd Simons 
721f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
736f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
746f0a52e9SDavid Wu 	const struct eqos_config config;
756f0a52e9SDavid Wu #endif
76491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
77491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
780a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
791f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
80bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
81491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
821f08aa1cSPhilipp Tomsich };
831f08aa1cSPhilipp Tomsich 
84befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
85befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
86befcb627SDavid Wu 	.reg_access_always_ok = false,
87befcb627SDavid Wu 	.mdio_wait = 10000,
88befcb627SDavid Wu 	.swr_wait = 200,
89befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
90befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
91befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
92befcb627SDavid Wu };
93befcb627SDavid Wu #endif
94befcb627SDavid Wu 
951eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
961eb9d064SDavid Wu {
971eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
981eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
991eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
1001eb9d064SDavid Wu 
1011eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1021eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1031eb9d064SDavid Wu 
1041eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1051eb9d064SDavid Wu }
1061f08aa1cSPhilipp Tomsich 
1070125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1080125bcf0SSjoerd Simons {
1090125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
110491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
11154f7ad44SDavid Wu 	struct udevice *phydev;
1120a33ce65SDavid Wu 	const char *string;
113491f3bfbSDavid Wu 	int ret;
1140a33ce65SDavid Wu 
1150a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1160a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1170a33ce65SDavid Wu 		pdata->clock_input = true;
1180a33ce65SDavid Wu 	else
1190a33ce65SDavid Wu 		pdata->clock_input = false;
1200125bcf0SSjoerd Simons 
121491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
122491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
123491f3bfbSDavid Wu 	if (ret) {
124491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
125491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
126491f3bfbSDavid Wu 	} else {
127491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
128491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
129491f3bfbSDavid Wu 							 "phy-is-integrated");
130491f3bfbSDavid Wu 	}
131491f3bfbSDavid Wu 
132491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
133491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
134491f3bfbSDavid Wu 		if (ret) {
13554f7ad44SDavid Wu 			ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
13654f7ad44SDavid Wu 			if (ret) {
13754f7ad44SDavid Wu 				debug("Get phydev by ofnode failed: err=%d\n", ret);
13854f7ad44SDavid Wu 				return ret;
13954f7ad44SDavid Wu 			}
14054f7ad44SDavid Wu 
14154f7ad44SDavid Wu 			ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
14254f7ad44SDavid Wu 			if (ret) {
143491f3bfbSDavid Wu 				debug("No PHY reset control found: ret=%d\n", ret);
144491f3bfbSDavid Wu 				return ret;
145491f3bfbSDavid Wu 			}
146491f3bfbSDavid Wu 		}
14754f7ad44SDavid Wu 	}
148491f3bfbSDavid Wu 
1491f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1507ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1517ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1521f08aa1cSPhilipp Tomsich 
1531f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1541f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1557ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1561f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1577ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1580125bcf0SSjoerd Simons 
1596f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1606f0a52e9SDavid Wu 	return 0;
1616f0a52e9SDavid Wu #else
1620125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1636f0a52e9SDavid Wu #endif
1640125bcf0SSjoerd Simons }
1650125bcf0SSjoerd Simons 
1666f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
167491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
168491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
16918ae91c8SDavid Wu {
1706f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
17118ae91c8SDavid Wu 	struct px30_grf *grf;
17218ae91c8SDavid Wu 	struct clk clk_speed;
17318ae91c8SDavid Wu 	int speed, ret;
17418ae91c8SDavid Wu 	enum {
17518ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
17618ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
17718ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
17818ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
17918ae91c8SDavid Wu 	};
18018ae91c8SDavid Wu 
18118ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
18218ae91c8SDavid Wu 			      &clk_speed);
18318ae91c8SDavid Wu 	if (ret)
18418ae91c8SDavid Wu 		return ret;
18518ae91c8SDavid Wu 
18618ae91c8SDavid Wu 	switch (priv->phydev->speed) {
18718ae91c8SDavid Wu 	case 10:
18818ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
18918ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
19018ae91c8SDavid Wu 		if (ret)
19118ae91c8SDavid Wu 			return ret;
19218ae91c8SDavid Wu 		break;
19318ae91c8SDavid Wu 	case 100:
19418ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
19518ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
19618ae91c8SDavid Wu 		if (ret)
19718ae91c8SDavid Wu 			return ret;
19818ae91c8SDavid Wu 		break;
19918ae91c8SDavid Wu 	default:
20018ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
20118ae91c8SDavid Wu 		return -EINVAL;
20218ae91c8SDavid Wu 	}
20318ae91c8SDavid Wu 
20418ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
20518ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
20618ae91c8SDavid Wu 
20718ae91c8SDavid Wu 	return 0;
20818ae91c8SDavid Wu }
20918ae91c8SDavid Wu 
210491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
211491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
212ff86648dSDavid Wu {
2136f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
214ff86648dSDavid Wu 	struct clk clk_speed;
215ff86648dSDavid Wu 	int ret;
216ff86648dSDavid Wu 
217ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
218ff86648dSDavid Wu 			      &clk_speed);
219ff86648dSDavid Wu 	if (ret)
220ff86648dSDavid Wu 		return ret;
221ff86648dSDavid Wu 
222ff86648dSDavid Wu 	switch (priv->phydev->speed) {
223ff86648dSDavid Wu 	case 10:
224ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
225ff86648dSDavid Wu 		if (ret)
226ff86648dSDavid Wu 			return ret;
227ff86648dSDavid Wu 		break;
228ff86648dSDavid Wu 	case 100:
229ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
230ff86648dSDavid Wu 		if (ret)
231ff86648dSDavid Wu 			return ret;
232ff86648dSDavid Wu 		break;
233ff86648dSDavid Wu 	case 1000:
234ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
235ff86648dSDavid Wu 		if (ret)
236ff86648dSDavid Wu 			return ret;
237ff86648dSDavid Wu 		break;
238ff86648dSDavid Wu 	default:
239ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
240ff86648dSDavid Wu 		return -EINVAL;
241ff86648dSDavid Wu 	}
242ff86648dSDavid Wu 
243ff86648dSDavid Wu 	return 0;
244ff86648dSDavid Wu }
245ff86648dSDavid Wu 
246491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
247491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
248af166ffaSDavid Wu {
2496f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
250af166ffaSDavid Wu 	struct rk322x_grf *grf;
251af166ffaSDavid Wu 	int clk;
252af166ffaSDavid Wu 	enum {
253af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
254af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
255af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
256af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
257af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
258491f3bfbSDavid Wu 
259491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
260491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
261491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
262491f3bfbSDavid Wu 
263491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
264491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
265491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
266af166ffaSDavid Wu 	};
267af166ffaSDavid Wu 
268af166ffaSDavid Wu 	switch (priv->phydev->speed) {
269af166ffaSDavid Wu 	case 10:
270491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
271491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
272491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
273af166ffaSDavid Wu 		break;
274af166ffaSDavid Wu 	case 100:
275491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
276491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
277491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
278af166ffaSDavid Wu 		break;
279af166ffaSDavid Wu 	case 1000:
280af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
281af166ffaSDavid Wu 		break;
282af166ffaSDavid Wu 	default:
283af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
284af166ffaSDavid Wu 		return -EINVAL;
285af166ffaSDavid Wu 	}
286af166ffaSDavid Wu 
287af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
288491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
289491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
290491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
291491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
292491f3bfbSDavid Wu 		     clk);
293af166ffaSDavid Wu 
294af166ffaSDavid Wu 	return 0;
295af166ffaSDavid Wu }
296af166ffaSDavid Wu 
297491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
298491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
2990125bcf0SSjoerd Simons {
3006f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3010125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
3020125bcf0SSjoerd Simons 	int clk;
3030125bcf0SSjoerd Simons 
3040125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
3050125bcf0SSjoerd Simons 	case 10:
3061f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
3070125bcf0SSjoerd Simons 		break;
3080125bcf0SSjoerd Simons 	case 100:
3091f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
3100125bcf0SSjoerd Simons 		break;
3110125bcf0SSjoerd Simons 	case 1000:
3121f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3130125bcf0SSjoerd Simons 		break;
3140125bcf0SSjoerd Simons 	default:
3150125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3160125bcf0SSjoerd Simons 		return -EINVAL;
3170125bcf0SSjoerd Simons 	}
3180125bcf0SSjoerd Simons 
3190125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3201f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3210125bcf0SSjoerd Simons 
3220125bcf0SSjoerd Simons 	return 0;
3230125bcf0SSjoerd Simons }
3240125bcf0SSjoerd Simons 
325491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
326491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
32723adb58fSDavid Wu {
3286f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
32923adb58fSDavid Wu 	struct rk3308_grf *grf;
33023adb58fSDavid Wu 	struct clk clk_speed;
33123adb58fSDavid Wu 	int speed, ret;
33223adb58fSDavid Wu 	enum {
33323adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
33423adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
33523adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
33623adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
33723adb58fSDavid Wu 	};
33823adb58fSDavid Wu 
33923adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
34023adb58fSDavid Wu 			      &clk_speed);
34123adb58fSDavid Wu 	if (ret)
34223adb58fSDavid Wu 		return ret;
34323adb58fSDavid Wu 
34423adb58fSDavid Wu 	switch (priv->phydev->speed) {
34523adb58fSDavid Wu 	case 10:
34623adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
34723adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
34823adb58fSDavid Wu 		if (ret)
34923adb58fSDavid Wu 			return ret;
35023adb58fSDavid Wu 		break;
35123adb58fSDavid Wu 	case 100:
35223adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
35323adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
35423adb58fSDavid Wu 		if (ret)
35523adb58fSDavid Wu 			return ret;
35623adb58fSDavid Wu 		break;
35723adb58fSDavid Wu 	default:
35823adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
35923adb58fSDavid Wu 		return -EINVAL;
36023adb58fSDavid Wu 	}
36123adb58fSDavid Wu 
36223adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
36323adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
36423adb58fSDavid Wu 
36523adb58fSDavid Wu 	return 0;
36623adb58fSDavid Wu }
36723adb58fSDavid Wu 
368491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
369491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
370c36b26c0SDavid Wu {
3716f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
372c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
373c36b26c0SDavid Wu 	int clk;
374c36b26c0SDavid Wu 	enum {
375c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
376c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
377c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
378c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
379c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
380491f3bfbSDavid Wu 
381491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
382491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
383491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
384491f3bfbSDavid Wu 
385491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
386491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
387491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
388c36b26c0SDavid Wu 	};
389c36b26c0SDavid Wu 
390c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
391c36b26c0SDavid Wu 	case 10:
392491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
393491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
394491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
395c36b26c0SDavid Wu 		break;
396c36b26c0SDavid Wu 	case 100:
397491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
398491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
399491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
400c36b26c0SDavid Wu 		break;
401c36b26c0SDavid Wu 	case 1000:
402c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
403c36b26c0SDavid Wu 		break;
404c36b26c0SDavid Wu 	default:
405c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
406c36b26c0SDavid Wu 		return -EINVAL;
407c36b26c0SDavid Wu 	}
408c36b26c0SDavid Wu 
409c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
410491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
411491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
412491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
413491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
414491f3bfbSDavid Wu 		     clk);
415c36b26c0SDavid Wu 
416c36b26c0SDavid Wu 	return 0;
417c36b26c0SDavid Wu }
418c36b26c0SDavid Wu 
419491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
420491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
421793f2fd2SPhilipp Tomsich {
4226f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
423793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
424793f2fd2SPhilipp Tomsich 	int clk;
425793f2fd2SPhilipp Tomsich 	enum {
426793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
427793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
428793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
429793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
430793f2fd2SPhilipp Tomsich 	};
431793f2fd2SPhilipp Tomsich 
432793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
433793f2fd2SPhilipp Tomsich 	case 10:
434793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
435793f2fd2SPhilipp Tomsich 		break;
436793f2fd2SPhilipp Tomsich 	case 100:
437793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
438793f2fd2SPhilipp Tomsich 		break;
439793f2fd2SPhilipp Tomsich 	case 1000:
440793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
441793f2fd2SPhilipp Tomsich 		break;
442793f2fd2SPhilipp Tomsich 	default:
443793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
444793f2fd2SPhilipp Tomsich 		return -EINVAL;
445793f2fd2SPhilipp Tomsich 	}
446793f2fd2SPhilipp Tomsich 
447793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
448793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
449793f2fd2SPhilipp Tomsich 
450793f2fd2SPhilipp Tomsich 	return 0;
451793f2fd2SPhilipp Tomsich }
452793f2fd2SPhilipp Tomsich 
453491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
454491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4551f08aa1cSPhilipp Tomsich {
4566f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4571f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4581f08aa1cSPhilipp Tomsich 	int clk;
4591f08aa1cSPhilipp Tomsich 
4601f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4611f08aa1cSPhilipp Tomsich 	case 10:
4621f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4631f08aa1cSPhilipp Tomsich 		break;
4641f08aa1cSPhilipp Tomsich 	case 100:
4651f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4661f08aa1cSPhilipp Tomsich 		break;
4671f08aa1cSPhilipp Tomsich 	case 1000:
4681f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4691f08aa1cSPhilipp Tomsich 		break;
4701f08aa1cSPhilipp Tomsich 	default:
4711f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4721f08aa1cSPhilipp Tomsich 		return -EINVAL;
4731f08aa1cSPhilipp Tomsich 	}
4741f08aa1cSPhilipp Tomsich 
4751f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4761f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4771f08aa1cSPhilipp Tomsich 
4781f08aa1cSPhilipp Tomsich 	return 0;
4791f08aa1cSPhilipp Tomsich }
4801f08aa1cSPhilipp Tomsich 
481491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
482491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
4830a33ce65SDavid Wu {
4846f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4850a33ce65SDavid Wu 	struct rv1108_grf *grf;
4860a33ce65SDavid Wu 	int clk, speed;
4870a33ce65SDavid Wu 	enum {
4880a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
4890a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
4900a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
4910a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
4920a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
4930a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
4940a33ce65SDavid Wu 	};
4950a33ce65SDavid Wu 
4960a33ce65SDavid Wu 	switch (priv->phydev->speed) {
4970a33ce65SDavid Wu 	case 10:
4980a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
4990a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
5000a33ce65SDavid Wu 		break;
5010a33ce65SDavid Wu 	case 100:
5020a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
5030a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
5040a33ce65SDavid Wu 		break;
5050a33ce65SDavid Wu 	default:
5060a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
5070a33ce65SDavid Wu 		return -EINVAL;
5080a33ce65SDavid Wu 	}
5090a33ce65SDavid Wu 
5100a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5110a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5120a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5130a33ce65SDavid Wu 		     clk | speed);
5140a33ce65SDavid Wu 
5150a33ce65SDavid Wu 	return 0;
5160a33ce65SDavid Wu }
517dcfb333aSDavid Wu #else
518bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
519bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
520bf0e94d0SDavid Wu {
521bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
522bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
523bf0e94d0SDavid Wu 	unsigned int div, div_mask;
524bf0e94d0SDavid Wu 
525bf0e94d0SDavid Wu 	enum {
526bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
527bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
528bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
529a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
530bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
531bf0e94d0SDavid Wu 		RK3588_GMA_CLK_RMII_DIV2 = BIT(2),
532bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
533bf0e94d0SDavid Wu 	};
534bf0e94d0SDavid Wu 
535bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
536bf0e94d0SDavid Wu 
537bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
538bf0e94d0SDavid Wu 	case 10:
539bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
540bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
541bf0e94d0SDavid Wu 		else
542bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
543bf0e94d0SDavid Wu 		break;
544bf0e94d0SDavid Wu 	case 100:
545bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
546bf0e94d0SDavid Wu 			div = RK3588_GMA_CLK_RMII_DIV2;
547bf0e94d0SDavid Wu 		else
548bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
549bf0e94d0SDavid Wu 		break;
550bf0e94d0SDavid Wu 	case 1000:
551bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
552bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
553bf0e94d0SDavid Wu 		else
554bf0e94d0SDavid Wu 			return -EINVAL;
555bf0e94d0SDavid Wu 		break;
556bf0e94d0SDavid Wu 	default:
557bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
558bf0e94d0SDavid Wu 		return -EINVAL;
559bf0e94d0SDavid Wu 	}
560bf0e94d0SDavid Wu 
561bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
562bf0e94d0SDavid Wu 		div <<= 5;
563bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
564bf0e94d0SDavid Wu 	}
565bf0e94d0SDavid Wu 
566bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
567bf0e94d0SDavid Wu 
568bf0e94d0SDavid Wu 	return 0;
569bf0e94d0SDavid Wu }
570bf0e94d0SDavid Wu 
57120bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
57220bef841SDavid Wu 				 struct rockchip_eth_dev *dev)
57320bef841SDavid Wu {
57420bef841SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
57520bef841SDavid Wu 	struct rv1106_grf *grf;
57620bef841SDavid Wu 	unsigned int div;
57720bef841SDavid Wu 
57820bef841SDavid Wu 	enum {
57920bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
58020bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
58120bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
58220bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV20 = 0,
58320bef841SDavid Wu 	};
58420bef841SDavid Wu 
58520bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
58620bef841SDavid Wu 
58720bef841SDavid Wu 	switch (priv->phy->speed) {
58820bef841SDavid Wu 	case 10:
58920bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV20;
59020bef841SDavid Wu 		break;
59120bef841SDavid Wu 	case 100:
59220bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV2;
59320bef841SDavid Wu 		break;
59420bef841SDavid Wu 	default:
59520bef841SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
59620bef841SDavid Wu 		return -EINVAL;
59720bef841SDavid Wu 	}
59820bef841SDavid Wu 
59920bef841SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
60020bef841SDavid Wu 
60120bef841SDavid Wu 	return 0;
60220bef841SDavid Wu }
60320bef841SDavid Wu 
604491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
605491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
606dcfb333aSDavid Wu {
607dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
608dcfb333aSDavid Wu 	struct clk clk_speed;
609dcfb333aSDavid Wu 	int ret;
610dcfb333aSDavid Wu 
611dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
612dcfb333aSDavid Wu 			      &clk_speed);
613dcfb333aSDavid Wu 	if (ret) {
61433a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
61533a014bdSDavid Wu 		       __func__, ret);
616dcfb333aSDavid Wu 		return ret;
617dcfb333aSDavid Wu 	}
618dcfb333aSDavid Wu 
619dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
620dcfb333aSDavid Wu 	case 10:
621dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
622dcfb333aSDavid Wu 		if (ret)
623dcfb333aSDavid Wu 			return ret;
624dcfb333aSDavid Wu 		break;
625dcfb333aSDavid Wu 	case 100:
626dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
627dcfb333aSDavid Wu 		if (ret)
628dcfb333aSDavid Wu 			return ret;
629dcfb333aSDavid Wu 		break;
630dcfb333aSDavid Wu 	case 1000:
631dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
632dcfb333aSDavid Wu 		if (ret)
633dcfb333aSDavid Wu 			return ret;
634dcfb333aSDavid Wu 		break;
635dcfb333aSDavid Wu 	default:
636dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
637dcfb333aSDavid Wu 		return -EINVAL;
638dcfb333aSDavid Wu 	}
639dcfb333aSDavid Wu 
640dcfb333aSDavid Wu 	return 0;
641dcfb333aSDavid Wu }
6426f0a52e9SDavid Wu #endif
6430a33ce65SDavid Wu 
6446f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
64518ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
64618ae91c8SDavid Wu {
64718ae91c8SDavid Wu 	struct px30_grf *grf;
64818ae91c8SDavid Wu 	enum {
64918ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
65018ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
65118ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
65218ae91c8SDavid Wu 	};
65318ae91c8SDavid Wu 
65418ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
65518ae91c8SDavid Wu 
65618ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
65718ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
65818ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
65918ae91c8SDavid Wu }
66018ae91c8SDavid Wu 
661ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
662ff86648dSDavid Wu {
663ff86648dSDavid Wu 	struct rk1808_grf *grf;
664ff86648dSDavid Wu 	enum {
665ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
666ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
667ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
668ff86648dSDavid Wu 
669ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
670ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
671ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
672ff86648dSDavid Wu 
673ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
674ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
675ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
676ff86648dSDavid Wu 	};
677ff86648dSDavid Wu 	enum {
678ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
679ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
680ff86648dSDavid Wu 
681ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
682ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
683ff86648dSDavid Wu 	};
684ff86648dSDavid Wu 
685ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
686ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
687ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
688ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
689ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
690ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
691ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
692ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
693ff86648dSDavid Wu 
694ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
695ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
696ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
697ff86648dSDavid Wu 		     pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT |
698ff86648dSDavid Wu 		     pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT);
699ff86648dSDavid Wu }
700ff86648dSDavid Wu 
701af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
702af166ffaSDavid Wu {
703af166ffaSDavid Wu 	struct rk322x_grf *grf;
704af166ffaSDavid Wu 	enum {
705af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
706af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
707af166ffaSDavid Wu 
708af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
709af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
710af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
711af166ffaSDavid Wu 
712af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
713af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
714af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
715af166ffaSDavid Wu 
716af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
717af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
718af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
719af166ffaSDavid Wu 	};
720af166ffaSDavid Wu 	enum {
721af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
722af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
723af166ffaSDavid Wu 
724af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
725af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
726af166ffaSDavid Wu 	};
727af166ffaSDavid Wu 
728af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
729af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
730af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
731af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
732af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
733af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
734af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
735af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
736af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
737af166ffaSDavid Wu 
738af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
739af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
740af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
741af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
742af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
743af166ffaSDavid Wu }
744af166ffaSDavid Wu 
745491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
746491f3bfbSDavid Wu {
747491f3bfbSDavid Wu 	struct rk322x_grf *grf;
748491f3bfbSDavid Wu 	enum {
749491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
750491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
751491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
752491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
753491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
754491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
755491f3bfbSDavid Wu 	};
756491f3bfbSDavid Wu 
757491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
758491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
759491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
760491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
761491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
762491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
763491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
764491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
765491f3bfbSDavid Wu }
766491f3bfbSDavid Wu 
7671f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
7681f08aa1cSPhilipp Tomsich {
7691f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
7701f08aa1cSPhilipp Tomsich 
7711f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
7721f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
7731f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
7741f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
7751f08aa1cSPhilipp Tomsich 
7761f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
7771f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
7781f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
7791f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
7801f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
7811f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
7821f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
7831f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
7841f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
7851f08aa1cSPhilipp Tomsich }
7861f08aa1cSPhilipp Tomsich 
78723adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
78823adb58fSDavid Wu {
78923adb58fSDavid Wu 	struct rk3308_grf *grf;
79023adb58fSDavid Wu 	enum {
79123adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
79223adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
79323adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
79423adb58fSDavid Wu 	};
79523adb58fSDavid Wu 
79623adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
79723adb58fSDavid Wu 
79823adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
79923adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
80023adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
80123adb58fSDavid Wu }
80223adb58fSDavid Wu 
803c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
804c36b26c0SDavid Wu {
805c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
806c36b26c0SDavid Wu 	enum {
807c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
808c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
809c36b26c0SDavid Wu 
810c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
811c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
812c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
813c36b26c0SDavid Wu 
814c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
815c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
816c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
817c36b26c0SDavid Wu 
818c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
819c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
820c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
821c36b26c0SDavid Wu 	};
822c36b26c0SDavid Wu 	enum {
823c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
824c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
825c36b26c0SDavid Wu 
826c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
827c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
828c36b26c0SDavid Wu 	};
829c36b26c0SDavid Wu 
830c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
831c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
832c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
833c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
834c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
835c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
836c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
837c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
838c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
839c36b26c0SDavid Wu 
840c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
841c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
842c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
843c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
844c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
845c36b26c0SDavid Wu }
846c36b26c0SDavid Wu 
847491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
848491f3bfbSDavid Wu {
849491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
850491f3bfbSDavid Wu 	enum {
851491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
852491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
853491f3bfbSDavid Wu 
854491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
855491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
856491f3bfbSDavid Wu 	};
857491f3bfbSDavid Wu 
858491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
859491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
860491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
861491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
862491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
863491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
864491f3bfbSDavid Wu }
865491f3bfbSDavid Wu 
866793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
867793f2fd2SPhilipp Tomsich {
868793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
869793f2fd2SPhilipp Tomsich 	enum {
870793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
871793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
872793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
873793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
874793f2fd2SPhilipp Tomsich 	};
875793f2fd2SPhilipp Tomsich 	enum {
876793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
877793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
878793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
879793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
880793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
881793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
882793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
883793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
884793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
885793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
886793f2fd2SPhilipp Tomsich 	};
887793f2fd2SPhilipp Tomsich 
888793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
889793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
890793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
891793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
892793f2fd2SPhilipp Tomsich 
893793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
894793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
895793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
896793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
897793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
898793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
899793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
900793f2fd2SPhilipp Tomsich 		     pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT |
901793f2fd2SPhilipp Tomsich 		     pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT);
902793f2fd2SPhilipp Tomsich }
903793f2fd2SPhilipp Tomsich 
9041f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
9051f08aa1cSPhilipp Tomsich {
9061f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
9071f08aa1cSPhilipp Tomsich 
9081f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9091f08aa1cSPhilipp Tomsich 
9101f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
9111f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
9121f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
9131f08aa1cSPhilipp Tomsich 
9141f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
9151f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
9161f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
9171f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
9181f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
9191f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
9201f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
9211f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT |
9221f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT);
9231f08aa1cSPhilipp Tomsich }
9241f08aa1cSPhilipp Tomsich 
9250a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
9260a33ce65SDavid Wu {
9270a33ce65SDavid Wu 	struct rv1108_grf *grf;
9280a33ce65SDavid Wu 
9290a33ce65SDavid Wu 	enum {
9300a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
9310a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
9320a33ce65SDavid Wu 	};
9330a33ce65SDavid Wu 
9340a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
9350a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
9360a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
9370a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
9380a33ce65SDavid Wu }
939491f3bfbSDavid Wu 
940491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
941491f3bfbSDavid Wu {
942491f3bfbSDavid Wu 	struct rk322x_grf *grf;
943491f3bfbSDavid Wu 	enum {
944491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
945491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
946491f3bfbSDavid Wu 	};
947491f3bfbSDavid Wu 	enum {
948491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
949491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
950491f3bfbSDavid Wu 
951491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
952491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
953491f3bfbSDavid Wu 
954491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
955491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
956491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
957491f3bfbSDavid Wu 	};
958491f3bfbSDavid Wu 	enum {
959491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
960491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
961491f3bfbSDavid Wu 	};
962491f3bfbSDavid Wu 	enum {
963491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
964491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
965491f3bfbSDavid Wu 	};
966491f3bfbSDavid Wu 
967491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
968491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
969491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
970491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
971491f3bfbSDavid Wu 
972491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
973491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
974491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
975491f3bfbSDavid Wu 
976491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
977491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
978491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
979491f3bfbSDavid Wu 
980491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
981491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
982491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
983491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
984491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
985491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
986491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
987491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
988491f3bfbSDavid Wu 
989491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
990491f3bfbSDavid Wu 	udelay(10);
991491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
992491f3bfbSDavid Wu 	udelay(10);
993491f3bfbSDavid Wu 
994491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
995491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
996491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
997491f3bfbSDavid Wu 	udelay(30 * 1000);
998491f3bfbSDavid Wu }
999491f3bfbSDavid Wu 
1000491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1001491f3bfbSDavid Wu {
1002491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1003491f3bfbSDavid Wu 	enum {
1004491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1005491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
1006491f3bfbSDavid Wu 	};
1007491f3bfbSDavid Wu 	enum {
1008491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1009491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1010491f3bfbSDavid Wu 
1011491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1012491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
1013491f3bfbSDavid Wu 
1014491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
1015491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
1016491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
1017491f3bfbSDavid Wu 	};
1018491f3bfbSDavid Wu 	enum {
1019491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1020491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1021491f3bfbSDavid Wu 	};
1022491f3bfbSDavid Wu 	enum {
1023491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1024491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1025491f3bfbSDavid Wu 	};
1026491f3bfbSDavid Wu 
1027491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1028491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
1029491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
1030491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
1031491f3bfbSDavid Wu 
1032491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1033491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1034491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
1035491f3bfbSDavid Wu 
1036491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1037491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1038491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
1039491f3bfbSDavid Wu 
1040491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1041491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1042491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
1043491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1044491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1045491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1046491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1047491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1048491f3bfbSDavid Wu 
1049491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1050491f3bfbSDavid Wu 	udelay(10);
1051491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1052491f3bfbSDavid Wu 	udelay(10);
1053491f3bfbSDavid Wu 
1054491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1055491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1056491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1057491f3bfbSDavid Wu 	udelay(30 * 1000);
1058491f3bfbSDavid Wu }
1059491f3bfbSDavid Wu 
1060dcfb333aSDavid Wu #else
106133a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
106233a014bdSDavid Wu {
106333a014bdSDavid Wu 	struct rk3568_grf *grf;
106433a014bdSDavid Wu 	void *con1;
106533a014bdSDavid Wu 
106633a014bdSDavid Wu 	enum {
106733a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
106833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
106933a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
107033a014bdSDavid Wu 	};
107133a014bdSDavid Wu 
107233a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
107333a014bdSDavid Wu 
107433a014bdSDavid Wu 	if (pdata->bus_id == 1)
107533a014bdSDavid Wu 		con1 = &grf->mac1_con1;
107633a014bdSDavid Wu 	else
107733a014bdSDavid Wu 		con1 = &grf->mac0_con1;
107833a014bdSDavid Wu 
107933a014bdSDavid Wu 	rk_clrsetreg(con1,
108033a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
108133a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
108233a014bdSDavid Wu }
108333a014bdSDavid Wu 
108433a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
108533a014bdSDavid Wu {
108633a014bdSDavid Wu 	struct rk3568_grf *grf;
108733a014bdSDavid Wu 	void *con0, *con1;
108833a014bdSDavid Wu 
108933a014bdSDavid Wu 	enum {
109033a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
109133a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
109233a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
109333a014bdSDavid Wu 
109433a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
109533a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
109633a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
109733a014bdSDavid Wu 
109833a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
109933a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
110033a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
110133a014bdSDavid Wu 	};
110233a014bdSDavid Wu 
110333a014bdSDavid Wu 	enum {
110433a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
110533a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
110633a014bdSDavid Wu 
110733a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
110833a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
110933a014bdSDavid Wu 	};
111033a014bdSDavid Wu 
111133a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
111233a014bdSDavid Wu 
111333a014bdSDavid Wu 	if (pdata->bus_id == 1) {
111433a014bdSDavid Wu 		con0 = &grf->mac1_con0;
111533a014bdSDavid Wu 		con1 = &grf->mac1_con1;
111633a014bdSDavid Wu 	} else {
111733a014bdSDavid Wu 		con0 = &grf->mac0_con0;
111833a014bdSDavid Wu 		con1 = &grf->mac0_con1;
111933a014bdSDavid Wu 	}
112033a014bdSDavid Wu 
112133a014bdSDavid Wu 	rk_clrsetreg(con0,
112233a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
112333a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
112433a014bdSDavid Wu 		     pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT |
112533a014bdSDavid Wu 		     pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT);
112633a014bdSDavid Wu 
112733a014bdSDavid Wu 	rk_clrsetreg(con1,
112833a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
112933a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
113033a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
113133a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
113233a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
113333a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
113433a014bdSDavid Wu }
113533a014bdSDavid Wu 
1136bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1137bf0e94d0SDavid Wu {
1138bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1139bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1140bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1141bf0e94d0SDavid Wu 
1142bf0e94d0SDavid Wu 	enum {
1143bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1144bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1145bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1146bf0e94d0SDavid Wu 	};
1147bf0e94d0SDavid Wu 
1148bf0e94d0SDavid Wu 	enum {
1149bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1150bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1151bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1152bf0e94d0SDavid Wu 	};
1153bf0e94d0SDavid Wu 
1154bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1155bf0e94d0SDavid Wu 
1156bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1157bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1158bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1159bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1160bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1161bf0e94d0SDavid Wu 	} else {
1162bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1163bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1164bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1165bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1166bf0e94d0SDavid Wu 	}
1167bf0e94d0SDavid Wu 
1168bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1169bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1170bf0e94d0SDavid Wu }
1171bf0e94d0SDavid Wu 
1172bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1173bf0e94d0SDavid Wu {
1174bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1175bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1176bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1177bf0e94d0SDavid Wu 	unsigned int rx_delay;
1178bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1179bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1180bf0e94d0SDavid Wu 	void *offset_con;
1181bf0e94d0SDavid Wu 
1182bf0e94d0SDavid Wu 	enum {
1183bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1184bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1185bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1186bf0e94d0SDavid Wu 
1187bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1188bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1189bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1190bf0e94d0SDavid Wu 
1191bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1192bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1193bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1194bf0e94d0SDavid Wu 	};
1195bf0e94d0SDavid Wu 
1196bf0e94d0SDavid Wu 	enum {
1197bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1198bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1199bf0e94d0SDavid Wu 
1200bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1201bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1202bf0e94d0SDavid Wu 	};
1203bf0e94d0SDavid Wu 
1204bf0e94d0SDavid Wu 	enum {
1205bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1206bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1207bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1208bf0e94d0SDavid Wu 	};
1209bf0e94d0SDavid Wu 
1210bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1211bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1212bf0e94d0SDavid Wu 
1213bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1214bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1215bf0e94d0SDavid Wu 		rx_delay = 0;
1216bf0e94d0SDavid Wu 	} else {
1217bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1218bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1219bf0e94d0SDavid Wu 	}
1220bf0e94d0SDavid Wu 
1221bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1222bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1223bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1224bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1225bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1226bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1227bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1228bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1229bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1230bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1231bf0e94d0SDavid Wu 	} else {
1232bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1233bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1234bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1235bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1236bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1237bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1238bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1239bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1240bf0e94d0SDavid Wu 	}
1241bf0e94d0SDavid Wu 
1242bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1243bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1244bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1245bf0e94d0SDavid Wu 		     pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT |
1246bf0e94d0SDavid Wu 		     rx_delay);
1247bf0e94d0SDavid Wu 
1248bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1249bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1250bf0e94d0SDavid Wu 
1251bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1252bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1253bf0e94d0SDavid Wu }
1254bf0e94d0SDavid Wu 
125520bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
125620bef841SDavid Wu {
125720bef841SDavid Wu 	struct rv1106_grf *grf;
125854f7ad44SDavid Wu 
125954f7ad44SDavid Wu 	enum {
126020bef841SDavid Wu 		RV1106_MACPHY_ENABLE_MASK = BIT(1),
126154f7ad44SDavid Wu 		RV1106_MACPHY_DISENABLE = BIT(1),
126254f7ad44SDavid Wu 		RV1106_MACPHY_ENABLE = 0,
126320bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
126420bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL = BIT(6),
126520bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
126620bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
126720bef841SDavid Wu 		RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
126820bef841SDavid Wu 		RV1106_MACPHY_PHY_ID = BIT(11),
126920bef841SDavid Wu 	};
127020bef841SDavid Wu 
127120bef841SDavid Wu 	enum {
127220bef841SDavid Wu 		RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
127354f7ad44SDavid Wu 		RV1106_MACPHY_BGS = BIT(2),
127420bef841SDavid Wu 	};
127520bef841SDavid Wu 
127620bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
127720bef841SDavid Wu 
127820bef841SDavid Wu 	reset_assert(&pdata->phy_reset);
127920bef841SDavid Wu 	udelay(20);
128020bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
128120bef841SDavid Wu 		     RV1106_MACPHY_ENABLE_MASK |
128220bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL_MASK |
128320bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_MASK |
128420bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID_MASK,
128520bef841SDavid Wu 		     RV1106_MACPHY_ENABLE |
128620bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL |
128720bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_24M |
128820bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID);
128920bef841SDavid Wu 
129020bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
129120bef841SDavid Wu 		     RV1106_MACPHY_BGS_MASK,
129220bef841SDavid Wu 		     RV1106_MACPHY_BGS);
1293*8bafa3a1SDavid Wu 	udelay(20);
129420bef841SDavid Wu 	reset_deassert(&pdata->phy_reset);
129520bef841SDavid Wu 	udelay(30 * 1000);
129620bef841SDavid Wu }
129720bef841SDavid Wu 
1298*8bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1299*8bafa3a1SDavid Wu {
1300*8bafa3a1SDavid Wu 	struct rv1106_grf *grf;
1301*8bafa3a1SDavid Wu 	enum {
1302*8bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1303*8bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1304*8bafa3a1SDavid Wu 	};
1305*8bafa3a1SDavid Wu 
1306*8bafa3a1SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1307*8bafa3a1SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
1308*8bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
1309*8bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE);
1310*8bafa3a1SDavid Wu };
1311*8bafa3a1SDavid Wu 
1312e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1313e4e3f431SDavid Wu {
1314e4e3f431SDavid Wu 	struct rv1126_grf *grf;
1315e4e3f431SDavid Wu 
1316e4e3f431SDavid Wu 	enum {
1317e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1318e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1319e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1320e4e3f431SDavid Wu 	};
1321e4e3f431SDavid Wu 
1322e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1323e4e3f431SDavid Wu 
1324e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1325e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1326e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
1327e4e3f431SDavid Wu }
1328e4e3f431SDavid Wu 
1329dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1330dcfb333aSDavid Wu {
1331dcfb333aSDavid Wu 	struct rv1126_grf *grf;
1332dcfb333aSDavid Wu 
1333dcfb333aSDavid Wu 	enum {
1334dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
1335dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1336dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1337dcfb333aSDavid Wu 
1338dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
1339dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1340dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
1341dcfb333aSDavid Wu 
1342dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
1343dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
1344dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
1345dcfb333aSDavid Wu 
1346dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
1347dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1348dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
1349dcfb333aSDavid Wu 
1350dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
1351dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
1352dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
1353dcfb333aSDavid Wu 	};
1354dcfb333aSDavid Wu 	enum {
1355dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1356dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1357dcfb333aSDavid Wu 
1358dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1359dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1360dcfb333aSDavid Wu 	};
1361dcfb333aSDavid Wu 	enum {
1362dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1363dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1364dcfb333aSDavid Wu 
1365dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1366dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1367dcfb333aSDavid Wu 	};
1368dcfb333aSDavid Wu 
1369dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1370dcfb333aSDavid Wu 
1371dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
1372dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
1373dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
1374dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
1375dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
1376dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
1377dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
1378dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
1379dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
1380dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
1381dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
1382dcfb333aSDavid Wu 
1383dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
1384dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
1385dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
1386dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT |
1387dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT);
1388dcfb333aSDavid Wu 
1389dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
1390dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
1391dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
1392dcfb333aSDavid Wu 		     pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT |
1393dcfb333aSDavid Wu 		     pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT);
1394dcfb333aSDavid Wu }
13956f0a52e9SDavid Wu #endif
13960a33ce65SDavid Wu 
1397bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1398bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
1399bf0e94d0SDavid Wu {
1400bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1401bf0e94d0SDavid Wu 	unsigned int val, mask;
1402bf0e94d0SDavid Wu 
1403bf0e94d0SDavid Wu 	enum {
1404bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
1405bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
1406bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
1407bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
1408bf0e94d0SDavid Wu 	};
1409bf0e94d0SDavid Wu 
1410bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1411bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
1412bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
1413bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
1414bf0e94d0SDavid Wu 
1415bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1416bf0e94d0SDavid Wu 		val <<= 5;
1417bf0e94d0SDavid Wu 		mask <<= 5;
1418bf0e94d0SDavid Wu 	}
1419bf0e94d0SDavid Wu 
1420bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
1421bf0e94d0SDavid Wu }
1422bf0e94d0SDavid Wu #endif
1423bf0e94d0SDavid Wu 
14240125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
14250125bcf0SSjoerd Simons {
14260125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
14271f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
14281f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
14296f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14306f0a52e9SDavid Wu 	struct eqos_config *config;
14316f0a52e9SDavid Wu #else
14326f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
14336f0a52e9SDavid Wu #endif
14346f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
14350125bcf0SSjoerd Simons 	struct clk clk;
14360a33ce65SDavid Wu 	ulong rate;
14370125bcf0SSjoerd Simons 	int ret;
14380125bcf0SSjoerd Simons 
14396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
14406f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
14416f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
1442befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
14436f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
14446f0a52e9SDavid Wu #else
14456f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
14466f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
14476f0a52e9SDavid Wu #endif
144833a014bdSDavid Wu 	pdata->bus_id = dev->seq;
144954f7ad44SDavid Wu 
1450cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1451cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
1452cadc8d74SKever Yang 	if (ret)
1453cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
1454cadc8d74SKever Yang 
14550125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
14560125bcf0SSjoerd Simons 	if (ret)
14570125bcf0SSjoerd Simons 		return ret;
14580125bcf0SSjoerd Simons 
1459491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
1460491f3bfbSDavid Wu 
1461bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
1462bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
1463bf0e94d0SDavid Wu 
1464491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
1465491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
1466491f3bfbSDavid Wu 
14670a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
14680a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
1469bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
14700a33ce65SDavid Wu 		/*
14710a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
14720a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
14730a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
14740a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
14750a33ce65SDavid Wu 		 */
14760a33ce65SDavid Wu 		if (!pdata->clock_input) {
14770a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 125000000);
14780a33ce65SDavid Wu 			if (rate != 125000000)
14790a33ce65SDavid Wu 				return -EINVAL;
14800a33ce65SDavid Wu 		}
14810125bcf0SSjoerd Simons 
1482bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
1483bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
1484bf0e94d0SDavid Wu 
14850125bcf0SSjoerd Simons 		/* Set to RGMII mode */
14860a33ce65SDavid Wu 		if (ops->set_to_rgmii)
14871f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
14880a33ce65SDavid Wu 		else
14890a33ce65SDavid Wu 			return -EPERM;
14900a33ce65SDavid Wu 
14910a33ce65SDavid Wu 		break;
14920a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
14930a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
14940a33ce65SDavid Wu 		if (!pdata->clock_input) {
14950a33ce65SDavid Wu 			rate = clk_set_rate(&clk, 50000000);
14960a33ce65SDavid Wu 			if (rate != 50000000)
14970a33ce65SDavid Wu 				return -EINVAL;
14980a33ce65SDavid Wu 		}
14990a33ce65SDavid Wu 
15000a33ce65SDavid Wu 		/* Set to RMII mode */
15010a33ce65SDavid Wu 		if (ops->set_to_rmii)
15020a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
15030a33ce65SDavid Wu 
15040a33ce65SDavid Wu 		break;
15050a33ce65SDavid Wu 	default:
15060a33ce65SDavid Wu 		debug("NO interface defined!\n");
15070a33ce65SDavid Wu 		return -ENXIO;
15080a33ce65SDavid Wu 	}
15090125bcf0SSjoerd Simons 
15106f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15116f0a52e9SDavid Wu 	return eqos_probe(dev);
15126f0a52e9SDavid Wu #else
15130125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
15146f0a52e9SDavid Wu #endif
15156f0a52e9SDavid Wu }
15166f0a52e9SDavid Wu 
15176f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
15186f0a52e9SDavid Wu {
15196f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
15206f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
15216f0a52e9SDavid Wu #else
15226f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
15236f0a52e9SDavid Wu #endif
15246f0a52e9SDavid Wu }
15256f0a52e9SDavid Wu 
15266f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
15276f0a52e9SDavid Wu 				      int length)
15286f0a52e9SDavid Wu {
15296f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15306f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
15316f0a52e9SDavid Wu #else
15326f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
15336f0a52e9SDavid Wu #endif
15346f0a52e9SDavid Wu }
15356f0a52e9SDavid Wu 
15366f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
15376f0a52e9SDavid Wu 				  int length)
15386f0a52e9SDavid Wu {
15396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15406f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
15416f0a52e9SDavid Wu #else
15426f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
15436f0a52e9SDavid Wu #endif
15446f0a52e9SDavid Wu }
15456f0a52e9SDavid Wu 
15466f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
15476f0a52e9SDavid Wu 				  uchar **packetp)
15486f0a52e9SDavid Wu {
15496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15506f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
15516f0a52e9SDavid Wu #else
15526f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
15536f0a52e9SDavid Wu #endif
15540125bcf0SSjoerd Simons }
15550125bcf0SSjoerd Simons 
15560125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
15570125bcf0SSjoerd Simons {
15586f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
15591f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
15601f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
15616f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1562491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
15636f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
15646f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
15656f0a52e9SDavid Wu #endif
15660125bcf0SSjoerd Simons 	int ret;
15670125bcf0SSjoerd Simons 
15686f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15696f0a52e9SDavid Wu 	ret = eqos_init(dev);
15706f0a52e9SDavid Wu #else
15716f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
15726f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
15736f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
15746f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
15756f0a52e9SDavid Wu #endif
15760125bcf0SSjoerd Simons 	if (ret)
15770125bcf0SSjoerd Simons 		return ret;
1578491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
15790125bcf0SSjoerd Simons 	if (ret)
15800125bcf0SSjoerd Simons 		return ret;
15816f0a52e9SDavid Wu 
15826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15836f0a52e9SDavid Wu 	eqos_enable(dev);
15846f0a52e9SDavid Wu #else
15856f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
15860125bcf0SSjoerd Simons 	if (ret)
15870125bcf0SSjoerd Simons 		return ret;
15886f0a52e9SDavid Wu #endif
15890125bcf0SSjoerd Simons 
15900125bcf0SSjoerd Simons 	return 0;
15910125bcf0SSjoerd Simons }
15920125bcf0SSjoerd Simons 
15936f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
15946f0a52e9SDavid Wu {
15956f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
15966f0a52e9SDavid Wu 	eqos_stop(dev);
15976f0a52e9SDavid Wu #else
15986f0a52e9SDavid Wu 	designware_eth_stop(dev);
15996f0a52e9SDavid Wu #endif
16006f0a52e9SDavid Wu }
16016f0a52e9SDavid Wu 
16020125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
16030125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
16046f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
16056f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
16066f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
16076f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
16086f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
16090125bcf0SSjoerd Simons };
16100125bcf0SSjoerd Simons 
16116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
161218ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
161318ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
161418ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
161518ae91c8SDavid Wu };
161618ae91c8SDavid Wu 
1617ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
1618ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
1619ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
1620ff86648dSDavid Wu };
1621ff86648dSDavid Wu 
1622af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
1623af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
1624491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
1625af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
1626491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
1627af166ffaSDavid Wu };
1628af166ffaSDavid Wu 
16291f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
16301f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
16311f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
16321f08aa1cSPhilipp Tomsich };
16331f08aa1cSPhilipp Tomsich 
163423adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
163523adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
163623adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
163723adb58fSDavid Wu };
163823adb58fSDavid Wu 
1639c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
1640c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
1641491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
1642c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
1643491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
1644c36b26c0SDavid Wu };
1645c36b26c0SDavid Wu 
1646793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
1647793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
1648793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
1649793f2fd2SPhilipp Tomsich };
1650793f2fd2SPhilipp Tomsich 
16511f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
16521f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
16531f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
16541f08aa1cSPhilipp Tomsich };
16551f08aa1cSPhilipp Tomsich 
16560a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
16570a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
16580a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
16590a33ce65SDavid Wu };
1660dcfb333aSDavid Wu #else
166133a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
166233a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
166333a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
166433a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
166533a014bdSDavid Wu };
166633a014bdSDavid Wu 
1667bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
1668bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
1669bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
1670bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
1671bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
1672bf0e94d0SDavid Wu };
1673bf0e94d0SDavid Wu 
167420bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = {
167520bef841SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
1676*8bafa3a1SDavid Wu 	.set_to_rmii = rv1106_set_to_rmii,
167720bef841SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
167820bef841SDavid Wu };
167920bef841SDavid Wu 
1680dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
1681dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
1682dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
1683e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
1684dcfb333aSDavid Wu };
16856f0a52e9SDavid Wu #endif
16860a33ce65SDavid Wu 
16870125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
16886f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
168984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
169018ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
169118ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
169284e90485SDavid Wu #endif
169384e90485SDavid Wu 
169484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
1695ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
1696ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
169784e90485SDavid Wu #endif
169884e90485SDavid Wu 
169984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
1700af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
1701af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
170284e90485SDavid Wu #endif
170384e90485SDavid Wu 
170484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
17051f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
17061f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
170784e90485SDavid Wu #endif
170884e90485SDavid Wu 
170984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
171023adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
171123adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
171284e90485SDavid Wu #endif
171384e90485SDavid Wu 
171484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
1715c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
1716c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
171784e90485SDavid Wu #endif
171884e90485SDavid Wu 
171984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
1720793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
1721793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
172284e90485SDavid Wu #endif
172384e90485SDavid Wu 
172484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
17251f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
17261f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
172784e90485SDavid Wu #endif
172884e90485SDavid Wu 
172984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
17300a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
17310a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
173284e90485SDavid Wu #endif
1733dcfb333aSDavid Wu #else
173484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
173533a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
173633a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
173784e90485SDavid Wu #endif
173884e90485SDavid Wu 
1739bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
1740bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
1741bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
1742bf0e94d0SDavid Wu #endif
1743bf0e94d0SDavid Wu 
174420bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106
174520bef841SDavid Wu 	{ .compatible = "rockchip,rv1106-gmac",
174620bef841SDavid Wu 	  .data = (ulong)&rv1106_gmac_ops },
174720bef841SDavid Wu #endif
174820bef841SDavid Wu 
174984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
1750dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
1751dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
17526f0a52e9SDavid Wu #endif
175384e90485SDavid Wu #endif
17540125bcf0SSjoerd Simons 	{ }
17550125bcf0SSjoerd Simons };
17560125bcf0SSjoerd Simons 
17570125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
17580125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
17590125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
17600125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
17610125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
17620125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
17630125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
17646f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
17650125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
17660125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
17670125bcf0SSjoerd Simons };
1768