10125bcf0SSjoerd Simons /* 20125bcf0SSjoerd Simons * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk> 30125bcf0SSjoerd Simons * 40125bcf0SSjoerd Simons * SPDX-License-Identifier: GPL-2.0+ 50125bcf0SSjoerd Simons * 60125bcf0SSjoerd Simons * Rockchip GMAC ethernet IP driver for U-Boot 70125bcf0SSjoerd Simons */ 80125bcf0SSjoerd Simons 90125bcf0SSjoerd Simons #include <common.h> 100125bcf0SSjoerd Simons #include <dm.h> 110125bcf0SSjoerd Simons #include <clk.h> 120125bcf0SSjoerd Simons #include <phy.h> 13491f3bfbSDavid Wu #include <reset.h> 140125bcf0SSjoerd Simons #include <syscon.h> 150125bcf0SSjoerd Simons #include <asm/io.h> 160125bcf0SSjoerd Simons #include <asm/arch/periph.h> 170125bcf0SSjoerd Simons #include <asm/arch/clock.h> 181f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h> 196f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 2033a014bdSDavid Wu #include <asm/arch/grf_rk3568.h> 21bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h> 22dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 236f0a52e9SDavid Wu #include "dwc_eth_qos.h" 246f0a52e9SDavid Wu #else 2518ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 26ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 27af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 280125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 2923adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 30c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 31793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 321f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 330a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 340125bcf0SSjoerd Simons #include "designware.h" 356f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 366f0a52e9SDavid Wu #endif 376f0a52e9SDavid Wu #include <dm/pinctrl.h> 38491f3bfbSDavid Wu #include <dm/of_access.h> 390125bcf0SSjoerd Simons 400125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 410125bcf0SSjoerd Simons 426f0a52e9SDavid Wu struct rockchip_eth_dev { 436f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 446f0a52e9SDavid Wu struct eqos_priv eqos; 456f0a52e9SDavid Wu #else 466f0a52e9SDavid Wu struct dw_eth_dev dw; 476f0a52e9SDavid Wu #endif 48491f3bfbSDavid Wu int phy_interface; 496f0a52e9SDavid Wu }; 506f0a52e9SDavid Wu 510125bcf0SSjoerd Simons /* 520125bcf0SSjoerd Simons * Platform data for the gmac 530125bcf0SSjoerd Simons * 540125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 550125bcf0SSjoerd Simons */ 560125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 576f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 580125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 596f0a52e9SDavid Wu #else 606f0a52e9SDavid Wu struct eth_pdata eth_pdata; 616f0a52e9SDavid Wu #endif 62491f3bfbSDavid Wu struct reset_ctl phy_reset; 63491f3bfbSDavid Wu bool integrated_phy; 640a33ce65SDavid Wu bool clock_input; 65491f3bfbSDavid Wu int phy_interface; 660125bcf0SSjoerd Simons int tx_delay; 670125bcf0SSjoerd Simons int rx_delay; 6833a014bdSDavid Wu int bus_id; 690125bcf0SSjoerd Simons }; 700125bcf0SSjoerd Simons 711f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 726f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 736f0a52e9SDavid Wu const struct eqos_config config; 746f0a52e9SDavid Wu #endif 75491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 76491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 770a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 781f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 79bf0e94d0SDavid Wu void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 80491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 811f08aa1cSPhilipp Tomsich }; 821f08aa1cSPhilipp Tomsich 83befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 84befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 85befcb627SDavid Wu .reg_access_always_ok = false, 86befcb627SDavid Wu .mdio_wait = 10000, 87befcb627SDavid Wu .swr_wait = 200, 88befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 89befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 90befcb627SDavid Wu .ops = &eqos_rockchip_ops, 91befcb627SDavid Wu }; 92befcb627SDavid Wu #endif 93befcb627SDavid Wu 941eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 951eb9d064SDavid Wu { 961eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 971eb9d064SDavid Wu struct rk_gmac_ops *ops = 981eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 991eb9d064SDavid Wu 1001eb9d064SDavid Wu pdata->tx_delay = tx_delay; 1011eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1021eb9d064SDavid Wu 1031eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1041eb9d064SDavid Wu } 1051f08aa1cSPhilipp Tomsich 1060125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1070125bcf0SSjoerd Simons { 1080125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 109491f3bfbSDavid Wu struct ofnode_phandle_args args; 1100a33ce65SDavid Wu const char *string; 111491f3bfbSDavid Wu int ret; 1120a33ce65SDavid Wu 1130a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1140a33ce65SDavid Wu if (!strcmp(string, "input")) 1150a33ce65SDavid Wu pdata->clock_input = true; 1160a33ce65SDavid Wu else 1170a33ce65SDavid Wu pdata->clock_input = false; 1180125bcf0SSjoerd Simons 119491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 120491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 121491f3bfbSDavid Wu if (ret) { 122491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 123491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 124491f3bfbSDavid Wu } else { 125491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 126491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 127491f3bfbSDavid Wu "phy-is-integrated"); 128491f3bfbSDavid Wu } 129491f3bfbSDavid Wu 130491f3bfbSDavid Wu if (pdata->integrated_phy) { 131491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 132491f3bfbSDavid Wu if (ret) { 133491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 134491f3bfbSDavid Wu return ret; 135491f3bfbSDavid Wu } 136491f3bfbSDavid Wu } 137491f3bfbSDavid Wu 1381f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1397ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1407ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1411f08aa1cSPhilipp Tomsich 1421f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1431f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1447ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1451f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1467ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1470125bcf0SSjoerd Simons 1486f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1496f0a52e9SDavid Wu return 0; 1506f0a52e9SDavid Wu #else 1510125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1526f0a52e9SDavid Wu #endif 1530125bcf0SSjoerd Simons } 1540125bcf0SSjoerd Simons 1556f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 156491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 157491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 15818ae91c8SDavid Wu { 1596f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 16018ae91c8SDavid Wu struct px30_grf *grf; 16118ae91c8SDavid Wu struct clk clk_speed; 16218ae91c8SDavid Wu int speed, ret; 16318ae91c8SDavid Wu enum { 16418ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 16518ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 16618ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 16718ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 16818ae91c8SDavid Wu }; 16918ae91c8SDavid Wu 17018ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 17118ae91c8SDavid Wu &clk_speed); 17218ae91c8SDavid Wu if (ret) 17318ae91c8SDavid Wu return ret; 17418ae91c8SDavid Wu 17518ae91c8SDavid Wu switch (priv->phydev->speed) { 17618ae91c8SDavid Wu case 10: 17718ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 17818ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 17918ae91c8SDavid Wu if (ret) 18018ae91c8SDavid Wu return ret; 18118ae91c8SDavid Wu break; 18218ae91c8SDavid Wu case 100: 18318ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 18418ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 18518ae91c8SDavid Wu if (ret) 18618ae91c8SDavid Wu return ret; 18718ae91c8SDavid Wu break; 18818ae91c8SDavid Wu default: 18918ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 19018ae91c8SDavid Wu return -EINVAL; 19118ae91c8SDavid Wu } 19218ae91c8SDavid Wu 19318ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 19418ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 19518ae91c8SDavid Wu 19618ae91c8SDavid Wu return 0; 19718ae91c8SDavid Wu } 19818ae91c8SDavid Wu 199491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 200491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 201ff86648dSDavid Wu { 2026f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 203ff86648dSDavid Wu struct clk clk_speed; 204ff86648dSDavid Wu int ret; 205ff86648dSDavid Wu 206ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 207ff86648dSDavid Wu &clk_speed); 208ff86648dSDavid Wu if (ret) 209ff86648dSDavid Wu return ret; 210ff86648dSDavid Wu 211ff86648dSDavid Wu switch (priv->phydev->speed) { 212ff86648dSDavid Wu case 10: 213ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 214ff86648dSDavid Wu if (ret) 215ff86648dSDavid Wu return ret; 216ff86648dSDavid Wu break; 217ff86648dSDavid Wu case 100: 218ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 219ff86648dSDavid Wu if (ret) 220ff86648dSDavid Wu return ret; 221ff86648dSDavid Wu break; 222ff86648dSDavid Wu case 1000: 223ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 224ff86648dSDavid Wu if (ret) 225ff86648dSDavid Wu return ret; 226ff86648dSDavid Wu break; 227ff86648dSDavid Wu default: 228ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 229ff86648dSDavid Wu return -EINVAL; 230ff86648dSDavid Wu } 231ff86648dSDavid Wu 232ff86648dSDavid Wu return 0; 233ff86648dSDavid Wu } 234ff86648dSDavid Wu 235491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 236491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 237af166ffaSDavid Wu { 2386f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 239af166ffaSDavid Wu struct rk322x_grf *grf; 240af166ffaSDavid Wu int clk; 241af166ffaSDavid Wu enum { 242af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 243af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 244af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 245af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 246af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 247491f3bfbSDavid Wu 248491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 249491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 250491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 251491f3bfbSDavid Wu 252491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 253491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 254491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 255af166ffaSDavid Wu }; 256af166ffaSDavid Wu 257af166ffaSDavid Wu switch (priv->phydev->speed) { 258af166ffaSDavid Wu case 10: 259491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 260491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 261491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 262af166ffaSDavid Wu break; 263af166ffaSDavid Wu case 100: 264491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 265491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 266491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 267af166ffaSDavid Wu break; 268af166ffaSDavid Wu case 1000: 269af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 270af166ffaSDavid Wu break; 271af166ffaSDavid Wu default: 272af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 273af166ffaSDavid Wu return -EINVAL; 274af166ffaSDavid Wu } 275af166ffaSDavid Wu 276af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 277491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 278491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 279491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 280491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 281491f3bfbSDavid Wu clk); 282af166ffaSDavid Wu 283af166ffaSDavid Wu return 0; 284af166ffaSDavid Wu } 285af166ffaSDavid Wu 286491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 287491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 2880125bcf0SSjoerd Simons { 2896f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 2900125bcf0SSjoerd Simons struct rk3288_grf *grf; 2910125bcf0SSjoerd Simons int clk; 2920125bcf0SSjoerd Simons 2930125bcf0SSjoerd Simons switch (priv->phydev->speed) { 2940125bcf0SSjoerd Simons case 10: 2951f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 2960125bcf0SSjoerd Simons break; 2970125bcf0SSjoerd Simons case 100: 2981f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 2990125bcf0SSjoerd Simons break; 3000125bcf0SSjoerd Simons case 1000: 3011f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3020125bcf0SSjoerd Simons break; 3030125bcf0SSjoerd Simons default: 3040125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3050125bcf0SSjoerd Simons return -EINVAL; 3060125bcf0SSjoerd Simons } 3070125bcf0SSjoerd Simons 3080125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3091f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3100125bcf0SSjoerd Simons 3110125bcf0SSjoerd Simons return 0; 3120125bcf0SSjoerd Simons } 3130125bcf0SSjoerd Simons 314491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 315491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 31623adb58fSDavid Wu { 3176f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 31823adb58fSDavid Wu struct rk3308_grf *grf; 31923adb58fSDavid Wu struct clk clk_speed; 32023adb58fSDavid Wu int speed, ret; 32123adb58fSDavid Wu enum { 32223adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 32323adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 32423adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 32523adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 32623adb58fSDavid Wu }; 32723adb58fSDavid Wu 32823adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 32923adb58fSDavid Wu &clk_speed); 33023adb58fSDavid Wu if (ret) 33123adb58fSDavid Wu return ret; 33223adb58fSDavid Wu 33323adb58fSDavid Wu switch (priv->phydev->speed) { 33423adb58fSDavid Wu case 10: 33523adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 33623adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 33723adb58fSDavid Wu if (ret) 33823adb58fSDavid Wu return ret; 33923adb58fSDavid Wu break; 34023adb58fSDavid Wu case 100: 34123adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 34223adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 34323adb58fSDavid Wu if (ret) 34423adb58fSDavid Wu return ret; 34523adb58fSDavid Wu break; 34623adb58fSDavid Wu default: 34723adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 34823adb58fSDavid Wu return -EINVAL; 34923adb58fSDavid Wu } 35023adb58fSDavid Wu 35123adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 35223adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 35323adb58fSDavid Wu 35423adb58fSDavid Wu return 0; 35523adb58fSDavid Wu } 35623adb58fSDavid Wu 357491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 358491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 359c36b26c0SDavid Wu { 3606f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 361c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 362c36b26c0SDavid Wu int clk; 363c36b26c0SDavid Wu enum { 364c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 365c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 366c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 367c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 368c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 369491f3bfbSDavid Wu 370491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 371491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 372491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 373491f3bfbSDavid Wu 374491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 375491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 376491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 377c36b26c0SDavid Wu }; 378c36b26c0SDavid Wu 379c36b26c0SDavid Wu switch (priv->phydev->speed) { 380c36b26c0SDavid Wu case 10: 381491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 382491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 383491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 384c36b26c0SDavid Wu break; 385c36b26c0SDavid Wu case 100: 386491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 387491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 388491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 389c36b26c0SDavid Wu break; 390c36b26c0SDavid Wu case 1000: 391c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 392c36b26c0SDavid Wu break; 393c36b26c0SDavid Wu default: 394c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 395c36b26c0SDavid Wu return -EINVAL; 396c36b26c0SDavid Wu } 397c36b26c0SDavid Wu 398c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 399491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 400491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 401491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 402491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 403491f3bfbSDavid Wu clk); 404c36b26c0SDavid Wu 405c36b26c0SDavid Wu return 0; 406c36b26c0SDavid Wu } 407c36b26c0SDavid Wu 408491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 409491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 410793f2fd2SPhilipp Tomsich { 4116f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 412793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 413793f2fd2SPhilipp Tomsich int clk; 414793f2fd2SPhilipp Tomsich enum { 415793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 416793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 417793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 418793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 419793f2fd2SPhilipp Tomsich }; 420793f2fd2SPhilipp Tomsich 421793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 422793f2fd2SPhilipp Tomsich case 10: 423793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 424793f2fd2SPhilipp Tomsich break; 425793f2fd2SPhilipp Tomsich case 100: 426793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 427793f2fd2SPhilipp Tomsich break; 428793f2fd2SPhilipp Tomsich case 1000: 429793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 430793f2fd2SPhilipp Tomsich break; 431793f2fd2SPhilipp Tomsich default: 432793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 433793f2fd2SPhilipp Tomsich return -EINVAL; 434793f2fd2SPhilipp Tomsich } 435793f2fd2SPhilipp Tomsich 436793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 437793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 438793f2fd2SPhilipp Tomsich 439793f2fd2SPhilipp Tomsich return 0; 440793f2fd2SPhilipp Tomsich } 441793f2fd2SPhilipp Tomsich 442491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 443491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4441f08aa1cSPhilipp Tomsich { 4456f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4461f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4471f08aa1cSPhilipp Tomsich int clk; 4481f08aa1cSPhilipp Tomsich 4491f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4501f08aa1cSPhilipp Tomsich case 10: 4511f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4521f08aa1cSPhilipp Tomsich break; 4531f08aa1cSPhilipp Tomsich case 100: 4541f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4551f08aa1cSPhilipp Tomsich break; 4561f08aa1cSPhilipp Tomsich case 1000: 4571f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4581f08aa1cSPhilipp Tomsich break; 4591f08aa1cSPhilipp Tomsich default: 4601f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4611f08aa1cSPhilipp Tomsich return -EINVAL; 4621f08aa1cSPhilipp Tomsich } 4631f08aa1cSPhilipp Tomsich 4641f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4651f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4661f08aa1cSPhilipp Tomsich 4671f08aa1cSPhilipp Tomsich return 0; 4681f08aa1cSPhilipp Tomsich } 4691f08aa1cSPhilipp Tomsich 470491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 471491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4720a33ce65SDavid Wu { 4736f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4740a33ce65SDavid Wu struct rv1108_grf *grf; 4750a33ce65SDavid Wu int clk, speed; 4760a33ce65SDavid Wu enum { 4770a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4780a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4790a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4800a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4810a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4820a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4830a33ce65SDavid Wu }; 4840a33ce65SDavid Wu 4850a33ce65SDavid Wu switch (priv->phydev->speed) { 4860a33ce65SDavid Wu case 10: 4870a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 4880a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 4890a33ce65SDavid Wu break; 4900a33ce65SDavid Wu case 100: 4910a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 4920a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 4930a33ce65SDavid Wu break; 4940a33ce65SDavid Wu default: 4950a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 4960a33ce65SDavid Wu return -EINVAL; 4970a33ce65SDavid Wu } 4980a33ce65SDavid Wu 4990a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5000a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 5010a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5020a33ce65SDavid Wu clk | speed); 5030a33ce65SDavid Wu 5040a33ce65SDavid Wu return 0; 5050a33ce65SDavid Wu } 506dcfb333aSDavid Wu #else 507bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 508bf0e94d0SDavid Wu struct rockchip_eth_dev *dev) 509bf0e94d0SDavid Wu { 510bf0e94d0SDavid Wu struct eqos_priv *priv = &dev->eqos; 511bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 512bf0e94d0SDavid Wu unsigned int div, div_mask; 513bf0e94d0SDavid Wu 514bf0e94d0SDavid Wu enum { 515bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 516bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 517bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV1 = 0, 518*a116113dSDavid Wu RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 519bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 520bf0e94d0SDavid Wu RK3588_GMA_CLK_RMII_DIV2 = BIT(2), 521bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_DIV20 = 0, 522bf0e94d0SDavid Wu }; 523bf0e94d0SDavid Wu 524bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 525bf0e94d0SDavid Wu 526bf0e94d0SDavid Wu switch (priv->phy->speed) { 527bf0e94d0SDavid Wu case 10: 528bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 529bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV20; 530bf0e94d0SDavid Wu else 531bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV50; 532bf0e94d0SDavid Wu break; 533bf0e94d0SDavid Wu case 100: 534bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 535bf0e94d0SDavid Wu div = RK3588_GMA_CLK_RMII_DIV2; 536bf0e94d0SDavid Wu else 537bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV5; 538bf0e94d0SDavid Wu break; 539bf0e94d0SDavid Wu case 1000: 540bf0e94d0SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 541bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV1; 542bf0e94d0SDavid Wu else 543bf0e94d0SDavid Wu return -EINVAL; 544bf0e94d0SDavid Wu break; 545bf0e94d0SDavid Wu default: 546bf0e94d0SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 547bf0e94d0SDavid Wu return -EINVAL; 548bf0e94d0SDavid Wu } 549bf0e94d0SDavid Wu 550bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 551bf0e94d0SDavid Wu div <<= 5; 552bf0e94d0SDavid Wu div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 553bf0e94d0SDavid Wu } 554bf0e94d0SDavid Wu 555bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 556bf0e94d0SDavid Wu 557bf0e94d0SDavid Wu return 0; 558bf0e94d0SDavid Wu } 559bf0e94d0SDavid Wu 560491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 561491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 562dcfb333aSDavid Wu { 563dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 564dcfb333aSDavid Wu struct clk clk_speed; 565dcfb333aSDavid Wu int ret; 566dcfb333aSDavid Wu 567dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 568dcfb333aSDavid Wu &clk_speed); 569dcfb333aSDavid Wu if (ret) { 57033a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 57133a014bdSDavid Wu __func__, ret); 572dcfb333aSDavid Wu return ret; 573dcfb333aSDavid Wu } 574dcfb333aSDavid Wu 575dcfb333aSDavid Wu switch ( priv->phy->speed) { 576dcfb333aSDavid Wu case 10: 577dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 578dcfb333aSDavid Wu if (ret) 579dcfb333aSDavid Wu return ret; 580dcfb333aSDavid Wu break; 581dcfb333aSDavid Wu case 100: 582dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 583dcfb333aSDavid Wu if (ret) 584dcfb333aSDavid Wu return ret; 585dcfb333aSDavid Wu break; 586dcfb333aSDavid Wu case 1000: 587dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 588dcfb333aSDavid Wu if (ret) 589dcfb333aSDavid Wu return ret; 590dcfb333aSDavid Wu break; 591dcfb333aSDavid Wu default: 592dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 593dcfb333aSDavid Wu return -EINVAL; 594dcfb333aSDavid Wu } 595dcfb333aSDavid Wu 596dcfb333aSDavid Wu return 0; 597dcfb333aSDavid Wu } 5986f0a52e9SDavid Wu #endif 5990a33ce65SDavid Wu 6006f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 60118ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 60218ae91c8SDavid Wu { 60318ae91c8SDavid Wu struct px30_grf *grf; 60418ae91c8SDavid Wu enum { 60518ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 60618ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 60718ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 60818ae91c8SDavid Wu }; 60918ae91c8SDavid Wu 61018ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 61118ae91c8SDavid Wu 61218ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 61318ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 61418ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 61518ae91c8SDavid Wu } 61618ae91c8SDavid Wu 617ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 618ff86648dSDavid Wu { 619ff86648dSDavid Wu struct rk1808_grf *grf; 620ff86648dSDavid Wu enum { 621ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 622ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 623ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 624ff86648dSDavid Wu 625ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 626ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 627ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 628ff86648dSDavid Wu 629ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 630ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 631ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 632ff86648dSDavid Wu }; 633ff86648dSDavid Wu enum { 634ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 635ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 636ff86648dSDavid Wu 637ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 638ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 639ff86648dSDavid Wu }; 640ff86648dSDavid Wu 641ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 642ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 643ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 644ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 645ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 646ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 647ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 648ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 649ff86648dSDavid Wu 650ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 651ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 652ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 653ff86648dSDavid Wu pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT | 654ff86648dSDavid Wu pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT); 655ff86648dSDavid Wu } 656ff86648dSDavid Wu 657af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 658af166ffaSDavid Wu { 659af166ffaSDavid Wu struct rk322x_grf *grf; 660af166ffaSDavid Wu enum { 661af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 662af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 663af166ffaSDavid Wu 664af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 665af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 666af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 667af166ffaSDavid Wu 668af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 669af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 670af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 671af166ffaSDavid Wu 672af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 673af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 674af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 675af166ffaSDavid Wu }; 676af166ffaSDavid Wu enum { 677af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 678af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 679af166ffaSDavid Wu 680af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 681af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 682af166ffaSDavid Wu }; 683af166ffaSDavid Wu 684af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 685af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 686af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 687af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 688af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 689af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 690af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 691af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 692af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 693af166ffaSDavid Wu 694af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 695af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 696af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 697af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 698af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 699af166ffaSDavid Wu } 700af166ffaSDavid Wu 701491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 702491f3bfbSDavid Wu { 703491f3bfbSDavid Wu struct rk322x_grf *grf; 704491f3bfbSDavid Wu enum { 705491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 706491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 707491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 708491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 709491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 710491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 711491f3bfbSDavid Wu }; 712491f3bfbSDavid Wu 713491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 714491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 715491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 716491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 717491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 718491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 719491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 720491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 721491f3bfbSDavid Wu } 722491f3bfbSDavid Wu 7231f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 7241f08aa1cSPhilipp Tomsich { 7251f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 7261f08aa1cSPhilipp Tomsich 7271f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 7281f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 7291f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 7301f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 7311f08aa1cSPhilipp Tomsich 7321f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 7331f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 7341f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 7351f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 7361f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 7371f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 7381f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 7391f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 7401f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 7411f08aa1cSPhilipp Tomsich } 7421f08aa1cSPhilipp Tomsich 74323adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 74423adb58fSDavid Wu { 74523adb58fSDavid Wu struct rk3308_grf *grf; 74623adb58fSDavid Wu enum { 74723adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 74823adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 74923adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 75023adb58fSDavid Wu }; 75123adb58fSDavid Wu 75223adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 75323adb58fSDavid Wu 75423adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 75523adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 75623adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 75723adb58fSDavid Wu } 75823adb58fSDavid Wu 759c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 760c36b26c0SDavid Wu { 761c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 762c36b26c0SDavid Wu enum { 763c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 764c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 765c36b26c0SDavid Wu 766c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 767c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 768c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 769c36b26c0SDavid Wu 770c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 771c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 772c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 773c36b26c0SDavid Wu 774c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 775c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 776c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 777c36b26c0SDavid Wu }; 778c36b26c0SDavid Wu enum { 779c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 780c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 781c36b26c0SDavid Wu 782c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 783c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 784c36b26c0SDavid Wu }; 785c36b26c0SDavid Wu 786c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 787c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 788c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 789c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 790c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 791c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 792c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 793c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 794c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 795c36b26c0SDavid Wu 796c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 797c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 798c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 799c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 800c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 801c36b26c0SDavid Wu } 802c36b26c0SDavid Wu 803491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 804491f3bfbSDavid Wu { 805491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 806491f3bfbSDavid Wu enum { 807491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 808491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 809491f3bfbSDavid Wu 810491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 811491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 812491f3bfbSDavid Wu }; 813491f3bfbSDavid Wu 814491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 815491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 816491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 817491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 818491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 819491f3bfbSDavid Wu RK3328_RMII_MODE); 820491f3bfbSDavid Wu } 821491f3bfbSDavid Wu 822793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 823793f2fd2SPhilipp Tomsich { 824793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 825793f2fd2SPhilipp Tomsich enum { 826793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 827793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 828793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 829793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 830793f2fd2SPhilipp Tomsich }; 831793f2fd2SPhilipp Tomsich enum { 832793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 833793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 834793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 835793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 836793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 837793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 838793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 839793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 840793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 841793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 842793f2fd2SPhilipp Tomsich }; 843793f2fd2SPhilipp Tomsich 844793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 845793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 846793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 847793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 848793f2fd2SPhilipp Tomsich 849793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 850793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 851793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 852793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 853793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 854793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 855793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 856793f2fd2SPhilipp Tomsich pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT | 857793f2fd2SPhilipp Tomsich pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT); 858793f2fd2SPhilipp Tomsich } 859793f2fd2SPhilipp Tomsich 8601f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 8611f08aa1cSPhilipp Tomsich { 8621f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 8631f08aa1cSPhilipp Tomsich 8641f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 8651f08aa1cSPhilipp Tomsich 8661f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 8671f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 8681f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 8691f08aa1cSPhilipp Tomsich 8701f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 8711f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 8721f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 8731f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 8741f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 8751f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 8761f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 8771f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT | 8781f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT); 8791f08aa1cSPhilipp Tomsich } 8801f08aa1cSPhilipp Tomsich 8810a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 8820a33ce65SDavid Wu { 8830a33ce65SDavid Wu struct rv1108_grf *grf; 8840a33ce65SDavid Wu 8850a33ce65SDavid Wu enum { 8860a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 8870a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 8880a33ce65SDavid Wu }; 8890a33ce65SDavid Wu 8900a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 8910a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 8920a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 8930a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 8940a33ce65SDavid Wu } 895491f3bfbSDavid Wu 896491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 897491f3bfbSDavid Wu { 898491f3bfbSDavid Wu struct rk322x_grf *grf; 899491f3bfbSDavid Wu enum { 900491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 901491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 902491f3bfbSDavid Wu }; 903491f3bfbSDavid Wu enum { 904491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 905491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 906491f3bfbSDavid Wu 907491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 908491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 909491f3bfbSDavid Wu 910491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 911491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 912491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 913491f3bfbSDavid Wu }; 914491f3bfbSDavid Wu enum { 915491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 916491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 917491f3bfbSDavid Wu }; 918491f3bfbSDavid Wu enum { 919491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 920491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 921491f3bfbSDavid Wu }; 922491f3bfbSDavid Wu 923491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 924491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 925491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 926491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 927491f3bfbSDavid Wu 928491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 929491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 930491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 931491f3bfbSDavid Wu 932491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 933491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 934491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 935491f3bfbSDavid Wu 936491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 937491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 938491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 939491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 940491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 941491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 942491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 943491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 944491f3bfbSDavid Wu 945491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 946491f3bfbSDavid Wu udelay(10); 947491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 948491f3bfbSDavid Wu udelay(10); 949491f3bfbSDavid Wu 950491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 951491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 952491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 953491f3bfbSDavid Wu udelay(30 * 1000); 954491f3bfbSDavid Wu } 955491f3bfbSDavid Wu 956491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 957491f3bfbSDavid Wu { 958491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 959491f3bfbSDavid Wu enum { 960491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 961491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 962491f3bfbSDavid Wu }; 963491f3bfbSDavid Wu enum { 964491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 965491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 966491f3bfbSDavid Wu 967491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 968491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 969491f3bfbSDavid Wu 970491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 971491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 972491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 973491f3bfbSDavid Wu }; 974491f3bfbSDavid Wu enum { 975491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 976491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 977491f3bfbSDavid Wu }; 978491f3bfbSDavid Wu enum { 979491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 980491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 981491f3bfbSDavid Wu }; 982491f3bfbSDavid Wu 983491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 984491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 985491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 986491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 987491f3bfbSDavid Wu 988491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 989491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 990491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 991491f3bfbSDavid Wu 992491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 993491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 994491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 995491f3bfbSDavid Wu 996491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 997491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 998491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 999491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 1000491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1001491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 1002491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 1003491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 1004491f3bfbSDavid Wu 1005491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1006491f3bfbSDavid Wu udelay(10); 1007491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1008491f3bfbSDavid Wu udelay(10); 1009491f3bfbSDavid Wu 1010491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1011491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1012491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 1013491f3bfbSDavid Wu udelay(30 * 1000); 1014491f3bfbSDavid Wu } 1015491f3bfbSDavid Wu 1016dcfb333aSDavid Wu #else 101733a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 101833a014bdSDavid Wu { 101933a014bdSDavid Wu struct rk3568_grf *grf; 102033a014bdSDavid Wu void *con1; 102133a014bdSDavid Wu 102233a014bdSDavid Wu enum { 102333a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 102433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 102533a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 102633a014bdSDavid Wu }; 102733a014bdSDavid Wu 102833a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 102933a014bdSDavid Wu 103033a014bdSDavid Wu if (pdata->bus_id == 1) 103133a014bdSDavid Wu con1 = &grf->mac1_con1; 103233a014bdSDavid Wu else 103333a014bdSDavid Wu con1 = &grf->mac0_con1; 103433a014bdSDavid Wu 103533a014bdSDavid Wu rk_clrsetreg(con1, 103633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 103733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 103833a014bdSDavid Wu } 103933a014bdSDavid Wu 104033a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 104133a014bdSDavid Wu { 104233a014bdSDavid Wu struct rk3568_grf *grf; 104333a014bdSDavid Wu void *con0, *con1; 104433a014bdSDavid Wu 104533a014bdSDavid Wu enum { 104633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 104733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 104833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 104933a014bdSDavid Wu 105033a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 105133a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 105233a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 105333a014bdSDavid Wu 105433a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 105533a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 105633a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 105733a014bdSDavid Wu }; 105833a014bdSDavid Wu 105933a014bdSDavid Wu enum { 106033a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 106133a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 106233a014bdSDavid Wu 106333a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 106433a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 106533a014bdSDavid Wu }; 106633a014bdSDavid Wu 106733a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 106833a014bdSDavid Wu 106933a014bdSDavid Wu if (pdata->bus_id == 1) { 107033a014bdSDavid Wu con0 = &grf->mac1_con0; 107133a014bdSDavid Wu con1 = &grf->mac1_con1; 107233a014bdSDavid Wu } else { 107333a014bdSDavid Wu con0 = &grf->mac0_con0; 107433a014bdSDavid Wu con1 = &grf->mac0_con1; 107533a014bdSDavid Wu } 107633a014bdSDavid Wu 107733a014bdSDavid Wu rk_clrsetreg(con0, 107833a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 107933a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 108033a014bdSDavid Wu pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT | 108133a014bdSDavid Wu pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT); 108233a014bdSDavid Wu 108333a014bdSDavid Wu rk_clrsetreg(con1, 108433a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 108533a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 108633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 108733a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 108833a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 108933a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 109033a014bdSDavid Wu } 109133a014bdSDavid Wu 1092bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1093bf0e94d0SDavid Wu { 1094bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1095bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1096bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1097bf0e94d0SDavid Wu 1098bf0e94d0SDavid Wu enum { 1099bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1100bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1101bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1102bf0e94d0SDavid Wu }; 1103bf0e94d0SDavid Wu 1104bf0e94d0SDavid Wu enum { 1105bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1106bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1107bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE = 0x1, 1108bf0e94d0SDavid Wu }; 1109bf0e94d0SDavid Wu 1110bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1111bf0e94d0SDavid Wu 1112bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1113bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1114bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1115bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1116bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1117bf0e94d0SDavid Wu } else { 1118bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1119bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1120bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1121bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1122bf0e94d0SDavid Wu } 1123bf0e94d0SDavid Wu 1124bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1125bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1126bf0e94d0SDavid Wu } 1127bf0e94d0SDavid Wu 1128bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1129bf0e94d0SDavid Wu { 1130bf0e94d0SDavid Wu unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1131bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1132bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1133bf0e94d0SDavid Wu unsigned int rx_delay; 1134bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1135bf0e94d0SDavid Wu struct rk3588_sys_grf *grf; 1136bf0e94d0SDavid Wu void *offset_con; 1137bf0e94d0SDavid Wu 1138bf0e94d0SDavid Wu enum { 1139bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1140bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1141bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1142bf0e94d0SDavid Wu 1143bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1144bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1145bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1146bf0e94d0SDavid Wu 1147bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1148bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1149bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1150bf0e94d0SDavid Wu }; 1151bf0e94d0SDavid Wu 1152bf0e94d0SDavid Wu enum { 1153bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1154bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1155bf0e94d0SDavid Wu 1156bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1157bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1158bf0e94d0SDavid Wu }; 1159bf0e94d0SDavid Wu 1160bf0e94d0SDavid Wu enum { 1161bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1162bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1163bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1164bf0e94d0SDavid Wu }; 1165bf0e94d0SDavid Wu 1166bf0e94d0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1167bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1168bf0e94d0SDavid Wu 1169bf0e94d0SDavid Wu if (pdata->rx_delay < 0) { 1170bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1171bf0e94d0SDavid Wu rx_delay = 0; 1172bf0e94d0SDavid Wu } else { 1173bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1174bf0e94d0SDavid Wu rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1175bf0e94d0SDavid Wu } 1176bf0e94d0SDavid Wu 1177bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1178bf0e94d0SDavid Wu offset_con = &grf->soc_con9; 1179bf0e94d0SDavid Wu rx_enable = rx_delay << 2; 1180bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1181bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1182bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1183bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1184bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1185bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1186bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1187bf0e94d0SDavid Wu } else { 1188bf0e94d0SDavid Wu offset_con = &grf->soc_con8; 1189bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1190bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1191bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1192bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1193bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1194bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1195bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1196bf0e94d0SDavid Wu } 1197bf0e94d0SDavid Wu 1198bf0e94d0SDavid Wu rk_clrsetreg(offset_con, 1199bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1200bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1201bf0e94d0SDavid Wu pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT | 1202bf0e94d0SDavid Wu rx_delay); 1203bf0e94d0SDavid Wu 1204bf0e94d0SDavid Wu rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1205bf0e94d0SDavid Wu tx_enable | rx_enable); 1206bf0e94d0SDavid Wu 1207bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1208bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1209bf0e94d0SDavid Wu } 1210bf0e94d0SDavid Wu 1211e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1212e4e3f431SDavid Wu { 1213e4e3f431SDavid Wu struct rv1126_grf *grf; 1214e4e3f431SDavid Wu 1215e4e3f431SDavid Wu enum { 1216e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1217e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1218e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1219e4e3f431SDavid Wu }; 1220e4e3f431SDavid Wu 1221e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1222e4e3f431SDavid Wu 1223e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1224e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1225e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1226e4e3f431SDavid Wu } 1227e4e3f431SDavid Wu 1228dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1229dcfb333aSDavid Wu { 1230dcfb333aSDavid Wu struct rv1126_grf *grf; 1231dcfb333aSDavid Wu 1232dcfb333aSDavid Wu enum { 1233dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1234dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1235dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1236dcfb333aSDavid Wu 1237dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1238dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1239dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1240dcfb333aSDavid Wu 1241dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1242dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1243dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1244dcfb333aSDavid Wu 1245dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1246dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1247dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1248dcfb333aSDavid Wu 1249dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1250dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1251dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1252dcfb333aSDavid Wu }; 1253dcfb333aSDavid Wu enum { 1254dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1255dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1256dcfb333aSDavid Wu 1257dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1258dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1259dcfb333aSDavid Wu }; 1260dcfb333aSDavid Wu enum { 1261dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1262dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1263dcfb333aSDavid Wu 1264dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1265dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1266dcfb333aSDavid Wu }; 1267dcfb333aSDavid Wu 1268dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1269dcfb333aSDavid Wu 1270dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1271dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1272dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1273dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1274dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1275dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1276dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1277dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1278dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1279dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1280dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1281dcfb333aSDavid Wu 1282dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1283dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1284dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1285dcfb333aSDavid Wu pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT | 1286dcfb333aSDavid Wu pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT); 1287dcfb333aSDavid Wu 1288dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1289dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1290dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1291dcfb333aSDavid Wu pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT | 1292dcfb333aSDavid Wu pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT); 1293dcfb333aSDavid Wu } 12946f0a52e9SDavid Wu #endif 12950a33ce65SDavid Wu 1296bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1297bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1298bf0e94d0SDavid Wu { 1299bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1300bf0e94d0SDavid Wu unsigned int val, mask; 1301bf0e94d0SDavid Wu 1302bf0e94d0SDavid Wu enum { 1303bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 1304bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_MASK = BIT(4), 1305bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU = BIT(4), 1306bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_IO = 0, 1307bf0e94d0SDavid Wu }; 1308bf0e94d0SDavid Wu 1309bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1310bf0e94d0SDavid Wu val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 1311bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU; 1312bf0e94d0SDavid Wu mask = RK3588_GMAC_CLK_SELET_MASK; 1313bf0e94d0SDavid Wu 1314bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1315bf0e94d0SDavid Wu val <<= 5; 1316bf0e94d0SDavid Wu mask <<= 5; 1317bf0e94d0SDavid Wu } 1318bf0e94d0SDavid Wu 1319bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, mask, val); 1320bf0e94d0SDavid Wu } 1321bf0e94d0SDavid Wu #endif 1322bf0e94d0SDavid Wu 13230125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 13240125bcf0SSjoerd Simons { 13250125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 13261f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 13271f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 13286f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 13296f0a52e9SDavid Wu struct eqos_config *config; 13306f0a52e9SDavid Wu #else 13316f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 13326f0a52e9SDavid Wu #endif 13336f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 13340125bcf0SSjoerd Simons struct clk clk; 13350a33ce65SDavid Wu ulong rate; 13360125bcf0SSjoerd Simons int ret; 13370125bcf0SSjoerd Simons 13386f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 13396f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 13406f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 1341befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 13426f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 13436f0a52e9SDavid Wu #else 13446f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 13456f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 13466f0a52e9SDavid Wu #endif 134733a014bdSDavid Wu pdata->bus_id = dev->seq; 1348cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1349cadc8d74SKever Yang ret = clk_set_defaults(dev); 1350cadc8d74SKever Yang if (ret) 1351cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 1352cadc8d74SKever Yang 13530125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 13540125bcf0SSjoerd Simons if (ret) 13550125bcf0SSjoerd Simons return ret; 13560125bcf0SSjoerd Simons 1357491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 1358491f3bfbSDavid Wu 1359bf0e94d0SDavid Wu if (ops->set_clock_selection) 1360bf0e94d0SDavid Wu ops->set_clock_selection(pdata); 1361bf0e94d0SDavid Wu 1362491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 1363491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 1364491f3bfbSDavid Wu 13650a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 13660a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 1367bf0e94d0SDavid Wu case PHY_INTERFACE_MODE_RGMII_RXID: 13680a33ce65SDavid Wu /* 13690a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 13700a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 13710a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 13720a33ce65SDavid Wu * is not set, because of it is bypassed. 13730a33ce65SDavid Wu */ 13740a33ce65SDavid Wu if (!pdata->clock_input) { 13750a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 13760a33ce65SDavid Wu if (rate != 125000000) 13770a33ce65SDavid Wu return -EINVAL; 13780a33ce65SDavid Wu } 13790125bcf0SSjoerd Simons 1380bf0e94d0SDavid Wu if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 1381bf0e94d0SDavid Wu pdata->rx_delay = -1; 1382bf0e94d0SDavid Wu 13830125bcf0SSjoerd Simons /* Set to RGMII mode */ 13840a33ce65SDavid Wu if (ops->set_to_rgmii) 13851f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 13860a33ce65SDavid Wu else 13870a33ce65SDavid Wu return -EPERM; 13880a33ce65SDavid Wu 13890a33ce65SDavid Wu break; 13900a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 13910a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 13920a33ce65SDavid Wu if (!pdata->clock_input) { 13930a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 13940a33ce65SDavid Wu if (rate != 50000000) 13950a33ce65SDavid Wu return -EINVAL; 13960a33ce65SDavid Wu } 13970a33ce65SDavid Wu 13980a33ce65SDavid Wu /* Set to RMII mode */ 13990a33ce65SDavid Wu if (ops->set_to_rmii) 14000a33ce65SDavid Wu ops->set_to_rmii(pdata); 14010a33ce65SDavid Wu else 14020a33ce65SDavid Wu return -EPERM; 14030a33ce65SDavid Wu 14040a33ce65SDavid Wu break; 14050a33ce65SDavid Wu default: 14060a33ce65SDavid Wu debug("NO interface defined!\n"); 14070a33ce65SDavid Wu return -ENXIO; 14080a33ce65SDavid Wu } 14090125bcf0SSjoerd Simons 14106f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14116f0a52e9SDavid Wu return eqos_probe(dev); 14126f0a52e9SDavid Wu #else 14130125bcf0SSjoerd Simons return designware_eth_probe(dev); 14146f0a52e9SDavid Wu #endif 14156f0a52e9SDavid Wu } 14166f0a52e9SDavid Wu 14176f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 14186f0a52e9SDavid Wu { 14196f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 14206f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 14216f0a52e9SDavid Wu #else 14226f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 14236f0a52e9SDavid Wu #endif 14246f0a52e9SDavid Wu } 14256f0a52e9SDavid Wu 14266f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 14276f0a52e9SDavid Wu int length) 14286f0a52e9SDavid Wu { 14296f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14306f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 14316f0a52e9SDavid Wu #else 14326f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 14336f0a52e9SDavid Wu #endif 14346f0a52e9SDavid Wu } 14356f0a52e9SDavid Wu 14366f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 14376f0a52e9SDavid Wu int length) 14386f0a52e9SDavid Wu { 14396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14406f0a52e9SDavid Wu return eqos_send(dev, packet, length); 14416f0a52e9SDavid Wu #else 14426f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 14436f0a52e9SDavid Wu #endif 14446f0a52e9SDavid Wu } 14456f0a52e9SDavid Wu 14466f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 14476f0a52e9SDavid Wu uchar **packetp) 14486f0a52e9SDavid Wu { 14496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14506f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 14516f0a52e9SDavid Wu #else 14526f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 14536f0a52e9SDavid Wu #endif 14540125bcf0SSjoerd Simons } 14550125bcf0SSjoerd Simons 14560125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 14570125bcf0SSjoerd Simons { 14586f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 14591f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 14601f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 14616f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1462491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 14636f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 14646f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 14656f0a52e9SDavid Wu #endif 14660125bcf0SSjoerd Simons int ret; 14670125bcf0SSjoerd Simons 14686f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14696f0a52e9SDavid Wu ret = eqos_init(dev); 14706f0a52e9SDavid Wu #else 14716f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 14726f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 14736f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 14746f0a52e9SDavid Wu eth_pdata->enetaddr); 14756f0a52e9SDavid Wu #endif 14760125bcf0SSjoerd Simons if (ret) 14770125bcf0SSjoerd Simons return ret; 1478491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 14790125bcf0SSjoerd Simons if (ret) 14800125bcf0SSjoerd Simons return ret; 14816f0a52e9SDavid Wu 14826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14836f0a52e9SDavid Wu eqos_enable(dev); 14846f0a52e9SDavid Wu #else 14856f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 14860125bcf0SSjoerd Simons if (ret) 14870125bcf0SSjoerd Simons return ret; 14886f0a52e9SDavid Wu #endif 14890125bcf0SSjoerd Simons 14900125bcf0SSjoerd Simons return 0; 14910125bcf0SSjoerd Simons } 14920125bcf0SSjoerd Simons 14936f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 14946f0a52e9SDavid Wu { 14956f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14966f0a52e9SDavid Wu eqos_stop(dev); 14976f0a52e9SDavid Wu #else 14986f0a52e9SDavid Wu designware_eth_stop(dev); 14996f0a52e9SDavid Wu #endif 15006f0a52e9SDavid Wu } 15016f0a52e9SDavid Wu 15020125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 15030125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 15046f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 15056f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 15066f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 15076f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 15086f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 15090125bcf0SSjoerd Simons }; 15100125bcf0SSjoerd Simons 15116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 151218ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 151318ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 151418ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 151518ae91c8SDavid Wu }; 151618ae91c8SDavid Wu 1517ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 1518ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 1519ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 1520ff86648dSDavid Wu }; 1521ff86648dSDavid Wu 1522af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 1523af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 1524491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 1525af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1526491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 1527af166ffaSDavid Wu }; 1528af166ffaSDavid Wu 15291f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 15301f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 15311f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 15321f08aa1cSPhilipp Tomsich }; 15331f08aa1cSPhilipp Tomsich 153423adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 153523adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 153623adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 153723adb58fSDavid Wu }; 153823adb58fSDavid Wu 1539c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 1540c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1541491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 1542c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1543491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 1544c36b26c0SDavid Wu }; 1545c36b26c0SDavid Wu 1546793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 1547793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1548793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1549793f2fd2SPhilipp Tomsich }; 1550793f2fd2SPhilipp Tomsich 15511f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 15521f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 15531f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 15541f08aa1cSPhilipp Tomsich }; 15551f08aa1cSPhilipp Tomsich 15560a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 15570a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 15580a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 15590a33ce65SDavid Wu }; 1560dcfb333aSDavid Wu #else 156133a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 156233a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 156333a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 156433a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 156533a014bdSDavid Wu }; 156633a014bdSDavid Wu 1567bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = { 1568bf0e94d0SDavid Wu .fix_mac_speed = rk3588_set_rgmii_speed, 1569bf0e94d0SDavid Wu .set_to_rgmii = rk3588_set_to_rgmii, 1570bf0e94d0SDavid Wu .set_to_rmii = rk3588_set_to_rmii, 1571bf0e94d0SDavid Wu .set_clock_selection = rk3588_set_clock_selection, 1572bf0e94d0SDavid Wu }; 1573bf0e94d0SDavid Wu 1574dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 1575dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 1576dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 1577e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 1578dcfb333aSDavid Wu }; 15796f0a52e9SDavid Wu #endif 15800a33ce65SDavid Wu 15810125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 15826f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 158384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30 158418ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 158518ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 158684e90485SDavid Wu #endif 158784e90485SDavid Wu 158884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808 1589ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 1590ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 159184e90485SDavid Wu #endif 159284e90485SDavid Wu 159384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228 1594af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 1595af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 159684e90485SDavid Wu #endif 159784e90485SDavid Wu 159884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288 15991f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 16001f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 160184e90485SDavid Wu #endif 160284e90485SDavid Wu 160384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308 160423adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 160523adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 160684e90485SDavid Wu #endif 160784e90485SDavid Wu 160884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328 1609c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 1610c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 161184e90485SDavid Wu #endif 161284e90485SDavid Wu 161384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368 1614793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 1615793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 161684e90485SDavid Wu #endif 161784e90485SDavid Wu 161884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399 16191f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 16201f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 162184e90485SDavid Wu #endif 162284e90485SDavid Wu 162384e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108 16240a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 16250a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 162684e90485SDavid Wu #endif 1627dcfb333aSDavid Wu #else 162884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568 162933a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 163033a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 163184e90485SDavid Wu #endif 163284e90485SDavid Wu 1633bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588 1634bf0e94d0SDavid Wu { .compatible = "rockchip,rk3588-gmac", 1635bf0e94d0SDavid Wu .data = (ulong)&rk3588_gmac_ops }, 1636bf0e94d0SDavid Wu #endif 1637bf0e94d0SDavid Wu 163884e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126 1639dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 1640dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 16416f0a52e9SDavid Wu #endif 164284e90485SDavid Wu #endif 16430125bcf0SSjoerd Simons { } 16440125bcf0SSjoerd Simons }; 16450125bcf0SSjoerd Simons 16460125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 16470125bcf0SSjoerd Simons .name = "gmac_rockchip", 16480125bcf0SSjoerd Simons .id = UCLASS_ETH, 16490125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 16500125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 16510125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 16520125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 16536f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 16540125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 16550125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 16560125bcf0SSjoerd Simons }; 1657