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