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 21*c563400aSDavid Wu #include <asm/arch/grf_rk3528.h> 2233a014bdSDavid Wu #include <asm/arch/grf_rk3568.h> 23bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h> 2420bef841SDavid Wu #include <asm/arch/grf_rv1106.h> 25dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 266f0a52e9SDavid Wu #include "dwc_eth_qos.h" 276f0a52e9SDavid Wu #else 2818ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 29ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 30af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 310125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 3223adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 33c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 34793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 351f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 360a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 370125bcf0SSjoerd Simons #include "designware.h" 386f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 396f0a52e9SDavid Wu #endif 406f0a52e9SDavid Wu #include <dm/pinctrl.h> 41491f3bfbSDavid Wu #include <dm/of_access.h> 420125bcf0SSjoerd Simons 430125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 440125bcf0SSjoerd Simons 456f0a52e9SDavid Wu struct rockchip_eth_dev { 466f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 476f0a52e9SDavid Wu struct eqos_priv eqos; 486f0a52e9SDavid Wu #else 496f0a52e9SDavid Wu struct dw_eth_dev dw; 506f0a52e9SDavid Wu #endif 51491f3bfbSDavid Wu int phy_interface; 526f0a52e9SDavid Wu }; 536f0a52e9SDavid Wu 540125bcf0SSjoerd Simons /* 550125bcf0SSjoerd Simons * Platform data for the gmac 560125bcf0SSjoerd Simons * 570125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 580125bcf0SSjoerd Simons */ 590125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 606f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 610125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 626f0a52e9SDavid Wu #else 636f0a52e9SDavid Wu struct eth_pdata eth_pdata; 646f0a52e9SDavid Wu #endif 65491f3bfbSDavid Wu struct reset_ctl phy_reset; 66491f3bfbSDavid Wu bool integrated_phy; 670a33ce65SDavid Wu bool clock_input; 68491f3bfbSDavid Wu int phy_interface; 690125bcf0SSjoerd Simons int tx_delay; 700125bcf0SSjoerd Simons int rx_delay; 7133a014bdSDavid Wu int bus_id; 720125bcf0SSjoerd Simons }; 730125bcf0SSjoerd Simons 741f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 756f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 766f0a52e9SDavid Wu const struct eqos_config config; 776f0a52e9SDavid Wu #endif 78491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 79491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 800a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 811f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 82bf0e94d0SDavid Wu void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 83491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 841f08aa1cSPhilipp Tomsich }; 851f08aa1cSPhilipp Tomsich 86befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 87befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 88befcb627SDavid Wu .reg_access_always_ok = false, 89befcb627SDavid Wu .mdio_wait = 10000, 90befcb627SDavid Wu .swr_wait = 200, 91befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 92befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 93befcb627SDavid Wu .ops = &eqos_rockchip_ops, 94befcb627SDavid Wu }; 95befcb627SDavid Wu #endif 96befcb627SDavid Wu 971eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 981eb9d064SDavid Wu { 991eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1001eb9d064SDavid Wu struct rk_gmac_ops *ops = 1011eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 1021eb9d064SDavid Wu 1031eb9d064SDavid Wu pdata->tx_delay = tx_delay; 1041eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1051eb9d064SDavid Wu 1061eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1071eb9d064SDavid Wu } 1081f08aa1cSPhilipp Tomsich 1090125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1100125bcf0SSjoerd Simons { 1110125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 112491f3bfbSDavid Wu struct ofnode_phandle_args args; 11354f7ad44SDavid Wu struct udevice *phydev; 1140a33ce65SDavid Wu const char *string; 115491f3bfbSDavid Wu int ret; 1160a33ce65SDavid Wu 1170a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1180a33ce65SDavid Wu if (!strcmp(string, "input")) 1190a33ce65SDavid Wu pdata->clock_input = true; 1200a33ce65SDavid Wu else 1210a33ce65SDavid Wu pdata->clock_input = false; 1220125bcf0SSjoerd Simons 123491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 124491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 125491f3bfbSDavid Wu if (ret) { 126491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 127491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 128491f3bfbSDavid Wu } else { 129491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 130491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 131491f3bfbSDavid Wu "phy-is-integrated"); 132491f3bfbSDavid Wu } 133491f3bfbSDavid Wu 134491f3bfbSDavid Wu if (pdata->integrated_phy) { 135491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 136491f3bfbSDavid Wu if (ret) { 13754f7ad44SDavid Wu ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 13854f7ad44SDavid Wu if (ret) { 13954f7ad44SDavid Wu debug("Get phydev by ofnode failed: err=%d\n", ret); 14054f7ad44SDavid Wu return ret; 14154f7ad44SDavid Wu } 14254f7ad44SDavid Wu 14354f7ad44SDavid Wu ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 14454f7ad44SDavid Wu if (ret) { 145491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 146491f3bfbSDavid Wu return ret; 147491f3bfbSDavid Wu } 148491f3bfbSDavid Wu } 14954f7ad44SDavid Wu } 150491f3bfbSDavid Wu 1511f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1527ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1537ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1541f08aa1cSPhilipp Tomsich 1551f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1561f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1577ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1581f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1597ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1600125bcf0SSjoerd Simons 1616f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1626f0a52e9SDavid Wu return 0; 1636f0a52e9SDavid Wu #else 1640125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1656f0a52e9SDavid Wu #endif 1660125bcf0SSjoerd Simons } 1670125bcf0SSjoerd Simons 1686f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 169491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 170491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 17118ae91c8SDavid Wu { 1726f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 17318ae91c8SDavid Wu struct px30_grf *grf; 17418ae91c8SDavid Wu struct clk clk_speed; 17518ae91c8SDavid Wu int speed, ret; 17618ae91c8SDavid Wu enum { 17718ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 17818ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 17918ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 18018ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 18118ae91c8SDavid Wu }; 18218ae91c8SDavid Wu 18318ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 18418ae91c8SDavid Wu &clk_speed); 18518ae91c8SDavid Wu if (ret) 18618ae91c8SDavid Wu return ret; 18718ae91c8SDavid Wu 18818ae91c8SDavid Wu switch (priv->phydev->speed) { 18918ae91c8SDavid Wu case 10: 19018ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 19118ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 19218ae91c8SDavid Wu if (ret) 19318ae91c8SDavid Wu return ret; 19418ae91c8SDavid Wu break; 19518ae91c8SDavid Wu case 100: 19618ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 19718ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 19818ae91c8SDavid Wu if (ret) 19918ae91c8SDavid Wu return ret; 20018ae91c8SDavid Wu break; 20118ae91c8SDavid Wu default: 20218ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 20318ae91c8SDavid Wu return -EINVAL; 20418ae91c8SDavid Wu } 20518ae91c8SDavid Wu 20618ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 20718ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 20818ae91c8SDavid Wu 20918ae91c8SDavid Wu return 0; 21018ae91c8SDavid Wu } 21118ae91c8SDavid Wu 212491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 213491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 214ff86648dSDavid Wu { 2156f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 216ff86648dSDavid Wu struct clk clk_speed; 217ff86648dSDavid Wu int ret; 218ff86648dSDavid Wu 219ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 220ff86648dSDavid Wu &clk_speed); 221ff86648dSDavid Wu if (ret) 222ff86648dSDavid Wu return ret; 223ff86648dSDavid Wu 224ff86648dSDavid Wu switch (priv->phydev->speed) { 225ff86648dSDavid Wu case 10: 226ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 227ff86648dSDavid Wu if (ret) 228ff86648dSDavid Wu return ret; 229ff86648dSDavid Wu break; 230ff86648dSDavid Wu case 100: 231ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 232ff86648dSDavid Wu if (ret) 233ff86648dSDavid Wu return ret; 234ff86648dSDavid Wu break; 235ff86648dSDavid Wu case 1000: 236ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 237ff86648dSDavid Wu if (ret) 238ff86648dSDavid Wu return ret; 239ff86648dSDavid Wu break; 240ff86648dSDavid Wu default: 241ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 242ff86648dSDavid Wu return -EINVAL; 243ff86648dSDavid Wu } 244ff86648dSDavid Wu 245ff86648dSDavid Wu return 0; 246ff86648dSDavid Wu } 247ff86648dSDavid Wu 248491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 249491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 250af166ffaSDavid Wu { 2516f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 252af166ffaSDavid Wu struct rk322x_grf *grf; 253af166ffaSDavid Wu int clk; 254af166ffaSDavid Wu enum { 255af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 256af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 257af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 258af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 259af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 260491f3bfbSDavid Wu 261491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 262491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 263491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 264491f3bfbSDavid Wu 265491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 266491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 267491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 268af166ffaSDavid Wu }; 269af166ffaSDavid Wu 270af166ffaSDavid Wu switch (priv->phydev->speed) { 271af166ffaSDavid Wu case 10: 272491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 273491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 274491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 275af166ffaSDavid Wu break; 276af166ffaSDavid Wu case 100: 277491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 278491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 279491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 280af166ffaSDavid Wu break; 281af166ffaSDavid Wu case 1000: 282af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 283af166ffaSDavid Wu break; 284af166ffaSDavid Wu default: 285af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 286af166ffaSDavid Wu return -EINVAL; 287af166ffaSDavid Wu } 288af166ffaSDavid Wu 289af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 290491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 291491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 292491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 293491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 294491f3bfbSDavid Wu clk); 295af166ffaSDavid Wu 296af166ffaSDavid Wu return 0; 297af166ffaSDavid Wu } 298af166ffaSDavid Wu 299491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 300491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 3010125bcf0SSjoerd Simons { 3026f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 3030125bcf0SSjoerd Simons struct rk3288_grf *grf; 3040125bcf0SSjoerd Simons int clk; 3050125bcf0SSjoerd Simons 3060125bcf0SSjoerd Simons switch (priv->phydev->speed) { 3070125bcf0SSjoerd Simons case 10: 3081f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 3090125bcf0SSjoerd Simons break; 3100125bcf0SSjoerd Simons case 100: 3111f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 3120125bcf0SSjoerd Simons break; 3130125bcf0SSjoerd Simons case 1000: 3141f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3150125bcf0SSjoerd Simons break; 3160125bcf0SSjoerd Simons default: 3170125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3180125bcf0SSjoerd Simons return -EINVAL; 3190125bcf0SSjoerd Simons } 3200125bcf0SSjoerd Simons 3210125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3221f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3230125bcf0SSjoerd Simons 3240125bcf0SSjoerd Simons return 0; 3250125bcf0SSjoerd Simons } 3260125bcf0SSjoerd Simons 327491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 328491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 32923adb58fSDavid Wu { 3306f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 33123adb58fSDavid Wu struct rk3308_grf *grf; 33223adb58fSDavid Wu struct clk clk_speed; 33323adb58fSDavid Wu int speed, ret; 33423adb58fSDavid Wu enum { 33523adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 33623adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 33723adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 33823adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 33923adb58fSDavid Wu }; 34023adb58fSDavid Wu 34123adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 34223adb58fSDavid Wu &clk_speed); 34323adb58fSDavid Wu if (ret) 34423adb58fSDavid Wu return ret; 34523adb58fSDavid Wu 34623adb58fSDavid Wu switch (priv->phydev->speed) { 34723adb58fSDavid Wu case 10: 34823adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 34923adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 35023adb58fSDavid Wu if (ret) 35123adb58fSDavid Wu return ret; 35223adb58fSDavid Wu break; 35323adb58fSDavid Wu case 100: 35423adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 35523adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 35623adb58fSDavid Wu if (ret) 35723adb58fSDavid Wu return ret; 35823adb58fSDavid Wu break; 35923adb58fSDavid Wu default: 36023adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 36123adb58fSDavid Wu return -EINVAL; 36223adb58fSDavid Wu } 36323adb58fSDavid Wu 36423adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 36523adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 36623adb58fSDavid Wu 36723adb58fSDavid Wu return 0; 36823adb58fSDavid Wu } 36923adb58fSDavid Wu 370491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 371491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 372c36b26c0SDavid Wu { 3736f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 374c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 375c36b26c0SDavid Wu int clk; 376c36b26c0SDavid Wu enum { 377c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 378c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 379c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 380c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 381c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 382491f3bfbSDavid Wu 383491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 384491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 385491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 386491f3bfbSDavid Wu 387491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 388491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 389491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 390c36b26c0SDavid Wu }; 391c36b26c0SDavid Wu 392c36b26c0SDavid Wu switch (priv->phydev->speed) { 393c36b26c0SDavid Wu case 10: 394491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 395491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 396491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 397c36b26c0SDavid Wu break; 398c36b26c0SDavid Wu case 100: 399491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 400491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 401491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 402c36b26c0SDavid Wu break; 403c36b26c0SDavid Wu case 1000: 404c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 405c36b26c0SDavid Wu break; 406c36b26c0SDavid Wu default: 407c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 408c36b26c0SDavid Wu return -EINVAL; 409c36b26c0SDavid Wu } 410c36b26c0SDavid Wu 411c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 412491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 413491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 414491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 415491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 416491f3bfbSDavid Wu clk); 417c36b26c0SDavid Wu 418c36b26c0SDavid Wu return 0; 419c36b26c0SDavid Wu } 420c36b26c0SDavid Wu 421491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 422491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 423793f2fd2SPhilipp Tomsich { 4246f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 425793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 426793f2fd2SPhilipp Tomsich int clk; 427793f2fd2SPhilipp Tomsich enum { 428793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 429793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 430793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 431793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 432793f2fd2SPhilipp Tomsich }; 433793f2fd2SPhilipp Tomsich 434793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 435793f2fd2SPhilipp Tomsich case 10: 436793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 437793f2fd2SPhilipp Tomsich break; 438793f2fd2SPhilipp Tomsich case 100: 439793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 440793f2fd2SPhilipp Tomsich break; 441793f2fd2SPhilipp Tomsich case 1000: 442793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 443793f2fd2SPhilipp Tomsich break; 444793f2fd2SPhilipp Tomsich default: 445793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 446793f2fd2SPhilipp Tomsich return -EINVAL; 447793f2fd2SPhilipp Tomsich } 448793f2fd2SPhilipp Tomsich 449793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 450793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 451793f2fd2SPhilipp Tomsich 452793f2fd2SPhilipp Tomsich return 0; 453793f2fd2SPhilipp Tomsich } 454793f2fd2SPhilipp Tomsich 455491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 456491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4571f08aa1cSPhilipp Tomsich { 4586f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4591f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4601f08aa1cSPhilipp Tomsich int clk; 4611f08aa1cSPhilipp Tomsich 4621f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4631f08aa1cSPhilipp Tomsich case 10: 4641f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4651f08aa1cSPhilipp Tomsich break; 4661f08aa1cSPhilipp Tomsich case 100: 4671f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4681f08aa1cSPhilipp Tomsich break; 4691f08aa1cSPhilipp Tomsich case 1000: 4701f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4711f08aa1cSPhilipp Tomsich break; 4721f08aa1cSPhilipp Tomsich default: 4731f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4741f08aa1cSPhilipp Tomsich return -EINVAL; 4751f08aa1cSPhilipp Tomsich } 4761f08aa1cSPhilipp Tomsich 4771f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4781f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4791f08aa1cSPhilipp Tomsich 4801f08aa1cSPhilipp Tomsich return 0; 4811f08aa1cSPhilipp Tomsich } 4821f08aa1cSPhilipp Tomsich 483491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 484491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4850a33ce65SDavid Wu { 4866f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4870a33ce65SDavid Wu struct rv1108_grf *grf; 4880a33ce65SDavid Wu int clk, speed; 4890a33ce65SDavid Wu enum { 4900a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4910a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4920a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4930a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4940a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4950a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4960a33ce65SDavid Wu }; 4970a33ce65SDavid Wu 4980a33ce65SDavid Wu switch (priv->phydev->speed) { 4990a33ce65SDavid Wu case 10: 5000a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 5010a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 5020a33ce65SDavid Wu break; 5030a33ce65SDavid Wu case 100: 5040a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 5050a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 5060a33ce65SDavid Wu break; 5070a33ce65SDavid Wu default: 5080a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 5090a33ce65SDavid Wu return -EINVAL; 5100a33ce65SDavid Wu } 5110a33ce65SDavid Wu 5120a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5130a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 5140a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5150a33ce65SDavid Wu clk | speed); 5160a33ce65SDavid Wu 5170a33ce65SDavid Wu return 0; 5180a33ce65SDavid Wu } 519dcfb333aSDavid Wu #else 520*c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 521*c563400aSDavid Wu struct rockchip_eth_dev *dev) 522*c563400aSDavid Wu { 523*c563400aSDavid Wu struct eqos_priv *priv = &dev->eqos; 524*c563400aSDavid Wu struct rk3528_grf *grf; 525*c563400aSDavid Wu unsigned int div; 526*c563400aSDavid Wu 527*c563400aSDavid Wu enum { 528*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3, 529*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3), 530*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3), 531*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV20 = 0, 532*c563400aSDavid Wu }; 533*c563400aSDavid Wu 534*c563400aSDavid Wu enum { 535*c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10, 536*c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10), 537*c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV1 = 0, 538*c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10), 539*c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11), 540*c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11), 541*c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_DIV20 = 0, 542*c563400aSDavid Wu }; 543*c563400aSDavid Wu 544*c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 545*c563400aSDavid Wu 546*c563400aSDavid Wu switch (priv->phy->speed) { 547*c563400aSDavid Wu case 10: 548*c563400aSDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 549*c563400aSDavid Wu div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 : 550*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV20; 551*c563400aSDavid Wu else 552*c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV50; 553*c563400aSDavid Wu break; 554*c563400aSDavid Wu case 100: 555*c563400aSDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 556*c563400aSDavid Wu div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 : 557*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV2; 558*c563400aSDavid Wu else 559*c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV5; 560*c563400aSDavid Wu break; 561*c563400aSDavid Wu case 1000: 562*c563400aSDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 563*c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV1; 564*c563400aSDavid Wu else 565*c563400aSDavid Wu return -EINVAL; 566*c563400aSDavid Wu break; 567*c563400aSDavid Wu default: 568*c563400aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 569*c563400aSDavid Wu return -EINVAL; 570*c563400aSDavid Wu } 571*c563400aSDavid Wu 572*c563400aSDavid Wu if (pdata->bus_id) 573*c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div); 574*c563400aSDavid Wu else 575*c563400aSDavid Wu rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div); 576*c563400aSDavid Wu 577*c563400aSDavid Wu return 0; 578*c563400aSDavid Wu } 579*c563400aSDavid Wu 580bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 581bf0e94d0SDavid Wu struct rockchip_eth_dev *dev) 582bf0e94d0SDavid Wu { 583bf0e94d0SDavid Wu struct eqos_priv *priv = &dev->eqos; 584bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 585bf0e94d0SDavid Wu unsigned int div, div_mask; 586bf0e94d0SDavid Wu 587bf0e94d0SDavid Wu enum { 588bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 589bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 590bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV1 = 0, 591a116113dSDavid Wu RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 592bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 5936d863a16SDavid Wu RK3588_GMAC_CLK_RMII_DIV2 = BIT(2), 594bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_DIV20 = 0, 5956d863a16SDavid Wu RK3588_GMAC1_ID_SHIFT = 5, 596bf0e94d0SDavid Wu }; 597bf0e94d0SDavid Wu 598bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 599bf0e94d0SDavid Wu 600bf0e94d0SDavid Wu switch (priv->phy->speed) { 601bf0e94d0SDavid Wu case 10: 602bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 603bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV20; 604bf0e94d0SDavid Wu else 605bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV50; 606bf0e94d0SDavid Wu break; 607bf0e94d0SDavid Wu case 100: 608bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 6096d863a16SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV2; 610bf0e94d0SDavid Wu else 611bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV5; 612bf0e94d0SDavid Wu break; 613bf0e94d0SDavid Wu case 1000: 614bf0e94d0SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 615bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV1; 616bf0e94d0SDavid Wu else 617bf0e94d0SDavid Wu return -EINVAL; 618bf0e94d0SDavid Wu break; 619bf0e94d0SDavid Wu default: 620bf0e94d0SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 621bf0e94d0SDavid Wu return -EINVAL; 622bf0e94d0SDavid Wu } 623bf0e94d0SDavid Wu 624bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 625bf0e94d0SDavid Wu div <<= 5; 626bf0e94d0SDavid Wu div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 627bf0e94d0SDavid Wu } 628bf0e94d0SDavid Wu 6296d863a16SDavid Wu div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0; 6306d863a16SDavid Wu div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) : 6316d863a16SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK; 6326d863a16SDavid Wu 633bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 634bf0e94d0SDavid Wu 635bf0e94d0SDavid Wu return 0; 636bf0e94d0SDavid Wu } 637bf0e94d0SDavid Wu 63820bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 63920bef841SDavid Wu struct rockchip_eth_dev *dev) 64020bef841SDavid Wu { 64120bef841SDavid Wu struct eqos_priv *priv = &dev->eqos; 64220bef841SDavid Wu struct rv1106_grf *grf; 64320bef841SDavid Wu unsigned int div; 64420bef841SDavid Wu 64520bef841SDavid Wu enum { 64620bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 64720bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 64820bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 64920bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV20 = 0, 65020bef841SDavid Wu }; 65120bef841SDavid Wu 65220bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 65320bef841SDavid Wu 65420bef841SDavid Wu switch (priv->phy->speed) { 65520bef841SDavid Wu case 10: 65620bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV20; 65720bef841SDavid Wu break; 65820bef841SDavid Wu case 100: 65920bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV2; 66020bef841SDavid Wu break; 66120bef841SDavid Wu default: 66220bef841SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 66320bef841SDavid Wu return -EINVAL; 66420bef841SDavid Wu } 66520bef841SDavid Wu 66620bef841SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 66720bef841SDavid Wu 66820bef841SDavid Wu return 0; 66920bef841SDavid Wu } 67020bef841SDavid Wu 671491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 672491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 673dcfb333aSDavid Wu { 674dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 675dcfb333aSDavid Wu struct clk clk_speed; 676dcfb333aSDavid Wu int ret; 677dcfb333aSDavid Wu 678dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 679dcfb333aSDavid Wu &clk_speed); 680dcfb333aSDavid Wu if (ret) { 68133a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 68233a014bdSDavid Wu __func__, ret); 683dcfb333aSDavid Wu return ret; 684dcfb333aSDavid Wu } 685dcfb333aSDavid Wu 686dcfb333aSDavid Wu switch ( priv->phy->speed) { 687dcfb333aSDavid Wu case 10: 688dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 689dcfb333aSDavid Wu if (ret) 690dcfb333aSDavid Wu return ret; 691dcfb333aSDavid Wu break; 692dcfb333aSDavid Wu case 100: 693dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 694dcfb333aSDavid Wu if (ret) 695dcfb333aSDavid Wu return ret; 696dcfb333aSDavid Wu break; 697dcfb333aSDavid Wu case 1000: 698dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 699dcfb333aSDavid Wu if (ret) 700dcfb333aSDavid Wu return ret; 701dcfb333aSDavid Wu break; 702dcfb333aSDavid Wu default: 703dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 704dcfb333aSDavid Wu return -EINVAL; 705dcfb333aSDavid Wu } 706dcfb333aSDavid Wu 707dcfb333aSDavid Wu return 0; 708dcfb333aSDavid Wu } 7096f0a52e9SDavid Wu #endif 7100a33ce65SDavid Wu 7116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 71218ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 71318ae91c8SDavid Wu { 71418ae91c8SDavid Wu struct px30_grf *grf; 71518ae91c8SDavid Wu enum { 71618ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 71718ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 71818ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 71918ae91c8SDavid Wu }; 72018ae91c8SDavid Wu 72118ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 72218ae91c8SDavid Wu 72318ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 72418ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 72518ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 72618ae91c8SDavid Wu } 72718ae91c8SDavid Wu 728ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 729ff86648dSDavid Wu { 730ff86648dSDavid Wu struct rk1808_grf *grf; 731ff86648dSDavid Wu enum { 732ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 733ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 734ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 735ff86648dSDavid Wu 736ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 737ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 738ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 739ff86648dSDavid Wu 740ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 741ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 742ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 743ff86648dSDavid Wu }; 744ff86648dSDavid Wu enum { 745ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 746ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 747ff86648dSDavid Wu 748ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 749ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 750ff86648dSDavid Wu }; 751ff86648dSDavid Wu 752ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 753ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 754ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 755ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 756ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 757ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 758ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 759ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 760ff86648dSDavid Wu 761ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 762ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 763ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 764c5bdc99aSJianqun Xu (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) | 765c5bdc99aSJianqun Xu (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT)); 766ff86648dSDavid Wu } 767ff86648dSDavid Wu 768af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 769af166ffaSDavid Wu { 770af166ffaSDavid Wu struct rk322x_grf *grf; 771af166ffaSDavid Wu enum { 772af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 773af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 774af166ffaSDavid Wu 775af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 776af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 777af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 778af166ffaSDavid Wu 779af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 780af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 781af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 782af166ffaSDavid Wu 783af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 784af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 785af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 786af166ffaSDavid Wu }; 787af166ffaSDavid Wu enum { 788af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 789af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 790af166ffaSDavid Wu 791af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 792af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 793af166ffaSDavid Wu }; 794af166ffaSDavid Wu 795af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 796af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 797af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 798af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 799af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 800af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 801af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 802af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 803af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 804af166ffaSDavid Wu 805af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 806af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 807af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 808af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 809af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 810af166ffaSDavid Wu } 811af166ffaSDavid Wu 812491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 813491f3bfbSDavid Wu { 814491f3bfbSDavid Wu struct rk322x_grf *grf; 815491f3bfbSDavid Wu enum { 816491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 817491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 818491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 819491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 820491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 821491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 822491f3bfbSDavid Wu }; 823491f3bfbSDavid Wu 824491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 825491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 826491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 827491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 828491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 829491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 830491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 831491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 832491f3bfbSDavid Wu } 833491f3bfbSDavid Wu 8341f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 8351f08aa1cSPhilipp Tomsich { 8361f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 8371f08aa1cSPhilipp Tomsich 8381f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 8391f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 8401f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 8411f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 8421f08aa1cSPhilipp Tomsich 8431f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 8441f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 8451f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 8461f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 8471f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 8481f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 8491f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 8501f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 8511f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 8521f08aa1cSPhilipp Tomsich } 8531f08aa1cSPhilipp Tomsich 85423adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 85523adb58fSDavid Wu { 85623adb58fSDavid Wu struct rk3308_grf *grf; 85723adb58fSDavid Wu enum { 85823adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 85923adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 86023adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 86123adb58fSDavid Wu }; 86223adb58fSDavid Wu 86323adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 86423adb58fSDavid Wu 86523adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 86623adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 86723adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 86823adb58fSDavid Wu } 86923adb58fSDavid Wu 870c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 871c36b26c0SDavid Wu { 872c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 873c36b26c0SDavid Wu enum { 874c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 875c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 876c36b26c0SDavid Wu 877c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 878c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 879c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 880c36b26c0SDavid Wu 881c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 882c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 883c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 884c36b26c0SDavid Wu 885c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 886c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 887c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 888c36b26c0SDavid Wu }; 889c36b26c0SDavid Wu enum { 890c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 891c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 892c36b26c0SDavid Wu 893c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 894c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 895c36b26c0SDavid Wu }; 896c36b26c0SDavid Wu 897c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 898c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 899c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 900c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 901c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 902c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 903c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 904c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 905c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 906c36b26c0SDavid Wu 907c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 908c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 909c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 910c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 911c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 912c36b26c0SDavid Wu } 913c36b26c0SDavid Wu 914491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 915491f3bfbSDavid Wu { 916491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 917491f3bfbSDavid Wu enum { 918491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 919491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 920491f3bfbSDavid Wu 921491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 922491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 923491f3bfbSDavid Wu }; 924491f3bfbSDavid Wu 925491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 926491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 927491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 928491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 929491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 930491f3bfbSDavid Wu RK3328_RMII_MODE); 931491f3bfbSDavid Wu } 932491f3bfbSDavid Wu 933793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 934793f2fd2SPhilipp Tomsich { 935793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 936793f2fd2SPhilipp Tomsich enum { 937793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 938793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 939793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 940793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 941793f2fd2SPhilipp Tomsich }; 942793f2fd2SPhilipp Tomsich enum { 943793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 944793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 945793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 946793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 947793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 948793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 949793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 950793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 951793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 952793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 953793f2fd2SPhilipp Tomsich }; 954793f2fd2SPhilipp Tomsich 955793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 956793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 957793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 958793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 959793f2fd2SPhilipp Tomsich 960793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 961793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 962793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 963793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 964793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 965793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 966793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 967c5bdc99aSJianqun Xu (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) | 968c5bdc99aSJianqun Xu (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT)); 969793f2fd2SPhilipp Tomsich } 970793f2fd2SPhilipp Tomsich 9711f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 9721f08aa1cSPhilipp Tomsich { 9731f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 9741f08aa1cSPhilipp Tomsich 9751f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9761f08aa1cSPhilipp Tomsich 9771f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 9781f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 9791f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 9801f08aa1cSPhilipp Tomsich 9811f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 9821f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 9831f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 9841f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 9851f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 9861f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 9871f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 988c5bdc99aSJianqun Xu (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) | 989c5bdc99aSJianqun Xu (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT)); 9901f08aa1cSPhilipp Tomsich } 9911f08aa1cSPhilipp Tomsich 9920a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 9930a33ce65SDavid Wu { 9940a33ce65SDavid Wu struct rv1108_grf *grf; 9950a33ce65SDavid Wu 9960a33ce65SDavid Wu enum { 9970a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 9980a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 9990a33ce65SDavid Wu }; 10000a33ce65SDavid Wu 10010a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 10020a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 10030a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 10040a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 10050a33ce65SDavid Wu } 1006491f3bfbSDavid Wu 1007491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1008491f3bfbSDavid Wu { 1009491f3bfbSDavid Wu struct rk322x_grf *grf; 1010491f3bfbSDavid Wu enum { 1011491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 1012491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 1013491f3bfbSDavid Wu }; 1014491f3bfbSDavid Wu enum { 1015491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1016491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 1017491f3bfbSDavid Wu 1018491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1019491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 1020491f3bfbSDavid Wu 1021491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 1022491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 1023491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 1024491f3bfbSDavid Wu }; 1025491f3bfbSDavid Wu enum { 1026491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1027491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 1028491f3bfbSDavid Wu }; 1029491f3bfbSDavid Wu enum { 1030491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1031491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 1032491f3bfbSDavid Wu }; 1033491f3bfbSDavid Wu 1034491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1035491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 1036491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 1037491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 1038491f3bfbSDavid Wu 1039491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1040491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 1041491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 1042491f3bfbSDavid Wu 1043491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1044491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 1045491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 1046491f3bfbSDavid Wu 1047491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1048491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1049491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 1050491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 1051491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1052491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 1053491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 1054491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 1055491f3bfbSDavid Wu 1056491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1057491f3bfbSDavid Wu udelay(10); 1058491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1059491f3bfbSDavid Wu udelay(10); 1060491f3bfbSDavid Wu 1061491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1062491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1063491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 1064491f3bfbSDavid Wu udelay(30 * 1000); 1065491f3bfbSDavid Wu } 1066491f3bfbSDavid Wu 1067491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1068491f3bfbSDavid Wu { 1069491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1070491f3bfbSDavid Wu enum { 1071491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1072491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 1073491f3bfbSDavid Wu }; 1074491f3bfbSDavid Wu enum { 1075491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1076491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1077491f3bfbSDavid Wu 1078491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1079491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 1080491f3bfbSDavid Wu 1081491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 1082491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 1083491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 1084491f3bfbSDavid Wu }; 1085491f3bfbSDavid Wu enum { 1086491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1087491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1088491f3bfbSDavid Wu }; 1089491f3bfbSDavid Wu enum { 1090491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1091491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1092491f3bfbSDavid Wu }; 1093491f3bfbSDavid Wu 1094491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1095491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 1096491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 1097491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 1098491f3bfbSDavid Wu 1099491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1100491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1101491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 1102491f3bfbSDavid Wu 1103491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1104491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1105491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 1106491f3bfbSDavid Wu 1107491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1108491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1109491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 1110491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 1111491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1112491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 1113491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 1114491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 1115491f3bfbSDavid Wu 1116491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1117491f3bfbSDavid Wu udelay(10); 1118491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1119491f3bfbSDavid Wu udelay(10); 1120491f3bfbSDavid Wu 1121491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1122491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1123491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 1124491f3bfbSDavid Wu udelay(30 * 1000); 1125491f3bfbSDavid Wu } 1126491f3bfbSDavid Wu 1127dcfb333aSDavid Wu #else 1128*c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1129*c563400aSDavid Wu { 1130*c563400aSDavid Wu struct rk3528_grf *grf; 1131*c563400aSDavid Wu unsigned char bgs[1] = {0}; 1132*c563400aSDavid Wu 1133*c563400aSDavid Wu enum { 1134*c563400aSDavid Wu RK3528_MACPHY_ENABLE_MASK = BIT(1), 1135*c563400aSDavid Wu RK3528_MACPHY_DISENABLE = BIT(1), 1136*c563400aSDavid Wu RK3528_MACPHY_ENABLE = 0, 1137*c563400aSDavid Wu RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 1138*c563400aSDavid Wu RK3528_MACPHY_XMII_SEL = BIT(6), 1139*c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 1140*c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 1141*c563400aSDavid Wu RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 1142*c563400aSDavid Wu RK3528_MACPHY_PHY_ID = BIT(11), 1143*c563400aSDavid Wu }; 1144*c563400aSDavid Wu 1145*c563400aSDavid Wu enum { 1146*c563400aSDavid Wu RK3528_MACPHY_BGS_MASK = GENMASK(3, 0), 1147*c563400aSDavid Wu }; 1148*c563400aSDavid Wu 1149*c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1150*c563400aSDavid Wu struct udevice *dev; 1151*c563400aSDavid Wu u32 regs[2] = {0}; 1152*c563400aSDavid Wu ofnode node; 1153*c563400aSDavid Wu int ret = 0; 1154*c563400aSDavid Wu 1155*c563400aSDavid Wu /* retrieve the device */ 1156*c563400aSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1157*c563400aSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1158*c563400aSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1159*c563400aSDavid Wu &dev); 1160*c563400aSDavid Wu else 1161*c563400aSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1162*c563400aSDavid Wu DM_GET_DRIVER(rockchip_otp), 1163*c563400aSDavid Wu &dev); 1164*c563400aSDavid Wu if (!ret) { 1165*c563400aSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1166*c563400aSDavid Wu if (ofnode_valid(node)) { 1167*c563400aSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1168*c563400aSDavid Wu /* read the bgs from the efuses */ 1169*c563400aSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1170*c563400aSDavid Wu if (ret) { 1171*c563400aSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1172*c563400aSDavid Wu ret); 1173*c563400aSDavid Wu bgs[0] = 0; 1174*c563400aSDavid Wu } 1175*c563400aSDavid Wu } 1176*c563400aSDavid Wu } 1177*c563400aSDavid Wu } 1178*c563400aSDavid Wu #endif 1179*c563400aSDavid Wu 1180*c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1181*c563400aSDavid Wu 1182*c563400aSDavid Wu reset_assert(&pdata->phy_reset); 1183*c563400aSDavid Wu udelay(20); 1184*c563400aSDavid Wu rk_clrsetreg(&grf->macphy_con0, 1185*c563400aSDavid Wu RK3528_MACPHY_ENABLE_MASK | 1186*c563400aSDavid Wu RK3528_MACPHY_XMII_SEL_MASK | 1187*c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_MASK | 1188*c563400aSDavid Wu RK3528_MACPHY_PHY_ID_MASK, 1189*c563400aSDavid Wu RK3528_MACPHY_ENABLE | 1190*c563400aSDavid Wu RK3528_MACPHY_XMII_SEL | 1191*c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_24M | 1192*c563400aSDavid Wu RK3528_MACPHY_PHY_ID); 1193*c563400aSDavid Wu 1194*c563400aSDavid Wu rk_clrsetreg(&grf->macphy_con1, 1195*c563400aSDavid Wu RK3528_MACPHY_BGS_MASK, 1196*c563400aSDavid Wu bgs[0]); 1197*c563400aSDavid Wu udelay(20); 1198*c563400aSDavid Wu reset_deassert(&pdata->phy_reset); 1199*c563400aSDavid Wu udelay(30 * 1000); 1200*c563400aSDavid Wu } 1201*c563400aSDavid Wu 1202*c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1203*c563400aSDavid Wu { 1204*c563400aSDavid Wu unsigned int clk_mode; 1205*c563400aSDavid Wu struct rk3528_grf *grf; 1206*c563400aSDavid Wu 1207*c563400aSDavid Wu enum { 1208*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1, 1209*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1), 1210*c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE = 0x1, 1211*c563400aSDavid Wu }; 1212*c563400aSDavid Wu 1213*c563400aSDavid Wu enum { 1214*c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8, 1215*c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8), 1216*c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE = 0x1, 1217*c563400aSDavid Wu }; 1218*c563400aSDavid Wu 1219*c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1220*c563400aSDavid Wu 1221*c563400aSDavid Wu if (pdata->bus_id == 1) { 1222*c563400aSDavid Wu clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT; 1223*c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode); 1224*c563400aSDavid Wu } else { 1225*c563400aSDavid Wu clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT; 1226*c563400aSDavid Wu rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode); 1227*c563400aSDavid Wu } 1228*c563400aSDavid Wu } 1229*c563400aSDavid Wu 1230*c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1231*c563400aSDavid Wu { 1232*c563400aSDavid Wu unsigned int rx_enable; 1233*c563400aSDavid Wu unsigned int rx_delay; 1234*c563400aSDavid Wu struct rk3528_grf *grf; 1235*c563400aSDavid Wu 1236*c563400aSDavid Wu enum { 1237*c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8, 1238*c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_MASK = BIT(8), 1239*c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE = 0x0, 1240*c563400aSDavid Wu 1241*c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14), 1242*c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0, 1243*c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14), 1244*c563400aSDavid Wu 1245*c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15), 1246*c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0, 1247*c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15), 1248*c563400aSDavid Wu }; 1249*c563400aSDavid Wu 1250*c563400aSDavid Wu enum { 1251*c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8, 1252*c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8), 1253*c563400aSDavid Wu 1254*c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0, 1255*c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0), 1256*c563400aSDavid Wu }; 1257*c563400aSDavid Wu 1258*c563400aSDavid Wu if (!pdata->bus_id) 1259*c563400aSDavid Wu return; 1260*c563400aSDavid Wu 1261*c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1262*c563400aSDavid Wu 1263*c563400aSDavid Wu if (pdata->rx_delay < 0) { 1264*c563400aSDavid Wu rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE; 1265*c563400aSDavid Wu rx_delay = 0; 1266*c563400aSDavid Wu } else { 1267*c563400aSDavid Wu rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE; 1268*c563400aSDavid Wu rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT; 1269*c563400aSDavid Wu } 1270*c563400aSDavid Wu 1271*c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, 1272*c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_MASK | 1273*c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_MASK | 1274*c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_MASK, 1275*c563400aSDavid Wu rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE | 1276*c563400aSDavid Wu (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT)); 1277*c563400aSDavid Wu 1278*c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con1, 1279*c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_MASK | 1280*c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_MASK, 1281*c563400aSDavid Wu (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) | 1282*c563400aSDavid Wu rx_delay); 1283*c563400aSDavid Wu } 1284*c563400aSDavid Wu 128533a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 128633a014bdSDavid Wu { 128733a014bdSDavid Wu struct rk3568_grf *grf; 128833a014bdSDavid Wu void *con1; 128933a014bdSDavid Wu 129033a014bdSDavid Wu enum { 129133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 129233a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 129333a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 129433a014bdSDavid Wu }; 129533a014bdSDavid Wu 129633a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 129733a014bdSDavid Wu 129833a014bdSDavid Wu if (pdata->bus_id == 1) 129933a014bdSDavid Wu con1 = &grf->mac1_con1; 130033a014bdSDavid Wu else 130133a014bdSDavid Wu con1 = &grf->mac0_con1; 130233a014bdSDavid Wu 130333a014bdSDavid Wu rk_clrsetreg(con1, 130433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 130533a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 130633a014bdSDavid Wu } 130733a014bdSDavid Wu 130833a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 130933a014bdSDavid Wu { 131033a014bdSDavid Wu struct rk3568_grf *grf; 131133a014bdSDavid Wu void *con0, *con1; 131233a014bdSDavid Wu 131333a014bdSDavid Wu enum { 131433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 131533a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 131633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 131733a014bdSDavid Wu 131833a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 131933a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 132033a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 132133a014bdSDavid Wu 132233a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 132333a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 132433a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 132533a014bdSDavid Wu }; 132633a014bdSDavid Wu 132733a014bdSDavid Wu enum { 132833a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 132933a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 133033a014bdSDavid Wu 133133a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 133233a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 133333a014bdSDavid Wu }; 133433a014bdSDavid Wu 133533a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 133633a014bdSDavid Wu 133733a014bdSDavid Wu if (pdata->bus_id == 1) { 133833a014bdSDavid Wu con0 = &grf->mac1_con0; 133933a014bdSDavid Wu con1 = &grf->mac1_con1; 134033a014bdSDavid Wu } else { 134133a014bdSDavid Wu con0 = &grf->mac0_con0; 134233a014bdSDavid Wu con1 = &grf->mac0_con1; 134333a014bdSDavid Wu } 134433a014bdSDavid Wu 134533a014bdSDavid Wu rk_clrsetreg(con0, 134633a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 134733a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 1348c5bdc99aSJianqun Xu (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) | 1349c5bdc99aSJianqun Xu (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT)); 135033a014bdSDavid Wu 135133a014bdSDavid Wu rk_clrsetreg(con1, 135233a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 135333a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 135433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 135533a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 135633a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 135733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 135833a014bdSDavid Wu } 135933a014bdSDavid Wu 1360bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1361bf0e94d0SDavid Wu { 1362bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1363bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1364bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1365bf0e94d0SDavid Wu 1366bf0e94d0SDavid Wu enum { 1367bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1368bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1369bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1370bf0e94d0SDavid Wu }; 1371bf0e94d0SDavid Wu 1372bf0e94d0SDavid Wu enum { 1373bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1374bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1375bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE = 0x1, 1376bf0e94d0SDavid Wu }; 1377bf0e94d0SDavid Wu 1378bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1379bf0e94d0SDavid Wu 1380bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1381bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1382bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1383bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1384bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1385bf0e94d0SDavid Wu } else { 1386bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1387bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1388bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1389bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1390bf0e94d0SDavid Wu } 1391bf0e94d0SDavid Wu 1392bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1393bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1394bf0e94d0SDavid Wu } 1395bf0e94d0SDavid Wu 1396bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1397bf0e94d0SDavid Wu { 1398bf0e94d0SDavid Wu unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1399bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1400bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1401bf0e94d0SDavid Wu unsigned int rx_delay; 1402bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1403bf0e94d0SDavid Wu struct rk3588_sys_grf *grf; 1404bf0e94d0SDavid Wu void *offset_con; 1405bf0e94d0SDavid Wu 1406bf0e94d0SDavid Wu enum { 1407bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1408bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1409bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1410bf0e94d0SDavid Wu 1411bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1412bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1413bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1414bf0e94d0SDavid Wu 1415bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1416bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1417bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1418bf0e94d0SDavid Wu }; 1419bf0e94d0SDavid Wu 1420bf0e94d0SDavid Wu enum { 1421bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1422bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1423bf0e94d0SDavid Wu 1424bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1425bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1426bf0e94d0SDavid Wu }; 1427bf0e94d0SDavid Wu 1428bf0e94d0SDavid Wu enum { 1429bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1430bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1431bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1432bf0e94d0SDavid Wu }; 1433bf0e94d0SDavid Wu 1434bf0e94d0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1435bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1436bf0e94d0SDavid Wu 1437bf0e94d0SDavid Wu if (pdata->rx_delay < 0) { 1438bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1439bf0e94d0SDavid Wu rx_delay = 0; 1440bf0e94d0SDavid Wu } else { 1441bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1442bf0e94d0SDavid Wu rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1443bf0e94d0SDavid Wu } 1444bf0e94d0SDavid Wu 1445bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1446bf0e94d0SDavid Wu offset_con = &grf->soc_con9; 1447bf0e94d0SDavid Wu rx_enable = rx_delay << 2; 1448bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1449bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1450bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1451bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1452bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1453bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1454bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1455bf0e94d0SDavid Wu } else { 1456bf0e94d0SDavid Wu offset_con = &grf->soc_con8; 1457bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1458bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1459bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1460bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1461bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1462bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1463bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1464bf0e94d0SDavid Wu } 1465bf0e94d0SDavid Wu 1466bf0e94d0SDavid Wu rk_clrsetreg(offset_con, 1467bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1468bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1469c5bdc99aSJianqun Xu (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) | 1470bf0e94d0SDavid Wu rx_delay); 1471bf0e94d0SDavid Wu 1472bf0e94d0SDavid Wu rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1473bf0e94d0SDavid Wu tx_enable | rx_enable); 1474bf0e94d0SDavid Wu 1475bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1476bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1477bf0e94d0SDavid Wu } 1478bf0e94d0SDavid Wu 147920bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 148020bef841SDavid Wu { 148120bef841SDavid Wu struct rv1106_grf *grf; 1482535678cdSDavid Wu unsigned char bgs[1] = {0}; 1483535678cdSDavid Wu 1484535678cdSDavid Wu enum { 1485535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1486535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1487535678cdSDavid Wu }; 148854f7ad44SDavid Wu 148954f7ad44SDavid Wu enum { 149020bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK = BIT(1), 149154f7ad44SDavid Wu RV1106_MACPHY_DISENABLE = BIT(1), 149254f7ad44SDavid Wu RV1106_MACPHY_ENABLE = 0, 149320bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 149420bef841SDavid Wu RV1106_MACPHY_XMII_SEL = BIT(6), 149520bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 149620bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 149720bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 149820bef841SDavid Wu RV1106_MACPHY_PHY_ID = BIT(11), 149920bef841SDavid Wu }; 150020bef841SDavid Wu 150120bef841SDavid Wu enum { 150220bef841SDavid Wu RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 150354f7ad44SDavid Wu RV1106_MACPHY_BGS = BIT(2), 150420bef841SDavid Wu }; 150520bef841SDavid Wu 1506535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1507535678cdSDavid Wu struct udevice *dev; 1508535678cdSDavid Wu u32 regs[2] = {0}; 1509535678cdSDavid Wu ofnode node; 1510535678cdSDavid Wu int ret = 0; 1511535678cdSDavid Wu 1512535678cdSDavid Wu /* retrieve the device */ 1513535678cdSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1514535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1515535678cdSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1516535678cdSDavid Wu &dev); 1517535678cdSDavid Wu else 1518535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1519535678cdSDavid Wu DM_GET_DRIVER(rockchip_otp), 1520535678cdSDavid Wu &dev); 1521535678cdSDavid Wu if (!ret) { 1522535678cdSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1523535678cdSDavid Wu if (ofnode_valid(node)) { 1524535678cdSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1525535678cdSDavid Wu /* read the bgs from the efuses */ 1526535678cdSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1527535678cdSDavid Wu if (ret) { 1528535678cdSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1529535678cdSDavid Wu ret); 1530535678cdSDavid Wu bgs[0] = 0; 1531535678cdSDavid Wu } 1532535678cdSDavid Wu } 1533535678cdSDavid Wu } 1534535678cdSDavid Wu } 1535535678cdSDavid Wu #endif 1536535678cdSDavid Wu 153720bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 153820bef841SDavid Wu 153920bef841SDavid Wu reset_assert(&pdata->phy_reset); 154020bef841SDavid Wu udelay(20); 154120bef841SDavid Wu rk_clrsetreg(&grf->macphy_con0, 154220bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK | 154320bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK | 154420bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK | 154520bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK, 154620bef841SDavid Wu RV1106_MACPHY_ENABLE | 154720bef841SDavid Wu RV1106_MACPHY_XMII_SEL | 154820bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M | 154920bef841SDavid Wu RV1106_MACPHY_PHY_ID); 155020bef841SDavid Wu 155120bef841SDavid Wu rk_clrsetreg(&grf->macphy_con1, 155220bef841SDavid Wu RV1106_MACPHY_BGS_MASK, 1553535678cdSDavid Wu bgs[0]); 15548bafa3a1SDavid Wu udelay(20); 155520bef841SDavid Wu reset_deassert(&pdata->phy_reset); 155620bef841SDavid Wu udelay(30 * 1000); 155720bef841SDavid Wu } 155820bef841SDavid Wu 15598bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 15608bafa3a1SDavid Wu { 15618bafa3a1SDavid Wu struct rv1106_grf *grf; 15628bafa3a1SDavid Wu enum { 15638bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 15648bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 15658bafa3a1SDavid Wu }; 15668bafa3a1SDavid Wu 15678bafa3a1SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 15688bafa3a1SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 15698bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 15708bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE); 15718bafa3a1SDavid Wu }; 15728bafa3a1SDavid Wu 1573e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1574e4e3f431SDavid Wu { 1575e4e3f431SDavid Wu struct rv1126_grf *grf; 1576e4e3f431SDavid Wu 1577e4e3f431SDavid Wu enum { 1578e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1579e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1580e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1581e4e3f431SDavid Wu }; 1582e4e3f431SDavid Wu 1583e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1584e4e3f431SDavid Wu 1585e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1586e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1587e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1588e4e3f431SDavid Wu } 1589e4e3f431SDavid Wu 1590dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1591dcfb333aSDavid Wu { 1592dcfb333aSDavid Wu struct rv1126_grf *grf; 1593dcfb333aSDavid Wu 1594dcfb333aSDavid Wu enum { 1595dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1596dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1597dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1598dcfb333aSDavid Wu 1599dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1600dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1601dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1602dcfb333aSDavid Wu 1603dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1604dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1605dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1606dcfb333aSDavid Wu 1607dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1608dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1609dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1610dcfb333aSDavid Wu 1611dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1612dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1613dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1614dcfb333aSDavid Wu }; 1615dcfb333aSDavid Wu enum { 1616dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1617dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1618dcfb333aSDavid Wu 1619dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1620dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1621dcfb333aSDavid Wu }; 1622dcfb333aSDavid Wu enum { 1623dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1624dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1625dcfb333aSDavid Wu 1626dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1627dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1628dcfb333aSDavid Wu }; 1629dcfb333aSDavid Wu 1630dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1631dcfb333aSDavid Wu 1632dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1633dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1634dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1635dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1636dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1637dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1638dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1639dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1640dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1641dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1642dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1643dcfb333aSDavid Wu 1644dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1645dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1646dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1647c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) | 1648c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT)); 1649dcfb333aSDavid Wu 1650dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1651dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1652dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1653c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) | 1654c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT)); 1655dcfb333aSDavid Wu } 16566f0a52e9SDavid Wu #endif 16570a33ce65SDavid Wu 1658bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1659*c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1660*c563400aSDavid Wu { 1661*c563400aSDavid Wu struct rk3528_grf *grf; 1662*c563400aSDavid Wu unsigned int val; 1663*c563400aSDavid Wu 1664*c563400aSDavid Wu enum { 1665*c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_SHIFT = 0x12, 1666*c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_MASK = BIT(12), 1667*c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_CRU = 0, 1668*c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_IO = BIT(12), 1669*c563400aSDavid Wu }; 1670*c563400aSDavid Wu 1671*c563400aSDavid Wu if (!pdata->bus_id) 1672*c563400aSDavid Wu return; 1673*c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1674*c563400aSDavid Wu 1675*c563400aSDavid Wu val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO : 1676*c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_CRU; 1677*c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val); 1678*c563400aSDavid Wu } 1679*c563400aSDavid Wu 1680bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1681bf0e94d0SDavid Wu { 1682bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1683bf0e94d0SDavid Wu unsigned int val, mask; 1684bf0e94d0SDavid Wu 1685bf0e94d0SDavid Wu enum { 1686bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 1687bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_MASK = BIT(4), 1688bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU = BIT(4), 1689bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_IO = 0, 1690bf0e94d0SDavid Wu }; 1691bf0e94d0SDavid Wu 1692bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1693bf0e94d0SDavid Wu val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 1694bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU; 1695bf0e94d0SDavid Wu mask = RK3588_GMAC_CLK_SELET_MASK; 1696bf0e94d0SDavid Wu 1697bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1698bf0e94d0SDavid Wu val <<= 5; 1699bf0e94d0SDavid Wu mask <<= 5; 1700bf0e94d0SDavid Wu } 1701bf0e94d0SDavid Wu 1702bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, mask, val); 1703bf0e94d0SDavid Wu } 1704bf0e94d0SDavid Wu #endif 1705bf0e94d0SDavid Wu 17060125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 17070125bcf0SSjoerd Simons { 17080125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 17091f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 17101f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 17116f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 17126f0a52e9SDavid Wu struct eqos_config *config; 17136f0a52e9SDavid Wu #else 17146f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 17156f0a52e9SDavid Wu #endif 17166f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 17170125bcf0SSjoerd Simons struct clk clk; 17180a33ce65SDavid Wu ulong rate; 17190125bcf0SSjoerd Simons int ret; 17200125bcf0SSjoerd Simons 17216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 17226f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 17236f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 1724befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 17256f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 17266f0a52e9SDavid Wu #else 17276f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 17286f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 17296f0a52e9SDavid Wu #endif 173033a014bdSDavid Wu pdata->bus_id = dev->seq; 173154f7ad44SDavid Wu 1732cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1733cadc8d74SKever Yang ret = clk_set_defaults(dev); 1734cadc8d74SKever Yang if (ret) 1735cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 1736cadc8d74SKever Yang 17370125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 17380125bcf0SSjoerd Simons if (ret) 17390125bcf0SSjoerd Simons return ret; 17400125bcf0SSjoerd Simons 1741491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 1742491f3bfbSDavid Wu 1743bf0e94d0SDavid Wu if (ops->set_clock_selection) 1744bf0e94d0SDavid Wu ops->set_clock_selection(pdata); 1745bf0e94d0SDavid Wu 1746491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 1747491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 1748491f3bfbSDavid Wu 17490a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 17500a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 1751bf0e94d0SDavid Wu case PHY_INTERFACE_MODE_RGMII_RXID: 17520a33ce65SDavid Wu /* 17530a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 17540a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 17550a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 17560a33ce65SDavid Wu * is not set, because of it is bypassed. 17570a33ce65SDavid Wu */ 17580a33ce65SDavid Wu if (!pdata->clock_input) { 17590a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 17600a33ce65SDavid Wu if (rate != 125000000) 17610a33ce65SDavid Wu return -EINVAL; 17620a33ce65SDavid Wu } 17630125bcf0SSjoerd Simons 1764bf0e94d0SDavid Wu if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 1765bf0e94d0SDavid Wu pdata->rx_delay = -1; 1766bf0e94d0SDavid Wu 17670125bcf0SSjoerd Simons /* Set to RGMII mode */ 17680a33ce65SDavid Wu if (ops->set_to_rgmii) 17691f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 17700a33ce65SDavid Wu else 17710a33ce65SDavid Wu return -EPERM; 17720a33ce65SDavid Wu 17730a33ce65SDavid Wu break; 17740a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 17750a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 17760a33ce65SDavid Wu if (!pdata->clock_input) { 17770a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 17780a33ce65SDavid Wu if (rate != 50000000) 17790a33ce65SDavid Wu return -EINVAL; 17800a33ce65SDavid Wu } 17810a33ce65SDavid Wu 17820a33ce65SDavid Wu /* Set to RMII mode */ 17830a33ce65SDavid Wu if (ops->set_to_rmii) 17840a33ce65SDavid Wu ops->set_to_rmii(pdata); 17850a33ce65SDavid Wu 17860a33ce65SDavid Wu break; 17870a33ce65SDavid Wu default: 17880a33ce65SDavid Wu debug("NO interface defined!\n"); 17890a33ce65SDavid Wu return -ENXIO; 17900a33ce65SDavid Wu } 17910125bcf0SSjoerd Simons 17926f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 17936f0a52e9SDavid Wu return eqos_probe(dev); 17946f0a52e9SDavid Wu #else 17950125bcf0SSjoerd Simons return designware_eth_probe(dev); 17966f0a52e9SDavid Wu #endif 17976f0a52e9SDavid Wu } 17986f0a52e9SDavid Wu 17996f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 18006f0a52e9SDavid Wu { 18016f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 18026f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 18036f0a52e9SDavid Wu #else 18046f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 18056f0a52e9SDavid Wu #endif 18066f0a52e9SDavid Wu } 18076f0a52e9SDavid Wu 18086f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 18096f0a52e9SDavid Wu int length) 18106f0a52e9SDavid Wu { 18116f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 18126f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 18136f0a52e9SDavid Wu #else 18146f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 18156f0a52e9SDavid Wu #endif 18166f0a52e9SDavid Wu } 18176f0a52e9SDavid Wu 18186f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 18196f0a52e9SDavid Wu int length) 18206f0a52e9SDavid Wu { 18216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 18226f0a52e9SDavid Wu return eqos_send(dev, packet, length); 18236f0a52e9SDavid Wu #else 18246f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 18256f0a52e9SDavid Wu #endif 18266f0a52e9SDavid Wu } 18276f0a52e9SDavid Wu 18286f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 18296f0a52e9SDavid Wu uchar **packetp) 18306f0a52e9SDavid Wu { 18316f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 18326f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 18336f0a52e9SDavid Wu #else 18346f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 18356f0a52e9SDavid Wu #endif 18360125bcf0SSjoerd Simons } 18370125bcf0SSjoerd Simons 18380125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 18390125bcf0SSjoerd Simons { 18406f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 18411f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 18421f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 18436f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1844491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 18456f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 18466f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 18476f0a52e9SDavid Wu #endif 18480125bcf0SSjoerd Simons int ret; 18490125bcf0SSjoerd Simons 18506f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 18516f0a52e9SDavid Wu ret = eqos_init(dev); 18526f0a52e9SDavid Wu #else 18536f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 18546f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 18556f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 18566f0a52e9SDavid Wu eth_pdata->enetaddr); 18576f0a52e9SDavid Wu #endif 18580125bcf0SSjoerd Simons if (ret) 18590125bcf0SSjoerd Simons return ret; 1860491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 18610125bcf0SSjoerd Simons if (ret) 18620125bcf0SSjoerd Simons return ret; 18636f0a52e9SDavid Wu 18646f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 18656f0a52e9SDavid Wu eqos_enable(dev); 18666f0a52e9SDavid Wu #else 18676f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 18680125bcf0SSjoerd Simons if (ret) 18690125bcf0SSjoerd Simons return ret; 18706f0a52e9SDavid Wu #endif 18710125bcf0SSjoerd Simons 18720125bcf0SSjoerd Simons return 0; 18730125bcf0SSjoerd Simons } 18740125bcf0SSjoerd Simons 18756f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 18766f0a52e9SDavid Wu { 18776f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 18786f0a52e9SDavid Wu eqos_stop(dev); 18796f0a52e9SDavid Wu #else 18806f0a52e9SDavid Wu designware_eth_stop(dev); 18816f0a52e9SDavid Wu #endif 18826f0a52e9SDavid Wu } 18836f0a52e9SDavid Wu 18840125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 18850125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 18866f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 18876f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 18886f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 18896f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 18906f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 18910125bcf0SSjoerd Simons }; 18920125bcf0SSjoerd Simons 18936f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 189418ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 189518ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 189618ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 189718ae91c8SDavid Wu }; 189818ae91c8SDavid Wu 1899ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 1900ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 1901ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 1902ff86648dSDavid Wu }; 1903ff86648dSDavid Wu 1904af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 1905af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 1906491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 1907af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1908491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 1909af166ffaSDavid Wu }; 1910af166ffaSDavid Wu 19111f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 19121f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 19131f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 19141f08aa1cSPhilipp Tomsich }; 19151f08aa1cSPhilipp Tomsich 191623adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 191723adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 191823adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 191923adb58fSDavid Wu }; 192023adb58fSDavid Wu 1921c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 1922c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1923491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 1924c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1925491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 1926c36b26c0SDavid Wu }; 1927c36b26c0SDavid Wu 1928793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 1929793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1930793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1931793f2fd2SPhilipp Tomsich }; 1932793f2fd2SPhilipp Tomsich 19331f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 19341f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 19351f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 19361f08aa1cSPhilipp Tomsich }; 19371f08aa1cSPhilipp Tomsich 19380a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 19390a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 19400a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 19410a33ce65SDavid Wu }; 1942dcfb333aSDavid Wu #else 1943*c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = { 1944*c563400aSDavid Wu .fix_mac_speed = rk3528_set_rgmii_speed, 1945*c563400aSDavid Wu .set_to_rgmii = rk3528_set_to_rgmii, 1946*c563400aSDavid Wu .set_to_rmii = rk3528_set_to_rmii, 1947*c563400aSDavid Wu .set_clock_selection = rk3528_set_clock_selection, 1948*c563400aSDavid Wu .integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup, 1949*c563400aSDavid Wu }; 1950*c563400aSDavid Wu 195133a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 195233a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 195333a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 195433a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 195533a014bdSDavid Wu }; 195633a014bdSDavid Wu 1957bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = { 1958bf0e94d0SDavid Wu .fix_mac_speed = rk3588_set_rgmii_speed, 1959bf0e94d0SDavid Wu .set_to_rgmii = rk3588_set_to_rgmii, 1960bf0e94d0SDavid Wu .set_to_rmii = rk3588_set_to_rmii, 1961bf0e94d0SDavid Wu .set_clock_selection = rk3588_set_clock_selection, 1962bf0e94d0SDavid Wu }; 1963bf0e94d0SDavid Wu 196420bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = { 196520bef841SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 19668bafa3a1SDavid Wu .set_to_rmii = rv1106_set_to_rmii, 196720bef841SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 196820bef841SDavid Wu }; 196920bef841SDavid Wu 1970dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 1971dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 1972dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 1973e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 1974dcfb333aSDavid Wu }; 19756f0a52e9SDavid Wu #endif 19760a33ce65SDavid Wu 19770125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 19786f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 197984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30 198018ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 198118ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 198284e90485SDavid Wu #endif 198384e90485SDavid Wu 198484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808 1985ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 1986ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 198784e90485SDavid Wu #endif 198884e90485SDavid Wu 198984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228 1990af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 1991af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 199284e90485SDavid Wu #endif 199384e90485SDavid Wu 199484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288 19951f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 19961f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 199784e90485SDavid Wu #endif 199884e90485SDavid Wu 199984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308 200023adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 200123adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 200284e90485SDavid Wu #endif 200384e90485SDavid Wu 200484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328 2005c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 2006c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 200784e90485SDavid Wu #endif 200884e90485SDavid Wu 200984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368 2010793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 2011793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 201284e90485SDavid Wu #endif 201384e90485SDavid Wu 201484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399 20151f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 20161f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 201784e90485SDavid Wu #endif 201884e90485SDavid Wu 201984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108 20200a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 20210a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 202284e90485SDavid Wu #endif 2023dcfb333aSDavid Wu #else 2024*c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528 2025*c563400aSDavid Wu { .compatible = "rockchip,rk3528-gmac", 2026*c563400aSDavid Wu .data = (ulong)&rk3528_gmac_ops }, 2027*c563400aSDavid Wu #endif 2028*c563400aSDavid Wu 202984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568 203033a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 203133a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 203284e90485SDavid Wu #endif 203384e90485SDavid Wu 2034bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588 2035bf0e94d0SDavid Wu { .compatible = "rockchip,rk3588-gmac", 2036bf0e94d0SDavid Wu .data = (ulong)&rk3588_gmac_ops }, 2037bf0e94d0SDavid Wu #endif 2038bf0e94d0SDavid Wu 203920bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106 204020bef841SDavid Wu { .compatible = "rockchip,rv1106-gmac", 204120bef841SDavid Wu .data = (ulong)&rv1106_gmac_ops }, 204220bef841SDavid Wu #endif 204320bef841SDavid Wu 204484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126 2045dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 2046dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 20476f0a52e9SDavid Wu #endif 204884e90485SDavid Wu #endif 20490125bcf0SSjoerd Simons { } 20500125bcf0SSjoerd Simons }; 20510125bcf0SSjoerd Simons 20520125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 20530125bcf0SSjoerd Simons .name = "gmac_rockchip", 20540125bcf0SSjoerd Simons .id = UCLASS_ETH, 20550125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 20560125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 20570125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 20580125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 20596f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 20600125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 20610125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 20620125bcf0SSjoerd Simons }; 2063