xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision 3b820b8818e562ec75ef77683816cb57542435e1)
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
21bcf26c57SDavid Wu #include <asm/arch/grf_rk3506.h>
22c563400aSDavid Wu #include <asm/arch/grf_rk3528.h>
2383f30531SDavid Wu #include <asm/arch/grf_rk3562.h>
2483f30531SDavid Wu #include <asm/arch/ioc_rk3562.h>
2533a014bdSDavid Wu #include <asm/arch/grf_rk3568.h>
264ca69a29SDavid Wu #include <asm/arch/grf_rk3576.h>
274ca69a29SDavid Wu #include <asm/arch/ioc_rk3576.h>
28bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h>
29745dad46SDavid Wu #include <asm/arch/grf_rv1103b.h>
3020bef841SDavid Wu #include <asm/arch/grf_rv1106.h>
31dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h>
32*3b820b88SDavid Wu #include <asm/arch/grf_rv1126b.h>
33*3b820b88SDavid Wu #include <asm/arch/ioc_rv1126b.h>
346f0a52e9SDavid Wu #include "dwc_eth_qos.h"
356f0a52e9SDavid Wu #else
3618ae91c8SDavid Wu #include <asm/arch/grf_px30.h>
37ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h>
38af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h>
390125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
4023adb58fSDavid Wu #include <asm/arch/grf_rk3308.h>
41c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h>
42793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
431f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
440a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h>
450125bcf0SSjoerd Simons #include "designware.h"
466f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h>
476f0a52e9SDavid Wu #endif
486f0a52e9SDavid Wu #include <dm/pinctrl.h>
49491f3bfbSDavid Wu #include <dm/of_access.h>
500125bcf0SSjoerd Simons 
510125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
520125bcf0SSjoerd Simons 
536f0a52e9SDavid Wu struct rockchip_eth_dev {
546f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
556f0a52e9SDavid Wu 	struct eqos_priv eqos;
566f0a52e9SDavid Wu #else
576f0a52e9SDavid Wu 	struct dw_eth_dev dw;
586f0a52e9SDavid Wu #endif
59491f3bfbSDavid Wu 	int phy_interface;
606f0a52e9SDavid Wu };
616f0a52e9SDavid Wu 
624ca69a29SDavid Wu #define HIWORD_UPDATE(val, mask, shift)  ((val) << (shift) | (mask) << ((shift) + 16))
634ca69a29SDavid Wu 
644ca69a29SDavid Wu #define DELAY_VALUE(soc, tx, rx) ((((tx) >= 0) ? soc##_GMAC_CLK_TX_DL_CFG(tx) : 0) | (((rx) >= 0) ? soc##_GMAC_CLK_RX_DL_CFG(rx) : 0))
654ca69a29SDavid Wu 
664ca69a29SDavid Wu #define RK3576_GMAC_CLK_RX_DL_CFG(val)          HIWORD_UPDATE(val, 0x7F, 8)
674ca69a29SDavid Wu #define RK3576_GMAC_CLK_TX_DL_CFG(val)          HIWORD_UPDATE(val, 0x7F, 0)
684ca69a29SDavid Wu 
690125bcf0SSjoerd Simons /*
700125bcf0SSjoerd Simons  * Platform data for the gmac
710125bcf0SSjoerd Simons  *
720125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
730125bcf0SSjoerd Simons  */
740125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
756f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
760125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
776f0a52e9SDavid Wu #else
786f0a52e9SDavid Wu 	struct eth_pdata eth_pdata;
796f0a52e9SDavid Wu #endif
80491f3bfbSDavid Wu 	struct reset_ctl phy_reset;
81491f3bfbSDavid Wu 	bool integrated_phy;
820a33ce65SDavid Wu 	bool clock_input;
83491f3bfbSDavid Wu 	int phy_interface;
840125bcf0SSjoerd Simons 	int tx_delay;
850125bcf0SSjoerd Simons 	int rx_delay;
8633a014bdSDavid Wu 	int bus_id;
870125bcf0SSjoerd Simons };
880125bcf0SSjoerd Simons 
891f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
906f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
916f0a52e9SDavid Wu 	const struct eqos_config config;
926f0a52e9SDavid Wu #endif
93491f3bfbSDavid Wu 	int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata,
94491f3bfbSDavid Wu 			     struct rockchip_eth_dev *dev);
950a33ce65SDavid Wu 	void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata);
961f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
97bf0e94d0SDavid Wu 	void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata);
98491f3bfbSDavid Wu 	void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata);
991f08aa1cSPhilipp Tomsich };
1001f08aa1cSPhilipp Tomsich 
101befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
102befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = {
103befcb627SDavid Wu 	.reg_access_always_ok = false,
104befcb627SDavid Wu 	.mdio_wait = 10000,
105befcb627SDavid Wu 	.swr_wait = 200,
106befcb627SDavid Wu 	.config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED,
107befcb627SDavid Wu 	.config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150,
108befcb627SDavid Wu 	.ops = &eqos_rockchip_ops,
109befcb627SDavid Wu };
110befcb627SDavid Wu #endif
111befcb627SDavid Wu 
gmac_set_rgmii(struct udevice * dev,u32 tx_delay,u32 rx_delay)1121eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
1131eb9d064SDavid Wu {
1141eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
1151eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
1161eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
1171eb9d064SDavid Wu 
1181eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
1191eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
1201eb9d064SDavid Wu 
1211eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
1221eb9d064SDavid Wu }
1231f08aa1cSPhilipp Tomsich 
gmac_rockchip_ofdata_to_platdata(struct udevice * dev)1240125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
1250125bcf0SSjoerd Simons {
1260125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
127491f3bfbSDavid Wu 	struct ofnode_phandle_args args;
12854f7ad44SDavid Wu 	struct udevice *phydev;
1290a33ce65SDavid Wu 	const char *string;
130491f3bfbSDavid Wu 	int ret;
1310a33ce65SDavid Wu 
1320a33ce65SDavid Wu 	string = dev_read_string(dev, "clock_in_out");
1330a33ce65SDavid Wu 	if (!strcmp(string, "input"))
1340a33ce65SDavid Wu 		pdata->clock_input = true;
1350a33ce65SDavid Wu 	else
1360a33ce65SDavid Wu 		pdata->clock_input = false;
1370125bcf0SSjoerd Simons 
138491f3bfbSDavid Wu 	/* If phy-handle property is passed from DT, use it as the PHY */
139491f3bfbSDavid Wu 	ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args);
140491f3bfbSDavid Wu 	if (ret) {
141491f3bfbSDavid Wu 		debug("Cannot get phy phandle: ret=%d\n", ret);
142491f3bfbSDavid Wu 		pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated");
143491f3bfbSDavid Wu 	} else {
144491f3bfbSDavid Wu 		debug("Found phy-handle subnode\n");
145491f3bfbSDavid Wu 		pdata->integrated_phy = ofnode_read_bool(args.node,
146491f3bfbSDavid Wu 							 "phy-is-integrated");
147491f3bfbSDavid Wu 	}
148491f3bfbSDavid Wu 
149491f3bfbSDavid Wu 	if (pdata->integrated_phy) {
150491f3bfbSDavid Wu 		ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset);
151491f3bfbSDavid Wu 		if (ret) {
15254f7ad44SDavid Wu 			ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev);
15354f7ad44SDavid Wu 			if (ret) {
15454f7ad44SDavid Wu 				debug("Get phydev by ofnode failed: err=%d\n", ret);
15554f7ad44SDavid Wu 				return ret;
15654f7ad44SDavid Wu 			}
15754f7ad44SDavid Wu 
15854f7ad44SDavid Wu 			ret = reset_get_by_index(phydev, 0, &pdata->phy_reset);
15954f7ad44SDavid Wu 			if (ret) {
160491f3bfbSDavid Wu 				debug("No PHY reset control found: ret=%d\n", ret);
161491f3bfbSDavid Wu 				return ret;
162491f3bfbSDavid Wu 			}
163491f3bfbSDavid Wu 		}
16454f7ad44SDavid Wu 	}
165491f3bfbSDavid Wu 
1661f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
1677ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
1687ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
1691f08aa1cSPhilipp Tomsich 
1701f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
1711f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
1727ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
1731f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
1747ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
1750125bcf0SSjoerd Simons 
1766f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
1776f0a52e9SDavid Wu 	return 0;
1786f0a52e9SDavid Wu #else
1790125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
1806f0a52e9SDavid Wu #endif
1810125bcf0SSjoerd Simons }
1820125bcf0SSjoerd Simons 
1836f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)184491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
185491f3bfbSDavid Wu 				   struct rockchip_eth_dev *dev)
18618ae91c8SDavid Wu {
1876f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
18818ae91c8SDavid Wu 	struct px30_grf *grf;
18918ae91c8SDavid Wu 	struct clk clk_speed;
19018ae91c8SDavid Wu 	int speed, ret;
19118ae91c8SDavid Wu 	enum {
19218ae91c8SDavid Wu 		PX30_GMAC_SPEED_SHIFT = 0x2,
19318ae91c8SDavid Wu 		PX30_GMAC_SPEED_MASK  = BIT(2),
19418ae91c8SDavid Wu 		PX30_GMAC_SPEED_10M   = 0,
19518ae91c8SDavid Wu 		PX30_GMAC_SPEED_100M  = BIT(2),
19618ae91c8SDavid Wu 	};
19718ae91c8SDavid Wu 
19818ae91c8SDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
19918ae91c8SDavid Wu 			      &clk_speed);
20018ae91c8SDavid Wu 	if (ret)
20118ae91c8SDavid Wu 		return ret;
20218ae91c8SDavid Wu 
20318ae91c8SDavid Wu 	switch (priv->phydev->speed) {
20418ae91c8SDavid Wu 	case 10:
20518ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_10M;
20618ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
20718ae91c8SDavid Wu 		if (ret)
20818ae91c8SDavid Wu 			return ret;
20918ae91c8SDavid Wu 		break;
21018ae91c8SDavid Wu 	case 100:
21118ae91c8SDavid Wu 		speed = PX30_GMAC_SPEED_100M;
21218ae91c8SDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
21318ae91c8SDavid Wu 		if (ret)
21418ae91c8SDavid Wu 			return ret;
21518ae91c8SDavid Wu 		break;
21618ae91c8SDavid Wu 	default:
21718ae91c8SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
21818ae91c8SDavid Wu 		return -EINVAL;
21918ae91c8SDavid Wu 	}
22018ae91c8SDavid Wu 
22118ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
22218ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
22318ae91c8SDavid Wu 
22418ae91c8SDavid Wu 	return 0;
22518ae91c8SDavid Wu }
22618ae91c8SDavid Wu 
rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)227491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
228491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
229ff86648dSDavid Wu {
2306f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
231ff86648dSDavid Wu 	struct clk clk_speed;
232ff86648dSDavid Wu 	int ret;
233ff86648dSDavid Wu 
234ff86648dSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
235ff86648dSDavid Wu 			      &clk_speed);
236ff86648dSDavid Wu 	if (ret)
237ff86648dSDavid Wu 		return ret;
238ff86648dSDavid Wu 
239ff86648dSDavid Wu 	switch (priv->phydev->speed) {
240ff86648dSDavid Wu 	case 10:
241ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
242ff86648dSDavid Wu 		if (ret)
243ff86648dSDavid Wu 			return ret;
244ff86648dSDavid Wu 		break;
245ff86648dSDavid Wu 	case 100:
246ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
247ff86648dSDavid Wu 		if (ret)
248ff86648dSDavid Wu 			return ret;
249ff86648dSDavid Wu 		break;
250ff86648dSDavid Wu 	case 1000:
251ff86648dSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
252ff86648dSDavid Wu 		if (ret)
253ff86648dSDavid Wu 			return ret;
254ff86648dSDavid Wu 		break;
255ff86648dSDavid Wu 	default:
256ff86648dSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
257ff86648dSDavid Wu 		return -EINVAL;
258ff86648dSDavid Wu 	}
259ff86648dSDavid Wu 
260ff86648dSDavid Wu 	return 0;
261ff86648dSDavid Wu }
262ff86648dSDavid Wu 
rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)263491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
264491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
265af166ffaSDavid Wu {
2666f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
267af166ffaSDavid Wu 	struct rk322x_grf *grf;
268af166ffaSDavid Wu 	int clk;
269af166ffaSDavid Wu 	enum {
270af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_SHIFT = 8,
271af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_MASK  = GENMASK(9, 8),
272af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_125M  = 0 << 8,
273af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_25M   = 3 << 8,
274af166ffaSDavid Wu 		RK3228_GMAC_CLK_SEL_2_5M  = 2 << 8,
275491f3bfbSDavid Wu 
276491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_MASK   = BIT(7),
277491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_2_5M   = 0,
278491f3bfbSDavid Wu 		RK3228_GMAC_RMII_CLK_25M    = BIT(7),
279491f3bfbSDavid Wu 
280491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_MASK = BIT(2),
281491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_10   = 0,
282491f3bfbSDavid Wu 		RK3228_GMAC_RMII_SPEED_100  = BIT(2),
283af166ffaSDavid Wu 	};
284af166ffaSDavid Wu 
285af166ffaSDavid Wu 	switch (priv->phydev->speed) {
286af166ffaSDavid Wu 	case 10:
287491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
288491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) :
289491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_2_5M;
290af166ffaSDavid Wu 		break;
291af166ffaSDavid Wu 	case 100:
292491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
293491f3bfbSDavid Wu 		       (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) :
294491f3bfbSDavid Wu 		       RK3228_GMAC_CLK_SEL_25M;
295af166ffaSDavid Wu 		break;
296af166ffaSDavid Wu 	case 1000:
297af166ffaSDavid Wu 		clk = RK3228_GMAC_CLK_SEL_125M;
298af166ffaSDavid Wu 		break;
299af166ffaSDavid Wu 	default:
300af166ffaSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
301af166ffaSDavid Wu 		return -EINVAL;
302af166ffaSDavid Wu 	}
303af166ffaSDavid Wu 
304af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
305491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
306491f3bfbSDavid Wu 		     RK3228_GMAC_CLK_SEL_MASK |
307491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_CLK_MASK |
308491f3bfbSDavid Wu 		     RK3228_GMAC_RMII_SPEED_MASK,
309491f3bfbSDavid Wu 		     clk);
310af166ffaSDavid Wu 
311af166ffaSDavid Wu 	return 0;
312af166ffaSDavid Wu }
313af166ffaSDavid Wu 
rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)314491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
315491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
3160125bcf0SSjoerd Simons {
3176f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
3180125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
3190125bcf0SSjoerd Simons 	int clk;
3200125bcf0SSjoerd Simons 
3210125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
3220125bcf0SSjoerd Simons 	case 10:
3231f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
3240125bcf0SSjoerd Simons 		break;
3250125bcf0SSjoerd Simons 	case 100:
3261f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
3270125bcf0SSjoerd Simons 		break;
3280125bcf0SSjoerd Simons 	case 1000:
3291f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
3300125bcf0SSjoerd Simons 		break;
3310125bcf0SSjoerd Simons 	default:
3320125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
3330125bcf0SSjoerd Simons 		return -EINVAL;
3340125bcf0SSjoerd Simons 	}
3350125bcf0SSjoerd Simons 
3360125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
3371f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
3380125bcf0SSjoerd Simons 
3390125bcf0SSjoerd Simons 	return 0;
3400125bcf0SSjoerd Simons }
3410125bcf0SSjoerd Simons 
rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)342491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
343491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
34423adb58fSDavid Wu {
3456f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
34623adb58fSDavid Wu 	struct rk3308_grf *grf;
34723adb58fSDavid Wu 	struct clk clk_speed;
34823adb58fSDavid Wu 	int speed, ret;
34923adb58fSDavid Wu 	enum {
35023adb58fSDavid Wu 		RK3308_GMAC_SPEED_SHIFT = 0x0,
35123adb58fSDavid Wu 		RK3308_GMAC_SPEED_MASK  = BIT(0),
35223adb58fSDavid Wu 		RK3308_GMAC_SPEED_10M   = 0,
35323adb58fSDavid Wu 		RK3308_GMAC_SPEED_100M  = BIT(0),
35423adb58fSDavid Wu 	};
35523adb58fSDavid Wu 
35623adb58fSDavid Wu 	ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
35723adb58fSDavid Wu 			      &clk_speed);
35823adb58fSDavid Wu 	if (ret)
35923adb58fSDavid Wu 		return ret;
36023adb58fSDavid Wu 
36123adb58fSDavid Wu 	switch (priv->phydev->speed) {
36223adb58fSDavid Wu 	case 10:
36323adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_10M;
36423adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
36523adb58fSDavid Wu 		if (ret)
36623adb58fSDavid Wu 			return ret;
36723adb58fSDavid Wu 		break;
36823adb58fSDavid Wu 	case 100:
36923adb58fSDavid Wu 		speed = RK3308_GMAC_SPEED_100M;
37023adb58fSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
37123adb58fSDavid Wu 		if (ret)
37223adb58fSDavid Wu 			return ret;
37323adb58fSDavid Wu 		break;
37423adb58fSDavid Wu 	default:
37523adb58fSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
37623adb58fSDavid Wu 		return -EINVAL;
37723adb58fSDavid Wu 	}
37823adb58fSDavid Wu 
37923adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
38023adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
38123adb58fSDavid Wu 
38223adb58fSDavid Wu 	return 0;
38323adb58fSDavid Wu }
38423adb58fSDavid Wu 
rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)385491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
386491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
387c36b26c0SDavid Wu {
3886f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
389c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
390c36b26c0SDavid Wu 	int clk;
391c36b26c0SDavid Wu 	enum {
392c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_SHIFT = 11,
393c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_MASK  = GENMASK(12, 11),
394c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_125M  = 0 << 11,
395c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_25M   = 3 << 11,
396c36b26c0SDavid Wu 		RK3328_GMAC_CLK_SEL_2_5M  = 2 << 11,
397491f3bfbSDavid Wu 
398491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_MASK   = BIT(7),
399491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_2_5M   = 0,
400491f3bfbSDavid Wu 		RK3328_GMAC_RMII_CLK_25M    = BIT(7),
401491f3bfbSDavid Wu 
402491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_MASK = BIT(2),
403491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_10   = 0,
404491f3bfbSDavid Wu 		RK3328_GMAC_RMII_SPEED_100  = BIT(2),
405c36b26c0SDavid Wu 	};
406c36b26c0SDavid Wu 
407c36b26c0SDavid Wu 	switch (priv->phydev->speed) {
408c36b26c0SDavid Wu 	case 10:
409491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
410491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) :
411491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_2_5M;
412c36b26c0SDavid Wu 		break;
413c36b26c0SDavid Wu 	case 100:
414491f3bfbSDavid Wu 		clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ?
415491f3bfbSDavid Wu 		       (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) :
416491f3bfbSDavid Wu 		       RK3328_GMAC_CLK_SEL_25M;
417c36b26c0SDavid Wu 		break;
418c36b26c0SDavid Wu 	case 1000:
419c36b26c0SDavid Wu 		clk = RK3328_GMAC_CLK_SEL_125M;
420c36b26c0SDavid Wu 		break;
421c36b26c0SDavid Wu 	default:
422c36b26c0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
423c36b26c0SDavid Wu 		return -EINVAL;
424c36b26c0SDavid Wu 	}
425c36b26c0SDavid Wu 
426c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
427491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
428491f3bfbSDavid Wu 		     RK3328_GMAC_CLK_SEL_MASK |
429491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_CLK_MASK |
430491f3bfbSDavid Wu 		     RK3328_GMAC_RMII_SPEED_MASK,
431491f3bfbSDavid Wu 		     clk);
432c36b26c0SDavid Wu 
433c36b26c0SDavid Wu 	return 0;
434c36b26c0SDavid Wu }
435c36b26c0SDavid Wu 
rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)436491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
437491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
438793f2fd2SPhilipp Tomsich {
4396f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
440793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
441793f2fd2SPhilipp Tomsich 	int clk;
442793f2fd2SPhilipp Tomsich 	enum {
443793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
444793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
445793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
446793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
447793f2fd2SPhilipp Tomsich 	};
448793f2fd2SPhilipp Tomsich 
449793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
450793f2fd2SPhilipp Tomsich 	case 10:
451793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
452793f2fd2SPhilipp Tomsich 		break;
453793f2fd2SPhilipp Tomsich 	case 100:
454793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
455793f2fd2SPhilipp Tomsich 		break;
456793f2fd2SPhilipp Tomsich 	case 1000:
457793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
458793f2fd2SPhilipp Tomsich 		break;
459793f2fd2SPhilipp Tomsich 	default:
460793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
461793f2fd2SPhilipp Tomsich 		return -EINVAL;
462793f2fd2SPhilipp Tomsich 	}
463793f2fd2SPhilipp Tomsich 
464793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
465793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
466793f2fd2SPhilipp Tomsich 
467793f2fd2SPhilipp Tomsich 	return 0;
468793f2fd2SPhilipp Tomsich }
469793f2fd2SPhilipp Tomsich 
rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)470491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata,
471491f3bfbSDavid Wu 				     struct rockchip_eth_dev *dev)
4721f08aa1cSPhilipp Tomsich {
4736f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
4741f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
4751f08aa1cSPhilipp Tomsich 	int clk;
4761f08aa1cSPhilipp Tomsich 
4771f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
4781f08aa1cSPhilipp Tomsich 	case 10:
4791f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
4801f08aa1cSPhilipp Tomsich 		break;
4811f08aa1cSPhilipp Tomsich 	case 100:
4821f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
4831f08aa1cSPhilipp Tomsich 		break;
4841f08aa1cSPhilipp Tomsich 	case 1000:
4851f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
4861f08aa1cSPhilipp Tomsich 		break;
4871f08aa1cSPhilipp Tomsich 	default:
4881f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
4891f08aa1cSPhilipp Tomsich 		return -EINVAL;
4901f08aa1cSPhilipp Tomsich 	}
4911f08aa1cSPhilipp Tomsich 
4921f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
4931f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
4941f08aa1cSPhilipp Tomsich 
4951f08aa1cSPhilipp Tomsich 	return 0;
4961f08aa1cSPhilipp Tomsich }
4971f08aa1cSPhilipp Tomsich 
rv1108_set_rmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)498491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
499491f3bfbSDavid Wu 				 struct rockchip_eth_dev *dev)
5000a33ce65SDavid Wu {
5016f0a52e9SDavid Wu 	struct dw_eth_dev *priv = &dev->dw;
5020a33ce65SDavid Wu 	struct rv1108_grf *grf;
5030a33ce65SDavid Wu 	int clk, speed;
5040a33ce65SDavid Wu 	enum {
5050a33ce65SDavid Wu 		RV1108_GMAC_SPEED_MASK		= BIT(2),
5060a33ce65SDavid Wu 		RV1108_GMAC_SPEED_10M		= 0 << 2,
5070a33ce65SDavid Wu 		RV1108_GMAC_SPEED_100M		= 1 << 2,
5080a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_MASK	= BIT(7),
5090a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_2_5M	= 0 << 7,
5100a33ce65SDavid Wu 		RV1108_GMAC_CLK_SEL_25M		= 1 << 7,
5110a33ce65SDavid Wu 	};
5120a33ce65SDavid Wu 
5130a33ce65SDavid Wu 	switch (priv->phydev->speed) {
5140a33ce65SDavid Wu 	case 10:
5150a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_2_5M;
5160a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_10M;
5170a33ce65SDavid Wu 		break;
5180a33ce65SDavid Wu 	case 100:
5190a33ce65SDavid Wu 		clk = RV1108_GMAC_CLK_SEL_25M;
5200a33ce65SDavid Wu 		speed = RV1108_GMAC_SPEED_100M;
5210a33ce65SDavid Wu 		break;
5220a33ce65SDavid Wu 	default:
5230a33ce65SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
5240a33ce65SDavid Wu 		return -EINVAL;
5250a33ce65SDavid Wu 	}
5260a33ce65SDavid Wu 
5270a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
5280a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
5290a33ce65SDavid Wu 		     RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK,
5300a33ce65SDavid Wu 		     clk | speed);
5310a33ce65SDavid Wu 
5320a33ce65SDavid Wu 	return 0;
5330a33ce65SDavid Wu }
534dcfb333aSDavid Wu #else
rk3506_set_rmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)535bcf26c57SDavid Wu static int rk3506_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
536bcf26c57SDavid Wu 				 struct rockchip_eth_dev *dev)
537bcf26c57SDavid Wu {
538bcf26c57SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
539bcf26c57SDavid Wu 	struct rk3506_grf_reg *grf;
540bcf26c57SDavid Wu 	unsigned int div;
541bcf26c57SDavid Wu 
542bcf26c57SDavid Wu 	enum {
543bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV_SHIFT = 3,
544bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV_MASK = BIT(3),
545bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV2 = BIT(3),
546bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_DIV20 = 0,
547bcf26c57SDavid Wu 	};
548bcf26c57SDavid Wu 
549bcf26c57SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
550bcf26c57SDavid Wu 
551bcf26c57SDavid Wu 	switch (priv->phy->speed) {
552bcf26c57SDavid Wu 	case 10:
553bcf26c57SDavid Wu 		div = RK3506_GMAC_CLK_RMII_DIV20;
554bcf26c57SDavid Wu 		break;
555bcf26c57SDavid Wu 	case 100:
556bcf26c57SDavid Wu 		div = RK3506_GMAC_CLK_RMII_DIV2;
557bcf26c57SDavid Wu 		break;
558bcf26c57SDavid Wu 	default:
559bcf26c57SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
560bcf26c57SDavid Wu 		return -EINVAL;
561bcf26c57SDavid Wu 	}
562bcf26c57SDavid Wu 
563bcf26c57SDavid Wu 	if (pdata->bus_id)
564bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_DIV_MASK, div);
565bcf26c57SDavid Wu 	else
566bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_DIV_MASK, div);
567bcf26c57SDavid Wu 
568bcf26c57SDavid Wu 	return 0;
569bcf26c57SDavid Wu }
570bcf26c57SDavid Wu 
rk3528_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)571c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
572c563400aSDavid Wu 				  struct rockchip_eth_dev *dev)
573c563400aSDavid Wu {
574c563400aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
575c563400aSDavid Wu 	struct rk3528_grf *grf;
576c563400aSDavid Wu 	unsigned int div;
577c563400aSDavid Wu 
578c563400aSDavid Wu 	enum {
579c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3,
580c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3),
581c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3),
582c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_DIV20 = 0,
583c563400aSDavid Wu 	};
584c563400aSDavid Wu 
585c563400aSDavid Wu 	enum {
586c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10,
587c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10),
588c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV1 = 0,
589c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10),
590c563400aSDavid Wu 		RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11),
591c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11),
592c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_DIV20 = 0,
593c563400aSDavid Wu 	};
594c563400aSDavid Wu 
595c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
596c563400aSDavid Wu 
597c563400aSDavid Wu 	switch (priv->phy->speed) {
598c563400aSDavid Wu 	case 10:
599c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
600c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 :
601c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV20;
602c563400aSDavid Wu 		else
603c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV50;
604c563400aSDavid Wu 		break;
605c563400aSDavid Wu 	case 100:
606c563400aSDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
607c563400aSDavid Wu 			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 :
608c563400aSDavid Wu 					      RK3528_GMAC0_CLK_RMII_DIV2;
609c563400aSDavid Wu 		else
610c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV5;
611c563400aSDavid Wu 		break;
612c563400aSDavid Wu 	case 1000:
613c563400aSDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
614c563400aSDavid Wu 			div = RK3528_GMAC1_CLK_RGMII_DIV1;
615c563400aSDavid Wu 		else
616c563400aSDavid Wu 			return -EINVAL;
617c563400aSDavid Wu 		break;
618c563400aSDavid Wu 	default:
619c563400aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
620c563400aSDavid Wu 		return -EINVAL;
621c563400aSDavid Wu 	}
622c563400aSDavid Wu 
623c563400aSDavid Wu 	if (pdata->bus_id)
624c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div);
625c563400aSDavid Wu 	else
626c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div);
627c563400aSDavid Wu 
628c563400aSDavid Wu 	return 0;
629c563400aSDavid Wu }
630c563400aSDavid Wu 
rk3562_set_gmac_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)63183f30531SDavid Wu static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata,
63283f30531SDavid Wu 				 struct rockchip_eth_dev *dev)
63383f30531SDavid Wu {
63483f30531SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
63583f30531SDavid Wu 	struct rk3562_grf *grf;
63683f30531SDavid Wu 	unsigned int div;
63783f30531SDavid Wu 
63883f30531SDavid Wu 	enum {
63983f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7,
64083f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7),
64183f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV1 = 0,
64283f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7),
64383f30531SDavid Wu 		RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8),
64483f30531SDavid Wu 		RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7),
64583f30531SDavid Wu 		RK3562_GMAC0_CLK_RMII_DIV20 = 0,
64683f30531SDavid Wu 	};
64783f30531SDavid Wu 
64883f30531SDavid Wu 	enum {
64983f30531SDavid Wu 		RK3562_GMAC1_SPEED_SHIFT = 0x0,
65083f30531SDavid Wu 		RK3562_GMAC1_SPEED_MASK  = BIT(0),
65183f30531SDavid Wu 		RK3562_GMAC1_SPEED_10M   = 0,
65283f30531SDavid Wu 		RK3562_GMAC1_SPEED_100M  = BIT(0),
65383f30531SDavid Wu 	};
65483f30531SDavid Wu 
65583f30531SDavid Wu 	enum {
65683f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13,
65783f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13),
65883f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13),
65983f30531SDavid Wu 		RK3562_GMAC1_CLK_RMII_DIV20 = 0,
66083f30531SDavid Wu 	};
66183f30531SDavid Wu 
66283f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
66383f30531SDavid Wu 
66483f30531SDavid Wu 	switch (priv->phy->speed) {
66583f30531SDavid Wu 	case 10:
66683f30531SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
66783f30531SDavid Wu 			if (pdata->bus_id > 0) {
66883f30531SDavid Wu 				div = RK3562_GMAC1_CLK_RMII_DIV20;
66983f30531SDavid Wu 				rk_clrsetreg(&grf->soc_con[0],
67083f30531SDavid Wu 					     RK3562_GMAC1_SPEED_MASK,
67183f30531SDavid Wu 					     RK3562_GMAC1_SPEED_10M);
67283f30531SDavid Wu 			} else {
67383f30531SDavid Wu 				div = RK3562_GMAC0_CLK_RMII_DIV20;
67483f30531SDavid Wu 			}
67583f30531SDavid Wu 		} else {
67683f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV50;
67783f30531SDavid Wu 		}
67883f30531SDavid Wu 		break;
67983f30531SDavid Wu 	case 100:
68083f30531SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
68183f30531SDavid Wu 			if (pdata->bus_id > 0) {
68283f30531SDavid Wu 				div = RK3562_GMAC1_CLK_RMII_DIV2;
68383f30531SDavid Wu 				rk_clrsetreg(&grf->soc_con[0],
68483f30531SDavid Wu 					     RK3562_GMAC1_SPEED_MASK,
68583f30531SDavid Wu 					     RK3562_GMAC1_SPEED_100M);
68683f30531SDavid Wu 			} else {
68783f30531SDavid Wu 				div = RK3562_GMAC0_CLK_RMII_DIV2;
68883f30531SDavid Wu 			}
68983f30531SDavid Wu 		} else {
69083f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV5;
69183f30531SDavid Wu 		}
69283f30531SDavid Wu 		break;
69383f30531SDavid Wu 	case 1000:
69483f30531SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
69583f30531SDavid Wu 			div = RK3562_GMAC0_CLK_RGMII_DIV1;
69683f30531SDavid Wu 		else
69783f30531SDavid Wu 			return -EINVAL;
69883f30531SDavid Wu 		break;
69983f30531SDavid Wu 	default:
70083f30531SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
70183f30531SDavid Wu 		return -EINVAL;
70283f30531SDavid Wu 	}
70383f30531SDavid Wu 
70483f30531SDavid Wu 	if (pdata->bus_id)
70583f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div);
70683f30531SDavid Wu 	else
70783f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div);
70883f30531SDavid Wu 
70983f30531SDavid Wu 	return 0;
71083f30531SDavid Wu }
71183f30531SDavid Wu 
rk3576_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)7124ca69a29SDavid Wu static int rk3576_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
7134ca69a29SDavid Wu 				  struct rockchip_eth_dev *dev)
7144ca69a29SDavid Wu {
7154ca69a29SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
7164ca69a29SDavid Wu 	struct rk3576_sdgmac_grf_reg *s_grf;
7174ca69a29SDavid Wu 	unsigned int div, div_mask;
7184ca69a29SDavid Wu 
7194ca69a29SDavid Wu 	enum {
7204ca69a29SDavid Wu 		RK3576_GMAC_CLK_RGMII_DIV_MASK = GENMASK(6, 5),
7214ca69a29SDavid Wu 		RK3576_GMAC_CLK_RGMII_DIV1 = 0,
7224ca69a29SDavid Wu 		RK3576_GMAC_CLK_RGMII_DIV5 = GENMASK(6, 5),
7234ca69a29SDavid Wu 		RK3576_GMAC_CLK_RGMII_DIV50 = BIT(6),
7244ca69a29SDavid Wu 		RK3576_GMAC_CLK_RMII_DIV2 = BIT(5),
7254ca69a29SDavid Wu 		RK3576_GMAC_CLK_RMII_DIV20 = 0,
7264ca69a29SDavid Wu 	};
7274ca69a29SDavid Wu 
7284ca69a29SDavid Wu 	s_grf = syscon_get_first_range(ROCKCHIP_SYSCON_SDGMAC_GRF);
7294ca69a29SDavid Wu 
7304ca69a29SDavid Wu 	switch (priv->phy->speed) {
7314ca69a29SDavid Wu 	case 10:
7324ca69a29SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
7334ca69a29SDavid Wu 			div = RK3576_GMAC_CLK_RMII_DIV20;
7344ca69a29SDavid Wu 		else
7354ca69a29SDavid Wu 			div = RK3576_GMAC_CLK_RGMII_DIV50;
7364ca69a29SDavid Wu 		break;
7374ca69a29SDavid Wu 	case 100:
7384ca69a29SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
7394ca69a29SDavid Wu 			div = RK3576_GMAC_CLK_RMII_DIV2;
7404ca69a29SDavid Wu 		else
7414ca69a29SDavid Wu 			div = RK3576_GMAC_CLK_RGMII_DIV5;
7424ca69a29SDavid Wu 		break;
7434ca69a29SDavid Wu 	case 1000:
7444ca69a29SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
7454ca69a29SDavid Wu 			div = RK3576_GMAC_CLK_RGMII_DIV1;
7464ca69a29SDavid Wu 		else
7474ca69a29SDavid Wu 			return -EINVAL;
7484ca69a29SDavid Wu 		break;
7494ca69a29SDavid Wu 	default:
7504ca69a29SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
7514ca69a29SDavid Wu 		return -EINVAL;
7524ca69a29SDavid Wu 	}
7534ca69a29SDavid Wu 
7544ca69a29SDavid Wu 	div_mask = RK3576_GMAC_CLK_RGMII_DIV_MASK;
7554ca69a29SDavid Wu 
7564ca69a29SDavid Wu 	if (pdata->bus_id == 1)
7574ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac1_con, div_mask, div);
7584ca69a29SDavid Wu 	else
7594ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac0_con, div_mask, div);
7604ca69a29SDavid Wu 
7614ca69a29SDavid Wu 	return 0;
7624ca69a29SDavid Wu }
7634ca69a29SDavid Wu 
rk3588_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)764bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
765bf0e94d0SDavid Wu 				  struct rockchip_eth_dev *dev)
766bf0e94d0SDavid Wu {
767bf0e94d0SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
768bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
769bf0e94d0SDavid Wu 	unsigned int div, div_mask;
770bf0e94d0SDavid Wu 
771bf0e94d0SDavid Wu 	enum {
772bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2,
773bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2),
774bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV1 = 0,
775a116113dSDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2),
776bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3),
7776d863a16SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV2 = BIT(2),
778bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_DIV20 = 0,
7796d863a16SDavid Wu 		RK3588_GMAC1_ID_SHIFT = 5,
780bf0e94d0SDavid Wu 	};
781bf0e94d0SDavid Wu 
782bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
783bf0e94d0SDavid Wu 
784bf0e94d0SDavid Wu 	switch (priv->phy->speed) {
785bf0e94d0SDavid Wu 	case 10:
786bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
787bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV20;
788bf0e94d0SDavid Wu 		else
789bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV50;
790bf0e94d0SDavid Wu 		break;
791bf0e94d0SDavid Wu 	case 100:
792bf0e94d0SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
7936d863a16SDavid Wu 			div = RK3588_GMAC_CLK_RMII_DIV2;
794bf0e94d0SDavid Wu 		else
795bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV5;
796bf0e94d0SDavid Wu 		break;
797bf0e94d0SDavid Wu 	case 1000:
798bf0e94d0SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
799bf0e94d0SDavid Wu 			div = RK3588_GMAC_CLK_RGMII_DIV1;
800bf0e94d0SDavid Wu 		else
801bf0e94d0SDavid Wu 			return -EINVAL;
802bf0e94d0SDavid Wu 		break;
803bf0e94d0SDavid Wu 	default:
804bf0e94d0SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
805bf0e94d0SDavid Wu 		return -EINVAL;
806bf0e94d0SDavid Wu 	}
807bf0e94d0SDavid Wu 
808bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
809bf0e94d0SDavid Wu 		div <<= 5;
810bf0e94d0SDavid Wu 		div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5;
811bf0e94d0SDavid Wu 	}
812bf0e94d0SDavid Wu 
8136d863a16SDavid Wu 	div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0;
8146d863a16SDavid Wu 	div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) :
8156d863a16SDavid Wu 		   RK3588_GMAC_CLK_RGMII_DIV_MASK;
8166d863a16SDavid Wu 
817bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, div_mask, div);
818bf0e94d0SDavid Wu 
819bf0e94d0SDavid Wu 	return 0;
820bf0e94d0SDavid Wu }
821bf0e94d0SDavid Wu 
rv1106_set_rmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)82220bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata,
82320bef841SDavid Wu 				 struct rockchip_eth_dev *dev)
82420bef841SDavid Wu {
82520bef841SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
826745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B
827745dad46SDavid Wu 	struct rv1103b_grf *grf;
828745dad46SDavid Wu #else
82920bef841SDavid Wu 	struct rv1106_grf *grf;
830745dad46SDavid Wu #endif
83120bef841SDavid Wu 	unsigned int div;
83220bef841SDavid Wu 
83320bef841SDavid Wu 	enum {
83420bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2,
83520bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2),
83620bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV2 = BIT(2),
83720bef841SDavid Wu 		RV1106_GMAC_CLK_RMII_DIV20 = 0,
83820bef841SDavid Wu 	};
83920bef841SDavid Wu 
84020bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
84120bef841SDavid Wu 
84220bef841SDavid Wu 	switch (priv->phy->speed) {
84320bef841SDavid Wu 	case 10:
84420bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV20;
84520bef841SDavid Wu 		break;
84620bef841SDavid Wu 	case 100:
84720bef841SDavid Wu 		div = RV1106_GMAC_CLK_RMII_DIV2;
84820bef841SDavid Wu 		break;
84920bef841SDavid Wu 	default:
85020bef841SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
85120bef841SDavid Wu 		return -EINVAL;
85220bef841SDavid Wu 	}
85320bef841SDavid Wu 
85420bef841SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div);
85520bef841SDavid Wu 
85620bef841SDavid Wu 	return 0;
85720bef841SDavid Wu }
85820bef841SDavid Wu 
rv1126_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)859491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
860491f3bfbSDavid Wu 				  struct rockchip_eth_dev *dev)
861dcfb333aSDavid Wu {
862dcfb333aSDavid Wu 	struct eqos_priv *priv = &dev->eqos;
863dcfb333aSDavid Wu 	struct clk clk_speed;
864dcfb333aSDavid Wu 	int ret;
865dcfb333aSDavid Wu 
866dcfb333aSDavid Wu 	ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed",
867dcfb333aSDavid Wu 			      &clk_speed);
868dcfb333aSDavid Wu 	if (ret) {
86933a014bdSDavid Wu 		printf("%s can't get clk_mac_speed clock (ret=%d):\n",
87033a014bdSDavid Wu 		       __func__, ret);
871dcfb333aSDavid Wu 		return ret;
872dcfb333aSDavid Wu 	}
873dcfb333aSDavid Wu 
874dcfb333aSDavid Wu 	switch ( priv->phy->speed) {
875dcfb333aSDavid Wu 	case 10:
876dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 2500000);
877dcfb333aSDavid Wu 		if (ret)
878dcfb333aSDavid Wu 			return ret;
879dcfb333aSDavid Wu 		break;
880dcfb333aSDavid Wu 	case 100:
881dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 25000000);
882dcfb333aSDavid Wu 		if (ret)
883dcfb333aSDavid Wu 			return ret;
884dcfb333aSDavid Wu 		break;
885dcfb333aSDavid Wu 	case 1000:
886dcfb333aSDavid Wu 		ret = clk_set_rate(&clk_speed, 125000000);
887dcfb333aSDavid Wu 		if (ret)
888dcfb333aSDavid Wu 			return ret;
889dcfb333aSDavid Wu 		break;
890dcfb333aSDavid Wu 	default:
891dcfb333aSDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
892dcfb333aSDavid Wu 		return -EINVAL;
893dcfb333aSDavid Wu 	}
894dcfb333aSDavid Wu 
895dcfb333aSDavid Wu 	return 0;
896dcfb333aSDavid Wu }
897*3b820b88SDavid Wu 
rv1126b_set_rgmii_speed(struct gmac_rockchip_platdata * pdata,struct rockchip_eth_dev * dev)898*3b820b88SDavid Wu static int rv1126b_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
899*3b820b88SDavid Wu 				   struct rockchip_eth_dev *dev)
900*3b820b88SDavid Wu {
901*3b820b88SDavid Wu 	struct eqos_priv *priv = &dev->eqos;
902*3b820b88SDavid Wu 	struct rv1126b_vi_grf_reg *grf;
903*3b820b88SDavid Wu 	unsigned int div;
904*3b820b88SDavid Wu 
905*3b820b88SDavid Wu 	enum {
906*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RMII_DIV2 = BIT(5),
907*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RMII_DIV20 = 0,
908*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RMII_DIV_MASK = GENMASK(6, 5),
909*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RGMII_DIV1 = 0,
910*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RGMII_DIV5 = BIT(5) | BIT(6),
911*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RGMII_DIV50 = BIT(6),
912*3b820b88SDavid Wu 	};
913*3b820b88SDavid Wu 
914*3b820b88SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
915*3b820b88SDavid Wu 
916*3b820b88SDavid Wu 	switch (priv->phy->speed) {
917*3b820b88SDavid Wu 	case 10:
918*3b820b88SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
919*3b820b88SDavid Wu 			div = RV1126B_GMAC_CLK_RMII_DIV20;
920*3b820b88SDavid Wu 		else
921*3b820b88SDavid Wu 			div = RV1126B_GMAC_CLK_RGMII_DIV50;
922*3b820b88SDavid Wu 		break;
923*3b820b88SDavid Wu 	case 100:
924*3b820b88SDavid Wu 		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
925*3b820b88SDavid Wu 			div = RV1126B_GMAC_CLK_RMII_DIV2;
926*3b820b88SDavid Wu 		else
927*3b820b88SDavid Wu 			div = RV1126B_GMAC_CLK_RGMII_DIV5;
928*3b820b88SDavid Wu 		break;
929*3b820b88SDavid Wu 	case 1000:
930*3b820b88SDavid Wu 		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
931*3b820b88SDavid Wu 			div = RV1126B_GMAC_CLK_RGMII_DIV1;
932*3b820b88SDavid Wu 		else
933*3b820b88SDavid Wu 			return -EINVAL;
934*3b820b88SDavid Wu 		break;
935*3b820b88SDavid Wu 	default:
936*3b820b88SDavid Wu 		debug("Unknown phy speed: %d\n", priv->phy->speed);
937*3b820b88SDavid Wu 		return -EINVAL;
938*3b820b88SDavid Wu 	}
939*3b820b88SDavid Wu 
940*3b820b88SDavid Wu 	rk_clrsetreg(&grf->gmac_grf_con0 + (0x50000 / 4), RV1126B_GMAC_CLK_RMII_DIV_MASK, div);
941*3b820b88SDavid Wu 
942*3b820b88SDavid Wu 	return 0;
943*3b820b88SDavid Wu }
9446f0a52e9SDavid Wu #endif
9450a33ce65SDavid Wu 
9466f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
px30_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)94718ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
94818ae91c8SDavid Wu {
94918ae91c8SDavid Wu 	struct px30_grf *grf;
95018ae91c8SDavid Wu 	enum {
95118ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
95218ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 6),
95318ae91c8SDavid Wu 		px30_GMAC_PHY_INTF_SEL_RMII  = BIT(6),
95418ae91c8SDavid Wu 	};
95518ae91c8SDavid Wu 
95618ae91c8SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
95718ae91c8SDavid Wu 
95818ae91c8SDavid Wu 	rk_clrsetreg(&grf->mac_con1,
95918ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_MASK,
96018ae91c8SDavid Wu 		     px30_GMAC_PHY_INTF_SEL_RMII);
96118ae91c8SDavid Wu }
96218ae91c8SDavid Wu 
rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)963ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
964ff86648dSDavid Wu {
965ff86648dSDavid Wu 	struct rk1808_grf *grf;
966ff86648dSDavid Wu 	enum {
967ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
968ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
969ff86648dSDavid Wu 		RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
970ff86648dSDavid Wu 
971ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
972ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
973ff86648dSDavid Wu 		RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
974ff86648dSDavid Wu 
975ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
976ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
977ff86648dSDavid Wu 		RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
978ff86648dSDavid Wu 	};
979ff86648dSDavid Wu 	enum {
980ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
981ff86648dSDavid Wu 		RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
982ff86648dSDavid Wu 
983ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
984ff86648dSDavid Wu 		RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
985ff86648dSDavid Wu 	};
986ff86648dSDavid Wu 
987ff86648dSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
988ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
989ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_MASK |
990ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_MASK |
991ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_MASK,
992ff86648dSDavid Wu 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
993ff86648dSDavid Wu 		     RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
994ff86648dSDavid Wu 		     RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
995ff86648dSDavid Wu 
996ff86648dSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
997ff86648dSDavid Wu 		     RK1808_CLK_RX_DL_CFG_GMAC_MASK |
998ff86648dSDavid Wu 		     RK1808_CLK_TX_DL_CFG_GMAC_MASK,
999c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) |
1000c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT));
1001ff86648dSDavid Wu }
1002ff86648dSDavid Wu 
rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1003af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1004af166ffaSDavid Wu {
1005af166ffaSDavid Wu 	struct rk322x_grf *grf;
1006af166ffaSDavid Wu 	enum {
1007af166ffaSDavid Wu 		RK3228_RMII_MODE_SHIFT = 10,
1008af166ffaSDavid Wu 		RK3228_RMII_MODE_MASK  = BIT(10),
1009af166ffaSDavid Wu 
1010af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4,
1011af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1012af166ffaSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1013af166ffaSDavid Wu 
1014af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
1015af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1016af166ffaSDavid Wu 		RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
1017af166ffaSDavid Wu 
1018af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
1019af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1020af166ffaSDavid Wu 		RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
1021af166ffaSDavid Wu 	};
1022af166ffaSDavid Wu 	enum {
1023af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
1024af166ffaSDavid Wu 		RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
1025af166ffaSDavid Wu 
1026af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1027af166ffaSDavid Wu 		RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1028af166ffaSDavid Wu 	};
1029af166ffaSDavid Wu 
1030af166ffaSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1031af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
1032af166ffaSDavid Wu 		     RK3228_RMII_MODE_MASK |
1033af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK |
1034af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_MASK |
1035af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_MASK,
1036af166ffaSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RGMII |
1037af166ffaSDavid Wu 		     RK3228_RXCLK_DLY_ENA_GMAC_ENABLE |
1038af166ffaSDavid Wu 		     RK3228_TXCLK_DLY_ENA_GMAC_ENABLE);
1039af166ffaSDavid Wu 
1040af166ffaSDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
1041af166ffaSDavid Wu 		     RK3228_CLK_RX_DL_CFG_GMAC_MASK |
1042af166ffaSDavid Wu 		     RK3228_CLK_TX_DL_CFG_GMAC_MASK,
1043af166ffaSDavid Wu 		     pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT |
1044af166ffaSDavid Wu 		     pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT);
1045af166ffaSDavid Wu }
1046af166ffaSDavid Wu 
rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)1047491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1048491f3bfbSDavid Wu {
1049491f3bfbSDavid Wu 	struct rk322x_grf *grf;
1050491f3bfbSDavid Wu 	enum {
1051491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_MASK = BIT(11),
1052491f3bfbSDavid Wu 		RK3228_GRF_CON_RMII_MODE_SEL = BIT(11),
1053491f3bfbSDavid Wu 		RK3228_RMII_MODE_MASK = BIT(10),
1054491f3bfbSDavid Wu 		RK3228_RMII_MODE_SEL = BIT(10),
1055491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1056491f3bfbSDavid Wu 		RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1057491f3bfbSDavid Wu 	};
1058491f3bfbSDavid Wu 
1059491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1060491f3bfbSDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
1061491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_MASK |
1062491f3bfbSDavid Wu 		     RK3228_RMII_MODE_MASK |
1063491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_MASK,
1064491f3bfbSDavid Wu 		     RK3228_GRF_CON_RMII_MODE_SEL |
1065491f3bfbSDavid Wu 		     RK3228_RMII_MODE_SEL |
1066491f3bfbSDavid Wu 		     RK3228_GMAC_PHY_INTF_SEL_RMII);
1067491f3bfbSDavid Wu }
1068491f3bfbSDavid Wu 
rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)10691f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
10701f08aa1cSPhilipp Tomsich {
10711f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
10721f08aa1cSPhilipp Tomsich 
10731f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
10741f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
10751f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
10761f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
10771f08aa1cSPhilipp Tomsich 
10781f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
10791f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
10801f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
10811f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
10821f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
10831f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
10841f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
10851f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
10861f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
10871f08aa1cSPhilipp Tomsich }
10881f08aa1cSPhilipp Tomsich 
rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)108923adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
109023adb58fSDavid Wu {
109123adb58fSDavid Wu 	struct rk3308_grf *grf;
109223adb58fSDavid Wu 	enum {
109323adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
109423adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_MASK  = GENMASK(4, 2),
109523adb58fSDavid Wu 		RK3308_GMAC_PHY_INTF_SEL_RMII  = BIT(4),
109623adb58fSDavid Wu 	};
109723adb58fSDavid Wu 
109823adb58fSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
109923adb58fSDavid Wu 
110023adb58fSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
110123adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_MASK,
110223adb58fSDavid Wu 		     RK3308_GMAC_PHY_INTF_SEL_RMII);
110323adb58fSDavid Wu }
110423adb58fSDavid Wu 
rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1105c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1106c36b26c0SDavid Wu {
1107c36b26c0SDavid Wu 	struct rk3328_grf_regs *grf;
1108c36b26c0SDavid Wu 	enum {
1109c36b26c0SDavid Wu 		RK3328_RMII_MODE_SHIFT = 9,
1110c36b26c0SDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
1111c36b26c0SDavid Wu 
1112c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4,
1113c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1114c36b26c0SDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
1115c36b26c0SDavid Wu 
1116c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
1117c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1118c36b26c0SDavid Wu 		RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
1119c36b26c0SDavid Wu 
1120c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
1121c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1122c36b26c0SDavid Wu 		RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
1123c36b26c0SDavid Wu 	};
1124c36b26c0SDavid Wu 	enum {
1125c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7,
1126c36b26c0SDavid Wu 		RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7),
1127c36b26c0SDavid Wu 
1128c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1129c36b26c0SDavid Wu 		RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1130c36b26c0SDavid Wu 	};
1131c36b26c0SDavid Wu 
1132c36b26c0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1133c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[1],
1134c36b26c0SDavid Wu 		     RK3328_RMII_MODE_MASK |
1135c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK |
1136c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
1137c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_MASK,
1138c36b26c0SDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
1139c36b26c0SDavid Wu 		     RK3328_RXCLK_DLY_ENA_GMAC_MASK |
1140c36b26c0SDavid Wu 		     RK3328_TXCLK_DLY_ENA_GMAC_ENABLE);
1141c36b26c0SDavid Wu 
1142c36b26c0SDavid Wu 	rk_clrsetreg(&grf->mac_con[0],
1143c36b26c0SDavid Wu 		     RK3328_CLK_RX_DL_CFG_GMAC_MASK |
1144c36b26c0SDavid Wu 		     RK3328_CLK_TX_DL_CFG_GMAC_MASK,
1145c36b26c0SDavid Wu 		     pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT |
1146c36b26c0SDavid Wu 		     pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT);
1147c36b26c0SDavid Wu }
1148c36b26c0SDavid Wu 
rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)1149491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1150491f3bfbSDavid Wu {
1151491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1152491f3bfbSDavid Wu 	enum {
1153491f3bfbSDavid Wu 		RK3328_RMII_MODE_MASK  = BIT(9),
1154491f3bfbSDavid Wu 		RK3328_RMII_MODE = BIT(9),
1155491f3bfbSDavid Wu 
1156491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
1157491f3bfbSDavid Wu 		RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6),
1158491f3bfbSDavid Wu 	};
1159491f3bfbSDavid Wu 
1160491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1161491f3bfbSDavid Wu 	rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1],
1162491f3bfbSDavid Wu 		     RK3328_RMII_MODE_MASK |
1163491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_MASK,
1164491f3bfbSDavid Wu 		     RK3328_GMAC_PHY_INTF_SEL_RMII |
1165491f3bfbSDavid Wu 		     RK3328_RMII_MODE);
1166491f3bfbSDavid Wu }
1167491f3bfbSDavid Wu 
rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1168793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1169793f2fd2SPhilipp Tomsich {
1170793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
1171793f2fd2SPhilipp Tomsich 	enum {
1172793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
1173793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
1174793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
1175793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
1176793f2fd2SPhilipp Tomsich 	};
1177793f2fd2SPhilipp Tomsich 	enum {
1178793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
1179793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1180793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
1181793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
1182793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1183793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
1184793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
1185793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
1186793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
1187793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
1188793f2fd2SPhilipp Tomsich 	};
1189793f2fd2SPhilipp Tomsich 
1190793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1191793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
1192793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
1193793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
1194793f2fd2SPhilipp Tomsich 
1195793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
1196793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
1197793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
1198793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
1199793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
1200793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
1201793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
1202c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) |
1203c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT));
1204793f2fd2SPhilipp Tomsich }
1205793f2fd2SPhilipp Tomsich 
rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata * pdata)12061f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
12071f08aa1cSPhilipp Tomsich {
12081f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
12091f08aa1cSPhilipp Tomsich 
12101f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
12111f08aa1cSPhilipp Tomsich 
12121f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
12131f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
12141f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
12151f08aa1cSPhilipp Tomsich 
12161f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
12171f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
12181f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
12191f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
12201f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
12211f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
12221f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
1223c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) |
1224c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT));
12251f08aa1cSPhilipp Tomsich }
12261f08aa1cSPhilipp Tomsich 
rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata * pdata)12270a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
12280a33ce65SDavid Wu {
12290a33ce65SDavid Wu 	struct rv1108_grf *grf;
12300a33ce65SDavid Wu 
12310a33ce65SDavid Wu 	enum {
12320a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
12330a33ce65SDavid Wu 		RV1108_GMAC_PHY_INTF_SEL_RMII  = 4 << 4,
12340a33ce65SDavid Wu 	};
12350a33ce65SDavid Wu 
12360a33ce65SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
12370a33ce65SDavid Wu 	rk_clrsetreg(&grf->gmac_con0,
12380a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_MASK,
12390a33ce65SDavid Wu 		     RV1108_GMAC_PHY_INTF_SEL_RMII);
12400a33ce65SDavid Wu }
1241491f3bfbSDavid Wu 
rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1242491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1243491f3bfbSDavid Wu {
1244491f3bfbSDavid Wu 	struct rk322x_grf *grf;
1245491f3bfbSDavid Wu 	enum {
1246491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15),
1247491f3bfbSDavid Wu 		RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15),
1248491f3bfbSDavid Wu 	};
1249491f3bfbSDavid Wu 	enum {
1250491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1251491f3bfbSDavid Wu 		RK3228_MACPHY_CFG_CLK_50M = BIT(14),
1252491f3bfbSDavid Wu 
1253491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1254491f3bfbSDavid Wu 		RK3228_MACPHY_RMII_MODE = BIT(6),
1255491f3bfbSDavid Wu 
1256491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE_MASK = BIT(0),
1257491f3bfbSDavid Wu 		RK3228_MACPHY_DISENABLE = 0,
1258491f3bfbSDavid Wu 		RK3228_MACPHY_ENABLE = BIT(0),
1259491f3bfbSDavid Wu 	};
1260491f3bfbSDavid Wu 	enum {
1261491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1262491f3bfbSDavid Wu 		RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234,
1263491f3bfbSDavid Wu 	};
1264491f3bfbSDavid Wu 	enum {
1265491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1266491f3bfbSDavid Wu 		RK3228_RK_GRF_CON3_MACPHY_ID = 0x35,
1267491f3bfbSDavid Wu 	};
1268491f3bfbSDavid Wu 
1269491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1270491f3bfbSDavid Wu 	rk_clrsetreg(&grf->con_iomux,
1271491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK,
1272491f3bfbSDavid Wu 		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
1273491f3bfbSDavid Wu 
1274491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1275491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID_MASK,
1276491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON2_MACPHY_ID);
1277491f3bfbSDavid Wu 
1278491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1279491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID_MASK,
1280491f3bfbSDavid Wu 		     RK3228_RK_GRF_CON3_MACPHY_ID);
1281491f3bfbSDavid Wu 
1282491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1283491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1284491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M_MASK |
1285491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE_MASK |
1286491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1287491f3bfbSDavid Wu 		     RK3228_MACPHY_CFG_CLK_50M |
1288491f3bfbSDavid Wu 		     RK3228_MACPHY_RMII_MODE |
1289491f3bfbSDavid Wu 		     RK3228_MACPHY_DISENABLE);
1290491f3bfbSDavid Wu 
1291491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1292491f3bfbSDavid Wu 	udelay(10);
1293491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1294491f3bfbSDavid Wu 	udelay(10);
1295491f3bfbSDavid Wu 
1296491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1297491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE_MASK,
1298491f3bfbSDavid Wu 		     RK3228_MACPHY_ENABLE);
1299491f3bfbSDavid Wu 	udelay(30 * 1000);
1300491f3bfbSDavid Wu }
1301491f3bfbSDavid Wu 
rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1302491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1303491f3bfbSDavid Wu {
1304491f3bfbSDavid Wu 	struct rk3328_grf_regs *grf;
1305491f3bfbSDavid Wu 	enum {
1306491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE_MASK = BIT(9),
1307491f3bfbSDavid Wu 		RK3328_GRF_CON_RMII_MODE = BIT(9),
1308491f3bfbSDavid Wu 	};
1309491f3bfbSDavid Wu 	enum {
1310491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14),
1311491f3bfbSDavid Wu 		RK3328_MACPHY_CFG_CLK_50M = BIT(14),
1312491f3bfbSDavid Wu 
1313491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6),
1314491f3bfbSDavid Wu 		RK3328_MACPHY_RMII_MODE = BIT(6),
1315491f3bfbSDavid Wu 
1316491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE_MASK = BIT(0),
1317491f3bfbSDavid Wu 		RK3328_MACPHY_DISENABLE = 0,
1318491f3bfbSDavid Wu 		RK3328_MACPHY_ENABLE = BIT(0),
1319491f3bfbSDavid Wu 	};
1320491f3bfbSDavid Wu 	enum {
1321491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0),
1322491f3bfbSDavid Wu 		RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234,
1323491f3bfbSDavid Wu 	};
1324491f3bfbSDavid Wu 	enum {
1325491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0),
1326491f3bfbSDavid Wu 		RK3328_RK_GRF_CON3_MACPHY_ID = 0x35,
1327491f3bfbSDavid Wu 	};
1328491f3bfbSDavid Wu 
1329491f3bfbSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1330491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[1],
1331491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE_MASK,
1332491f3bfbSDavid Wu 		     RK3328_GRF_CON_RMII_MODE);
1333491f3bfbSDavid Wu 
1334491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[2],
1335491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID_MASK,
1336491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON2_MACPHY_ID);
1337491f3bfbSDavid Wu 
1338491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[3],
1339491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID_MASK,
1340491f3bfbSDavid Wu 		     RK3328_RK_GRF_CON3_MACPHY_ID);
1341491f3bfbSDavid Wu 
1342491f3bfbSDavid Wu 	/* disabled before trying to reset it &*/
1343491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1344491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M_MASK |
1345491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE_MASK |
1346491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1347491f3bfbSDavid Wu 		     RK3328_MACPHY_CFG_CLK_50M |
1348491f3bfbSDavid Wu 		     RK3328_MACPHY_RMII_MODE |
1349491f3bfbSDavid Wu 		     RK3328_MACPHY_DISENABLE);
1350491f3bfbSDavid Wu 
1351491f3bfbSDavid Wu 	reset_assert(&pdata->phy_reset);
1352491f3bfbSDavid Wu 	udelay(10);
1353491f3bfbSDavid Wu 	reset_deassert(&pdata->phy_reset);
1354491f3bfbSDavid Wu 	udelay(10);
1355491f3bfbSDavid Wu 
1356491f3bfbSDavid Wu 	rk_clrsetreg(&grf->macphy_con[0],
1357491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE_MASK,
1358491f3bfbSDavid Wu 		     RK3328_MACPHY_ENABLE);
1359491f3bfbSDavid Wu 	udelay(30 * 1000);
1360491f3bfbSDavid Wu }
1361491f3bfbSDavid Wu 
1362dcfb333aSDavid Wu #else
rk3506_set_to_rmii(struct gmac_rockchip_platdata * pdata)1363bcf26c57SDavid Wu static void rk3506_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1364bcf26c57SDavid Wu {
1365bcf26c57SDavid Wu 	unsigned int clk_mode;
1366bcf26c57SDavid Wu 	struct rk3506_grf_reg *grf;
1367bcf26c57SDavid Wu 
1368bcf26c57SDavid Wu 	enum {
1369bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_MODE_SHIFT = 0x1,
1370bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_MODE_MASK = BIT(1),
1371bcf26c57SDavid Wu 		RK3506_GMAC_CLK_RMII_MODE = BIT(1),
1372bcf26c57SDavid Wu 	};
1373bcf26c57SDavid Wu 
1374bcf26c57SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1375bcf26c57SDavid Wu 	clk_mode = RK3506_GMAC_CLK_RMII_MODE;
1376bcf26c57SDavid Wu 
1377bcf26c57SDavid Wu 	if (pdata->bus_id == 1)
1378bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode);
1379bcf26c57SDavid Wu 	else
1380bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode);
1381bcf26c57SDavid Wu }
1382bcf26c57SDavid Wu 
rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)1383c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
1384c563400aSDavid Wu {
1385c563400aSDavid Wu 	struct rk3528_grf *grf;
1386c563400aSDavid Wu 	unsigned char bgs[1] = {0};
1387c563400aSDavid Wu 
1388c563400aSDavid Wu 	enum {
1389c563400aSDavid Wu 		RK3528_MACPHY_ENABLE_MASK = BIT(1),
1390c563400aSDavid Wu 		RK3528_MACPHY_DISENABLE = BIT(1),
1391c563400aSDavid Wu 		RK3528_MACPHY_ENABLE = 0,
1392c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
1393c563400aSDavid Wu 		RK3528_MACPHY_XMII_SEL = BIT(6),
1394c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
1395c563400aSDavid Wu 		RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
1396c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
1397c563400aSDavid Wu 		RK3528_MACPHY_PHY_ID = BIT(11),
1398c563400aSDavid Wu 	};
1399c563400aSDavid Wu 
1400c563400aSDavid Wu 	enum {
1401c563400aSDavid Wu 		RK3528_MACPHY_BGS_MASK = GENMASK(3, 0),
1402c563400aSDavid Wu 	};
1403c563400aSDavid Wu 
1404c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1405c563400aSDavid Wu 	struct udevice *dev;
1406c563400aSDavid Wu 	u32 regs[2] = {0};
1407c563400aSDavid Wu 	ofnode node;
1408c563400aSDavid Wu 	int ret = 0;
1409c563400aSDavid Wu 
1410c563400aSDavid Wu 	/* retrieve the device */
1411c563400aSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1412c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1413c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1414c563400aSDavid Wu 						  &dev);
1415c563400aSDavid Wu 	else
1416c563400aSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1417c563400aSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1418c563400aSDavid Wu 						  &dev);
1419c563400aSDavid Wu 	if (!ret) {
1420c563400aSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1421c563400aSDavid Wu 		if (ofnode_valid(node)) {
1422c563400aSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1423c563400aSDavid Wu 				/* read the bgs from the efuses */
1424c563400aSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1425c563400aSDavid Wu 				if (ret) {
1426c563400aSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1427c563400aSDavid Wu 					       ret);
1428c563400aSDavid Wu 					bgs[0] = 0;
1429c563400aSDavid Wu 				}
1430c563400aSDavid Wu 			}
1431c563400aSDavid Wu 		}
1432c563400aSDavid Wu 	}
1433c563400aSDavid Wu #endif
1434c563400aSDavid Wu 
1435c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1436c563400aSDavid Wu 
1437c563400aSDavid Wu 	reset_assert(&pdata->phy_reset);
1438c563400aSDavid Wu 	udelay(20);
1439c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
1440c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE_MASK |
1441c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL_MASK |
1442c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_MASK |
1443c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID_MASK,
1444c563400aSDavid Wu 		     RK3528_MACPHY_ENABLE |
1445c563400aSDavid Wu 		     RK3528_MACPHY_XMII_SEL |
1446c563400aSDavid Wu 		     RK3528_MACPHY_24M_CLK_SEL_24M |
1447c563400aSDavid Wu 		     RK3528_MACPHY_PHY_ID);
1448c563400aSDavid Wu 
1449c563400aSDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
1450c563400aSDavid Wu 		     RK3528_MACPHY_BGS_MASK,
1451c563400aSDavid Wu 		     bgs[0]);
1452c563400aSDavid Wu 	udelay(20);
1453c563400aSDavid Wu 	reset_deassert(&pdata->phy_reset);
1454c563400aSDavid Wu 	udelay(30 * 1000);
1455c563400aSDavid Wu }
1456c563400aSDavid Wu 
rk3528_set_to_rmii(struct gmac_rockchip_platdata * pdata)1457c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1458c563400aSDavid Wu {
1459c563400aSDavid Wu 	unsigned int clk_mode;
1460c563400aSDavid Wu 	struct rk3528_grf *grf;
1461c563400aSDavid Wu 
1462c563400aSDavid Wu 	enum {
1463c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1,
1464c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1),
1465c563400aSDavid Wu 		RK3528_GMAC0_CLK_RMII_MODE = 0x1,
1466c563400aSDavid Wu 	};
1467c563400aSDavid Wu 
1468c563400aSDavid Wu 	enum {
1469c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8,
1470c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8),
1471c563400aSDavid Wu 		RK3528_GMAC1_CLK_RMII_MODE = 0x1,
1472c563400aSDavid Wu 	};
1473c563400aSDavid Wu 
1474c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1475c563400aSDavid Wu 
1476c563400aSDavid Wu 	if (pdata->bus_id == 1) {
1477c563400aSDavid Wu 		clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT;
1478c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode);
1479c563400aSDavid Wu 	} else {
1480c563400aSDavid Wu 		clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT;
1481c563400aSDavid Wu 		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode);
1482c563400aSDavid Wu 	}
1483c563400aSDavid Wu }
1484c563400aSDavid Wu 
rk3528_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1485c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1486c563400aSDavid Wu {
1487c563400aSDavid Wu 	unsigned int rx_enable;
1488c563400aSDavid Wu 	unsigned int rx_delay;
1489c563400aSDavid Wu 	struct rk3528_grf *grf;
1490c563400aSDavid Wu 
1491c563400aSDavid Wu 	enum {
1492c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8,
1493c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE_MASK = BIT(8),
1494c563400aSDavid Wu 		RK3528_GMAC1_RGMII_MODE = 0x0,
1495c563400aSDavid Wu 
1496c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14),
1497c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0,
1498c563400aSDavid Wu 		RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14),
1499c563400aSDavid Wu 
1500c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15),
1501c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0,
1502c563400aSDavid Wu 		RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15),
1503c563400aSDavid Wu 	};
1504c563400aSDavid Wu 
1505c563400aSDavid Wu 	enum {
1506c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8,
1507c563400aSDavid Wu 		RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8),
1508c563400aSDavid Wu 
1509c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0,
1510c563400aSDavid Wu 		RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0),
1511c563400aSDavid Wu 	};
1512c563400aSDavid Wu 
1513c563400aSDavid Wu 	if (!pdata->bus_id)
1514c563400aSDavid Wu 		return;
1515c563400aSDavid Wu 
1516c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1517c563400aSDavid Wu 
1518c563400aSDavid Wu 	if (pdata->rx_delay < 0) {
1519c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE;
1520c563400aSDavid Wu 		rx_delay = 0;
1521c563400aSDavid Wu 	} else {
1522c563400aSDavid Wu 		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE;
1523c563400aSDavid Wu 		rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT;
1524c563400aSDavid Wu 	}
1525c563400aSDavid Wu 
1526c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0,
1527c563400aSDavid Wu 		     RK3528_GMAC1_TXCLK_DLY_ENA_MASK |
1528c563400aSDavid Wu 		     RK3528_GMAC1_RXCLK_DLY_ENA_MASK |
1529c563400aSDavid Wu 		     RK3528_GMAC1_RGMII_MODE_MASK,
1530c563400aSDavid Wu 		     rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE |
1531c563400aSDavid Wu 		     (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT));
1532c563400aSDavid Wu 
1533c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con1,
1534c563400aSDavid Wu 		     RK3528_GMAC1_RX_DL_CFG_MASK |
1535c563400aSDavid Wu 		     RK3528_GMAC1_TX_DL_CFG_MASK,
1536c563400aSDavid Wu 		     (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) |
1537c563400aSDavid Wu 		     rx_delay);
1538c563400aSDavid Wu }
1539c563400aSDavid Wu 
rk3562_set_to_rmii(struct gmac_rockchip_platdata * pdata)154083f30531SDavid Wu static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata)
154183f30531SDavid Wu {
154283f30531SDavid Wu 	struct rk3562_grf *grf;
154383f30531SDavid Wu 	unsigned int mode;
154483f30531SDavid Wu 
154583f30531SDavid Wu 	enum {
154683f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE_SHIFT = 0x5,
154783f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE_MASK = BIT(5),
154883f30531SDavid Wu 		RK3562_GMAC0_RMII_MODE = 0x1,
154983f30531SDavid Wu 	};
155083f30531SDavid Wu 
155183f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
155283f30531SDavid Wu 
155383f30531SDavid Wu 	if (!pdata->bus_id) {
155483f30531SDavid Wu 		mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT;
155583f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode);
155683f30531SDavid Wu 	}
155783f30531SDavid Wu }
155883f30531SDavid Wu 
rk3562_set_to_rgmii(struct gmac_rockchip_platdata * pdata)155983f30531SDavid Wu static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
156083f30531SDavid Wu {
156183f30531SDavid Wu 	struct rk3562_grf *grf;
156283f30531SDavid Wu 	struct rk3562_ioc *ioc;
156383f30531SDavid Wu 	unsigned int rx_enable;
156483f30531SDavid Wu 	unsigned int rx_delay;
156583f30531SDavid Wu 
156683f30531SDavid Wu 	enum {
156783f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5,
156883f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE_MASK = BIT(5),
156983f30531SDavid Wu 		RK3562_GMAC0_RGMII_MODE = 0x0,
157083f30531SDavid Wu 
157183f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0),
157283f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0,
157383f30531SDavid Wu 		RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0),
157483f30531SDavid Wu 
157583f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1),
157683f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0,
157783f30531SDavid Wu 		RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1),
157883f30531SDavid Wu 	};
157983f30531SDavid Wu 
158083f30531SDavid Wu 	enum {
158183f30531SDavid Wu 		RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8,
158283f30531SDavid Wu 		RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8),
158383f30531SDavid Wu 
158483f30531SDavid Wu 		RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0,
158583f30531SDavid Wu 		RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0),
158683f30531SDavid Wu 	};
158783f30531SDavid Wu 
158883f30531SDavid Wu 	if (pdata->bus_id)
158983f30531SDavid Wu 		return;
159083f30531SDavid Wu 
159183f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
159283f30531SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
159383f30531SDavid Wu 
159483f30531SDavid Wu 	rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK,
159583f30531SDavid Wu 		     RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT);
159683f30531SDavid Wu 
159783f30531SDavid Wu 	if (pdata->rx_delay < 0) {
159883f30531SDavid Wu 		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE;
159983f30531SDavid Wu 		rx_delay = 0;
160083f30531SDavid Wu 	} else {
160183f30531SDavid Wu 		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE;
160283f30531SDavid Wu 		rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT;
160383f30531SDavid Wu 	}
160483f30531SDavid Wu 
160583f30531SDavid Wu 	rk_clrsetreg(&ioc->mac0_io_con1,
160683f30531SDavid Wu 		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
160783f30531SDavid Wu 		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
160883f30531SDavid Wu 		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
160983f30531SDavid Wu 
161083f30531SDavid Wu 	rk_clrsetreg(&ioc->mac0_io_con0,
161183f30531SDavid Wu 		     RK3562_GMAC0_RX_DL_CFG_MASK |
161283f30531SDavid Wu 		     RK3562_GMAC0_TX_DL_CFG_MASK,
161383f30531SDavid Wu 		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
161483f30531SDavid Wu 		     rx_delay);
161583f30531SDavid Wu 
161683f30531SDavid Wu 	rk_clrsetreg(&ioc->mac1_io_con1,
161783f30531SDavid Wu 		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
161883f30531SDavid Wu 		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
161983f30531SDavid Wu 		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
162083f30531SDavid Wu 
162183f30531SDavid Wu 	rk_clrsetreg(&ioc->mac1_io_con0,
162283f30531SDavid Wu 		     RK3562_GMAC0_RX_DL_CFG_MASK |
162383f30531SDavid Wu 		     RK3562_GMAC0_TX_DL_CFG_MASK,
162483f30531SDavid Wu 		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
162583f30531SDavid Wu 		     rx_delay);
162683f30531SDavid Wu }
162783f30531SDavid Wu 
rk3568_set_to_rmii(struct gmac_rockchip_platdata * pdata)162833a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
162933a014bdSDavid Wu {
163033a014bdSDavid Wu 	struct rk3568_grf *grf;
163133a014bdSDavid Wu 	void *con1;
163233a014bdSDavid Wu 
163333a014bdSDavid Wu 	enum {
163433a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
163533a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
163633a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6),
163733a014bdSDavid Wu 	};
163833a014bdSDavid Wu 
163933a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
164033a014bdSDavid Wu 
164133a014bdSDavid Wu 	if (pdata->bus_id == 1)
164233a014bdSDavid Wu 		con1 = &grf->mac1_con1;
164333a014bdSDavid Wu 	else
164433a014bdSDavid Wu 		con1 = &grf->mac0_con1;
164533a014bdSDavid Wu 
164633a014bdSDavid Wu 	rk_clrsetreg(con1,
164733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
164833a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RMII);
164933a014bdSDavid Wu }
165033a014bdSDavid Wu 
rk3568_set_to_rgmii(struct gmac_rockchip_platdata * pdata)165133a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
165233a014bdSDavid Wu {
165333a014bdSDavid Wu 	struct rk3568_grf *grf;
165433a014bdSDavid Wu 	void *con0, *con1;
165533a014bdSDavid Wu 
165633a014bdSDavid Wu 	enum {
165733a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4,
165833a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
165933a014bdSDavid Wu 		RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
166033a014bdSDavid Wu 
166133a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
166233a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
166333a014bdSDavid Wu 		RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
166433a014bdSDavid Wu 
166533a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
166633a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
166733a014bdSDavid Wu 		RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
166833a014bdSDavid Wu 	};
166933a014bdSDavid Wu 
167033a014bdSDavid Wu 	enum {
167133a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
167233a014bdSDavid Wu 		RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
167333a014bdSDavid Wu 
167433a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
167533a014bdSDavid Wu 		RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
167633a014bdSDavid Wu 	};
167733a014bdSDavid Wu 
167833a014bdSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
167933a014bdSDavid Wu 
168033a014bdSDavid Wu 	if (pdata->bus_id == 1) {
168133a014bdSDavid Wu 		con0 = &grf->mac1_con0;
168233a014bdSDavid Wu 		con1 = &grf->mac1_con1;
168333a014bdSDavid Wu 	} else {
168433a014bdSDavid Wu 		con0 = &grf->mac0_con0;
168533a014bdSDavid Wu 		con1 = &grf->mac0_con1;
168633a014bdSDavid Wu 	}
168733a014bdSDavid Wu 
168833a014bdSDavid Wu 	rk_clrsetreg(con0,
168933a014bdSDavid Wu 		     RK3568_CLK_RX_DL_CFG_GMAC_MASK |
169033a014bdSDavid Wu 		     RK3568_CLK_TX_DL_CFG_GMAC_MASK,
1691c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) |
1692c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT));
169333a014bdSDavid Wu 
169433a014bdSDavid Wu 	rk_clrsetreg(con1,
169533a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_MASK |
169633a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_MASK |
169733a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_MASK,
169833a014bdSDavid Wu 		     RK3568_TXCLK_DLY_ENA_GMAC_ENABLE |
169933a014bdSDavid Wu 		     RK3568_RXCLK_DLY_ENA_GMAC_ENABLE |
170033a014bdSDavid Wu 		     RK3568_GMAC_PHY_INTF_SEL_RGMII);
170133a014bdSDavid Wu }
170233a014bdSDavid Wu 
rk3576_set_to_rmii(struct gmac_rockchip_platdata * pdata)17034ca69a29SDavid Wu static void rk3576_set_to_rmii(struct gmac_rockchip_platdata *pdata)
17044ca69a29SDavid Wu {
17054ca69a29SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
17064ca69a29SDavid Wu 	struct rk3576_sdgmac_grf_reg *s_grf;
17074ca69a29SDavid Wu 
17084ca69a29SDavid Wu 	enum {
17094ca69a29SDavid Wu 		RK3576_GMAC_RMII_MODE_MASK = BIT(3),
17104ca69a29SDavid Wu 		RK3576_GMAC_RMII_MODE = 0x1,
17114ca69a29SDavid Wu 	};
17124ca69a29SDavid Wu 
17134ca69a29SDavid Wu 	s_grf = syscon_get_first_range(ROCKCHIP_SYSCON_SDGMAC_GRF);
17144ca69a29SDavid Wu 
17154ca69a29SDavid Wu 	clk_mode = RK3576_GMAC_RMII_MODE;
17164ca69a29SDavid Wu 	clk_mode_mask = RK3576_GMAC_RMII_MODE_MASK;
17174ca69a29SDavid Wu 
17184ca69a29SDavid Wu 	if (pdata->bus_id == 1)
17194ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac1_con, clk_mode_mask, clk_mode);
17204ca69a29SDavid Wu 	else
17214ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac0_con, clk_mode_mask, clk_mode);
17224ca69a29SDavid Wu }
17234ca69a29SDavid Wu 
rk3576_set_to_rgmii(struct gmac_rockchip_platdata * pdata)17244ca69a29SDavid Wu static void rk3576_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
17254ca69a29SDavid Wu {
17264ca69a29SDavid Wu 	struct rk3576_sdgmac_grf_reg *s_grf;
17274ca69a29SDavid Wu 	struct rk3576_vccio_ioc_reg *ioc;
17284ca69a29SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
17294ca69a29SDavid Wu 	unsigned int rx_enable, tx_enable;
17304ca69a29SDavid Wu 	void *offset_con;
17314ca69a29SDavid Wu 
17324ca69a29SDavid Wu 	enum {
17334ca69a29SDavid Wu 		RK3576_GMAC_RXCLK_DLY_DISABLE = 0,
17344ca69a29SDavid Wu 		RK3576_GMAC_RXCLK_DLY_ENABLE = BIT(15),
17354ca69a29SDavid Wu 
17364ca69a29SDavid Wu 		RK3576_GMAC_TXCLK_DLY_DISABLE = 0,
17374ca69a29SDavid Wu 		RK3576_GMAC_TXCLK_DLY_ENABLE = BIT(7),
17384ca69a29SDavid Wu 	};
17394ca69a29SDavid Wu 
17404ca69a29SDavid Wu 	enum {
17414ca69a29SDavid Wu 		RK3576_GMAC_CLK_RGMII_MODE_MASK = BIT(3),
17424ca69a29SDavid Wu 		RK3576_GMAC_CLK_RGMII_MODE = 0x0,
17434ca69a29SDavid Wu 	};
17444ca69a29SDavid Wu 
17454ca69a29SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
17464ca69a29SDavid Wu 	s_grf = syscon_get_first_range(ROCKCHIP_SYSCON_SDGMAC_GRF);
17474ca69a29SDavid Wu 
17484ca69a29SDavid Wu 	if (pdata->rx_delay < 0)
17494ca69a29SDavid Wu 		rx_enable = RK3576_GMAC_RXCLK_DLY_DISABLE;
17504ca69a29SDavid Wu 	else
17514ca69a29SDavid Wu 		rx_enable = RK3576_GMAC_RXCLK_DLY_ENABLE;
17524ca69a29SDavid Wu 
17534ca69a29SDavid Wu 	clk_mode = RK3576_GMAC_CLK_RGMII_MODE;
17544ca69a29SDavid Wu 	clk_mode_mask = RK3576_GMAC_CLK_RGMII_MODE_MASK;
17554ca69a29SDavid Wu 	tx_enable = RK3576_GMAC_TXCLK_DLY_ENABLE;
17564ca69a29SDavid Wu 
17574ca69a29SDavid Wu 	if (pdata->bus_id == 1) {
17584ca69a29SDavid Wu 		offset_con = &ioc->misc_con[4];
17594ca69a29SDavid Wu 		offset_con += 0x6000;
17604ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac1_con, clk_mode_mask, clk_mode);
17614ca69a29SDavid Wu 
17624ca69a29SDavid Wu 	} else {
17634ca69a29SDavid Wu 		offset_con = &ioc->misc_con[2];
17644ca69a29SDavid Wu 		offset_con += 0x6000;
17654ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac0_con, clk_mode_mask, clk_mode);
17664ca69a29SDavid Wu 	}
17674ca69a29SDavid Wu 
17684ca69a29SDavid Wu 	rk_setreg(offset_con, tx_enable | rx_enable);
17694ca69a29SDavid Wu 	rk_setreg(offset_con + 0x4, tx_enable | rx_enable);
17704ca69a29SDavid Wu 	rk_setreg(offset_con, DELAY_VALUE(RK3576, pdata->tx_delay, pdata->rx_delay));
17714ca69a29SDavid Wu 	rk_setreg(offset_con + 0X4, DELAY_VALUE(RK3576, pdata->tx_delay, pdata->rx_delay));
17724ca69a29SDavid Wu }
17734ca69a29SDavid Wu 
rk3588_set_to_rmii(struct gmac_rockchip_platdata * pdata)1774bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1775bf0e94d0SDavid Wu {
1776bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1777bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1778bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1779bf0e94d0SDavid Wu 
1780bf0e94d0SDavid Wu 	enum {
1781bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1782bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1783bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5),
1784bf0e94d0SDavid Wu 	};
1785bf0e94d0SDavid Wu 
1786bf0e94d0SDavid Wu 	enum {
1787bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0,
1788bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1789bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RMII_MODE = 0x1,
1790bf0e94d0SDavid Wu 	};
1791bf0e94d0SDavid Wu 
1792bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1793bf0e94d0SDavid Wu 
1794bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1795bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6;
1796bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1797bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5;
1798bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5;
1799bf0e94d0SDavid Wu 	} else {
1800bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII;
1801bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1802bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RMII_MODE;
1803bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK;
1804bf0e94d0SDavid Wu 	}
1805bf0e94d0SDavid Wu 
1806bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1807bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1808bf0e94d0SDavid Wu }
1809bf0e94d0SDavid Wu 
rk3588_set_to_rgmii(struct gmac_rockchip_platdata * pdata)1810bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1811bf0e94d0SDavid Wu {
1812bf0e94d0SDavid Wu 	unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask;
1813bf0e94d0SDavid Wu 	unsigned int intf_sel, intf_sel_mask;
1814bf0e94d0SDavid Wu 	unsigned int clk_mode, clk_mode_mask;
1815bf0e94d0SDavid Wu 	unsigned int rx_delay;
1816bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
1817bf0e94d0SDavid Wu 	struct rk3588_sys_grf *grf;
1818bf0e94d0SDavid Wu 	void *offset_con;
1819bf0e94d0SDavid Wu 
1820bf0e94d0SDavid Wu 	enum {
1821bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3,
1822bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3),
1823bf0e94d0SDavid Wu 		RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3),
1824bf0e94d0SDavid Wu 
1825bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3),
1826bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
1827bf0e94d0SDavid Wu 		RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3),
1828bf0e94d0SDavid Wu 
1829bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2),
1830bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
1831bf0e94d0SDavid Wu 		RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2),
1832bf0e94d0SDavid Wu 	};
1833bf0e94d0SDavid Wu 
1834bf0e94d0SDavid Wu 	enum {
1835bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
1836bf0e94d0SDavid Wu 		RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8),
1837bf0e94d0SDavid Wu 
1838bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
1839bf0e94d0SDavid Wu 		RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
1840bf0e94d0SDavid Wu 	};
1841bf0e94d0SDavid Wu 
1842bf0e94d0SDavid Wu 	enum {
1843bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0,
1844bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0),
1845bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_RGMII_MODE = 0x0,
1846bf0e94d0SDavid Wu 	};
1847bf0e94d0SDavid Wu 
1848bf0e94d0SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1849bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
1850bf0e94d0SDavid Wu 
1851bf0e94d0SDavid Wu 	if (pdata->rx_delay < 0) {
1852bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE;
1853bf0e94d0SDavid Wu 		rx_delay = 0;
1854bf0e94d0SDavid Wu 	} else {
1855bf0e94d0SDavid Wu 		rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE;
1856bf0e94d0SDavid Wu 		rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT;
1857bf0e94d0SDavid Wu 	}
1858bf0e94d0SDavid Wu 
1859bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
1860bf0e94d0SDavid Wu 		offset_con = &grf->soc_con9;
1861bf0e94d0SDavid Wu 		rx_enable = rx_delay << 2;
1862bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2;
1863bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2;
1864bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2;
1865bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6;
1866bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6;
1867bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5;
1868bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5;
1869bf0e94d0SDavid Wu 	} else {
1870bf0e94d0SDavid Wu 		offset_con = &grf->soc_con8;
1871bf0e94d0SDavid Wu 		rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK;
1872bf0e94d0SDavid Wu 		tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE;
1873bf0e94d0SDavid Wu 		tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK;
1874bf0e94d0SDavid Wu 		intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII;
1875bf0e94d0SDavid Wu 		intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK;
1876bf0e94d0SDavid Wu 		clk_mode = RK3588_GMAC_CLK_RGMII_MODE;
1877bf0e94d0SDavid Wu 		clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK;
1878bf0e94d0SDavid Wu 	}
1879bf0e94d0SDavid Wu 
1880bf0e94d0SDavid Wu 	rk_clrsetreg(offset_con,
1881bf0e94d0SDavid Wu 		     RK3588_CLK_TX_DL_CFG_GMAC_MASK |
1882bf0e94d0SDavid Wu 		     RK3588_CLK_RX_DL_CFG_GMAC_MASK,
1883c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) |
1884bf0e94d0SDavid Wu 		     rx_delay);
1885bf0e94d0SDavid Wu 
1886bf0e94d0SDavid Wu 	rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask,
1887bf0e94d0SDavid Wu 		     tx_enable | rx_enable);
1888bf0e94d0SDavid Wu 
1889bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel);
1890bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode);
1891bf0e94d0SDavid Wu }
1892bf0e94d0SDavid Wu 
rv1103b_set_to_rmii(struct gmac_rockchip_platdata * pdata)1893745dad46SDavid Wu static void rv1103b_set_to_rmii(struct gmac_rockchip_platdata *pdata)
1894745dad46SDavid Wu {
1895745dad46SDavid Wu 	struct rv1103b_grf *grf;
1896745dad46SDavid Wu 	enum {
1897745dad46SDavid Wu 		RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK = BIT(2),
1898745dad46SDavid Wu 		RV1103B_SYSGRF_GMAC_CLK_RMII_50M = BIT(2),
1899745dad46SDavid Wu 	};
1900745dad46SDavid Wu 
1901745dad46SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1902745dad46SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
1903745dad46SDavid Wu 		     RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK,
1904745dad46SDavid Wu 		     RV1103B_SYSGRF_GMAC_CLK_RMII_50M);
1905745dad46SDavid Wu };
1906745dad46SDavid Wu 
rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)190720bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
190820bef841SDavid Wu {
1909745dad46SDavid Wu 	#ifdef CONFIG_ROCKCHIP_RV1103B
1910745dad46SDavid Wu 		struct rv1103b_grf *grf;
1911745dad46SDavid Wu 	#else
191220bef841SDavid Wu 		struct rv1106_grf *grf;
1913745dad46SDavid Wu 	#endif
1914535678cdSDavid Wu 	unsigned char bgs[1] = {0};
1915535678cdSDavid Wu 
1916535678cdSDavid Wu 	enum {
1917535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
1918535678cdSDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
1919535678cdSDavid Wu 	};
192054f7ad44SDavid Wu 
192154f7ad44SDavid Wu 	enum {
192220bef841SDavid Wu 		RV1106_MACPHY_ENABLE_MASK = BIT(1),
192354f7ad44SDavid Wu 		RV1106_MACPHY_DISENABLE = BIT(1),
192454f7ad44SDavid Wu 		RV1106_MACPHY_ENABLE = 0,
192520bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
192620bef841SDavid Wu 		RV1106_MACPHY_XMII_SEL = BIT(6),
192720bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
192820bef841SDavid Wu 		RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
192920bef841SDavid Wu 		RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
193020bef841SDavid Wu 		RV1106_MACPHY_PHY_ID = BIT(11),
193120bef841SDavid Wu 	};
193220bef841SDavid Wu 
193320bef841SDavid Wu 	enum {
193420bef841SDavid Wu 		RV1106_MACPHY_BGS_MASK = GENMASK(3, 0),
193554f7ad44SDavid Wu 		RV1106_MACPHY_BGS = BIT(2),
193620bef841SDavid Wu 	};
193720bef841SDavid Wu 
1938535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
1939535678cdSDavid Wu 	struct udevice *dev;
1940535678cdSDavid Wu 	u32 regs[2] = {0};
1941535678cdSDavid Wu 	ofnode node;
1942535678cdSDavid Wu 	int ret = 0;
1943535678cdSDavid Wu 
1944535678cdSDavid Wu 	/* retrieve the device */
1945535678cdSDavid Wu 	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
1946535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1947535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_efuse),
1948535678cdSDavid Wu 						  &dev);
1949535678cdSDavid Wu 	else
1950535678cdSDavid Wu 		ret = uclass_get_device_by_driver(UCLASS_MISC,
1951535678cdSDavid Wu 						  DM_GET_DRIVER(rockchip_otp),
1952535678cdSDavid Wu 						  &dev);
1953535678cdSDavid Wu 	if (!ret) {
1954535678cdSDavid Wu 		node = dev_read_subnode(dev, "macphy-bgs");
1955535678cdSDavid Wu 		if (ofnode_valid(node)) {
1956535678cdSDavid Wu 			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
1957535678cdSDavid Wu 				/* read the bgs from the efuses */
1958535678cdSDavid Wu 				ret = misc_read(dev, regs[0], &bgs, 1);
1959535678cdSDavid Wu 				if (ret) {
1960535678cdSDavid Wu 					printf("read bgs from efuse/otp failed, ret=%d\n",
1961535678cdSDavid Wu 					       ret);
1962535678cdSDavid Wu 					bgs[0] = 0;
1963535678cdSDavid Wu 				}
1964535678cdSDavid Wu 			}
1965535678cdSDavid Wu 		}
1966535678cdSDavid Wu 	}
1967535678cdSDavid Wu #endif
1968535678cdSDavid Wu 
196920bef841SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
197020bef841SDavid Wu 
197120bef841SDavid Wu 	reset_assert(&pdata->phy_reset);
197220bef841SDavid Wu 	udelay(20);
197320bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con0,
197420bef841SDavid Wu 		     RV1106_MACPHY_ENABLE_MASK |
197520bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL_MASK |
197620bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_MASK |
197720bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID_MASK,
197820bef841SDavid Wu 		     RV1106_MACPHY_ENABLE |
197920bef841SDavid Wu 		     RV1106_MACPHY_XMII_SEL |
198020bef841SDavid Wu 		     RV1106_MACPHY_24M_CLK_SEL_24M |
198120bef841SDavid Wu 		     RV1106_MACPHY_PHY_ID);
198220bef841SDavid Wu 
198320bef841SDavid Wu 	rk_clrsetreg(&grf->macphy_con1,
198420bef841SDavid Wu 		     RV1106_MACPHY_BGS_MASK,
1985535678cdSDavid Wu 		     bgs[0]);
19868bafa3a1SDavid Wu 	udelay(20);
198720bef841SDavid Wu 	reset_deassert(&pdata->phy_reset);
198820bef841SDavid Wu 	udelay(30 * 1000);
198920bef841SDavid Wu }
199020bef841SDavid Wu 
rv1106_set_to_rmii(struct gmac_rockchip_platdata * pdata)19918bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata)
19928bafa3a1SDavid Wu {
19938bafa3a1SDavid Wu 	struct rv1106_grf *grf;
19948bafa3a1SDavid Wu 	enum {
19958bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0),
19968bafa3a1SDavid Wu 		RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0),
19978bafa3a1SDavid Wu 	};
19988bafa3a1SDavid Wu 
19998bafa3a1SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
20008bafa3a1SDavid Wu 	rk_clrsetreg(&grf->gmac_clk_con,
20018bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK,
20028bafa3a1SDavid Wu 		     RV1106_VOGRF_GMAC_CLK_RMII_MODE);
20038bafa3a1SDavid Wu };
20048bafa3a1SDavid Wu 
rv1126_set_to_rmii(struct gmac_rockchip_platdata * pdata)2005e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata)
2006e4e3f431SDavid Wu {
2007e4e3f431SDavid Wu 	struct rv1126_grf *grf;
2008e4e3f431SDavid Wu 
2009e4e3f431SDavid Wu 	enum {
2010e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
2011e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
2012e4e3f431SDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6),
2013e4e3f431SDavid Wu 	};
2014e4e3f431SDavid Wu 
2015e4e3f431SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2016e4e3f431SDavid Wu 
2017e4e3f431SDavid Wu 	rk_clrsetreg(&grf->mac_con0,
2018e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
2019e4e3f431SDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RMII);
2020e4e3f431SDavid Wu }
2021e4e3f431SDavid Wu 
rv1126_set_to_rgmii(struct gmac_rockchip_platdata * pdata)2022dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
2023dcfb333aSDavid Wu {
2024dcfb333aSDavid Wu 	struct rv1126_grf *grf;
2025dcfb333aSDavid Wu 
2026dcfb333aSDavid Wu 	enum {
2027dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4,
2028dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_MASK  = GENMASK(6, 4),
2029dcfb333aSDavid Wu 		RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
2030dcfb333aSDavid Wu 
2031dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3),
2032dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
2033dcfb333aSDavid Wu 		RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3),
2034dcfb333aSDavid Wu 
2035dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2),
2036dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0,
2037dcfb333aSDavid Wu 		RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2),
2038dcfb333aSDavid Wu 
2039dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1),
2040dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
2041dcfb333aSDavid Wu 		RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1),
2042dcfb333aSDavid Wu 
2043dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0),
2044dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0,
2045dcfb333aSDavid Wu 		RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0),
2046dcfb333aSDavid Wu 	};
2047dcfb333aSDavid Wu 	enum {
2048dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
2049dcfb333aSDavid Wu 		RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
2050dcfb333aSDavid Wu 
2051dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
2052dcfb333aSDavid Wu 		RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
2053dcfb333aSDavid Wu 	};
2054dcfb333aSDavid Wu 	enum {
2055dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
2056dcfb333aSDavid Wu 		RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
2057dcfb333aSDavid Wu 
2058dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
2059dcfb333aSDavid Wu 		RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
2060dcfb333aSDavid Wu 	};
2061dcfb333aSDavid Wu 
2062dcfb333aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2063dcfb333aSDavid Wu 
2064dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con0,
2065dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK |
2066dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK |
2067dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK |
2068dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK |
2069dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_MASK,
2070dcfb333aSDavid Wu 		     RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE |
2071dcfb333aSDavid Wu 		     RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE |
2072dcfb333aSDavid Wu 		     RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE |
2073dcfb333aSDavid Wu 		     RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE |
2074dcfb333aSDavid Wu 		     RV1126_GMAC_PHY_INTF_SEL_RGMII);
2075dcfb333aSDavid Wu 
2076dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con1,
2077dcfb333aSDavid Wu 		     RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK |
2078dcfb333aSDavid Wu 		     RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK,
2079c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) |
2080c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT));
2081dcfb333aSDavid Wu 
2082dcfb333aSDavid Wu 	rk_clrsetreg(&grf->mac_con2,
2083dcfb333aSDavid Wu 		     RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK |
2084dcfb333aSDavid Wu 		     RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK,
2085c5bdc99aSJianqun Xu 		     (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) |
2086c5bdc99aSJianqun Xu 		     (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT));
2087dcfb333aSDavid Wu }
2088*3b820b88SDavid Wu 
rv1126b_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata * pdata)2089*3b820b88SDavid Wu static void rv1126b_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
2090*3b820b88SDavid Wu {
2091*3b820b88SDavid Wu 	struct rv1126b_vi_grf_reg *grf;
2092*3b820b88SDavid Wu 	unsigned int value;
2093*3b820b88SDavid Wu 
2094*3b820b88SDavid Wu 	enum {
2095*3b820b88SDavid Wu 		RV1126B_MACPHY_PHY_ID_SHIFT = 5,
2096*3b820b88SDavid Wu 		RV1126B_MACPHY_PHY_ADDR_SHIFT = 0,
2097*3b820b88SDavid Wu 	};
2098*3b820b88SDavid Wu 
2099*3b820b88SDavid Wu 	enum {
2100*3b820b88SDavid Wu 		RV1126B_MACPHY_ENABLE_SHIFT = 31,
2101*3b820b88SDavid Wu 		RV1126B_MACPHY_PHY_REVISION_SHIFT = 6,
2102*3b820b88SDavid Wu 		RV1126B_MACPHY_PHY_MODEL_SHIFT = 0,
2103*3b820b88SDavid Wu 	};
2104*3b820b88SDavid Wu 
2105*3b820b88SDavid Wu 	enum {
2106*3b820b88SDavid Wu 		RV1126B_MACPHY_EXTCLK_SEL_INPUT = 0,
2107*3b820b88SDavid Wu 		RV1126B_MACPHY_EXTCLK_SEL_OUTPUT = (1 << 8),
2108*3b820b88SDavid Wu 		RV1126B_MACPHY_CLK_SEL_24M = 0,
2109*3b820b88SDavid Wu 		RV1126B_MACPHY_CLK_SEL_50M = (1 << 11),
2110*3b820b88SDavid Wu 	};
2111*3b820b88SDavid Wu 
2112*3b820b88SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2113*3b820b88SDavid Wu 
2114*3b820b88SDavid Wu 	writel(0, &grf->rkmacphy_grf_con1 + (0x50000 / 4));
2115*3b820b88SDavid Wu 	reset_assert(&pdata->phy_reset);
2116*3b820b88SDavid Wu 	udelay(20);
2117*3b820b88SDavid Wu 	value = RV1126B_MACPHY_CLK_SEL_24M;
2118*3b820b88SDavid Wu 	if (pdata->clock_input)
2119*3b820b88SDavid Wu 		value |= RV1126B_MACPHY_EXTCLK_SEL_INPUT;
2120*3b820b88SDavid Wu 	else
2121*3b820b88SDavid Wu 		value |= RV1126B_MACPHY_EXTCLK_SEL_OUTPUT;
2122*3b820b88SDavid Wu 	writel(value, &grf->rkmacphy_grf_con2 + (0x50000 / 4));
2123*3b820b88SDavid Wu 
2124*3b820b88SDavid Wu 	value = (0x200680 << RV1126B_MACPHY_PHY_ID_SHIFT) |
2125*3b820b88SDavid Wu 		(0x2 << RV1126B_MACPHY_PHY_ADDR_SHIFT);
2126*3b820b88SDavid Wu 	writel(value, &grf->rkmacphy_grf_con0 + (0x50000 / 4));
2127*3b820b88SDavid Wu 
2128*3b820b88SDavid Wu 	value = (0x10 << RV1126B_MACPHY_PHY_MODEL_SHIFT) |
2129*3b820b88SDavid Wu 		(0x1 << RV1126B_MACPHY_PHY_REVISION_SHIFT) |
2130*3b820b88SDavid Wu 		(0x1 << RV1126B_MACPHY_ENABLE_SHIFT);
2131*3b820b88SDavid Wu 	writel(value, &grf->rkmacphy_grf_con1 + (0x50000 / 4));
2132*3b820b88SDavid Wu 	udelay(100);
2133*3b820b88SDavid Wu 	reset_deassert(&pdata->phy_reset);
2134*3b820b88SDavid Wu }
2135*3b820b88SDavid Wu 
rv1126b_set_to_rmii(struct gmac_rockchip_platdata * pdata)2136*3b820b88SDavid Wu static void rv1126b_set_to_rmii(struct gmac_rockchip_platdata *pdata)
2137*3b820b88SDavid Wu {
2138*3b820b88SDavid Wu 	struct rv1126b_vi_grf_reg *grf;
2139*3b820b88SDavid Wu 
2140*3b820b88SDavid Wu 	enum {
2141*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RMII_MODE_MASK = BIT(3),
2142*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_RMII_MODE = BIT(3),
2143*3b820b88SDavid Wu 		RV1126B_GMAC_RK_MACPHY_ENABLE_MASK = BIT(15),
2144*3b820b88SDavid Wu 		RV1126B_GMAC_RK_MACPHY_ENABLE = BIT(15),
2145*3b820b88SDavid Wu 	};
2146*3b820b88SDavid Wu 
2147*3b820b88SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2148*3b820b88SDavid Wu 
2149*3b820b88SDavid Wu 	if (pdata->integrated_phy)
2150*3b820b88SDavid Wu 		rk_clrsetreg(&grf->gmac_grf_con0 + (0x50000 / 4),
2151*3b820b88SDavid Wu 			     RV1126B_GMAC_RK_MACPHY_ENABLE_MASK,
2152*3b820b88SDavid Wu 			     RV1126B_GMAC_RK_MACPHY_ENABLE);
2153*3b820b88SDavid Wu 
2154*3b820b88SDavid Wu 	rk_clrsetreg(&grf->gmac_grf_con0 + (0x50000 / 4),
2155*3b820b88SDavid Wu 		     RV1126B_GMAC_CLK_RMII_MODE_MASK,
2156*3b820b88SDavid Wu 		     RV1126B_GMAC_CLK_RMII_MODE);
2157*3b820b88SDavid Wu };
2158*3b820b88SDavid Wu 
rv1126b_set_to_rgmii(struct gmac_rockchip_platdata * pdata)2159*3b820b88SDavid Wu static void rv1126b_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
2160*3b820b88SDavid Wu {
2161*3b820b88SDavid Wu 	struct rv1126b_vi_grf_reg *grf;
2162*3b820b88SDavid Wu 	struct rv1126b_vccio5_ioc_reg *ioc0;
2163*3b820b88SDavid Wu 	struct rv1126b_vccio6_ioc_reg *ioc1;
2164*3b820b88SDavid Wu 	unsigned int rx_enable;
2165*3b820b88SDavid Wu 	unsigned int rx_delay;
2166*3b820b88SDavid Wu 
2167*3b820b88SDavid Wu 	enum {
2168*3b820b88SDavid Wu 		RV1126B_GMAC_RGMII_MODE_MASK = BIT(3),
2169*3b820b88SDavid Wu 		RV1126B_GMAC_RGMII_MODE = 0x0,
2170*3b820b88SDavid Wu 	};
2171*3b820b88SDavid Wu 
2172*3b820b88SDavid Wu 	enum {
2173*3b820b88SDavid Wu 		RV1126B_GMAC_TXCLK_DLY_ENA_MASK = BIT(0),
2174*3b820b88SDavid Wu 		RV1126B_GMAC_TXCLK_DLY_ENA_DISABLE = 0,
2175*3b820b88SDavid Wu 		RV1126B_GMAC_TXCLK_DLY_ENA_ENABLE = BIT(0),
2176*3b820b88SDavid Wu 
2177*3b820b88SDavid Wu 		RV1126B_GMAC_RXCLK_DLY_ENA_MASK = BIT(1),
2178*3b820b88SDavid Wu 		RV1126B_GMAC_RXCLK_DLY_ENA_DISABLE = 0,
2179*3b820b88SDavid Wu 		RV1126B_GMAC_RXCLK_DLY_ENA_ENABLE = BIT(1),
2180*3b820b88SDavid Wu 	};
2181*3b820b88SDavid Wu 
2182*3b820b88SDavid Wu 	enum {
2183*3b820b88SDavid Wu 		RV1126B_GMAC_RX_DL_CFG_SHIFT = 0x8,
2184*3b820b88SDavid Wu 		RV1126B_GMAC_RX_DL_CFG_MASK = GENMASK(15, 8),
2185*3b820b88SDavid Wu 
2186*3b820b88SDavid Wu 		RV1126B_GMAC_TX_DL_CFG_SHIFT = 0x0,
2187*3b820b88SDavid Wu 		RV1126B_GMAC_TX_DL_CFG_MASK = GENMASK(7, 0),
2188*3b820b88SDavid Wu 	};
2189*3b820b88SDavid Wu 
2190*3b820b88SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2191*3b820b88SDavid Wu 	ioc0 = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
2192*3b820b88SDavid Wu 	ioc1 = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
2193*3b820b88SDavid Wu 
2194*3b820b88SDavid Wu 	rk_clrsetreg(&grf->gmac_grf_con0 + (0x50000 / 4),
2195*3b820b88SDavid Wu 		     RV1126B_GMAC_RGMII_MODE_MASK,
2196*3b820b88SDavid Wu 		     RV1126B_GMAC_RGMII_MODE);
2197*3b820b88SDavid Wu 
2198*3b820b88SDavid Wu 	if (pdata->rx_delay < 0) {
2199*3b820b88SDavid Wu 		rx_enable = RV1126B_GMAC_RXCLK_DLY_ENA_DISABLE;
2200*3b820b88SDavid Wu 		rx_delay = 0;
2201*3b820b88SDavid Wu 	} else {
2202*3b820b88SDavid Wu 		rx_enable = RV1126B_GMAC_RXCLK_DLY_ENA_ENABLE;
2203*3b820b88SDavid Wu 		rx_delay = pdata->rx_delay << RV1126B_GMAC_RX_DL_CFG_SHIFT;
2204*3b820b88SDavid Wu 	}
2205*3b820b88SDavid Wu 
2206*3b820b88SDavid Wu 	rk_clrsetreg(&ioc1->grf_gmacio_m0_con1 + (0x38000 / 4),
2207*3b820b88SDavid Wu 		     RV1126B_GMAC_TXCLK_DLY_ENA_MASK |
2208*3b820b88SDavid Wu 		     RV1126B_GMAC_RXCLK_DLY_ENA_MASK,
2209*3b820b88SDavid Wu 		     rx_enable | RV1126B_GMAC_TXCLK_DLY_ENA_ENABLE);
2210*3b820b88SDavid Wu 
2211*3b820b88SDavid Wu 	rk_clrsetreg(&ioc0->grf_gmacio_m1_con1 + (0x30000 / 4),
2212*3b820b88SDavid Wu 		     RV1126B_GMAC_TXCLK_DLY_ENA_MASK |
2213*3b820b88SDavid Wu 		     RV1126B_GMAC_RXCLK_DLY_ENA_MASK,
2214*3b820b88SDavid Wu 		     rx_enable | RV1126B_GMAC_TXCLK_DLY_ENA_ENABLE);
2215*3b820b88SDavid Wu 
2216*3b820b88SDavid Wu 	rk_clrsetreg(&ioc1->grf_gmacio_m0_con0 + (0x38000 / 4),
2217*3b820b88SDavid Wu 		     RV1126B_GMAC_RX_DL_CFG_MASK |
2218*3b820b88SDavid Wu 		     RV1126B_GMAC_TX_DL_CFG_MASK,
2219*3b820b88SDavid Wu 		     (pdata->tx_delay << RV1126B_GMAC_TX_DL_CFG_SHIFT) |
2220*3b820b88SDavid Wu 		     rx_delay);
2221*3b820b88SDavid Wu 
2222*3b820b88SDavid Wu 	rk_clrsetreg(&ioc0->grf_gmacio_m1_con0 + (0x30000 / 4),
2223*3b820b88SDavid Wu 		     RV1126B_GMAC_RX_DL_CFG_MASK |
2224*3b820b88SDavid Wu 		     RV1126B_GMAC_TX_DL_CFG_MASK,
2225*3b820b88SDavid Wu 		     (pdata->tx_delay << RV1126B_GMAC_TX_DL_CFG_SHIFT) |
2226*3b820b88SDavid Wu 		     rx_delay);
2227*3b820b88SDavid Wu }
22286f0a52e9SDavid Wu #endif
22290a33ce65SDavid Wu 
2230bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
rk3506_set_clock_selection(struct gmac_rockchip_platdata * pdata)2231bcf26c57SDavid Wu static void rk3506_set_clock_selection(struct gmac_rockchip_platdata *pdata)
2232bcf26c57SDavid Wu {
2233bcf26c57SDavid Wu 	struct rk3506_grf_reg *grf;
2234bcf26c57SDavid Wu 	unsigned int val;
2235bcf26c57SDavid Wu 
2236bcf26c57SDavid Wu 	enum {
2237bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_SHIFT = 5,
2238bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_MASK = BIT(5),
2239bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_CRU = 0,
2240bcf26c57SDavid Wu 		RK3506_GMAC_CLK_SELET_IO = BIT(5),
2241bcf26c57SDavid Wu 	};
2242bcf26c57SDavid Wu 
2243bcf26c57SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2244bcf26c57SDavid Wu 
2245bcf26c57SDavid Wu 	val = pdata->clock_input ? RK3506_GMAC_CLK_SELET_IO :
2246bcf26c57SDavid Wu 				   RK3506_GMAC_CLK_SELET_CRU;
2247bcf26c57SDavid Wu 
2248bcf26c57SDavid Wu 	if (pdata->bus_id)
2249bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_SELET_MASK, val);
2250bcf26c57SDavid Wu 	else
2251bcf26c57SDavid Wu 		rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_SELET_MASK, val);
2252bcf26c57SDavid Wu }
2253bcf26c57SDavid Wu 
rk3528_set_clock_selection(struct gmac_rockchip_platdata * pdata)2254c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata)
2255c563400aSDavid Wu {
2256c563400aSDavid Wu 	struct rk3528_grf *grf;
2257c563400aSDavid Wu 	unsigned int val;
2258c563400aSDavid Wu 
2259c563400aSDavid Wu 	enum {
2260c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_SHIFT = 0x12,
2261c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_MASK = BIT(12),
2262c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_CRU = 0,
2263c563400aSDavid Wu 		RK3528_GMAC1_CLK_SELET_IO = BIT(12),
2264c563400aSDavid Wu 	};
2265c563400aSDavid Wu 
2266c563400aSDavid Wu 	if (!pdata->bus_id)
2267c563400aSDavid Wu 		return;
2268c563400aSDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2269c563400aSDavid Wu 
2270c563400aSDavid Wu 	val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO :
2271c563400aSDavid Wu 				   RK3528_GMAC1_CLK_SELET_CRU;
2272c563400aSDavid Wu 	rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val);
2273c563400aSDavid Wu }
2274c563400aSDavid Wu 
rk3562_set_clock_selection(struct gmac_rockchip_platdata * pdata)227583f30531SDavid Wu static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata)
227683f30531SDavid Wu {
227783f30531SDavid Wu 	struct rk3562_grf *grf;
227883f30531SDavid Wu 	struct rk3562_ioc *ioc;
227983f30531SDavid Wu 	unsigned int val;
228083f30531SDavid Wu 
228183f30531SDavid Wu 	enum {
228283f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_SHIFT = 0x9,
228383f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_MASK = BIT(9),
228483f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_CRU = 0,
228583f30531SDavid Wu 		RK3562_GMAC0_CLK_SELET_IO = BIT(9),
228683f30531SDavid Wu 	};
228783f30531SDavid Wu 
228883f30531SDavid Wu 	enum {
228983f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_SHIFT = 15,
229083f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_MASK = BIT(15),
229183f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_CRU = 0,
229283f30531SDavid Wu 		RK3562_GMAC1_CLK_SELET_IO = BIT(15),
229383f30531SDavid Wu 	};
229483f30531SDavid Wu 
229583f30531SDavid Wu 	enum {
229683f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2,
229783f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2),
229883f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0,
229983f30531SDavid Wu 		RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2),
230083f30531SDavid Wu 	};
230183f30531SDavid Wu 
230283f30531SDavid Wu 	enum {
230383f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3,
230483f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3),
230583f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0,
230683f30531SDavid Wu 		RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3),
230783f30531SDavid Wu 	};
230883f30531SDavid Wu 
230983f30531SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
231083f30531SDavid Wu 	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
231183f30531SDavid Wu 
231283f30531SDavid Wu 	if (!pdata->bus_id) {
231383f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO :
231483f30531SDavid Wu 					   RK3562_GMAC0_CLK_SELET_CRU;
231583f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val);
231683f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO :
231783f30531SDavid Wu 					   RK3562_GMAC0_IO_EXTCLK_SELET_CRU;
231883f30531SDavid Wu 		rk_clrsetreg(&ioc->mac1_io_con1,
231983f30531SDavid Wu 			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
232083f30531SDavid Wu 		rk_clrsetreg(&ioc->mac0_io_con1,
232183f30531SDavid Wu 			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
232283f30531SDavid Wu 
232383f30531SDavid Wu 	} else {
232483f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO :
232583f30531SDavid Wu 					   RK3562_GMAC1_CLK_SELET_CRU;
232683f30531SDavid Wu 		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val);
232783f30531SDavid Wu 		val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO :
232883f30531SDavid Wu 					   RK3562_GMAC1_IO_EXTCLK_SELET_CRU;
232983f30531SDavid Wu 		rk_clrsetreg(&ioc->mac1_io_con1,
233083f30531SDavid Wu 			     RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val);
233183f30531SDavid Wu 	}
233283f30531SDavid Wu }
233383f30531SDavid Wu 
rk3576_set_clock_selection(struct gmac_rockchip_platdata * pdata)23344ca69a29SDavid Wu static void rk3576_set_clock_selection(struct gmac_rockchip_platdata *pdata)
23354ca69a29SDavid Wu {
23364ca69a29SDavid Wu 	struct rk3576_sdgmac_grf_reg *s_grf;
23374ca69a29SDavid Wu 	unsigned int val, mask;
23384ca69a29SDavid Wu 
23394ca69a29SDavid Wu 	enum {
23404ca69a29SDavid Wu 		RK3576_GMAC_CLK_SELET_MASK = BIT(7),
23414ca69a29SDavid Wu 		RK3576_GMAC_CLK_SELET_CRU = 0,
23424ca69a29SDavid Wu 		RK3576_GMAC_CLK_SELET_IO = BIT(7),
23434ca69a29SDavid Wu 	};
23444ca69a29SDavid Wu 
23454ca69a29SDavid Wu 	s_grf = syscon_get_first_range(ROCKCHIP_SYSCON_SDGMAC_GRF);
23464ca69a29SDavid Wu 	val = pdata->clock_input ? RK3576_GMAC_CLK_SELET_IO :
23474ca69a29SDavid Wu 				   RK3576_GMAC_CLK_SELET_CRU;
23484ca69a29SDavid Wu 
23494ca69a29SDavid Wu 	mask = RK3576_GMAC_CLK_SELET_MASK;
23504ca69a29SDavid Wu 
23514ca69a29SDavid Wu 	if (pdata->bus_id == 1)
23524ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac1_con, mask, val);
23534ca69a29SDavid Wu 	else
23544ca69a29SDavid Wu 		rk_clrsetreg(&s_grf->gmac0_con, mask, val);
23554ca69a29SDavid Wu }
23564ca69a29SDavid Wu 
rk3588_set_clock_selection(struct gmac_rockchip_platdata * pdata)2357bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
2358bf0e94d0SDavid Wu {
2359bf0e94d0SDavid Wu 	struct rk3588_php_grf *php_grf;
2360bf0e94d0SDavid Wu 	unsigned int val, mask;
2361bf0e94d0SDavid Wu 
2362bf0e94d0SDavid Wu 	enum {
2363bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_SHIFT = 0x4,
2364bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_MASK = BIT(4),
2365bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_CRU = BIT(4),
2366bf0e94d0SDavid Wu 		RK3588_GMAC_CLK_SELET_IO = 0,
2367bf0e94d0SDavid Wu 	};
2368bf0e94d0SDavid Wu 
2369bf0e94d0SDavid Wu 	php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF);
2370bf0e94d0SDavid Wu 	val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO :
2371bf0e94d0SDavid Wu 				   RK3588_GMAC_CLK_SELET_CRU;
2372bf0e94d0SDavid Wu 	mask = RK3588_GMAC_CLK_SELET_MASK;
2373bf0e94d0SDavid Wu 
2374bf0e94d0SDavid Wu 	if (pdata->bus_id == 1) {
2375bf0e94d0SDavid Wu 		val <<= 5;
2376bf0e94d0SDavid Wu 		mask <<= 5;
2377bf0e94d0SDavid Wu 	}
2378bf0e94d0SDavid Wu 
2379bf0e94d0SDavid Wu 	rk_clrsetreg(&php_grf->clk_con1, mask, val);
2380bf0e94d0SDavid Wu }
2381*3b820b88SDavid Wu 
rv1126b_set_clock_selection(struct gmac_rockchip_platdata * pdata)2382*3b820b88SDavid Wu static void rv1126b_set_clock_selection(struct gmac_rockchip_platdata *pdata)
2383*3b820b88SDavid Wu {
2384*3b820b88SDavid Wu 	struct rv1126b_vi_grf_reg *grf;
2385*3b820b88SDavid Wu 	unsigned int val;
2386*3b820b88SDavid Wu 
2387*3b820b88SDavid Wu 	enum {
2388*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_SELET_MASK = BIT(7),
2389*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_SELET_CRU = 0,
2390*3b820b88SDavid Wu 		RV1126B_GMAC_CLK_SELET_IO = BIT(7),
2391*3b820b88SDavid Wu 	};
2392*3b820b88SDavid Wu 
2393*3b820b88SDavid Wu 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2394*3b820b88SDavid Wu 	val = pdata->clock_input ? RV1126B_GMAC_CLK_SELET_IO :
2395*3b820b88SDavid Wu 				   RV1126B_GMAC_CLK_SELET_CRU;
2396*3b820b88SDavid Wu 
2397*3b820b88SDavid Wu 	rk_clrsetreg(&grf->gmac_grf_con0 + (0x50000 / 4), RV1126B_GMAC_CLK_SELET_MASK, val);
2398*3b820b88SDavid Wu }
2399bf0e94d0SDavid Wu #endif
2400bf0e94d0SDavid Wu 
gmac_rockchip_probe(struct udevice * dev)24010125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
24020125bcf0SSjoerd Simons {
24030125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
24041f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
24051f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
24066f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
24076f0a52e9SDavid Wu 	struct eqos_config *config;
24086f0a52e9SDavid Wu #else
24096f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
24106f0a52e9SDavid Wu #endif
24116f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
24120125bcf0SSjoerd Simons 	struct clk clk;
24130a33ce65SDavid Wu 	ulong rate;
24140125bcf0SSjoerd Simons 	int ret;
24150125bcf0SSjoerd Simons 
24166f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
24176f0a52e9SDavid Wu 	eth_pdata = &pdata->eth_pdata;
24186f0a52e9SDavid Wu 	config = (struct eqos_config *)&ops->config;
2419befcb627SDavid Wu 	memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config));
24206f0a52e9SDavid Wu 	eth_pdata->phy_interface = config->ops->eqos_get_interface(dev);
24216f0a52e9SDavid Wu #else
24226f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
24236f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
24246f0a52e9SDavid Wu #endif
242533a014bdSDavid Wu 	pdata->bus_id = dev->seq;
242654f7ad44SDavid Wu 
2427cadc8d74SKever Yang 	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
2428cadc8d74SKever Yang 	ret = clk_set_defaults(dev);
2429cadc8d74SKever Yang 	if (ret)
2430cadc8d74SKever Yang 		debug("%s clk_set_defaults failed %d\n", __func__, ret);
2431cadc8d74SKever Yang 
24320125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
24330125bcf0SSjoerd Simons 	if (ret)
2434745dad46SDavid Wu 		debug("%s clk_get_by_index failed %d\n", __func__, ret);
24350125bcf0SSjoerd Simons 
2436491f3bfbSDavid Wu 	pdata->phy_interface = eth_pdata->phy_interface;
2437491f3bfbSDavid Wu 
2438bf0e94d0SDavid Wu 	if (ops->set_clock_selection)
2439bf0e94d0SDavid Wu 		ops->set_clock_selection(pdata);
2440bf0e94d0SDavid Wu 
2441491f3bfbSDavid Wu 	if (pdata->integrated_phy && ops->integrated_phy_powerup)
2442491f3bfbSDavid Wu 		ops->integrated_phy_powerup(pdata);
2443491f3bfbSDavid Wu 
24440a33ce65SDavid Wu 	switch (eth_pdata->phy_interface) {
24450a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RGMII:
2446bf0e94d0SDavid Wu 	case PHY_INTERFACE_MODE_RGMII_RXID:
24470a33ce65SDavid Wu 		/*
24480a33ce65SDavid Wu 		 * If the gmac clock is from internal pll, need to set and
24490a33ce65SDavid Wu 		 * check the return value for gmac clock at RGMII mode. If
24500a33ce65SDavid Wu 		 * the gmac clock is from external source, the clock rate
24510a33ce65SDavid Wu 		 * is not set, because of it is bypassed.
24520a33ce65SDavid Wu 		 */
24530a33ce65SDavid Wu 		if (!pdata->clock_input) {
2454745dad46SDavid Wu 			if (clk.id) {
24550a33ce65SDavid Wu 				rate = clk_set_rate(&clk, 125000000);
24560a33ce65SDavid Wu 				if (rate != 125000000)
24570a33ce65SDavid Wu 					return -EINVAL;
24580a33ce65SDavid Wu 			}
2459745dad46SDavid Wu 		}
24600125bcf0SSjoerd Simons 
2461bf0e94d0SDavid Wu 		if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID)
2462bf0e94d0SDavid Wu 			pdata->rx_delay = -1;
2463bf0e94d0SDavid Wu 
24640125bcf0SSjoerd Simons 		/* Set to RGMII mode */
24650a33ce65SDavid Wu 		if (ops->set_to_rgmii)
24661f08aa1cSPhilipp Tomsich 			ops->set_to_rgmii(pdata);
24670a33ce65SDavid Wu 		else
24680a33ce65SDavid Wu 			return -EPERM;
24690a33ce65SDavid Wu 
24700a33ce65SDavid Wu 		break;
24710a33ce65SDavid Wu 	case PHY_INTERFACE_MODE_RMII:
24720a33ce65SDavid Wu 		/* The commet is the same as RGMII mode */
24730a33ce65SDavid Wu 		if (!pdata->clock_input) {
2474745dad46SDavid Wu 			if (clk.id) {
24750a33ce65SDavid Wu 				rate = clk_set_rate(&clk, 50000000);
24760a33ce65SDavid Wu 				if (rate != 50000000)
24770a33ce65SDavid Wu 					return -EINVAL;
24780a33ce65SDavid Wu 			}
2479745dad46SDavid Wu 		}
24800a33ce65SDavid Wu 
24810a33ce65SDavid Wu 		/* Set to RMII mode */
24820a33ce65SDavid Wu 		if (ops->set_to_rmii)
24830a33ce65SDavid Wu 			ops->set_to_rmii(pdata);
24840a33ce65SDavid Wu 
24850a33ce65SDavid Wu 		break;
24860a33ce65SDavid Wu 	default:
24870a33ce65SDavid Wu 		debug("NO interface defined!\n");
24880a33ce65SDavid Wu 		return -ENXIO;
24890a33ce65SDavid Wu 	}
24900125bcf0SSjoerd Simons 
24916f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
24926f0a52e9SDavid Wu 	return eqos_probe(dev);
24936f0a52e9SDavid Wu #else
24940125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
24956f0a52e9SDavid Wu #endif
24966f0a52e9SDavid Wu }
24976f0a52e9SDavid Wu 
gmac_rockchip_eth_write_hwaddr(struct udevice * dev)24986f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
24996f0a52e9SDavid Wu {
25006f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS)
25016f0a52e9SDavid Wu 	return eqos_write_hwaddr(dev);
25026f0a52e9SDavid Wu #else
25036f0a52e9SDavid Wu 	return designware_eth_write_hwaddr(dev);
25046f0a52e9SDavid Wu #endif
25056f0a52e9SDavid Wu }
25066f0a52e9SDavid Wu 
gmac_rockchip_eth_free_pkt(struct udevice * dev,uchar * packet,int length)25076f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet,
25086f0a52e9SDavid Wu 				      int length)
25096f0a52e9SDavid Wu {
25106f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
25116f0a52e9SDavid Wu 	return eqos_free_pkt(dev, packet, length);
25126f0a52e9SDavid Wu #else
25136f0a52e9SDavid Wu 	return designware_eth_free_pkt(dev, packet, length);
25146f0a52e9SDavid Wu #endif
25156f0a52e9SDavid Wu }
25166f0a52e9SDavid Wu 
gmac_rockchip_eth_send(struct udevice * dev,void * packet,int length)25176f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet,
25186f0a52e9SDavid Wu 				  int length)
25196f0a52e9SDavid Wu {
25206f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
25216f0a52e9SDavid Wu 	return eqos_send(dev, packet, length);
25226f0a52e9SDavid Wu #else
25236f0a52e9SDavid Wu 	return designware_eth_send(dev, packet, length);
25246f0a52e9SDavid Wu #endif
25256f0a52e9SDavid Wu }
25266f0a52e9SDavid Wu 
gmac_rockchip_eth_recv(struct udevice * dev,int flags,uchar ** packetp)25276f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags,
25286f0a52e9SDavid Wu 				  uchar **packetp)
25296f0a52e9SDavid Wu {
25306f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
25316f0a52e9SDavid Wu 	return eqos_recv(dev, flags, packetp);
25326f0a52e9SDavid Wu #else
25336f0a52e9SDavid Wu 	return designware_eth_recv(dev, flags, packetp);
25346f0a52e9SDavid Wu #endif
25350125bcf0SSjoerd Simons }
25360125bcf0SSjoerd Simons 
gmac_rockchip_eth_start(struct udevice * dev)25370125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
25380125bcf0SSjoerd Simons {
25396f0a52e9SDavid Wu 	struct rockchip_eth_dev *priv = dev_get_priv(dev);
25401f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
25411f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
25426f0a52e9SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
2543491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS
25446f0a52e9SDavid Wu 	struct dw_eth_pdata *dw_pdata;
25456f0a52e9SDavid Wu 	struct eth_pdata *eth_pdata;
25466f0a52e9SDavid Wu #endif
25470125bcf0SSjoerd Simons 	int ret;
25480125bcf0SSjoerd Simons 
25496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
25506f0a52e9SDavid Wu 	ret = eqos_init(dev);
25516f0a52e9SDavid Wu #else
25526f0a52e9SDavid Wu 	dw_pdata = &pdata->dw_eth_pdata;
25536f0a52e9SDavid Wu 	eth_pdata = &dw_pdata->eth_pdata;
25546f0a52e9SDavid Wu 	ret = designware_eth_init((struct dw_eth_dev *)priv,
25556f0a52e9SDavid Wu 				  eth_pdata->enetaddr);
25566f0a52e9SDavid Wu #endif
25570125bcf0SSjoerd Simons 	if (ret)
25580125bcf0SSjoerd Simons 		return ret;
2559491f3bfbSDavid Wu 	ret = ops->fix_mac_speed(pdata, priv);
25600125bcf0SSjoerd Simons 	if (ret)
25610125bcf0SSjoerd Simons 		return ret;
25626f0a52e9SDavid Wu 
25636f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
25646f0a52e9SDavid Wu 	eqos_enable(dev);
25656f0a52e9SDavid Wu #else
25666f0a52e9SDavid Wu 	ret = designware_eth_enable((struct dw_eth_dev *)priv);
25670125bcf0SSjoerd Simons 	if (ret)
25680125bcf0SSjoerd Simons 		return ret;
25696f0a52e9SDavid Wu #endif
25700125bcf0SSjoerd Simons 
25710125bcf0SSjoerd Simons 	return 0;
25720125bcf0SSjoerd Simons }
25730125bcf0SSjoerd Simons 
gmac_rockchip_eth_stop(struct udevice * dev)25746f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev)
25756f0a52e9SDavid Wu {
25766f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS
25776f0a52e9SDavid Wu 	eqos_stop(dev);
25786f0a52e9SDavid Wu #else
25796f0a52e9SDavid Wu 	designware_eth_stop(dev);
25806f0a52e9SDavid Wu #endif
25816f0a52e9SDavid Wu }
25826f0a52e9SDavid Wu 
25830125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
25840125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
25856f0a52e9SDavid Wu 	.send			= gmac_rockchip_eth_send,
25866f0a52e9SDavid Wu 	.recv			= gmac_rockchip_eth_recv,
25876f0a52e9SDavid Wu 	.free_pkt		= gmac_rockchip_eth_free_pkt,
25886f0a52e9SDavid Wu 	.stop			= gmac_rockchip_eth_stop,
25896f0a52e9SDavid Wu 	.write_hwaddr		= gmac_rockchip_eth_write_hwaddr,
25900125bcf0SSjoerd Simons };
25910125bcf0SSjoerd Simons 
25926f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
259318ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = {
259418ae91c8SDavid Wu 	.fix_mac_speed = px30_gmac_fix_mac_speed,
259518ae91c8SDavid Wu 	.set_to_rmii = px30_gmac_set_to_rmii,
259618ae91c8SDavid Wu };
259718ae91c8SDavid Wu 
2598ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = {
2599ff86648dSDavid Wu 	.fix_mac_speed = rk1808_gmac_fix_mac_speed,
2600ff86648dSDavid Wu 	.set_to_rgmii = rk1808_gmac_set_to_rgmii,
2601ff86648dSDavid Wu };
2602ff86648dSDavid Wu 
2603af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = {
2604af166ffaSDavid Wu 	.fix_mac_speed = rk3228_gmac_fix_mac_speed,
2605491f3bfbSDavid Wu 	.set_to_rmii = rk3228_gmac_set_to_rmii,
2606af166ffaSDavid Wu 	.set_to_rgmii = rk3228_gmac_set_to_rgmii,
2607491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup,
2608af166ffaSDavid Wu };
2609af166ffaSDavid Wu 
26101f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
26111f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
26121f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
26131f08aa1cSPhilipp Tomsich };
26141f08aa1cSPhilipp Tomsich 
261523adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = {
261623adb58fSDavid Wu 	.fix_mac_speed = rk3308_gmac_fix_mac_speed,
261723adb58fSDavid Wu 	.set_to_rmii = rk3308_gmac_set_to_rmii,
261823adb58fSDavid Wu };
261923adb58fSDavid Wu 
2620c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = {
2621c36b26c0SDavid Wu 	.fix_mac_speed = rk3328_gmac_fix_mac_speed,
2622491f3bfbSDavid Wu 	.set_to_rmii = rk3328_gmac_set_to_rmii,
2623c36b26c0SDavid Wu 	.set_to_rgmii = rk3328_gmac_set_to_rgmii,
2624491f3bfbSDavid Wu 	.integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup,
2625c36b26c0SDavid Wu };
2626c36b26c0SDavid Wu 
2627793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
2628793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
2629793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
2630793f2fd2SPhilipp Tomsich };
2631793f2fd2SPhilipp Tomsich 
26321f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
26331f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
26341f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
26351f08aa1cSPhilipp Tomsich };
26361f08aa1cSPhilipp Tomsich 
26370a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = {
26380a33ce65SDavid Wu 	.fix_mac_speed = rv1108_set_rmii_speed,
26390a33ce65SDavid Wu 	.set_to_rmii = rv1108_gmac_set_to_rmii,
26400a33ce65SDavid Wu };
2641dcfb333aSDavid Wu #else
2642bcf26c57SDavid Wu const struct rk_gmac_ops rk3506_gmac_ops = {
2643bcf26c57SDavid Wu 	.fix_mac_speed = rk3506_set_rmii_speed,
2644bcf26c57SDavid Wu 	.set_to_rmii = rk3506_set_to_rmii,
2645bcf26c57SDavid Wu 	.set_clock_selection = rk3506_set_clock_selection,
2646bcf26c57SDavid Wu };
2647bcf26c57SDavid Wu 
2648c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = {
2649c563400aSDavid Wu 	.fix_mac_speed = rk3528_set_rgmii_speed,
2650c563400aSDavid Wu 	.set_to_rgmii = rk3528_set_to_rgmii,
2651c563400aSDavid Wu 	.set_to_rmii = rk3528_set_to_rmii,
2652c563400aSDavid Wu 	.set_clock_selection = rk3528_set_clock_selection,
2653c563400aSDavid Wu 	.integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup,
2654c563400aSDavid Wu };
2655c563400aSDavid Wu 
265683f30531SDavid Wu const struct rk_gmac_ops rk3562_gmac_ops = {
265783f30531SDavid Wu 	.fix_mac_speed = rk3562_set_gmac_speed,
265883f30531SDavid Wu 	.set_to_rgmii = rk3562_set_to_rgmii,
265983f30531SDavid Wu 	.set_to_rmii = rk3562_set_to_rmii,
266083f30531SDavid Wu 	.set_clock_selection = rk3562_set_clock_selection,
266183f30531SDavid Wu };
266283f30531SDavid Wu 
266333a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = {
266433a014bdSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
266533a014bdSDavid Wu 	.set_to_rgmii = rk3568_set_to_rgmii,
266633a014bdSDavid Wu 	.set_to_rmii = rk3568_set_to_rmii,
266733a014bdSDavid Wu };
266833a014bdSDavid Wu 
26694ca69a29SDavid Wu const struct rk_gmac_ops rk3576_gmac_ops = {
26704ca69a29SDavid Wu 	.fix_mac_speed = rk3576_set_rgmii_speed,
26714ca69a29SDavid Wu 	.set_to_rgmii = rk3576_set_to_rgmii,
26724ca69a29SDavid Wu 	.set_to_rmii = rk3576_set_to_rmii,
26734ca69a29SDavid Wu 	.set_clock_selection = rk3576_set_clock_selection,
26744ca69a29SDavid Wu };
26754ca69a29SDavid Wu 
2676bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = {
2677bf0e94d0SDavid Wu 	.fix_mac_speed = rk3588_set_rgmii_speed,
2678bf0e94d0SDavid Wu 	.set_to_rgmii = rk3588_set_to_rgmii,
2679bf0e94d0SDavid Wu 	.set_to_rmii = rk3588_set_to_rmii,
2680bf0e94d0SDavid Wu 	.set_clock_selection = rk3588_set_clock_selection,
2681bf0e94d0SDavid Wu };
2682bf0e94d0SDavid Wu 
2683745dad46SDavid Wu const struct rk_gmac_ops rv1103b_gmac_ops = {
2684745dad46SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
2685745dad46SDavid Wu 	.set_to_rmii = rv1103b_set_to_rmii,
2686745dad46SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
2687745dad46SDavid Wu };
2688745dad46SDavid Wu 
268920bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = {
269020bef841SDavid Wu 	.fix_mac_speed = rv1106_set_rmii_speed,
26918bafa3a1SDavid Wu 	.set_to_rmii = rv1106_set_to_rmii,
269220bef841SDavid Wu 	.integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup,
269320bef841SDavid Wu };
269420bef841SDavid Wu 
2695dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = {
2696dcfb333aSDavid Wu 	.fix_mac_speed = rv1126_set_rgmii_speed,
2697dcfb333aSDavid Wu 	.set_to_rgmii = rv1126_set_to_rgmii,
2698e4e3f431SDavid Wu 	.set_to_rmii = rv1126_set_to_rmii,
2699dcfb333aSDavid Wu };
2700*3b820b88SDavid Wu 
2701*3b820b88SDavid Wu const struct rk_gmac_ops rv1126b_gmac_ops = {
2702*3b820b88SDavid Wu 	.fix_mac_speed = rv1126b_set_rgmii_speed,
2703*3b820b88SDavid Wu 	.set_to_rgmii = rv1126b_set_to_rgmii,
2704*3b820b88SDavid Wu 	.set_to_rmii = rv1126b_set_to_rmii,
2705*3b820b88SDavid Wu 	.set_clock_selection = rv1126b_set_clock_selection,
2706*3b820b88SDavid Wu 	.integrated_phy_powerup = rv1126b_gmac_integrated_phy_powerup,
2707*3b820b88SDavid Wu };
27086f0a52e9SDavid Wu #endif
27090a33ce65SDavid Wu 
27100125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
27116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS
271284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30
271318ae91c8SDavid Wu 	{ .compatible = "rockchip,px30-gmac",
271418ae91c8SDavid Wu 	  .data = (ulong)&px30_gmac_ops },
271584e90485SDavid Wu #endif
271684e90485SDavid Wu 
271784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808
2718ff86648dSDavid Wu 	{ .compatible = "rockchip,rk1808-gmac",
2719ff86648dSDavid Wu 	  .data = (ulong)&rk1808_gmac_ops },
272084e90485SDavid Wu #endif
272184e90485SDavid Wu 
272284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228
2723af166ffaSDavid Wu 	{ .compatible = "rockchip,rk3228-gmac",
2724af166ffaSDavid Wu 	  .data = (ulong)&rk3228_gmac_ops },
272584e90485SDavid Wu #endif
272684e90485SDavid Wu 
272784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288
27281f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
27291f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
273084e90485SDavid Wu #endif
273184e90485SDavid Wu 
273284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308
273323adb58fSDavid Wu 	{ .compatible = "rockchip,rk3308-mac",
273423adb58fSDavid Wu 	  .data = (ulong)&rk3308_gmac_ops },
273584e90485SDavid Wu #endif
273684e90485SDavid Wu 
273784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328
2738c36b26c0SDavid Wu 	{ .compatible = "rockchip,rk3328-gmac",
2739c36b26c0SDavid Wu 	  .data = (ulong)&rk3328_gmac_ops },
274084e90485SDavid Wu #endif
274184e90485SDavid Wu 
274284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368
2743793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
2744793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
274584e90485SDavid Wu #endif
274684e90485SDavid Wu 
274784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399
27481f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
27491f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
275084e90485SDavid Wu #endif
275184e90485SDavid Wu 
275284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108
27530a33ce65SDavid Wu 	{ .compatible = "rockchip,rv1108-gmac",
27540a33ce65SDavid Wu 	  .data = (ulong)&rv1108_gmac_ops },
275584e90485SDavid Wu #endif
2756dcfb333aSDavid Wu #else
2757bcf26c57SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3506
2758bcf26c57SDavid Wu 	{ .compatible = "rockchip,rk3506-gmac",
2759bcf26c57SDavid Wu 	  .data = (ulong)&rk3506_gmac_ops },
2760bcf26c57SDavid Wu #endif
2761bcf26c57SDavid Wu 
2762c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528
2763c563400aSDavid Wu 	{ .compatible = "rockchip,rk3528-gmac",
2764c563400aSDavid Wu 	  .data = (ulong)&rk3528_gmac_ops },
2765c563400aSDavid Wu #endif
2766c563400aSDavid Wu 
276783f30531SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3562
276883f30531SDavid Wu 	{ .compatible = "rockchip,rk3562-gmac",
276983f30531SDavid Wu 	  .data = (ulong)&rk3562_gmac_ops },
277083f30531SDavid Wu #endif
277183f30531SDavid Wu 
277284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568
277333a014bdSDavid Wu 	{ .compatible = "rockchip,rk3568-gmac",
277433a014bdSDavid Wu 	  .data = (ulong)&rk3568_gmac_ops },
277584e90485SDavid Wu #endif
277684e90485SDavid Wu 
27774ca69a29SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3576
27784ca69a29SDavid Wu 	{ .compatible = "rockchip,rk3576-gmac",
27794ca69a29SDavid Wu 	  .data = (ulong)&rk3576_gmac_ops },
27804ca69a29SDavid Wu #endif
27814ca69a29SDavid Wu 
2782bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588
2783bf0e94d0SDavid Wu 	{ .compatible = "rockchip,rk3588-gmac",
2784bf0e94d0SDavid Wu 	  .data = (ulong)&rk3588_gmac_ops },
2785bf0e94d0SDavid Wu #endif
2786bf0e94d0SDavid Wu 
2787745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B
2788745dad46SDavid Wu 	{ .compatible = "rockchip,rv1103b-gmac",
2789745dad46SDavid Wu 	  .data = (ulong)&rv1103b_gmac_ops },
2790745dad46SDavid Wu #endif
2791745dad46SDavid Wu 
279220bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106
279320bef841SDavid Wu 	{ .compatible = "rockchip,rv1106-gmac",
279420bef841SDavid Wu 	  .data = (ulong)&rv1106_gmac_ops },
279520bef841SDavid Wu #endif
279620bef841SDavid Wu 
279784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126
2798dcfb333aSDavid Wu 	{ .compatible = "rockchip,rv1126-gmac",
2799dcfb333aSDavid Wu 	  .data = (ulong)&rv1126_gmac_ops },
28006f0a52e9SDavid Wu #endif
2801*3b820b88SDavid Wu 
2802*3b820b88SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126B
2803*3b820b88SDavid Wu 	{ .compatible = "rockchip,rv1126b-gmac",
2804*3b820b88SDavid Wu 	  .data = (ulong)&rv1126b_gmac_ops },
2805*3b820b88SDavid Wu #endif
280684e90485SDavid Wu #endif
28070125bcf0SSjoerd Simons 	{ }
28080125bcf0SSjoerd Simons };
28090125bcf0SSjoerd Simons 
28100125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
28110125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
28120125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
28130125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
28140125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
28150125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
28160125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
28176f0a52e9SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_eth_dev),
28180125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
28190125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
28200125bcf0SSjoerd Simons };
2821