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*bcf26c57SDavid Wu #include <asm/arch/grf_rk3506.h> 22c563400aSDavid Wu #include <asm/arch/grf_rk3528.h> 2383f30531SDavid Wu #include <asm/arch/grf_rk3562.h> 2483f30531SDavid Wu #include <asm/arch/ioc_rk3562.h> 2533a014bdSDavid Wu #include <asm/arch/grf_rk3568.h> 26bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h> 27745dad46SDavid Wu #include <asm/arch/grf_rv1103b.h> 2820bef841SDavid Wu #include <asm/arch/grf_rv1106.h> 29dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 306f0a52e9SDavid Wu #include "dwc_eth_qos.h" 316f0a52e9SDavid Wu #else 3218ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 33ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 34af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 350125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 3623adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 37c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 38793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 391f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 400a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 410125bcf0SSjoerd Simons #include "designware.h" 426f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 436f0a52e9SDavid Wu #endif 446f0a52e9SDavid Wu #include <dm/pinctrl.h> 45491f3bfbSDavid Wu #include <dm/of_access.h> 460125bcf0SSjoerd Simons 470125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 480125bcf0SSjoerd Simons 496f0a52e9SDavid Wu struct rockchip_eth_dev { 506f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 516f0a52e9SDavid Wu struct eqos_priv eqos; 526f0a52e9SDavid Wu #else 536f0a52e9SDavid Wu struct dw_eth_dev dw; 546f0a52e9SDavid Wu #endif 55491f3bfbSDavid Wu int phy_interface; 566f0a52e9SDavid Wu }; 576f0a52e9SDavid Wu 580125bcf0SSjoerd Simons /* 590125bcf0SSjoerd Simons * Platform data for the gmac 600125bcf0SSjoerd Simons * 610125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 620125bcf0SSjoerd Simons */ 630125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 646f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 650125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 666f0a52e9SDavid Wu #else 676f0a52e9SDavid Wu struct eth_pdata eth_pdata; 686f0a52e9SDavid Wu #endif 69491f3bfbSDavid Wu struct reset_ctl phy_reset; 70491f3bfbSDavid Wu bool integrated_phy; 710a33ce65SDavid Wu bool clock_input; 72491f3bfbSDavid Wu int phy_interface; 730125bcf0SSjoerd Simons int tx_delay; 740125bcf0SSjoerd Simons int rx_delay; 7533a014bdSDavid Wu int bus_id; 760125bcf0SSjoerd Simons }; 770125bcf0SSjoerd Simons 781f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 796f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 806f0a52e9SDavid Wu const struct eqos_config config; 816f0a52e9SDavid Wu #endif 82491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 83491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 840a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 851f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 86bf0e94d0SDavid Wu void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 87491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 881f08aa1cSPhilipp Tomsich }; 891f08aa1cSPhilipp Tomsich 90befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 91befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 92befcb627SDavid Wu .reg_access_always_ok = false, 93befcb627SDavid Wu .mdio_wait = 10000, 94befcb627SDavid Wu .swr_wait = 200, 95befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 96befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 97befcb627SDavid Wu .ops = &eqos_rockchip_ops, 98befcb627SDavid Wu }; 99befcb627SDavid Wu #endif 100befcb627SDavid Wu 1011eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 1021eb9d064SDavid Wu { 1031eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1041eb9d064SDavid Wu struct rk_gmac_ops *ops = 1051eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 1061eb9d064SDavid Wu 1071eb9d064SDavid Wu pdata->tx_delay = tx_delay; 1081eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1091eb9d064SDavid Wu 1101eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1111eb9d064SDavid Wu } 1121f08aa1cSPhilipp Tomsich 1130125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1140125bcf0SSjoerd Simons { 1150125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 116491f3bfbSDavid Wu struct ofnode_phandle_args args; 11754f7ad44SDavid Wu struct udevice *phydev; 1180a33ce65SDavid Wu const char *string; 119491f3bfbSDavid Wu int ret; 1200a33ce65SDavid Wu 1210a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1220a33ce65SDavid Wu if (!strcmp(string, "input")) 1230a33ce65SDavid Wu pdata->clock_input = true; 1240a33ce65SDavid Wu else 1250a33ce65SDavid Wu pdata->clock_input = false; 1260125bcf0SSjoerd Simons 127491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 128491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 129491f3bfbSDavid Wu if (ret) { 130491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 131491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 132491f3bfbSDavid Wu } else { 133491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 134491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 135491f3bfbSDavid Wu "phy-is-integrated"); 136491f3bfbSDavid Wu } 137491f3bfbSDavid Wu 138491f3bfbSDavid Wu if (pdata->integrated_phy) { 139491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 140491f3bfbSDavid Wu if (ret) { 14154f7ad44SDavid Wu ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 14254f7ad44SDavid Wu if (ret) { 14354f7ad44SDavid Wu debug("Get phydev by ofnode failed: err=%d\n", ret); 14454f7ad44SDavid Wu return ret; 14554f7ad44SDavid Wu } 14654f7ad44SDavid Wu 14754f7ad44SDavid Wu ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 14854f7ad44SDavid Wu if (ret) { 149491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 150491f3bfbSDavid Wu return ret; 151491f3bfbSDavid Wu } 152491f3bfbSDavid Wu } 15354f7ad44SDavid Wu } 154491f3bfbSDavid Wu 1551f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1567ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1577ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1581f08aa1cSPhilipp Tomsich 1591f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1601f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1617ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1621f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1637ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1640125bcf0SSjoerd Simons 1656f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1666f0a52e9SDavid Wu return 0; 1676f0a52e9SDavid Wu #else 1680125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1696f0a52e9SDavid Wu #endif 1700125bcf0SSjoerd Simons } 1710125bcf0SSjoerd Simons 1726f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 173491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 174491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 17518ae91c8SDavid Wu { 1766f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 17718ae91c8SDavid Wu struct px30_grf *grf; 17818ae91c8SDavid Wu struct clk clk_speed; 17918ae91c8SDavid Wu int speed, ret; 18018ae91c8SDavid Wu enum { 18118ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 18218ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 18318ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 18418ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 18518ae91c8SDavid Wu }; 18618ae91c8SDavid Wu 18718ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 18818ae91c8SDavid Wu &clk_speed); 18918ae91c8SDavid Wu if (ret) 19018ae91c8SDavid Wu return ret; 19118ae91c8SDavid Wu 19218ae91c8SDavid Wu switch (priv->phydev->speed) { 19318ae91c8SDavid Wu case 10: 19418ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 19518ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 19618ae91c8SDavid Wu if (ret) 19718ae91c8SDavid Wu return ret; 19818ae91c8SDavid Wu break; 19918ae91c8SDavid Wu case 100: 20018ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 20118ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 20218ae91c8SDavid Wu if (ret) 20318ae91c8SDavid Wu return ret; 20418ae91c8SDavid Wu break; 20518ae91c8SDavid Wu default: 20618ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 20718ae91c8SDavid Wu return -EINVAL; 20818ae91c8SDavid Wu } 20918ae91c8SDavid Wu 21018ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 21118ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 21218ae91c8SDavid Wu 21318ae91c8SDavid Wu return 0; 21418ae91c8SDavid Wu } 21518ae91c8SDavid Wu 216491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 217491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 218ff86648dSDavid Wu { 2196f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 220ff86648dSDavid Wu struct clk clk_speed; 221ff86648dSDavid Wu int ret; 222ff86648dSDavid Wu 223ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 224ff86648dSDavid Wu &clk_speed); 225ff86648dSDavid Wu if (ret) 226ff86648dSDavid Wu return ret; 227ff86648dSDavid Wu 228ff86648dSDavid Wu switch (priv->phydev->speed) { 229ff86648dSDavid Wu case 10: 230ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 231ff86648dSDavid Wu if (ret) 232ff86648dSDavid Wu return ret; 233ff86648dSDavid Wu break; 234ff86648dSDavid Wu case 100: 235ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 236ff86648dSDavid Wu if (ret) 237ff86648dSDavid Wu return ret; 238ff86648dSDavid Wu break; 239ff86648dSDavid Wu case 1000: 240ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 241ff86648dSDavid Wu if (ret) 242ff86648dSDavid Wu return ret; 243ff86648dSDavid Wu break; 244ff86648dSDavid Wu default: 245ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 246ff86648dSDavid Wu return -EINVAL; 247ff86648dSDavid Wu } 248ff86648dSDavid Wu 249ff86648dSDavid Wu return 0; 250ff86648dSDavid Wu } 251ff86648dSDavid Wu 252491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 253491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 254af166ffaSDavid Wu { 2556f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 256af166ffaSDavid Wu struct rk322x_grf *grf; 257af166ffaSDavid Wu int clk; 258af166ffaSDavid Wu enum { 259af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 260af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 261af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 262af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 263af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 264491f3bfbSDavid Wu 265491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 266491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 267491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 268491f3bfbSDavid Wu 269491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 270491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 271491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 272af166ffaSDavid Wu }; 273af166ffaSDavid Wu 274af166ffaSDavid Wu switch (priv->phydev->speed) { 275af166ffaSDavid Wu case 10: 276491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 277491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 278491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 279af166ffaSDavid Wu break; 280af166ffaSDavid Wu case 100: 281491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 282491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 283491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 284af166ffaSDavid Wu break; 285af166ffaSDavid Wu case 1000: 286af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 287af166ffaSDavid Wu break; 288af166ffaSDavid Wu default: 289af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 290af166ffaSDavid Wu return -EINVAL; 291af166ffaSDavid Wu } 292af166ffaSDavid Wu 293af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 294491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 295491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 296491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 297491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 298491f3bfbSDavid Wu clk); 299af166ffaSDavid Wu 300af166ffaSDavid Wu return 0; 301af166ffaSDavid Wu } 302af166ffaSDavid Wu 303491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 304491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 3050125bcf0SSjoerd Simons { 3066f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 3070125bcf0SSjoerd Simons struct rk3288_grf *grf; 3080125bcf0SSjoerd Simons int clk; 3090125bcf0SSjoerd Simons 3100125bcf0SSjoerd Simons switch (priv->phydev->speed) { 3110125bcf0SSjoerd Simons case 10: 3121f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 3130125bcf0SSjoerd Simons break; 3140125bcf0SSjoerd Simons case 100: 3151f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 3160125bcf0SSjoerd Simons break; 3170125bcf0SSjoerd Simons case 1000: 3181f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3190125bcf0SSjoerd Simons break; 3200125bcf0SSjoerd Simons default: 3210125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3220125bcf0SSjoerd Simons return -EINVAL; 3230125bcf0SSjoerd Simons } 3240125bcf0SSjoerd Simons 3250125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3261f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3270125bcf0SSjoerd Simons 3280125bcf0SSjoerd Simons return 0; 3290125bcf0SSjoerd Simons } 3300125bcf0SSjoerd Simons 331491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 332491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 33323adb58fSDavid Wu { 3346f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 33523adb58fSDavid Wu struct rk3308_grf *grf; 33623adb58fSDavid Wu struct clk clk_speed; 33723adb58fSDavid Wu int speed, ret; 33823adb58fSDavid Wu enum { 33923adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 34023adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 34123adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 34223adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 34323adb58fSDavid Wu }; 34423adb58fSDavid Wu 34523adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 34623adb58fSDavid Wu &clk_speed); 34723adb58fSDavid Wu if (ret) 34823adb58fSDavid Wu return ret; 34923adb58fSDavid Wu 35023adb58fSDavid Wu switch (priv->phydev->speed) { 35123adb58fSDavid Wu case 10: 35223adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 35323adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 35423adb58fSDavid Wu if (ret) 35523adb58fSDavid Wu return ret; 35623adb58fSDavid Wu break; 35723adb58fSDavid Wu case 100: 35823adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 35923adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 36023adb58fSDavid Wu if (ret) 36123adb58fSDavid Wu return ret; 36223adb58fSDavid Wu break; 36323adb58fSDavid Wu default: 36423adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 36523adb58fSDavid Wu return -EINVAL; 36623adb58fSDavid Wu } 36723adb58fSDavid Wu 36823adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 36923adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 37023adb58fSDavid Wu 37123adb58fSDavid Wu return 0; 37223adb58fSDavid Wu } 37323adb58fSDavid Wu 374491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 375491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 376c36b26c0SDavid Wu { 3776f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 378c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 379c36b26c0SDavid Wu int clk; 380c36b26c0SDavid Wu enum { 381c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 382c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 383c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 384c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 385c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 386491f3bfbSDavid Wu 387491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 388491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 389491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 390491f3bfbSDavid Wu 391491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 392491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 393491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 394c36b26c0SDavid Wu }; 395c36b26c0SDavid Wu 396c36b26c0SDavid Wu switch (priv->phydev->speed) { 397c36b26c0SDavid Wu case 10: 398491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 399491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 400491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 401c36b26c0SDavid Wu break; 402c36b26c0SDavid Wu case 100: 403491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 404491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 405491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 406c36b26c0SDavid Wu break; 407c36b26c0SDavid Wu case 1000: 408c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 409c36b26c0SDavid Wu break; 410c36b26c0SDavid Wu default: 411c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 412c36b26c0SDavid Wu return -EINVAL; 413c36b26c0SDavid Wu } 414c36b26c0SDavid Wu 415c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 416491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 417491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 418491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 419491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 420491f3bfbSDavid Wu clk); 421c36b26c0SDavid Wu 422c36b26c0SDavid Wu return 0; 423c36b26c0SDavid Wu } 424c36b26c0SDavid Wu 425491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 426491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 427793f2fd2SPhilipp Tomsich { 4286f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 429793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 430793f2fd2SPhilipp Tomsich int clk; 431793f2fd2SPhilipp Tomsich enum { 432793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 433793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 434793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 435793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 436793f2fd2SPhilipp Tomsich }; 437793f2fd2SPhilipp Tomsich 438793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 439793f2fd2SPhilipp Tomsich case 10: 440793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 441793f2fd2SPhilipp Tomsich break; 442793f2fd2SPhilipp Tomsich case 100: 443793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 444793f2fd2SPhilipp Tomsich break; 445793f2fd2SPhilipp Tomsich case 1000: 446793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 447793f2fd2SPhilipp Tomsich break; 448793f2fd2SPhilipp Tomsich default: 449793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 450793f2fd2SPhilipp Tomsich return -EINVAL; 451793f2fd2SPhilipp Tomsich } 452793f2fd2SPhilipp Tomsich 453793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 454793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 455793f2fd2SPhilipp Tomsich 456793f2fd2SPhilipp Tomsich return 0; 457793f2fd2SPhilipp Tomsich } 458793f2fd2SPhilipp Tomsich 459491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 460491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4611f08aa1cSPhilipp Tomsich { 4626f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4631f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4641f08aa1cSPhilipp Tomsich int clk; 4651f08aa1cSPhilipp Tomsich 4661f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4671f08aa1cSPhilipp Tomsich case 10: 4681f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4691f08aa1cSPhilipp Tomsich break; 4701f08aa1cSPhilipp Tomsich case 100: 4711f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4721f08aa1cSPhilipp Tomsich break; 4731f08aa1cSPhilipp Tomsich case 1000: 4741f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4751f08aa1cSPhilipp Tomsich break; 4761f08aa1cSPhilipp Tomsich default: 4771f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4781f08aa1cSPhilipp Tomsich return -EINVAL; 4791f08aa1cSPhilipp Tomsich } 4801f08aa1cSPhilipp Tomsich 4811f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4821f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4831f08aa1cSPhilipp Tomsich 4841f08aa1cSPhilipp Tomsich return 0; 4851f08aa1cSPhilipp Tomsich } 4861f08aa1cSPhilipp Tomsich 487491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 488491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4890a33ce65SDavid Wu { 4906f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4910a33ce65SDavid Wu struct rv1108_grf *grf; 4920a33ce65SDavid Wu int clk, speed; 4930a33ce65SDavid Wu enum { 4940a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4950a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4960a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4970a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4980a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4990a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 5000a33ce65SDavid Wu }; 5010a33ce65SDavid Wu 5020a33ce65SDavid Wu switch (priv->phydev->speed) { 5030a33ce65SDavid Wu case 10: 5040a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 5050a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 5060a33ce65SDavid Wu break; 5070a33ce65SDavid Wu case 100: 5080a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 5090a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 5100a33ce65SDavid Wu break; 5110a33ce65SDavid Wu default: 5120a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 5130a33ce65SDavid Wu return -EINVAL; 5140a33ce65SDavid Wu } 5150a33ce65SDavid Wu 5160a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5170a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 5180a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5190a33ce65SDavid Wu clk | speed); 5200a33ce65SDavid Wu 5210a33ce65SDavid Wu return 0; 5220a33ce65SDavid Wu } 523dcfb333aSDavid Wu #else 524*bcf26c57SDavid Wu static int rk3506_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 525*bcf26c57SDavid Wu struct rockchip_eth_dev *dev) 526*bcf26c57SDavid Wu { 527*bcf26c57SDavid Wu struct eqos_priv *priv = &dev->eqos; 528*bcf26c57SDavid Wu struct rk3506_grf_reg *grf; 529*bcf26c57SDavid Wu unsigned int div; 530*bcf26c57SDavid Wu 531*bcf26c57SDavid Wu enum { 532*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_DIV_SHIFT = 3, 533*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_DIV_MASK = BIT(3), 534*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_DIV2 = BIT(3), 535*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_DIV20 = 0, 536*bcf26c57SDavid Wu }; 537*bcf26c57SDavid Wu 538*bcf26c57SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 539*bcf26c57SDavid Wu 540*bcf26c57SDavid Wu switch (priv->phy->speed) { 541*bcf26c57SDavid Wu case 10: 542*bcf26c57SDavid Wu div = RK3506_GMAC_CLK_RMII_DIV20; 543*bcf26c57SDavid Wu break; 544*bcf26c57SDavid Wu case 100: 545*bcf26c57SDavid Wu div = RK3506_GMAC_CLK_RMII_DIV2; 546*bcf26c57SDavid Wu break; 547*bcf26c57SDavid Wu default: 548*bcf26c57SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 549*bcf26c57SDavid Wu return -EINVAL; 550*bcf26c57SDavid Wu } 551*bcf26c57SDavid Wu 552*bcf26c57SDavid Wu if (pdata->bus_id) 553*bcf26c57SDavid Wu rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_DIV_MASK, div); 554*bcf26c57SDavid Wu else 555*bcf26c57SDavid Wu rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_DIV_MASK, div); 556*bcf26c57SDavid Wu 557*bcf26c57SDavid Wu return 0; 558*bcf26c57SDavid Wu } 559*bcf26c57SDavid Wu 560c563400aSDavid Wu static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 561c563400aSDavid Wu struct rockchip_eth_dev *dev) 562c563400aSDavid Wu { 563c563400aSDavid Wu struct eqos_priv *priv = &dev->eqos; 564c563400aSDavid Wu struct rk3528_grf *grf; 565c563400aSDavid Wu unsigned int div; 566c563400aSDavid Wu 567c563400aSDavid Wu enum { 568c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3, 569c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3), 570c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3), 571c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV20 = 0, 572c563400aSDavid Wu }; 573c563400aSDavid Wu 574c563400aSDavid Wu enum { 575c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10, 576c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10), 577c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV1 = 0, 578c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10), 579c563400aSDavid Wu RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11), 580c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11), 581c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_DIV20 = 0, 582c563400aSDavid Wu }; 583c563400aSDavid Wu 584c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 585c563400aSDavid Wu 586c563400aSDavid Wu switch (priv->phy->speed) { 587c563400aSDavid Wu case 10: 588c563400aSDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 589c563400aSDavid Wu div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 : 590c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV20; 591c563400aSDavid Wu else 592c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV50; 593c563400aSDavid Wu break; 594c563400aSDavid Wu case 100: 595c563400aSDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 596c563400aSDavid Wu div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 : 597c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_DIV2; 598c563400aSDavid Wu else 599c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV5; 600c563400aSDavid Wu break; 601c563400aSDavid Wu case 1000: 602c563400aSDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 603c563400aSDavid Wu div = RK3528_GMAC1_CLK_RGMII_DIV1; 604c563400aSDavid Wu else 605c563400aSDavid Wu return -EINVAL; 606c563400aSDavid Wu break; 607c563400aSDavid Wu default: 608c563400aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 609c563400aSDavid Wu return -EINVAL; 610c563400aSDavid Wu } 611c563400aSDavid Wu 612c563400aSDavid Wu if (pdata->bus_id) 613c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div); 614c563400aSDavid Wu else 615c563400aSDavid Wu rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div); 616c563400aSDavid Wu 617c563400aSDavid Wu return 0; 618c563400aSDavid Wu } 619c563400aSDavid Wu 62083f30531SDavid Wu static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata, 62183f30531SDavid Wu struct rockchip_eth_dev *dev) 62283f30531SDavid Wu { 62383f30531SDavid Wu struct eqos_priv *priv = &dev->eqos; 62483f30531SDavid Wu struct rk3562_grf *grf; 62583f30531SDavid Wu unsigned int div; 62683f30531SDavid Wu 62783f30531SDavid Wu enum { 62883f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7, 62983f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7), 63083f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV1 = 0, 63183f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7), 63283f30531SDavid Wu RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8), 63383f30531SDavid Wu RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7), 63483f30531SDavid Wu RK3562_GMAC0_CLK_RMII_DIV20 = 0, 63583f30531SDavid Wu }; 63683f30531SDavid Wu 63783f30531SDavid Wu enum { 63883f30531SDavid Wu RK3562_GMAC1_SPEED_SHIFT = 0x0, 63983f30531SDavid Wu RK3562_GMAC1_SPEED_MASK = BIT(0), 64083f30531SDavid Wu RK3562_GMAC1_SPEED_10M = 0, 64183f30531SDavid Wu RK3562_GMAC1_SPEED_100M = BIT(0), 64283f30531SDavid Wu }; 64383f30531SDavid Wu 64483f30531SDavid Wu enum { 64583f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13, 64683f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13), 64783f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13), 64883f30531SDavid Wu RK3562_GMAC1_CLK_RMII_DIV20 = 0, 64983f30531SDavid Wu }; 65083f30531SDavid Wu 65183f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 65283f30531SDavid Wu 65383f30531SDavid Wu switch (priv->phy->speed) { 65483f30531SDavid Wu case 10: 65583f30531SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { 65683f30531SDavid Wu if (pdata->bus_id > 0) { 65783f30531SDavid Wu div = RK3562_GMAC1_CLK_RMII_DIV20; 65883f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], 65983f30531SDavid Wu RK3562_GMAC1_SPEED_MASK, 66083f30531SDavid Wu RK3562_GMAC1_SPEED_10M); 66183f30531SDavid Wu } else { 66283f30531SDavid Wu div = RK3562_GMAC0_CLK_RMII_DIV20; 66383f30531SDavid Wu } 66483f30531SDavid Wu } else { 66583f30531SDavid Wu div = RK3562_GMAC0_CLK_RGMII_DIV50; 66683f30531SDavid Wu } 66783f30531SDavid Wu break; 66883f30531SDavid Wu case 100: 66983f30531SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { 67083f30531SDavid Wu if (pdata->bus_id > 0) { 67183f30531SDavid Wu div = RK3562_GMAC1_CLK_RMII_DIV2; 67283f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], 67383f30531SDavid Wu RK3562_GMAC1_SPEED_MASK, 67483f30531SDavid Wu RK3562_GMAC1_SPEED_100M); 67583f30531SDavid Wu } else { 67683f30531SDavid Wu div = RK3562_GMAC0_CLK_RMII_DIV2; 67783f30531SDavid Wu } 67883f30531SDavid Wu } else { 67983f30531SDavid Wu div = RK3562_GMAC0_CLK_RGMII_DIV5; 68083f30531SDavid Wu } 68183f30531SDavid Wu break; 68283f30531SDavid Wu case 1000: 68383f30531SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 68483f30531SDavid Wu div = RK3562_GMAC0_CLK_RGMII_DIV1; 68583f30531SDavid Wu else 68683f30531SDavid Wu return -EINVAL; 68783f30531SDavid Wu break; 68883f30531SDavid Wu default: 68983f30531SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 69083f30531SDavid Wu return -EINVAL; 69183f30531SDavid Wu } 69283f30531SDavid Wu 69383f30531SDavid Wu if (pdata->bus_id) 69483f30531SDavid Wu rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div); 69583f30531SDavid Wu else 69683f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div); 69783f30531SDavid Wu 69883f30531SDavid Wu return 0; 69983f30531SDavid Wu } 70083f30531SDavid Wu 701bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 702bf0e94d0SDavid Wu struct rockchip_eth_dev *dev) 703bf0e94d0SDavid Wu { 704bf0e94d0SDavid Wu struct eqos_priv *priv = &dev->eqos; 705bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 706bf0e94d0SDavid Wu unsigned int div, div_mask; 707bf0e94d0SDavid Wu 708bf0e94d0SDavid Wu enum { 709bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 710bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 711bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV1 = 0, 712a116113dSDavid Wu RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 713bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 7146d863a16SDavid Wu RK3588_GMAC_CLK_RMII_DIV2 = BIT(2), 715bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_DIV20 = 0, 7166d863a16SDavid Wu RK3588_GMAC1_ID_SHIFT = 5, 717bf0e94d0SDavid Wu }; 718bf0e94d0SDavid Wu 719bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 720bf0e94d0SDavid Wu 721bf0e94d0SDavid Wu switch (priv->phy->speed) { 722bf0e94d0SDavid Wu case 10: 723bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 724bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV20; 725bf0e94d0SDavid Wu else 726bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV50; 727bf0e94d0SDavid Wu break; 728bf0e94d0SDavid Wu case 100: 729bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 7306d863a16SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV2; 731bf0e94d0SDavid Wu else 732bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV5; 733bf0e94d0SDavid Wu break; 734bf0e94d0SDavid Wu case 1000: 735bf0e94d0SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 736bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV1; 737bf0e94d0SDavid Wu else 738bf0e94d0SDavid Wu return -EINVAL; 739bf0e94d0SDavid Wu break; 740bf0e94d0SDavid Wu default: 741bf0e94d0SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 742bf0e94d0SDavid Wu return -EINVAL; 743bf0e94d0SDavid Wu } 744bf0e94d0SDavid Wu 745bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 746bf0e94d0SDavid Wu div <<= 5; 747bf0e94d0SDavid Wu div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 748bf0e94d0SDavid Wu } 749bf0e94d0SDavid Wu 7506d863a16SDavid Wu div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0; 7516d863a16SDavid Wu div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) : 7526d863a16SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK; 7536d863a16SDavid Wu 754bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 755bf0e94d0SDavid Wu 756bf0e94d0SDavid Wu return 0; 757bf0e94d0SDavid Wu } 758bf0e94d0SDavid Wu 75920bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 76020bef841SDavid Wu struct rockchip_eth_dev *dev) 76120bef841SDavid Wu { 76220bef841SDavid Wu struct eqos_priv *priv = &dev->eqos; 763745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B 764745dad46SDavid Wu struct rv1103b_grf *grf; 765745dad46SDavid Wu #else 76620bef841SDavid Wu struct rv1106_grf *grf; 767745dad46SDavid Wu #endif 76820bef841SDavid Wu unsigned int div; 76920bef841SDavid Wu 77020bef841SDavid Wu enum { 77120bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 77220bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 77320bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 77420bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV20 = 0, 77520bef841SDavid Wu }; 77620bef841SDavid Wu 77720bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 77820bef841SDavid Wu 77920bef841SDavid Wu switch (priv->phy->speed) { 78020bef841SDavid Wu case 10: 78120bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV20; 78220bef841SDavid Wu break; 78320bef841SDavid Wu case 100: 78420bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV2; 78520bef841SDavid Wu break; 78620bef841SDavid Wu default: 78720bef841SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 78820bef841SDavid Wu return -EINVAL; 78920bef841SDavid Wu } 79020bef841SDavid Wu 79120bef841SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 79220bef841SDavid Wu 79320bef841SDavid Wu return 0; 79420bef841SDavid Wu } 79520bef841SDavid Wu 796491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 797491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 798dcfb333aSDavid Wu { 799dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 800dcfb333aSDavid Wu struct clk clk_speed; 801dcfb333aSDavid Wu int ret; 802dcfb333aSDavid Wu 803dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 804dcfb333aSDavid Wu &clk_speed); 805dcfb333aSDavid Wu if (ret) { 80633a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 80733a014bdSDavid Wu __func__, ret); 808dcfb333aSDavid Wu return ret; 809dcfb333aSDavid Wu } 810dcfb333aSDavid Wu 811dcfb333aSDavid Wu switch ( priv->phy->speed) { 812dcfb333aSDavid Wu case 10: 813dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 814dcfb333aSDavid Wu if (ret) 815dcfb333aSDavid Wu return ret; 816dcfb333aSDavid Wu break; 817dcfb333aSDavid Wu case 100: 818dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 819dcfb333aSDavid Wu if (ret) 820dcfb333aSDavid Wu return ret; 821dcfb333aSDavid Wu break; 822dcfb333aSDavid Wu case 1000: 823dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 824dcfb333aSDavid Wu if (ret) 825dcfb333aSDavid Wu return ret; 826dcfb333aSDavid Wu break; 827dcfb333aSDavid Wu default: 828dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 829dcfb333aSDavid Wu return -EINVAL; 830dcfb333aSDavid Wu } 831dcfb333aSDavid Wu 832dcfb333aSDavid Wu return 0; 833dcfb333aSDavid Wu } 8346f0a52e9SDavid Wu #endif 8350a33ce65SDavid Wu 8366f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 83718ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 83818ae91c8SDavid Wu { 83918ae91c8SDavid Wu struct px30_grf *grf; 84018ae91c8SDavid Wu enum { 84118ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 84218ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 84318ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 84418ae91c8SDavid Wu }; 84518ae91c8SDavid Wu 84618ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 84718ae91c8SDavid Wu 84818ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 84918ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 85018ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 85118ae91c8SDavid Wu } 85218ae91c8SDavid Wu 853ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 854ff86648dSDavid Wu { 855ff86648dSDavid Wu struct rk1808_grf *grf; 856ff86648dSDavid Wu enum { 857ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 858ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 859ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 860ff86648dSDavid Wu 861ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 862ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 863ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 864ff86648dSDavid Wu 865ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 866ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 867ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 868ff86648dSDavid Wu }; 869ff86648dSDavid Wu enum { 870ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 871ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 872ff86648dSDavid Wu 873ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 874ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 875ff86648dSDavid Wu }; 876ff86648dSDavid Wu 877ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 878ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 879ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 880ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 881ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 882ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 883ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 884ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 885ff86648dSDavid Wu 886ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 887ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 888ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 889c5bdc99aSJianqun Xu (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) | 890c5bdc99aSJianqun Xu (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT)); 891ff86648dSDavid Wu } 892ff86648dSDavid Wu 893af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 894af166ffaSDavid Wu { 895af166ffaSDavid Wu struct rk322x_grf *grf; 896af166ffaSDavid Wu enum { 897af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 898af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 899af166ffaSDavid Wu 900af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 901af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 902af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 903af166ffaSDavid Wu 904af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 905af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 906af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 907af166ffaSDavid Wu 908af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 909af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 910af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 911af166ffaSDavid Wu }; 912af166ffaSDavid Wu enum { 913af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 914af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 915af166ffaSDavid Wu 916af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 917af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 918af166ffaSDavid Wu }; 919af166ffaSDavid Wu 920af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 921af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 922af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 923af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 924af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 925af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 926af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 927af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 928af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 929af166ffaSDavid Wu 930af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 931af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 932af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 933af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 934af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 935af166ffaSDavid Wu } 936af166ffaSDavid Wu 937491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 938491f3bfbSDavid Wu { 939491f3bfbSDavid Wu struct rk322x_grf *grf; 940491f3bfbSDavid Wu enum { 941491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 942491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 943491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 944491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 945491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 946491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 947491f3bfbSDavid Wu }; 948491f3bfbSDavid Wu 949491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 950491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 951491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 952491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 953491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 954491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 955491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 956491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 957491f3bfbSDavid Wu } 958491f3bfbSDavid Wu 9591f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 9601f08aa1cSPhilipp Tomsich { 9611f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 9621f08aa1cSPhilipp Tomsich 9631f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9641f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 9651f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 9661f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 9671f08aa1cSPhilipp Tomsich 9681f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 9691f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 9701f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 9711f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 9721f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 9731f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 9741f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 9751f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 9761f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 9771f08aa1cSPhilipp Tomsich } 9781f08aa1cSPhilipp Tomsich 97923adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 98023adb58fSDavid Wu { 98123adb58fSDavid Wu struct rk3308_grf *grf; 98223adb58fSDavid Wu enum { 98323adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 98423adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 98523adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 98623adb58fSDavid Wu }; 98723adb58fSDavid Wu 98823adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 98923adb58fSDavid Wu 99023adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 99123adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 99223adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 99323adb58fSDavid Wu } 99423adb58fSDavid Wu 995c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 996c36b26c0SDavid Wu { 997c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 998c36b26c0SDavid Wu enum { 999c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 1000c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 1001c36b26c0SDavid Wu 1002c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 1003c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1004c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1005c36b26c0SDavid Wu 1006c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 1007c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1008c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 1009c36b26c0SDavid Wu 1010c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 1011c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1012c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 1013c36b26c0SDavid Wu }; 1014c36b26c0SDavid Wu enum { 1015c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 1016c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 1017c36b26c0SDavid Wu 1018c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1019c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1020c36b26c0SDavid Wu }; 1021c36b26c0SDavid Wu 1022c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1023c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 1024c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 1025c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 1026c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 1027c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 1028c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 1029c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 1030c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 1031c36b26c0SDavid Wu 1032c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 1033c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 1034c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 1035c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 1036c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 1037c36b26c0SDavid Wu } 1038c36b26c0SDavid Wu 1039491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1040491f3bfbSDavid Wu { 1041491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1042491f3bfbSDavid Wu enum { 1043491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 1044491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 1045491f3bfbSDavid Wu 1046491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1047491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1048491f3bfbSDavid Wu }; 1049491f3bfbSDavid Wu 1050491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1051491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 1052491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 1053491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 1054491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 1055491f3bfbSDavid Wu RK3328_RMII_MODE); 1056491f3bfbSDavid Wu } 1057491f3bfbSDavid Wu 1058793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1059793f2fd2SPhilipp Tomsich { 1060793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 1061793f2fd2SPhilipp Tomsich enum { 1062793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 1063793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 1064793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 1065793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 1066793f2fd2SPhilipp Tomsich }; 1067793f2fd2SPhilipp Tomsich enum { 1068793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 1069793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1070793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 1071793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 1072793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1073793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 1074793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 1075793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1076793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 1077793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1078793f2fd2SPhilipp Tomsich }; 1079793f2fd2SPhilipp Tomsich 1080793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1081793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 1082793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 1083793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 1084793f2fd2SPhilipp Tomsich 1085793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 1086793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 1087793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 1088793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 1089793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 1090793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 1091793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 1092c5bdc99aSJianqun Xu (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) | 1093c5bdc99aSJianqun Xu (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT)); 1094793f2fd2SPhilipp Tomsich } 1095793f2fd2SPhilipp Tomsich 10961f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 10971f08aa1cSPhilipp Tomsich { 10981f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 10991f08aa1cSPhilipp Tomsich 11001f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 11011f08aa1cSPhilipp Tomsich 11021f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 11031f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 11041f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 11051f08aa1cSPhilipp Tomsich 11061f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 11071f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 11081f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 11091f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 11101f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 11111f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 11121f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 1113c5bdc99aSJianqun Xu (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) | 1114c5bdc99aSJianqun Xu (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT)); 11151f08aa1cSPhilipp Tomsich } 11161f08aa1cSPhilipp Tomsich 11170a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 11180a33ce65SDavid Wu { 11190a33ce65SDavid Wu struct rv1108_grf *grf; 11200a33ce65SDavid Wu 11210a33ce65SDavid Wu enum { 11220a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 11230a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 11240a33ce65SDavid Wu }; 11250a33ce65SDavid Wu 11260a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 11270a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 11280a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 11290a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 11300a33ce65SDavid Wu } 1131491f3bfbSDavid Wu 1132491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1133491f3bfbSDavid Wu { 1134491f3bfbSDavid Wu struct rk322x_grf *grf; 1135491f3bfbSDavid Wu enum { 1136491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 1137491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 1138491f3bfbSDavid Wu }; 1139491f3bfbSDavid Wu enum { 1140491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1141491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 1142491f3bfbSDavid Wu 1143491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1144491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 1145491f3bfbSDavid Wu 1146491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 1147491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 1148491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 1149491f3bfbSDavid Wu }; 1150491f3bfbSDavid Wu enum { 1151491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1152491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 1153491f3bfbSDavid Wu }; 1154491f3bfbSDavid Wu enum { 1155491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1156491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 1157491f3bfbSDavid Wu }; 1158491f3bfbSDavid Wu 1159491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1160491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 1161491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 1162491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 1163491f3bfbSDavid Wu 1164491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1165491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 1166491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 1167491f3bfbSDavid Wu 1168491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1169491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 1170491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 1171491f3bfbSDavid Wu 1172491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1173491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1174491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 1175491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 1176491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1177491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 1178491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 1179491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 1180491f3bfbSDavid Wu 1181491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1182491f3bfbSDavid Wu udelay(10); 1183491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1184491f3bfbSDavid Wu udelay(10); 1185491f3bfbSDavid Wu 1186491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1187491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 1188491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 1189491f3bfbSDavid Wu udelay(30 * 1000); 1190491f3bfbSDavid Wu } 1191491f3bfbSDavid Wu 1192491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1193491f3bfbSDavid Wu { 1194491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1195491f3bfbSDavid Wu enum { 1196491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1197491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 1198491f3bfbSDavid Wu }; 1199491f3bfbSDavid Wu enum { 1200491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1201491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1202491f3bfbSDavid Wu 1203491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1204491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 1205491f3bfbSDavid Wu 1206491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 1207491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 1208491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 1209491f3bfbSDavid Wu }; 1210491f3bfbSDavid Wu enum { 1211491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1212491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1213491f3bfbSDavid Wu }; 1214491f3bfbSDavid Wu enum { 1215491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1216491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1217491f3bfbSDavid Wu }; 1218491f3bfbSDavid Wu 1219491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1220491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 1221491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 1222491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 1223491f3bfbSDavid Wu 1224491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1225491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1226491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 1227491f3bfbSDavid Wu 1228491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1229491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1230491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 1231491f3bfbSDavid Wu 1232491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1233491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1234491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 1235491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 1236491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1237491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 1238491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 1239491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 1240491f3bfbSDavid Wu 1241491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1242491f3bfbSDavid Wu udelay(10); 1243491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1244491f3bfbSDavid Wu udelay(10); 1245491f3bfbSDavid Wu 1246491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1247491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1248491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 1249491f3bfbSDavid Wu udelay(30 * 1000); 1250491f3bfbSDavid Wu } 1251491f3bfbSDavid Wu 1252dcfb333aSDavid Wu #else 1253*bcf26c57SDavid Wu static void rk3506_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1254*bcf26c57SDavid Wu { 1255*bcf26c57SDavid Wu unsigned int clk_mode; 1256*bcf26c57SDavid Wu struct rk3506_grf_reg *grf; 1257*bcf26c57SDavid Wu 1258*bcf26c57SDavid Wu enum { 1259*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_MODE_SHIFT = 0x1, 1260*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_MODE_MASK = BIT(1), 1261*bcf26c57SDavid Wu RK3506_GMAC_CLK_RMII_MODE = BIT(1), 1262*bcf26c57SDavid Wu }; 1263*bcf26c57SDavid Wu 1264*bcf26c57SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1265*bcf26c57SDavid Wu clk_mode = RK3506_GMAC_CLK_RMII_MODE; 1266*bcf26c57SDavid Wu 1267*bcf26c57SDavid Wu if (pdata->bus_id == 1) 1268*bcf26c57SDavid Wu rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode); 1269*bcf26c57SDavid Wu else 1270*bcf26c57SDavid Wu rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode); 1271*bcf26c57SDavid Wu } 1272*bcf26c57SDavid Wu 1273c563400aSDavid Wu static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1274c563400aSDavid Wu { 1275c563400aSDavid Wu struct rk3528_grf *grf; 1276c563400aSDavid Wu unsigned char bgs[1] = {0}; 1277c563400aSDavid Wu 1278c563400aSDavid Wu enum { 1279c563400aSDavid Wu RK3528_MACPHY_ENABLE_MASK = BIT(1), 1280c563400aSDavid Wu RK3528_MACPHY_DISENABLE = BIT(1), 1281c563400aSDavid Wu RK3528_MACPHY_ENABLE = 0, 1282c563400aSDavid Wu RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 1283c563400aSDavid Wu RK3528_MACPHY_XMII_SEL = BIT(6), 1284c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 1285c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 1286c563400aSDavid Wu RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 1287c563400aSDavid Wu RK3528_MACPHY_PHY_ID = BIT(11), 1288c563400aSDavid Wu }; 1289c563400aSDavid Wu 1290c563400aSDavid Wu enum { 1291c563400aSDavid Wu RK3528_MACPHY_BGS_MASK = GENMASK(3, 0), 1292c563400aSDavid Wu }; 1293c563400aSDavid Wu 1294c563400aSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1295c563400aSDavid Wu struct udevice *dev; 1296c563400aSDavid Wu u32 regs[2] = {0}; 1297c563400aSDavid Wu ofnode node; 1298c563400aSDavid Wu int ret = 0; 1299c563400aSDavid Wu 1300c563400aSDavid Wu /* retrieve the device */ 1301c563400aSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1302c563400aSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1303c563400aSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1304c563400aSDavid Wu &dev); 1305c563400aSDavid Wu else 1306c563400aSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1307c563400aSDavid Wu DM_GET_DRIVER(rockchip_otp), 1308c563400aSDavid Wu &dev); 1309c563400aSDavid Wu if (!ret) { 1310c563400aSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1311c563400aSDavid Wu if (ofnode_valid(node)) { 1312c563400aSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1313c563400aSDavid Wu /* read the bgs from the efuses */ 1314c563400aSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1315c563400aSDavid Wu if (ret) { 1316c563400aSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1317c563400aSDavid Wu ret); 1318c563400aSDavid Wu bgs[0] = 0; 1319c563400aSDavid Wu } 1320c563400aSDavid Wu } 1321c563400aSDavid Wu } 1322c563400aSDavid Wu } 1323c563400aSDavid Wu #endif 1324c563400aSDavid Wu 1325c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1326c563400aSDavid Wu 1327c563400aSDavid Wu reset_assert(&pdata->phy_reset); 1328c563400aSDavid Wu udelay(20); 1329c563400aSDavid Wu rk_clrsetreg(&grf->macphy_con0, 1330c563400aSDavid Wu RK3528_MACPHY_ENABLE_MASK | 1331c563400aSDavid Wu RK3528_MACPHY_XMII_SEL_MASK | 1332c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_MASK | 1333c563400aSDavid Wu RK3528_MACPHY_PHY_ID_MASK, 1334c563400aSDavid Wu RK3528_MACPHY_ENABLE | 1335c563400aSDavid Wu RK3528_MACPHY_XMII_SEL | 1336c563400aSDavid Wu RK3528_MACPHY_24M_CLK_SEL_24M | 1337c563400aSDavid Wu RK3528_MACPHY_PHY_ID); 1338c563400aSDavid Wu 1339c563400aSDavid Wu rk_clrsetreg(&grf->macphy_con1, 1340c563400aSDavid Wu RK3528_MACPHY_BGS_MASK, 1341c563400aSDavid Wu bgs[0]); 1342c563400aSDavid Wu udelay(20); 1343c563400aSDavid Wu reset_deassert(&pdata->phy_reset); 1344c563400aSDavid Wu udelay(30 * 1000); 1345c563400aSDavid Wu } 1346c563400aSDavid Wu 1347c563400aSDavid Wu static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1348c563400aSDavid Wu { 1349c563400aSDavid Wu unsigned int clk_mode; 1350c563400aSDavid Wu struct rk3528_grf *grf; 1351c563400aSDavid Wu 1352c563400aSDavid Wu enum { 1353c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1, 1354c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1), 1355c563400aSDavid Wu RK3528_GMAC0_CLK_RMII_MODE = 0x1, 1356c563400aSDavid Wu }; 1357c563400aSDavid Wu 1358c563400aSDavid Wu enum { 1359c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8, 1360c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8), 1361c563400aSDavid Wu RK3528_GMAC1_CLK_RMII_MODE = 0x1, 1362c563400aSDavid Wu }; 1363c563400aSDavid Wu 1364c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1365c563400aSDavid Wu 1366c563400aSDavid Wu if (pdata->bus_id == 1) { 1367c563400aSDavid Wu clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT; 1368c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode); 1369c563400aSDavid Wu } else { 1370c563400aSDavid Wu clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT; 1371c563400aSDavid Wu rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode); 1372c563400aSDavid Wu } 1373c563400aSDavid Wu } 1374c563400aSDavid Wu 1375c563400aSDavid Wu static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1376c563400aSDavid Wu { 1377c563400aSDavid Wu unsigned int rx_enable; 1378c563400aSDavid Wu unsigned int rx_delay; 1379c563400aSDavid Wu struct rk3528_grf *grf; 1380c563400aSDavid Wu 1381c563400aSDavid Wu enum { 1382c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8, 1383c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_MASK = BIT(8), 1384c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE = 0x0, 1385c563400aSDavid Wu 1386c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14), 1387c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0, 1388c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14), 1389c563400aSDavid Wu 1390c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15), 1391c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0, 1392c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15), 1393c563400aSDavid Wu }; 1394c563400aSDavid Wu 1395c563400aSDavid Wu enum { 1396c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8, 1397c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8), 1398c563400aSDavid Wu 1399c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0, 1400c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0), 1401c563400aSDavid Wu }; 1402c563400aSDavid Wu 1403c563400aSDavid Wu if (!pdata->bus_id) 1404c563400aSDavid Wu return; 1405c563400aSDavid Wu 1406c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1407c563400aSDavid Wu 1408c563400aSDavid Wu if (pdata->rx_delay < 0) { 1409c563400aSDavid Wu rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE; 1410c563400aSDavid Wu rx_delay = 0; 1411c563400aSDavid Wu } else { 1412c563400aSDavid Wu rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE; 1413c563400aSDavid Wu rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT; 1414c563400aSDavid Wu } 1415c563400aSDavid Wu 1416c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, 1417c563400aSDavid Wu RK3528_GMAC1_TXCLK_DLY_ENA_MASK | 1418c563400aSDavid Wu RK3528_GMAC1_RXCLK_DLY_ENA_MASK | 1419c563400aSDavid Wu RK3528_GMAC1_RGMII_MODE_MASK, 1420c563400aSDavid Wu rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE | 1421c563400aSDavid Wu (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT)); 1422c563400aSDavid Wu 1423c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con1, 1424c563400aSDavid Wu RK3528_GMAC1_RX_DL_CFG_MASK | 1425c563400aSDavid Wu RK3528_GMAC1_TX_DL_CFG_MASK, 1426c563400aSDavid Wu (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) | 1427c563400aSDavid Wu rx_delay); 1428c563400aSDavid Wu } 1429c563400aSDavid Wu 143083f30531SDavid Wu static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata) 143183f30531SDavid Wu { 143283f30531SDavid Wu struct rk3562_grf *grf; 143383f30531SDavid Wu unsigned int mode; 143483f30531SDavid Wu 143583f30531SDavid Wu enum { 143683f30531SDavid Wu RK3562_GMAC0_RMII_MODE_SHIFT = 0x5, 143783f30531SDavid Wu RK3562_GMAC0_RMII_MODE_MASK = BIT(5), 143883f30531SDavid Wu RK3562_GMAC0_RMII_MODE = 0x1, 143983f30531SDavid Wu }; 144083f30531SDavid Wu 144183f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 144283f30531SDavid Wu 144383f30531SDavid Wu if (!pdata->bus_id) { 144483f30531SDavid Wu mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT; 144583f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode); 144683f30531SDavid Wu } 144783f30531SDavid Wu } 144883f30531SDavid Wu 144983f30531SDavid Wu static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 145083f30531SDavid Wu { 145183f30531SDavid Wu struct rk3562_grf *grf; 145283f30531SDavid Wu struct rk3562_ioc *ioc; 145383f30531SDavid Wu unsigned int rx_enable; 145483f30531SDavid Wu unsigned int rx_delay; 145583f30531SDavid Wu 145683f30531SDavid Wu enum { 145783f30531SDavid Wu RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5, 145883f30531SDavid Wu RK3562_GMAC0_RGMII_MODE_MASK = BIT(5), 145983f30531SDavid Wu RK3562_GMAC0_RGMII_MODE = 0x0, 146083f30531SDavid Wu 146183f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0), 146283f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0, 146383f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0), 146483f30531SDavid Wu 146583f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1), 146683f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0, 146783f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1), 146883f30531SDavid Wu }; 146983f30531SDavid Wu 147083f30531SDavid Wu enum { 147183f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8, 147283f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8), 147383f30531SDavid Wu 147483f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0, 147583f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0), 147683f30531SDavid Wu }; 147783f30531SDavid Wu 147883f30531SDavid Wu if (pdata->bus_id) 147983f30531SDavid Wu return; 148083f30531SDavid Wu 148183f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 148283f30531SDavid Wu ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); 148383f30531SDavid Wu 148483f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK, 148583f30531SDavid Wu RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT); 148683f30531SDavid Wu 148783f30531SDavid Wu if (pdata->rx_delay < 0) { 148883f30531SDavid Wu rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE; 148983f30531SDavid Wu rx_delay = 0; 149083f30531SDavid Wu } else { 149183f30531SDavid Wu rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE; 149283f30531SDavid Wu rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT; 149383f30531SDavid Wu } 149483f30531SDavid Wu 149583f30531SDavid Wu rk_clrsetreg(&ioc->mac0_io_con1, 149683f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_MASK | 149783f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_MASK, 149883f30531SDavid Wu rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); 149983f30531SDavid Wu 150083f30531SDavid Wu rk_clrsetreg(&ioc->mac0_io_con0, 150183f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_MASK | 150283f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_MASK, 150383f30531SDavid Wu (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | 150483f30531SDavid Wu rx_delay); 150583f30531SDavid Wu 150683f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con1, 150783f30531SDavid Wu RK3562_GMAC0_TXCLK_DLY_ENA_MASK | 150883f30531SDavid Wu RK3562_GMAC0_RXCLK_DLY_ENA_MASK, 150983f30531SDavid Wu rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); 151083f30531SDavid Wu 151183f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con0, 151283f30531SDavid Wu RK3562_GMAC0_RX_DL_CFG_MASK | 151383f30531SDavid Wu RK3562_GMAC0_TX_DL_CFG_MASK, 151483f30531SDavid Wu (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | 151583f30531SDavid Wu rx_delay); 151683f30531SDavid Wu } 151783f30531SDavid Wu 151833a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 151933a014bdSDavid Wu { 152033a014bdSDavid Wu struct rk3568_grf *grf; 152133a014bdSDavid Wu void *con1; 152233a014bdSDavid Wu 152333a014bdSDavid Wu enum { 152433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 152533a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 152633a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 152733a014bdSDavid Wu }; 152833a014bdSDavid Wu 152933a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 153033a014bdSDavid Wu 153133a014bdSDavid Wu if (pdata->bus_id == 1) 153233a014bdSDavid Wu con1 = &grf->mac1_con1; 153333a014bdSDavid Wu else 153433a014bdSDavid Wu con1 = &grf->mac0_con1; 153533a014bdSDavid Wu 153633a014bdSDavid Wu rk_clrsetreg(con1, 153733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 153833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 153933a014bdSDavid Wu } 154033a014bdSDavid Wu 154133a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 154233a014bdSDavid Wu { 154333a014bdSDavid Wu struct rk3568_grf *grf; 154433a014bdSDavid Wu void *con0, *con1; 154533a014bdSDavid Wu 154633a014bdSDavid Wu enum { 154733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 154833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 154933a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 155033a014bdSDavid Wu 155133a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 155233a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 155333a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 155433a014bdSDavid Wu 155533a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 155633a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 155733a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 155833a014bdSDavid Wu }; 155933a014bdSDavid Wu 156033a014bdSDavid Wu enum { 156133a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 156233a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 156333a014bdSDavid Wu 156433a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 156533a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 156633a014bdSDavid Wu }; 156733a014bdSDavid Wu 156833a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 156933a014bdSDavid Wu 157033a014bdSDavid Wu if (pdata->bus_id == 1) { 157133a014bdSDavid Wu con0 = &grf->mac1_con0; 157233a014bdSDavid Wu con1 = &grf->mac1_con1; 157333a014bdSDavid Wu } else { 157433a014bdSDavid Wu con0 = &grf->mac0_con0; 157533a014bdSDavid Wu con1 = &grf->mac0_con1; 157633a014bdSDavid Wu } 157733a014bdSDavid Wu 157833a014bdSDavid Wu rk_clrsetreg(con0, 157933a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 158033a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 1581c5bdc99aSJianqun Xu (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) | 1582c5bdc99aSJianqun Xu (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT)); 158333a014bdSDavid Wu 158433a014bdSDavid Wu rk_clrsetreg(con1, 158533a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 158633a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 158733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 158833a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 158933a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 159033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 159133a014bdSDavid Wu } 159233a014bdSDavid Wu 1593bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1594bf0e94d0SDavid Wu { 1595bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1596bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1597bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1598bf0e94d0SDavid Wu 1599bf0e94d0SDavid Wu enum { 1600bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1601bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1602bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1603bf0e94d0SDavid Wu }; 1604bf0e94d0SDavid Wu 1605bf0e94d0SDavid Wu enum { 1606bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1607bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1608bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE = 0x1, 1609bf0e94d0SDavid Wu }; 1610bf0e94d0SDavid Wu 1611bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1612bf0e94d0SDavid Wu 1613bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1614bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1615bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1616bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1617bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1618bf0e94d0SDavid Wu } else { 1619bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1620bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1621bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1622bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1623bf0e94d0SDavid Wu } 1624bf0e94d0SDavid Wu 1625bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1626bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1627bf0e94d0SDavid Wu } 1628bf0e94d0SDavid Wu 1629bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1630bf0e94d0SDavid Wu { 1631bf0e94d0SDavid Wu unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1632bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1633bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1634bf0e94d0SDavid Wu unsigned int rx_delay; 1635bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1636bf0e94d0SDavid Wu struct rk3588_sys_grf *grf; 1637bf0e94d0SDavid Wu void *offset_con; 1638bf0e94d0SDavid Wu 1639bf0e94d0SDavid Wu enum { 1640bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1641bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1642bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1643bf0e94d0SDavid Wu 1644bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1645bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1646bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1647bf0e94d0SDavid Wu 1648bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1649bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1650bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1651bf0e94d0SDavid Wu }; 1652bf0e94d0SDavid Wu 1653bf0e94d0SDavid Wu enum { 1654bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1655bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1656bf0e94d0SDavid Wu 1657bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1658bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1659bf0e94d0SDavid Wu }; 1660bf0e94d0SDavid Wu 1661bf0e94d0SDavid Wu enum { 1662bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1663bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1664bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1665bf0e94d0SDavid Wu }; 1666bf0e94d0SDavid Wu 1667bf0e94d0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1668bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1669bf0e94d0SDavid Wu 1670bf0e94d0SDavid Wu if (pdata->rx_delay < 0) { 1671bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1672bf0e94d0SDavid Wu rx_delay = 0; 1673bf0e94d0SDavid Wu } else { 1674bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1675bf0e94d0SDavid Wu rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1676bf0e94d0SDavid Wu } 1677bf0e94d0SDavid Wu 1678bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1679bf0e94d0SDavid Wu offset_con = &grf->soc_con9; 1680bf0e94d0SDavid Wu rx_enable = rx_delay << 2; 1681bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1682bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1683bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1684bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1685bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1686bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1687bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1688bf0e94d0SDavid Wu } else { 1689bf0e94d0SDavid Wu offset_con = &grf->soc_con8; 1690bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1691bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1692bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1693bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1694bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1695bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1696bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1697bf0e94d0SDavid Wu } 1698bf0e94d0SDavid Wu 1699bf0e94d0SDavid Wu rk_clrsetreg(offset_con, 1700bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1701bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1702c5bdc99aSJianqun Xu (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) | 1703bf0e94d0SDavid Wu rx_delay); 1704bf0e94d0SDavid Wu 1705bf0e94d0SDavid Wu rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1706bf0e94d0SDavid Wu tx_enable | rx_enable); 1707bf0e94d0SDavid Wu 1708bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1709bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1710bf0e94d0SDavid Wu } 1711bf0e94d0SDavid Wu 1712745dad46SDavid Wu static void rv1103b_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1713745dad46SDavid Wu { 1714745dad46SDavid Wu struct rv1103b_grf *grf; 1715745dad46SDavid Wu enum { 1716745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK = BIT(2), 1717745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M = BIT(2), 1718745dad46SDavid Wu }; 1719745dad46SDavid Wu 1720745dad46SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1721745dad46SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 1722745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK, 1723745dad46SDavid Wu RV1103B_SYSGRF_GMAC_CLK_RMII_50M); 1724745dad46SDavid Wu }; 1725745dad46SDavid Wu 172620bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 172720bef841SDavid Wu { 1728745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B 1729745dad46SDavid Wu struct rv1103b_grf *grf; 1730745dad46SDavid Wu #else 173120bef841SDavid Wu struct rv1106_grf *grf; 1732745dad46SDavid Wu #endif 1733535678cdSDavid Wu unsigned char bgs[1] = {0}; 1734535678cdSDavid Wu 1735535678cdSDavid Wu enum { 1736535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1737535678cdSDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1738535678cdSDavid Wu }; 173954f7ad44SDavid Wu 174054f7ad44SDavid Wu enum { 174120bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK = BIT(1), 174254f7ad44SDavid Wu RV1106_MACPHY_DISENABLE = BIT(1), 174354f7ad44SDavid Wu RV1106_MACPHY_ENABLE = 0, 174420bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 174520bef841SDavid Wu RV1106_MACPHY_XMII_SEL = BIT(6), 174620bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 174720bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 174820bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 174920bef841SDavid Wu RV1106_MACPHY_PHY_ID = BIT(11), 175020bef841SDavid Wu }; 175120bef841SDavid Wu 175220bef841SDavid Wu enum { 175320bef841SDavid Wu RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 175454f7ad44SDavid Wu RV1106_MACPHY_BGS = BIT(2), 175520bef841SDavid Wu }; 175620bef841SDavid Wu 1757535678cdSDavid Wu #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1758535678cdSDavid Wu struct udevice *dev; 1759535678cdSDavid Wu u32 regs[2] = {0}; 1760535678cdSDavid Wu ofnode node; 1761535678cdSDavid Wu int ret = 0; 1762535678cdSDavid Wu 1763535678cdSDavid Wu /* retrieve the device */ 1764535678cdSDavid Wu if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1765535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1766535678cdSDavid Wu DM_GET_DRIVER(rockchip_efuse), 1767535678cdSDavid Wu &dev); 1768535678cdSDavid Wu else 1769535678cdSDavid Wu ret = uclass_get_device_by_driver(UCLASS_MISC, 1770535678cdSDavid Wu DM_GET_DRIVER(rockchip_otp), 1771535678cdSDavid Wu &dev); 1772535678cdSDavid Wu if (!ret) { 1773535678cdSDavid Wu node = dev_read_subnode(dev, "macphy-bgs"); 1774535678cdSDavid Wu if (ofnode_valid(node)) { 1775535678cdSDavid Wu if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1776535678cdSDavid Wu /* read the bgs from the efuses */ 1777535678cdSDavid Wu ret = misc_read(dev, regs[0], &bgs, 1); 1778535678cdSDavid Wu if (ret) { 1779535678cdSDavid Wu printf("read bgs from efuse/otp failed, ret=%d\n", 1780535678cdSDavid Wu ret); 1781535678cdSDavid Wu bgs[0] = 0; 1782535678cdSDavid Wu } 1783535678cdSDavid Wu } 1784535678cdSDavid Wu } 1785535678cdSDavid Wu } 1786535678cdSDavid Wu #endif 1787535678cdSDavid Wu 178820bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 178920bef841SDavid Wu 179020bef841SDavid Wu reset_assert(&pdata->phy_reset); 179120bef841SDavid Wu udelay(20); 179220bef841SDavid Wu rk_clrsetreg(&grf->macphy_con0, 179320bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK | 179420bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK | 179520bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK | 179620bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK, 179720bef841SDavid Wu RV1106_MACPHY_ENABLE | 179820bef841SDavid Wu RV1106_MACPHY_XMII_SEL | 179920bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M | 180020bef841SDavid Wu RV1106_MACPHY_PHY_ID); 180120bef841SDavid Wu 180220bef841SDavid Wu rk_clrsetreg(&grf->macphy_con1, 180320bef841SDavid Wu RV1106_MACPHY_BGS_MASK, 1804535678cdSDavid Wu bgs[0]); 18058bafa3a1SDavid Wu udelay(20); 180620bef841SDavid Wu reset_deassert(&pdata->phy_reset); 180720bef841SDavid Wu udelay(30 * 1000); 180820bef841SDavid Wu } 180920bef841SDavid Wu 18108bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 18118bafa3a1SDavid Wu { 18128bafa3a1SDavid Wu struct rv1106_grf *grf; 18138bafa3a1SDavid Wu enum { 18148bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 18158bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 18168bafa3a1SDavid Wu }; 18178bafa3a1SDavid Wu 18188bafa3a1SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 18198bafa3a1SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 18208bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 18218bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE); 18228bafa3a1SDavid Wu }; 18238bafa3a1SDavid Wu 1824e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1825e4e3f431SDavid Wu { 1826e4e3f431SDavid Wu struct rv1126_grf *grf; 1827e4e3f431SDavid Wu 1828e4e3f431SDavid Wu enum { 1829e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1830e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1831e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1832e4e3f431SDavid Wu }; 1833e4e3f431SDavid Wu 1834e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1835e4e3f431SDavid Wu 1836e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1837e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1838e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1839e4e3f431SDavid Wu } 1840e4e3f431SDavid Wu 1841dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1842dcfb333aSDavid Wu { 1843dcfb333aSDavid Wu struct rv1126_grf *grf; 1844dcfb333aSDavid Wu 1845dcfb333aSDavid Wu enum { 1846dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1847dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1848dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1849dcfb333aSDavid Wu 1850dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1851dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1852dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1853dcfb333aSDavid Wu 1854dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1855dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1856dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1857dcfb333aSDavid Wu 1858dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1859dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1860dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1861dcfb333aSDavid Wu 1862dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1863dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1864dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1865dcfb333aSDavid Wu }; 1866dcfb333aSDavid Wu enum { 1867dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1868dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1869dcfb333aSDavid Wu 1870dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1871dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1872dcfb333aSDavid Wu }; 1873dcfb333aSDavid Wu enum { 1874dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1875dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1876dcfb333aSDavid Wu 1877dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1878dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1879dcfb333aSDavid Wu }; 1880dcfb333aSDavid Wu 1881dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1882dcfb333aSDavid Wu 1883dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1884dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1885dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1886dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1887dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1888dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1889dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1890dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1891dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1892dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1893dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1894dcfb333aSDavid Wu 1895dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1896dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1897dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1898c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) | 1899c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT)); 1900dcfb333aSDavid Wu 1901dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1902dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1903dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1904c5bdc99aSJianqun Xu (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) | 1905c5bdc99aSJianqun Xu (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT)); 1906dcfb333aSDavid Wu } 19076f0a52e9SDavid Wu #endif 19080a33ce65SDavid Wu 1909bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1910*bcf26c57SDavid Wu static void rk3506_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1911*bcf26c57SDavid Wu { 1912*bcf26c57SDavid Wu struct rk3506_grf_reg *grf; 1913*bcf26c57SDavid Wu unsigned int val; 1914*bcf26c57SDavid Wu 1915*bcf26c57SDavid Wu enum { 1916*bcf26c57SDavid Wu RK3506_GMAC_CLK_SELET_SHIFT = 5, 1917*bcf26c57SDavid Wu RK3506_GMAC_CLK_SELET_MASK = BIT(5), 1918*bcf26c57SDavid Wu RK3506_GMAC_CLK_SELET_CRU = 0, 1919*bcf26c57SDavid Wu RK3506_GMAC_CLK_SELET_IO = BIT(5), 1920*bcf26c57SDavid Wu }; 1921*bcf26c57SDavid Wu 1922*bcf26c57SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1923*bcf26c57SDavid Wu 1924*bcf26c57SDavid Wu val = pdata->clock_input ? RK3506_GMAC_CLK_SELET_IO : 1925*bcf26c57SDavid Wu RK3506_GMAC_CLK_SELET_CRU; 1926*bcf26c57SDavid Wu 1927*bcf26c57SDavid Wu if (pdata->bus_id) 1928*bcf26c57SDavid Wu rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_SELET_MASK, val); 1929*bcf26c57SDavid Wu else 1930*bcf26c57SDavid Wu rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_SELET_MASK, val); 1931*bcf26c57SDavid Wu } 1932*bcf26c57SDavid Wu 1933c563400aSDavid Wu static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1934c563400aSDavid Wu { 1935c563400aSDavid Wu struct rk3528_grf *grf; 1936c563400aSDavid Wu unsigned int val; 1937c563400aSDavid Wu 1938c563400aSDavid Wu enum { 1939c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_SHIFT = 0x12, 1940c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_MASK = BIT(12), 1941c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_CRU = 0, 1942c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_IO = BIT(12), 1943c563400aSDavid Wu }; 1944c563400aSDavid Wu 1945c563400aSDavid Wu if (!pdata->bus_id) 1946c563400aSDavid Wu return; 1947c563400aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1948c563400aSDavid Wu 1949c563400aSDavid Wu val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO : 1950c563400aSDavid Wu RK3528_GMAC1_CLK_SELET_CRU; 1951c563400aSDavid Wu rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val); 1952c563400aSDavid Wu } 1953c563400aSDavid Wu 195483f30531SDavid Wu static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata) 195583f30531SDavid Wu { 195683f30531SDavid Wu struct rk3562_grf *grf; 195783f30531SDavid Wu struct rk3562_ioc *ioc; 195883f30531SDavid Wu unsigned int val; 195983f30531SDavid Wu 196083f30531SDavid Wu enum { 196183f30531SDavid Wu RK3562_GMAC0_CLK_SELET_SHIFT = 0x9, 196283f30531SDavid Wu RK3562_GMAC0_CLK_SELET_MASK = BIT(9), 196383f30531SDavid Wu RK3562_GMAC0_CLK_SELET_CRU = 0, 196483f30531SDavid Wu RK3562_GMAC0_CLK_SELET_IO = BIT(9), 196583f30531SDavid Wu }; 196683f30531SDavid Wu 196783f30531SDavid Wu enum { 196883f30531SDavid Wu RK3562_GMAC1_CLK_SELET_SHIFT = 15, 196983f30531SDavid Wu RK3562_GMAC1_CLK_SELET_MASK = BIT(15), 197083f30531SDavid Wu RK3562_GMAC1_CLK_SELET_CRU = 0, 197183f30531SDavid Wu RK3562_GMAC1_CLK_SELET_IO = BIT(15), 197283f30531SDavid Wu }; 197383f30531SDavid Wu 197483f30531SDavid Wu enum { 197583f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2, 197683f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2), 197783f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0, 197883f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2), 197983f30531SDavid Wu }; 198083f30531SDavid Wu 198183f30531SDavid Wu enum { 198283f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3, 198383f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3), 198483f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0, 198583f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3), 198683f30531SDavid Wu }; 198783f30531SDavid Wu 198883f30531SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 198983f30531SDavid Wu ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); 199083f30531SDavid Wu 199183f30531SDavid Wu if (!pdata->bus_id) { 199283f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO : 199383f30531SDavid Wu RK3562_GMAC0_CLK_SELET_CRU; 199483f30531SDavid Wu rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val); 199583f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO : 199683f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_CRU; 199783f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con1, 199883f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); 199983f30531SDavid Wu rk_clrsetreg(&ioc->mac0_io_con1, 200083f30531SDavid Wu RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); 200183f30531SDavid Wu 200283f30531SDavid Wu } else { 200383f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO : 200483f30531SDavid Wu RK3562_GMAC1_CLK_SELET_CRU; 200583f30531SDavid Wu rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val); 200683f30531SDavid Wu val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO : 200783f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_CRU; 200883f30531SDavid Wu rk_clrsetreg(&ioc->mac1_io_con1, 200983f30531SDavid Wu RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val); 201083f30531SDavid Wu } 201183f30531SDavid Wu } 201283f30531SDavid Wu 2013bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 2014bf0e94d0SDavid Wu { 2015bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 2016bf0e94d0SDavid Wu unsigned int val, mask; 2017bf0e94d0SDavid Wu 2018bf0e94d0SDavid Wu enum { 2019bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 2020bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_MASK = BIT(4), 2021bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU = BIT(4), 2022bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_IO = 0, 2023bf0e94d0SDavid Wu }; 2024bf0e94d0SDavid Wu 2025bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 2026bf0e94d0SDavid Wu val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 2027bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU; 2028bf0e94d0SDavid Wu mask = RK3588_GMAC_CLK_SELET_MASK; 2029bf0e94d0SDavid Wu 2030bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 2031bf0e94d0SDavid Wu val <<= 5; 2032bf0e94d0SDavid Wu mask <<= 5; 2033bf0e94d0SDavid Wu } 2034bf0e94d0SDavid Wu 2035bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, mask, val); 2036bf0e94d0SDavid Wu } 2037bf0e94d0SDavid Wu #endif 2038bf0e94d0SDavid Wu 20390125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 20400125bcf0SSjoerd Simons { 20410125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 20421f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 20431f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 20446f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 20456f0a52e9SDavid Wu struct eqos_config *config; 20466f0a52e9SDavid Wu #else 20476f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 20486f0a52e9SDavid Wu #endif 20496f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 20500125bcf0SSjoerd Simons struct clk clk; 20510a33ce65SDavid Wu ulong rate; 20520125bcf0SSjoerd Simons int ret; 20530125bcf0SSjoerd Simons 20546f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 20556f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 20566f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 2057befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 20586f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 20596f0a52e9SDavid Wu #else 20606f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 20616f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 20626f0a52e9SDavid Wu #endif 206333a014bdSDavid Wu pdata->bus_id = dev->seq; 206454f7ad44SDavid Wu 2065cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 2066cadc8d74SKever Yang ret = clk_set_defaults(dev); 2067cadc8d74SKever Yang if (ret) 2068cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 2069cadc8d74SKever Yang 20700125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 20710125bcf0SSjoerd Simons if (ret) 2072745dad46SDavid Wu debug("%s clk_get_by_index failed %d\n", __func__, ret); 20730125bcf0SSjoerd Simons 2074491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 2075491f3bfbSDavid Wu 2076bf0e94d0SDavid Wu if (ops->set_clock_selection) 2077bf0e94d0SDavid Wu ops->set_clock_selection(pdata); 2078bf0e94d0SDavid Wu 2079491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 2080491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 2081491f3bfbSDavid Wu 20820a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 20830a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 2084bf0e94d0SDavid Wu case PHY_INTERFACE_MODE_RGMII_RXID: 20850a33ce65SDavid Wu /* 20860a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 20870a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 20880a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 20890a33ce65SDavid Wu * is not set, because of it is bypassed. 20900a33ce65SDavid Wu */ 20910a33ce65SDavid Wu if (!pdata->clock_input) { 2092745dad46SDavid Wu if (clk.id) { 20930a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 20940a33ce65SDavid Wu if (rate != 125000000) 20950a33ce65SDavid Wu return -EINVAL; 20960a33ce65SDavid Wu } 2097745dad46SDavid Wu } 20980125bcf0SSjoerd Simons 2099bf0e94d0SDavid Wu if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 2100bf0e94d0SDavid Wu pdata->rx_delay = -1; 2101bf0e94d0SDavid Wu 21020125bcf0SSjoerd Simons /* Set to RGMII mode */ 21030a33ce65SDavid Wu if (ops->set_to_rgmii) 21041f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 21050a33ce65SDavid Wu else 21060a33ce65SDavid Wu return -EPERM; 21070a33ce65SDavid Wu 21080a33ce65SDavid Wu break; 21090a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 21100a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 21110a33ce65SDavid Wu if (!pdata->clock_input) { 2112*bcf26c57SDavid Wu printf("%s line: %d\n", __func__, __LINE__); 2113745dad46SDavid Wu if (clk.id) { 21140a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 2115*bcf26c57SDavid Wu printf("%s line: %d\n", __func__, __LINE__); 21160a33ce65SDavid Wu if (rate != 50000000) 21170a33ce65SDavid Wu return -EINVAL; 21180a33ce65SDavid Wu } 2119745dad46SDavid Wu } 21200a33ce65SDavid Wu 21210a33ce65SDavid Wu /* Set to RMII mode */ 21220a33ce65SDavid Wu if (ops->set_to_rmii) 21230a33ce65SDavid Wu ops->set_to_rmii(pdata); 21240a33ce65SDavid Wu 21250a33ce65SDavid Wu break; 21260a33ce65SDavid Wu default: 21270a33ce65SDavid Wu debug("NO interface defined!\n"); 21280a33ce65SDavid Wu return -ENXIO; 21290a33ce65SDavid Wu } 21300125bcf0SSjoerd Simons 21316f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21326f0a52e9SDavid Wu return eqos_probe(dev); 21336f0a52e9SDavid Wu #else 21340125bcf0SSjoerd Simons return designware_eth_probe(dev); 21356f0a52e9SDavid Wu #endif 21366f0a52e9SDavid Wu } 21376f0a52e9SDavid Wu 21386f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 21396f0a52e9SDavid Wu { 21406f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 21416f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 21426f0a52e9SDavid Wu #else 21436f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 21446f0a52e9SDavid Wu #endif 21456f0a52e9SDavid Wu } 21466f0a52e9SDavid Wu 21476f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 21486f0a52e9SDavid Wu int length) 21496f0a52e9SDavid Wu { 21506f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21516f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 21526f0a52e9SDavid Wu #else 21536f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 21546f0a52e9SDavid Wu #endif 21556f0a52e9SDavid Wu } 21566f0a52e9SDavid Wu 21576f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 21586f0a52e9SDavid Wu int length) 21596f0a52e9SDavid Wu { 21606f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21616f0a52e9SDavid Wu return eqos_send(dev, packet, length); 21626f0a52e9SDavid Wu #else 21636f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 21646f0a52e9SDavid Wu #endif 21656f0a52e9SDavid Wu } 21666f0a52e9SDavid Wu 21676f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 21686f0a52e9SDavid Wu uchar **packetp) 21696f0a52e9SDavid Wu { 21706f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21716f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 21726f0a52e9SDavid Wu #else 21736f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 21746f0a52e9SDavid Wu #endif 21750125bcf0SSjoerd Simons } 21760125bcf0SSjoerd Simons 21770125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 21780125bcf0SSjoerd Simons { 21796f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 21801f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 21811f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 21826f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 2183491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 21846f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 21856f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 21866f0a52e9SDavid Wu #endif 21870125bcf0SSjoerd Simons int ret; 21880125bcf0SSjoerd Simons 21896f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 21906f0a52e9SDavid Wu ret = eqos_init(dev); 21916f0a52e9SDavid Wu #else 21926f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 21936f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 21946f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 21956f0a52e9SDavid Wu eth_pdata->enetaddr); 21966f0a52e9SDavid Wu #endif 21970125bcf0SSjoerd Simons if (ret) 21980125bcf0SSjoerd Simons return ret; 2199491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 22000125bcf0SSjoerd Simons if (ret) 22010125bcf0SSjoerd Simons return ret; 22026f0a52e9SDavid Wu 22036f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 22046f0a52e9SDavid Wu eqos_enable(dev); 22056f0a52e9SDavid Wu #else 22066f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 22070125bcf0SSjoerd Simons if (ret) 22080125bcf0SSjoerd Simons return ret; 22096f0a52e9SDavid Wu #endif 22100125bcf0SSjoerd Simons 22110125bcf0SSjoerd Simons return 0; 22120125bcf0SSjoerd Simons } 22130125bcf0SSjoerd Simons 22146f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 22156f0a52e9SDavid Wu { 22166f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 22176f0a52e9SDavid Wu eqos_stop(dev); 22186f0a52e9SDavid Wu #else 22196f0a52e9SDavid Wu designware_eth_stop(dev); 22206f0a52e9SDavid Wu #endif 22216f0a52e9SDavid Wu } 22226f0a52e9SDavid Wu 22230125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 22240125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 22256f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 22266f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 22276f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 22286f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 22296f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 22300125bcf0SSjoerd Simons }; 22310125bcf0SSjoerd Simons 22326f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 223318ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 223418ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 223518ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 223618ae91c8SDavid Wu }; 223718ae91c8SDavid Wu 2238ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 2239ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 2240ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 2241ff86648dSDavid Wu }; 2242ff86648dSDavid Wu 2243af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 2244af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 2245491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 2246af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 2247491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 2248af166ffaSDavid Wu }; 2249af166ffaSDavid Wu 22501f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 22511f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 22521f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 22531f08aa1cSPhilipp Tomsich }; 22541f08aa1cSPhilipp Tomsich 225523adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 225623adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 225723adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 225823adb58fSDavid Wu }; 225923adb58fSDavid Wu 2260c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 2261c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 2262491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 2263c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 2264491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 2265c36b26c0SDavid Wu }; 2266c36b26c0SDavid Wu 2267793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 2268793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 2269793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 2270793f2fd2SPhilipp Tomsich }; 2271793f2fd2SPhilipp Tomsich 22721f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 22731f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 22741f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 22751f08aa1cSPhilipp Tomsich }; 22761f08aa1cSPhilipp Tomsich 22770a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 22780a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 22790a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 22800a33ce65SDavid Wu }; 2281dcfb333aSDavid Wu #else 2282*bcf26c57SDavid Wu const struct rk_gmac_ops rk3506_gmac_ops = { 2283*bcf26c57SDavid Wu .fix_mac_speed = rk3506_set_rmii_speed, 2284*bcf26c57SDavid Wu .set_to_rmii = rk3506_set_to_rmii, 2285*bcf26c57SDavid Wu .set_clock_selection = rk3506_set_clock_selection, 2286*bcf26c57SDavid Wu }; 2287*bcf26c57SDavid Wu 2288c563400aSDavid Wu const struct rk_gmac_ops rk3528_gmac_ops = { 2289c563400aSDavid Wu .fix_mac_speed = rk3528_set_rgmii_speed, 2290c563400aSDavid Wu .set_to_rgmii = rk3528_set_to_rgmii, 2291c563400aSDavid Wu .set_to_rmii = rk3528_set_to_rmii, 2292c563400aSDavid Wu .set_clock_selection = rk3528_set_clock_selection, 2293c563400aSDavid Wu .integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup, 2294c563400aSDavid Wu }; 2295c563400aSDavid Wu 229683f30531SDavid Wu const struct rk_gmac_ops rk3562_gmac_ops = { 229783f30531SDavid Wu .fix_mac_speed = rk3562_set_gmac_speed, 229883f30531SDavid Wu .set_to_rgmii = rk3562_set_to_rgmii, 229983f30531SDavid Wu .set_to_rmii = rk3562_set_to_rmii, 230083f30531SDavid Wu .set_clock_selection = rk3562_set_clock_selection, 230183f30531SDavid Wu }; 230283f30531SDavid Wu 230333a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 230433a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 230533a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 230633a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 230733a014bdSDavid Wu }; 230833a014bdSDavid Wu 2309bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = { 2310bf0e94d0SDavid Wu .fix_mac_speed = rk3588_set_rgmii_speed, 2311bf0e94d0SDavid Wu .set_to_rgmii = rk3588_set_to_rgmii, 2312bf0e94d0SDavid Wu .set_to_rmii = rk3588_set_to_rmii, 2313bf0e94d0SDavid Wu .set_clock_selection = rk3588_set_clock_selection, 2314bf0e94d0SDavid Wu }; 2315bf0e94d0SDavid Wu 2316745dad46SDavid Wu const struct rk_gmac_ops rv1103b_gmac_ops = { 2317745dad46SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 2318745dad46SDavid Wu .set_to_rmii = rv1103b_set_to_rmii, 2319745dad46SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 2320745dad46SDavid Wu }; 2321745dad46SDavid Wu 232220bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = { 232320bef841SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 23248bafa3a1SDavid Wu .set_to_rmii = rv1106_set_to_rmii, 232520bef841SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 232620bef841SDavid Wu }; 232720bef841SDavid Wu 2328dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 2329dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 2330dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 2331e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 2332dcfb333aSDavid Wu }; 23336f0a52e9SDavid Wu #endif 23340a33ce65SDavid Wu 23350125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 23366f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 233784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30 233818ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 233918ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 234084e90485SDavid Wu #endif 234184e90485SDavid Wu 234284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808 2343ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 2344ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 234584e90485SDavid Wu #endif 234684e90485SDavid Wu 234784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228 2348af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 2349af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 235084e90485SDavid Wu #endif 235184e90485SDavid Wu 235284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288 23531f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 23541f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 235584e90485SDavid Wu #endif 235684e90485SDavid Wu 235784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308 235823adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 235923adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 236084e90485SDavid Wu #endif 236184e90485SDavid Wu 236284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328 2363c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 2364c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 236584e90485SDavid Wu #endif 236684e90485SDavid Wu 236784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368 2368793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 2369793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 237084e90485SDavid Wu #endif 237184e90485SDavid Wu 237284e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399 23731f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 23741f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 237584e90485SDavid Wu #endif 237684e90485SDavid Wu 237784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108 23780a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 23790a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 238084e90485SDavid Wu #endif 2381dcfb333aSDavid Wu #else 2382*bcf26c57SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3506 2383*bcf26c57SDavid Wu { .compatible = "rockchip,rk3506-gmac", 2384*bcf26c57SDavid Wu .data = (ulong)&rk3506_gmac_ops }, 2385*bcf26c57SDavid Wu #endif 2386*bcf26c57SDavid Wu 2387c563400aSDavid Wu #ifdef CONFIG_ROCKCHIP_RK3528 2388c563400aSDavid Wu { .compatible = "rockchip,rk3528-gmac", 2389c563400aSDavid Wu .data = (ulong)&rk3528_gmac_ops }, 2390c563400aSDavid Wu #endif 2391c563400aSDavid Wu 239283f30531SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3562 239383f30531SDavid Wu { .compatible = "rockchip,rk3562-gmac", 239483f30531SDavid Wu .data = (ulong)&rk3562_gmac_ops }, 239583f30531SDavid Wu #endif 239683f30531SDavid Wu 239784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568 239833a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 239933a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 240084e90485SDavid Wu #endif 240184e90485SDavid Wu 2402bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588 2403bf0e94d0SDavid Wu { .compatible = "rockchip,rk3588-gmac", 2404bf0e94d0SDavid Wu .data = (ulong)&rk3588_gmac_ops }, 2405bf0e94d0SDavid Wu #endif 2406bf0e94d0SDavid Wu 2407745dad46SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1103B 2408745dad46SDavid Wu { .compatible = "rockchip,rv1103b-gmac", 2409745dad46SDavid Wu .data = (ulong)&rv1103b_gmac_ops }, 2410745dad46SDavid Wu #endif 2411745dad46SDavid Wu 241220bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106 241320bef841SDavid Wu { .compatible = "rockchip,rv1106-gmac", 241420bef841SDavid Wu .data = (ulong)&rv1106_gmac_ops }, 241520bef841SDavid Wu #endif 241620bef841SDavid Wu 241784e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126 2418dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 2419dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 24206f0a52e9SDavid Wu #endif 242184e90485SDavid Wu #endif 24220125bcf0SSjoerd Simons { } 24230125bcf0SSjoerd Simons }; 24240125bcf0SSjoerd Simons 24250125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 24260125bcf0SSjoerd Simons .name = "gmac_rockchip", 24270125bcf0SSjoerd Simons .id = UCLASS_ETH, 24280125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 24290125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 24300125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 24310125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 24326f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 24330125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 24340125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 24350125bcf0SSjoerd Simons }; 2436