10125bcf0SSjoerd Simons /* 20125bcf0SSjoerd Simons * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk> 30125bcf0SSjoerd Simons * 40125bcf0SSjoerd Simons * SPDX-License-Identifier: GPL-2.0+ 50125bcf0SSjoerd Simons * 60125bcf0SSjoerd Simons * Rockchip GMAC ethernet IP driver for U-Boot 70125bcf0SSjoerd Simons */ 80125bcf0SSjoerd Simons 90125bcf0SSjoerd Simons #include <common.h> 100125bcf0SSjoerd Simons #include <dm.h> 110125bcf0SSjoerd Simons #include <clk.h> 12535678cdSDavid Wu #include <misc.h> 130125bcf0SSjoerd Simons #include <phy.h> 14491f3bfbSDavid Wu #include <reset.h> 150125bcf0SSjoerd Simons #include <syscon.h> 160125bcf0SSjoerd Simons #include <asm/io.h> 170125bcf0SSjoerd Simons #include <asm/arch/periph.h> 180125bcf0SSjoerd Simons #include <asm/arch/clock.h> 191f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h> 206f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21c563400aSDavid Wu #include <asm/arch/grf_rk3528.h> 2283f30531SDavid Wu #include <asm/arch/grf_rk3562.h> 2383f30531SDavid Wu #include <asm/arch/ioc_rk3562.h> 2433a014bdSDavid Wu #include <asm/arch/grf_rk3568.h> 25bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h> 26*745dad46SDavid Wu #include <asm/arch/grf_rv1103b.h> 2720bef841SDavid Wu #include <asm/arch/grf_rv1106.h> 28dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 296f0a52e9SDavid Wu #include "dwc_eth_qos.h" 306f0a52e9SDavid Wu #else 3118ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 32ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 33af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 340125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 3523adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 36c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 37793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 381f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 390a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 400125bcf0SSjoerd Simons #include "designware.h" 416f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 426f0a52e9SDavid Wu #endif 436f0a52e9SDavid Wu #include <dm/pinctrl.h> 44491f3bfbSDavid Wu #include <dm/of_access.h> 450125bcf0SSjoerd Simons 460125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 470125bcf0SSjoerd Simons 486f0a52e9SDavid Wu struct rockchip_eth_dev { 496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 506f0a52e9SDavid Wu struct eqos_priv eqos; 516f0a52e9SDavid Wu #else 526f0a52e9SDavid Wu struct dw_eth_dev dw; 536f0a52e9SDavid Wu #endif 54491f3bfbSDavid Wu int phy_interface; 556f0a52e9SDavid Wu }; 566f0a52e9SDavid Wu 570125bcf0SSjoerd Simons /* 580125bcf0SSjoerd Simons * Platform data for the gmac 590125bcf0SSjoerd Simons * 600125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 610125bcf0SSjoerd Simons */ 620125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 636f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 640125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 656f0a52e9SDavid Wu #else 666f0a52e9SDavid Wu struct eth_pdata eth_pdata; 676f0a52e9SDavid Wu #endif 68491f3bfbSDavid Wu struct reset_ctl phy_reset; 69491f3bfbSDavid Wu bool integrated_phy; 700a33ce65SDavid Wu bool clock_input; 71491f3bfbSDavid Wu int phy_interface; 720125bcf0SSjoerd Simons int tx_delay; 730125bcf0SSjoerd Simons int rx_delay; 7433a014bdSDavid Wu int bus_id; 750125bcf0SSjoerd Simons }; 760125bcf0SSjoerd Simons 771f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 786f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 796f0a52e9SDavid Wu const struct eqos_config config; 806f0a52e9SDavid Wu #endif 81491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 82491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 830a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 841f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 85bf0e94d0SDavid Wu void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 86491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 871f08aa1cSPhilipp Tomsich }; 881f08aa1cSPhilipp Tomsich 89befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 90befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 91befcb627SDavid Wu .reg_access_always_ok = false, 92befcb627SDavid Wu .mdio_wait = 10000, 93befcb627SDavid Wu .swr_wait = 200, 94befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 95befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 96befcb627SDavid Wu .ops = &eqos_rockchip_ops, 97befcb627SDavid Wu }; 98befcb627SDavid Wu #endif 99befcb627SDavid Wu 1001eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 1011eb9d064SDavid Wu { 1021eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1031eb9d064SDavid Wu struct rk_gmac_ops *ops = 1041eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 1051eb9d064SDavid Wu 1061eb9d064SDavid Wu pdata->tx_delay = tx_delay; 1071eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1081eb9d064SDavid Wu 1091eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1101eb9d064SDavid Wu } 1111f08aa1cSPhilipp Tomsich 1120125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1130125bcf0SSjoerd Simons { 1140125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 115491f3bfbSDavid Wu struct ofnode_phandle_args args; 11654f7ad44SDavid Wu struct udevice *phydev; 1170a33ce65SDavid Wu const char *string; 118491f3bfbSDavid Wu int ret; 1190a33ce65SDavid Wu 1200a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1210a33ce65SDavid Wu if (!strcmp(string, "input")) 1220a33ce65SDavid Wu pdata->clock_input = true; 1230a33ce65SDavid Wu else 1240a33ce65SDavid Wu pdata->clock_input = false; 1250125bcf0SSjoerd Simons 126491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 127491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 128491f3bfbSDavid Wu if (ret) { 129491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 130491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 131491f3bfbSDavid Wu } else { 132491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 133491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 134491f3bfbSDavid Wu "phy-is-integrated"); 135491f3bfbSDavid Wu } 136491f3bfbSDavid Wu 137491f3bfbSDavid Wu if (pdata->integrated_phy) { 138491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 139491f3bfbSDavid Wu if (ret) { 14054f7ad44SDavid Wu ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 14154f7ad44SDavid Wu if (ret) { 14254f7ad44SDavid Wu debug("Get phydev by ofnode failed: err=%d\n", ret); 14354f7ad44SDavid Wu return ret; 14454f7ad44SDavid Wu } 14554f7ad44SDavid Wu 14654f7ad44SDavid Wu ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 14754f7ad44SDavid Wu if (ret) { 148491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 149491f3bfbSDavid Wu return ret; 150491f3bfbSDavid Wu } 151491f3bfbSDavid Wu } 15254f7ad44SDavid Wu } 153491f3bfbSDavid Wu 1541f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1557ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1567ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1571f08aa1cSPhilipp Tomsich 1581f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1591f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1607ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1611f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1627ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1630125bcf0SSjoerd Simons 1646f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1656f0a52e9SDavid Wu return 0; 1666f0a52e9SDavid Wu #else 1670125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1686f0a52e9SDavid Wu #endif 1690125bcf0SSjoerd Simons } 1700125bcf0SSjoerd Simons 1716f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 172491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 173491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 17418ae91c8SDavid Wu { 1756f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 17618ae91c8SDavid Wu struct px30_grf *grf; 17718ae91c8SDavid Wu struct clk clk_speed; 17818ae91c8SDavid Wu int speed, ret; 17918ae91c8SDavid Wu enum { 18018ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 18118ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 18218ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 18318ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 18418ae91c8SDavid Wu }; 18518ae91c8SDavid Wu 18618ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 18718ae91c8SDavid Wu &clk_speed); 18818ae91c8SDavid Wu if (ret) 18918ae91c8SDavid Wu return ret; 19018ae91c8SDavid Wu 19118ae91c8SDavid Wu switch (priv->phydev->speed) { 19218ae91c8SDavid Wu case 10: 19318ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 19418ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 19518ae91c8SDavid Wu if (ret) 19618ae91c8SDavid Wu return ret; 19718ae91c8SDavid Wu break; 19818ae91c8SDavid Wu case 100: 19918ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 20018ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 20118ae91c8SDavid Wu if (ret) 20218ae91c8SDavid Wu return ret; 20318ae91c8SDavid Wu break; 20418ae91c8SDavid Wu default: 20518ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 20618ae91c8SDavid Wu return -EINVAL; 20718ae91c8SDavid Wu } 20818ae91c8SDavid Wu 20918ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 21018ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 21118ae91c8SDavid Wu 21218ae91c8SDavid Wu return 0; 21318ae91c8SDavid Wu } 21418ae91c8SDavid Wu 215491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 216491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 217ff86648dSDavid Wu { 2186f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 219ff86648dSDavid Wu struct clk clk_speed; 220ff86648dSDavid Wu int ret; 221ff86648dSDavid Wu 222ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 223ff86648dSDavid Wu &clk_speed); 224ff86648dSDavid Wu if (ret) 225ff86648dSDavid Wu return ret; 226ff86648dSDavid Wu 227ff86648dSDavid Wu switch (priv->phydev->speed) { 228ff86648dSDavid Wu case 10: 229ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 230ff86648dSDavid Wu if (ret) 231ff86648dSDavid Wu return ret; 232ff86648dSDavid Wu break; 233ff86648dSDavid Wu case 100: 234ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 235ff86648dSDavid Wu if (ret) 236ff86648dSDavid Wu return ret; 237ff86648dSDavid Wu break; 238ff86648dSDavid Wu case 1000: 239ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 240ff86648dSDavid Wu if (ret) 241ff86648dSDavid Wu return ret; 242ff86648dSDavid Wu break; 243ff86648dSDavid Wu default: 244ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 245ff86648dSDavid Wu return -EINVAL; 246ff86648dSDavid Wu } 247ff86648dSDavid Wu 248ff86648dSDavid Wu return 0; 249ff86648dSDavid Wu } 250ff86648dSDavid Wu 251491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 252491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 253af166ffaSDavid Wu { 2546f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 255af166ffaSDavid Wu struct rk322x_grf *grf; 256af166ffaSDavid Wu int clk; 257af166ffaSDavid Wu enum { 258af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 259af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 260af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 261af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 262af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 263491f3bfbSDavid Wu 264491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 265491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 266491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 267491f3bfbSDavid Wu 268491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 269491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 270491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 271af166ffaSDavid Wu }; 272af166ffaSDavid Wu 273af166ffaSDavid Wu switch (priv->phydev->speed) { 274af166ffaSDavid Wu case 10: 275491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 276491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 277491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 278af166ffaSDavid Wu break; 279af166ffaSDavid Wu case 100: 280491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 281491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 282491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 283af166ffaSDavid Wu break; 284af166ffaSDavid Wu case 1000: 285af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 286af166ffaSDavid Wu break; 287af166ffaSDavid Wu default: 288af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 289af166ffaSDavid Wu return -EINVAL; 290af166ffaSDavid Wu } 291af166ffaSDavid Wu 292af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 293491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 294491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 295491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 296491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 297491f3bfbSDavid Wu clk); 298af166ffaSDavid Wu 299af166ffaSDavid Wu return 0; 300af166ffaSDavid Wu } 301af166ffaSDavid Wu 302491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 303491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 3040125bcf0SSjoerd Simons { 3056f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 3060125bcf0SSjoerd Simons struct rk3288_grf *grf; 3070125bcf0SSjoerd Simons int clk; 3080125bcf0SSjoerd Simons 3090125bcf0SSjoerd Simons switch (priv->phydev->speed) { 3100125bcf0SSjoerd Simons case 10: 3111f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 3120125bcf0SSjoerd Simons break; 3130125bcf0SSjoerd Simons case 100: 3141f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 3150125bcf0SSjoerd Simons break; 3160125bcf0SSjoerd Simons case 1000: 3171f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3180125bcf0SSjoerd Simons break; 3190125bcf0SSjoerd Simons default: 3200125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3210125bcf0SSjoerd Simons return -EINVAL; 3220125bcf0SSjoerd Simons } 3230125bcf0SSjoerd Simons 3240125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3251f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3260125bcf0SSjoerd Simons 3270125bcf0SSjoerd Simons return 0; 3280125bcf0SSjoerd Simons } 3290125bcf0SSjoerd Simons 330491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 331491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 33223adb58fSDavid Wu { 3336f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 33423adb58fSDavid Wu struct rk3308_grf *grf; 33523adb58fSDavid Wu struct clk clk_speed; 33623adb58fSDavid Wu int speed, ret; 33723adb58fSDavid Wu enum { 33823adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 33923adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 34023adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 34123adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 34223adb58fSDavid Wu }; 34323adb58fSDavid Wu 34423adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 34523adb58fSDavid Wu &clk_speed); 34623adb58fSDavid Wu if (ret) 34723adb58fSDavid Wu return ret; 34823adb58fSDavid Wu 34923adb58fSDavid Wu switch (priv->phydev->speed) { 35023adb58fSDavid Wu case 10: 35123adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 35223adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 35323adb58fSDavid Wu if (ret) 35423adb58fSDavid Wu return ret; 35523adb58fSDavid Wu break; 35623adb58fSDavid Wu case 100: 35723adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 35823adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 35923adb58fSDavid Wu if (ret) 36023adb58fSDavid Wu return ret; 36123adb58fSDavid Wu break; 36223adb58fSDavid Wu default: 36323adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 36423adb58fSDavid Wu return -EINVAL; 36523adb58fSDavid Wu } 36623adb58fSDavid Wu 36723adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 36823adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 36923adb58fSDavid Wu 37023adb58fSDavid Wu return 0; 37123adb58fSDavid Wu } 37223adb58fSDavid Wu 373491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 374491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 375c36b26c0SDavid Wu { 3766f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 377c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 378c36b26c0SDavid Wu int clk; 379c36b26c0SDavid Wu enum { 380c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 381c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 382c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 383c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 384c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 385491f3bfbSDavid Wu 386491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 387491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 388491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 389491f3bfbSDavid Wu 390491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 391491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 392491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 393c36b26c0SDavid Wu }; 394c36b26c0SDavid Wu 395c36b26c0SDavid Wu switch (priv->phydev->speed) { 396c36b26c0SDavid Wu case 10: 397491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 398491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 399491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 400c36b26c0SDavid Wu break; 401c36b26c0SDavid Wu case 100: 402491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 403491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 404491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 405c36b26c0SDavid Wu break; 406c36b26c0SDavid Wu case 1000: 407c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 408c36b26c0SDavid Wu break; 409c36b26c0SDavid Wu default: 410c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 411c36b26c0SDavid Wu return -EINVAL; 412c36b26c0SDavid Wu } 413c36b26c0SDavid Wu 414c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 415491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 416491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 417491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 418491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 419491f3bfbSDavid Wu clk); 420c36b26c0SDavid Wu 421c36b26c0SDavid Wu return 0; 422c36b26c0SDavid Wu } 423c36b26c0SDavid Wu 424491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 425491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 426793f2fd2SPhilipp Tomsich { 4276f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 428793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 429793f2fd2SPhilipp Tomsich int clk; 430793f2fd2SPhilipp Tomsich enum { 431793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 432793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 433793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 434793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 435793f2fd2SPhilipp Tomsich }; 436793f2fd2SPhilipp Tomsich 437793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 438793f2fd2SPhilipp Tomsich case 10: 439793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 440793f2fd2SPhilipp Tomsich break; 441793f2fd2SPhilipp Tomsich case 100: 442793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 443793f2fd2SPhilipp Tomsich break; 444793f2fd2SPhilipp Tomsich case 1000: 445793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 446793f2fd2SPhilipp Tomsich break; 447793f2fd2SPhilipp Tomsich default: 448793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 449793f2fd2SPhilipp Tomsich return -EINVAL; 450793f2fd2SPhilipp Tomsich } 451793f2fd2SPhilipp Tomsich 452793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 453793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 454793f2fd2SPhilipp Tomsich 455793f2fd2SPhilipp Tomsich return 0; 456793f2fd2SPhilipp Tomsich } 457793f2fd2SPhilipp Tomsich 458491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 459491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4601f08aa1cSPhilipp Tomsich { 4616f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4621f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4631f08aa1cSPhilipp Tomsich int clk; 4641f08aa1cSPhilipp Tomsich 4651f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4661f08aa1cSPhilipp Tomsich case 10: 4671f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4681f08aa1cSPhilipp Tomsich break; 4691f08aa1cSPhilipp Tomsich case 100: 4701f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4711f08aa1cSPhilipp Tomsich break; 4721f08aa1cSPhilipp Tomsich case 1000: 4731f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4741f08aa1cSPhilipp Tomsich break; 4751f08aa1cSPhilipp Tomsich default: 4761f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4771f08aa1cSPhilipp Tomsich return -EINVAL; 4781f08aa1cSPhilipp Tomsich } 4791f08aa1cSPhilipp Tomsich 4801f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4811f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4821f08aa1cSPhilipp Tomsich 4831f08aa1cSPhilipp Tomsich return 0; 4841f08aa1cSPhilipp Tomsich } 4851f08aa1cSPhilipp Tomsich 486491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 487491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4880a33ce65SDavid Wu { 4896f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4900a33ce65SDavid Wu struct rv1108_grf *grf; 4910a33ce65SDavid Wu int clk, speed; 4920a33ce65SDavid Wu enum { 4930a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4940a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4950a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4960a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4970a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4980a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4990a33ce65SDavid Wu }; 5000a33ce65SDavid Wu 5010a33ce65SDavid Wu switch (priv->phydev->speed) { 5020a33ce65SDavid Wu case 10: 5030a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 5040a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 5050a33ce65SDavid Wu break; 5060a33ce65SDavid Wu case 100: 5070a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 5080a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 5090a33ce65SDavid Wu break; 5100a33ce65SDavid Wu default: 5110a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 5120a33ce65SDavid Wu return -EINVAL; 5130a33ce65SDavid Wu } 5140a33ce65SDavid Wu 5150a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5160a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 5170a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5180a33ce65SDavid Wu clk | speed); 5190a33ce65SDavid Wu 5200a33ce65SDavid Wu return 0; 5210a33ce65SDavid Wu } 522dcfb333aSDavid Wu #else 523c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 524c563400aSDavid Wu struct rockchip_eth_dev *dev) 525c563400aSDavid Wu { 526c563400aSDavid Wu struct eqos_priv *priv = &dev->eqos; 527c563400aSDavid Wu struct rk3528_grf *grf; 528c563400aSDavid Wu unsigned int div; 529c563400aSDavid Wu 530c563400aSDavid Wu enum { 531c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3, 532c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3), 533c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3), 534c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV20 = 0, 535c563400aSDavid Wu }; 536c563400aSDavid Wu 537c563400aSDavid Wu enum { 538c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10, 539c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10), 540c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV1 = 0, 541c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10), 542c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11), 543c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11), 544c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_DIV20 = 0, 545c563400aSDavid Wu }; 546c563400aSDavid Wu 547c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 548c563400aSDavid Wu 549c563400aSDavid Wu switch (priv->phy->speed) { 550c563400aSDavid Wu case 10: 551c563400aSDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 552c563400aSDavid Wu div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 : 553c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV20; 554c563400aSDavid Wu else 555c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV50; 556c563400aSDavid Wu break; 557c563400aSDavid Wu case 100: 558c563400aSDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 559c563400aSDavid Wu div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 : 560c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV2; 561c563400aSDavid Wu else 562c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV5; 563c563400aSDavid Wu break; 564c563400aSDavid Wu case 1000: 565c563400aSDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 566c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV1; 567c563400aSDavid Wu else 568c563400aSDavid Wu return -EINVAL; 569c563400aSDavid Wu break; 570c563400aSDavid Wu default: 571c563400aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 572c563400aSDavid Wu return -EINVAL; 573c563400aSDavid Wu } 574c563400aSDavid Wu 575c563400aSDavid Wu if (pdata->bus_id) 576c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div); 577c563400aSDavid Wu else 578c563400aSDavid Wu rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div); 579c563400aSDavid Wu 580c563400aSDavid Wu return 0; 581c563400aSDavid Wu } 582c563400aSDavid Wu 58383f30531SDavid Wu static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata, 58483f30531SDavid Wu struct rockchip_eth_dev *dev) 58583f30531SDavid Wu { 58683f30531SDavid Wu struct eqos_priv *priv = &dev->eqos; 58783f30531SDavid Wu struct rk3562_grf *grf; 58883f30531SDavid Wu unsigned int div; 58983f30531SDavid Wu 59083f30531SDavid Wu enum { 59183f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7, 59283f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7), 59383f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV1 = 0, 59483f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7), 59583f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8), 59683f30531SDavid Wu RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7), 59783f30531SDavid Wu RK3562_GMAC0_CLK_RMII_DIV20 = 0, 59883f30531SDavid Wu }; 59983f30531SDavid Wu 60083f30531SDavid Wu enum { 60183f30531SDavid Wu RK3562_GMAC1_SPEED_SHIFT = 0x0, 60283f30531SDavid Wu RK3562_GMAC1_SPEED_MASK = BIT(0), 60383f30531SDavid Wu RK3562_GMAC1_SPEED_10M = 0, 60483f30531SDavid Wu RK3562_GMAC1_SPEED_100M = BIT(0), 60583f30531SDavid Wu }; 60683f30531SDavid Wu 60783f30531SDavid Wu enum { 60883f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13, 60983f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13), 61083f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13), 61183f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV20 = 0, 61283f30531SDavid Wu }; 61383f30531SDavid Wu 61483f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 61583f30531SDavid Wu 61683f30531SDavid Wu switch (priv->phy->speed) { 61783f30531SDavid Wu case 10: 61883f30531SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { 61983f30531SDavid Wu if (pdata->bus_id > 0) { 62083f30531SDavid Wu div = RK3562_GMAC1_CLK_RMII_DIV20; 62183f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], 62283f30531SDavid Wu RK3562_GMAC1_SPEED_MASK, 62383f30531SDavid Wu RK3562_GMAC1_SPEED_10M); 62483f30531SDavid Wu } else { 62583f30531SDavid Wu div = RK3562_GMAC0_CLK_RMII_DIV20; 62683f30531SDavid Wu } 62783f30531SDavid Wu } else { 62883f30531SDavid Wu div = RK3562_GMAC0_CLK_RGMII_DIV50; 62983f30531SDavid Wu } 63083f30531SDavid Wu break; 63183f30531SDavid Wu case 100: 63283f30531SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { 63383f30531SDavid Wu if (pdata->bus_id > 0) { 63483f30531SDavid Wu div = RK3562_GMAC1_CLK_RMII_DIV2; 63583f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], 63683f30531SDavid Wu RK3562_GMAC1_SPEED_MASK, 63783f30531SDavid Wu RK3562_GMAC1_SPEED_100M); 63883f30531SDavid Wu } else { 63983f30531SDavid Wu div = RK3562_GMAC0_CLK_RMII_DIV2; 64083f30531SDavid Wu } 64183f30531SDavid Wu } else { 64283f30531SDavid Wu div = RK3562_GMAC0_CLK_RGMII_DIV5; 64383f30531SDavid Wu } 64483f30531SDavid Wu break; 64583f30531SDavid Wu case 1000: 64683f30531SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 64783f30531SDavid Wu div = RK3562_GMAC0_CLK_RGMII_DIV1; 64883f30531SDavid Wu else 64983f30531SDavid Wu return -EINVAL; 65083f30531SDavid Wu break; 65183f30531SDavid Wu default: 65283f30531SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 65383f30531SDavid Wu return -EINVAL; 65483f30531SDavid Wu } 65583f30531SDavid Wu 65683f30531SDavid Wu if (pdata->bus_id) 65783f30531SDavid Wu rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div); 65883f30531SDavid Wu else 65983f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div); 66083f30531SDavid Wu 66183f30531SDavid Wu return 0; 66283f30531SDavid Wu } 66383f30531SDavid Wu 664bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 665bf0e94d0SDavid Wu struct rockchip_eth_dev *dev) 666bf0e94d0SDavid Wu { 667bf0e94d0SDavid Wu struct eqos_priv *priv = &dev->eqos; 668bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 669bf0e94d0SDavid Wu unsigned int div, div_mask; 670bf0e94d0SDavid Wu 671bf0e94d0SDavid Wu enum { 672bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 673bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 674bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV1 = 0, 675a116113dSDavid Wu RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 676bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 6776d863a16SDavid Wu RK3588_GMAC_CLK_RMII_DIV2 = BIT(2), 678bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_DIV20 = 0, 6796d863a16SDavid Wu RK3588_GMAC1_ID_SHIFT = 5, 680bf0e94d0SDavid Wu }; 681bf0e94d0SDavid Wu 682bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 683bf0e94d0SDavid Wu 684bf0e94d0SDavid Wu switch (priv->phy->speed) { 685bf0e94d0SDavid Wu case 10: 686bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 687bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV20; 688bf0e94d0SDavid Wu else 689bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV50; 690bf0e94d0SDavid Wu break; 691bf0e94d0SDavid Wu case 100: 692bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 6936d863a16SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV2; 694bf0e94d0SDavid Wu else 695bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV5; 696bf0e94d0SDavid Wu break; 697bf0e94d0SDavid Wu case 1000: 698bf0e94d0SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 699bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV1; 700bf0e94d0SDavid Wu else 701bf0e94d0SDavid Wu return -EINVAL; 702bf0e94d0SDavid Wu break; 703bf0e94d0SDavid Wu default: 704bf0e94d0SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 705bf0e94d0SDavid Wu return -EINVAL; 706bf0e94d0SDavid Wu } 707bf0e94d0SDavid Wu 708bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 709bf0e94d0SDavid Wu div <<= 5; 710bf0e94d0SDavid Wu div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 711bf0e94d0SDavid Wu } 712bf0e94d0SDavid Wu 7136d863a16SDavid Wu div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0; 7146d863a16SDavid Wu div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) : 7156d863a16SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK; 7166d863a16SDavid Wu 717bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 718bf0e94d0SDavid Wu 719bf0e94d0SDavid Wu return 0; 720bf0e94d0SDavid Wu } 721bf0e94d0SDavid Wu 72220bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 72320bef841SDavid Wu struct rockchip_eth_dev *dev) 72420bef841SDavid Wu { 72520bef841SDavid Wu struct eqos_priv *priv = &dev->eqos; 726*745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B 727*745dad46SDavid Wu struct rv1103b_grf *grf; 728*745dad46SDavid Wu #else 72920bef841SDavid Wu struct rv1106_grf *grf; 730*745dad46SDavid Wu #endif 73120bef841SDavid Wu unsigned int div; 73220bef841SDavid Wu 73320bef841SDavid Wu enum { 73420bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 73520bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 73620bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 73720bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV20 = 0, 73820bef841SDavid Wu }; 73920bef841SDavid Wu 74020bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 74120bef841SDavid Wu 74220bef841SDavid Wu switch (priv->phy->speed) { 74320bef841SDavid Wu case 10: 74420bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV20; 74520bef841SDavid Wu break; 74620bef841SDavid Wu case 100: 74720bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV2; 74820bef841SDavid Wu break; 74920bef841SDavid Wu default: 75020bef841SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 75120bef841SDavid Wu return -EINVAL; 75220bef841SDavid Wu } 75320bef841SDavid Wu 75420bef841SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 75520bef841SDavid Wu 75620bef841SDavid Wu return 0; 75720bef841SDavid Wu } 75820bef841SDavid Wu 759491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 760491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 761dcfb333aSDavid Wu { 762dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 763dcfb333aSDavid Wu struct clk clk_speed; 764dcfb333aSDavid Wu int ret; 765dcfb333aSDavid Wu 766dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 767dcfb333aSDavid Wu &clk_speed); 768dcfb333aSDavid Wu if (ret) { 76933a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 77033a014bdSDavid Wu __func__, ret); 771dcfb333aSDavid Wu return ret; 772dcfb333aSDavid Wu } 773dcfb333aSDavid Wu 774dcfb333aSDavid Wu switch ( priv->phy->speed) { 775dcfb333aSDavid Wu case 10: 776dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 777dcfb333aSDavid Wu if (ret) 778dcfb333aSDavid Wu return ret; 779dcfb333aSDavid Wu break; 780dcfb333aSDavid Wu case 100: 781dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 782dcfb333aSDavid Wu if (ret) 783dcfb333aSDavid Wu return ret; 784dcfb333aSDavid Wu break; 785dcfb333aSDavid Wu case 1000: 786dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 787dcfb333aSDavid Wu if (ret) 788dcfb333aSDavid Wu return ret; 789dcfb333aSDavid Wu break; 790dcfb333aSDavid Wu default: 791dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 792dcfb333aSDavid Wu return -EINVAL; 793dcfb333aSDavid Wu } 794dcfb333aSDavid Wu 795dcfb333aSDavid Wu return 0; 796dcfb333aSDavid Wu } 7976f0a52e9SDavid Wu #endif 7980a33ce65SDavid Wu 7996f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 80018ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 80118ae91c8SDavid Wu { 80218ae91c8SDavid Wu struct px30_grf *grf; 80318ae91c8SDavid Wu enum { 80418ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 80518ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 80618ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 80718ae91c8SDavid Wu }; 80818ae91c8SDavid Wu 80918ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 81018ae91c8SDavid Wu 81118ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 81218ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 81318ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 81418ae91c8SDavid Wu } 81518ae91c8SDavid Wu 816ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 817ff86648dSDavid Wu { 818ff86648dSDavid Wu struct rk1808_grf *grf; 819ff86648dSDavid Wu enum { 820ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 821ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 822ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 823ff86648dSDavid Wu 824ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 825ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 826ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 827ff86648dSDavid Wu 828ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 829ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 830ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 831ff86648dSDavid Wu }; 832ff86648dSDavid Wu enum { 833ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 834ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 835ff86648dSDavid Wu 836ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 837ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 838ff86648dSDavid Wu }; 839ff86648dSDavid Wu 840ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 841ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 842ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 843ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 844ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 845ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 846ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 847ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 848ff86648dSDavid Wu 849ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 850ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 851ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 852c5bdc99aSJianqun Xu (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) | 853c5bdc99aSJianqun Xu (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT)); 854ff86648dSDavid Wu } 855ff86648dSDavid Wu 856af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 857af166ffaSDavid Wu { 858af166ffaSDavid Wu struct rk322x_grf *grf; 859af166ffaSDavid Wu enum { 860af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 861af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 862af166ffaSDavid Wu 863af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 864af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 865af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 866af166ffaSDavid Wu 867af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 868af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 869af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 870af166ffaSDavid Wu 871af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 872af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 873af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 874af166ffaSDavid Wu }; 875af166ffaSDavid Wu enum { 876af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 877af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 878af166ffaSDavid Wu 879af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 880af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 881af166ffaSDavid Wu }; 882af166ffaSDavid Wu 883af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 884af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 885af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 886af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 887af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 888af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 889af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 890af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 891af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 892af166ffaSDavid Wu 893af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 894af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 895af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 896af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 897af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 898af166ffaSDavid Wu } 899af166ffaSDavid Wu 900491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 901491f3bfbSDavid Wu { 902491f3bfbSDavid Wu struct rk322x_grf *grf; 903491f3bfbSDavid Wu enum { 904491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 905491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 906491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 907491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 908491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 909491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 910491f3bfbSDavid Wu }; 911491f3bfbSDavid Wu 912491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 913491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 914491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 915491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 916491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 917491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 918491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 919491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 920491f3bfbSDavid Wu } 921491f3bfbSDavid Wu 9221f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 9231f08aa1cSPhilipp Tomsich { 9241f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 9251f08aa1cSPhilipp Tomsich 9261f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9271f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 9281f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 9291f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 9301f08aa1cSPhilipp Tomsich 9311f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 9321f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 9331f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 9341f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 9351f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 9361f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 9371f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 9381f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 9391f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 9401f08aa1cSPhilipp Tomsich } 9411f08aa1cSPhilipp Tomsich 94223adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 94323adb58fSDavid Wu { 94423adb58fSDavid Wu struct rk3308_grf *grf; 94523adb58fSDavid Wu enum { 94623adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 94723adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 94823adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 94923adb58fSDavid Wu }; 95023adb58fSDavid Wu 95123adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 95223adb58fSDavid Wu 95323adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 95423adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 95523adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 95623adb58fSDavid Wu } 95723adb58fSDavid Wu 958c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 959c36b26c0SDavid Wu { 960c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 961c36b26c0SDavid Wu enum { 962c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 963c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 964c36b26c0SDavid Wu 965c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 966c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 967c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 968c36b26c0SDavid Wu 969c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 970c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 971c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 972c36b26c0SDavid Wu 973c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 974c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 975c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 976c36b26c0SDavid Wu }; 977c36b26c0SDavid Wu enum { 978c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 979c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 980c36b26c0SDavid Wu 981c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 982c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 983c36b26c0SDavid Wu }; 984c36b26c0SDavid Wu 985c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 986c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 987c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 988c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 989c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 990c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 991c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 992c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 993c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 994c36b26c0SDavid Wu 995c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 996c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 997c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 998c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 999c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 1000c36b26c0SDavid Wu } 1001c36b26c0SDavid Wu 1002491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1003491f3bfbSDavid Wu { 1004491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1005491f3bfbSDavid Wu enum { 1006491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 1007491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 1008491f3bfbSDavid Wu 1009491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1010491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1011491f3bfbSDavid Wu }; 1012491f3bfbSDavid Wu 1013491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1014491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 1015491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 1016491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 1017491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 1018491f3bfbSDavid Wu RK3328_RMII_MODE); 1019491f3bfbSDavid Wu } 1020491f3bfbSDavid Wu 1021793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1022793f2fd2SPhilipp Tomsich { 1023793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 1024793f2fd2SPhilipp Tomsich enum { 1025793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 1026793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 1027793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 1028793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 1029793f2fd2SPhilipp Tomsich }; 1030793f2fd2SPhilipp Tomsich enum { 1031793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 1032793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1033793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 1034793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 1035793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1036793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 1037793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 1038793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1039793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 1040793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1041793f2fd2SPhilipp Tomsich }; 1042793f2fd2SPhilipp Tomsich 1043793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1044793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 1045793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 1046793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 1047793f2fd2SPhilipp Tomsich 1048793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 1049793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 1050793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 1051793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 1052793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 1053793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 1054793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 1055c5bdc99aSJianqun Xu (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) | 1056c5bdc99aSJianqun Xu (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT)); 1057793f2fd2SPhilipp Tomsich } 1058793f2fd2SPhilipp Tomsich 10591f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 10601f08aa1cSPhilipp Tomsich { 10611f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 10621f08aa1cSPhilipp Tomsich 10631f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 10641f08aa1cSPhilipp Tomsich 10651f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 10661f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 10671f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 10681f08aa1cSPhilipp Tomsich 10691f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 10701f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 10711f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 10721f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 10731f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 10741f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 10751f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 1076c5bdc99aSJianqun Xu (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) | 1077c5bdc99aSJianqun Xu (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT)); 10781f08aa1cSPhilipp Tomsich } 10791f08aa1cSPhilipp Tomsich 10800a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 10810a33ce65SDavid Wu { 10820a33ce65SDavid Wu struct rv1108_grf *grf; 10830a33ce65SDavid Wu 10840a33ce65SDavid Wu enum { 10850a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 10860a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 10870a33ce65SDavid Wu }; 10880a33ce65SDavid Wu 10890a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 10900a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 10910a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 10920a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 10930a33ce65SDavid Wu } 1094491f3bfbSDavid Wu 1095491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1096491f3bfbSDavid Wu { 1097491f3bfbSDavid Wu struct rk322x_grf *grf; 1098491f3bfbSDavid Wu enum { 1099491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 1100491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 1101491f3bfbSDavid Wu }; 1102491f3bfbSDavid Wu enum { 1103491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1104491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 1105491f3bfbSDavid Wu 1106491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1107491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 1108491f3bfbSDavid Wu 1109491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 1110491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 1111491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 1112491f3bfbSDavid Wu }; 1113491f3bfbSDavid Wu enum { 1114491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1115491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 1116491f3bfbSDavid Wu }; 1117491f3bfbSDavid Wu enum { 1118491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1119491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 1120491f3bfbSDavid Wu }; 1121491f3bfbSDavid Wu 1122491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1123491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 1124491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 1125491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 1126491f3bfbSDavid Wu 1127491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1128491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 1129491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 1130491f3bfbSDavid Wu 1131491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1132491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 1133491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 1134491f3bfbSDavid Wu 1135491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1136491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1137491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 1138491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 1139491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1140491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 1141491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 1142491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 1143491f3bfbSDavid Wu 1144491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1145491f3bfbSDavid Wu udelay(10); 1146491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1147491f3bfbSDavid Wu udelay(10); 1148491f3bfbSDavid Wu 1149491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1150491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1151491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 1152491f3bfbSDavid Wu udelay(30 * 1000); 1153491f3bfbSDavid Wu } 1154491f3bfbSDavid Wu 1155491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1156491f3bfbSDavid Wu { 1157491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1158491f3bfbSDavid Wu enum { 1159491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1160491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 1161491f3bfbSDavid Wu }; 1162491f3bfbSDavid Wu enum { 1163491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1164491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1165491f3bfbSDavid Wu 1166491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1167491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 1168491f3bfbSDavid Wu 1169491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 1170491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 1171491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 1172491f3bfbSDavid Wu }; 1173491f3bfbSDavid Wu enum { 1174491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1175491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1176491f3bfbSDavid Wu }; 1177491f3bfbSDavid Wu enum { 1178491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1179491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1180491f3bfbSDavid Wu }; 1181491f3bfbSDavid Wu 1182491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1183491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 1184491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 1185491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 1186491f3bfbSDavid Wu 1187491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1188491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1189491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 1190491f3bfbSDavid Wu 1191491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1192491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1193491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 1194491f3bfbSDavid Wu 1195491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1196491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1197491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 1198491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 1199491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1200491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 1201491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 1202491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 1203491f3bfbSDavid Wu 1204491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1205491f3bfbSDavid Wu udelay(10); 1206491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1207491f3bfbSDavid Wu udelay(10); 1208491f3bfbSDavid Wu 1209491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1210491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1211491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 1212491f3bfbSDavid Wu udelay(30 * 1000); 1213491f3bfbSDavid Wu } 1214491f3bfbSDavid Wu 1215dcfb333aSDavid Wu #else 1216c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1217c563400aSDavid Wu { 1218c563400aSDavid Wu struct rk3528_grf *grf; 1219c563400aSDavid Wu unsigned char bgs[1] = {0}; 1220c563400aSDavid Wu 1221c563400aSDavid Wu enum { 1222c563400aSDavid Wu RK3528_MACPHY_ENABLE_MASK = BIT(1), 1223c563400aSDavid Wu RK3528_MACPHY_DISENABLE = BIT(1), 1224c563400aSDavid Wu RK3528_MACPHY_ENABLE = 0, 1225c563400aSDavid Wu RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 1226c563400aSDavid Wu RK3528_MACPHY_XMII_SEL = BIT(6), 1227c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 1228c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 1229c563400aSDavid Wu RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 1230c563400aSDavid Wu RK3528_MACPHY_PHY_ID = BIT(11), 1231c563400aSDavid Wu }; 1232c563400aSDavid Wu 1233c563400aSDavid Wu enum { 1234c563400aSDavid Wu RK3528_MACPHY_BGS_MASK = GENMASK(3, 0), 1235c563400aSDavid Wu }; 1236c563400aSDavid Wu 1237c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1238c563400aSDavid Wu struct udevice *dev; 1239c563400aSDavid Wu u32 regs[2] = {0}; 1240c563400aSDavid Wu ofnode node; 1241c563400aSDavid Wu int ret = 0; 1242c563400aSDavid Wu 1243c563400aSDavid Wu /* retrieve the device */ 1244c563400aSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1245c563400aSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1246c563400aSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1247c563400aSDavid Wu &dev); 1248c563400aSDavid Wu else 1249c563400aSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1250c563400aSDavid Wu DM_GET_DRIVER(rockchip_otp), 1251c563400aSDavid Wu &dev); 1252c563400aSDavid Wu if (!ret) { 1253c563400aSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1254c563400aSDavid Wu if (ofnode_valid(node)) { 1255c563400aSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1256c563400aSDavid Wu /* read the bgs from the efuses */ 1257c563400aSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1258c563400aSDavid Wu if (ret) { 1259c563400aSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1260c563400aSDavid Wu ret); 1261c563400aSDavid Wu bgs[0] = 0; 1262c563400aSDavid Wu } 1263c563400aSDavid Wu } 1264c563400aSDavid Wu } 1265c563400aSDavid Wu } 1266c563400aSDavid Wu #endif 1267c563400aSDavid Wu 1268c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1269c563400aSDavid Wu 1270c563400aSDavid Wu reset_assert(&pdata->phy_reset); 1271c563400aSDavid Wu udelay(20); 1272c563400aSDavid Wu rk_clrsetreg(&grf->macphy_con0, 1273c563400aSDavid Wu RK3528_MACPHY_ENABLE_MASK | 1274c563400aSDavid Wu RK3528_MACPHY_XMII_SEL_MASK | 1275c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_MASK | 1276c563400aSDavid Wu RK3528_MACPHY_PHY_ID_MASK, 1277c563400aSDavid Wu RK3528_MACPHY_ENABLE | 1278c563400aSDavid Wu RK3528_MACPHY_XMII_SEL | 1279c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_24M | 1280c563400aSDavid Wu RK3528_MACPHY_PHY_ID); 1281c563400aSDavid Wu 1282c563400aSDavid Wu rk_clrsetreg(&grf->macphy_con1, 1283c563400aSDavid Wu RK3528_MACPHY_BGS_MASK, 1284c563400aSDavid Wu bgs[0]); 1285c563400aSDavid Wu udelay(20); 1286c563400aSDavid Wu reset_deassert(&pdata->phy_reset); 1287c563400aSDavid Wu udelay(30 * 1000); 1288c563400aSDavid Wu } 1289c563400aSDavid Wu 1290c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1291c563400aSDavid Wu { 1292c563400aSDavid Wu unsigned int clk_mode; 1293c563400aSDavid Wu struct rk3528_grf *grf; 1294c563400aSDavid Wu 1295c563400aSDavid Wu enum { 1296c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1, 1297c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1), 1298c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE = 0x1, 1299c563400aSDavid Wu }; 1300c563400aSDavid Wu 1301c563400aSDavid Wu enum { 1302c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8, 1303c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8), 1304c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE = 0x1, 1305c563400aSDavid Wu }; 1306c563400aSDavid Wu 1307c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1308c563400aSDavid Wu 1309c563400aSDavid Wu if (pdata->bus_id == 1) { 1310c563400aSDavid Wu clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT; 1311c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode); 1312c563400aSDavid Wu } else { 1313c563400aSDavid Wu clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT; 1314c563400aSDavid Wu rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode); 1315c563400aSDavid Wu } 1316c563400aSDavid Wu } 1317c563400aSDavid Wu 1318c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1319c563400aSDavid Wu { 1320c563400aSDavid Wu unsigned int rx_enable; 1321c563400aSDavid Wu unsigned int rx_delay; 1322c563400aSDavid Wu struct rk3528_grf *grf; 1323c563400aSDavid Wu 1324c563400aSDavid Wu enum { 1325c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8, 1326c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_MASK = BIT(8), 1327c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE = 0x0, 1328c563400aSDavid Wu 1329c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14), 1330c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0, 1331c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14), 1332c563400aSDavid Wu 1333c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15), 1334c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0, 1335c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15), 1336c563400aSDavid Wu }; 1337c563400aSDavid Wu 1338c563400aSDavid Wu enum { 1339c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8, 1340c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8), 1341c563400aSDavid Wu 1342c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0, 1343c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0), 1344c563400aSDavid Wu }; 1345c563400aSDavid Wu 1346c563400aSDavid Wu if (!pdata->bus_id) 1347c563400aSDavid Wu return; 1348c563400aSDavid Wu 1349c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1350c563400aSDavid Wu 1351c563400aSDavid Wu if (pdata->rx_delay < 0) { 1352c563400aSDavid Wu rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE; 1353c563400aSDavid Wu rx_delay = 0; 1354c563400aSDavid Wu } else { 1355c563400aSDavid Wu rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE; 1356c563400aSDavid Wu rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT; 1357c563400aSDavid Wu } 1358c563400aSDavid Wu 1359c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, 1360c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_MASK | 1361c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_MASK | 1362c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_MASK, 1363c563400aSDavid Wu rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE | 1364c563400aSDavid Wu (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT)); 1365c563400aSDavid Wu 1366c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con1, 1367c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_MASK | 1368c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_MASK, 1369c563400aSDavid Wu (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) | 1370c563400aSDavid Wu rx_delay); 1371c563400aSDavid Wu } 1372c563400aSDavid Wu 137383f30531SDavid Wu static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata) 137483f30531SDavid Wu { 137583f30531SDavid Wu struct rk3562_grf *grf; 137683f30531SDavid Wu unsigned int mode; 137783f30531SDavid Wu 137883f30531SDavid Wu enum { 137983f30531SDavid Wu RK3562_GMAC0_RMII_MODE_SHIFT = 0x5, 138083f30531SDavid Wu RK3562_GMAC0_RMII_MODE_MASK = BIT(5), 138183f30531SDavid Wu RK3562_GMAC0_RMII_MODE = 0x1, 138283f30531SDavid Wu }; 138383f30531SDavid Wu 138483f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 138583f30531SDavid Wu 138683f30531SDavid Wu if (!pdata->bus_id) { 138783f30531SDavid Wu mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT; 138883f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode); 138983f30531SDavid Wu } 139083f30531SDavid Wu } 139183f30531SDavid Wu 139283f30531SDavid Wu static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 139383f30531SDavid Wu { 139483f30531SDavid Wu struct rk3562_grf *grf; 139583f30531SDavid Wu struct rk3562_ioc *ioc; 139683f30531SDavid Wu unsigned int rx_enable; 139783f30531SDavid Wu unsigned int rx_delay; 139883f30531SDavid Wu 139983f30531SDavid Wu enum { 140083f30531SDavid Wu RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5, 140183f30531SDavid Wu RK3562_GMAC0_RGMII_MODE_MASK = BIT(5), 140283f30531SDavid Wu RK3562_GMAC0_RGMII_MODE = 0x0, 140383f30531SDavid Wu 140483f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0), 140583f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0, 140683f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0), 140783f30531SDavid Wu 140883f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1), 140983f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0, 141083f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1), 141183f30531SDavid Wu }; 141283f30531SDavid Wu 141383f30531SDavid Wu enum { 141483f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8, 141583f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8), 141683f30531SDavid Wu 141783f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0, 141883f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0), 141983f30531SDavid Wu }; 142083f30531SDavid Wu 142183f30531SDavid Wu if (pdata->bus_id) 142283f30531SDavid Wu return; 142383f30531SDavid Wu 142483f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 142583f30531SDavid Wu ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); 142683f30531SDavid Wu 142783f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK, 142883f30531SDavid Wu RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT); 142983f30531SDavid Wu 143083f30531SDavid Wu if (pdata->rx_delay < 0) { 143183f30531SDavid Wu rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE; 143283f30531SDavid Wu rx_delay = 0; 143383f30531SDavid Wu } else { 143483f30531SDavid Wu rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE; 143583f30531SDavid Wu rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT; 143683f30531SDavid Wu } 143783f30531SDavid Wu 143883f30531SDavid Wu rk_clrsetreg(&ioc->mac0_io_con1, 143983f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_MASK | 144083f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_MASK, 144183f30531SDavid Wu rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); 144283f30531SDavid Wu 144383f30531SDavid Wu rk_clrsetreg(&ioc->mac0_io_con0, 144483f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_MASK | 144583f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_MASK, 144683f30531SDavid Wu (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | 144783f30531SDavid Wu rx_delay); 144883f30531SDavid Wu 144983f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con1, 145083f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_MASK | 145183f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_MASK, 145283f30531SDavid Wu rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); 145383f30531SDavid Wu 145483f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con0, 145583f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_MASK | 145683f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_MASK, 145783f30531SDavid Wu (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | 145883f30531SDavid Wu rx_delay); 145983f30531SDavid Wu } 146083f30531SDavid Wu 146133a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 146233a014bdSDavid Wu { 146333a014bdSDavid Wu struct rk3568_grf *grf; 146433a014bdSDavid Wu void *con1; 146533a014bdSDavid Wu 146633a014bdSDavid Wu enum { 146733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 146833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 146933a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 147033a014bdSDavid Wu }; 147133a014bdSDavid Wu 147233a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 147333a014bdSDavid Wu 147433a014bdSDavid Wu if (pdata->bus_id == 1) 147533a014bdSDavid Wu con1 = &grf->mac1_con1; 147633a014bdSDavid Wu else 147733a014bdSDavid Wu con1 = &grf->mac0_con1; 147833a014bdSDavid Wu 147933a014bdSDavid Wu rk_clrsetreg(con1, 148033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 148133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 148233a014bdSDavid Wu } 148333a014bdSDavid Wu 148433a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 148533a014bdSDavid Wu { 148633a014bdSDavid Wu struct rk3568_grf *grf; 148733a014bdSDavid Wu void *con0, *con1; 148833a014bdSDavid Wu 148933a014bdSDavid Wu enum { 149033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 149133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 149233a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 149333a014bdSDavid Wu 149433a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 149533a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 149633a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 149733a014bdSDavid Wu 149833a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 149933a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 150033a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 150133a014bdSDavid Wu }; 150233a014bdSDavid Wu 150333a014bdSDavid Wu enum { 150433a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 150533a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 150633a014bdSDavid Wu 150733a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 150833a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 150933a014bdSDavid Wu }; 151033a014bdSDavid Wu 151133a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 151233a014bdSDavid Wu 151333a014bdSDavid Wu if (pdata->bus_id == 1) { 151433a014bdSDavid Wu con0 = &grf->mac1_con0; 151533a014bdSDavid Wu con1 = &grf->mac1_con1; 151633a014bdSDavid Wu } else { 151733a014bdSDavid Wu con0 = &grf->mac0_con0; 151833a014bdSDavid Wu con1 = &grf->mac0_con1; 151933a014bdSDavid Wu } 152033a014bdSDavid Wu 152133a014bdSDavid Wu rk_clrsetreg(con0, 152233a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 152333a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 1524c5bdc99aSJianqun Xu (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) | 1525c5bdc99aSJianqun Xu (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT)); 152633a014bdSDavid Wu 152733a014bdSDavid Wu rk_clrsetreg(con1, 152833a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 152933a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 153033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 153133a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 153233a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 153333a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 153433a014bdSDavid Wu } 153533a014bdSDavid Wu 1536bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1537bf0e94d0SDavid Wu { 1538bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1539bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1540bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1541bf0e94d0SDavid Wu 1542bf0e94d0SDavid Wu enum { 1543bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1544bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1545bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1546bf0e94d0SDavid Wu }; 1547bf0e94d0SDavid Wu 1548bf0e94d0SDavid Wu enum { 1549bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1550bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1551bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE = 0x1, 1552bf0e94d0SDavid Wu }; 1553bf0e94d0SDavid Wu 1554bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1555bf0e94d0SDavid Wu 1556bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1557bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1558bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1559bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1560bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1561bf0e94d0SDavid Wu } else { 1562bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1563bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1564bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1565bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1566bf0e94d0SDavid Wu } 1567bf0e94d0SDavid Wu 1568bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1569bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1570bf0e94d0SDavid Wu } 1571bf0e94d0SDavid Wu 1572bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1573bf0e94d0SDavid Wu { 1574bf0e94d0SDavid Wu unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1575bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1576bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1577bf0e94d0SDavid Wu unsigned int rx_delay; 1578bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1579bf0e94d0SDavid Wu struct rk3588_sys_grf *grf; 1580bf0e94d0SDavid Wu void *offset_con; 1581bf0e94d0SDavid Wu 1582bf0e94d0SDavid Wu enum { 1583bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1584bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1585bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1586bf0e94d0SDavid Wu 1587bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1588bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1589bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1590bf0e94d0SDavid Wu 1591bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1592bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1593bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1594bf0e94d0SDavid Wu }; 1595bf0e94d0SDavid Wu 1596bf0e94d0SDavid Wu enum { 1597bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1598bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1599bf0e94d0SDavid Wu 1600bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1601bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1602bf0e94d0SDavid Wu }; 1603bf0e94d0SDavid Wu 1604bf0e94d0SDavid Wu enum { 1605bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1606bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1607bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1608bf0e94d0SDavid Wu }; 1609bf0e94d0SDavid Wu 1610bf0e94d0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1611bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1612bf0e94d0SDavid Wu 1613bf0e94d0SDavid Wu if (pdata->rx_delay < 0) { 1614bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1615bf0e94d0SDavid Wu rx_delay = 0; 1616bf0e94d0SDavid Wu } else { 1617bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1618bf0e94d0SDavid Wu rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1619bf0e94d0SDavid Wu } 1620bf0e94d0SDavid Wu 1621bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1622bf0e94d0SDavid Wu offset_con = &grf->soc_con9; 1623bf0e94d0SDavid Wu rx_enable = rx_delay << 2; 1624bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1625bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1626bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1627bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1628bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1629bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1630bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1631bf0e94d0SDavid Wu } else { 1632bf0e94d0SDavid Wu offset_con = &grf->soc_con8; 1633bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1634bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1635bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1636bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1637bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1638bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1639bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1640bf0e94d0SDavid Wu } 1641bf0e94d0SDavid Wu 1642bf0e94d0SDavid Wu rk_clrsetreg(offset_con, 1643bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1644bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1645c5bdc99aSJianqun Xu (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) | 1646bf0e94d0SDavid Wu rx_delay); 1647bf0e94d0SDavid Wu 1648bf0e94d0SDavid Wu rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1649bf0e94d0SDavid Wu tx_enable | rx_enable); 1650bf0e94d0SDavid Wu 1651bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1652bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1653bf0e94d0SDavid Wu } 1654bf0e94d0SDavid Wu 1655*745dad46SDavid Wu static void rv1103b_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1656*745dad46SDavid Wu { 1657*745dad46SDavid Wu struct rv1103b_grf *grf; 1658*745dad46SDavid Wu enum { 1659*745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK = BIT(2), 1660*745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M = BIT(2), 1661*745dad46SDavid Wu }; 1662*745dad46SDavid Wu 1663*745dad46SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1664*745dad46SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 1665*745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK, 1666*745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M); 1667*745dad46SDavid Wu }; 1668*745dad46SDavid Wu 166920bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 167020bef841SDavid Wu { 1671*745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B 1672*745dad46SDavid Wu struct rv1103b_grf *grf; 1673*745dad46SDavid Wu #else 167420bef841SDavid Wu struct rv1106_grf *grf; 1675*745dad46SDavid Wu #endif 1676535678cdSDavid Wu unsigned char bgs[1] = {0}; 1677535678cdSDavid Wu 1678535678cdSDavid Wu enum { 1679535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1680535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1681535678cdSDavid Wu }; 168254f7ad44SDavid Wu 168354f7ad44SDavid Wu enum { 168420bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK = BIT(1), 168554f7ad44SDavid Wu RV1106_MACPHY_DISENABLE = BIT(1), 168654f7ad44SDavid Wu RV1106_MACPHY_ENABLE = 0, 168720bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 168820bef841SDavid Wu RV1106_MACPHY_XMII_SEL = BIT(6), 168920bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 169020bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 169120bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 169220bef841SDavid Wu RV1106_MACPHY_PHY_ID = BIT(11), 169320bef841SDavid Wu }; 169420bef841SDavid Wu 169520bef841SDavid Wu enum { 169620bef841SDavid Wu RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 169754f7ad44SDavid Wu RV1106_MACPHY_BGS = BIT(2), 169820bef841SDavid Wu }; 169920bef841SDavid Wu 1700535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1701535678cdSDavid Wu struct udevice *dev; 1702535678cdSDavid Wu u32 regs[2] = {0}; 1703535678cdSDavid Wu ofnode node; 1704535678cdSDavid Wu int ret = 0; 1705535678cdSDavid Wu 1706535678cdSDavid Wu /* retrieve the device */ 1707535678cdSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1708535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1709535678cdSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1710535678cdSDavid Wu &dev); 1711535678cdSDavid Wu else 1712535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1713535678cdSDavid Wu DM_GET_DRIVER(rockchip_otp), 1714535678cdSDavid Wu &dev); 1715535678cdSDavid Wu if (!ret) { 1716535678cdSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1717535678cdSDavid Wu if (ofnode_valid(node)) { 1718535678cdSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1719535678cdSDavid Wu /* read the bgs from the efuses */ 1720535678cdSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1721535678cdSDavid Wu if (ret) { 1722535678cdSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1723535678cdSDavid Wu ret); 1724535678cdSDavid Wu bgs[0] = 0; 1725535678cdSDavid Wu } 1726535678cdSDavid Wu } 1727535678cdSDavid Wu } 1728535678cdSDavid Wu } 1729535678cdSDavid Wu #endif 1730535678cdSDavid Wu 173120bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 173220bef841SDavid Wu 173320bef841SDavid Wu reset_assert(&pdata->phy_reset); 173420bef841SDavid Wu udelay(20); 173520bef841SDavid Wu rk_clrsetreg(&grf->macphy_con0, 173620bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK | 173720bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK | 173820bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK | 173920bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK, 174020bef841SDavid Wu RV1106_MACPHY_ENABLE | 174120bef841SDavid Wu RV1106_MACPHY_XMII_SEL | 174220bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M | 174320bef841SDavid Wu RV1106_MACPHY_PHY_ID); 174420bef841SDavid Wu 174520bef841SDavid Wu rk_clrsetreg(&grf->macphy_con1, 174620bef841SDavid Wu RV1106_MACPHY_BGS_MASK, 1747535678cdSDavid Wu bgs[0]); 17488bafa3a1SDavid Wu udelay(20); 174920bef841SDavid Wu reset_deassert(&pdata->phy_reset); 175020bef841SDavid Wu udelay(30 * 1000); 175120bef841SDavid Wu } 175220bef841SDavid Wu 17538bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 17548bafa3a1SDavid Wu { 17558bafa3a1SDavid Wu struct rv1106_grf *grf; 17568bafa3a1SDavid Wu enum { 17578bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 17588bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 17598bafa3a1SDavid Wu }; 17608bafa3a1SDavid Wu 17618bafa3a1SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 17628bafa3a1SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 17638bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 17648bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE); 17658bafa3a1SDavid Wu }; 17668bafa3a1SDavid Wu 1767e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1768e4e3f431SDavid Wu { 1769e4e3f431SDavid Wu struct rv1126_grf *grf; 1770e4e3f431SDavid Wu 1771e4e3f431SDavid Wu enum { 1772e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1773e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1774e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1775e4e3f431SDavid Wu }; 1776e4e3f431SDavid Wu 1777e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1778e4e3f431SDavid Wu 1779e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1780e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1781e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1782e4e3f431SDavid Wu } 1783e4e3f431SDavid Wu 1784dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1785dcfb333aSDavid Wu { 1786dcfb333aSDavid Wu struct rv1126_grf *grf; 1787dcfb333aSDavid Wu 1788dcfb333aSDavid Wu enum { 1789dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1790dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1791dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1792dcfb333aSDavid Wu 1793dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1794dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1795dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1796dcfb333aSDavid Wu 1797dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1798dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1799dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1800dcfb333aSDavid Wu 1801dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1802dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1803dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1804dcfb333aSDavid Wu 1805dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1806dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1807dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1808dcfb333aSDavid Wu }; 1809dcfb333aSDavid Wu enum { 1810dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1811dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1812dcfb333aSDavid Wu 1813dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1814dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1815dcfb333aSDavid Wu }; 1816dcfb333aSDavid Wu enum { 1817dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1818dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1819dcfb333aSDavid Wu 1820dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1821dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1822dcfb333aSDavid Wu }; 1823dcfb333aSDavid Wu 1824dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1825dcfb333aSDavid Wu 1826dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1827dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1828dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1829dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1830dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1831dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1832dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1833dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1834dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1835dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1836dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1837dcfb333aSDavid Wu 1838dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1839dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1840dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1841c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) | 1842c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT)); 1843dcfb333aSDavid Wu 1844dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1845dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1846dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1847c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) | 1848c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT)); 1849dcfb333aSDavid Wu } 18506f0a52e9SDavid Wu #endif 18510a33ce65SDavid Wu 1852bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1853c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1854c563400aSDavid Wu { 1855c563400aSDavid Wu struct rk3528_grf *grf; 1856c563400aSDavid Wu unsigned int val; 1857c563400aSDavid Wu 1858c563400aSDavid Wu enum { 1859c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_SHIFT = 0x12, 1860c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_MASK = BIT(12), 1861c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_CRU = 0, 1862c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_IO = BIT(12), 1863c563400aSDavid Wu }; 1864c563400aSDavid Wu 1865c563400aSDavid Wu if (!pdata->bus_id) 1866c563400aSDavid Wu return; 1867c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1868c563400aSDavid Wu 1869c563400aSDavid Wu val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO : 1870c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_CRU; 1871c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val); 1872c563400aSDavid Wu } 1873c563400aSDavid Wu 187483f30531SDavid Wu static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata) 187583f30531SDavid Wu { 187683f30531SDavid Wu struct rk3562_grf *grf; 187783f30531SDavid Wu struct rk3562_ioc *ioc; 187883f30531SDavid Wu unsigned int val; 187983f30531SDavid Wu 188083f30531SDavid Wu enum { 188183f30531SDavid Wu RK3562_GMAC0_CLK_SELET_SHIFT = 0x9, 188283f30531SDavid Wu RK3562_GMAC0_CLK_SELET_MASK = BIT(9), 188383f30531SDavid Wu RK3562_GMAC0_CLK_SELET_CRU = 0, 188483f30531SDavid Wu RK3562_GMAC0_CLK_SELET_IO = BIT(9), 188583f30531SDavid Wu }; 188683f30531SDavid Wu 188783f30531SDavid Wu enum { 188883f30531SDavid Wu RK3562_GMAC1_CLK_SELET_SHIFT = 15, 188983f30531SDavid Wu RK3562_GMAC1_CLK_SELET_MASK = BIT(15), 189083f30531SDavid Wu RK3562_GMAC1_CLK_SELET_CRU = 0, 189183f30531SDavid Wu RK3562_GMAC1_CLK_SELET_IO = BIT(15), 189283f30531SDavid Wu }; 189383f30531SDavid Wu 189483f30531SDavid Wu enum { 189583f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2, 189683f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2), 189783f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0, 189883f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2), 189983f30531SDavid Wu }; 190083f30531SDavid Wu 190183f30531SDavid Wu enum { 190283f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3, 190383f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3), 190483f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0, 190583f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3), 190683f30531SDavid Wu }; 190783f30531SDavid Wu 190883f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 190983f30531SDavid Wu ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); 191083f30531SDavid Wu 191183f30531SDavid Wu if (!pdata->bus_id) { 191283f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO : 191383f30531SDavid Wu RK3562_GMAC0_CLK_SELET_CRU; 191483f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val); 191583f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO : 191683f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_CRU; 191783f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con1, 191883f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); 191983f30531SDavid Wu rk_clrsetreg(&ioc->mac0_io_con1, 192083f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); 192183f30531SDavid Wu 192283f30531SDavid Wu } else { 192383f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO : 192483f30531SDavid Wu RK3562_GMAC1_CLK_SELET_CRU; 192583f30531SDavid Wu rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val); 192683f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO : 192783f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_CRU; 192883f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con1, 192983f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val); 193083f30531SDavid Wu } 193183f30531SDavid Wu } 193283f30531SDavid Wu 1933bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1934bf0e94d0SDavid Wu { 1935bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1936bf0e94d0SDavid Wu unsigned int val, mask; 1937bf0e94d0SDavid Wu 1938bf0e94d0SDavid Wu enum { 1939bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 1940bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_MASK = BIT(4), 1941bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU = BIT(4), 1942bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_IO = 0, 1943bf0e94d0SDavid Wu }; 1944bf0e94d0SDavid Wu 1945bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1946bf0e94d0SDavid Wu val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 1947bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU; 1948bf0e94d0SDavid Wu mask = RK3588_GMAC_CLK_SELET_MASK; 1949bf0e94d0SDavid Wu 1950bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1951bf0e94d0SDavid Wu val <<= 5; 1952bf0e94d0SDavid Wu mask <<= 5; 1953bf0e94d0SDavid Wu } 1954bf0e94d0SDavid Wu 1955bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, mask, val); 1956bf0e94d0SDavid Wu } 1957bf0e94d0SDavid Wu #endif 1958bf0e94d0SDavid Wu 19590125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 19600125bcf0SSjoerd Simons { 19610125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 19621f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 19631f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 19646f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 19656f0a52e9SDavid Wu struct eqos_config *config; 19666f0a52e9SDavid Wu #else 19676f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 19686f0a52e9SDavid Wu #endif 19696f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 19700125bcf0SSjoerd Simons struct clk clk; 19710a33ce65SDavid Wu ulong rate; 19720125bcf0SSjoerd Simons int ret; 19730125bcf0SSjoerd Simons 19746f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 19756f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 19766f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 1977befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 19786f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 19796f0a52e9SDavid Wu #else 19806f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 19816f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 19826f0a52e9SDavid Wu #endif 198333a014bdSDavid Wu pdata->bus_id = dev->seq; 198454f7ad44SDavid Wu 1985cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1986cadc8d74SKever Yang ret = clk_set_defaults(dev); 1987cadc8d74SKever Yang if (ret) 1988cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 1989cadc8d74SKever Yang 19900125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 19910125bcf0SSjoerd Simons if (ret) 1992*745dad46SDavid Wu debug("%s clk_get_by_index failed %d\n", __func__, ret); 19930125bcf0SSjoerd Simons 1994491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 1995491f3bfbSDavid Wu 1996bf0e94d0SDavid Wu if (ops->set_clock_selection) 1997bf0e94d0SDavid Wu ops->set_clock_selection(pdata); 1998bf0e94d0SDavid Wu 1999491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 2000491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 2001491f3bfbSDavid Wu 20020a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 20030a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 2004bf0e94d0SDavid Wu case PHY_INTERFACE_MODE_RGMII_RXID: 20050a33ce65SDavid Wu /* 20060a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 20070a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 20080a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 20090a33ce65SDavid Wu * is not set, because of it is bypassed. 20100a33ce65SDavid Wu */ 20110a33ce65SDavid Wu if (!pdata->clock_input) { 2012*745dad46SDavid Wu if (clk.id) { 20130a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 20140a33ce65SDavid Wu if (rate != 125000000) 20150a33ce65SDavid Wu return -EINVAL; 20160a33ce65SDavid Wu } 2017*745dad46SDavid Wu } 20180125bcf0SSjoerd Simons 2019bf0e94d0SDavid Wu if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 2020bf0e94d0SDavid Wu pdata->rx_delay = -1; 2021bf0e94d0SDavid Wu 20220125bcf0SSjoerd Simons /* Set to RGMII mode */ 20230a33ce65SDavid Wu if (ops->set_to_rgmii) 20241f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 20250a33ce65SDavid Wu else 20260a33ce65SDavid Wu return -EPERM; 20270a33ce65SDavid Wu 20280a33ce65SDavid Wu break; 20290a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 20300a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 20310a33ce65SDavid Wu if (!pdata->clock_input) { 2032*745dad46SDavid Wu if (clk.id) { 20330a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 20340a33ce65SDavid Wu if (rate != 50000000) 20350a33ce65SDavid Wu return -EINVAL; 20360a33ce65SDavid Wu } 2037*745dad46SDavid Wu } 20380a33ce65SDavid Wu 20390a33ce65SDavid Wu /* Set to RMII mode */ 20400a33ce65SDavid Wu if (ops->set_to_rmii) 20410a33ce65SDavid Wu ops->set_to_rmii(pdata); 20420a33ce65SDavid Wu 20430a33ce65SDavid Wu break; 20440a33ce65SDavid Wu default: 20450a33ce65SDavid Wu debug("NO interface defined!\n"); 20460a33ce65SDavid Wu return -ENXIO; 20470a33ce65SDavid Wu } 20480125bcf0SSjoerd Simons 20496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 20506f0a52e9SDavid Wu return eqos_probe(dev); 20516f0a52e9SDavid Wu #else 20520125bcf0SSjoerd Simons return designware_eth_probe(dev); 20536f0a52e9SDavid Wu #endif 20546f0a52e9SDavid Wu } 20556f0a52e9SDavid Wu 20566f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 20576f0a52e9SDavid Wu { 20586f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 20596f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 20606f0a52e9SDavid Wu #else 20616f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 20626f0a52e9SDavid Wu #endif 20636f0a52e9SDavid Wu } 20646f0a52e9SDavid Wu 20656f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 20666f0a52e9SDavid Wu int length) 20676f0a52e9SDavid Wu { 20686f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 20696f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 20706f0a52e9SDavid Wu #else 20716f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 20726f0a52e9SDavid Wu #endif 20736f0a52e9SDavid Wu } 20746f0a52e9SDavid Wu 20756f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 20766f0a52e9SDavid Wu int length) 20776f0a52e9SDavid Wu { 20786f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 20796f0a52e9SDavid Wu return eqos_send(dev, packet, length); 20806f0a52e9SDavid Wu #else 20816f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 20826f0a52e9SDavid Wu #endif 20836f0a52e9SDavid Wu } 20846f0a52e9SDavid Wu 20856f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 20866f0a52e9SDavid Wu uchar **packetp) 20876f0a52e9SDavid Wu { 20886f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 20896f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 20906f0a52e9SDavid Wu #else 20916f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 20926f0a52e9SDavid Wu #endif 20930125bcf0SSjoerd Simons } 20940125bcf0SSjoerd Simons 20950125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 20960125bcf0SSjoerd Simons { 20976f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 20981f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 20991f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 21006f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 2101491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 21026f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 21036f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 21046f0a52e9SDavid Wu #endif 21050125bcf0SSjoerd Simons int ret; 21060125bcf0SSjoerd Simons 21076f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21086f0a52e9SDavid Wu ret = eqos_init(dev); 21096f0a52e9SDavid Wu #else 21106f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 21116f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 21126f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 21136f0a52e9SDavid Wu eth_pdata->enetaddr); 21146f0a52e9SDavid Wu #endif 21150125bcf0SSjoerd Simons if (ret) 21160125bcf0SSjoerd Simons return ret; 2117491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 21180125bcf0SSjoerd Simons if (ret) 21190125bcf0SSjoerd Simons return ret; 21206f0a52e9SDavid Wu 21216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21226f0a52e9SDavid Wu eqos_enable(dev); 21236f0a52e9SDavid Wu #else 21246f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 21250125bcf0SSjoerd Simons if (ret) 21260125bcf0SSjoerd Simons return ret; 21276f0a52e9SDavid Wu #endif 21280125bcf0SSjoerd Simons 21290125bcf0SSjoerd Simons return 0; 21300125bcf0SSjoerd Simons } 21310125bcf0SSjoerd Simons 21326f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 21336f0a52e9SDavid Wu { 21346f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21356f0a52e9SDavid Wu eqos_stop(dev); 21366f0a52e9SDavid Wu #else 21376f0a52e9SDavid Wu designware_eth_stop(dev); 21386f0a52e9SDavid Wu #endif 21396f0a52e9SDavid Wu } 21406f0a52e9SDavid Wu 21410125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 21420125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 21436f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 21446f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 21456f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 21466f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 21476f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 21480125bcf0SSjoerd Simons }; 21490125bcf0SSjoerd Simons 21506f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 215118ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 215218ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 215318ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 215418ae91c8SDavid Wu }; 215518ae91c8SDavid Wu 2156ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 2157ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 2158ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 2159ff86648dSDavid Wu }; 2160ff86648dSDavid Wu 2161af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 2162af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 2163491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 2164af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 2165491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 2166af166ffaSDavid Wu }; 2167af166ffaSDavid Wu 21681f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 21691f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 21701f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 21711f08aa1cSPhilipp Tomsich }; 21721f08aa1cSPhilipp Tomsich 217323adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 217423adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 217523adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 217623adb58fSDavid Wu }; 217723adb58fSDavid Wu 2178c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 2179c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 2180491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 2181c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 2182491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 2183c36b26c0SDavid Wu }; 2184c36b26c0SDavid Wu 2185793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 2186793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 2187793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 2188793f2fd2SPhilipp Tomsich }; 2189793f2fd2SPhilipp Tomsich 21901f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 21911f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 21921f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 21931f08aa1cSPhilipp Tomsich }; 21941f08aa1cSPhilipp Tomsich 21950a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 21960a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 21970a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 21980a33ce65SDavid Wu }; 2199dcfb333aSDavid Wu #else 2200c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = { 2201c563400aSDavid Wu .fix_mac_speed = rk3528_set_rgmii_speed, 2202c563400aSDavid Wu .set_to_rgmii = rk3528_set_to_rgmii, 2203c563400aSDavid Wu .set_to_rmii = rk3528_set_to_rmii, 2204c563400aSDavid Wu .set_clock_selection = rk3528_set_clock_selection, 2205c563400aSDavid Wu .integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup, 2206c563400aSDavid Wu }; 2207c563400aSDavid Wu 220883f30531SDavid Wu const struct rk_gmac_ops rk3562_gmac_ops = { 220983f30531SDavid Wu .fix_mac_speed = rk3562_set_gmac_speed, 221083f30531SDavid Wu .set_to_rgmii = rk3562_set_to_rgmii, 221183f30531SDavid Wu .set_to_rmii = rk3562_set_to_rmii, 221283f30531SDavid Wu .set_clock_selection = rk3562_set_clock_selection, 221383f30531SDavid Wu }; 221483f30531SDavid Wu 221533a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 221633a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 221733a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 221833a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 221933a014bdSDavid Wu }; 222033a014bdSDavid Wu 2221bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = { 2222bf0e94d0SDavid Wu .fix_mac_speed = rk3588_set_rgmii_speed, 2223bf0e94d0SDavid Wu .set_to_rgmii = rk3588_set_to_rgmii, 2224bf0e94d0SDavid Wu .set_to_rmii = rk3588_set_to_rmii, 2225bf0e94d0SDavid Wu .set_clock_selection = rk3588_set_clock_selection, 2226bf0e94d0SDavid Wu }; 2227bf0e94d0SDavid Wu 2228*745dad46SDavid Wu const struct rk_gmac_ops rv1103b_gmac_ops = { 2229*745dad46SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 2230*745dad46SDavid Wu .set_to_rmii = rv1103b_set_to_rmii, 2231*745dad46SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 2232*745dad46SDavid Wu }; 2233*745dad46SDavid Wu 223420bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = { 223520bef841SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 22368bafa3a1SDavid Wu .set_to_rmii = rv1106_set_to_rmii, 223720bef841SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 223820bef841SDavid Wu }; 223920bef841SDavid Wu 2240dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 2241dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 2242dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 2243e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 2244dcfb333aSDavid Wu }; 22456f0a52e9SDavid Wu #endif 22460a33ce65SDavid Wu 22470125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 22486f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 224984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30 225018ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 225118ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 225284e90485SDavid Wu #endif 225384e90485SDavid Wu 225484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808 2255ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 2256ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 225784e90485SDavid Wu #endif 225884e90485SDavid Wu 225984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228 2260af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 2261af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 226284e90485SDavid Wu #endif 226384e90485SDavid Wu 226484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288 22651f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 22661f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 226784e90485SDavid Wu #endif 226884e90485SDavid Wu 226984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308 227023adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 227123adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 227284e90485SDavid Wu #endif 227384e90485SDavid Wu 227484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328 2275c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 2276c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 227784e90485SDavid Wu #endif 227884e90485SDavid Wu 227984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368 2280793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 2281793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 228284e90485SDavid Wu #endif 228384e90485SDavid Wu 228484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399 22851f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 22861f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 228784e90485SDavid Wu #endif 228884e90485SDavid Wu 228984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108 22900a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 22910a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 229284e90485SDavid Wu #endif 2293dcfb333aSDavid Wu #else 2294c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528 2295c563400aSDavid Wu { .compatible = "rockchip,rk3528-gmac", 2296c563400aSDavid Wu .data = (ulong)&rk3528_gmac_ops }, 2297c563400aSDavid Wu #endif 2298c563400aSDavid Wu 229983f30531SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3562 230083f30531SDavid Wu { .compatible = "rockchip,rk3562-gmac", 230183f30531SDavid Wu .data = (ulong)&rk3562_gmac_ops }, 230283f30531SDavid Wu #endif 230383f30531SDavid Wu 230484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568 230533a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 230633a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 230784e90485SDavid Wu #endif 230884e90485SDavid Wu 2309bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588 2310bf0e94d0SDavid Wu { .compatible = "rockchip,rk3588-gmac", 2311bf0e94d0SDavid Wu .data = (ulong)&rk3588_gmac_ops }, 2312bf0e94d0SDavid Wu #endif 2313bf0e94d0SDavid Wu 2314*745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B 2315*745dad46SDavid Wu { .compatible = "rockchip,rv1103b-gmac", 2316*745dad46SDavid Wu .data = (ulong)&rv1103b_gmac_ops }, 2317*745dad46SDavid Wu #endif 2318*745dad46SDavid Wu 231920bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106 232020bef841SDavid Wu { .compatible = "rockchip,rv1106-gmac", 232120bef841SDavid Wu .data = (ulong)&rv1106_gmac_ops }, 232220bef841SDavid Wu #endif 232320bef841SDavid Wu 232484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126 2325dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 2326dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 23276f0a52e9SDavid Wu #endif 232884e90485SDavid Wu #endif 23290125bcf0SSjoerd Simons { } 23300125bcf0SSjoerd Simons }; 23310125bcf0SSjoerd Simons 23320125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 23330125bcf0SSjoerd Simons .name = "gmac_rockchip", 23340125bcf0SSjoerd Simons .id = UCLASS_ETH, 23350125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 23360125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 23370125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 23380125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 23396f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 23400125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 23410125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 23420125bcf0SSjoerd Simons }; 2343