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> 186f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 19dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 206f0a52e9SDavid Wu #include "dwc_eth_qos.h" 216f0a52e9SDavid Wu #else 2218ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 23ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 24af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 250125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 2623adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 27c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 28793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 291f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 300a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 310125bcf0SSjoerd Simons #include "designware.h" 326f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 336f0a52e9SDavid Wu #endif 346f0a52e9SDavid Wu #include <dm/pinctrl.h> 350125bcf0SSjoerd Simons 360125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 370125bcf0SSjoerd Simons 386f0a52e9SDavid Wu struct rockchip_eth_dev { 396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 406f0a52e9SDavid Wu struct eqos_priv eqos; 416f0a52e9SDavid Wu #else 426f0a52e9SDavid Wu struct dw_eth_dev dw; 436f0a52e9SDavid Wu #endif 446f0a52e9SDavid Wu }; 456f0a52e9SDavid Wu 460125bcf0SSjoerd Simons /* 470125bcf0SSjoerd Simons * Platform data for the gmac 480125bcf0SSjoerd Simons * 490125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 500125bcf0SSjoerd Simons */ 510125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 526f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 530125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 546f0a52e9SDavid Wu #else 556f0a52e9SDavid Wu struct eth_pdata eth_pdata; 566f0a52e9SDavid Wu #endif 570a33ce65SDavid Wu bool clock_input; 580125bcf0SSjoerd Simons int tx_delay; 590125bcf0SSjoerd Simons int rx_delay; 600125bcf0SSjoerd Simons }; 610125bcf0SSjoerd Simons 621f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 636f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 646f0a52e9SDavid Wu const struct eqos_config config; 656f0a52e9SDavid Wu #endif 666f0a52e9SDavid Wu int (*fix_mac_speed)(struct rockchip_eth_dev *dev); 670a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 681f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 691f08aa1cSPhilipp Tomsich }; 701f08aa1cSPhilipp Tomsich 71*befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 72*befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 73*befcb627SDavid Wu .reg_access_always_ok = false, 74*befcb627SDavid Wu .mdio_wait = 10000, 75*befcb627SDavid Wu .swr_wait = 200, 76*befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 77*befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 78*befcb627SDavid Wu .ops = &eqos_rockchip_ops, 79*befcb627SDavid Wu }; 80*befcb627SDavid Wu #endif 81*befcb627SDavid Wu 821eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 831eb9d064SDavid Wu { 841eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 851eb9d064SDavid Wu struct rk_gmac_ops *ops = 861eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 871eb9d064SDavid Wu 881eb9d064SDavid Wu pdata->tx_delay = tx_delay; 891eb9d064SDavid Wu pdata->rx_delay = rx_delay; 901eb9d064SDavid Wu 911eb9d064SDavid Wu ops->set_to_rgmii(pdata); 921eb9d064SDavid Wu } 931f08aa1cSPhilipp Tomsich 940125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 950125bcf0SSjoerd Simons { 960125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 970a33ce65SDavid Wu const char *string; 980a33ce65SDavid Wu 990a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1000a33ce65SDavid Wu if (!strcmp(string, "input")) 1010a33ce65SDavid Wu pdata->clock_input = true; 1020a33ce65SDavid Wu else 1030a33ce65SDavid Wu pdata->clock_input = false; 1040125bcf0SSjoerd Simons 1051f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1067ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1077ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1081f08aa1cSPhilipp Tomsich 1091f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1101f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1117ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1121f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1137ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1140125bcf0SSjoerd Simons 1156f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1166f0a52e9SDavid Wu return 0; 1176f0a52e9SDavid Wu #else 1180125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1196f0a52e9SDavid Wu #endif 1200125bcf0SSjoerd Simons } 1210125bcf0SSjoerd Simons 1226f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 1236f0a52e9SDavid Wu static int px30_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 12418ae91c8SDavid Wu { 1256f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 12618ae91c8SDavid Wu struct px30_grf *grf; 12718ae91c8SDavid Wu struct clk clk_speed; 12818ae91c8SDavid Wu int speed, ret; 12918ae91c8SDavid Wu enum { 13018ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 13118ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 13218ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 13318ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 13418ae91c8SDavid Wu }; 13518ae91c8SDavid Wu 13618ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 13718ae91c8SDavid Wu &clk_speed); 13818ae91c8SDavid Wu if (ret) 13918ae91c8SDavid Wu return ret; 14018ae91c8SDavid Wu 14118ae91c8SDavid Wu switch (priv->phydev->speed) { 14218ae91c8SDavid Wu case 10: 14318ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 14418ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 14518ae91c8SDavid Wu if (ret) 14618ae91c8SDavid Wu return ret; 14718ae91c8SDavid Wu break; 14818ae91c8SDavid Wu case 100: 14918ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 15018ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 15118ae91c8SDavid Wu if (ret) 15218ae91c8SDavid Wu return ret; 15318ae91c8SDavid Wu break; 15418ae91c8SDavid Wu default: 15518ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 15618ae91c8SDavid Wu return -EINVAL; 15718ae91c8SDavid Wu } 15818ae91c8SDavid Wu 15918ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 16018ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 16118ae91c8SDavid Wu 16218ae91c8SDavid Wu return 0; 16318ae91c8SDavid Wu } 16418ae91c8SDavid Wu 1656f0a52e9SDavid Wu static int rk1808_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 166ff86648dSDavid Wu { 1676f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 168ff86648dSDavid Wu struct clk clk_speed; 169ff86648dSDavid Wu int ret; 170ff86648dSDavid Wu 171ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 172ff86648dSDavid Wu &clk_speed); 173ff86648dSDavid Wu if (ret) 174ff86648dSDavid Wu return ret; 175ff86648dSDavid Wu 176ff86648dSDavid Wu switch (priv->phydev->speed) { 177ff86648dSDavid Wu case 10: 178ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 179ff86648dSDavid Wu if (ret) 180ff86648dSDavid Wu return ret; 181ff86648dSDavid Wu break; 182ff86648dSDavid Wu case 100: 183ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 184ff86648dSDavid Wu if (ret) 185ff86648dSDavid Wu return ret; 186ff86648dSDavid Wu break; 187ff86648dSDavid Wu case 1000: 188ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 189ff86648dSDavid Wu if (ret) 190ff86648dSDavid Wu return ret; 191ff86648dSDavid Wu break; 192ff86648dSDavid Wu default: 193ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 194ff86648dSDavid Wu return -EINVAL; 195ff86648dSDavid Wu } 196ff86648dSDavid Wu 197ff86648dSDavid Wu return 0; 198ff86648dSDavid Wu } 199ff86648dSDavid Wu 2006f0a52e9SDavid Wu static int rk3228_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 201af166ffaSDavid Wu { 2026f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 203af166ffaSDavid Wu struct rk322x_grf *grf; 204af166ffaSDavid Wu int clk; 205af166ffaSDavid Wu enum { 206af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 207af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 208af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 209af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 210af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 211af166ffaSDavid Wu }; 212af166ffaSDavid Wu 213af166ffaSDavid Wu switch (priv->phydev->speed) { 214af166ffaSDavid Wu case 10: 215af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_2_5M; 216af166ffaSDavid Wu break; 217af166ffaSDavid Wu case 100: 218af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_25M; 219af166ffaSDavid Wu break; 220af166ffaSDavid Wu case 1000: 221af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 222af166ffaSDavid Wu break; 223af166ffaSDavid Wu default: 224af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 225af166ffaSDavid Wu return -EINVAL; 226af166ffaSDavid Wu } 227af166ffaSDavid Wu 228af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 229af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], RK3228_GMAC_CLK_SEL_MASK, clk); 230af166ffaSDavid Wu 231af166ffaSDavid Wu return 0; 232af166ffaSDavid Wu } 233af166ffaSDavid Wu 2346f0a52e9SDavid Wu static int rk3288_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 2350125bcf0SSjoerd Simons { 2366f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 2370125bcf0SSjoerd Simons struct rk3288_grf *grf; 2380125bcf0SSjoerd Simons int clk; 2390125bcf0SSjoerd Simons 2400125bcf0SSjoerd Simons switch (priv->phydev->speed) { 2410125bcf0SSjoerd Simons case 10: 2421f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 2430125bcf0SSjoerd Simons break; 2440125bcf0SSjoerd Simons case 100: 2451f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 2460125bcf0SSjoerd Simons break; 2470125bcf0SSjoerd Simons case 1000: 2481f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 2490125bcf0SSjoerd Simons break; 2500125bcf0SSjoerd Simons default: 2510125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 2520125bcf0SSjoerd Simons return -EINVAL; 2530125bcf0SSjoerd Simons } 2540125bcf0SSjoerd Simons 2550125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 2561f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 2570125bcf0SSjoerd Simons 2580125bcf0SSjoerd Simons return 0; 2590125bcf0SSjoerd Simons } 2600125bcf0SSjoerd Simons 2616f0a52e9SDavid Wu static int rk3308_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 26223adb58fSDavid Wu { 2636f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 26423adb58fSDavid Wu struct rk3308_grf *grf; 26523adb58fSDavid Wu struct clk clk_speed; 26623adb58fSDavid Wu int speed, ret; 26723adb58fSDavid Wu enum { 26823adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 26923adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 27023adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 27123adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 27223adb58fSDavid Wu }; 27323adb58fSDavid Wu 27423adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 27523adb58fSDavid Wu &clk_speed); 27623adb58fSDavid Wu if (ret) 27723adb58fSDavid Wu return ret; 27823adb58fSDavid Wu 27923adb58fSDavid Wu switch (priv->phydev->speed) { 28023adb58fSDavid Wu case 10: 28123adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 28223adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 28323adb58fSDavid Wu if (ret) 28423adb58fSDavid Wu return ret; 28523adb58fSDavid Wu break; 28623adb58fSDavid Wu case 100: 28723adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 28823adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 28923adb58fSDavid Wu if (ret) 29023adb58fSDavid Wu return ret; 29123adb58fSDavid Wu break; 29223adb58fSDavid Wu default: 29323adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 29423adb58fSDavid Wu return -EINVAL; 29523adb58fSDavid Wu } 29623adb58fSDavid Wu 29723adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 29823adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 29923adb58fSDavid Wu 30023adb58fSDavid Wu return 0; 30123adb58fSDavid Wu } 30223adb58fSDavid Wu 3036f0a52e9SDavid Wu static int rk3328_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 304c36b26c0SDavid Wu { 3056f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 306c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 307c36b26c0SDavid Wu int clk; 308c36b26c0SDavid Wu enum { 309c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 310c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 311c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 312c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 313c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 314c36b26c0SDavid Wu }; 315c36b26c0SDavid Wu 316c36b26c0SDavid Wu switch (priv->phydev->speed) { 317c36b26c0SDavid Wu case 10: 318c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_2_5M; 319c36b26c0SDavid Wu break; 320c36b26c0SDavid Wu case 100: 321c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_25M; 322c36b26c0SDavid Wu break; 323c36b26c0SDavid Wu case 1000: 324c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 325c36b26c0SDavid Wu break; 326c36b26c0SDavid Wu default: 327c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 328c36b26c0SDavid Wu return -EINVAL; 329c36b26c0SDavid Wu } 330c36b26c0SDavid Wu 331c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 332c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], RK3328_GMAC_CLK_SEL_MASK, clk); 333c36b26c0SDavid Wu 334c36b26c0SDavid Wu return 0; 335c36b26c0SDavid Wu } 336c36b26c0SDavid Wu 3376f0a52e9SDavid Wu static int rk3368_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 338793f2fd2SPhilipp Tomsich { 3396f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 340793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 341793f2fd2SPhilipp Tomsich int clk; 342793f2fd2SPhilipp Tomsich enum { 343793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 344793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 345793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 346793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 347793f2fd2SPhilipp Tomsich }; 348793f2fd2SPhilipp Tomsich 349793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 350793f2fd2SPhilipp Tomsich case 10: 351793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 352793f2fd2SPhilipp Tomsich break; 353793f2fd2SPhilipp Tomsich case 100: 354793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 355793f2fd2SPhilipp Tomsich break; 356793f2fd2SPhilipp Tomsich case 1000: 357793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 358793f2fd2SPhilipp Tomsich break; 359793f2fd2SPhilipp Tomsich default: 360793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 361793f2fd2SPhilipp Tomsich return -EINVAL; 362793f2fd2SPhilipp Tomsich } 363793f2fd2SPhilipp Tomsich 364793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 365793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 366793f2fd2SPhilipp Tomsich 367793f2fd2SPhilipp Tomsich return 0; 368793f2fd2SPhilipp Tomsich } 369793f2fd2SPhilipp Tomsich 3706f0a52e9SDavid Wu static int rk3399_gmac_fix_mac_speed(struct rockchip_eth_dev *dev) 3711f08aa1cSPhilipp Tomsich { 3726f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 3731f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 3741f08aa1cSPhilipp Tomsich int clk; 3751f08aa1cSPhilipp Tomsich 3761f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 3771f08aa1cSPhilipp Tomsich case 10: 3781f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 3791f08aa1cSPhilipp Tomsich break; 3801f08aa1cSPhilipp Tomsich case 100: 3811f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 3821f08aa1cSPhilipp Tomsich break; 3831f08aa1cSPhilipp Tomsich case 1000: 3841f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 3851f08aa1cSPhilipp Tomsich break; 3861f08aa1cSPhilipp Tomsich default: 3871f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 3881f08aa1cSPhilipp Tomsich return -EINVAL; 3891f08aa1cSPhilipp Tomsich } 3901f08aa1cSPhilipp Tomsich 3911f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3921f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 3931f08aa1cSPhilipp Tomsich 3941f08aa1cSPhilipp Tomsich return 0; 3951f08aa1cSPhilipp Tomsich } 3961f08aa1cSPhilipp Tomsich 3976f0a52e9SDavid Wu static int rv1108_set_rmii_speed(struct rockchip_eth_dev *dev) 3980a33ce65SDavid Wu { 3996f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4000a33ce65SDavid Wu struct rv1108_grf *grf; 4010a33ce65SDavid Wu int clk, speed; 4020a33ce65SDavid Wu enum { 4030a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4040a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4050a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4060a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4070a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4080a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4090a33ce65SDavid Wu }; 4100a33ce65SDavid Wu 4110a33ce65SDavid Wu switch (priv->phydev->speed) { 4120a33ce65SDavid Wu case 10: 4130a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 4140a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 4150a33ce65SDavid Wu break; 4160a33ce65SDavid Wu case 100: 4170a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 4180a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 4190a33ce65SDavid Wu break; 4200a33ce65SDavid Wu default: 4210a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 4220a33ce65SDavid Wu return -EINVAL; 4230a33ce65SDavid Wu } 4240a33ce65SDavid Wu 4250a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4260a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 4270a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 4280a33ce65SDavid Wu clk | speed); 4290a33ce65SDavid Wu 4300a33ce65SDavid Wu return 0; 4310a33ce65SDavid Wu } 432dcfb333aSDavid Wu #else 433dcfb333aSDavid Wu static int rv1126_set_rgmii_speed(struct rockchip_eth_dev *dev) 434dcfb333aSDavid Wu { 435dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 436dcfb333aSDavid Wu struct clk clk_speed; 437dcfb333aSDavid Wu int ret; 438dcfb333aSDavid Wu 439dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 440dcfb333aSDavid Wu &clk_speed); 441dcfb333aSDavid Wu if (ret) { 442dcfb333aSDavid Wu printf("%s~(ret=%d):\n", __func__, ret); 443dcfb333aSDavid Wu return ret; 444dcfb333aSDavid Wu } 445dcfb333aSDavid Wu 446dcfb333aSDavid Wu switch ( priv->phy->speed) { 447dcfb333aSDavid Wu case 10: 448dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 449dcfb333aSDavid Wu if (ret) 450dcfb333aSDavid Wu return ret; 451dcfb333aSDavid Wu break; 452dcfb333aSDavid Wu case 100: 453dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 454dcfb333aSDavid Wu if (ret) 455dcfb333aSDavid Wu return ret; 456dcfb333aSDavid Wu break; 457dcfb333aSDavid Wu case 1000: 458dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 459dcfb333aSDavid Wu if (ret) 460dcfb333aSDavid Wu return ret; 461dcfb333aSDavid Wu break; 462dcfb333aSDavid Wu default: 463dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 464dcfb333aSDavid Wu return -EINVAL; 465dcfb333aSDavid Wu } 466dcfb333aSDavid Wu 467dcfb333aSDavid Wu return 0; 468dcfb333aSDavid Wu } 4696f0a52e9SDavid Wu #endif 4700a33ce65SDavid Wu 4716f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 47218ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 47318ae91c8SDavid Wu { 47418ae91c8SDavid Wu struct px30_grf *grf; 47518ae91c8SDavid Wu enum { 47618ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 47718ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 47818ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 47918ae91c8SDavid Wu }; 48018ae91c8SDavid Wu 48118ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 48218ae91c8SDavid Wu 48318ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 48418ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 48518ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 48618ae91c8SDavid Wu } 48718ae91c8SDavid Wu 488ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 489ff86648dSDavid Wu { 490ff86648dSDavid Wu struct rk1808_grf *grf; 491ff86648dSDavid Wu enum { 492ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 493ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 494ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 495ff86648dSDavid Wu 496ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 497ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 498ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 499ff86648dSDavid Wu 500ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 501ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 502ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 503ff86648dSDavid Wu }; 504ff86648dSDavid Wu enum { 505ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 506ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 507ff86648dSDavid Wu 508ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 509ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 510ff86648dSDavid Wu }; 511ff86648dSDavid Wu 512ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 513ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 514ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 515ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 516ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 517ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 518ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 519ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 520ff86648dSDavid Wu 521ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 522ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 523ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 524ff86648dSDavid Wu pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT | 525ff86648dSDavid Wu pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT); 526ff86648dSDavid Wu } 527ff86648dSDavid Wu 528af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 529af166ffaSDavid Wu { 530af166ffaSDavid Wu struct rk322x_grf *grf; 531af166ffaSDavid Wu enum { 532af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 533af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 534af166ffaSDavid Wu 535af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 536af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 537af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 538af166ffaSDavid Wu 539af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 540af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 541af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 542af166ffaSDavid Wu 543af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 544af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 545af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 546af166ffaSDavid Wu }; 547af166ffaSDavid Wu enum { 548af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 549af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 550af166ffaSDavid Wu 551af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 552af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 553af166ffaSDavid Wu }; 554af166ffaSDavid Wu 555af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 556af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 557af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 558af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 559af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 560af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 561af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 562af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 563af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 564af166ffaSDavid Wu 565af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 566af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 567af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 568af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 569af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 570af166ffaSDavid Wu } 571af166ffaSDavid Wu 5721f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 5731f08aa1cSPhilipp Tomsich { 5741f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 5751f08aa1cSPhilipp Tomsich 5761f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5771f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 5781f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 5791f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 5801f08aa1cSPhilipp Tomsich 5811f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 5821f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 5831f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 5841f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 5851f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 5861f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 5871f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 5881f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 5891f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 5901f08aa1cSPhilipp Tomsich } 5911f08aa1cSPhilipp Tomsich 59223adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 59323adb58fSDavid Wu { 59423adb58fSDavid Wu struct rk3308_grf *grf; 59523adb58fSDavid Wu enum { 59623adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 59723adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 59823adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 59923adb58fSDavid Wu }; 60023adb58fSDavid Wu 60123adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 60223adb58fSDavid Wu 60323adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 60423adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 60523adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 60623adb58fSDavid Wu } 60723adb58fSDavid Wu 608c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 609c36b26c0SDavid Wu { 610c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 611c36b26c0SDavid Wu enum { 612c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 613c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 614c36b26c0SDavid Wu 615c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 616c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 617c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 618c36b26c0SDavid Wu 619c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 620c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 621c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 622c36b26c0SDavid Wu 623c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 624c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 625c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 626c36b26c0SDavid Wu }; 627c36b26c0SDavid Wu enum { 628c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 629c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 630c36b26c0SDavid Wu 631c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 632c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 633c36b26c0SDavid Wu }; 634c36b26c0SDavid Wu 635c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 636c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 637c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 638c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 639c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 640c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 641c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 642c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 643c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 644c36b26c0SDavid Wu 645c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 646c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 647c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 648c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 649c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 650c36b26c0SDavid Wu } 651c36b26c0SDavid Wu 652793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 653793f2fd2SPhilipp Tomsich { 654793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 655793f2fd2SPhilipp Tomsich enum { 656793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 657793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 658793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 659793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 660793f2fd2SPhilipp Tomsich }; 661793f2fd2SPhilipp Tomsich enum { 662793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 663793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 664793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 665793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 666793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 667793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 668793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 669793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 670793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 671793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 672793f2fd2SPhilipp Tomsich }; 673793f2fd2SPhilipp Tomsich 674793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 675793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 676793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 677793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 678793f2fd2SPhilipp Tomsich 679793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 680793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 681793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 682793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 683793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 684793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 685793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 686793f2fd2SPhilipp Tomsich pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT | 687793f2fd2SPhilipp Tomsich pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT); 688793f2fd2SPhilipp Tomsich } 689793f2fd2SPhilipp Tomsich 6901f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 6911f08aa1cSPhilipp Tomsich { 6921f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 6931f08aa1cSPhilipp Tomsich 6941f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 6951f08aa1cSPhilipp Tomsich 6961f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 6971f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 6981f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 6991f08aa1cSPhilipp Tomsich 7001f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 7011f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 7021f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 7031f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 7041f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 7051f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 7061f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 7071f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT | 7081f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT); 7091f08aa1cSPhilipp Tomsich } 7101f08aa1cSPhilipp Tomsich 7110a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 7120a33ce65SDavid Wu { 7130a33ce65SDavid Wu struct rv1108_grf *grf; 7140a33ce65SDavid Wu 7150a33ce65SDavid Wu enum { 7160a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 7170a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 7180a33ce65SDavid Wu }; 7190a33ce65SDavid Wu 7200a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 7210a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 7220a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 7230a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 7240a33ce65SDavid Wu } 725dcfb333aSDavid Wu #else 726e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 727e4e3f431SDavid Wu { 728e4e3f431SDavid Wu struct rv1126_grf *grf; 729e4e3f431SDavid Wu 730e4e3f431SDavid Wu enum { 731e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 732e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 733e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 734e4e3f431SDavid Wu }; 735e4e3f431SDavid Wu 736e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 737e4e3f431SDavid Wu 738e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 739e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 740e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 741e4e3f431SDavid Wu } 742e4e3f431SDavid Wu 743dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 744dcfb333aSDavid Wu { 745dcfb333aSDavid Wu struct rv1126_grf *grf; 746dcfb333aSDavid Wu 747dcfb333aSDavid Wu enum { 748dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 749dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 750dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 751dcfb333aSDavid Wu 752dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 753dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 754dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 755dcfb333aSDavid Wu 756dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 757dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 758dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 759dcfb333aSDavid Wu 760dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 761dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 762dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 763dcfb333aSDavid Wu 764dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 765dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 766dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 767dcfb333aSDavid Wu }; 768dcfb333aSDavid Wu enum { 769dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 770dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 771dcfb333aSDavid Wu 772dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 773dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 774dcfb333aSDavid Wu }; 775dcfb333aSDavid Wu enum { 776dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 777dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 778dcfb333aSDavid Wu 779dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 780dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 781dcfb333aSDavid Wu }; 782dcfb333aSDavid Wu 783dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 784dcfb333aSDavid Wu 785dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 786dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 787dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 788dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 789dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 790dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 791dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 792dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 793dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 794dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 795dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 796dcfb333aSDavid Wu 797dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 798dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 799dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 800dcfb333aSDavid Wu pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT | 801dcfb333aSDavid Wu pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT); 802dcfb333aSDavid Wu 803dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 804dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 805dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 806dcfb333aSDavid Wu pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT | 807dcfb333aSDavid Wu pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT); 808dcfb333aSDavid Wu } 8096f0a52e9SDavid Wu #endif 8100a33ce65SDavid Wu 8110125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 8120125bcf0SSjoerd Simons { 8130125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 8141f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 8151f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 8166f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 8176f0a52e9SDavid Wu struct eqos_config *config; 8186f0a52e9SDavid Wu #else 8196f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 8206f0a52e9SDavid Wu #endif 8216f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 8220125bcf0SSjoerd Simons struct clk clk; 8230a33ce65SDavid Wu ulong rate; 8240125bcf0SSjoerd Simons int ret; 8250125bcf0SSjoerd Simons 8266f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 8276f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 8286f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 829*befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 8306f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 8316f0a52e9SDavid Wu #else 8326f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 8336f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 8346f0a52e9SDavid Wu #endif 835cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 836cadc8d74SKever Yang ret = clk_set_defaults(dev); 837cadc8d74SKever Yang if (ret) 838cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 839cadc8d74SKever Yang 8400125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 8410125bcf0SSjoerd Simons if (ret) 8420125bcf0SSjoerd Simons return ret; 8430125bcf0SSjoerd Simons 8440a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 8450a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 8460a33ce65SDavid Wu /* 8470a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 8480a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 8490a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 8500a33ce65SDavid Wu * is not set, because of it is bypassed. 8510a33ce65SDavid Wu */ 8520a33ce65SDavid Wu if (!pdata->clock_input) { 8530a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 8540a33ce65SDavid Wu if (rate != 125000000) 8550a33ce65SDavid Wu return -EINVAL; 8560a33ce65SDavid Wu } 8570125bcf0SSjoerd Simons 8580125bcf0SSjoerd Simons /* Set to RGMII mode */ 8590a33ce65SDavid Wu if (ops->set_to_rgmii) 8601f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 8610a33ce65SDavid Wu else 8620a33ce65SDavid Wu return -EPERM; 8630a33ce65SDavid Wu 8640a33ce65SDavid Wu break; 8650a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 8660a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 8670a33ce65SDavid Wu if (!pdata->clock_input) { 8680a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 8690a33ce65SDavid Wu if (rate != 50000000) 8700a33ce65SDavid Wu return -EINVAL; 8710a33ce65SDavid Wu } 8720a33ce65SDavid Wu 8730a33ce65SDavid Wu /* Set to RMII mode */ 8740a33ce65SDavid Wu if (ops->set_to_rmii) 8750a33ce65SDavid Wu ops->set_to_rmii(pdata); 8760a33ce65SDavid Wu else 8770a33ce65SDavid Wu return -EPERM; 8780a33ce65SDavid Wu 8790a33ce65SDavid Wu break; 8800a33ce65SDavid Wu default: 8810a33ce65SDavid Wu debug("NO interface defined!\n"); 8820a33ce65SDavid Wu return -ENXIO; 8830a33ce65SDavid Wu } 8840125bcf0SSjoerd Simons 8856f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 8866f0a52e9SDavid Wu return eqos_probe(dev); 8876f0a52e9SDavid Wu #else 8880125bcf0SSjoerd Simons return designware_eth_probe(dev); 8896f0a52e9SDavid Wu #endif 8906f0a52e9SDavid Wu } 8916f0a52e9SDavid Wu 8926f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 8936f0a52e9SDavid Wu { 8946f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 8956f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 8966f0a52e9SDavid Wu #else 8976f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 8986f0a52e9SDavid Wu #endif 8996f0a52e9SDavid Wu } 9006f0a52e9SDavid Wu 9016f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 9026f0a52e9SDavid Wu int length) 9036f0a52e9SDavid Wu { 9046f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 9056f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 9066f0a52e9SDavid Wu #else 9076f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 9086f0a52e9SDavid Wu #endif 9096f0a52e9SDavid Wu } 9106f0a52e9SDavid Wu 9116f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 9126f0a52e9SDavid Wu int length) 9136f0a52e9SDavid Wu { 9146f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 9156f0a52e9SDavid Wu return eqos_send(dev, packet, length); 9166f0a52e9SDavid Wu #else 9176f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 9186f0a52e9SDavid Wu #endif 9196f0a52e9SDavid Wu } 9206f0a52e9SDavid Wu 9216f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 9226f0a52e9SDavid Wu uchar **packetp) 9236f0a52e9SDavid Wu { 9246f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 9256f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 9266f0a52e9SDavid Wu #else 9276f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 9286f0a52e9SDavid Wu #endif 9290125bcf0SSjoerd Simons } 9300125bcf0SSjoerd Simons 9310125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 9320125bcf0SSjoerd Simons { 9336f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 9341f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 9351f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 9366f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 9376f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 9386f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 9396f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 9406f0a52e9SDavid Wu #endif 9410125bcf0SSjoerd Simons int ret; 9420125bcf0SSjoerd Simons 9436f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 9446f0a52e9SDavid Wu ret = eqos_init(dev); 9456f0a52e9SDavid Wu #else 9466f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 9476f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 9486f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 9496f0a52e9SDavid Wu eth_pdata->enetaddr); 9506f0a52e9SDavid Wu #endif 9510125bcf0SSjoerd Simons if (ret) 9520125bcf0SSjoerd Simons return ret; 9531f08aa1cSPhilipp Tomsich ret = ops->fix_mac_speed(priv); 9540125bcf0SSjoerd Simons if (ret) 9550125bcf0SSjoerd Simons return ret; 9566f0a52e9SDavid Wu 9576f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 9586f0a52e9SDavid Wu eqos_enable(dev); 9596f0a52e9SDavid Wu #else 9606f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 9610125bcf0SSjoerd Simons if (ret) 9620125bcf0SSjoerd Simons return ret; 9636f0a52e9SDavid Wu #endif 9640125bcf0SSjoerd Simons 9650125bcf0SSjoerd Simons return 0; 9660125bcf0SSjoerd Simons } 9670125bcf0SSjoerd Simons 9686f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 9696f0a52e9SDavid Wu { 9706f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 9716f0a52e9SDavid Wu eqos_stop(dev); 9726f0a52e9SDavid Wu #else 9736f0a52e9SDavid Wu designware_eth_stop(dev); 9746f0a52e9SDavid Wu #endif 9756f0a52e9SDavid Wu } 9766f0a52e9SDavid Wu 9770125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 9780125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 9796f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 9806f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 9816f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 9826f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 9836f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 9840125bcf0SSjoerd Simons }; 9850125bcf0SSjoerd Simons 9866f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 98718ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 98818ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 98918ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 99018ae91c8SDavid Wu }; 99118ae91c8SDavid Wu 992ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 993ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 994ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 995ff86648dSDavid Wu }; 996ff86648dSDavid Wu 997af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 998af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 999af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1000af166ffaSDavid Wu }; 1001af166ffaSDavid Wu 10021f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 10031f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 10041f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 10051f08aa1cSPhilipp Tomsich }; 10061f08aa1cSPhilipp Tomsich 100723adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 100823adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 100923adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 101023adb58fSDavid Wu }; 101123adb58fSDavid Wu 1012c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 1013c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1014c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1015c36b26c0SDavid Wu }; 1016c36b26c0SDavid Wu 1017793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 1018793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1019793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1020793f2fd2SPhilipp Tomsich }; 1021793f2fd2SPhilipp Tomsich 10221f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 10231f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 10241f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 10251f08aa1cSPhilipp Tomsich }; 10261f08aa1cSPhilipp Tomsich 10270a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 10280a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 10290a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 10300a33ce65SDavid Wu }; 1031dcfb333aSDavid Wu #else 1032dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 1033dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 1034dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 1035e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 1036dcfb333aSDavid Wu }; 10376f0a52e9SDavid Wu #endif 10380a33ce65SDavid Wu 10390125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 10406f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 104118ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 104218ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 1043ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 1044ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 1045af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 1046af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 10471f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 10481f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 104923adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 105023adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 1051c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 1052c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 1053793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 1054793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 10551f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 10561f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 10570a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 10580a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 1059dcfb333aSDavid Wu #else 1060dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 1061dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 10626f0a52e9SDavid Wu #endif 10630125bcf0SSjoerd Simons { } 10640125bcf0SSjoerd Simons }; 10650125bcf0SSjoerd Simons 10660125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 10670125bcf0SSjoerd Simons .name = "gmac_rockchip", 10680125bcf0SSjoerd Simons .id = UCLASS_ETH, 10690125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 10700125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 10710125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 10720125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 10736f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 10740125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 10750125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 10760125bcf0SSjoerd Simons }; 1077