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 2133a014bdSDavid Wu #include <asm/arch/grf_rk3568.h> 22bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h> 2320bef841SDavid Wu #include <asm/arch/grf_rv1106.h> 24dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 256f0a52e9SDavid Wu #include "dwc_eth_qos.h" 266f0a52e9SDavid Wu #else 2718ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 28ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 29af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 300125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 3123adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 32c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 33793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 341f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 350a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 360125bcf0SSjoerd Simons #include "designware.h" 376f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 386f0a52e9SDavid Wu #endif 396f0a52e9SDavid Wu #include <dm/pinctrl.h> 40491f3bfbSDavid Wu #include <dm/of_access.h> 410125bcf0SSjoerd Simons 420125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 430125bcf0SSjoerd Simons 446f0a52e9SDavid Wu struct rockchip_eth_dev { 456f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 466f0a52e9SDavid Wu struct eqos_priv eqos; 476f0a52e9SDavid Wu #else 486f0a52e9SDavid Wu struct dw_eth_dev dw; 496f0a52e9SDavid Wu #endif 50491f3bfbSDavid Wu int phy_interface; 516f0a52e9SDavid Wu }; 526f0a52e9SDavid Wu 530125bcf0SSjoerd Simons /* 540125bcf0SSjoerd Simons * Platform data for the gmac 550125bcf0SSjoerd Simons * 560125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 570125bcf0SSjoerd Simons */ 580125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 596f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 600125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 616f0a52e9SDavid Wu #else 626f0a52e9SDavid Wu struct eth_pdata eth_pdata; 636f0a52e9SDavid Wu #endif 64491f3bfbSDavid Wu struct reset_ctl phy_reset; 65491f3bfbSDavid Wu bool integrated_phy; 660a33ce65SDavid Wu bool clock_input; 67491f3bfbSDavid Wu int phy_interface; 680125bcf0SSjoerd Simons int tx_delay; 690125bcf0SSjoerd Simons int rx_delay; 7033a014bdSDavid Wu int bus_id; 710125bcf0SSjoerd Simons }; 720125bcf0SSjoerd Simons 731f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 746f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 756f0a52e9SDavid Wu const struct eqos_config config; 766f0a52e9SDavid Wu #endif 77491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 78491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 790a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 801f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 81bf0e94d0SDavid Wu void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 82491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 831f08aa1cSPhilipp Tomsich }; 841f08aa1cSPhilipp Tomsich 85befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 86befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 87befcb627SDavid Wu .reg_access_always_ok = false, 88befcb627SDavid Wu .mdio_wait = 10000, 89befcb627SDavid Wu .swr_wait = 200, 90befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 91befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 92befcb627SDavid Wu .ops = &eqos_rockchip_ops, 93befcb627SDavid Wu }; 94befcb627SDavid Wu #endif 95befcb627SDavid Wu 961eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 971eb9d064SDavid Wu { 981eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 991eb9d064SDavid Wu struct rk_gmac_ops *ops = 1001eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 1011eb9d064SDavid Wu 1021eb9d064SDavid Wu pdata->tx_delay = tx_delay; 1031eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1041eb9d064SDavid Wu 1051eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1061eb9d064SDavid Wu } 1071f08aa1cSPhilipp Tomsich 1080125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1090125bcf0SSjoerd Simons { 1100125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 111491f3bfbSDavid Wu struct ofnode_phandle_args args; 11254f7ad44SDavid Wu struct udevice *phydev; 1130a33ce65SDavid Wu const char *string; 114491f3bfbSDavid Wu int ret; 1150a33ce65SDavid Wu 1160a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1170a33ce65SDavid Wu if (!strcmp(string, "input")) 1180a33ce65SDavid Wu pdata->clock_input = true; 1190a33ce65SDavid Wu else 1200a33ce65SDavid Wu pdata->clock_input = false; 1210125bcf0SSjoerd Simons 122491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 123491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 124491f3bfbSDavid Wu if (ret) { 125491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 126491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 127491f3bfbSDavid Wu } else { 128491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 129491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 130491f3bfbSDavid Wu "phy-is-integrated"); 131491f3bfbSDavid Wu } 132491f3bfbSDavid Wu 133491f3bfbSDavid Wu if (pdata->integrated_phy) { 134491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 135491f3bfbSDavid Wu if (ret) { 13654f7ad44SDavid Wu ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 13754f7ad44SDavid Wu if (ret) { 13854f7ad44SDavid Wu debug("Get phydev by ofnode failed: err=%d\n", ret); 13954f7ad44SDavid Wu return ret; 14054f7ad44SDavid Wu } 14154f7ad44SDavid Wu 14254f7ad44SDavid Wu ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 14354f7ad44SDavid Wu if (ret) { 144491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 145491f3bfbSDavid Wu return ret; 146491f3bfbSDavid Wu } 147491f3bfbSDavid Wu } 14854f7ad44SDavid Wu } 149491f3bfbSDavid Wu 1501f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1517ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1527ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1531f08aa1cSPhilipp Tomsich 1541f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1551f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1567ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1571f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1587ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1590125bcf0SSjoerd Simons 1606f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1616f0a52e9SDavid Wu return 0; 1626f0a52e9SDavid Wu #else 1630125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1646f0a52e9SDavid Wu #endif 1650125bcf0SSjoerd Simons } 1660125bcf0SSjoerd Simons 1676f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 168491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 169491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 17018ae91c8SDavid Wu { 1716f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 17218ae91c8SDavid Wu struct px30_grf *grf; 17318ae91c8SDavid Wu struct clk clk_speed; 17418ae91c8SDavid Wu int speed, ret; 17518ae91c8SDavid Wu enum { 17618ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 17718ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 17818ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 17918ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 18018ae91c8SDavid Wu }; 18118ae91c8SDavid Wu 18218ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 18318ae91c8SDavid Wu &clk_speed); 18418ae91c8SDavid Wu if (ret) 18518ae91c8SDavid Wu return ret; 18618ae91c8SDavid Wu 18718ae91c8SDavid Wu switch (priv->phydev->speed) { 18818ae91c8SDavid Wu case 10: 18918ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 19018ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 19118ae91c8SDavid Wu if (ret) 19218ae91c8SDavid Wu return ret; 19318ae91c8SDavid Wu break; 19418ae91c8SDavid Wu case 100: 19518ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 19618ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 19718ae91c8SDavid Wu if (ret) 19818ae91c8SDavid Wu return ret; 19918ae91c8SDavid Wu break; 20018ae91c8SDavid Wu default: 20118ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 20218ae91c8SDavid Wu return -EINVAL; 20318ae91c8SDavid Wu } 20418ae91c8SDavid Wu 20518ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 20618ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 20718ae91c8SDavid Wu 20818ae91c8SDavid Wu return 0; 20918ae91c8SDavid Wu } 21018ae91c8SDavid Wu 211491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 212491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 213ff86648dSDavid Wu { 2146f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 215ff86648dSDavid Wu struct clk clk_speed; 216ff86648dSDavid Wu int ret; 217ff86648dSDavid Wu 218ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 219ff86648dSDavid Wu &clk_speed); 220ff86648dSDavid Wu if (ret) 221ff86648dSDavid Wu return ret; 222ff86648dSDavid Wu 223ff86648dSDavid Wu switch (priv->phydev->speed) { 224ff86648dSDavid Wu case 10: 225ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 226ff86648dSDavid Wu if (ret) 227ff86648dSDavid Wu return ret; 228ff86648dSDavid Wu break; 229ff86648dSDavid Wu case 100: 230ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 231ff86648dSDavid Wu if (ret) 232ff86648dSDavid Wu return ret; 233ff86648dSDavid Wu break; 234ff86648dSDavid Wu case 1000: 235ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 236ff86648dSDavid Wu if (ret) 237ff86648dSDavid Wu return ret; 238ff86648dSDavid Wu break; 239ff86648dSDavid Wu default: 240ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 241ff86648dSDavid Wu return -EINVAL; 242ff86648dSDavid Wu } 243ff86648dSDavid Wu 244ff86648dSDavid Wu return 0; 245ff86648dSDavid Wu } 246ff86648dSDavid Wu 247491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 248491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 249af166ffaSDavid Wu { 2506f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 251af166ffaSDavid Wu struct rk322x_grf *grf; 252af166ffaSDavid Wu int clk; 253af166ffaSDavid Wu enum { 254af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 255af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 256af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 257af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 258af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 259491f3bfbSDavid Wu 260491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 261491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 262491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 263491f3bfbSDavid Wu 264491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 265491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 266491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 267af166ffaSDavid Wu }; 268af166ffaSDavid Wu 269af166ffaSDavid Wu switch (priv->phydev->speed) { 270af166ffaSDavid Wu case 10: 271491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 272491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 273491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 274af166ffaSDavid Wu break; 275af166ffaSDavid Wu case 100: 276491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 277491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 278491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 279af166ffaSDavid Wu break; 280af166ffaSDavid Wu case 1000: 281af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 282af166ffaSDavid Wu break; 283af166ffaSDavid Wu default: 284af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 285af166ffaSDavid Wu return -EINVAL; 286af166ffaSDavid Wu } 287af166ffaSDavid Wu 288af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 289491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 290491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 291491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 292491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 293491f3bfbSDavid Wu clk); 294af166ffaSDavid Wu 295af166ffaSDavid Wu return 0; 296af166ffaSDavid Wu } 297af166ffaSDavid Wu 298491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 299491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 3000125bcf0SSjoerd Simons { 3016f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 3020125bcf0SSjoerd Simons struct rk3288_grf *grf; 3030125bcf0SSjoerd Simons int clk; 3040125bcf0SSjoerd Simons 3050125bcf0SSjoerd Simons switch (priv->phydev->speed) { 3060125bcf0SSjoerd Simons case 10: 3071f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 3080125bcf0SSjoerd Simons break; 3090125bcf0SSjoerd Simons case 100: 3101f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 3110125bcf0SSjoerd Simons break; 3120125bcf0SSjoerd Simons case 1000: 3131f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3140125bcf0SSjoerd Simons break; 3150125bcf0SSjoerd Simons default: 3160125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3170125bcf0SSjoerd Simons return -EINVAL; 3180125bcf0SSjoerd Simons } 3190125bcf0SSjoerd Simons 3200125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3211f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3220125bcf0SSjoerd Simons 3230125bcf0SSjoerd Simons return 0; 3240125bcf0SSjoerd Simons } 3250125bcf0SSjoerd Simons 326491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 327491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 32823adb58fSDavid Wu { 3296f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 33023adb58fSDavid Wu struct rk3308_grf *grf; 33123adb58fSDavid Wu struct clk clk_speed; 33223adb58fSDavid Wu int speed, ret; 33323adb58fSDavid Wu enum { 33423adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 33523adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 33623adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 33723adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 33823adb58fSDavid Wu }; 33923adb58fSDavid Wu 34023adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 34123adb58fSDavid Wu &clk_speed); 34223adb58fSDavid Wu if (ret) 34323adb58fSDavid Wu return ret; 34423adb58fSDavid Wu 34523adb58fSDavid Wu switch (priv->phydev->speed) { 34623adb58fSDavid Wu case 10: 34723adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 34823adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 34923adb58fSDavid Wu if (ret) 35023adb58fSDavid Wu return ret; 35123adb58fSDavid Wu break; 35223adb58fSDavid Wu case 100: 35323adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 35423adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 35523adb58fSDavid Wu if (ret) 35623adb58fSDavid Wu return ret; 35723adb58fSDavid Wu break; 35823adb58fSDavid Wu default: 35923adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 36023adb58fSDavid Wu return -EINVAL; 36123adb58fSDavid Wu } 36223adb58fSDavid Wu 36323adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 36423adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 36523adb58fSDavid Wu 36623adb58fSDavid Wu return 0; 36723adb58fSDavid Wu } 36823adb58fSDavid Wu 369491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 370491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 371c36b26c0SDavid Wu { 3726f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 373c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 374c36b26c0SDavid Wu int clk; 375c36b26c0SDavid Wu enum { 376c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 377c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 378c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 379c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 380c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 381491f3bfbSDavid Wu 382491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 383491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 384491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 385491f3bfbSDavid Wu 386491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 387491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 388491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 389c36b26c0SDavid Wu }; 390c36b26c0SDavid Wu 391c36b26c0SDavid Wu switch (priv->phydev->speed) { 392c36b26c0SDavid Wu case 10: 393491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 394491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 395491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 396c36b26c0SDavid Wu break; 397c36b26c0SDavid Wu case 100: 398491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 399491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 400491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 401c36b26c0SDavid Wu break; 402c36b26c0SDavid Wu case 1000: 403c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 404c36b26c0SDavid Wu break; 405c36b26c0SDavid Wu default: 406c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 407c36b26c0SDavid Wu return -EINVAL; 408c36b26c0SDavid Wu } 409c36b26c0SDavid Wu 410c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 411491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 412491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 413491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 414491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 415491f3bfbSDavid Wu clk); 416c36b26c0SDavid Wu 417c36b26c0SDavid Wu return 0; 418c36b26c0SDavid Wu } 419c36b26c0SDavid Wu 420491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 421491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 422793f2fd2SPhilipp Tomsich { 4236f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 424793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 425793f2fd2SPhilipp Tomsich int clk; 426793f2fd2SPhilipp Tomsich enum { 427793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 428793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 429793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 430793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 431793f2fd2SPhilipp Tomsich }; 432793f2fd2SPhilipp Tomsich 433793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 434793f2fd2SPhilipp Tomsich case 10: 435793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 436793f2fd2SPhilipp Tomsich break; 437793f2fd2SPhilipp Tomsich case 100: 438793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 439793f2fd2SPhilipp Tomsich break; 440793f2fd2SPhilipp Tomsich case 1000: 441793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 442793f2fd2SPhilipp Tomsich break; 443793f2fd2SPhilipp Tomsich default: 444793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 445793f2fd2SPhilipp Tomsich return -EINVAL; 446793f2fd2SPhilipp Tomsich } 447793f2fd2SPhilipp Tomsich 448793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 449793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 450793f2fd2SPhilipp Tomsich 451793f2fd2SPhilipp Tomsich return 0; 452793f2fd2SPhilipp Tomsich } 453793f2fd2SPhilipp Tomsich 454491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 455491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4561f08aa1cSPhilipp Tomsich { 4576f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4581f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4591f08aa1cSPhilipp Tomsich int clk; 4601f08aa1cSPhilipp Tomsich 4611f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4621f08aa1cSPhilipp Tomsich case 10: 4631f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4641f08aa1cSPhilipp Tomsich break; 4651f08aa1cSPhilipp Tomsich case 100: 4661f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4671f08aa1cSPhilipp Tomsich break; 4681f08aa1cSPhilipp Tomsich case 1000: 4691f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4701f08aa1cSPhilipp Tomsich break; 4711f08aa1cSPhilipp Tomsich default: 4721f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4731f08aa1cSPhilipp Tomsich return -EINVAL; 4741f08aa1cSPhilipp Tomsich } 4751f08aa1cSPhilipp Tomsich 4761f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4771f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4781f08aa1cSPhilipp Tomsich 4791f08aa1cSPhilipp Tomsich return 0; 4801f08aa1cSPhilipp Tomsich } 4811f08aa1cSPhilipp Tomsich 482491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 483491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4840a33ce65SDavid Wu { 4856f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4860a33ce65SDavid Wu struct rv1108_grf *grf; 4870a33ce65SDavid Wu int clk, speed; 4880a33ce65SDavid Wu enum { 4890a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4900a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4910a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4920a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4930a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4940a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4950a33ce65SDavid Wu }; 4960a33ce65SDavid Wu 4970a33ce65SDavid Wu switch (priv->phydev->speed) { 4980a33ce65SDavid Wu case 10: 4990a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 5000a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 5010a33ce65SDavid Wu break; 5020a33ce65SDavid Wu case 100: 5030a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 5040a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 5050a33ce65SDavid Wu break; 5060a33ce65SDavid Wu default: 5070a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 5080a33ce65SDavid Wu return -EINVAL; 5090a33ce65SDavid Wu } 5100a33ce65SDavid Wu 5110a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5120a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 5130a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5140a33ce65SDavid Wu clk | speed); 5150a33ce65SDavid Wu 5160a33ce65SDavid Wu return 0; 5170a33ce65SDavid Wu } 518dcfb333aSDavid Wu #else 519bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 520bf0e94d0SDavid Wu struct rockchip_eth_dev *dev) 521bf0e94d0SDavid Wu { 522bf0e94d0SDavid Wu struct eqos_priv *priv = &dev->eqos; 523bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 524bf0e94d0SDavid Wu unsigned int div, div_mask; 525bf0e94d0SDavid Wu 526bf0e94d0SDavid Wu enum { 527bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 528bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 529bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV1 = 0, 530a116113dSDavid Wu RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 531bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 532*6d863a16SDavid Wu RK3588_GMAC_CLK_RMII_DIV2 = BIT(2), 533bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_DIV20 = 0, 534*6d863a16SDavid Wu RK3588_GMAC1_ID_SHIFT = 5, 535bf0e94d0SDavid Wu }; 536bf0e94d0SDavid Wu 537bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 538bf0e94d0SDavid Wu 539bf0e94d0SDavid Wu switch (priv->phy->speed) { 540bf0e94d0SDavid Wu case 10: 541bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 542bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV20; 543bf0e94d0SDavid Wu else 544bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV50; 545bf0e94d0SDavid Wu break; 546bf0e94d0SDavid Wu case 100: 547bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 548*6d863a16SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV2; 549bf0e94d0SDavid Wu else 550bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV5; 551bf0e94d0SDavid Wu break; 552bf0e94d0SDavid Wu case 1000: 553bf0e94d0SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 554bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV1; 555bf0e94d0SDavid Wu else 556bf0e94d0SDavid Wu return -EINVAL; 557bf0e94d0SDavid Wu break; 558bf0e94d0SDavid Wu default: 559bf0e94d0SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 560bf0e94d0SDavid Wu return -EINVAL; 561bf0e94d0SDavid Wu } 562bf0e94d0SDavid Wu 563bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 564bf0e94d0SDavid Wu div <<= 5; 565bf0e94d0SDavid Wu div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 566bf0e94d0SDavid Wu } 567bf0e94d0SDavid Wu 568*6d863a16SDavid Wu div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0; 569*6d863a16SDavid Wu div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) : 570*6d863a16SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK; 571*6d863a16SDavid Wu 572bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 573bf0e94d0SDavid Wu 574bf0e94d0SDavid Wu return 0; 575bf0e94d0SDavid Wu } 576bf0e94d0SDavid Wu 57720bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 57820bef841SDavid Wu struct rockchip_eth_dev *dev) 57920bef841SDavid Wu { 58020bef841SDavid Wu struct eqos_priv *priv = &dev->eqos; 58120bef841SDavid Wu struct rv1106_grf *grf; 58220bef841SDavid Wu unsigned int div; 58320bef841SDavid Wu 58420bef841SDavid Wu enum { 58520bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 58620bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 58720bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 58820bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV20 = 0, 58920bef841SDavid Wu }; 59020bef841SDavid Wu 59120bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 59220bef841SDavid Wu 59320bef841SDavid Wu switch (priv->phy->speed) { 59420bef841SDavid Wu case 10: 59520bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV20; 59620bef841SDavid Wu break; 59720bef841SDavid Wu case 100: 59820bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV2; 59920bef841SDavid Wu break; 60020bef841SDavid Wu default: 60120bef841SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 60220bef841SDavid Wu return -EINVAL; 60320bef841SDavid Wu } 60420bef841SDavid Wu 60520bef841SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 60620bef841SDavid Wu 60720bef841SDavid Wu return 0; 60820bef841SDavid Wu } 60920bef841SDavid Wu 610491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 611491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 612dcfb333aSDavid Wu { 613dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 614dcfb333aSDavid Wu struct clk clk_speed; 615dcfb333aSDavid Wu int ret; 616dcfb333aSDavid Wu 617dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 618dcfb333aSDavid Wu &clk_speed); 619dcfb333aSDavid Wu if (ret) { 62033a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 62133a014bdSDavid Wu __func__, ret); 622dcfb333aSDavid Wu return ret; 623dcfb333aSDavid Wu } 624dcfb333aSDavid Wu 625dcfb333aSDavid Wu switch ( priv->phy->speed) { 626dcfb333aSDavid Wu case 10: 627dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 628dcfb333aSDavid Wu if (ret) 629dcfb333aSDavid Wu return ret; 630dcfb333aSDavid Wu break; 631dcfb333aSDavid Wu case 100: 632dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 633dcfb333aSDavid Wu if (ret) 634dcfb333aSDavid Wu return ret; 635dcfb333aSDavid Wu break; 636dcfb333aSDavid Wu case 1000: 637dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 638dcfb333aSDavid Wu if (ret) 639dcfb333aSDavid Wu return ret; 640dcfb333aSDavid Wu break; 641dcfb333aSDavid Wu default: 642dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 643dcfb333aSDavid Wu return -EINVAL; 644dcfb333aSDavid Wu } 645dcfb333aSDavid Wu 646dcfb333aSDavid Wu return 0; 647dcfb333aSDavid Wu } 6486f0a52e9SDavid Wu #endif 6490a33ce65SDavid Wu 6506f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 65118ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 65218ae91c8SDavid Wu { 65318ae91c8SDavid Wu struct px30_grf *grf; 65418ae91c8SDavid Wu enum { 65518ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 65618ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 65718ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 65818ae91c8SDavid Wu }; 65918ae91c8SDavid Wu 66018ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 66118ae91c8SDavid Wu 66218ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 66318ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 66418ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 66518ae91c8SDavid Wu } 66618ae91c8SDavid Wu 667ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 668ff86648dSDavid Wu { 669ff86648dSDavid Wu struct rk1808_grf *grf; 670ff86648dSDavid Wu enum { 671ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 672ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 673ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 674ff86648dSDavid Wu 675ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 676ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 677ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 678ff86648dSDavid Wu 679ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 680ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 681ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 682ff86648dSDavid Wu }; 683ff86648dSDavid Wu enum { 684ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 685ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 686ff86648dSDavid Wu 687ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 688ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 689ff86648dSDavid Wu }; 690ff86648dSDavid Wu 691ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 692ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 693ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 694ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 695ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 696ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 697ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 698ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 699ff86648dSDavid Wu 700ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 701ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 702ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 703c5bdc99aSJianqun Xu (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) | 704c5bdc99aSJianqun Xu (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT)); 705ff86648dSDavid Wu } 706ff86648dSDavid Wu 707af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 708af166ffaSDavid Wu { 709af166ffaSDavid Wu struct rk322x_grf *grf; 710af166ffaSDavid Wu enum { 711af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 712af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 713af166ffaSDavid Wu 714af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 715af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 716af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 717af166ffaSDavid Wu 718af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 719af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 720af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 721af166ffaSDavid Wu 722af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 723af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 724af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 725af166ffaSDavid Wu }; 726af166ffaSDavid Wu enum { 727af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 728af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 729af166ffaSDavid Wu 730af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 731af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 732af166ffaSDavid Wu }; 733af166ffaSDavid Wu 734af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 735af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 736af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 737af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 738af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 739af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 740af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 741af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 742af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 743af166ffaSDavid Wu 744af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 745af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 746af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 747af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 748af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 749af166ffaSDavid Wu } 750af166ffaSDavid Wu 751491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 752491f3bfbSDavid Wu { 753491f3bfbSDavid Wu struct rk322x_grf *grf; 754491f3bfbSDavid Wu enum { 755491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 756491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 757491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 758491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 759491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 760491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 761491f3bfbSDavid Wu }; 762491f3bfbSDavid Wu 763491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 764491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 765491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 766491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 767491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 768491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 769491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 770491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 771491f3bfbSDavid Wu } 772491f3bfbSDavid Wu 7731f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 7741f08aa1cSPhilipp Tomsich { 7751f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 7761f08aa1cSPhilipp Tomsich 7771f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 7781f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 7791f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 7801f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 7811f08aa1cSPhilipp Tomsich 7821f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 7831f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 7841f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 7851f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 7861f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 7871f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 7881f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 7891f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 7901f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 7911f08aa1cSPhilipp Tomsich } 7921f08aa1cSPhilipp Tomsich 79323adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 79423adb58fSDavid Wu { 79523adb58fSDavid Wu struct rk3308_grf *grf; 79623adb58fSDavid Wu enum { 79723adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 79823adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 79923adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 80023adb58fSDavid Wu }; 80123adb58fSDavid Wu 80223adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 80323adb58fSDavid Wu 80423adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 80523adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 80623adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 80723adb58fSDavid Wu } 80823adb58fSDavid Wu 809c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 810c36b26c0SDavid Wu { 811c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 812c36b26c0SDavid Wu enum { 813c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 814c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 815c36b26c0SDavid Wu 816c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 817c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 818c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 819c36b26c0SDavid Wu 820c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 821c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 822c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 823c36b26c0SDavid Wu 824c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 825c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 826c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 827c36b26c0SDavid Wu }; 828c36b26c0SDavid Wu enum { 829c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 830c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 831c36b26c0SDavid Wu 832c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 833c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 834c36b26c0SDavid Wu }; 835c36b26c0SDavid Wu 836c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 837c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 838c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 839c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 840c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 841c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 842c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 843c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 844c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 845c36b26c0SDavid Wu 846c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 847c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 848c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 849c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 850c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 851c36b26c0SDavid Wu } 852c36b26c0SDavid Wu 853491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 854491f3bfbSDavid Wu { 855491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 856491f3bfbSDavid Wu enum { 857491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 858491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 859491f3bfbSDavid Wu 860491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 861491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 862491f3bfbSDavid Wu }; 863491f3bfbSDavid Wu 864491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 865491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 866491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 867491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 868491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 869491f3bfbSDavid Wu RK3328_RMII_MODE); 870491f3bfbSDavid Wu } 871491f3bfbSDavid Wu 872793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 873793f2fd2SPhilipp Tomsich { 874793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 875793f2fd2SPhilipp Tomsich enum { 876793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 877793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 878793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 879793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 880793f2fd2SPhilipp Tomsich }; 881793f2fd2SPhilipp Tomsich enum { 882793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 883793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 884793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 885793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 886793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 887793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 888793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 889793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 890793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 891793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 892793f2fd2SPhilipp Tomsich }; 893793f2fd2SPhilipp Tomsich 894793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 895793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 896793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 897793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 898793f2fd2SPhilipp Tomsich 899793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 900793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 901793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 902793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 903793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 904793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 905793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 906c5bdc99aSJianqun Xu (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) | 907c5bdc99aSJianqun Xu (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT)); 908793f2fd2SPhilipp Tomsich } 909793f2fd2SPhilipp Tomsich 9101f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 9111f08aa1cSPhilipp Tomsich { 9121f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 9131f08aa1cSPhilipp Tomsich 9141f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9151f08aa1cSPhilipp Tomsich 9161f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 9171f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 9181f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 9191f08aa1cSPhilipp Tomsich 9201f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 9211f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 9221f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 9231f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 9241f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 9251f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 9261f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 927c5bdc99aSJianqun Xu (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) | 928c5bdc99aSJianqun Xu (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT)); 9291f08aa1cSPhilipp Tomsich } 9301f08aa1cSPhilipp Tomsich 9310a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 9320a33ce65SDavid Wu { 9330a33ce65SDavid Wu struct rv1108_grf *grf; 9340a33ce65SDavid Wu 9350a33ce65SDavid Wu enum { 9360a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 9370a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 9380a33ce65SDavid Wu }; 9390a33ce65SDavid Wu 9400a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9410a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 9420a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 9430a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 9440a33ce65SDavid Wu } 945491f3bfbSDavid Wu 946491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 947491f3bfbSDavid Wu { 948491f3bfbSDavid Wu struct rk322x_grf *grf; 949491f3bfbSDavid Wu enum { 950491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 951491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 952491f3bfbSDavid Wu }; 953491f3bfbSDavid Wu enum { 954491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 955491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 956491f3bfbSDavid Wu 957491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 958491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 959491f3bfbSDavid Wu 960491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 961491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 962491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 963491f3bfbSDavid Wu }; 964491f3bfbSDavid Wu enum { 965491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 966491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 967491f3bfbSDavid Wu }; 968491f3bfbSDavid Wu enum { 969491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 970491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 971491f3bfbSDavid Wu }; 972491f3bfbSDavid Wu 973491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 974491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 975491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 976491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 977491f3bfbSDavid Wu 978491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 979491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 980491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 981491f3bfbSDavid Wu 982491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 983491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 984491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 985491f3bfbSDavid Wu 986491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 987491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 988491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 989491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 990491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 991491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 992491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 993491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 994491f3bfbSDavid Wu 995491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 996491f3bfbSDavid Wu udelay(10); 997491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 998491f3bfbSDavid Wu udelay(10); 999491f3bfbSDavid Wu 1000491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1001491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1002491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 1003491f3bfbSDavid Wu udelay(30 * 1000); 1004491f3bfbSDavid Wu } 1005491f3bfbSDavid Wu 1006491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1007491f3bfbSDavid Wu { 1008491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1009491f3bfbSDavid Wu enum { 1010491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1011491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 1012491f3bfbSDavid Wu }; 1013491f3bfbSDavid Wu enum { 1014491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1015491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1016491f3bfbSDavid Wu 1017491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1018491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 1019491f3bfbSDavid Wu 1020491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 1021491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 1022491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 1023491f3bfbSDavid Wu }; 1024491f3bfbSDavid Wu enum { 1025491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1026491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1027491f3bfbSDavid Wu }; 1028491f3bfbSDavid Wu enum { 1029491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1030491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1031491f3bfbSDavid Wu }; 1032491f3bfbSDavid Wu 1033491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1034491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 1035491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 1036491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 1037491f3bfbSDavid Wu 1038491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1039491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1040491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 1041491f3bfbSDavid Wu 1042491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1043491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1044491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 1045491f3bfbSDavid Wu 1046491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1047491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1048491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 1049491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 1050491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1051491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 1052491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 1053491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 1054491f3bfbSDavid Wu 1055491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1056491f3bfbSDavid Wu udelay(10); 1057491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1058491f3bfbSDavid Wu udelay(10); 1059491f3bfbSDavid Wu 1060491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1061491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1062491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 1063491f3bfbSDavid Wu udelay(30 * 1000); 1064491f3bfbSDavid Wu } 1065491f3bfbSDavid Wu 1066dcfb333aSDavid Wu #else 106733a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 106833a014bdSDavid Wu { 106933a014bdSDavid Wu struct rk3568_grf *grf; 107033a014bdSDavid Wu void *con1; 107133a014bdSDavid Wu 107233a014bdSDavid Wu enum { 107333a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 107433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 107533a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 107633a014bdSDavid Wu }; 107733a014bdSDavid Wu 107833a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 107933a014bdSDavid Wu 108033a014bdSDavid Wu if (pdata->bus_id == 1) 108133a014bdSDavid Wu con1 = &grf->mac1_con1; 108233a014bdSDavid Wu else 108333a014bdSDavid Wu con1 = &grf->mac0_con1; 108433a014bdSDavid Wu 108533a014bdSDavid Wu rk_clrsetreg(con1, 108633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 108733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 108833a014bdSDavid Wu } 108933a014bdSDavid Wu 109033a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 109133a014bdSDavid Wu { 109233a014bdSDavid Wu struct rk3568_grf *grf; 109333a014bdSDavid Wu void *con0, *con1; 109433a014bdSDavid Wu 109533a014bdSDavid Wu enum { 109633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 109733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 109833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 109933a014bdSDavid Wu 110033a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 110133a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 110233a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 110333a014bdSDavid Wu 110433a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 110533a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 110633a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 110733a014bdSDavid Wu }; 110833a014bdSDavid Wu 110933a014bdSDavid Wu enum { 111033a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 111133a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 111233a014bdSDavid Wu 111333a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 111433a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 111533a014bdSDavid Wu }; 111633a014bdSDavid Wu 111733a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 111833a014bdSDavid Wu 111933a014bdSDavid Wu if (pdata->bus_id == 1) { 112033a014bdSDavid Wu con0 = &grf->mac1_con0; 112133a014bdSDavid Wu con1 = &grf->mac1_con1; 112233a014bdSDavid Wu } else { 112333a014bdSDavid Wu con0 = &grf->mac0_con0; 112433a014bdSDavid Wu con1 = &grf->mac0_con1; 112533a014bdSDavid Wu } 112633a014bdSDavid Wu 112733a014bdSDavid Wu rk_clrsetreg(con0, 112833a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 112933a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 1130c5bdc99aSJianqun Xu (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) | 1131c5bdc99aSJianqun Xu (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT)); 113233a014bdSDavid Wu 113333a014bdSDavid Wu rk_clrsetreg(con1, 113433a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 113533a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 113633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 113733a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 113833a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 113933a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 114033a014bdSDavid Wu } 114133a014bdSDavid Wu 1142bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1143bf0e94d0SDavid Wu { 1144bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1145bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1146bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1147bf0e94d0SDavid Wu 1148bf0e94d0SDavid Wu enum { 1149bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1150bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1151bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1152bf0e94d0SDavid Wu }; 1153bf0e94d0SDavid Wu 1154bf0e94d0SDavid Wu enum { 1155bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1156bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1157bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE = 0x1, 1158bf0e94d0SDavid Wu }; 1159bf0e94d0SDavid Wu 1160bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1161bf0e94d0SDavid Wu 1162bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1163bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1164bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1165bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1166bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1167bf0e94d0SDavid Wu } else { 1168bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1169bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1170bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1171bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1172bf0e94d0SDavid Wu } 1173bf0e94d0SDavid Wu 1174bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1175bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1176bf0e94d0SDavid Wu } 1177bf0e94d0SDavid Wu 1178bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1179bf0e94d0SDavid Wu { 1180bf0e94d0SDavid Wu unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1181bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1182bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1183bf0e94d0SDavid Wu unsigned int rx_delay; 1184bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1185bf0e94d0SDavid Wu struct rk3588_sys_grf *grf; 1186bf0e94d0SDavid Wu void *offset_con; 1187bf0e94d0SDavid Wu 1188bf0e94d0SDavid Wu enum { 1189bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1190bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1191bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1192bf0e94d0SDavid Wu 1193bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1194bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1195bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1196bf0e94d0SDavid Wu 1197bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1198bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1199bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1200bf0e94d0SDavid Wu }; 1201bf0e94d0SDavid Wu 1202bf0e94d0SDavid Wu enum { 1203bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1204bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1205bf0e94d0SDavid Wu 1206bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1207bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1208bf0e94d0SDavid Wu }; 1209bf0e94d0SDavid Wu 1210bf0e94d0SDavid Wu enum { 1211bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1212bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1213bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1214bf0e94d0SDavid Wu }; 1215bf0e94d0SDavid Wu 1216bf0e94d0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1217bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1218bf0e94d0SDavid Wu 1219bf0e94d0SDavid Wu if (pdata->rx_delay < 0) { 1220bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1221bf0e94d0SDavid Wu rx_delay = 0; 1222bf0e94d0SDavid Wu } else { 1223bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1224bf0e94d0SDavid Wu rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1225bf0e94d0SDavid Wu } 1226bf0e94d0SDavid Wu 1227bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1228bf0e94d0SDavid Wu offset_con = &grf->soc_con9; 1229bf0e94d0SDavid Wu rx_enable = rx_delay << 2; 1230bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1231bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1232bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1233bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1234bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1235bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1236bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1237bf0e94d0SDavid Wu } else { 1238bf0e94d0SDavid Wu offset_con = &grf->soc_con8; 1239bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1240bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1241bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1242bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1243bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1244bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1245bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1246bf0e94d0SDavid Wu } 1247bf0e94d0SDavid Wu 1248bf0e94d0SDavid Wu rk_clrsetreg(offset_con, 1249bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1250bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1251c5bdc99aSJianqun Xu (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) | 1252bf0e94d0SDavid Wu rx_delay); 1253bf0e94d0SDavid Wu 1254bf0e94d0SDavid Wu rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1255bf0e94d0SDavid Wu tx_enable | rx_enable); 1256bf0e94d0SDavid Wu 1257bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1258bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1259bf0e94d0SDavid Wu } 1260bf0e94d0SDavid Wu 126120bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 126220bef841SDavid Wu { 126320bef841SDavid Wu struct rv1106_grf *grf; 1264535678cdSDavid Wu unsigned char bgs[1] = {0}; 1265535678cdSDavid Wu 1266535678cdSDavid Wu enum { 1267535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1268535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1269535678cdSDavid Wu }; 127054f7ad44SDavid Wu 127154f7ad44SDavid Wu enum { 127220bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK = BIT(1), 127354f7ad44SDavid Wu RV1106_MACPHY_DISENABLE = BIT(1), 127454f7ad44SDavid Wu RV1106_MACPHY_ENABLE = 0, 127520bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 127620bef841SDavid Wu RV1106_MACPHY_XMII_SEL = BIT(6), 127720bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 127820bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 127920bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 128020bef841SDavid Wu RV1106_MACPHY_PHY_ID = BIT(11), 128120bef841SDavid Wu }; 128220bef841SDavid Wu 128320bef841SDavid Wu enum { 128420bef841SDavid Wu RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 128554f7ad44SDavid Wu RV1106_MACPHY_BGS = BIT(2), 128620bef841SDavid Wu }; 128720bef841SDavid Wu 1288535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1289535678cdSDavid Wu struct udevice *dev; 1290535678cdSDavid Wu u32 regs[2] = {0}; 1291535678cdSDavid Wu ofnode node; 1292535678cdSDavid Wu int ret = 0; 1293535678cdSDavid Wu 1294535678cdSDavid Wu /* retrieve the device */ 1295535678cdSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1296535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1297535678cdSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1298535678cdSDavid Wu &dev); 1299535678cdSDavid Wu else 1300535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1301535678cdSDavid Wu DM_GET_DRIVER(rockchip_otp), 1302535678cdSDavid Wu &dev); 1303535678cdSDavid Wu if (!ret) { 1304535678cdSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1305535678cdSDavid Wu if (ofnode_valid(node)) { 1306535678cdSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1307535678cdSDavid Wu /* read the bgs from the efuses */ 1308535678cdSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1309535678cdSDavid Wu if (ret) { 1310535678cdSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1311535678cdSDavid Wu ret); 1312535678cdSDavid Wu bgs[0] = 0; 1313535678cdSDavid Wu } 1314535678cdSDavid Wu } 1315535678cdSDavid Wu } 1316535678cdSDavid Wu } 1317535678cdSDavid Wu #endif 1318535678cdSDavid Wu 131920bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 132020bef841SDavid Wu 132120bef841SDavid Wu reset_assert(&pdata->phy_reset); 132220bef841SDavid Wu udelay(20); 132320bef841SDavid Wu rk_clrsetreg(&grf->macphy_con0, 132420bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK | 132520bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK | 132620bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK | 132720bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK, 132820bef841SDavid Wu RV1106_MACPHY_ENABLE | 132920bef841SDavid Wu RV1106_MACPHY_XMII_SEL | 133020bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M | 133120bef841SDavid Wu RV1106_MACPHY_PHY_ID); 133220bef841SDavid Wu 133320bef841SDavid Wu rk_clrsetreg(&grf->macphy_con1, 133420bef841SDavid Wu RV1106_MACPHY_BGS_MASK, 1335535678cdSDavid Wu bgs[0]); 13368bafa3a1SDavid Wu udelay(20); 133720bef841SDavid Wu reset_deassert(&pdata->phy_reset); 133820bef841SDavid Wu udelay(30 * 1000); 133920bef841SDavid Wu } 134020bef841SDavid Wu 13418bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 13428bafa3a1SDavid Wu { 13438bafa3a1SDavid Wu struct rv1106_grf *grf; 13448bafa3a1SDavid Wu enum { 13458bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 13468bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 13478bafa3a1SDavid Wu }; 13488bafa3a1SDavid Wu 13498bafa3a1SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 13508bafa3a1SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 13518bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 13528bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE); 13538bafa3a1SDavid Wu }; 13548bafa3a1SDavid Wu 1355e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1356e4e3f431SDavid Wu { 1357e4e3f431SDavid Wu struct rv1126_grf *grf; 1358e4e3f431SDavid Wu 1359e4e3f431SDavid Wu enum { 1360e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1361e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1362e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1363e4e3f431SDavid Wu }; 1364e4e3f431SDavid Wu 1365e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1366e4e3f431SDavid Wu 1367e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1368e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1369e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1370e4e3f431SDavid Wu } 1371e4e3f431SDavid Wu 1372dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1373dcfb333aSDavid Wu { 1374dcfb333aSDavid Wu struct rv1126_grf *grf; 1375dcfb333aSDavid Wu 1376dcfb333aSDavid Wu enum { 1377dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1378dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1379dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1380dcfb333aSDavid Wu 1381dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1382dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1383dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1384dcfb333aSDavid Wu 1385dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1386dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1387dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1388dcfb333aSDavid Wu 1389dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1390dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1391dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1392dcfb333aSDavid Wu 1393dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1394dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1395dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1396dcfb333aSDavid Wu }; 1397dcfb333aSDavid Wu enum { 1398dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1399dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1400dcfb333aSDavid Wu 1401dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1402dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1403dcfb333aSDavid Wu }; 1404dcfb333aSDavid Wu enum { 1405dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1406dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1407dcfb333aSDavid Wu 1408dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1409dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1410dcfb333aSDavid Wu }; 1411dcfb333aSDavid Wu 1412dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1413dcfb333aSDavid Wu 1414dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1415dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1416dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1417dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1418dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1419dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1420dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1421dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1422dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1423dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1424dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1425dcfb333aSDavid Wu 1426dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1427dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1428dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1429c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) | 1430c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT)); 1431dcfb333aSDavid Wu 1432dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1433dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1434dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1435c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) | 1436c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT)); 1437dcfb333aSDavid Wu } 14386f0a52e9SDavid Wu #endif 14390a33ce65SDavid Wu 1440bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1441bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1442bf0e94d0SDavid Wu { 1443bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1444bf0e94d0SDavid Wu unsigned int val, mask; 1445bf0e94d0SDavid Wu 1446bf0e94d0SDavid Wu enum { 1447bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 1448bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_MASK = BIT(4), 1449bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU = BIT(4), 1450bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_IO = 0, 1451bf0e94d0SDavid Wu }; 1452bf0e94d0SDavid Wu 1453bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1454bf0e94d0SDavid Wu val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 1455bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU; 1456bf0e94d0SDavid Wu mask = RK3588_GMAC_CLK_SELET_MASK; 1457bf0e94d0SDavid Wu 1458bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1459bf0e94d0SDavid Wu val <<= 5; 1460bf0e94d0SDavid Wu mask <<= 5; 1461bf0e94d0SDavid Wu } 1462bf0e94d0SDavid Wu 1463bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, mask, val); 1464bf0e94d0SDavid Wu } 1465bf0e94d0SDavid Wu #endif 1466bf0e94d0SDavid Wu 14670125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 14680125bcf0SSjoerd Simons { 14690125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 14701f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 14711f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 14726f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14736f0a52e9SDavid Wu struct eqos_config *config; 14746f0a52e9SDavid Wu #else 14756f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 14766f0a52e9SDavid Wu #endif 14776f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 14780125bcf0SSjoerd Simons struct clk clk; 14790a33ce65SDavid Wu ulong rate; 14800125bcf0SSjoerd Simons int ret; 14810125bcf0SSjoerd Simons 14826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14836f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 14846f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 1485befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 14866f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 14876f0a52e9SDavid Wu #else 14886f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 14896f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 14906f0a52e9SDavid Wu #endif 149133a014bdSDavid Wu pdata->bus_id = dev->seq; 149254f7ad44SDavid Wu 1493cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1494cadc8d74SKever Yang ret = clk_set_defaults(dev); 1495cadc8d74SKever Yang if (ret) 1496cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 1497cadc8d74SKever Yang 14980125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 14990125bcf0SSjoerd Simons if (ret) 15000125bcf0SSjoerd Simons return ret; 15010125bcf0SSjoerd Simons 1502491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 1503491f3bfbSDavid Wu 1504bf0e94d0SDavid Wu if (ops->set_clock_selection) 1505bf0e94d0SDavid Wu ops->set_clock_selection(pdata); 1506bf0e94d0SDavid Wu 1507491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 1508491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 1509491f3bfbSDavid Wu 15100a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 15110a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 1512bf0e94d0SDavid Wu case PHY_INTERFACE_MODE_RGMII_RXID: 15130a33ce65SDavid Wu /* 15140a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 15150a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 15160a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 15170a33ce65SDavid Wu * is not set, because of it is bypassed. 15180a33ce65SDavid Wu */ 15190a33ce65SDavid Wu if (!pdata->clock_input) { 15200a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 15210a33ce65SDavid Wu if (rate != 125000000) 15220a33ce65SDavid Wu return -EINVAL; 15230a33ce65SDavid Wu } 15240125bcf0SSjoerd Simons 1525bf0e94d0SDavid Wu if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 1526bf0e94d0SDavid Wu pdata->rx_delay = -1; 1527bf0e94d0SDavid Wu 15280125bcf0SSjoerd Simons /* Set to RGMII mode */ 15290a33ce65SDavid Wu if (ops->set_to_rgmii) 15301f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 15310a33ce65SDavid Wu else 15320a33ce65SDavid Wu return -EPERM; 15330a33ce65SDavid Wu 15340a33ce65SDavid Wu break; 15350a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 15360a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 15370a33ce65SDavid Wu if (!pdata->clock_input) { 15380a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 15390a33ce65SDavid Wu if (rate != 50000000) 15400a33ce65SDavid Wu return -EINVAL; 15410a33ce65SDavid Wu } 15420a33ce65SDavid Wu 15430a33ce65SDavid Wu /* Set to RMII mode */ 15440a33ce65SDavid Wu if (ops->set_to_rmii) 15450a33ce65SDavid Wu ops->set_to_rmii(pdata); 15460a33ce65SDavid Wu 15470a33ce65SDavid Wu break; 15480a33ce65SDavid Wu default: 15490a33ce65SDavid Wu debug("NO interface defined!\n"); 15500a33ce65SDavid Wu return -ENXIO; 15510a33ce65SDavid Wu } 15520125bcf0SSjoerd Simons 15536f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15546f0a52e9SDavid Wu return eqos_probe(dev); 15556f0a52e9SDavid Wu #else 15560125bcf0SSjoerd Simons return designware_eth_probe(dev); 15576f0a52e9SDavid Wu #endif 15586f0a52e9SDavid Wu } 15596f0a52e9SDavid Wu 15606f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 15616f0a52e9SDavid Wu { 15626f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 15636f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 15646f0a52e9SDavid Wu #else 15656f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 15666f0a52e9SDavid Wu #endif 15676f0a52e9SDavid Wu } 15686f0a52e9SDavid Wu 15696f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 15706f0a52e9SDavid Wu int length) 15716f0a52e9SDavid Wu { 15726f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15736f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 15746f0a52e9SDavid Wu #else 15756f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 15766f0a52e9SDavid Wu #endif 15776f0a52e9SDavid Wu } 15786f0a52e9SDavid Wu 15796f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 15806f0a52e9SDavid Wu int length) 15816f0a52e9SDavid Wu { 15826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15836f0a52e9SDavid Wu return eqos_send(dev, packet, length); 15846f0a52e9SDavid Wu #else 15856f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 15866f0a52e9SDavid Wu #endif 15876f0a52e9SDavid Wu } 15886f0a52e9SDavid Wu 15896f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 15906f0a52e9SDavid Wu uchar **packetp) 15916f0a52e9SDavid Wu { 15926f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15936f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 15946f0a52e9SDavid Wu #else 15956f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 15966f0a52e9SDavid Wu #endif 15970125bcf0SSjoerd Simons } 15980125bcf0SSjoerd Simons 15990125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 16000125bcf0SSjoerd Simons { 16016f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 16021f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 16031f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 16046f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1605491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 16066f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 16076f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 16086f0a52e9SDavid Wu #endif 16090125bcf0SSjoerd Simons int ret; 16100125bcf0SSjoerd Simons 16116f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 16126f0a52e9SDavid Wu ret = eqos_init(dev); 16136f0a52e9SDavid Wu #else 16146f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 16156f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 16166f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 16176f0a52e9SDavid Wu eth_pdata->enetaddr); 16186f0a52e9SDavid Wu #endif 16190125bcf0SSjoerd Simons if (ret) 16200125bcf0SSjoerd Simons return ret; 1621491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 16220125bcf0SSjoerd Simons if (ret) 16230125bcf0SSjoerd Simons return ret; 16246f0a52e9SDavid Wu 16256f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 16266f0a52e9SDavid Wu eqos_enable(dev); 16276f0a52e9SDavid Wu #else 16286f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 16290125bcf0SSjoerd Simons if (ret) 16300125bcf0SSjoerd Simons return ret; 16316f0a52e9SDavid Wu #endif 16320125bcf0SSjoerd Simons 16330125bcf0SSjoerd Simons return 0; 16340125bcf0SSjoerd Simons } 16350125bcf0SSjoerd Simons 16366f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 16376f0a52e9SDavid Wu { 16386f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 16396f0a52e9SDavid Wu eqos_stop(dev); 16406f0a52e9SDavid Wu #else 16416f0a52e9SDavid Wu designware_eth_stop(dev); 16426f0a52e9SDavid Wu #endif 16436f0a52e9SDavid Wu } 16446f0a52e9SDavid Wu 16450125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 16460125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 16476f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 16486f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 16496f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 16506f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 16516f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 16520125bcf0SSjoerd Simons }; 16530125bcf0SSjoerd Simons 16546f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 165518ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 165618ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 165718ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 165818ae91c8SDavid Wu }; 165918ae91c8SDavid Wu 1660ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 1661ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 1662ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 1663ff86648dSDavid Wu }; 1664ff86648dSDavid Wu 1665af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 1666af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 1667491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 1668af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1669491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 1670af166ffaSDavid Wu }; 1671af166ffaSDavid Wu 16721f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 16731f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 16741f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 16751f08aa1cSPhilipp Tomsich }; 16761f08aa1cSPhilipp Tomsich 167723adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 167823adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 167923adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 168023adb58fSDavid Wu }; 168123adb58fSDavid Wu 1682c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 1683c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1684491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 1685c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1686491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 1687c36b26c0SDavid Wu }; 1688c36b26c0SDavid Wu 1689793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 1690793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1691793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1692793f2fd2SPhilipp Tomsich }; 1693793f2fd2SPhilipp Tomsich 16941f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 16951f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 16961f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 16971f08aa1cSPhilipp Tomsich }; 16981f08aa1cSPhilipp Tomsich 16990a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 17000a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 17010a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 17020a33ce65SDavid Wu }; 1703dcfb333aSDavid Wu #else 170433a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 170533a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 170633a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 170733a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 170833a014bdSDavid Wu }; 170933a014bdSDavid Wu 1710bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = { 1711bf0e94d0SDavid Wu .fix_mac_speed = rk3588_set_rgmii_speed, 1712bf0e94d0SDavid Wu .set_to_rgmii = rk3588_set_to_rgmii, 1713bf0e94d0SDavid Wu .set_to_rmii = rk3588_set_to_rmii, 1714bf0e94d0SDavid Wu .set_clock_selection = rk3588_set_clock_selection, 1715bf0e94d0SDavid Wu }; 1716bf0e94d0SDavid Wu 171720bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = { 171820bef841SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 17198bafa3a1SDavid Wu .set_to_rmii = rv1106_set_to_rmii, 172020bef841SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 172120bef841SDavid Wu }; 172220bef841SDavid Wu 1723dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 1724dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 1725dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 1726e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 1727dcfb333aSDavid Wu }; 17286f0a52e9SDavid Wu #endif 17290a33ce65SDavid Wu 17300125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 17316f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 173284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30 173318ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 173418ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 173584e90485SDavid Wu #endif 173684e90485SDavid Wu 173784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808 1738ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 1739ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 174084e90485SDavid Wu #endif 174184e90485SDavid Wu 174284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228 1743af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 1744af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 174584e90485SDavid Wu #endif 174684e90485SDavid Wu 174784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288 17481f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 17491f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 175084e90485SDavid Wu #endif 175184e90485SDavid Wu 175284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308 175323adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 175423adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 175584e90485SDavid Wu #endif 175684e90485SDavid Wu 175784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328 1758c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 1759c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 176084e90485SDavid Wu #endif 176184e90485SDavid Wu 176284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368 1763793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 1764793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 176584e90485SDavid Wu #endif 176684e90485SDavid Wu 176784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399 17681f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 17691f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 177084e90485SDavid Wu #endif 177184e90485SDavid Wu 177284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108 17730a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 17740a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 177584e90485SDavid Wu #endif 1776dcfb333aSDavid Wu #else 177784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568 177833a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 177933a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 178084e90485SDavid Wu #endif 178184e90485SDavid Wu 1782bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588 1783bf0e94d0SDavid Wu { .compatible = "rockchip,rk3588-gmac", 1784bf0e94d0SDavid Wu .data = (ulong)&rk3588_gmac_ops }, 1785bf0e94d0SDavid Wu #endif 1786bf0e94d0SDavid Wu 178720bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106 178820bef841SDavid Wu { .compatible = "rockchip,rv1106-gmac", 178920bef841SDavid Wu .data = (ulong)&rv1106_gmac_ops }, 179020bef841SDavid Wu #endif 179120bef841SDavid Wu 179284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126 1793dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 1794dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 17956f0a52e9SDavid Wu #endif 179684e90485SDavid Wu #endif 17970125bcf0SSjoerd Simons { } 17980125bcf0SSjoerd Simons }; 17990125bcf0SSjoerd Simons 18000125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 18010125bcf0SSjoerd Simons .name = "gmac_rockchip", 18020125bcf0SSjoerd Simons .id = UCLASS_ETH, 18030125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 18040125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 18050125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 18060125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 18076f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 18080125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 18090125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 18100125bcf0SSjoerd Simons }; 1811