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> 13491f3bfbSDavid 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> 21bf0e94d0SDavid Wu #include <asm/arch/grf_rk3588.h> 2220bef841SDavid Wu #include <asm/arch/grf_rv1106.h> 23dcfb333aSDavid Wu #include <asm/arch/grf_rv1126.h> 246f0a52e9SDavid Wu #include "dwc_eth_qos.h" 256f0a52e9SDavid Wu #else 2618ae91c8SDavid Wu #include <asm/arch/grf_px30.h> 27ff86648dSDavid Wu #include <asm/arch/grf_rk1808.h> 28af166ffaSDavid Wu #include <asm/arch/grf_rk322x.h> 290125bcf0SSjoerd Simons #include <asm/arch/grf_rk3288.h> 3023adb58fSDavid Wu #include <asm/arch/grf_rk3308.h> 31c36b26c0SDavid Wu #include <asm/arch/grf_rk3328.h> 32793f2fd2SPhilipp Tomsich #include <asm/arch/grf_rk3368.h> 331f08aa1cSPhilipp Tomsich #include <asm/arch/grf_rk3399.h> 340a33ce65SDavid Wu #include <asm/arch/grf_rv1108.h> 350125bcf0SSjoerd Simons #include "designware.h" 366f0a52e9SDavid Wu #include <dt-bindings/clock/rk3288-cru.h> 376f0a52e9SDavid Wu #endif 386f0a52e9SDavid Wu #include <dm/pinctrl.h> 39491f3bfbSDavid Wu #include <dm/of_access.h> 400125bcf0SSjoerd Simons 410125bcf0SSjoerd Simons DECLARE_GLOBAL_DATA_PTR; 420125bcf0SSjoerd Simons 436f0a52e9SDavid Wu struct rockchip_eth_dev { 446f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 456f0a52e9SDavid Wu struct eqos_priv eqos; 466f0a52e9SDavid Wu #else 476f0a52e9SDavid Wu struct dw_eth_dev dw; 486f0a52e9SDavid Wu #endif 49491f3bfbSDavid Wu int phy_interface; 506f0a52e9SDavid Wu }; 516f0a52e9SDavid Wu 520125bcf0SSjoerd Simons /* 530125bcf0SSjoerd Simons * Platform data for the gmac 540125bcf0SSjoerd Simons * 550125bcf0SSjoerd Simons * dw_eth_pdata: Required platform data for designware driver (must be first) 560125bcf0SSjoerd Simons */ 570125bcf0SSjoerd Simons struct gmac_rockchip_platdata { 586f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 590125bcf0SSjoerd Simons struct dw_eth_pdata dw_eth_pdata; 606f0a52e9SDavid Wu #else 616f0a52e9SDavid Wu struct eth_pdata eth_pdata; 626f0a52e9SDavid Wu #endif 63491f3bfbSDavid Wu struct reset_ctl phy_reset; 64491f3bfbSDavid Wu bool integrated_phy; 650a33ce65SDavid Wu bool clock_input; 66491f3bfbSDavid Wu int phy_interface; 670125bcf0SSjoerd Simons int tx_delay; 680125bcf0SSjoerd Simons int rx_delay; 6933a014bdSDavid Wu int bus_id; 700125bcf0SSjoerd Simons }; 710125bcf0SSjoerd Simons 721f08aa1cSPhilipp Tomsich struct rk_gmac_ops { 736f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 746f0a52e9SDavid Wu const struct eqos_config config; 756f0a52e9SDavid Wu #endif 76491f3bfbSDavid Wu int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 77491f3bfbSDavid Wu struct rockchip_eth_dev *dev); 780a33ce65SDavid Wu void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 791f08aa1cSPhilipp Tomsich void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 80bf0e94d0SDavid Wu void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 81491f3bfbSDavid Wu void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 821f08aa1cSPhilipp Tomsich }; 831f08aa1cSPhilipp Tomsich 84befcb627SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 85befcb627SDavid Wu static const struct eqos_config eqos_rockchip_config = { 86befcb627SDavid Wu .reg_access_always_ok = false, 87befcb627SDavid Wu .mdio_wait = 10000, 88befcb627SDavid Wu .swr_wait = 200, 89befcb627SDavid Wu .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 90befcb627SDavid Wu .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 91befcb627SDavid Wu .ops = &eqos_rockchip_ops, 92befcb627SDavid Wu }; 93befcb627SDavid Wu #endif 94befcb627SDavid Wu 951eb9d064SDavid Wu void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 961eb9d064SDavid Wu { 971eb9d064SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 981eb9d064SDavid Wu struct rk_gmac_ops *ops = 991eb9d064SDavid Wu (struct rk_gmac_ops *)dev_get_driver_data(dev); 1001eb9d064SDavid Wu 1011eb9d064SDavid Wu pdata->tx_delay = tx_delay; 1021eb9d064SDavid Wu pdata->rx_delay = rx_delay; 1031eb9d064SDavid Wu 1041eb9d064SDavid Wu ops->set_to_rgmii(pdata); 1051eb9d064SDavid Wu } 1061f08aa1cSPhilipp Tomsich 1070125bcf0SSjoerd Simons static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 1080125bcf0SSjoerd Simons { 1090125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 110491f3bfbSDavid Wu struct ofnode_phandle_args args; 11154f7ad44SDavid Wu struct udevice *phydev; 1120a33ce65SDavid Wu const char *string; 113491f3bfbSDavid Wu int ret; 1140a33ce65SDavid Wu 1150a33ce65SDavid Wu string = dev_read_string(dev, "clock_in_out"); 1160a33ce65SDavid Wu if (!strcmp(string, "input")) 1170a33ce65SDavid Wu pdata->clock_input = true; 1180a33ce65SDavid Wu else 1190a33ce65SDavid Wu pdata->clock_input = false; 1200125bcf0SSjoerd Simons 121491f3bfbSDavid Wu /* If phy-handle property is passed from DT, use it as the PHY */ 122491f3bfbSDavid Wu ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 123491f3bfbSDavid Wu if (ret) { 124491f3bfbSDavid Wu debug("Cannot get phy phandle: ret=%d\n", ret); 125491f3bfbSDavid Wu pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 126491f3bfbSDavid Wu } else { 127491f3bfbSDavid Wu debug("Found phy-handle subnode\n"); 128491f3bfbSDavid Wu pdata->integrated_phy = ofnode_read_bool(args.node, 129491f3bfbSDavid Wu "phy-is-integrated"); 130491f3bfbSDavid Wu } 131491f3bfbSDavid Wu 132491f3bfbSDavid Wu if (pdata->integrated_phy) { 133491f3bfbSDavid Wu ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 134491f3bfbSDavid Wu if (ret) { 13554f7ad44SDavid Wu ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 13654f7ad44SDavid Wu if (ret) { 13754f7ad44SDavid Wu debug("Get phydev by ofnode failed: err=%d\n", ret); 13854f7ad44SDavid Wu return ret; 13954f7ad44SDavid Wu } 14054f7ad44SDavid Wu 14154f7ad44SDavid Wu ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 14254f7ad44SDavid Wu if (ret) { 143491f3bfbSDavid Wu debug("No PHY reset control found: ret=%d\n", ret); 144491f3bfbSDavid Wu return ret; 145491f3bfbSDavid Wu } 146491f3bfbSDavid Wu } 14754f7ad44SDavid Wu } 148491f3bfbSDavid Wu 1491f08aa1cSPhilipp Tomsich /* Check the new naming-style first... */ 1507ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 1517ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 1521f08aa1cSPhilipp Tomsich 1531f08aa1cSPhilipp Tomsich /* ... and fall back to the old naming style or default, if necessary */ 1541f08aa1cSPhilipp Tomsich if (pdata->tx_delay == -ENOENT) 1557ad326a9SPhilipp Tomsich pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 1561f08aa1cSPhilipp Tomsich if (pdata->rx_delay == -ENOENT) 1577ad326a9SPhilipp Tomsich pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 1580125bcf0SSjoerd Simons 1596f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1606f0a52e9SDavid Wu return 0; 1616f0a52e9SDavid Wu #else 1620125bcf0SSjoerd Simons return designware_eth_ofdata_to_platdata(dev); 1636f0a52e9SDavid Wu #endif 1640125bcf0SSjoerd Simons } 1650125bcf0SSjoerd Simons 1666f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 167491f3bfbSDavid Wu static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 168491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 16918ae91c8SDavid Wu { 1706f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 17118ae91c8SDavid Wu struct px30_grf *grf; 17218ae91c8SDavid Wu struct clk clk_speed; 17318ae91c8SDavid Wu int speed, ret; 17418ae91c8SDavid Wu enum { 17518ae91c8SDavid Wu PX30_GMAC_SPEED_SHIFT = 0x2, 17618ae91c8SDavid Wu PX30_GMAC_SPEED_MASK = BIT(2), 17718ae91c8SDavid Wu PX30_GMAC_SPEED_10M = 0, 17818ae91c8SDavid Wu PX30_GMAC_SPEED_100M = BIT(2), 17918ae91c8SDavid Wu }; 18018ae91c8SDavid Wu 18118ae91c8SDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 18218ae91c8SDavid Wu &clk_speed); 18318ae91c8SDavid Wu if (ret) 18418ae91c8SDavid Wu return ret; 18518ae91c8SDavid Wu 18618ae91c8SDavid Wu switch (priv->phydev->speed) { 18718ae91c8SDavid Wu case 10: 18818ae91c8SDavid Wu speed = PX30_GMAC_SPEED_10M; 18918ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 19018ae91c8SDavid Wu if (ret) 19118ae91c8SDavid Wu return ret; 19218ae91c8SDavid Wu break; 19318ae91c8SDavid Wu case 100: 19418ae91c8SDavid Wu speed = PX30_GMAC_SPEED_100M; 19518ae91c8SDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 19618ae91c8SDavid Wu if (ret) 19718ae91c8SDavid Wu return ret; 19818ae91c8SDavid Wu break; 19918ae91c8SDavid Wu default: 20018ae91c8SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 20118ae91c8SDavid Wu return -EINVAL; 20218ae91c8SDavid Wu } 20318ae91c8SDavid Wu 20418ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 20518ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 20618ae91c8SDavid Wu 20718ae91c8SDavid Wu return 0; 20818ae91c8SDavid Wu } 20918ae91c8SDavid Wu 210491f3bfbSDavid Wu static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 211491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 212ff86648dSDavid Wu { 2136f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 214ff86648dSDavid Wu struct clk clk_speed; 215ff86648dSDavid Wu int ret; 216ff86648dSDavid Wu 217ff86648dSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 218ff86648dSDavid Wu &clk_speed); 219ff86648dSDavid Wu if (ret) 220ff86648dSDavid Wu return ret; 221ff86648dSDavid Wu 222ff86648dSDavid Wu switch (priv->phydev->speed) { 223ff86648dSDavid Wu case 10: 224ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 225ff86648dSDavid Wu if (ret) 226ff86648dSDavid Wu return ret; 227ff86648dSDavid Wu break; 228ff86648dSDavid Wu case 100: 229ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 230ff86648dSDavid Wu if (ret) 231ff86648dSDavid Wu return ret; 232ff86648dSDavid Wu break; 233ff86648dSDavid Wu case 1000: 234ff86648dSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 235ff86648dSDavid Wu if (ret) 236ff86648dSDavid Wu return ret; 237ff86648dSDavid Wu break; 238ff86648dSDavid Wu default: 239ff86648dSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 240ff86648dSDavid Wu return -EINVAL; 241ff86648dSDavid Wu } 242ff86648dSDavid Wu 243ff86648dSDavid Wu return 0; 244ff86648dSDavid Wu } 245ff86648dSDavid Wu 246491f3bfbSDavid Wu static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 247491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 248af166ffaSDavid Wu { 2496f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 250af166ffaSDavid Wu struct rk322x_grf *grf; 251af166ffaSDavid Wu int clk; 252af166ffaSDavid Wu enum { 253af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_SHIFT = 8, 254af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 255af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_125M = 0 << 8, 256af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_25M = 3 << 8, 257af166ffaSDavid Wu RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 258491f3bfbSDavid Wu 259491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK = BIT(7), 260491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_2_5M = 0, 261491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_25M = BIT(7), 262491f3bfbSDavid Wu 263491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 264491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_10 = 0, 265491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_100 = BIT(2), 266af166ffaSDavid Wu }; 267af166ffaSDavid Wu 268af166ffaSDavid Wu switch (priv->phydev->speed) { 269af166ffaSDavid Wu case 10: 270491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 271491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 272491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_2_5M; 273af166ffaSDavid Wu break; 274af166ffaSDavid Wu case 100: 275491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 276491f3bfbSDavid Wu (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 277491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_25M; 278af166ffaSDavid Wu break; 279af166ffaSDavid Wu case 1000: 280af166ffaSDavid Wu clk = RK3228_GMAC_CLK_SEL_125M; 281af166ffaSDavid Wu break; 282af166ffaSDavid Wu default: 283af166ffaSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 284af166ffaSDavid Wu return -EINVAL; 285af166ffaSDavid Wu } 286af166ffaSDavid Wu 287af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 288491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 289491f3bfbSDavid Wu RK3228_GMAC_CLK_SEL_MASK | 290491f3bfbSDavid Wu RK3228_GMAC_RMII_CLK_MASK | 291491f3bfbSDavid Wu RK3228_GMAC_RMII_SPEED_MASK, 292491f3bfbSDavid Wu clk); 293af166ffaSDavid Wu 294af166ffaSDavid Wu return 0; 295af166ffaSDavid Wu } 296af166ffaSDavid Wu 297491f3bfbSDavid Wu static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 298491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 2990125bcf0SSjoerd Simons { 3006f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 3010125bcf0SSjoerd Simons struct rk3288_grf *grf; 3020125bcf0SSjoerd Simons int clk; 3030125bcf0SSjoerd Simons 3040125bcf0SSjoerd Simons switch (priv->phydev->speed) { 3050125bcf0SSjoerd Simons case 10: 3061f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_2_5M; 3070125bcf0SSjoerd Simons break; 3080125bcf0SSjoerd Simons case 100: 3091f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_25M; 3100125bcf0SSjoerd Simons break; 3110125bcf0SSjoerd Simons case 1000: 3121f08aa1cSPhilipp Tomsich clk = RK3288_GMAC_CLK_SEL_125M; 3130125bcf0SSjoerd Simons break; 3140125bcf0SSjoerd Simons default: 3150125bcf0SSjoerd Simons debug("Unknown phy speed: %d\n", priv->phydev->speed); 3160125bcf0SSjoerd Simons return -EINVAL; 3170125bcf0SSjoerd Simons } 3180125bcf0SSjoerd Simons 3190125bcf0SSjoerd Simons grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 3201f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 3210125bcf0SSjoerd Simons 3220125bcf0SSjoerd Simons return 0; 3230125bcf0SSjoerd Simons } 3240125bcf0SSjoerd Simons 325491f3bfbSDavid Wu static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 326491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 32723adb58fSDavid Wu { 3286f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 32923adb58fSDavid Wu struct rk3308_grf *grf; 33023adb58fSDavid Wu struct clk clk_speed; 33123adb58fSDavid Wu int speed, ret; 33223adb58fSDavid Wu enum { 33323adb58fSDavid Wu RK3308_GMAC_SPEED_SHIFT = 0x0, 33423adb58fSDavid Wu RK3308_GMAC_SPEED_MASK = BIT(0), 33523adb58fSDavid Wu RK3308_GMAC_SPEED_10M = 0, 33623adb58fSDavid Wu RK3308_GMAC_SPEED_100M = BIT(0), 33723adb58fSDavid Wu }; 33823adb58fSDavid Wu 33923adb58fSDavid Wu ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 34023adb58fSDavid Wu &clk_speed); 34123adb58fSDavid Wu if (ret) 34223adb58fSDavid Wu return ret; 34323adb58fSDavid Wu 34423adb58fSDavid Wu switch (priv->phydev->speed) { 34523adb58fSDavid Wu case 10: 34623adb58fSDavid Wu speed = RK3308_GMAC_SPEED_10M; 34723adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 34823adb58fSDavid Wu if (ret) 34923adb58fSDavid Wu return ret; 35023adb58fSDavid Wu break; 35123adb58fSDavid Wu case 100: 35223adb58fSDavid Wu speed = RK3308_GMAC_SPEED_100M; 35323adb58fSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 35423adb58fSDavid Wu if (ret) 35523adb58fSDavid Wu return ret; 35623adb58fSDavid Wu break; 35723adb58fSDavid Wu default: 35823adb58fSDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 35923adb58fSDavid Wu return -EINVAL; 36023adb58fSDavid Wu } 36123adb58fSDavid Wu 36223adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 36323adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 36423adb58fSDavid Wu 36523adb58fSDavid Wu return 0; 36623adb58fSDavid Wu } 36723adb58fSDavid Wu 368491f3bfbSDavid Wu static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 369491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 370c36b26c0SDavid Wu { 3716f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 372c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 373c36b26c0SDavid Wu int clk; 374c36b26c0SDavid Wu enum { 375c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_SHIFT = 11, 376c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 377c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_125M = 0 << 11, 378c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_25M = 3 << 11, 379c36b26c0SDavid Wu RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 380491f3bfbSDavid Wu 381491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK = BIT(7), 382491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_2_5M = 0, 383491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_25M = BIT(7), 384491f3bfbSDavid Wu 385491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 386491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_10 = 0, 387491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_100 = BIT(2), 388c36b26c0SDavid Wu }; 389c36b26c0SDavid Wu 390c36b26c0SDavid Wu switch (priv->phydev->speed) { 391c36b26c0SDavid Wu case 10: 392491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 393491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 394491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_2_5M; 395c36b26c0SDavid Wu break; 396c36b26c0SDavid Wu case 100: 397491f3bfbSDavid Wu clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 398491f3bfbSDavid Wu (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 399491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_25M; 400c36b26c0SDavid Wu break; 401c36b26c0SDavid Wu case 1000: 402c36b26c0SDavid Wu clk = RK3328_GMAC_CLK_SEL_125M; 403c36b26c0SDavid Wu break; 404c36b26c0SDavid Wu default: 405c36b26c0SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 406c36b26c0SDavid Wu return -EINVAL; 407c36b26c0SDavid Wu } 408c36b26c0SDavid Wu 409c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 410491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 411491f3bfbSDavid Wu RK3328_GMAC_CLK_SEL_MASK | 412491f3bfbSDavid Wu RK3328_GMAC_RMII_CLK_MASK | 413491f3bfbSDavid Wu RK3328_GMAC_RMII_SPEED_MASK, 414491f3bfbSDavid Wu clk); 415c36b26c0SDavid Wu 416c36b26c0SDavid Wu return 0; 417c36b26c0SDavid Wu } 418c36b26c0SDavid Wu 419491f3bfbSDavid Wu static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 420491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 421793f2fd2SPhilipp Tomsich { 4226f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 423793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 424793f2fd2SPhilipp Tomsich int clk; 425793f2fd2SPhilipp Tomsich enum { 426793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 427793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_25M = 3 << 4, 428793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_125M = 0 << 4, 429793f2fd2SPhilipp Tomsich RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 430793f2fd2SPhilipp Tomsich }; 431793f2fd2SPhilipp Tomsich 432793f2fd2SPhilipp Tomsich switch (priv->phydev->speed) { 433793f2fd2SPhilipp Tomsich case 10: 434793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_2_5M; 435793f2fd2SPhilipp Tomsich break; 436793f2fd2SPhilipp Tomsich case 100: 437793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_25M; 438793f2fd2SPhilipp Tomsich break; 439793f2fd2SPhilipp Tomsich case 1000: 440793f2fd2SPhilipp Tomsich clk = RK3368_GMAC_CLK_SEL_125M; 441793f2fd2SPhilipp Tomsich break; 442793f2fd2SPhilipp Tomsich default: 443793f2fd2SPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 444793f2fd2SPhilipp Tomsich return -EINVAL; 445793f2fd2SPhilipp Tomsich } 446793f2fd2SPhilipp Tomsich 447793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 448793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 449793f2fd2SPhilipp Tomsich 450793f2fd2SPhilipp Tomsich return 0; 451793f2fd2SPhilipp Tomsich } 452793f2fd2SPhilipp Tomsich 453491f3bfbSDavid Wu static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 454491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4551f08aa1cSPhilipp Tomsich { 4566f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4571f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 4581f08aa1cSPhilipp Tomsich int clk; 4591f08aa1cSPhilipp Tomsich 4601f08aa1cSPhilipp Tomsich switch (priv->phydev->speed) { 4611f08aa1cSPhilipp Tomsich case 10: 4621f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_2_5M; 4631f08aa1cSPhilipp Tomsich break; 4641f08aa1cSPhilipp Tomsich case 100: 4651f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_25M; 4661f08aa1cSPhilipp Tomsich break; 4671f08aa1cSPhilipp Tomsich case 1000: 4681f08aa1cSPhilipp Tomsich clk = RK3399_GMAC_CLK_SEL_125M; 4691f08aa1cSPhilipp Tomsich break; 4701f08aa1cSPhilipp Tomsich default: 4711f08aa1cSPhilipp Tomsich debug("Unknown phy speed: %d\n", priv->phydev->speed); 4721f08aa1cSPhilipp Tomsich return -EINVAL; 4731f08aa1cSPhilipp Tomsich } 4741f08aa1cSPhilipp Tomsich 4751f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 4761f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 4771f08aa1cSPhilipp Tomsich 4781f08aa1cSPhilipp Tomsich return 0; 4791f08aa1cSPhilipp Tomsich } 4801f08aa1cSPhilipp Tomsich 481491f3bfbSDavid Wu static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 482491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 4830a33ce65SDavid Wu { 4846f0a52e9SDavid Wu struct dw_eth_dev *priv = &dev->dw; 4850a33ce65SDavid Wu struct rv1108_grf *grf; 4860a33ce65SDavid Wu int clk, speed; 4870a33ce65SDavid Wu enum { 4880a33ce65SDavid Wu RV1108_GMAC_SPEED_MASK = BIT(2), 4890a33ce65SDavid Wu RV1108_GMAC_SPEED_10M = 0 << 2, 4900a33ce65SDavid Wu RV1108_GMAC_SPEED_100M = 1 << 2, 4910a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK = BIT(7), 4920a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 4930a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_25M = 1 << 7, 4940a33ce65SDavid Wu }; 4950a33ce65SDavid Wu 4960a33ce65SDavid Wu switch (priv->phydev->speed) { 4970a33ce65SDavid Wu case 10: 4980a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_2_5M; 4990a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_10M; 5000a33ce65SDavid Wu break; 5010a33ce65SDavid Wu case 100: 5020a33ce65SDavid Wu clk = RV1108_GMAC_CLK_SEL_25M; 5030a33ce65SDavid Wu speed = RV1108_GMAC_SPEED_100M; 5040a33ce65SDavid Wu break; 5050a33ce65SDavid Wu default: 5060a33ce65SDavid Wu debug("Unknown phy speed: %d\n", priv->phydev->speed); 5070a33ce65SDavid Wu return -EINVAL; 5080a33ce65SDavid Wu } 5090a33ce65SDavid Wu 5100a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 5110a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 5120a33ce65SDavid Wu RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 5130a33ce65SDavid Wu clk | speed); 5140a33ce65SDavid Wu 5150a33ce65SDavid Wu return 0; 5160a33ce65SDavid Wu } 517dcfb333aSDavid Wu #else 518bf0e94d0SDavid Wu static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 519bf0e94d0SDavid Wu struct rockchip_eth_dev *dev) 520bf0e94d0SDavid Wu { 521bf0e94d0SDavid Wu struct eqos_priv *priv = &dev->eqos; 522bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 523bf0e94d0SDavid Wu unsigned int div, div_mask; 524bf0e94d0SDavid Wu 525bf0e94d0SDavid Wu enum { 526bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 527bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 528bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV1 = 0, 529a116113dSDavid Wu RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 530bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 531bf0e94d0SDavid Wu RK3588_GMA_CLK_RMII_DIV2 = BIT(2), 532bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_DIV20 = 0, 533bf0e94d0SDavid Wu }; 534bf0e94d0SDavid Wu 535bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 536bf0e94d0SDavid Wu 537bf0e94d0SDavid Wu switch (priv->phy->speed) { 538bf0e94d0SDavid Wu case 10: 539bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 540bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RMII_DIV20; 541bf0e94d0SDavid Wu else 542bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV50; 543bf0e94d0SDavid Wu break; 544bf0e94d0SDavid Wu case 100: 545bf0e94d0SDavid Wu if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 546bf0e94d0SDavid Wu div = RK3588_GMA_CLK_RMII_DIV2; 547bf0e94d0SDavid Wu else 548bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV5; 549bf0e94d0SDavid Wu break; 550bf0e94d0SDavid Wu case 1000: 551bf0e94d0SDavid Wu if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 552bf0e94d0SDavid Wu div = RK3588_GMAC_CLK_RGMII_DIV1; 553bf0e94d0SDavid Wu else 554bf0e94d0SDavid Wu return -EINVAL; 555bf0e94d0SDavid Wu break; 556bf0e94d0SDavid Wu default: 557bf0e94d0SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 558bf0e94d0SDavid Wu return -EINVAL; 559bf0e94d0SDavid Wu } 560bf0e94d0SDavid Wu 561bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 562bf0e94d0SDavid Wu div <<= 5; 563bf0e94d0SDavid Wu div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 564bf0e94d0SDavid Wu } 565bf0e94d0SDavid Wu 566bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 567bf0e94d0SDavid Wu 568bf0e94d0SDavid Wu return 0; 569bf0e94d0SDavid Wu } 570bf0e94d0SDavid Wu 57120bef841SDavid Wu static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 57220bef841SDavid Wu struct rockchip_eth_dev *dev) 57320bef841SDavid Wu { 57420bef841SDavid Wu struct eqos_priv *priv = &dev->eqos; 57520bef841SDavid Wu struct rv1106_grf *grf; 57620bef841SDavid Wu unsigned int div; 57720bef841SDavid Wu 57820bef841SDavid Wu enum { 57920bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 58020bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 58120bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 58220bef841SDavid Wu RV1106_GMAC_CLK_RMII_DIV20 = 0, 58320bef841SDavid Wu }; 58420bef841SDavid Wu 58520bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 58620bef841SDavid Wu 58720bef841SDavid Wu switch (priv->phy->speed) { 58820bef841SDavid Wu case 10: 58920bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV20; 59020bef841SDavid Wu break; 59120bef841SDavid Wu case 100: 59220bef841SDavid Wu div = RV1106_GMAC_CLK_RMII_DIV2; 59320bef841SDavid Wu break; 59420bef841SDavid Wu default: 59520bef841SDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 59620bef841SDavid Wu return -EINVAL; 59720bef841SDavid Wu } 59820bef841SDavid Wu 59920bef841SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 60020bef841SDavid Wu 60120bef841SDavid Wu return 0; 60220bef841SDavid Wu } 60320bef841SDavid Wu 604491f3bfbSDavid Wu static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 605491f3bfbSDavid Wu struct rockchip_eth_dev *dev) 606dcfb333aSDavid Wu { 607dcfb333aSDavid Wu struct eqos_priv *priv = &dev->eqos; 608dcfb333aSDavid Wu struct clk clk_speed; 609dcfb333aSDavid Wu int ret; 610dcfb333aSDavid Wu 611dcfb333aSDavid Wu ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 612dcfb333aSDavid Wu &clk_speed); 613dcfb333aSDavid Wu if (ret) { 61433a014bdSDavid Wu printf("%s can't get clk_mac_speed clock (ret=%d):\n", 61533a014bdSDavid Wu __func__, ret); 616dcfb333aSDavid Wu return ret; 617dcfb333aSDavid Wu } 618dcfb333aSDavid Wu 619dcfb333aSDavid Wu switch ( priv->phy->speed) { 620dcfb333aSDavid Wu case 10: 621dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 2500000); 622dcfb333aSDavid Wu if (ret) 623dcfb333aSDavid Wu return ret; 624dcfb333aSDavid Wu break; 625dcfb333aSDavid Wu case 100: 626dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 25000000); 627dcfb333aSDavid Wu if (ret) 628dcfb333aSDavid Wu return ret; 629dcfb333aSDavid Wu break; 630dcfb333aSDavid Wu case 1000: 631dcfb333aSDavid Wu ret = clk_set_rate(&clk_speed, 125000000); 632dcfb333aSDavid Wu if (ret) 633dcfb333aSDavid Wu return ret; 634dcfb333aSDavid Wu break; 635dcfb333aSDavid Wu default: 636dcfb333aSDavid Wu debug("Unknown phy speed: %d\n", priv->phy->speed); 637dcfb333aSDavid Wu return -EINVAL; 638dcfb333aSDavid Wu } 639dcfb333aSDavid Wu 640dcfb333aSDavid Wu return 0; 641dcfb333aSDavid Wu } 6426f0a52e9SDavid Wu #endif 6430a33ce65SDavid Wu 6446f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 64518ae91c8SDavid Wu static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 64618ae91c8SDavid Wu { 64718ae91c8SDavid Wu struct px30_grf *grf; 64818ae91c8SDavid Wu enum { 64918ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 65018ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 65118ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 65218ae91c8SDavid Wu }; 65318ae91c8SDavid Wu 65418ae91c8SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 65518ae91c8SDavid Wu 65618ae91c8SDavid Wu rk_clrsetreg(&grf->mac_con1, 65718ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_MASK, 65818ae91c8SDavid Wu px30_GMAC_PHY_INTF_SEL_RMII); 65918ae91c8SDavid Wu } 66018ae91c8SDavid Wu 661ff86648dSDavid Wu static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 662ff86648dSDavid Wu { 663ff86648dSDavid Wu struct rk1808_grf *grf; 664ff86648dSDavid Wu enum { 665ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 666ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 667ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 668ff86648dSDavid Wu 669ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 670ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 671ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 672ff86648dSDavid Wu 673ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 674ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 675ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 676ff86648dSDavid Wu }; 677ff86648dSDavid Wu enum { 678ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 679ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 680ff86648dSDavid Wu 681ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 682ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 683ff86648dSDavid Wu }; 684ff86648dSDavid Wu 685ff86648dSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 686ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con1, 687ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_MASK | 688ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_MASK | 689ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_MASK, 690ff86648dSDavid Wu RK1808_GMAC_PHY_INTF_SEL_RGMII | 691ff86648dSDavid Wu RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 692ff86648dSDavid Wu RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 693ff86648dSDavid Wu 694ff86648dSDavid Wu rk_clrsetreg(&grf->mac_con0, 695ff86648dSDavid Wu RK1808_CLK_RX_DL_CFG_GMAC_MASK | 696ff86648dSDavid Wu RK1808_CLK_TX_DL_CFG_GMAC_MASK, 697ff86648dSDavid Wu pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT | 698ff86648dSDavid Wu pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT); 699ff86648dSDavid Wu } 700ff86648dSDavid Wu 701af166ffaSDavid Wu static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 702af166ffaSDavid Wu { 703af166ffaSDavid Wu struct rk322x_grf *grf; 704af166ffaSDavid Wu enum { 705af166ffaSDavid Wu RK3228_RMII_MODE_SHIFT = 10, 706af166ffaSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 707af166ffaSDavid Wu 708af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 709af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 710af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 711af166ffaSDavid Wu 712af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 713af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 714af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 715af166ffaSDavid Wu 716af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 717af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 718af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 719af166ffaSDavid Wu }; 720af166ffaSDavid Wu enum { 721af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 722af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 723af166ffaSDavid Wu 724af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 725af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 726af166ffaSDavid Wu }; 727af166ffaSDavid Wu 728af166ffaSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 729af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[1], 730af166ffaSDavid Wu RK3228_RMII_MODE_MASK | 731af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK | 732af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_MASK | 733af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_MASK, 734af166ffaSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RGMII | 735af166ffaSDavid Wu RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 736af166ffaSDavid Wu RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 737af166ffaSDavid Wu 738af166ffaSDavid Wu rk_clrsetreg(&grf->mac_con[0], 739af166ffaSDavid Wu RK3228_CLK_RX_DL_CFG_GMAC_MASK | 740af166ffaSDavid Wu RK3228_CLK_TX_DL_CFG_GMAC_MASK, 741af166ffaSDavid Wu pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 742af166ffaSDavid Wu pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 743af166ffaSDavid Wu } 744af166ffaSDavid Wu 745491f3bfbSDavid Wu static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 746491f3bfbSDavid Wu { 747491f3bfbSDavid Wu struct rk322x_grf *grf; 748491f3bfbSDavid Wu enum { 749491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 750491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 751491f3bfbSDavid Wu RK3228_RMII_MODE_MASK = BIT(10), 752491f3bfbSDavid Wu RK3228_RMII_MODE_SEL = BIT(10), 753491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 754491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 755491f3bfbSDavid Wu }; 756491f3bfbSDavid Wu 757491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 758491f3bfbSDavid Wu rk_clrsetreg(&grf->mac_con[1], 759491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_MASK | 760491f3bfbSDavid Wu RK3228_RMII_MODE_MASK | 761491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_MASK, 762491f3bfbSDavid Wu RK3228_GRF_CON_RMII_MODE_SEL | 763491f3bfbSDavid Wu RK3228_RMII_MODE_SEL | 764491f3bfbSDavid Wu RK3228_GMAC_PHY_INTF_SEL_RMII); 765491f3bfbSDavid Wu } 766491f3bfbSDavid Wu 7671f08aa1cSPhilipp Tomsich static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 7681f08aa1cSPhilipp Tomsich { 7691f08aa1cSPhilipp Tomsich struct rk3288_grf *grf; 7701f08aa1cSPhilipp Tomsich 7711f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 7721f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con1, 7731f08aa1cSPhilipp Tomsich RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 7741f08aa1cSPhilipp Tomsich RK3288_GMAC_PHY_INTF_SEL_RGMII); 7751f08aa1cSPhilipp Tomsich 7761f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con3, 7771f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_MASK | 7781f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_MASK | 7791f08aa1cSPhilipp Tomsich RK3288_CLK_RX_DL_CFG_GMAC_MASK | 7801f08aa1cSPhilipp Tomsich RK3288_CLK_TX_DL_CFG_GMAC_MASK, 7811f08aa1cSPhilipp Tomsich RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 7821f08aa1cSPhilipp Tomsich RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 7831f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 7841f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 7851f08aa1cSPhilipp Tomsich } 7861f08aa1cSPhilipp Tomsich 78723adb58fSDavid Wu static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 78823adb58fSDavid Wu { 78923adb58fSDavid Wu struct rk3308_grf *grf; 79023adb58fSDavid Wu enum { 79123adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 79223adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 79323adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 79423adb58fSDavid Wu }; 79523adb58fSDavid Wu 79623adb58fSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 79723adb58fSDavid Wu 79823adb58fSDavid Wu rk_clrsetreg(&grf->mac_con0, 79923adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_MASK, 80023adb58fSDavid Wu RK3308_GMAC_PHY_INTF_SEL_RMII); 80123adb58fSDavid Wu } 80223adb58fSDavid Wu 803c36b26c0SDavid Wu static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 804c36b26c0SDavid Wu { 805c36b26c0SDavid Wu struct rk3328_grf_regs *grf; 806c36b26c0SDavid Wu enum { 807c36b26c0SDavid Wu RK3328_RMII_MODE_SHIFT = 9, 808c36b26c0SDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 809c36b26c0SDavid Wu 810c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 811c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 812c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 813c36b26c0SDavid Wu 814c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 815c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 816c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 817c36b26c0SDavid Wu 818c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 819c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 820c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 821c36b26c0SDavid Wu }; 822c36b26c0SDavid Wu enum { 823c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 824c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 825c36b26c0SDavid Wu 826c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 827c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 828c36b26c0SDavid Wu }; 829c36b26c0SDavid Wu 830c36b26c0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 831c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[1], 832c36b26c0SDavid Wu RK3328_RMII_MODE_MASK | 833c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK | 834c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 835c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_MASK, 836c36b26c0SDavid Wu RK3328_GMAC_PHY_INTF_SEL_RGMII | 837c36b26c0SDavid Wu RK3328_RXCLK_DLY_ENA_GMAC_MASK | 838c36b26c0SDavid Wu RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 839c36b26c0SDavid Wu 840c36b26c0SDavid Wu rk_clrsetreg(&grf->mac_con[0], 841c36b26c0SDavid Wu RK3328_CLK_RX_DL_CFG_GMAC_MASK | 842c36b26c0SDavid Wu RK3328_CLK_TX_DL_CFG_GMAC_MASK, 843c36b26c0SDavid Wu pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 844c36b26c0SDavid Wu pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 845c36b26c0SDavid Wu } 846c36b26c0SDavid Wu 847491f3bfbSDavid Wu static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 848491f3bfbSDavid Wu { 849491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 850491f3bfbSDavid Wu enum { 851491f3bfbSDavid Wu RK3328_RMII_MODE_MASK = BIT(9), 852491f3bfbSDavid Wu RK3328_RMII_MODE = BIT(9), 853491f3bfbSDavid Wu 854491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 855491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 856491f3bfbSDavid Wu }; 857491f3bfbSDavid Wu 858491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 859491f3bfbSDavid Wu rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 860491f3bfbSDavid Wu RK3328_RMII_MODE_MASK | 861491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_MASK, 862491f3bfbSDavid Wu RK3328_GMAC_PHY_INTF_SEL_RMII | 863491f3bfbSDavid Wu RK3328_RMII_MODE); 864491f3bfbSDavid Wu } 865491f3bfbSDavid Wu 866793f2fd2SPhilipp Tomsich static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 867793f2fd2SPhilipp Tomsich { 868793f2fd2SPhilipp Tomsich struct rk3368_grf *grf; 869793f2fd2SPhilipp Tomsich enum { 870793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 871793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 872793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK = BIT(6), 873793f2fd2SPhilipp Tomsich RK3368_RMII_MODE = BIT(6), 874793f2fd2SPhilipp Tomsich }; 875793f2fd2SPhilipp Tomsich enum { 876793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 877793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 878793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 879793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 880793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 881793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 882793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 883793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 884793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 885793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 886793f2fd2SPhilipp Tomsich }; 887793f2fd2SPhilipp Tomsich 888793f2fd2SPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 889793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con15, 890793f2fd2SPhilipp Tomsich RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 891793f2fd2SPhilipp Tomsich RK3368_GMAC_PHY_INTF_SEL_RGMII); 892793f2fd2SPhilipp Tomsich 893793f2fd2SPhilipp Tomsich rk_clrsetreg(&grf->soc_con16, 894793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_MASK | 895793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_MASK | 896793f2fd2SPhilipp Tomsich RK3368_CLK_RX_DL_CFG_GMAC_MASK | 897793f2fd2SPhilipp Tomsich RK3368_CLK_TX_DL_CFG_GMAC_MASK, 898793f2fd2SPhilipp Tomsich RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 899793f2fd2SPhilipp Tomsich RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 900793f2fd2SPhilipp Tomsich pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT | 901793f2fd2SPhilipp Tomsich pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT); 902793f2fd2SPhilipp Tomsich } 903793f2fd2SPhilipp Tomsich 9041f08aa1cSPhilipp Tomsich static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 9051f08aa1cSPhilipp Tomsich { 9061f08aa1cSPhilipp Tomsich struct rk3399_grf_regs *grf; 9071f08aa1cSPhilipp Tomsich 9081f08aa1cSPhilipp Tomsich grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9091f08aa1cSPhilipp Tomsich 9101f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con5, 9111f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_MASK, 9121f08aa1cSPhilipp Tomsich RK3399_GMAC_PHY_INTF_SEL_RGMII); 9131f08aa1cSPhilipp Tomsich 9141f08aa1cSPhilipp Tomsich rk_clrsetreg(&grf->soc_con6, 9151f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_MASK | 9161f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_MASK | 9171f08aa1cSPhilipp Tomsich RK3399_CLK_RX_DL_CFG_GMAC_MASK | 9181f08aa1cSPhilipp Tomsich RK3399_CLK_TX_DL_CFG_GMAC_MASK, 9191f08aa1cSPhilipp Tomsich RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 9201f08aa1cSPhilipp Tomsich RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 9211f08aa1cSPhilipp Tomsich pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT | 9221f08aa1cSPhilipp Tomsich pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT); 9231f08aa1cSPhilipp Tomsich } 9241f08aa1cSPhilipp Tomsich 9250a33ce65SDavid Wu static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 9260a33ce65SDavid Wu { 9270a33ce65SDavid Wu struct rv1108_grf *grf; 9280a33ce65SDavid Wu 9290a33ce65SDavid Wu enum { 9300a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 9310a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 9320a33ce65SDavid Wu }; 9330a33ce65SDavid Wu 9340a33ce65SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 9350a33ce65SDavid Wu rk_clrsetreg(&grf->gmac_con0, 9360a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_MASK, 9370a33ce65SDavid Wu RV1108_GMAC_PHY_INTF_SEL_RMII); 9380a33ce65SDavid Wu } 939491f3bfbSDavid Wu 940491f3bfbSDavid Wu static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 941491f3bfbSDavid Wu { 942491f3bfbSDavid Wu struct rk322x_grf *grf; 943491f3bfbSDavid Wu enum { 944491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 945491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 946491f3bfbSDavid Wu }; 947491f3bfbSDavid Wu enum { 948491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 949491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M = BIT(14), 950491f3bfbSDavid Wu 951491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 952491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE = BIT(6), 953491f3bfbSDavid Wu 954491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK = BIT(0), 955491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE = 0, 956491f3bfbSDavid Wu RK3228_MACPHY_ENABLE = BIT(0), 957491f3bfbSDavid Wu }; 958491f3bfbSDavid Wu enum { 959491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 960491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 961491f3bfbSDavid Wu }; 962491f3bfbSDavid Wu enum { 963491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 964491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 965491f3bfbSDavid Wu }; 966491f3bfbSDavid Wu 967491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 968491f3bfbSDavid Wu rk_clrsetreg(&grf->con_iomux, 969491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 970491f3bfbSDavid Wu RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 971491f3bfbSDavid Wu 972491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 973491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 974491f3bfbSDavid Wu RK3228_RK_GRF_CON2_MACPHY_ID); 975491f3bfbSDavid Wu 976491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 977491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 978491f3bfbSDavid Wu RK3228_RK_GRF_CON3_MACPHY_ID); 979491f3bfbSDavid Wu 980491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 981491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 982491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M_MASK | 983491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE_MASK | 984491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 985491f3bfbSDavid Wu RK3228_MACPHY_CFG_CLK_50M | 986491f3bfbSDavid Wu RK3228_MACPHY_RMII_MODE | 987491f3bfbSDavid Wu RK3228_MACPHY_DISENABLE); 988491f3bfbSDavid Wu 989491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 990491f3bfbSDavid Wu udelay(10); 991491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 992491f3bfbSDavid Wu udelay(10); 993491f3bfbSDavid Wu 994491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 995491f3bfbSDavid Wu RK3228_MACPHY_ENABLE_MASK, 996491f3bfbSDavid Wu RK3228_MACPHY_ENABLE); 997491f3bfbSDavid Wu udelay(30 * 1000); 998491f3bfbSDavid Wu } 999491f3bfbSDavid Wu 1000491f3bfbSDavid Wu static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1001491f3bfbSDavid Wu { 1002491f3bfbSDavid Wu struct rk3328_grf_regs *grf; 1003491f3bfbSDavid Wu enum { 1004491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1005491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE = BIT(9), 1006491f3bfbSDavid Wu }; 1007491f3bfbSDavid Wu enum { 1008491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1009491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1010491f3bfbSDavid Wu 1011491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1012491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE = BIT(6), 1013491f3bfbSDavid Wu 1014491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK = BIT(0), 1015491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE = 0, 1016491f3bfbSDavid Wu RK3328_MACPHY_ENABLE = BIT(0), 1017491f3bfbSDavid Wu }; 1018491f3bfbSDavid Wu enum { 1019491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1020491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1021491f3bfbSDavid Wu }; 1022491f3bfbSDavid Wu enum { 1023491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1024491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1025491f3bfbSDavid Wu }; 1026491f3bfbSDavid Wu 1027491f3bfbSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1028491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[1], 1029491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE_MASK, 1030491f3bfbSDavid Wu RK3328_GRF_CON_RMII_MODE); 1031491f3bfbSDavid Wu 1032491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[2], 1033491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1034491f3bfbSDavid Wu RK3328_RK_GRF_CON2_MACPHY_ID); 1035491f3bfbSDavid Wu 1036491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[3], 1037491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1038491f3bfbSDavid Wu RK3328_RK_GRF_CON3_MACPHY_ID); 1039491f3bfbSDavid Wu 1040491f3bfbSDavid Wu /* disabled before trying to reset it &*/ 1041491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1042491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M_MASK | 1043491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE_MASK | 1044491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1045491f3bfbSDavid Wu RK3328_MACPHY_CFG_CLK_50M | 1046491f3bfbSDavid Wu RK3328_MACPHY_RMII_MODE | 1047491f3bfbSDavid Wu RK3328_MACPHY_DISENABLE); 1048491f3bfbSDavid Wu 1049491f3bfbSDavid Wu reset_assert(&pdata->phy_reset); 1050491f3bfbSDavid Wu udelay(10); 1051491f3bfbSDavid Wu reset_deassert(&pdata->phy_reset); 1052491f3bfbSDavid Wu udelay(10); 1053491f3bfbSDavid Wu 1054491f3bfbSDavid Wu rk_clrsetreg(&grf->macphy_con[0], 1055491f3bfbSDavid Wu RK3328_MACPHY_ENABLE_MASK, 1056491f3bfbSDavid Wu RK3328_MACPHY_ENABLE); 1057491f3bfbSDavid Wu udelay(30 * 1000); 1058491f3bfbSDavid Wu } 1059491f3bfbSDavid Wu 1060dcfb333aSDavid Wu #else 106133a014bdSDavid Wu static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 106233a014bdSDavid Wu { 106333a014bdSDavid Wu struct rk3568_grf *grf; 106433a014bdSDavid Wu void *con1; 106533a014bdSDavid Wu 106633a014bdSDavid Wu enum { 106733a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 106833a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 106933a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 107033a014bdSDavid Wu }; 107133a014bdSDavid Wu 107233a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 107333a014bdSDavid Wu 107433a014bdSDavid Wu if (pdata->bus_id == 1) 107533a014bdSDavid Wu con1 = &grf->mac1_con1; 107633a014bdSDavid Wu else 107733a014bdSDavid Wu con1 = &grf->mac0_con1; 107833a014bdSDavid Wu 107933a014bdSDavid Wu rk_clrsetreg(con1, 108033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 108133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RMII); 108233a014bdSDavid Wu } 108333a014bdSDavid Wu 108433a014bdSDavid Wu static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 108533a014bdSDavid Wu { 108633a014bdSDavid Wu struct rk3568_grf *grf; 108733a014bdSDavid Wu void *con0, *con1; 108833a014bdSDavid Wu 108933a014bdSDavid Wu enum { 109033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 109133a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 109233a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 109333a014bdSDavid Wu 109433a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 109533a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 109633a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 109733a014bdSDavid Wu 109833a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 109933a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 110033a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 110133a014bdSDavid Wu }; 110233a014bdSDavid Wu 110333a014bdSDavid Wu enum { 110433a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 110533a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 110633a014bdSDavid Wu 110733a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 110833a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 110933a014bdSDavid Wu }; 111033a014bdSDavid Wu 111133a014bdSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 111233a014bdSDavid Wu 111333a014bdSDavid Wu if (pdata->bus_id == 1) { 111433a014bdSDavid Wu con0 = &grf->mac1_con0; 111533a014bdSDavid Wu con1 = &grf->mac1_con1; 111633a014bdSDavid Wu } else { 111733a014bdSDavid Wu con0 = &grf->mac0_con0; 111833a014bdSDavid Wu con1 = &grf->mac0_con1; 111933a014bdSDavid Wu } 112033a014bdSDavid Wu 112133a014bdSDavid Wu rk_clrsetreg(con0, 112233a014bdSDavid Wu RK3568_CLK_RX_DL_CFG_GMAC_MASK | 112333a014bdSDavid Wu RK3568_CLK_TX_DL_CFG_GMAC_MASK, 112433a014bdSDavid Wu pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT | 112533a014bdSDavid Wu pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT); 112633a014bdSDavid Wu 112733a014bdSDavid Wu rk_clrsetreg(con1, 112833a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_MASK | 112933a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_MASK | 113033a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_MASK, 113133a014bdSDavid Wu RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 113233a014bdSDavid Wu RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 113333a014bdSDavid Wu RK3568_GMAC_PHY_INTF_SEL_RGMII); 113433a014bdSDavid Wu } 113533a014bdSDavid Wu 1136bf0e94d0SDavid Wu static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1137bf0e94d0SDavid Wu { 1138bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1139bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1140bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1141bf0e94d0SDavid Wu 1142bf0e94d0SDavid Wu enum { 1143bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1144bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1145bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1146bf0e94d0SDavid Wu }; 1147bf0e94d0SDavid Wu 1148bf0e94d0SDavid Wu enum { 1149bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1150bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1151bf0e94d0SDavid Wu RK3588_GMAC_CLK_RMII_MODE = 0x1, 1152bf0e94d0SDavid Wu }; 1153bf0e94d0SDavid Wu 1154bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1155bf0e94d0SDavid Wu 1156bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1157bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1158bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1159bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1160bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1161bf0e94d0SDavid Wu } else { 1162bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1163bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1164bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1165bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1166bf0e94d0SDavid Wu } 1167bf0e94d0SDavid Wu 1168bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1169bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1170bf0e94d0SDavid Wu } 1171bf0e94d0SDavid Wu 1172bf0e94d0SDavid Wu static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1173bf0e94d0SDavid Wu { 1174bf0e94d0SDavid Wu unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1175bf0e94d0SDavid Wu unsigned int intf_sel, intf_sel_mask; 1176bf0e94d0SDavid Wu unsigned int clk_mode, clk_mode_mask; 1177bf0e94d0SDavid Wu unsigned int rx_delay; 1178bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1179bf0e94d0SDavid Wu struct rk3588_sys_grf *grf; 1180bf0e94d0SDavid Wu void *offset_con; 1181bf0e94d0SDavid Wu 1182bf0e94d0SDavid Wu enum { 1183bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1184bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1185bf0e94d0SDavid Wu RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1186bf0e94d0SDavid Wu 1187bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1188bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1189bf0e94d0SDavid Wu RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1190bf0e94d0SDavid Wu 1191bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1192bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1193bf0e94d0SDavid Wu RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1194bf0e94d0SDavid Wu }; 1195bf0e94d0SDavid Wu 1196bf0e94d0SDavid Wu enum { 1197bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1198bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1199bf0e94d0SDavid Wu 1200bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1201bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1202bf0e94d0SDavid Wu }; 1203bf0e94d0SDavid Wu 1204bf0e94d0SDavid Wu enum { 1205bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1206bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1207bf0e94d0SDavid Wu RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1208bf0e94d0SDavid Wu }; 1209bf0e94d0SDavid Wu 1210bf0e94d0SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1211bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1212bf0e94d0SDavid Wu 1213bf0e94d0SDavid Wu if (pdata->rx_delay < 0) { 1214bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1215bf0e94d0SDavid Wu rx_delay = 0; 1216bf0e94d0SDavid Wu } else { 1217bf0e94d0SDavid Wu rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1218bf0e94d0SDavid Wu rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1219bf0e94d0SDavid Wu } 1220bf0e94d0SDavid Wu 1221bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1222bf0e94d0SDavid Wu offset_con = &grf->soc_con9; 1223bf0e94d0SDavid Wu rx_enable = rx_delay << 2; 1224bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1225bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1226bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1227bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1228bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1229bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1230bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1231bf0e94d0SDavid Wu } else { 1232bf0e94d0SDavid Wu offset_con = &grf->soc_con8; 1233bf0e94d0SDavid Wu rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1234bf0e94d0SDavid Wu tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1235bf0e94d0SDavid Wu tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1236bf0e94d0SDavid Wu intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1237bf0e94d0SDavid Wu intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1238bf0e94d0SDavid Wu clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1239bf0e94d0SDavid Wu clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1240bf0e94d0SDavid Wu } 1241bf0e94d0SDavid Wu 1242bf0e94d0SDavid Wu rk_clrsetreg(offset_con, 1243bf0e94d0SDavid Wu RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1244bf0e94d0SDavid Wu RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1245bf0e94d0SDavid Wu pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT | 1246bf0e94d0SDavid Wu rx_delay); 1247bf0e94d0SDavid Wu 1248bf0e94d0SDavid Wu rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1249bf0e94d0SDavid Wu tx_enable | rx_enable); 1250bf0e94d0SDavid Wu 1251bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1252bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1253bf0e94d0SDavid Wu } 1254bf0e94d0SDavid Wu 125520bef841SDavid Wu static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 125620bef841SDavid Wu { 125720bef841SDavid Wu struct rv1106_grf *grf; 125854f7ad44SDavid Wu 125954f7ad44SDavid Wu enum { 126020bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK = BIT(1), 126154f7ad44SDavid Wu RV1106_MACPHY_DISENABLE = BIT(1), 126254f7ad44SDavid Wu RV1106_MACPHY_ENABLE = 0, 126320bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 126420bef841SDavid Wu RV1106_MACPHY_XMII_SEL = BIT(6), 126520bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 126620bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 126720bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 126820bef841SDavid Wu RV1106_MACPHY_PHY_ID = BIT(11), 126920bef841SDavid Wu }; 127020bef841SDavid Wu 127120bef841SDavid Wu enum { 127220bef841SDavid Wu RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 127354f7ad44SDavid Wu RV1106_MACPHY_BGS = BIT(2), 127420bef841SDavid Wu }; 127520bef841SDavid Wu 127620bef841SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 127720bef841SDavid Wu 127820bef841SDavid Wu reset_assert(&pdata->phy_reset); 127920bef841SDavid Wu udelay(20); 128020bef841SDavid Wu rk_clrsetreg(&grf->macphy_con0, 128120bef841SDavid Wu RV1106_MACPHY_ENABLE_MASK | 128220bef841SDavid Wu RV1106_MACPHY_XMII_SEL_MASK | 128320bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_MASK | 128420bef841SDavid Wu RV1106_MACPHY_PHY_ID_MASK, 128520bef841SDavid Wu RV1106_MACPHY_ENABLE | 128620bef841SDavid Wu RV1106_MACPHY_XMII_SEL | 128720bef841SDavid Wu RV1106_MACPHY_24M_CLK_SEL_24M | 128820bef841SDavid Wu RV1106_MACPHY_PHY_ID); 128920bef841SDavid Wu 129020bef841SDavid Wu rk_clrsetreg(&grf->macphy_con1, 129120bef841SDavid Wu RV1106_MACPHY_BGS_MASK, 129220bef841SDavid Wu RV1106_MACPHY_BGS); 1293*8bafa3a1SDavid Wu udelay(20); 129420bef841SDavid Wu reset_deassert(&pdata->phy_reset); 129520bef841SDavid Wu udelay(30 * 1000); 129620bef841SDavid Wu } 129720bef841SDavid Wu 1298*8bafa3a1SDavid Wu static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1299*8bafa3a1SDavid Wu { 1300*8bafa3a1SDavid Wu struct rv1106_grf *grf; 1301*8bafa3a1SDavid Wu enum { 1302*8bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1303*8bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1304*8bafa3a1SDavid Wu }; 1305*8bafa3a1SDavid Wu 1306*8bafa3a1SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1307*8bafa3a1SDavid Wu rk_clrsetreg(&grf->gmac_clk_con, 1308*8bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 1309*8bafa3a1SDavid Wu RV1106_VOGRF_GMAC_CLK_RMII_MODE); 1310*8bafa3a1SDavid Wu }; 1311*8bafa3a1SDavid Wu 1312e4e3f431SDavid Wu static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1313e4e3f431SDavid Wu { 1314e4e3f431SDavid Wu struct rv1126_grf *grf; 1315e4e3f431SDavid Wu 1316e4e3f431SDavid Wu enum { 1317e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1318e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1319e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1320e4e3f431SDavid Wu }; 1321e4e3f431SDavid Wu 1322e4e3f431SDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1323e4e3f431SDavid Wu 1324e4e3f431SDavid Wu rk_clrsetreg(&grf->mac_con0, 1325e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1326e4e3f431SDavid Wu RV1126_GMAC_PHY_INTF_SEL_RMII); 1327e4e3f431SDavid Wu } 1328e4e3f431SDavid Wu 1329dcfb333aSDavid Wu static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1330dcfb333aSDavid Wu { 1331dcfb333aSDavid Wu struct rv1126_grf *grf; 1332dcfb333aSDavid Wu 1333dcfb333aSDavid Wu enum { 1334dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1335dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1336dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1337dcfb333aSDavid Wu 1338dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1339dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1340dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1341dcfb333aSDavid Wu 1342dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1343dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1344dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1345dcfb333aSDavid Wu 1346dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1347dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1348dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1349dcfb333aSDavid Wu 1350dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1351dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1352dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1353dcfb333aSDavid Wu }; 1354dcfb333aSDavid Wu enum { 1355dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1356dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1357dcfb333aSDavid Wu 1358dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1359dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1360dcfb333aSDavid Wu }; 1361dcfb333aSDavid Wu enum { 1362dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1363dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1364dcfb333aSDavid Wu 1365dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1366dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1367dcfb333aSDavid Wu }; 1368dcfb333aSDavid Wu 1369dcfb333aSDavid Wu grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1370dcfb333aSDavid Wu 1371dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con0, 1372dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1373dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1374dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1375dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1376dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_MASK, 1377dcfb333aSDavid Wu RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1378dcfb333aSDavid Wu RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1379dcfb333aSDavid Wu RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1380dcfb333aSDavid Wu RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1381dcfb333aSDavid Wu RV1126_GMAC_PHY_INTF_SEL_RGMII); 1382dcfb333aSDavid Wu 1383dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con1, 1384dcfb333aSDavid Wu RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1385dcfb333aSDavid Wu RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1386dcfb333aSDavid Wu pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT | 1387dcfb333aSDavid Wu pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT); 1388dcfb333aSDavid Wu 1389dcfb333aSDavid Wu rk_clrsetreg(&grf->mac_con2, 1390dcfb333aSDavid Wu RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1391dcfb333aSDavid Wu RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1392dcfb333aSDavid Wu pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT | 1393dcfb333aSDavid Wu pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT); 1394dcfb333aSDavid Wu } 13956f0a52e9SDavid Wu #endif 13960a33ce65SDavid Wu 1397bf0e94d0SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 1398bf0e94d0SDavid Wu static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1399bf0e94d0SDavid Wu { 1400bf0e94d0SDavid Wu struct rk3588_php_grf *php_grf; 1401bf0e94d0SDavid Wu unsigned int val, mask; 1402bf0e94d0SDavid Wu 1403bf0e94d0SDavid Wu enum { 1404bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 1405bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_MASK = BIT(4), 1406bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU = BIT(4), 1407bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_IO = 0, 1408bf0e94d0SDavid Wu }; 1409bf0e94d0SDavid Wu 1410bf0e94d0SDavid Wu php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1411bf0e94d0SDavid Wu val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 1412bf0e94d0SDavid Wu RK3588_GMAC_CLK_SELET_CRU; 1413bf0e94d0SDavid Wu mask = RK3588_GMAC_CLK_SELET_MASK; 1414bf0e94d0SDavid Wu 1415bf0e94d0SDavid Wu if (pdata->bus_id == 1) { 1416bf0e94d0SDavid Wu val <<= 5; 1417bf0e94d0SDavid Wu mask <<= 5; 1418bf0e94d0SDavid Wu } 1419bf0e94d0SDavid Wu 1420bf0e94d0SDavid Wu rk_clrsetreg(&php_grf->clk_con1, mask, val); 1421bf0e94d0SDavid Wu } 1422bf0e94d0SDavid Wu #endif 1423bf0e94d0SDavid Wu 14240125bcf0SSjoerd Simons static int gmac_rockchip_probe(struct udevice *dev) 14250125bcf0SSjoerd Simons { 14260125bcf0SSjoerd Simons struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 14271f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 14281f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 14296f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14306f0a52e9SDavid Wu struct eqos_config *config; 14316f0a52e9SDavid Wu #else 14326f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 14336f0a52e9SDavid Wu #endif 14346f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 14350125bcf0SSjoerd Simons struct clk clk; 14360a33ce65SDavid Wu ulong rate; 14370125bcf0SSjoerd Simons int ret; 14380125bcf0SSjoerd Simons 14396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 14406f0a52e9SDavid Wu eth_pdata = &pdata->eth_pdata; 14416f0a52e9SDavid Wu config = (struct eqos_config *)&ops->config; 1442befcb627SDavid Wu memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 14436f0a52e9SDavid Wu eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 14446f0a52e9SDavid Wu #else 14456f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 14466f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 14476f0a52e9SDavid Wu #endif 144833a014bdSDavid Wu pdata->bus_id = dev->seq; 144954f7ad44SDavid Wu 1450cadc8d74SKever Yang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1451cadc8d74SKever Yang ret = clk_set_defaults(dev); 1452cadc8d74SKever Yang if (ret) 1453cadc8d74SKever Yang debug("%s clk_set_defaults failed %d\n", __func__, ret); 1454cadc8d74SKever Yang 14550125bcf0SSjoerd Simons ret = clk_get_by_index(dev, 0, &clk); 14560125bcf0SSjoerd Simons if (ret) 14570125bcf0SSjoerd Simons return ret; 14580125bcf0SSjoerd Simons 1459491f3bfbSDavid Wu pdata->phy_interface = eth_pdata->phy_interface; 1460491f3bfbSDavid Wu 1461bf0e94d0SDavid Wu if (ops->set_clock_selection) 1462bf0e94d0SDavid Wu ops->set_clock_selection(pdata); 1463bf0e94d0SDavid Wu 1464491f3bfbSDavid Wu if (pdata->integrated_phy && ops->integrated_phy_powerup) 1465491f3bfbSDavid Wu ops->integrated_phy_powerup(pdata); 1466491f3bfbSDavid Wu 14670a33ce65SDavid Wu switch (eth_pdata->phy_interface) { 14680a33ce65SDavid Wu case PHY_INTERFACE_MODE_RGMII: 1469bf0e94d0SDavid Wu case PHY_INTERFACE_MODE_RGMII_RXID: 14700a33ce65SDavid Wu /* 14710a33ce65SDavid Wu * If the gmac clock is from internal pll, need to set and 14720a33ce65SDavid Wu * check the return value for gmac clock at RGMII mode. If 14730a33ce65SDavid Wu * the gmac clock is from external source, the clock rate 14740a33ce65SDavid Wu * is not set, because of it is bypassed. 14750a33ce65SDavid Wu */ 14760a33ce65SDavid Wu if (!pdata->clock_input) { 14770a33ce65SDavid Wu rate = clk_set_rate(&clk, 125000000); 14780a33ce65SDavid Wu if (rate != 125000000) 14790a33ce65SDavid Wu return -EINVAL; 14800a33ce65SDavid Wu } 14810125bcf0SSjoerd Simons 1482bf0e94d0SDavid Wu if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 1483bf0e94d0SDavid Wu pdata->rx_delay = -1; 1484bf0e94d0SDavid Wu 14850125bcf0SSjoerd Simons /* Set to RGMII mode */ 14860a33ce65SDavid Wu if (ops->set_to_rgmii) 14871f08aa1cSPhilipp Tomsich ops->set_to_rgmii(pdata); 14880a33ce65SDavid Wu else 14890a33ce65SDavid Wu return -EPERM; 14900a33ce65SDavid Wu 14910a33ce65SDavid Wu break; 14920a33ce65SDavid Wu case PHY_INTERFACE_MODE_RMII: 14930a33ce65SDavid Wu /* The commet is the same as RGMII mode */ 14940a33ce65SDavid Wu if (!pdata->clock_input) { 14950a33ce65SDavid Wu rate = clk_set_rate(&clk, 50000000); 14960a33ce65SDavid Wu if (rate != 50000000) 14970a33ce65SDavid Wu return -EINVAL; 14980a33ce65SDavid Wu } 14990a33ce65SDavid Wu 15000a33ce65SDavid Wu /* Set to RMII mode */ 15010a33ce65SDavid Wu if (ops->set_to_rmii) 15020a33ce65SDavid Wu ops->set_to_rmii(pdata); 15030a33ce65SDavid Wu 15040a33ce65SDavid Wu break; 15050a33ce65SDavid Wu default: 15060a33ce65SDavid Wu debug("NO interface defined!\n"); 15070a33ce65SDavid Wu return -ENXIO; 15080a33ce65SDavid Wu } 15090125bcf0SSjoerd Simons 15106f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15116f0a52e9SDavid Wu return eqos_probe(dev); 15126f0a52e9SDavid Wu #else 15130125bcf0SSjoerd Simons return designware_eth_probe(dev); 15146f0a52e9SDavid Wu #endif 15156f0a52e9SDavid Wu } 15166f0a52e9SDavid Wu 15176f0a52e9SDavid Wu static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 15186f0a52e9SDavid Wu { 15196f0a52e9SDavid Wu #if defined(CONFIG_DWC_ETH_QOS) 15206f0a52e9SDavid Wu return eqos_write_hwaddr(dev); 15216f0a52e9SDavid Wu #else 15226f0a52e9SDavid Wu return designware_eth_write_hwaddr(dev); 15236f0a52e9SDavid Wu #endif 15246f0a52e9SDavid Wu } 15256f0a52e9SDavid Wu 15266f0a52e9SDavid Wu static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 15276f0a52e9SDavid Wu int length) 15286f0a52e9SDavid Wu { 15296f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15306f0a52e9SDavid Wu return eqos_free_pkt(dev, packet, length); 15316f0a52e9SDavid Wu #else 15326f0a52e9SDavid Wu return designware_eth_free_pkt(dev, packet, length); 15336f0a52e9SDavid Wu #endif 15346f0a52e9SDavid Wu } 15356f0a52e9SDavid Wu 15366f0a52e9SDavid Wu static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 15376f0a52e9SDavid Wu int length) 15386f0a52e9SDavid Wu { 15396f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15406f0a52e9SDavid Wu return eqos_send(dev, packet, length); 15416f0a52e9SDavid Wu #else 15426f0a52e9SDavid Wu return designware_eth_send(dev, packet, length); 15436f0a52e9SDavid Wu #endif 15446f0a52e9SDavid Wu } 15456f0a52e9SDavid Wu 15466f0a52e9SDavid Wu static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 15476f0a52e9SDavid Wu uchar **packetp) 15486f0a52e9SDavid Wu { 15496f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15506f0a52e9SDavid Wu return eqos_recv(dev, flags, packetp); 15516f0a52e9SDavid Wu #else 15526f0a52e9SDavid Wu return designware_eth_recv(dev, flags, packetp); 15536f0a52e9SDavid Wu #endif 15540125bcf0SSjoerd Simons } 15550125bcf0SSjoerd Simons 15560125bcf0SSjoerd Simons static int gmac_rockchip_eth_start(struct udevice *dev) 15570125bcf0SSjoerd Simons { 15586f0a52e9SDavid Wu struct rockchip_eth_dev *priv = dev_get_priv(dev); 15591f08aa1cSPhilipp Tomsich struct rk_gmac_ops *ops = 15601f08aa1cSPhilipp Tomsich (struct rk_gmac_ops *)dev_get_driver_data(dev); 15616f0a52e9SDavid Wu struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1562491f3bfbSDavid Wu #ifndef CONFIG_DWC_ETH_QOS 15636f0a52e9SDavid Wu struct dw_eth_pdata *dw_pdata; 15646f0a52e9SDavid Wu struct eth_pdata *eth_pdata; 15656f0a52e9SDavid Wu #endif 15660125bcf0SSjoerd Simons int ret; 15670125bcf0SSjoerd Simons 15686f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15696f0a52e9SDavid Wu ret = eqos_init(dev); 15706f0a52e9SDavid Wu #else 15716f0a52e9SDavid Wu dw_pdata = &pdata->dw_eth_pdata; 15726f0a52e9SDavid Wu eth_pdata = &dw_pdata->eth_pdata; 15736f0a52e9SDavid Wu ret = designware_eth_init((struct dw_eth_dev *)priv, 15746f0a52e9SDavid Wu eth_pdata->enetaddr); 15756f0a52e9SDavid Wu #endif 15760125bcf0SSjoerd Simons if (ret) 15770125bcf0SSjoerd Simons return ret; 1578491f3bfbSDavid Wu ret = ops->fix_mac_speed(pdata, priv); 15790125bcf0SSjoerd Simons if (ret) 15800125bcf0SSjoerd Simons return ret; 15816f0a52e9SDavid Wu 15826f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15836f0a52e9SDavid Wu eqos_enable(dev); 15846f0a52e9SDavid Wu #else 15856f0a52e9SDavid Wu ret = designware_eth_enable((struct dw_eth_dev *)priv); 15860125bcf0SSjoerd Simons if (ret) 15870125bcf0SSjoerd Simons return ret; 15886f0a52e9SDavid Wu #endif 15890125bcf0SSjoerd Simons 15900125bcf0SSjoerd Simons return 0; 15910125bcf0SSjoerd Simons } 15920125bcf0SSjoerd Simons 15936f0a52e9SDavid Wu static void gmac_rockchip_eth_stop(struct udevice *dev) 15946f0a52e9SDavid Wu { 15956f0a52e9SDavid Wu #ifdef CONFIG_DWC_ETH_QOS 15966f0a52e9SDavid Wu eqos_stop(dev); 15976f0a52e9SDavid Wu #else 15986f0a52e9SDavid Wu designware_eth_stop(dev); 15996f0a52e9SDavid Wu #endif 16006f0a52e9SDavid Wu } 16016f0a52e9SDavid Wu 16020125bcf0SSjoerd Simons const struct eth_ops gmac_rockchip_eth_ops = { 16030125bcf0SSjoerd Simons .start = gmac_rockchip_eth_start, 16046f0a52e9SDavid Wu .send = gmac_rockchip_eth_send, 16056f0a52e9SDavid Wu .recv = gmac_rockchip_eth_recv, 16066f0a52e9SDavid Wu .free_pkt = gmac_rockchip_eth_free_pkt, 16076f0a52e9SDavid Wu .stop = gmac_rockchip_eth_stop, 16086f0a52e9SDavid Wu .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 16090125bcf0SSjoerd Simons }; 16100125bcf0SSjoerd Simons 16116f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 161218ae91c8SDavid Wu const struct rk_gmac_ops px30_gmac_ops = { 161318ae91c8SDavid Wu .fix_mac_speed = px30_gmac_fix_mac_speed, 161418ae91c8SDavid Wu .set_to_rmii = px30_gmac_set_to_rmii, 161518ae91c8SDavid Wu }; 161618ae91c8SDavid Wu 1617ff86648dSDavid Wu const struct rk_gmac_ops rk1808_gmac_ops = { 1618ff86648dSDavid Wu .fix_mac_speed = rk1808_gmac_fix_mac_speed, 1619ff86648dSDavid Wu .set_to_rgmii = rk1808_gmac_set_to_rgmii, 1620ff86648dSDavid Wu }; 1621ff86648dSDavid Wu 1622af166ffaSDavid Wu const struct rk_gmac_ops rk3228_gmac_ops = { 1623af166ffaSDavid Wu .fix_mac_speed = rk3228_gmac_fix_mac_speed, 1624491f3bfbSDavid Wu .set_to_rmii = rk3228_gmac_set_to_rmii, 1625af166ffaSDavid Wu .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1626491f3bfbSDavid Wu .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 1627af166ffaSDavid Wu }; 1628af166ffaSDavid Wu 16291f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3288_gmac_ops = { 16301f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3288_gmac_fix_mac_speed, 16311f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3288_gmac_set_to_rgmii, 16321f08aa1cSPhilipp Tomsich }; 16331f08aa1cSPhilipp Tomsich 163423adb58fSDavid Wu const struct rk_gmac_ops rk3308_gmac_ops = { 163523adb58fSDavid Wu .fix_mac_speed = rk3308_gmac_fix_mac_speed, 163623adb58fSDavid Wu .set_to_rmii = rk3308_gmac_set_to_rmii, 163723adb58fSDavid Wu }; 163823adb58fSDavid Wu 1639c36b26c0SDavid Wu const struct rk_gmac_ops rk3328_gmac_ops = { 1640c36b26c0SDavid Wu .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1641491f3bfbSDavid Wu .set_to_rmii = rk3328_gmac_set_to_rmii, 1642c36b26c0SDavid Wu .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1643491f3bfbSDavid Wu .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 1644c36b26c0SDavid Wu }; 1645c36b26c0SDavid Wu 1646793f2fd2SPhilipp Tomsich const struct rk_gmac_ops rk3368_gmac_ops = { 1647793f2fd2SPhilipp Tomsich .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1648793f2fd2SPhilipp Tomsich .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1649793f2fd2SPhilipp Tomsich }; 1650793f2fd2SPhilipp Tomsich 16511f08aa1cSPhilipp Tomsich const struct rk_gmac_ops rk3399_gmac_ops = { 16521f08aa1cSPhilipp Tomsich .fix_mac_speed = rk3399_gmac_fix_mac_speed, 16531f08aa1cSPhilipp Tomsich .set_to_rgmii = rk3399_gmac_set_to_rgmii, 16541f08aa1cSPhilipp Tomsich }; 16551f08aa1cSPhilipp Tomsich 16560a33ce65SDavid Wu const struct rk_gmac_ops rv1108_gmac_ops = { 16570a33ce65SDavid Wu .fix_mac_speed = rv1108_set_rmii_speed, 16580a33ce65SDavid Wu .set_to_rmii = rv1108_gmac_set_to_rmii, 16590a33ce65SDavid Wu }; 1660dcfb333aSDavid Wu #else 166133a014bdSDavid Wu const struct rk_gmac_ops rk3568_gmac_ops = { 166233a014bdSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 166333a014bdSDavid Wu .set_to_rgmii = rk3568_set_to_rgmii, 166433a014bdSDavid Wu .set_to_rmii = rk3568_set_to_rmii, 166533a014bdSDavid Wu }; 166633a014bdSDavid Wu 1667bf0e94d0SDavid Wu const struct rk_gmac_ops rk3588_gmac_ops = { 1668bf0e94d0SDavid Wu .fix_mac_speed = rk3588_set_rgmii_speed, 1669bf0e94d0SDavid Wu .set_to_rgmii = rk3588_set_to_rgmii, 1670bf0e94d0SDavid Wu .set_to_rmii = rk3588_set_to_rmii, 1671bf0e94d0SDavid Wu .set_clock_selection = rk3588_set_clock_selection, 1672bf0e94d0SDavid Wu }; 1673bf0e94d0SDavid Wu 167420bef841SDavid Wu const struct rk_gmac_ops rv1106_gmac_ops = { 167520bef841SDavid Wu .fix_mac_speed = rv1106_set_rmii_speed, 1676*8bafa3a1SDavid Wu .set_to_rmii = rv1106_set_to_rmii, 167720bef841SDavid Wu .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 167820bef841SDavid Wu }; 167920bef841SDavid Wu 1680dcfb333aSDavid Wu const struct rk_gmac_ops rv1126_gmac_ops = { 1681dcfb333aSDavid Wu .fix_mac_speed = rv1126_set_rgmii_speed, 1682dcfb333aSDavid Wu .set_to_rgmii = rv1126_set_to_rgmii, 1683e4e3f431SDavid Wu .set_to_rmii = rv1126_set_to_rmii, 1684dcfb333aSDavid Wu }; 16856f0a52e9SDavid Wu #endif 16860a33ce65SDavid Wu 16870125bcf0SSjoerd Simons static const struct udevice_id rockchip_gmac_ids[] = { 16886f0a52e9SDavid Wu #ifndef CONFIG_DWC_ETH_QOS 168984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_PX30 169018ae91c8SDavid Wu { .compatible = "rockchip,px30-gmac", 169118ae91c8SDavid Wu .data = (ulong)&px30_gmac_ops }, 169284e90485SDavid Wu #endif 169384e90485SDavid Wu 169484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK1808 1695ff86648dSDavid Wu { .compatible = "rockchip,rk1808-gmac", 1696ff86648dSDavid Wu .data = (ulong)&rk1808_gmac_ops }, 169784e90485SDavid Wu #endif 169884e90485SDavid Wu 169984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3228 1700af166ffaSDavid Wu { .compatible = "rockchip,rk3228-gmac", 1701af166ffaSDavid Wu .data = (ulong)&rk3228_gmac_ops }, 170284e90485SDavid Wu #endif 170384e90485SDavid Wu 170484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3288 17051f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3288-gmac", 17061f08aa1cSPhilipp Tomsich .data = (ulong)&rk3288_gmac_ops }, 170784e90485SDavid Wu #endif 170884e90485SDavid Wu 170984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3308 171023adb58fSDavid Wu { .compatible = "rockchip,rk3308-mac", 171123adb58fSDavid Wu .data = (ulong)&rk3308_gmac_ops }, 171284e90485SDavid Wu #endif 171384e90485SDavid Wu 171484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3328 1715c36b26c0SDavid Wu { .compatible = "rockchip,rk3328-gmac", 1716c36b26c0SDavid Wu .data = (ulong)&rk3328_gmac_ops }, 171784e90485SDavid Wu #endif 171884e90485SDavid Wu 171984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3368 1720793f2fd2SPhilipp Tomsich { .compatible = "rockchip,rk3368-gmac", 1721793f2fd2SPhilipp Tomsich .data = (ulong)&rk3368_gmac_ops }, 172284e90485SDavid Wu #endif 172384e90485SDavid Wu 172484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3399 17251f08aa1cSPhilipp Tomsich { .compatible = "rockchip,rk3399-gmac", 17261f08aa1cSPhilipp Tomsich .data = (ulong)&rk3399_gmac_ops }, 172784e90485SDavid Wu #endif 172884e90485SDavid Wu 172984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1108 17300a33ce65SDavid Wu { .compatible = "rockchip,rv1108-gmac", 17310a33ce65SDavid Wu .data = (ulong)&rv1108_gmac_ops }, 173284e90485SDavid Wu #endif 1733dcfb333aSDavid Wu #else 173484e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3568 173533a014bdSDavid Wu { .compatible = "rockchip,rk3568-gmac", 173633a014bdSDavid Wu .data = (ulong)&rk3568_gmac_ops }, 173784e90485SDavid Wu #endif 173884e90485SDavid Wu 1739bf0e94d0SDavid Wu #ifdef CONFIG_ROCKCHIP_RK3588 1740bf0e94d0SDavid Wu { .compatible = "rockchip,rk3588-gmac", 1741bf0e94d0SDavid Wu .data = (ulong)&rk3588_gmac_ops }, 1742bf0e94d0SDavid Wu #endif 1743bf0e94d0SDavid Wu 174420bef841SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1106 174520bef841SDavid Wu { .compatible = "rockchip,rv1106-gmac", 174620bef841SDavid Wu .data = (ulong)&rv1106_gmac_ops }, 174720bef841SDavid Wu #endif 174820bef841SDavid Wu 174984e90485SDavid Wu #ifdef CONFIG_ROCKCHIP_RV1126 1750dcfb333aSDavid Wu { .compatible = "rockchip,rv1126-gmac", 1751dcfb333aSDavid Wu .data = (ulong)&rv1126_gmac_ops }, 17526f0a52e9SDavid Wu #endif 175384e90485SDavid Wu #endif 17540125bcf0SSjoerd Simons { } 17550125bcf0SSjoerd Simons }; 17560125bcf0SSjoerd Simons 17570125bcf0SSjoerd Simons U_BOOT_DRIVER(eth_gmac_rockchip) = { 17580125bcf0SSjoerd Simons .name = "gmac_rockchip", 17590125bcf0SSjoerd Simons .id = UCLASS_ETH, 17600125bcf0SSjoerd Simons .of_match = rockchip_gmac_ids, 17610125bcf0SSjoerd Simons .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 17620125bcf0SSjoerd Simons .probe = gmac_rockchip_probe, 17630125bcf0SSjoerd Simons .ops = &gmac_rockchip_eth_ops, 17646f0a52e9SDavid Wu .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 17650125bcf0SSjoerd Simons .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 17660125bcf0SSjoerd Simons .flags = DM_FLAG_ALLOC_PRIV_DMA, 17670125bcf0SSjoerd Simons }; 1768