1 /* 2 * (C) Copyright 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk> 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 * 6 * Rockchip GMAC ethernet IP driver for U-Boot 7 */ 8 9 #include <common.h> 10 #include <dm.h> 11 #include <clk.h> 12 #include <misc.h> 13 #include <phy.h> 14 #include <reset.h> 15 #include <syscon.h> 16 #include <asm/io.h> 17 #include <asm/arch/periph.h> 18 #include <asm/arch/clock.h> 19 #include <asm/arch/hardware.h> 20 #ifdef CONFIG_DWC_ETH_QOS 21 #include <asm/arch/grf_rk3568.h> 22 #include <asm/arch/grf_rk3588.h> 23 #include <asm/arch/grf_rv1106.h> 24 #include <asm/arch/grf_rv1126.h> 25 #include "dwc_eth_qos.h" 26 #else 27 #include <asm/arch/grf_px30.h> 28 #include <asm/arch/grf_rk1808.h> 29 #include <asm/arch/grf_rk322x.h> 30 #include <asm/arch/grf_rk3288.h> 31 #include <asm/arch/grf_rk3308.h> 32 #include <asm/arch/grf_rk3328.h> 33 #include <asm/arch/grf_rk3368.h> 34 #include <asm/arch/grf_rk3399.h> 35 #include <asm/arch/grf_rv1108.h> 36 #include "designware.h" 37 #include <dt-bindings/clock/rk3288-cru.h> 38 #endif 39 #include <dm/pinctrl.h> 40 #include <dm/of_access.h> 41 42 DECLARE_GLOBAL_DATA_PTR; 43 44 struct rockchip_eth_dev { 45 #ifdef CONFIG_DWC_ETH_QOS 46 struct eqos_priv eqos; 47 #else 48 struct dw_eth_dev dw; 49 #endif 50 int phy_interface; 51 }; 52 53 /* 54 * Platform data for the gmac 55 * 56 * dw_eth_pdata: Required platform data for designware driver (must be first) 57 */ 58 struct gmac_rockchip_platdata { 59 #ifndef CONFIG_DWC_ETH_QOS 60 struct dw_eth_pdata dw_eth_pdata; 61 #else 62 struct eth_pdata eth_pdata; 63 #endif 64 struct reset_ctl phy_reset; 65 bool integrated_phy; 66 bool clock_input; 67 int phy_interface; 68 int tx_delay; 69 int rx_delay; 70 int bus_id; 71 }; 72 73 struct rk_gmac_ops { 74 #ifdef CONFIG_DWC_ETH_QOS 75 const struct eqos_config config; 76 #endif 77 int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 78 struct rockchip_eth_dev *dev); 79 void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 80 void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 81 void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 82 void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 83 }; 84 85 #ifdef CONFIG_DWC_ETH_QOS 86 static const struct eqos_config eqos_rockchip_config = { 87 .reg_access_always_ok = false, 88 .mdio_wait = 10000, 89 .swr_wait = 200, 90 .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 91 .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 92 .ops = &eqos_rockchip_ops, 93 }; 94 #endif 95 96 void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 97 { 98 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 99 struct rk_gmac_ops *ops = 100 (struct rk_gmac_ops *)dev_get_driver_data(dev); 101 102 pdata->tx_delay = tx_delay; 103 pdata->rx_delay = rx_delay; 104 105 ops->set_to_rgmii(pdata); 106 } 107 108 static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 109 { 110 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 111 struct ofnode_phandle_args args; 112 struct udevice *phydev; 113 const char *string; 114 int ret; 115 116 string = dev_read_string(dev, "clock_in_out"); 117 if (!strcmp(string, "input")) 118 pdata->clock_input = true; 119 else 120 pdata->clock_input = false; 121 122 /* If phy-handle property is passed from DT, use it as the PHY */ 123 ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 124 if (ret) { 125 debug("Cannot get phy phandle: ret=%d\n", ret); 126 pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 127 } else { 128 debug("Found phy-handle subnode\n"); 129 pdata->integrated_phy = ofnode_read_bool(args.node, 130 "phy-is-integrated"); 131 } 132 133 if (pdata->integrated_phy) { 134 ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 135 if (ret) { 136 ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 137 if (ret) { 138 debug("Get phydev by ofnode failed: err=%d\n", ret); 139 return ret; 140 } 141 142 ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 143 if (ret) { 144 debug("No PHY reset control found: ret=%d\n", ret); 145 return ret; 146 } 147 } 148 } 149 150 /* Check the new naming-style first... */ 151 pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 152 pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 153 154 /* ... and fall back to the old naming style or default, if necessary */ 155 if (pdata->tx_delay == -ENOENT) 156 pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 157 if (pdata->rx_delay == -ENOENT) 158 pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 159 160 #ifdef CONFIG_DWC_ETH_QOS 161 return 0; 162 #else 163 return designware_eth_ofdata_to_platdata(dev); 164 #endif 165 } 166 167 #ifndef CONFIG_DWC_ETH_QOS 168 static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 169 struct rockchip_eth_dev *dev) 170 { 171 struct dw_eth_dev *priv = &dev->dw; 172 struct px30_grf *grf; 173 struct clk clk_speed; 174 int speed, ret; 175 enum { 176 PX30_GMAC_SPEED_SHIFT = 0x2, 177 PX30_GMAC_SPEED_MASK = BIT(2), 178 PX30_GMAC_SPEED_10M = 0, 179 PX30_GMAC_SPEED_100M = BIT(2), 180 }; 181 182 ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 183 &clk_speed); 184 if (ret) 185 return ret; 186 187 switch (priv->phydev->speed) { 188 case 10: 189 speed = PX30_GMAC_SPEED_10M; 190 ret = clk_set_rate(&clk_speed, 2500000); 191 if (ret) 192 return ret; 193 break; 194 case 100: 195 speed = PX30_GMAC_SPEED_100M; 196 ret = clk_set_rate(&clk_speed, 25000000); 197 if (ret) 198 return ret; 199 break; 200 default: 201 debug("Unknown phy speed: %d\n", priv->phydev->speed); 202 return -EINVAL; 203 } 204 205 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 206 rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 207 208 return 0; 209 } 210 211 static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 212 struct rockchip_eth_dev *dev) 213 { 214 struct dw_eth_dev *priv = &dev->dw; 215 struct clk clk_speed; 216 int ret; 217 218 ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 219 &clk_speed); 220 if (ret) 221 return ret; 222 223 switch (priv->phydev->speed) { 224 case 10: 225 ret = clk_set_rate(&clk_speed, 2500000); 226 if (ret) 227 return ret; 228 break; 229 case 100: 230 ret = clk_set_rate(&clk_speed, 25000000); 231 if (ret) 232 return ret; 233 break; 234 case 1000: 235 ret = clk_set_rate(&clk_speed, 125000000); 236 if (ret) 237 return ret; 238 break; 239 default: 240 debug("Unknown phy speed: %d\n", priv->phydev->speed); 241 return -EINVAL; 242 } 243 244 return 0; 245 } 246 247 static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 248 struct rockchip_eth_dev *dev) 249 { 250 struct dw_eth_dev *priv = &dev->dw; 251 struct rk322x_grf *grf; 252 int clk; 253 enum { 254 RK3228_GMAC_CLK_SEL_SHIFT = 8, 255 RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 256 RK3228_GMAC_CLK_SEL_125M = 0 << 8, 257 RK3228_GMAC_CLK_SEL_25M = 3 << 8, 258 RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 259 260 RK3228_GMAC_RMII_CLK_MASK = BIT(7), 261 RK3228_GMAC_RMII_CLK_2_5M = 0, 262 RK3228_GMAC_RMII_CLK_25M = BIT(7), 263 264 RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 265 RK3228_GMAC_RMII_SPEED_10 = 0, 266 RK3228_GMAC_RMII_SPEED_100 = BIT(2), 267 }; 268 269 switch (priv->phydev->speed) { 270 case 10: 271 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 272 (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 273 RK3228_GMAC_CLK_SEL_2_5M; 274 break; 275 case 100: 276 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 277 (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 278 RK3228_GMAC_CLK_SEL_25M; 279 break; 280 case 1000: 281 clk = RK3228_GMAC_CLK_SEL_125M; 282 break; 283 default: 284 debug("Unknown phy speed: %d\n", priv->phydev->speed); 285 return -EINVAL; 286 } 287 288 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 289 rk_clrsetreg(&grf->mac_con[1], 290 RK3228_GMAC_CLK_SEL_MASK | 291 RK3228_GMAC_RMII_CLK_MASK | 292 RK3228_GMAC_RMII_SPEED_MASK, 293 clk); 294 295 return 0; 296 } 297 298 static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 299 struct rockchip_eth_dev *dev) 300 { 301 struct dw_eth_dev *priv = &dev->dw; 302 struct rk3288_grf *grf; 303 int clk; 304 305 switch (priv->phydev->speed) { 306 case 10: 307 clk = RK3288_GMAC_CLK_SEL_2_5M; 308 break; 309 case 100: 310 clk = RK3288_GMAC_CLK_SEL_25M; 311 break; 312 case 1000: 313 clk = RK3288_GMAC_CLK_SEL_125M; 314 break; 315 default: 316 debug("Unknown phy speed: %d\n", priv->phydev->speed); 317 return -EINVAL; 318 } 319 320 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 321 rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 322 323 return 0; 324 } 325 326 static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 327 struct rockchip_eth_dev *dev) 328 { 329 struct dw_eth_dev *priv = &dev->dw; 330 struct rk3308_grf *grf; 331 struct clk clk_speed; 332 int speed, ret; 333 enum { 334 RK3308_GMAC_SPEED_SHIFT = 0x0, 335 RK3308_GMAC_SPEED_MASK = BIT(0), 336 RK3308_GMAC_SPEED_10M = 0, 337 RK3308_GMAC_SPEED_100M = BIT(0), 338 }; 339 340 ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 341 &clk_speed); 342 if (ret) 343 return ret; 344 345 switch (priv->phydev->speed) { 346 case 10: 347 speed = RK3308_GMAC_SPEED_10M; 348 ret = clk_set_rate(&clk_speed, 2500000); 349 if (ret) 350 return ret; 351 break; 352 case 100: 353 speed = RK3308_GMAC_SPEED_100M; 354 ret = clk_set_rate(&clk_speed, 25000000); 355 if (ret) 356 return ret; 357 break; 358 default: 359 debug("Unknown phy speed: %d\n", priv->phydev->speed); 360 return -EINVAL; 361 } 362 363 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 364 rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 365 366 return 0; 367 } 368 369 static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 370 struct rockchip_eth_dev *dev) 371 { 372 struct dw_eth_dev *priv = &dev->dw; 373 struct rk3328_grf_regs *grf; 374 int clk; 375 enum { 376 RK3328_GMAC_CLK_SEL_SHIFT = 11, 377 RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 378 RK3328_GMAC_CLK_SEL_125M = 0 << 11, 379 RK3328_GMAC_CLK_SEL_25M = 3 << 11, 380 RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 381 382 RK3328_GMAC_RMII_CLK_MASK = BIT(7), 383 RK3328_GMAC_RMII_CLK_2_5M = 0, 384 RK3328_GMAC_RMII_CLK_25M = BIT(7), 385 386 RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 387 RK3328_GMAC_RMII_SPEED_10 = 0, 388 RK3328_GMAC_RMII_SPEED_100 = BIT(2), 389 }; 390 391 switch (priv->phydev->speed) { 392 case 10: 393 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 394 (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 395 RK3328_GMAC_CLK_SEL_2_5M; 396 break; 397 case 100: 398 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 399 (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 400 RK3328_GMAC_CLK_SEL_25M; 401 break; 402 case 1000: 403 clk = RK3328_GMAC_CLK_SEL_125M; 404 break; 405 default: 406 debug("Unknown phy speed: %d\n", priv->phydev->speed); 407 return -EINVAL; 408 } 409 410 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 411 rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 412 RK3328_GMAC_CLK_SEL_MASK | 413 RK3328_GMAC_RMII_CLK_MASK | 414 RK3328_GMAC_RMII_SPEED_MASK, 415 clk); 416 417 return 0; 418 } 419 420 static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 421 struct rockchip_eth_dev *dev) 422 { 423 struct dw_eth_dev *priv = &dev->dw; 424 struct rk3368_grf *grf; 425 int clk; 426 enum { 427 RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 428 RK3368_GMAC_CLK_SEL_25M = 3 << 4, 429 RK3368_GMAC_CLK_SEL_125M = 0 << 4, 430 RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 431 }; 432 433 switch (priv->phydev->speed) { 434 case 10: 435 clk = RK3368_GMAC_CLK_SEL_2_5M; 436 break; 437 case 100: 438 clk = RK3368_GMAC_CLK_SEL_25M; 439 break; 440 case 1000: 441 clk = RK3368_GMAC_CLK_SEL_125M; 442 break; 443 default: 444 debug("Unknown phy speed: %d\n", priv->phydev->speed); 445 return -EINVAL; 446 } 447 448 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 449 rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 450 451 return 0; 452 } 453 454 static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 455 struct rockchip_eth_dev *dev) 456 { 457 struct dw_eth_dev *priv = &dev->dw; 458 struct rk3399_grf_regs *grf; 459 int clk; 460 461 switch (priv->phydev->speed) { 462 case 10: 463 clk = RK3399_GMAC_CLK_SEL_2_5M; 464 break; 465 case 100: 466 clk = RK3399_GMAC_CLK_SEL_25M; 467 break; 468 case 1000: 469 clk = RK3399_GMAC_CLK_SEL_125M; 470 break; 471 default: 472 debug("Unknown phy speed: %d\n", priv->phydev->speed); 473 return -EINVAL; 474 } 475 476 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 477 rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 478 479 return 0; 480 } 481 482 static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 483 struct rockchip_eth_dev *dev) 484 { 485 struct dw_eth_dev *priv = &dev->dw; 486 struct rv1108_grf *grf; 487 int clk, speed; 488 enum { 489 RV1108_GMAC_SPEED_MASK = BIT(2), 490 RV1108_GMAC_SPEED_10M = 0 << 2, 491 RV1108_GMAC_SPEED_100M = 1 << 2, 492 RV1108_GMAC_CLK_SEL_MASK = BIT(7), 493 RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 494 RV1108_GMAC_CLK_SEL_25M = 1 << 7, 495 }; 496 497 switch (priv->phydev->speed) { 498 case 10: 499 clk = RV1108_GMAC_CLK_SEL_2_5M; 500 speed = RV1108_GMAC_SPEED_10M; 501 break; 502 case 100: 503 clk = RV1108_GMAC_CLK_SEL_25M; 504 speed = RV1108_GMAC_SPEED_100M; 505 break; 506 default: 507 debug("Unknown phy speed: %d\n", priv->phydev->speed); 508 return -EINVAL; 509 } 510 511 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 512 rk_clrsetreg(&grf->gmac_con0, 513 RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 514 clk | speed); 515 516 return 0; 517 } 518 #else 519 static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 520 struct rockchip_eth_dev *dev) 521 { 522 struct eqos_priv *priv = &dev->eqos; 523 struct rk3588_php_grf *php_grf; 524 unsigned int div, div_mask; 525 526 enum { 527 RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 528 RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 529 RK3588_GMAC_CLK_RGMII_DIV1 = 0, 530 RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 531 RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 532 RK3588_GMA_CLK_RMII_DIV2 = BIT(2), 533 RK3588_GMAC_CLK_RMII_DIV20 = 0, 534 }; 535 536 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 537 538 switch (priv->phy->speed) { 539 case 10: 540 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 541 div = RK3588_GMAC_CLK_RMII_DIV20; 542 else 543 div = RK3588_GMAC_CLK_RGMII_DIV50; 544 break; 545 case 100: 546 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 547 div = RK3588_GMA_CLK_RMII_DIV2; 548 else 549 div = RK3588_GMAC_CLK_RGMII_DIV5; 550 break; 551 case 1000: 552 if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 553 div = RK3588_GMAC_CLK_RGMII_DIV1; 554 else 555 return -EINVAL; 556 break; 557 default: 558 debug("Unknown phy speed: %d\n", priv->phy->speed); 559 return -EINVAL; 560 } 561 562 if (pdata->bus_id == 1) { 563 div <<= 5; 564 div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 565 } 566 567 rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 568 569 return 0; 570 } 571 572 static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 573 struct rockchip_eth_dev *dev) 574 { 575 struct eqos_priv *priv = &dev->eqos; 576 struct rv1106_grf *grf; 577 unsigned int div; 578 579 enum { 580 RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 581 RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 582 RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 583 RV1106_GMAC_CLK_RMII_DIV20 = 0, 584 }; 585 586 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 587 588 switch (priv->phy->speed) { 589 case 10: 590 div = RV1106_GMAC_CLK_RMII_DIV20; 591 break; 592 case 100: 593 div = RV1106_GMAC_CLK_RMII_DIV2; 594 break; 595 default: 596 debug("Unknown phy speed: %d\n", priv->phy->speed); 597 return -EINVAL; 598 } 599 600 rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 601 602 return 0; 603 } 604 605 static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 606 struct rockchip_eth_dev *dev) 607 { 608 struct eqos_priv *priv = &dev->eqos; 609 struct clk clk_speed; 610 int ret; 611 612 ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 613 &clk_speed); 614 if (ret) { 615 printf("%s can't get clk_mac_speed clock (ret=%d):\n", 616 __func__, ret); 617 return ret; 618 } 619 620 switch ( priv->phy->speed) { 621 case 10: 622 ret = clk_set_rate(&clk_speed, 2500000); 623 if (ret) 624 return ret; 625 break; 626 case 100: 627 ret = clk_set_rate(&clk_speed, 25000000); 628 if (ret) 629 return ret; 630 break; 631 case 1000: 632 ret = clk_set_rate(&clk_speed, 125000000); 633 if (ret) 634 return ret; 635 break; 636 default: 637 debug("Unknown phy speed: %d\n", priv->phy->speed); 638 return -EINVAL; 639 } 640 641 return 0; 642 } 643 #endif 644 645 #ifndef CONFIG_DWC_ETH_QOS 646 static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 647 { 648 struct px30_grf *grf; 649 enum { 650 px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 651 px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 652 px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 653 }; 654 655 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 656 657 rk_clrsetreg(&grf->mac_con1, 658 px30_GMAC_PHY_INTF_SEL_MASK, 659 px30_GMAC_PHY_INTF_SEL_RMII); 660 } 661 662 static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 663 { 664 struct rk1808_grf *grf; 665 enum { 666 RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 667 RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 668 RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 669 670 RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 671 RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 672 RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 673 674 RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 675 RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 676 RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 677 }; 678 enum { 679 RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 680 RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 681 682 RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 683 RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 684 }; 685 686 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 687 rk_clrsetreg(&grf->mac_con1, 688 RK1808_GMAC_PHY_INTF_SEL_MASK | 689 RK1808_RXCLK_DLY_ENA_GMAC_MASK | 690 RK1808_TXCLK_DLY_ENA_GMAC_MASK, 691 RK1808_GMAC_PHY_INTF_SEL_RGMII | 692 RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 693 RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 694 695 rk_clrsetreg(&grf->mac_con0, 696 RK1808_CLK_RX_DL_CFG_GMAC_MASK | 697 RK1808_CLK_TX_DL_CFG_GMAC_MASK, 698 (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) | 699 (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT)); 700 } 701 702 static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 703 { 704 struct rk322x_grf *grf; 705 enum { 706 RK3228_RMII_MODE_SHIFT = 10, 707 RK3228_RMII_MODE_MASK = BIT(10), 708 709 RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 710 RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 711 RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 712 713 RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 714 RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 715 RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 716 717 RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 718 RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 719 RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 720 }; 721 enum { 722 RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 723 RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 724 725 RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 726 RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 727 }; 728 729 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 730 rk_clrsetreg(&grf->mac_con[1], 731 RK3228_RMII_MODE_MASK | 732 RK3228_GMAC_PHY_INTF_SEL_MASK | 733 RK3228_RXCLK_DLY_ENA_GMAC_MASK | 734 RK3228_TXCLK_DLY_ENA_GMAC_MASK, 735 RK3228_GMAC_PHY_INTF_SEL_RGMII | 736 RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 737 RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 738 739 rk_clrsetreg(&grf->mac_con[0], 740 RK3228_CLK_RX_DL_CFG_GMAC_MASK | 741 RK3228_CLK_TX_DL_CFG_GMAC_MASK, 742 pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 743 pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 744 } 745 746 static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 747 { 748 struct rk322x_grf *grf; 749 enum { 750 RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 751 RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 752 RK3228_RMII_MODE_MASK = BIT(10), 753 RK3228_RMII_MODE_SEL = BIT(10), 754 RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 755 RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 756 }; 757 758 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 759 rk_clrsetreg(&grf->mac_con[1], 760 RK3228_GRF_CON_RMII_MODE_MASK | 761 RK3228_RMII_MODE_MASK | 762 RK3228_GMAC_PHY_INTF_SEL_MASK, 763 RK3228_GRF_CON_RMII_MODE_SEL | 764 RK3228_RMII_MODE_SEL | 765 RK3228_GMAC_PHY_INTF_SEL_RMII); 766 } 767 768 static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 769 { 770 struct rk3288_grf *grf; 771 772 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 773 rk_clrsetreg(&grf->soc_con1, 774 RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 775 RK3288_GMAC_PHY_INTF_SEL_RGMII); 776 777 rk_clrsetreg(&grf->soc_con3, 778 RK3288_RXCLK_DLY_ENA_GMAC_MASK | 779 RK3288_TXCLK_DLY_ENA_GMAC_MASK | 780 RK3288_CLK_RX_DL_CFG_GMAC_MASK | 781 RK3288_CLK_TX_DL_CFG_GMAC_MASK, 782 RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 783 RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 784 pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 785 pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 786 } 787 788 static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 789 { 790 struct rk3308_grf *grf; 791 enum { 792 RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 793 RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 794 RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 795 }; 796 797 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 798 799 rk_clrsetreg(&grf->mac_con0, 800 RK3308_GMAC_PHY_INTF_SEL_MASK, 801 RK3308_GMAC_PHY_INTF_SEL_RMII); 802 } 803 804 static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 805 { 806 struct rk3328_grf_regs *grf; 807 enum { 808 RK3328_RMII_MODE_SHIFT = 9, 809 RK3328_RMII_MODE_MASK = BIT(9), 810 811 RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 812 RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 813 RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 814 815 RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 816 RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 817 RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 818 819 RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 820 RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 821 RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 822 }; 823 enum { 824 RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 825 RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 826 827 RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 828 RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 829 }; 830 831 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 832 rk_clrsetreg(&grf->mac_con[1], 833 RK3328_RMII_MODE_MASK | 834 RK3328_GMAC_PHY_INTF_SEL_MASK | 835 RK3328_RXCLK_DLY_ENA_GMAC_MASK | 836 RK3328_TXCLK_DLY_ENA_GMAC_MASK, 837 RK3328_GMAC_PHY_INTF_SEL_RGMII | 838 RK3328_RXCLK_DLY_ENA_GMAC_MASK | 839 RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 840 841 rk_clrsetreg(&grf->mac_con[0], 842 RK3328_CLK_RX_DL_CFG_GMAC_MASK | 843 RK3328_CLK_TX_DL_CFG_GMAC_MASK, 844 pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 845 pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 846 } 847 848 static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 849 { 850 struct rk3328_grf_regs *grf; 851 enum { 852 RK3328_RMII_MODE_MASK = BIT(9), 853 RK3328_RMII_MODE = BIT(9), 854 855 RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 856 RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 857 }; 858 859 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 860 rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 861 RK3328_RMII_MODE_MASK | 862 RK3328_GMAC_PHY_INTF_SEL_MASK, 863 RK3328_GMAC_PHY_INTF_SEL_RMII | 864 RK3328_RMII_MODE); 865 } 866 867 static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 868 { 869 struct rk3368_grf *grf; 870 enum { 871 RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 872 RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 873 RK3368_RMII_MODE_MASK = BIT(6), 874 RK3368_RMII_MODE = BIT(6), 875 }; 876 enum { 877 RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 878 RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 879 RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 880 RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 881 RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 882 RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 883 RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 884 RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 885 RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 886 RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 887 }; 888 889 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 890 rk_clrsetreg(&grf->soc_con15, 891 RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 892 RK3368_GMAC_PHY_INTF_SEL_RGMII); 893 894 rk_clrsetreg(&grf->soc_con16, 895 RK3368_RXCLK_DLY_ENA_GMAC_MASK | 896 RK3368_TXCLK_DLY_ENA_GMAC_MASK | 897 RK3368_CLK_RX_DL_CFG_GMAC_MASK | 898 RK3368_CLK_TX_DL_CFG_GMAC_MASK, 899 RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 900 RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 901 (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) | 902 (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT)); 903 } 904 905 static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 906 { 907 struct rk3399_grf_regs *grf; 908 909 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 910 911 rk_clrsetreg(&grf->soc_con5, 912 RK3399_GMAC_PHY_INTF_SEL_MASK, 913 RK3399_GMAC_PHY_INTF_SEL_RGMII); 914 915 rk_clrsetreg(&grf->soc_con6, 916 RK3399_RXCLK_DLY_ENA_GMAC_MASK | 917 RK3399_TXCLK_DLY_ENA_GMAC_MASK | 918 RK3399_CLK_RX_DL_CFG_GMAC_MASK | 919 RK3399_CLK_TX_DL_CFG_GMAC_MASK, 920 RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 921 RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 922 (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) | 923 (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT)); 924 } 925 926 static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 927 { 928 struct rv1108_grf *grf; 929 930 enum { 931 RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 932 RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 933 }; 934 935 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 936 rk_clrsetreg(&grf->gmac_con0, 937 RV1108_GMAC_PHY_INTF_SEL_MASK, 938 RV1108_GMAC_PHY_INTF_SEL_RMII); 939 } 940 941 static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 942 { 943 struct rk322x_grf *grf; 944 enum { 945 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 946 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 947 }; 948 enum { 949 RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 950 RK3228_MACPHY_CFG_CLK_50M = BIT(14), 951 952 RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 953 RK3228_MACPHY_RMII_MODE = BIT(6), 954 955 RK3228_MACPHY_ENABLE_MASK = BIT(0), 956 RK3228_MACPHY_DISENABLE = 0, 957 RK3228_MACPHY_ENABLE = BIT(0), 958 }; 959 enum { 960 RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 961 RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 962 }; 963 enum { 964 RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 965 RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 966 }; 967 968 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 969 rk_clrsetreg(&grf->con_iomux, 970 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 971 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 972 973 rk_clrsetreg(&grf->macphy_con[2], 974 RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 975 RK3228_RK_GRF_CON2_MACPHY_ID); 976 977 rk_clrsetreg(&grf->macphy_con[3], 978 RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 979 RK3228_RK_GRF_CON3_MACPHY_ID); 980 981 /* disabled before trying to reset it &*/ 982 rk_clrsetreg(&grf->macphy_con[0], 983 RK3228_MACPHY_CFG_CLK_50M_MASK | 984 RK3228_MACPHY_RMII_MODE_MASK | 985 RK3228_MACPHY_ENABLE_MASK, 986 RK3228_MACPHY_CFG_CLK_50M | 987 RK3228_MACPHY_RMII_MODE | 988 RK3228_MACPHY_DISENABLE); 989 990 reset_assert(&pdata->phy_reset); 991 udelay(10); 992 reset_deassert(&pdata->phy_reset); 993 udelay(10); 994 995 rk_clrsetreg(&grf->macphy_con[0], 996 RK3228_MACPHY_ENABLE_MASK, 997 RK3228_MACPHY_ENABLE); 998 udelay(30 * 1000); 999 } 1000 1001 static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1002 { 1003 struct rk3328_grf_regs *grf; 1004 enum { 1005 RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1006 RK3328_GRF_CON_RMII_MODE = BIT(9), 1007 }; 1008 enum { 1009 RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1010 RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1011 1012 RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1013 RK3328_MACPHY_RMII_MODE = BIT(6), 1014 1015 RK3328_MACPHY_ENABLE_MASK = BIT(0), 1016 RK3328_MACPHY_DISENABLE = 0, 1017 RK3328_MACPHY_ENABLE = BIT(0), 1018 }; 1019 enum { 1020 RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1021 RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1022 }; 1023 enum { 1024 RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1025 RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1026 }; 1027 1028 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1029 rk_clrsetreg(&grf->macphy_con[1], 1030 RK3328_GRF_CON_RMII_MODE_MASK, 1031 RK3328_GRF_CON_RMII_MODE); 1032 1033 rk_clrsetreg(&grf->macphy_con[2], 1034 RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1035 RK3328_RK_GRF_CON2_MACPHY_ID); 1036 1037 rk_clrsetreg(&grf->macphy_con[3], 1038 RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1039 RK3328_RK_GRF_CON3_MACPHY_ID); 1040 1041 /* disabled before trying to reset it &*/ 1042 rk_clrsetreg(&grf->macphy_con[0], 1043 RK3328_MACPHY_CFG_CLK_50M_MASK | 1044 RK3328_MACPHY_RMII_MODE_MASK | 1045 RK3328_MACPHY_ENABLE_MASK, 1046 RK3328_MACPHY_CFG_CLK_50M | 1047 RK3328_MACPHY_RMII_MODE | 1048 RK3328_MACPHY_DISENABLE); 1049 1050 reset_assert(&pdata->phy_reset); 1051 udelay(10); 1052 reset_deassert(&pdata->phy_reset); 1053 udelay(10); 1054 1055 rk_clrsetreg(&grf->macphy_con[0], 1056 RK3328_MACPHY_ENABLE_MASK, 1057 RK3328_MACPHY_ENABLE); 1058 udelay(30 * 1000); 1059 } 1060 1061 #else 1062 static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1063 { 1064 struct rk3568_grf *grf; 1065 void *con1; 1066 1067 enum { 1068 RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 1069 RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1070 RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1071 }; 1072 1073 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1074 1075 if (pdata->bus_id == 1) 1076 con1 = &grf->mac1_con1; 1077 else 1078 con1 = &grf->mac0_con1; 1079 1080 rk_clrsetreg(con1, 1081 RK3568_GMAC_PHY_INTF_SEL_MASK, 1082 RK3568_GMAC_PHY_INTF_SEL_RMII); 1083 } 1084 1085 static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1086 { 1087 struct rk3568_grf *grf; 1088 void *con0, *con1; 1089 1090 enum { 1091 RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 1092 RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1093 RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1094 1095 RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 1096 RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1097 RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 1098 1099 RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 1100 RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1101 RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 1102 }; 1103 1104 enum { 1105 RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1106 RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1107 1108 RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1109 RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1110 }; 1111 1112 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1113 1114 if (pdata->bus_id == 1) { 1115 con0 = &grf->mac1_con0; 1116 con1 = &grf->mac1_con1; 1117 } else { 1118 con0 = &grf->mac0_con0; 1119 con1 = &grf->mac0_con1; 1120 } 1121 1122 rk_clrsetreg(con0, 1123 RK3568_CLK_RX_DL_CFG_GMAC_MASK | 1124 RK3568_CLK_TX_DL_CFG_GMAC_MASK, 1125 (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) | 1126 (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT)); 1127 1128 rk_clrsetreg(con1, 1129 RK3568_TXCLK_DLY_ENA_GMAC_MASK | 1130 RK3568_RXCLK_DLY_ENA_GMAC_MASK | 1131 RK3568_GMAC_PHY_INTF_SEL_MASK, 1132 RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 1133 RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 1134 RK3568_GMAC_PHY_INTF_SEL_RGMII); 1135 } 1136 1137 static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1138 { 1139 unsigned int intf_sel, intf_sel_mask; 1140 unsigned int clk_mode, clk_mode_mask; 1141 struct rk3588_php_grf *php_grf; 1142 1143 enum { 1144 RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1145 RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1146 RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1147 }; 1148 1149 enum { 1150 RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1151 RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1152 RK3588_GMAC_CLK_RMII_MODE = 0x1, 1153 }; 1154 1155 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1156 1157 if (pdata->bus_id == 1) { 1158 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1159 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1160 clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1161 clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1162 } else { 1163 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1164 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1165 clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1166 clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1167 } 1168 1169 rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1170 rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1171 } 1172 1173 static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1174 { 1175 unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1176 unsigned int intf_sel, intf_sel_mask; 1177 unsigned int clk_mode, clk_mode_mask; 1178 unsigned int rx_delay; 1179 struct rk3588_php_grf *php_grf; 1180 struct rk3588_sys_grf *grf; 1181 void *offset_con; 1182 1183 enum { 1184 RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1185 RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1186 RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1187 1188 RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1189 RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1190 RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1191 1192 RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1193 RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1194 RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1195 }; 1196 1197 enum { 1198 RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1199 RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1200 1201 RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1202 RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1203 }; 1204 1205 enum { 1206 RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1207 RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1208 RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1209 }; 1210 1211 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1212 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1213 1214 if (pdata->rx_delay < 0) { 1215 rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1216 rx_delay = 0; 1217 } else { 1218 rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1219 rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1220 } 1221 1222 if (pdata->bus_id == 1) { 1223 offset_con = &grf->soc_con9; 1224 rx_enable = rx_delay << 2; 1225 rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1226 tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1227 tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1228 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1229 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1230 clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1231 clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1232 } else { 1233 offset_con = &grf->soc_con8; 1234 rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1235 tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1236 tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1237 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1238 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1239 clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1240 clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1241 } 1242 1243 rk_clrsetreg(offset_con, 1244 RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1245 RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1246 (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) | 1247 rx_delay); 1248 1249 rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1250 tx_enable | rx_enable); 1251 1252 rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1253 rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1254 } 1255 1256 static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1257 { 1258 struct rv1106_grf *grf; 1259 unsigned char bgs[1] = {0}; 1260 1261 enum { 1262 RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1263 RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1264 }; 1265 1266 enum { 1267 RV1106_MACPHY_ENABLE_MASK = BIT(1), 1268 RV1106_MACPHY_DISENABLE = BIT(1), 1269 RV1106_MACPHY_ENABLE = 0, 1270 RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 1271 RV1106_MACPHY_XMII_SEL = BIT(6), 1272 RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 1273 RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 1274 RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 1275 RV1106_MACPHY_PHY_ID = BIT(11), 1276 }; 1277 1278 enum { 1279 RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 1280 RV1106_MACPHY_BGS = BIT(2), 1281 }; 1282 1283 #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1284 struct udevice *dev; 1285 u32 regs[2] = {0}; 1286 ofnode node; 1287 int ret = 0; 1288 1289 /* retrieve the device */ 1290 if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1291 ret = uclass_get_device_by_driver(UCLASS_MISC, 1292 DM_GET_DRIVER(rockchip_efuse), 1293 &dev); 1294 else 1295 ret = uclass_get_device_by_driver(UCLASS_MISC, 1296 DM_GET_DRIVER(rockchip_otp), 1297 &dev); 1298 if (!ret) { 1299 node = dev_read_subnode(dev, "macphy-bgs"); 1300 if (ofnode_valid(node)) { 1301 if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1302 /* read the bgs from the efuses */ 1303 ret = misc_read(dev, regs[0], &bgs, 1); 1304 if (ret) { 1305 printf("read bgs from efuse/otp failed, ret=%d\n", 1306 ret); 1307 bgs[0] = 0; 1308 } 1309 } 1310 } 1311 } 1312 #endif 1313 1314 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1315 1316 reset_assert(&pdata->phy_reset); 1317 udelay(20); 1318 rk_clrsetreg(&grf->macphy_con0, 1319 RV1106_MACPHY_ENABLE_MASK | 1320 RV1106_MACPHY_XMII_SEL_MASK | 1321 RV1106_MACPHY_24M_CLK_SEL_MASK | 1322 RV1106_MACPHY_PHY_ID_MASK, 1323 RV1106_MACPHY_ENABLE | 1324 RV1106_MACPHY_XMII_SEL | 1325 RV1106_MACPHY_24M_CLK_SEL_24M | 1326 RV1106_MACPHY_PHY_ID); 1327 1328 rk_clrsetreg(&grf->macphy_con1, 1329 RV1106_MACPHY_BGS_MASK, 1330 bgs[0]); 1331 udelay(20); 1332 reset_deassert(&pdata->phy_reset); 1333 udelay(30 * 1000); 1334 } 1335 1336 static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1337 { 1338 struct rv1106_grf *grf; 1339 enum { 1340 RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1341 RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1342 }; 1343 1344 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1345 rk_clrsetreg(&grf->gmac_clk_con, 1346 RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 1347 RV1106_VOGRF_GMAC_CLK_RMII_MODE); 1348 }; 1349 1350 static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1351 { 1352 struct rv1126_grf *grf; 1353 1354 enum { 1355 RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1356 RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1357 RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1358 }; 1359 1360 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1361 1362 rk_clrsetreg(&grf->mac_con0, 1363 RV1126_GMAC_PHY_INTF_SEL_MASK, 1364 RV1126_GMAC_PHY_INTF_SEL_RMII); 1365 } 1366 1367 static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1368 { 1369 struct rv1126_grf *grf; 1370 1371 enum { 1372 RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1373 RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1374 RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1375 1376 RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1377 RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1378 RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1379 1380 RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1381 RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1382 RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1383 1384 RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1385 RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1386 RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1387 1388 RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1389 RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1390 RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1391 }; 1392 enum { 1393 RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1394 RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1395 1396 RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1397 RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1398 }; 1399 enum { 1400 RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1401 RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1402 1403 RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1404 RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1405 }; 1406 1407 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1408 1409 rk_clrsetreg(&grf->mac_con0, 1410 RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1411 RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1412 RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1413 RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1414 RV1126_GMAC_PHY_INTF_SEL_MASK, 1415 RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1416 RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1417 RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1418 RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1419 RV1126_GMAC_PHY_INTF_SEL_RGMII); 1420 1421 rk_clrsetreg(&grf->mac_con1, 1422 RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1423 RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1424 (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) | 1425 (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT)); 1426 1427 rk_clrsetreg(&grf->mac_con2, 1428 RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1429 RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1430 (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) | 1431 (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT)); 1432 } 1433 #endif 1434 1435 #ifdef CONFIG_DWC_ETH_QOS 1436 static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1437 { 1438 struct rk3588_php_grf *php_grf; 1439 unsigned int val, mask; 1440 1441 enum { 1442 RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 1443 RK3588_GMAC_CLK_SELET_MASK = BIT(4), 1444 RK3588_GMAC_CLK_SELET_CRU = BIT(4), 1445 RK3588_GMAC_CLK_SELET_IO = 0, 1446 }; 1447 1448 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1449 val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 1450 RK3588_GMAC_CLK_SELET_CRU; 1451 mask = RK3588_GMAC_CLK_SELET_MASK; 1452 1453 if (pdata->bus_id == 1) { 1454 val <<= 5; 1455 mask <<= 5; 1456 } 1457 1458 rk_clrsetreg(&php_grf->clk_con1, mask, val); 1459 } 1460 #endif 1461 1462 static int gmac_rockchip_probe(struct udevice *dev) 1463 { 1464 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1465 struct rk_gmac_ops *ops = 1466 (struct rk_gmac_ops *)dev_get_driver_data(dev); 1467 #ifdef CONFIG_DWC_ETH_QOS 1468 struct eqos_config *config; 1469 #else 1470 struct dw_eth_pdata *dw_pdata; 1471 #endif 1472 struct eth_pdata *eth_pdata; 1473 struct clk clk; 1474 ulong rate; 1475 int ret; 1476 1477 #ifdef CONFIG_DWC_ETH_QOS 1478 eth_pdata = &pdata->eth_pdata; 1479 config = (struct eqos_config *)&ops->config; 1480 memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 1481 eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 1482 #else 1483 dw_pdata = &pdata->dw_eth_pdata; 1484 eth_pdata = &dw_pdata->eth_pdata; 1485 #endif 1486 pdata->bus_id = dev->seq; 1487 1488 /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 1489 ret = clk_set_defaults(dev); 1490 if (ret) 1491 debug("%s clk_set_defaults failed %d\n", __func__, ret); 1492 1493 ret = clk_get_by_index(dev, 0, &clk); 1494 if (ret) 1495 return ret; 1496 1497 pdata->phy_interface = eth_pdata->phy_interface; 1498 1499 if (ops->set_clock_selection) 1500 ops->set_clock_selection(pdata); 1501 1502 if (pdata->integrated_phy && ops->integrated_phy_powerup) 1503 ops->integrated_phy_powerup(pdata); 1504 1505 switch (eth_pdata->phy_interface) { 1506 case PHY_INTERFACE_MODE_RGMII: 1507 case PHY_INTERFACE_MODE_RGMII_RXID: 1508 /* 1509 * If the gmac clock is from internal pll, need to set and 1510 * check the return value for gmac clock at RGMII mode. If 1511 * the gmac clock is from external source, the clock rate 1512 * is not set, because of it is bypassed. 1513 */ 1514 if (!pdata->clock_input) { 1515 rate = clk_set_rate(&clk, 125000000); 1516 if (rate != 125000000) 1517 return -EINVAL; 1518 } 1519 1520 if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 1521 pdata->rx_delay = -1; 1522 1523 /* Set to RGMII mode */ 1524 if (ops->set_to_rgmii) 1525 ops->set_to_rgmii(pdata); 1526 else 1527 return -EPERM; 1528 1529 break; 1530 case PHY_INTERFACE_MODE_RMII: 1531 /* The commet is the same as RGMII mode */ 1532 if (!pdata->clock_input) { 1533 rate = clk_set_rate(&clk, 50000000); 1534 if (rate != 50000000) 1535 return -EINVAL; 1536 } 1537 1538 /* Set to RMII mode */ 1539 if (ops->set_to_rmii) 1540 ops->set_to_rmii(pdata); 1541 1542 break; 1543 default: 1544 debug("NO interface defined!\n"); 1545 return -ENXIO; 1546 } 1547 1548 #ifdef CONFIG_DWC_ETH_QOS 1549 return eqos_probe(dev); 1550 #else 1551 return designware_eth_probe(dev); 1552 #endif 1553 } 1554 1555 static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 1556 { 1557 #if defined(CONFIG_DWC_ETH_QOS) 1558 return eqos_write_hwaddr(dev); 1559 #else 1560 return designware_eth_write_hwaddr(dev); 1561 #endif 1562 } 1563 1564 static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 1565 int length) 1566 { 1567 #ifdef CONFIG_DWC_ETH_QOS 1568 return eqos_free_pkt(dev, packet, length); 1569 #else 1570 return designware_eth_free_pkt(dev, packet, length); 1571 #endif 1572 } 1573 1574 static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 1575 int length) 1576 { 1577 #ifdef CONFIG_DWC_ETH_QOS 1578 return eqos_send(dev, packet, length); 1579 #else 1580 return designware_eth_send(dev, packet, length); 1581 #endif 1582 } 1583 1584 static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 1585 uchar **packetp) 1586 { 1587 #ifdef CONFIG_DWC_ETH_QOS 1588 return eqos_recv(dev, flags, packetp); 1589 #else 1590 return designware_eth_recv(dev, flags, packetp); 1591 #endif 1592 } 1593 1594 static int gmac_rockchip_eth_start(struct udevice *dev) 1595 { 1596 struct rockchip_eth_dev *priv = dev_get_priv(dev); 1597 struct rk_gmac_ops *ops = 1598 (struct rk_gmac_ops *)dev_get_driver_data(dev); 1599 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 1600 #ifndef CONFIG_DWC_ETH_QOS 1601 struct dw_eth_pdata *dw_pdata; 1602 struct eth_pdata *eth_pdata; 1603 #endif 1604 int ret; 1605 1606 #ifdef CONFIG_DWC_ETH_QOS 1607 ret = eqos_init(dev); 1608 #else 1609 dw_pdata = &pdata->dw_eth_pdata; 1610 eth_pdata = &dw_pdata->eth_pdata; 1611 ret = designware_eth_init((struct dw_eth_dev *)priv, 1612 eth_pdata->enetaddr); 1613 #endif 1614 if (ret) 1615 return ret; 1616 ret = ops->fix_mac_speed(pdata, priv); 1617 if (ret) 1618 return ret; 1619 1620 #ifdef CONFIG_DWC_ETH_QOS 1621 eqos_enable(dev); 1622 #else 1623 ret = designware_eth_enable((struct dw_eth_dev *)priv); 1624 if (ret) 1625 return ret; 1626 #endif 1627 1628 return 0; 1629 } 1630 1631 static void gmac_rockchip_eth_stop(struct udevice *dev) 1632 { 1633 #ifdef CONFIG_DWC_ETH_QOS 1634 eqos_stop(dev); 1635 #else 1636 designware_eth_stop(dev); 1637 #endif 1638 } 1639 1640 const struct eth_ops gmac_rockchip_eth_ops = { 1641 .start = gmac_rockchip_eth_start, 1642 .send = gmac_rockchip_eth_send, 1643 .recv = gmac_rockchip_eth_recv, 1644 .free_pkt = gmac_rockchip_eth_free_pkt, 1645 .stop = gmac_rockchip_eth_stop, 1646 .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 1647 }; 1648 1649 #ifndef CONFIG_DWC_ETH_QOS 1650 const struct rk_gmac_ops px30_gmac_ops = { 1651 .fix_mac_speed = px30_gmac_fix_mac_speed, 1652 .set_to_rmii = px30_gmac_set_to_rmii, 1653 }; 1654 1655 const struct rk_gmac_ops rk1808_gmac_ops = { 1656 .fix_mac_speed = rk1808_gmac_fix_mac_speed, 1657 .set_to_rgmii = rk1808_gmac_set_to_rgmii, 1658 }; 1659 1660 const struct rk_gmac_ops rk3228_gmac_ops = { 1661 .fix_mac_speed = rk3228_gmac_fix_mac_speed, 1662 .set_to_rmii = rk3228_gmac_set_to_rmii, 1663 .set_to_rgmii = rk3228_gmac_set_to_rgmii, 1664 .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 1665 }; 1666 1667 const struct rk_gmac_ops rk3288_gmac_ops = { 1668 .fix_mac_speed = rk3288_gmac_fix_mac_speed, 1669 .set_to_rgmii = rk3288_gmac_set_to_rgmii, 1670 }; 1671 1672 const struct rk_gmac_ops rk3308_gmac_ops = { 1673 .fix_mac_speed = rk3308_gmac_fix_mac_speed, 1674 .set_to_rmii = rk3308_gmac_set_to_rmii, 1675 }; 1676 1677 const struct rk_gmac_ops rk3328_gmac_ops = { 1678 .fix_mac_speed = rk3328_gmac_fix_mac_speed, 1679 .set_to_rmii = rk3328_gmac_set_to_rmii, 1680 .set_to_rgmii = rk3328_gmac_set_to_rgmii, 1681 .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 1682 }; 1683 1684 const struct rk_gmac_ops rk3368_gmac_ops = { 1685 .fix_mac_speed = rk3368_gmac_fix_mac_speed, 1686 .set_to_rgmii = rk3368_gmac_set_to_rgmii, 1687 }; 1688 1689 const struct rk_gmac_ops rk3399_gmac_ops = { 1690 .fix_mac_speed = rk3399_gmac_fix_mac_speed, 1691 .set_to_rgmii = rk3399_gmac_set_to_rgmii, 1692 }; 1693 1694 const struct rk_gmac_ops rv1108_gmac_ops = { 1695 .fix_mac_speed = rv1108_set_rmii_speed, 1696 .set_to_rmii = rv1108_gmac_set_to_rmii, 1697 }; 1698 #else 1699 const struct rk_gmac_ops rk3568_gmac_ops = { 1700 .fix_mac_speed = rv1126_set_rgmii_speed, 1701 .set_to_rgmii = rk3568_set_to_rgmii, 1702 .set_to_rmii = rk3568_set_to_rmii, 1703 }; 1704 1705 const struct rk_gmac_ops rk3588_gmac_ops = { 1706 .fix_mac_speed = rk3588_set_rgmii_speed, 1707 .set_to_rgmii = rk3588_set_to_rgmii, 1708 .set_to_rmii = rk3588_set_to_rmii, 1709 .set_clock_selection = rk3588_set_clock_selection, 1710 }; 1711 1712 const struct rk_gmac_ops rv1106_gmac_ops = { 1713 .fix_mac_speed = rv1106_set_rmii_speed, 1714 .set_to_rmii = rv1106_set_to_rmii, 1715 .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 1716 }; 1717 1718 const struct rk_gmac_ops rv1126_gmac_ops = { 1719 .fix_mac_speed = rv1126_set_rgmii_speed, 1720 .set_to_rgmii = rv1126_set_to_rgmii, 1721 .set_to_rmii = rv1126_set_to_rmii, 1722 }; 1723 #endif 1724 1725 static const struct udevice_id rockchip_gmac_ids[] = { 1726 #ifndef CONFIG_DWC_ETH_QOS 1727 #ifdef CONFIG_ROCKCHIP_PX30 1728 { .compatible = "rockchip,px30-gmac", 1729 .data = (ulong)&px30_gmac_ops }, 1730 #endif 1731 1732 #ifdef CONFIG_ROCKCHIP_RK1808 1733 { .compatible = "rockchip,rk1808-gmac", 1734 .data = (ulong)&rk1808_gmac_ops }, 1735 #endif 1736 1737 #ifdef CONFIG_ROCKCHIP_RK3228 1738 { .compatible = "rockchip,rk3228-gmac", 1739 .data = (ulong)&rk3228_gmac_ops }, 1740 #endif 1741 1742 #ifdef CONFIG_ROCKCHIP_RK3288 1743 { .compatible = "rockchip,rk3288-gmac", 1744 .data = (ulong)&rk3288_gmac_ops }, 1745 #endif 1746 1747 #ifdef CONFIG_ROCKCHIP_RK3308 1748 { .compatible = "rockchip,rk3308-mac", 1749 .data = (ulong)&rk3308_gmac_ops }, 1750 #endif 1751 1752 #ifdef CONFIG_ROCKCHIP_RK3328 1753 { .compatible = "rockchip,rk3328-gmac", 1754 .data = (ulong)&rk3328_gmac_ops }, 1755 #endif 1756 1757 #ifdef CONFIG_ROCKCHIP_RK3368 1758 { .compatible = "rockchip,rk3368-gmac", 1759 .data = (ulong)&rk3368_gmac_ops }, 1760 #endif 1761 1762 #ifdef CONFIG_ROCKCHIP_RK3399 1763 { .compatible = "rockchip,rk3399-gmac", 1764 .data = (ulong)&rk3399_gmac_ops }, 1765 #endif 1766 1767 #ifdef CONFIG_ROCKCHIP_RV1108 1768 { .compatible = "rockchip,rv1108-gmac", 1769 .data = (ulong)&rv1108_gmac_ops }, 1770 #endif 1771 #else 1772 #ifdef CONFIG_ROCKCHIP_RK3568 1773 { .compatible = "rockchip,rk3568-gmac", 1774 .data = (ulong)&rk3568_gmac_ops }, 1775 #endif 1776 1777 #ifdef CONFIG_ROCKCHIP_RK3588 1778 { .compatible = "rockchip,rk3588-gmac", 1779 .data = (ulong)&rk3588_gmac_ops }, 1780 #endif 1781 1782 #ifdef CONFIG_ROCKCHIP_RV1106 1783 { .compatible = "rockchip,rv1106-gmac", 1784 .data = (ulong)&rv1106_gmac_ops }, 1785 #endif 1786 1787 #ifdef CONFIG_ROCKCHIP_RV1126 1788 { .compatible = "rockchip,rv1126-gmac", 1789 .data = (ulong)&rv1126_gmac_ops }, 1790 #endif 1791 #endif 1792 { } 1793 }; 1794 1795 U_BOOT_DRIVER(eth_gmac_rockchip) = { 1796 .name = "gmac_rockchip", 1797 .id = UCLASS_ETH, 1798 .of_match = rockchip_gmac_ids, 1799 .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 1800 .probe = gmac_rockchip_probe, 1801 .ops = &gmac_rockchip_eth_ops, 1802 .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 1803 .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 1804 .flags = DM_FLAG_ALLOC_PRIV_DMA, 1805 }; 1806