10125bcf0SSjoerd Simons /* 20125bcf0SSjoerd Simons * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk> 30125bcf0SSjoerd Simons * 40125bcf0SSjoerd Simons * SPDX-License-Identifier: GPL-2.0+ 50125bcf0SSjoerd Simons * 60125bcf0SSjoerd Simons * Rockchip GMAC ethernet IP driver for U-Boot 70125bcf0SSjoerd Simons */ 80125bcf0SSjoerd Simons 90125bcf0SSjoerd Simons #include <common.h> 100125bcf0SSjoerd Simons #include <dm.h> 110125bcf0SSjoerd Simons #include <clk.h> 120125bcf0SSjoerd Simons #include <phy.h> 13*491f3bfbSDavid Wu #include <reset.h> 140125bcf0SSjoerd Simons #include <syscon.h> 150125bcf0SSjoerd Simons #include <asm/io.h> 160125bcf0SSjoerd Simons #include <asm/arch/periph.h> 170125bcf0SSjoerd Simons #include <asm/arch/clock.h> 181f08aa1cSPhilipp Tomsich #include <asm/arch/hardware.h> 196f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 2033a014bdSDavid Wu #include <asm/arch/grf_rk3568.h> 21dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 226f0a52e9SDavid Wu #include "dwc_eth_qos.h" 236f0a52e9SDavid Wu #else 2418ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 25ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 26af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 270125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 2823adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 29c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 30793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 311f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 320a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 330125bcf0SSjoerd Simons #include "designware.h" 346f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 356f0a52e9SDavid Wu #endif 366f0a52e9SDavid Wu #include <dm/pinctrl.h> 37*491f3bfbSDavid Wu #include <dm/of_access.h> 380125bcf0SSjoerd Simons 390125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 400125bcf0SSjoerd Simons 416f0a52e9SDavid Wu struct rockchip_eth_dev { 426f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 436f0a52e9SDavid Wu struct eqos_priv eqos; 446f0a52e9SDavid Wu #else 456f0a52e9SDavid Wu struct dw_eth_dev dw; 466f0a52e9SDavid Wu #endif 47*491f3bfbSDavid Wu int phy_interface; 486f0a52e9SDavid Wu }; 496f0a52e9SDavid Wu 500125bcf0SSjoerd Simons /* 510125bcf0SSjoerd Simons * Platform data for the gmac 520125bcf0SSjoerd Simons * 530125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 540125bcf0SSjoerd Simons */ 550125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 566f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 570125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 586f0a52e9SDavid Wu #else 596f0a52e9SDavid Wu struct eth_pdata eth_pdata; 606f0a52e9SDavid Wu #endif 61*491f3bfbSDavid Wu struct reset_ctl phy_reset; 62*491f3bfbSDavid Wu bool integrated_phy; 630a33ce65SDavid Wu bool clock_input; 64*491f3bfbSDavid Wu int phy_interface; 650125bcf0SSjoerd Simons int tx_delay; 660125bcf0SSjoerd Simons int rx_delay; 6733a014bdSDavid Wu int bus_id; 680125bcf0SSjoerd Simons }; 690125bcf0SSjoerd Simons 701f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 716f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 726f0a52e9SDavid Wu const struct eqos_config config; 736f0a52e9SDavid Wu #endif 74*491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 75*491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 760a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 771f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 78*491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 791f08aa1cSPhilipp Tomsich }; 801f08aa1cSPhilipp Tomsich 81befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 82befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 83befcb627SDavid Wu .reg_access_always_ok = false, 84befcb627SDavid Wu .mdio_wait = 10000, 85befcb627SDavid Wu .swr_wait = 200, 86befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 87befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 88befcb627SDavid Wu .ops = &eqos_rockchip_ops, 89befcb627SDavid Wu }; 90befcb627SDavid Wu #endif 91befcb627SDavid Wu 921eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 931eb9d064SDavid Wu { 941eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 951eb9d064SDavid Wu struct rk_gmac_ops *ops = 961eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 971eb9d064SDavid Wu 981eb9d064SDavid Wu pdata->tx_delay = tx_delay; 991eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1001eb9d064SDavid Wu 1011eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1021eb9d064SDavid Wu } 1031f08aa1cSPhilipp Tomsich 1040125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1050125bcf0SSjoerd Simons { 1060125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 107*491f3bfbSDavid Wu struct ofnode_phandle_args args; 1080a33ce65SDavid Wu const char *string; 109*491f3bfbSDavid Wu int ret; 1100a33ce65SDavid Wu 1110a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1120a33ce65SDavid Wu if (!strcmp(string, "input")) 1130a33ce65SDavid Wu pdata->clock_input = true; 1140a33ce65SDavid Wu else 1150a33ce65SDavid Wu pdata->clock_input = false; 1160125bcf0SSjoerd Simons 117*491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 118*491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 119*491f3bfbSDavid Wu if (ret) { 120*491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 121*491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 122*491f3bfbSDavid Wu } else { 123*491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 124*491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 125*491f3bfbSDavid Wu "phy-is-integrated"); 126*491f3bfbSDavid Wu } 127*491f3bfbSDavid Wu 128*491f3bfbSDavid Wu if (pdata->integrated_phy) { 129*491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 130*491f3bfbSDavid Wu if (ret) { 131*491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 132*491f3bfbSDavid Wu return ret; 133*491f3bfbSDavid Wu } 134*491f3bfbSDavid Wu } 135*491f3bfbSDavid Wu 1361f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1377ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1387ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1391f08aa1cSPhilipp Tomsich 1401f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1411f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1427ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1431f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1447ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1450125bcf0SSjoerd Simons 1466f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1476f0a52e9SDavid Wu return 0; 1486f0a52e9SDavid Wu #else 1490125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1506f0a52e9SDavid Wu #endif 1510125bcf0SSjoerd Simons } 1520125bcf0SSjoerd Simons 1536f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 154*491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 155*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 15618ae91c8SDavid Wu { 1576f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 15818ae91c8SDavid Wu struct px30_grf *grf; 15918ae91c8SDavid Wu struct clk clk_speed; 16018ae91c8SDavid Wu int speed, ret; 16118ae91c8SDavid Wu enum { 16218ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 16318ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 16418ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 16518ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 16618ae91c8SDavid Wu }; 16718ae91c8SDavid Wu 16818ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 16918ae91c8SDavid Wu &clk_speed); 17018ae91c8SDavid Wu if (ret) 17118ae91c8SDavid Wu return ret; 17218ae91c8SDavid Wu 17318ae91c8SDavid Wu switch (priv->phydev->speed) { 17418ae91c8SDavid Wu case 10: 17518ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 17618ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 17718ae91c8SDavid Wu if (ret) 17818ae91c8SDavid Wu return ret; 17918ae91c8SDavid Wu break; 18018ae91c8SDavid Wu case 100: 18118ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 18218ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 18318ae91c8SDavid Wu if (ret) 18418ae91c8SDavid Wu return ret; 18518ae91c8SDavid Wu break; 18618ae91c8SDavid Wu default: 18718ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 18818ae91c8SDavid Wu return -EINVAL; 18918ae91c8SDavid Wu } 19018ae91c8SDavid Wu 19118ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 19218ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 19318ae91c8SDavid Wu 19418ae91c8SDavid Wu return 0; 19518ae91c8SDavid Wu } 19618ae91c8SDavid Wu 197*491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 198*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 199ff86648dSDavid Wu { 2006f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 201ff86648dSDavid Wu struct clk clk_speed; 202ff86648dSDavid Wu int ret; 203ff86648dSDavid Wu 204ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 205ff86648dSDavid Wu &clk_speed); 206ff86648dSDavid Wu if (ret) 207ff86648dSDavid Wu return ret; 208ff86648dSDavid Wu 209ff86648dSDavid Wu switch (priv->phydev->speed) { 210ff86648dSDavid Wu case 10: 211ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 212ff86648dSDavid Wu if (ret) 213ff86648dSDavid Wu return ret; 214ff86648dSDavid Wu break; 215ff86648dSDavid Wu case 100: 216ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 217ff86648dSDavid Wu if (ret) 218ff86648dSDavid Wu return ret; 219ff86648dSDavid Wu break; 220ff86648dSDavid Wu case 1000: 221ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 222ff86648dSDavid Wu if (ret) 223ff86648dSDavid Wu return ret; 224ff86648dSDavid Wu break; 225ff86648dSDavid Wu default: 226ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 227ff86648dSDavid Wu return -EINVAL; 228ff86648dSDavid Wu } 229ff86648dSDavid Wu 230ff86648dSDavid Wu return 0; 231ff86648dSDavid Wu } 232ff86648dSDavid Wu 233*491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 234*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 235af166ffaSDavid Wu { 2366f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 237af166ffaSDavid Wu struct rk322x_grf *grf; 238af166ffaSDavid Wu int clk; 239af166ffaSDavid Wu enum { 240af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 241af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 242af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 243af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 244af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 245*491f3bfbSDavid Wu 246*491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 247*491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 248*491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 249*491f3bfbSDavid Wu 250*491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 251*491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 252*491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 253af166ffaSDavid Wu }; 254af166ffaSDavid Wu 255af166ffaSDavid Wu switch (priv->phydev->speed) { 256af166ffaSDavid Wu case 10: 257*491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 258*491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 259*491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 260af166ffaSDavid Wu break; 261af166ffaSDavid Wu case 100: 262*491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 263*491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 264*491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 265af166ffaSDavid Wu break; 266af166ffaSDavid Wu case 1000: 267af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 268af166ffaSDavid Wu break; 269af166ffaSDavid Wu default: 270af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 271af166ffaSDavid Wu return -EINVAL; 272af166ffaSDavid Wu } 273af166ffaSDavid Wu 274af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 275*491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 276*491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 277*491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 278*491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 279*491f3bfbSDavid Wu clk); 280af166ffaSDavid Wu 281af166ffaSDavid Wu return 0; 282af166ffaSDavid Wu } 283af166ffaSDavid Wu 284*491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 285*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 2860125bcf0SSjoerd Simons { 2876f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 2880125bcf0SSjoerd Simons struct rk3288_grf *grf; 2890125bcf0SSjoerd Simons int clk; 2900125bcf0SSjoerd Simons 2910125bcf0SSjoerd Simons switch (priv->phydev->speed) { 2920125bcf0SSjoerd Simons case 10: 2931f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 2940125bcf0SSjoerd Simons break; 2950125bcf0SSjoerd Simons case 100: 2961f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 2970125bcf0SSjoerd Simons break; 2980125bcf0SSjoerd Simons case 1000: 2991f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3000125bcf0SSjoerd Simons break; 3010125bcf0SSjoerd Simons default: 3020125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3030125bcf0SSjoerd Simons return -EINVAL; 3040125bcf0SSjoerd Simons } 3050125bcf0SSjoerd Simons 3060125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3071f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3080125bcf0SSjoerd Simons 3090125bcf0SSjoerd Simons return 0; 3100125bcf0SSjoerd Simons } 3110125bcf0SSjoerd Simons 312*491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 313*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 31423adb58fSDavid Wu { 3156f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 31623adb58fSDavid Wu struct rk3308_grf *grf; 31723adb58fSDavid Wu struct clk clk_speed; 31823adb58fSDavid Wu int speed, ret; 31923adb58fSDavid Wu enum { 32023adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 32123adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 32223adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 32323adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 32423adb58fSDavid Wu }; 32523adb58fSDavid Wu 32623adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 32723adb58fSDavid Wu &clk_speed); 32823adb58fSDavid Wu if (ret) 32923adb58fSDavid Wu return ret; 33023adb58fSDavid Wu 33123adb58fSDavid Wu switch (priv->phydev->speed) { 33223adb58fSDavid Wu case 10: 33323adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 33423adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 33523adb58fSDavid Wu if (ret) 33623adb58fSDavid Wu return ret; 33723adb58fSDavid Wu break; 33823adb58fSDavid Wu case 100: 33923adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 34023adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 34123adb58fSDavid Wu if (ret) 34223adb58fSDavid Wu return ret; 34323adb58fSDavid Wu break; 34423adb58fSDavid Wu default: 34523adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 34623adb58fSDavid Wu return -EINVAL; 34723adb58fSDavid Wu } 34823adb58fSDavid Wu 34923adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 35023adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 35123adb58fSDavid Wu 35223adb58fSDavid Wu return 0; 35323adb58fSDavid Wu } 35423adb58fSDavid Wu 355*491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 356*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 357c36b26c0SDavid Wu { 3586f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 359c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 360c36b26c0SDavid Wu int clk; 361c36b26c0SDavid Wu enum { 362c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 363c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 364c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 365c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 366c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 367*491f3bfbSDavid Wu 368*491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 369*491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 370*491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 371*491f3bfbSDavid Wu 372*491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 373*491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 374*491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 375c36b26c0SDavid Wu }; 376c36b26c0SDavid Wu 377c36b26c0SDavid Wu switch (priv->phydev->speed) { 378c36b26c0SDavid Wu case 10: 379*491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 380*491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 381*491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 382c36b26c0SDavid Wu break; 383c36b26c0SDavid Wu case 100: 384*491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 385*491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 386*491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 387c36b26c0SDavid Wu break; 388c36b26c0SDavid Wu case 1000: 389c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 390c36b26c0SDavid Wu break; 391c36b26c0SDavid Wu default: 392c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 393c36b26c0SDavid Wu return -EINVAL; 394c36b26c0SDavid Wu } 395c36b26c0SDavid Wu 396c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 397*491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 398*491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 399*491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 400*491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 401*491f3bfbSDavid Wu clk); 402c36b26c0SDavid Wu 403c36b26c0SDavid Wu return 0; 404c36b26c0SDavid Wu } 405c36b26c0SDavid Wu 406*491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 407*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 408793f2fd2SPhilipp Tomsich { 4096f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 410793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 411793f2fd2SPhilipp Tomsich int clk; 412793f2fd2SPhilipp Tomsich enum { 413793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 414793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 415793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 416793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 417793f2fd2SPhilipp Tomsich }; 418793f2fd2SPhilipp Tomsich 419793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 420793f2fd2SPhilipp Tomsich case 10: 421793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 422793f2fd2SPhilipp Tomsich break; 423793f2fd2SPhilipp Tomsich case 100: 424793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 425793f2fd2SPhilipp Tomsich break; 426793f2fd2SPhilipp Tomsich case 1000: 427793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 428793f2fd2SPhilipp Tomsich break; 429793f2fd2SPhilipp Tomsich default: 430793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 431793f2fd2SPhilipp Tomsich return -EINVAL; 432793f2fd2SPhilipp Tomsich } 433793f2fd2SPhilipp Tomsich 434793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 435793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 436793f2fd2SPhilipp Tomsich 437793f2fd2SPhilipp Tomsich return 0; 438793f2fd2SPhilipp Tomsich } 439793f2fd2SPhilipp Tomsich 440*491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 441*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4421f08aa1cSPhilipp Tomsich { 4436f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4441f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4451f08aa1cSPhilipp Tomsich int clk; 4461f08aa1cSPhilipp Tomsich 4471f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4481f08aa1cSPhilipp Tomsich case 10: 4491f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4501f08aa1cSPhilipp Tomsich break; 4511f08aa1cSPhilipp Tomsich case 100: 4521f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4531f08aa1cSPhilipp Tomsich break; 4541f08aa1cSPhilipp Tomsich case 1000: 4551f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4561f08aa1cSPhilipp Tomsich break; 4571f08aa1cSPhilipp Tomsich default: 4581f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4591f08aa1cSPhilipp Tomsich return -EINVAL; 4601f08aa1cSPhilipp Tomsich } 4611f08aa1cSPhilipp Tomsich 4621f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4631f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4641f08aa1cSPhilipp Tomsich 4651f08aa1cSPhilipp Tomsich return 0; 4661f08aa1cSPhilipp Tomsich } 4671f08aa1cSPhilipp Tomsich 468*491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 469*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4700a33ce65SDavid Wu { 4716f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4720a33ce65SDavid Wu struct rv1108_grf *grf; 4730a33ce65SDavid Wu int clk, speed; 4740a33ce65SDavid Wu enum { 4750a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4760a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4770a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4780a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4790a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4800a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4810a33ce65SDavid Wu }; 4820a33ce65SDavid Wu 4830a33ce65SDavid Wu switch (priv->phydev->speed) { 4840a33ce65SDavid Wu case 10: 4850a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 4860a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 4870a33ce65SDavid Wu break; 4880a33ce65SDavid Wu case 100: 4890a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 4900a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 4910a33ce65SDavid Wu break; 4920a33ce65SDavid Wu default: 4930a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 4940a33ce65SDavid Wu return -EINVAL; 4950a33ce65SDavid Wu } 4960a33ce65SDavid Wu 4970a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4980a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 4990a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5000a33ce65SDavid Wu clk | speed); 5010a33ce65SDavid Wu 5020a33ce65SDavid Wu return 0; 5030a33ce65SDavid Wu } 504dcfb333aSDavid Wu #else 505*491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 506*491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 507dcfb333aSDavid Wu { 508dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 509dcfb333aSDavid Wu struct clk clk_speed; 510dcfb333aSDavid Wu int ret; 511dcfb333aSDavid Wu 512dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 513dcfb333aSDavid Wu &clk_speed); 514dcfb333aSDavid Wu if (ret) { 51533a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 51633a014bdSDavid Wu __func__, ret); 517dcfb333aSDavid Wu return ret; 518dcfb333aSDavid Wu } 519dcfb333aSDavid Wu 520dcfb333aSDavid Wu switch ( priv->phy->speed) { 521dcfb333aSDavid Wu case 10: 522dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 523dcfb333aSDavid Wu if (ret) 524dcfb333aSDavid Wu return ret; 525dcfb333aSDavid Wu break; 526dcfb333aSDavid Wu case 100: 527dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 528dcfb333aSDavid Wu if (ret) 529dcfb333aSDavid Wu return ret; 530dcfb333aSDavid Wu break; 531dcfb333aSDavid Wu case 1000: 532dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 533dcfb333aSDavid Wu if (ret) 534dcfb333aSDavid Wu return ret; 535dcfb333aSDavid Wu break; 536dcfb333aSDavid Wu default: 537dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 538dcfb333aSDavid Wu return -EINVAL; 539dcfb333aSDavid Wu } 540dcfb333aSDavid Wu 541dcfb333aSDavid Wu return 0; 542dcfb333aSDavid Wu } 5436f0a52e9SDavid Wu #endif 5440a33ce65SDavid Wu 5456f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 54618ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 54718ae91c8SDavid Wu { 54818ae91c8SDavid Wu struct px30_grf *grf; 54918ae91c8SDavid Wu enum { 55018ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 55118ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 55218ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 55318ae91c8SDavid Wu }; 55418ae91c8SDavid Wu 55518ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 55618ae91c8SDavid Wu 55718ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 55818ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 55918ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 56018ae91c8SDavid Wu } 56118ae91c8SDavid Wu 562ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 563ff86648dSDavid Wu { 564ff86648dSDavid Wu struct rk1808_grf *grf; 565ff86648dSDavid Wu enum { 566ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 567ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 568ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 569ff86648dSDavid Wu 570ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 571ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 572ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 573ff86648dSDavid Wu 574ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 575ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 576ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 577ff86648dSDavid Wu }; 578ff86648dSDavid Wu enum { 579ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 580ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 581ff86648dSDavid Wu 582ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 583ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 584ff86648dSDavid Wu }; 585ff86648dSDavid Wu 586ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 587ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 588ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 589ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 590ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 591ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 592ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 593ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 594ff86648dSDavid Wu 595ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 596ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 597ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 598ff86648dSDavid Wu pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT | 599ff86648dSDavid Wu pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT); 600ff86648dSDavid Wu } 601ff86648dSDavid Wu 602af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 603af166ffaSDavid Wu { 604af166ffaSDavid Wu struct rk322x_grf *grf; 605af166ffaSDavid Wu enum { 606af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 607af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 608af166ffaSDavid Wu 609af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 610af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 611af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 612af166ffaSDavid Wu 613af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 614af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 615af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 616af166ffaSDavid Wu 617af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 618af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 619af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 620af166ffaSDavid Wu }; 621af166ffaSDavid Wu enum { 622af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 623af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 624af166ffaSDavid Wu 625af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 626af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 627af166ffaSDavid Wu }; 628af166ffaSDavid Wu 629af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 630af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 631af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 632af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 633af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 634af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 635af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 636af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 637af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 638af166ffaSDavid Wu 639af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 640af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 641af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 642af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 643af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 644af166ffaSDavid Wu } 645af166ffaSDavid Wu 646*491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 647*491f3bfbSDavid Wu { 648*491f3bfbSDavid Wu struct rk322x_grf *grf; 649*491f3bfbSDavid Wu enum { 650*491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 651*491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 652*491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 653*491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 654*491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 655*491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 656*491f3bfbSDavid Wu }; 657*491f3bfbSDavid Wu 658*491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 659*491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 660*491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 661*491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 662*491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 663*491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 664*491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 665*491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 666*491f3bfbSDavid Wu } 667*491f3bfbSDavid Wu 6681f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 6691f08aa1cSPhilipp Tomsich { 6701f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 6711f08aa1cSPhilipp Tomsich 6721f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 6731f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 6741f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 6751f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 6761f08aa1cSPhilipp Tomsich 6771f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 6781f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 6791f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 6801f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 6811f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 6821f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 6831f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 6841f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 6851f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 6861f08aa1cSPhilipp Tomsich } 6871f08aa1cSPhilipp Tomsich 68823adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 68923adb58fSDavid Wu { 69023adb58fSDavid Wu struct rk3308_grf *grf; 69123adb58fSDavid Wu enum { 69223adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 69323adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 69423adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 69523adb58fSDavid Wu }; 69623adb58fSDavid Wu 69723adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 69823adb58fSDavid Wu 69923adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 70023adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 70123adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 70223adb58fSDavid Wu } 70323adb58fSDavid Wu 704c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 705c36b26c0SDavid Wu { 706c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 707c36b26c0SDavid Wu enum { 708c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 709c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 710c36b26c0SDavid Wu 711c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 712c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 713c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 714c36b26c0SDavid Wu 715c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 716c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 717c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 718c36b26c0SDavid Wu 719c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 720c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 721c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 722c36b26c0SDavid Wu }; 723c36b26c0SDavid Wu enum { 724c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 725c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 726c36b26c0SDavid Wu 727c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 728c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 729c36b26c0SDavid Wu }; 730c36b26c0SDavid Wu 731c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 732c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 733c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 734c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 735c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 736c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 737c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 738c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 739c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 740c36b26c0SDavid Wu 741c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 742c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 743c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 744c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 745c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 746c36b26c0SDavid Wu } 747c36b26c0SDavid Wu 748*491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 749*491f3bfbSDavid Wu { 750*491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 751*491f3bfbSDavid Wu enum { 752*491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 753*491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 754*491f3bfbSDavid Wu 755*491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 756*491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 757*491f3bfbSDavid Wu }; 758*491f3bfbSDavid Wu 759*491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 760*491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 761*491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 762*491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 763*491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 764*491f3bfbSDavid Wu RK3328_RMII_MODE); 765*491f3bfbSDavid Wu } 766*491f3bfbSDavid Wu 767793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 768793f2fd2SPhilipp Tomsich { 769793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 770793f2fd2SPhilipp Tomsich enum { 771793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 772793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 773793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 774793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 775793f2fd2SPhilipp Tomsich }; 776793f2fd2SPhilipp Tomsich enum { 777793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 778793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 779793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 780793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 781793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 782793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 783793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 784793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 785793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 786793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 787793f2fd2SPhilipp Tomsich }; 788793f2fd2SPhilipp Tomsich 789793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 790793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 791793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 792793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 793793f2fd2SPhilipp Tomsich 794793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 795793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 796793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 797793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 798793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 799793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 800793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 801793f2fd2SPhilipp Tomsich pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT | 802793f2fd2SPhilipp Tomsich pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT); 803793f2fd2SPhilipp Tomsich } 804793f2fd2SPhilipp Tomsich 8051f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 8061f08aa1cSPhilipp Tomsich { 8071f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 8081f08aa1cSPhilipp Tomsich 8091f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 8101f08aa1cSPhilipp Tomsich 8111f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 8121f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 8131f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 8141f08aa1cSPhilipp Tomsich 8151f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 8161f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 8171f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 8181f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 8191f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 8201f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 8211f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 8221f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT | 8231f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT); 8241f08aa1cSPhilipp Tomsich } 8251f08aa1cSPhilipp Tomsich 8260a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 8270a33ce65SDavid Wu { 8280a33ce65SDavid Wu struct rv1108_grf *grf; 8290a33ce65SDavid Wu 8300a33ce65SDavid Wu enum { 8310a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 8320a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 8330a33ce65SDavid Wu }; 8340a33ce65SDavid Wu 8350a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 8360a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 8370a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 8380a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 8390a33ce65SDavid Wu } 840*491f3bfbSDavid Wu 841*491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 842*491f3bfbSDavid Wu { 843*491f3bfbSDavid Wu struct rk322x_grf *grf; 844*491f3bfbSDavid Wu enum { 845*491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 846*491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 847*491f3bfbSDavid Wu }; 848*491f3bfbSDavid Wu enum { 849*491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 850*491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 851*491f3bfbSDavid Wu 852*491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 853*491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 854*491f3bfbSDavid Wu 855*491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 856*491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 857*491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 858*491f3bfbSDavid Wu }; 859*491f3bfbSDavid Wu enum { 860*491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 861*491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 862*491f3bfbSDavid Wu }; 863*491f3bfbSDavid Wu enum { 864*491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 865*491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 866*491f3bfbSDavid Wu }; 867*491f3bfbSDavid Wu 868*491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 869*491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 870*491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 871*491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 872*491f3bfbSDavid Wu 873*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 874*491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 875*491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 876*491f3bfbSDavid Wu 877*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 878*491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 879*491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 880*491f3bfbSDavid Wu 881*491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 882*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 883*491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 884*491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 885*491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 886*491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 887*491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 888*491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 889*491f3bfbSDavid Wu 890*491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 891*491f3bfbSDavid Wu udelay(10); 892*491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 893*491f3bfbSDavid Wu udelay(10); 894*491f3bfbSDavid Wu 895*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 896*491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 897*491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 898*491f3bfbSDavid Wu udelay(30 * 1000); 899*491f3bfbSDavid Wu } 900*491f3bfbSDavid Wu 901*491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 902*491f3bfbSDavid Wu { 903*491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 904*491f3bfbSDavid Wu enum { 905*491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 906*491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 907*491f3bfbSDavid Wu }; 908*491f3bfbSDavid Wu enum { 909*491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 910*491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 911*491f3bfbSDavid Wu 912*491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 913*491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 914*491f3bfbSDavid Wu 915*491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 916*491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 917*491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 918*491f3bfbSDavid Wu }; 919*491f3bfbSDavid Wu enum { 920*491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 921*491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 922*491f3bfbSDavid Wu }; 923*491f3bfbSDavid Wu enum { 924*491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 925*491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 926*491f3bfbSDavid Wu }; 927*491f3bfbSDavid Wu 928*491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 929*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 930*491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 931*491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 932*491f3bfbSDavid Wu 933*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 934*491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 935*491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 936*491f3bfbSDavid Wu 937*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 938*491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 939*491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 940*491f3bfbSDavid Wu 941*491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 942*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 943*491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 944*491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 945*491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 946*491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 947*491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 948*491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 949*491f3bfbSDavid Wu 950*491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 951*491f3bfbSDavid Wu udelay(10); 952*491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 953*491f3bfbSDavid Wu udelay(10); 954*491f3bfbSDavid Wu 955*491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 956*491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 957*491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 958*491f3bfbSDavid Wu udelay(30 * 1000); 959*491f3bfbSDavid Wu } 960*491f3bfbSDavid Wu 961dcfb333aSDavid Wu #else 96233a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 96333a014bdSDavid Wu { 96433a014bdSDavid Wu struct rk3568_grf *grf; 96533a014bdSDavid Wu void *con1; 96633a014bdSDavid Wu 96733a014bdSDavid Wu enum { 96833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 96933a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 97033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 97133a014bdSDavid Wu }; 97233a014bdSDavid Wu 97333a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 97433a014bdSDavid Wu 97533a014bdSDavid Wu if (pdata->bus_id == 1) 97633a014bdSDavid Wu con1 = &grf->mac1_con1; 97733a014bdSDavid Wu else 97833a014bdSDavid Wu con1 = &grf->mac0_con1; 97933a014bdSDavid Wu 98033a014bdSDavid Wu rk_clrsetreg(con1, 98133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 98233a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 98333a014bdSDavid Wu } 98433a014bdSDavid Wu 98533a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 98633a014bdSDavid Wu { 98733a014bdSDavid Wu struct rk3568_grf *grf; 98833a014bdSDavid Wu void *con0, *con1; 98933a014bdSDavid Wu 99033a014bdSDavid Wu enum { 99133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 99233a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 99333a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 99433a014bdSDavid Wu 99533a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 99633a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 99733a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 99833a014bdSDavid Wu 99933a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 100033a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 100133a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 100233a014bdSDavid Wu }; 100333a014bdSDavid Wu 100433a014bdSDavid Wu enum { 100533a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 100633a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 100733a014bdSDavid Wu 100833a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 100933a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 101033a014bdSDavid Wu }; 101133a014bdSDavid Wu 101233a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 101333a014bdSDavid Wu 101433a014bdSDavid Wu if (pdata->bus_id == 1) { 101533a014bdSDavid Wu con0 = &grf->mac1_con0; 101633a014bdSDavid Wu con1 = &grf->mac1_con1; 101733a014bdSDavid Wu } else { 101833a014bdSDavid Wu con0 = &grf->mac0_con0; 101933a014bdSDavid Wu con1 = &grf->mac0_con1; 102033a014bdSDavid Wu } 102133a014bdSDavid Wu 102233a014bdSDavid Wu rk_clrsetreg(con0, 102333a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 102433a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 102533a014bdSDavid Wu pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT | 102633a014bdSDavid Wu pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT); 102733a014bdSDavid Wu 102833a014bdSDavid Wu rk_clrsetreg(con1, 102933a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 103033a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 103133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 103233a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 103333a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 103433a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 103533a014bdSDavid Wu } 103633a014bdSDavid Wu 1037e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1038e4e3f431SDavid Wu { 1039e4e3f431SDavid Wu struct rv1126_grf *grf; 1040e4e3f431SDavid Wu 1041e4e3f431SDavid Wu enum { 1042e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1043e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1044e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1045e4e3f431SDavid Wu }; 1046e4e3f431SDavid Wu 1047e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1048e4e3f431SDavid Wu 1049e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1050e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1051e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1052e4e3f431SDavid Wu } 1053e4e3f431SDavid Wu 1054dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1055dcfb333aSDavid Wu { 1056dcfb333aSDavid Wu struct rv1126_grf *grf; 1057dcfb333aSDavid Wu 1058dcfb333aSDavid Wu enum { 1059dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1060dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1061dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1062dcfb333aSDavid Wu 1063dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1064dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1065dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1066dcfb333aSDavid Wu 1067dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1068dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1069dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1070dcfb333aSDavid Wu 1071dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1072dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1073dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1074dcfb333aSDavid Wu 1075dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1076dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1077dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1078dcfb333aSDavid Wu }; 1079dcfb333aSDavid Wu enum { 1080dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1081dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1082dcfb333aSDavid Wu 1083dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1084dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1085dcfb333aSDavid Wu }; 1086dcfb333aSDavid Wu enum { 1087dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1088dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1089dcfb333aSDavid Wu 1090dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1091dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1092dcfb333aSDavid Wu }; 1093dcfb333aSDavid Wu 1094dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1095dcfb333aSDavid Wu 1096dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1097dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1098dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1099dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1100dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1101dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1102dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1103dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1104dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1105dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1106dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1107dcfb333aSDavid Wu 1108dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1109dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1110dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1111dcfb333aSDavid Wu pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT | 1112dcfb333aSDavid Wu pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT); 1113dcfb333aSDavid Wu 1114dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1115dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1116dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1117dcfb333aSDavid Wu pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT | 1118dcfb333aSDavid Wu pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT); 1119dcfb333aSDavid Wu } 11206f0a52e9SDavid Wu #endif 11210a33ce65SDavid Wu 11220125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 11230125bcf0SSjoerd Simons { 11240125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 11251f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 11261f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 11276f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 11286f0a52e9SDavid Wu struct eqos_config *config; 11296f0a52e9SDavid Wu #else 11306f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 11316f0a52e9SDavid Wu #endif 11326f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 11330125bcf0SSjoerd Simons struct clk clk; 11340a33ce65SDavid Wu ulong rate; 11350125bcf0SSjoerd Simons int ret; 11360125bcf0SSjoerd Simons 11376f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 11386f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 11396f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 1140befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 11416f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 11426f0a52e9SDavid Wu #else 11436f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 11446f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 11456f0a52e9SDavid Wu #endif 114633a014bdSDavid Wu pdata->bus_id = dev->seq; 1147cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1148cadc8d74SKever Yang ret = clk_set_defaults(dev); 1149cadc8d74SKever Yang if (ret) 1150cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 1151cadc8d74SKever Yang 11520125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 11530125bcf0SSjoerd Simons if (ret) 11540125bcf0SSjoerd Simons return ret; 11550125bcf0SSjoerd Simons 1156*491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 1157*491f3bfbSDavid Wu 1158*491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 1159*491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 1160*491f3bfbSDavid Wu 11610a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 11620a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 11630a33ce65SDavid Wu /* 11640a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 11650a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 11660a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 11670a33ce65SDavid Wu * is not set, because of it is bypassed. 11680a33ce65SDavid Wu */ 11690a33ce65SDavid Wu if (!pdata->clock_input) { 11700a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 11710a33ce65SDavid Wu if (rate != 125000000) 11720a33ce65SDavid Wu return -EINVAL; 11730a33ce65SDavid Wu } 11740125bcf0SSjoerd Simons 11750125bcf0SSjoerd Simons /* Set to RGMII mode */ 11760a33ce65SDavid Wu if (ops->set_to_rgmii) 11771f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 11780a33ce65SDavid Wu else 11790a33ce65SDavid Wu return -EPERM; 11800a33ce65SDavid Wu 11810a33ce65SDavid Wu break; 11820a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 11830a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 11840a33ce65SDavid Wu if (!pdata->clock_input) { 11850a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 11860a33ce65SDavid Wu if (rate != 50000000) 11870a33ce65SDavid Wu return -EINVAL; 11880a33ce65SDavid Wu } 11890a33ce65SDavid Wu 11900a33ce65SDavid Wu /* Set to RMII mode */ 11910a33ce65SDavid Wu if (ops->set_to_rmii) 11920a33ce65SDavid Wu ops->set_to_rmii(pdata); 11930a33ce65SDavid Wu else 11940a33ce65SDavid Wu return -EPERM; 11950a33ce65SDavid Wu 11960a33ce65SDavid Wu break; 11970a33ce65SDavid Wu default: 11980a33ce65SDavid Wu debug("NO interface defined!\n"); 11990a33ce65SDavid Wu return -ENXIO; 12000a33ce65SDavid Wu } 12010125bcf0SSjoerd Simons 12026f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12036f0a52e9SDavid Wu return eqos_probe(dev); 12046f0a52e9SDavid Wu #else 12050125bcf0SSjoerd Simons return designware_eth_probe(dev); 12066f0a52e9SDavid Wu #endif 12076f0a52e9SDavid Wu } 12086f0a52e9SDavid Wu 12096f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 12106f0a52e9SDavid Wu { 12116f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 12126f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 12136f0a52e9SDavid Wu #else 12146f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 12156f0a52e9SDavid Wu #endif 12166f0a52e9SDavid Wu } 12176f0a52e9SDavid Wu 12186f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 12196f0a52e9SDavid Wu int length) 12206f0a52e9SDavid Wu { 12216f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12226f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 12236f0a52e9SDavid Wu #else 12246f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 12256f0a52e9SDavid Wu #endif 12266f0a52e9SDavid Wu } 12276f0a52e9SDavid Wu 12286f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 12296f0a52e9SDavid Wu int length) 12306f0a52e9SDavid Wu { 12316f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12326f0a52e9SDavid Wu return eqos_send(dev, packet, length); 12336f0a52e9SDavid Wu #else 12346f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 12356f0a52e9SDavid Wu #endif 12366f0a52e9SDavid Wu } 12376f0a52e9SDavid Wu 12386f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 12396f0a52e9SDavid Wu uchar **packetp) 12406f0a52e9SDavid Wu { 12416f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12426f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 12436f0a52e9SDavid Wu #else 12446f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 12456f0a52e9SDavid Wu #endif 12460125bcf0SSjoerd Simons } 12470125bcf0SSjoerd Simons 12480125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 12490125bcf0SSjoerd Simons { 12506f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 12511f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 12521f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 12536f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1254*491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 12556f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 12566f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 12576f0a52e9SDavid Wu #endif 12580125bcf0SSjoerd Simons int ret; 12590125bcf0SSjoerd Simons 12606f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12616f0a52e9SDavid Wu ret = eqos_init(dev); 12626f0a52e9SDavid Wu #else 12636f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 12646f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 12656f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 12666f0a52e9SDavid Wu eth_pdata->enetaddr); 12676f0a52e9SDavid Wu #endif 12680125bcf0SSjoerd Simons if (ret) 12690125bcf0SSjoerd Simons return ret; 1270*491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 12710125bcf0SSjoerd Simons if (ret) 12720125bcf0SSjoerd Simons return ret; 12736f0a52e9SDavid Wu 12746f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12756f0a52e9SDavid Wu eqos_enable(dev); 12766f0a52e9SDavid Wu #else 12776f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 12780125bcf0SSjoerd Simons if (ret) 12790125bcf0SSjoerd Simons return ret; 12806f0a52e9SDavid Wu #endif 12810125bcf0SSjoerd Simons 12820125bcf0SSjoerd Simons return 0; 12830125bcf0SSjoerd Simons } 12840125bcf0SSjoerd Simons 12856f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 12866f0a52e9SDavid Wu { 12876f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 12886f0a52e9SDavid Wu eqos_stop(dev); 12896f0a52e9SDavid Wu #else 12906f0a52e9SDavid Wu designware_eth_stop(dev); 12916f0a52e9SDavid Wu #endif 12926f0a52e9SDavid Wu } 12936f0a52e9SDavid Wu 12940125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 12950125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 12966f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 12976f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 12986f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 12996f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 13006f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 13010125bcf0SSjoerd Simons }; 13020125bcf0SSjoerd Simons 13036f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 130418ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 130518ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 130618ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 130718ae91c8SDavid Wu }; 130818ae91c8SDavid Wu 1309ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 1310ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 1311ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 1312ff86648dSDavid Wu }; 1313ff86648dSDavid Wu 1314af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 1315af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 1316*491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 1317af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1318*491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 1319af166ffaSDavid Wu }; 1320af166ffaSDavid Wu 13211f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 13221f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 13231f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 13241f08aa1cSPhilipp Tomsich }; 13251f08aa1cSPhilipp Tomsich 132623adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 132723adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 132823adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 132923adb58fSDavid Wu }; 133023adb58fSDavid Wu 1331c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 1332c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1333*491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 1334c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1335*491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 1336c36b26c0SDavid Wu }; 1337c36b26c0SDavid Wu 1338793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 1339793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1340793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1341793f2fd2SPhilipp Tomsich }; 1342793f2fd2SPhilipp Tomsich 13431f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 13441f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 13451f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 13461f08aa1cSPhilipp Tomsich }; 13471f08aa1cSPhilipp Tomsich 13480a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 13490a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 13500a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 13510a33ce65SDavid Wu }; 1352dcfb333aSDavid Wu #else 135333a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 135433a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 135533a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 135633a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 135733a014bdSDavid Wu }; 135833a014bdSDavid Wu 1359dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 1360dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 1361dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 1362e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 1363dcfb333aSDavid Wu }; 13646f0a52e9SDavid Wu #endif 13650a33ce65SDavid Wu 13660125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 13676f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 136818ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 136918ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 1370ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 1371ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 1372af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 1373af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 13741f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 13751f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 137623adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 137723adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 1378c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 1379c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 1380793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 1381793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 13821f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 13831f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 13840a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 13850a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 1386dcfb333aSDavid Wu #else 138733a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 138833a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 1389dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 1390dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 13916f0a52e9SDavid Wu #endif 13920125bcf0SSjoerd Simons { } 13930125bcf0SSjoerd Simons }; 13940125bcf0SSjoerd Simons 13950125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 13960125bcf0SSjoerd Simons .name = "gmac_rockchip", 13970125bcf0SSjoerd Simons .id = UCLASS_ETH, 13980125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 13990125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 14000125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 14010125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 14026f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 14030125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 14040125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 14050125bcf0SSjoerd Simons }; 1406