xref: /rk3399_rockchip-uboot/drivers/net/gmac_rockchip.c (revision 1eb9d0643a39b2b0034ca80cffba6d5a2da4f754)
10125bcf0SSjoerd Simons /*
20125bcf0SSjoerd Simons  * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
30125bcf0SSjoerd Simons  *
40125bcf0SSjoerd Simons  * SPDX-License-Identifier:	GPL-2.0+
50125bcf0SSjoerd Simons  *
60125bcf0SSjoerd Simons  * Rockchip GMAC ethernet IP driver for U-Boot
70125bcf0SSjoerd Simons  */
80125bcf0SSjoerd Simons 
90125bcf0SSjoerd Simons #include <common.h>
100125bcf0SSjoerd Simons #include <dm.h>
110125bcf0SSjoerd Simons #include <clk.h>
120125bcf0SSjoerd Simons #include <phy.h>
130125bcf0SSjoerd Simons #include <syscon.h>
140125bcf0SSjoerd Simons #include <asm/io.h>
150125bcf0SSjoerd Simons #include <asm/arch/periph.h>
160125bcf0SSjoerd Simons #include <asm/arch/clock.h>
171f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h>
180125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h>
19793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h>
201f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h>
210125bcf0SSjoerd Simons #include <dm/pinctrl.h>
220125bcf0SSjoerd Simons #include <dt-bindings/clock/rk3288-cru.h>
230125bcf0SSjoerd Simons #include "designware.h"
240125bcf0SSjoerd Simons 
250125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR;
260125bcf0SSjoerd Simons 
270125bcf0SSjoerd Simons /*
280125bcf0SSjoerd Simons  * Platform data for the gmac
290125bcf0SSjoerd Simons  *
300125bcf0SSjoerd Simons  * dw_eth_pdata: Required platform data for designware driver (must be first)
310125bcf0SSjoerd Simons  */
320125bcf0SSjoerd Simons struct gmac_rockchip_platdata {
330125bcf0SSjoerd Simons 	struct dw_eth_pdata dw_eth_pdata;
340125bcf0SSjoerd Simons 	int tx_delay;
350125bcf0SSjoerd Simons 	int rx_delay;
360125bcf0SSjoerd Simons };
370125bcf0SSjoerd Simons 
381f08aa1cSPhilipp Tomsich struct rk_gmac_ops {
391f08aa1cSPhilipp Tomsich 	int (*fix_mac_speed)(struct dw_eth_dev *priv);
401f08aa1cSPhilipp Tomsich 	void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata);
411f08aa1cSPhilipp Tomsich };
421f08aa1cSPhilipp Tomsich 
43*1eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay)
44*1eb9d064SDavid Wu {
45*1eb9d064SDavid Wu 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
46*1eb9d064SDavid Wu 	struct rk_gmac_ops *ops =
47*1eb9d064SDavid Wu 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
48*1eb9d064SDavid Wu 
49*1eb9d064SDavid Wu 	pdata->tx_delay = tx_delay;
50*1eb9d064SDavid Wu 	pdata->rx_delay = rx_delay;
51*1eb9d064SDavid Wu 
52*1eb9d064SDavid Wu 	ops->set_to_rgmii(pdata);
53*1eb9d064SDavid Wu }
541f08aa1cSPhilipp Tomsich 
550125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
560125bcf0SSjoerd Simons {
570125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
580125bcf0SSjoerd Simons 
591f08aa1cSPhilipp Tomsich 	/* Check the new naming-style first... */
607ad326a9SPhilipp Tomsich 	pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT);
617ad326a9SPhilipp Tomsich 	pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT);
621f08aa1cSPhilipp Tomsich 
631f08aa1cSPhilipp Tomsich 	/* ... and fall back to the old naming style or default, if necessary */
641f08aa1cSPhilipp Tomsich 	if (pdata->tx_delay == -ENOENT)
657ad326a9SPhilipp Tomsich 		pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30);
661f08aa1cSPhilipp Tomsich 	if (pdata->rx_delay == -ENOENT)
677ad326a9SPhilipp Tomsich 		pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10);
680125bcf0SSjoerd Simons 
690125bcf0SSjoerd Simons 	return designware_eth_ofdata_to_platdata(dev);
700125bcf0SSjoerd Simons }
710125bcf0SSjoerd Simons 
721f08aa1cSPhilipp Tomsich static int rk3288_gmac_fix_mac_speed(struct dw_eth_dev *priv)
730125bcf0SSjoerd Simons {
740125bcf0SSjoerd Simons 	struct rk3288_grf *grf;
750125bcf0SSjoerd Simons 	int clk;
760125bcf0SSjoerd Simons 
770125bcf0SSjoerd Simons 	switch (priv->phydev->speed) {
780125bcf0SSjoerd Simons 	case 10:
791f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_2_5M;
800125bcf0SSjoerd Simons 		break;
810125bcf0SSjoerd Simons 	case 100:
821f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_25M;
830125bcf0SSjoerd Simons 		break;
840125bcf0SSjoerd Simons 	case 1000:
851f08aa1cSPhilipp Tomsich 		clk = RK3288_GMAC_CLK_SEL_125M;
860125bcf0SSjoerd Simons 		break;
870125bcf0SSjoerd Simons 	default:
880125bcf0SSjoerd Simons 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
890125bcf0SSjoerd Simons 		return -EINVAL;
900125bcf0SSjoerd Simons 	}
910125bcf0SSjoerd Simons 
920125bcf0SSjoerd Simons 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
931f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk);
940125bcf0SSjoerd Simons 
950125bcf0SSjoerd Simons 	return 0;
960125bcf0SSjoerd Simons }
970125bcf0SSjoerd Simons 
98793f2fd2SPhilipp Tomsich static int rk3368_gmac_fix_mac_speed(struct dw_eth_dev *priv)
99793f2fd2SPhilipp Tomsich {
100793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
101793f2fd2SPhilipp Tomsich 	int clk;
102793f2fd2SPhilipp Tomsich 	enum {
103793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_2_5M = 2 << 4,
104793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_25M = 3 << 4,
105793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_125M = 0 << 4,
106793f2fd2SPhilipp Tomsich 		RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4),
107793f2fd2SPhilipp Tomsich 	};
108793f2fd2SPhilipp Tomsich 
109793f2fd2SPhilipp Tomsich 	switch (priv->phydev->speed) {
110793f2fd2SPhilipp Tomsich 	case 10:
111793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_2_5M;
112793f2fd2SPhilipp Tomsich 		break;
113793f2fd2SPhilipp Tomsich 	case 100:
114793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_25M;
115793f2fd2SPhilipp Tomsich 		break;
116793f2fd2SPhilipp Tomsich 	case 1000:
117793f2fd2SPhilipp Tomsich 		clk = RK3368_GMAC_CLK_SEL_125M;
118793f2fd2SPhilipp Tomsich 		break;
119793f2fd2SPhilipp Tomsich 	default:
120793f2fd2SPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
121793f2fd2SPhilipp Tomsich 		return -EINVAL;
122793f2fd2SPhilipp Tomsich 	}
123793f2fd2SPhilipp Tomsich 
124793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
125793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk);
126793f2fd2SPhilipp Tomsich 
127793f2fd2SPhilipp Tomsich 	return 0;
128793f2fd2SPhilipp Tomsich }
129793f2fd2SPhilipp Tomsich 
1301f08aa1cSPhilipp Tomsich static int rk3399_gmac_fix_mac_speed(struct dw_eth_dev *priv)
1311f08aa1cSPhilipp Tomsich {
1321f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
1331f08aa1cSPhilipp Tomsich 	int clk;
1341f08aa1cSPhilipp Tomsich 
1351f08aa1cSPhilipp Tomsich 	switch (priv->phydev->speed) {
1361f08aa1cSPhilipp Tomsich 	case 10:
1371f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_2_5M;
1381f08aa1cSPhilipp Tomsich 		break;
1391f08aa1cSPhilipp Tomsich 	case 100:
1401f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_25M;
1411f08aa1cSPhilipp Tomsich 		break;
1421f08aa1cSPhilipp Tomsich 	case 1000:
1431f08aa1cSPhilipp Tomsich 		clk = RK3399_GMAC_CLK_SEL_125M;
1441f08aa1cSPhilipp Tomsich 		break;
1451f08aa1cSPhilipp Tomsich 	default:
1461f08aa1cSPhilipp Tomsich 		debug("Unknown phy speed: %d\n", priv->phydev->speed);
1471f08aa1cSPhilipp Tomsich 		return -EINVAL;
1481f08aa1cSPhilipp Tomsich 	}
1491f08aa1cSPhilipp Tomsich 
1501f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1511f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk);
1521f08aa1cSPhilipp Tomsich 
1531f08aa1cSPhilipp Tomsich 	return 0;
1541f08aa1cSPhilipp Tomsich }
1551f08aa1cSPhilipp Tomsich 
1561f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
1571f08aa1cSPhilipp Tomsich {
1581f08aa1cSPhilipp Tomsich 	struct rk3288_grf *grf;
1591f08aa1cSPhilipp Tomsich 
1601f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1611f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con1,
1621f08aa1cSPhilipp Tomsich 		     RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK,
1631f08aa1cSPhilipp Tomsich 		     RK3288_GMAC_PHY_INTF_SEL_RGMII);
1641f08aa1cSPhilipp Tomsich 
1651f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con3,
1661f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_MASK |
1671f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_MASK |
1681f08aa1cSPhilipp Tomsich 		     RK3288_CLK_RX_DL_CFG_GMAC_MASK |
1691f08aa1cSPhilipp Tomsich 		     RK3288_CLK_TX_DL_CFG_GMAC_MASK,
1701f08aa1cSPhilipp Tomsich 		     RK3288_RXCLK_DLY_ENA_GMAC_ENABLE |
1711f08aa1cSPhilipp Tomsich 		     RK3288_TXCLK_DLY_ENA_GMAC_ENABLE |
1721f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT |
1731f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
1741f08aa1cSPhilipp Tomsich }
1751f08aa1cSPhilipp Tomsich 
176793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
177793f2fd2SPhilipp Tomsich {
178793f2fd2SPhilipp Tomsich 	struct rk3368_grf *grf;
179793f2fd2SPhilipp Tomsich 	enum {
180793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9,
181793f2fd2SPhilipp Tomsich 		RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9),
182793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE_MASK  = BIT(6),
183793f2fd2SPhilipp Tomsich 		RK3368_RMII_MODE       = BIT(6),
184793f2fd2SPhilipp Tomsich 	};
185793f2fd2SPhilipp Tomsich 	enum {
186793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15),
187793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
188793f2fd2SPhilipp Tomsich 		RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15),
189793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7),
190793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
191793f2fd2SPhilipp Tomsich 		RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7),
192793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8,
193793f2fd2SPhilipp Tomsich 		RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8),
194793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0,
195793f2fd2SPhilipp Tomsich 		RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0),
196793f2fd2SPhilipp Tomsich 	};
197793f2fd2SPhilipp Tomsich 
198793f2fd2SPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
199793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con15,
200793f2fd2SPhilipp Tomsich 		     RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK,
201793f2fd2SPhilipp Tomsich 		     RK3368_GMAC_PHY_INTF_SEL_RGMII);
202793f2fd2SPhilipp Tomsich 
203793f2fd2SPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con16,
204793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_MASK |
205793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_MASK |
206793f2fd2SPhilipp Tomsich 		     RK3368_CLK_RX_DL_CFG_GMAC_MASK |
207793f2fd2SPhilipp Tomsich 		     RK3368_CLK_TX_DL_CFG_GMAC_MASK,
208793f2fd2SPhilipp Tomsich 		     RK3368_RXCLK_DLY_ENA_GMAC_ENABLE |
209793f2fd2SPhilipp Tomsich 		     RK3368_TXCLK_DLY_ENA_GMAC_ENABLE |
210793f2fd2SPhilipp Tomsich 		     pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT |
211793f2fd2SPhilipp Tomsich 		     pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT);
212793f2fd2SPhilipp Tomsich }
213793f2fd2SPhilipp Tomsich 
2141f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
2151f08aa1cSPhilipp Tomsich {
2161f08aa1cSPhilipp Tomsich 	struct rk3399_grf_regs *grf;
2171f08aa1cSPhilipp Tomsich 
2181f08aa1cSPhilipp Tomsich 	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
2191f08aa1cSPhilipp Tomsich 
2201f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con5,
2211f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_MASK,
2221f08aa1cSPhilipp Tomsich 		     RK3399_GMAC_PHY_INTF_SEL_RGMII);
2231f08aa1cSPhilipp Tomsich 
2241f08aa1cSPhilipp Tomsich 	rk_clrsetreg(&grf->soc_con6,
2251f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_MASK |
2261f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_MASK |
2271f08aa1cSPhilipp Tomsich 		     RK3399_CLK_RX_DL_CFG_GMAC_MASK |
2281f08aa1cSPhilipp Tomsich 		     RK3399_CLK_TX_DL_CFG_GMAC_MASK,
2291f08aa1cSPhilipp Tomsich 		     RK3399_RXCLK_DLY_ENA_GMAC_ENABLE |
2301f08aa1cSPhilipp Tomsich 		     RK3399_TXCLK_DLY_ENA_GMAC_ENABLE |
2311f08aa1cSPhilipp Tomsich 		     pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT |
2321f08aa1cSPhilipp Tomsich 		     pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT);
2331f08aa1cSPhilipp Tomsich }
2341f08aa1cSPhilipp Tomsich 
2350125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev)
2360125bcf0SSjoerd Simons {
2370125bcf0SSjoerd Simons 	struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev);
2381f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
2391f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
2400125bcf0SSjoerd Simons 	struct clk clk;
2410125bcf0SSjoerd Simons 	int ret;
2420125bcf0SSjoerd Simons 
2430125bcf0SSjoerd Simons 	ret = clk_get_by_index(dev, 0, &clk);
2440125bcf0SSjoerd Simons 	if (ret)
2450125bcf0SSjoerd Simons 		return ret;
2460125bcf0SSjoerd Simons 
2470125bcf0SSjoerd Simons 	/* Since mac_clk is fed by an external clock we can use 0 here */
2480125bcf0SSjoerd Simons 	ret = clk_set_rate(&clk, 0);
2490125bcf0SSjoerd Simons 	if (ret)
2500125bcf0SSjoerd Simons 		return ret;
2510125bcf0SSjoerd Simons 
2520125bcf0SSjoerd Simons 	/* Set to RGMII mode */
2531f08aa1cSPhilipp Tomsich 	ops->set_to_rgmii(pdata);
2540125bcf0SSjoerd Simons 
2550125bcf0SSjoerd Simons 	return designware_eth_probe(dev);
2560125bcf0SSjoerd Simons }
2570125bcf0SSjoerd Simons 
2580125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev)
2590125bcf0SSjoerd Simons {
2600125bcf0SSjoerd Simons 	struct eth_pdata *pdata = dev_get_platdata(dev);
2610125bcf0SSjoerd Simons 	struct dw_eth_dev *priv = dev_get_priv(dev);
2621f08aa1cSPhilipp Tomsich 	struct rk_gmac_ops *ops =
2631f08aa1cSPhilipp Tomsich 		(struct rk_gmac_ops *)dev_get_driver_data(dev);
2640125bcf0SSjoerd Simons 	int ret;
2650125bcf0SSjoerd Simons 
2660125bcf0SSjoerd Simons 	ret = designware_eth_init(priv, pdata->enetaddr);
2670125bcf0SSjoerd Simons 	if (ret)
2680125bcf0SSjoerd Simons 		return ret;
2691f08aa1cSPhilipp Tomsich 	ret = ops->fix_mac_speed(priv);
2700125bcf0SSjoerd Simons 	if (ret)
2710125bcf0SSjoerd Simons 		return ret;
2720125bcf0SSjoerd Simons 	ret = designware_eth_enable(priv);
2730125bcf0SSjoerd Simons 	if (ret)
2740125bcf0SSjoerd Simons 		return ret;
2750125bcf0SSjoerd Simons 
2760125bcf0SSjoerd Simons 	return 0;
2770125bcf0SSjoerd Simons }
2780125bcf0SSjoerd Simons 
2790125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = {
2800125bcf0SSjoerd Simons 	.start			= gmac_rockchip_eth_start,
2810125bcf0SSjoerd Simons 	.send			= designware_eth_send,
2820125bcf0SSjoerd Simons 	.recv			= designware_eth_recv,
2830125bcf0SSjoerd Simons 	.free_pkt		= designware_eth_free_pkt,
2840125bcf0SSjoerd Simons 	.stop			= designware_eth_stop,
2850125bcf0SSjoerd Simons 	.write_hwaddr		= designware_eth_write_hwaddr,
2860125bcf0SSjoerd Simons };
2870125bcf0SSjoerd Simons 
2881f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = {
2891f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3288_gmac_fix_mac_speed,
2901f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3288_gmac_set_to_rgmii,
2911f08aa1cSPhilipp Tomsich };
2921f08aa1cSPhilipp Tomsich 
293793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = {
294793f2fd2SPhilipp Tomsich 	.fix_mac_speed = rk3368_gmac_fix_mac_speed,
295793f2fd2SPhilipp Tomsich 	.set_to_rgmii = rk3368_gmac_set_to_rgmii,
296793f2fd2SPhilipp Tomsich };
297793f2fd2SPhilipp Tomsich 
2981f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = {
2991f08aa1cSPhilipp Tomsich 	.fix_mac_speed = rk3399_gmac_fix_mac_speed,
3001f08aa1cSPhilipp Tomsich 	.set_to_rgmii = rk3399_gmac_set_to_rgmii,
3011f08aa1cSPhilipp Tomsich };
3021f08aa1cSPhilipp Tomsich 
3030125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = {
3041f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3288-gmac",
3051f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3288_gmac_ops },
306793f2fd2SPhilipp Tomsich 	{ .compatible = "rockchip,rk3368-gmac",
307793f2fd2SPhilipp Tomsich 	  .data = (ulong)&rk3368_gmac_ops },
3081f08aa1cSPhilipp Tomsich 	{ .compatible = "rockchip,rk3399-gmac",
3091f08aa1cSPhilipp Tomsich 	  .data = (ulong)&rk3399_gmac_ops },
3100125bcf0SSjoerd Simons 	{ }
3110125bcf0SSjoerd Simons };
3120125bcf0SSjoerd Simons 
3130125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = {
3140125bcf0SSjoerd Simons 	.name	= "gmac_rockchip",
3150125bcf0SSjoerd Simons 	.id	= UCLASS_ETH,
3160125bcf0SSjoerd Simons 	.of_match = rockchip_gmac_ids,
3170125bcf0SSjoerd Simons 	.ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata,
3180125bcf0SSjoerd Simons 	.probe	= gmac_rockchip_probe,
3190125bcf0SSjoerd Simons 	.ops	= &gmac_rockchip_eth_ops,
3200125bcf0SSjoerd Simons 	.priv_auto_alloc_size = sizeof(struct dw_eth_dev),
3210125bcf0SSjoerd Simons 	.platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata),
3220125bcf0SSjoerd Simons 	.flags = DM_FLAG_ALLOC_PRIV_DMA,
3230125bcf0SSjoerd Simons };
324