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_rk3506.h> 22 #include <asm/arch/grf_rk3528.h> 23 #include <asm/arch/grf_rk3562.h> 24 #include <asm/arch/ioc_rk3562.h> 25 #include <asm/arch/grf_rk3568.h> 26 #include <asm/arch/grf_rk3588.h> 27 #include <asm/arch/grf_rv1103b.h> 28 #include <asm/arch/grf_rv1106.h> 29 #include <asm/arch/grf_rv1126.h> 30 #include "dwc_eth_qos.h" 31 #else 32 #include <asm/arch/grf_px30.h> 33 #include <asm/arch/grf_rk1808.h> 34 #include <asm/arch/grf_rk322x.h> 35 #include <asm/arch/grf_rk3288.h> 36 #include <asm/arch/grf_rk3308.h> 37 #include <asm/arch/grf_rk3328.h> 38 #include <asm/arch/grf_rk3368.h> 39 #include <asm/arch/grf_rk3399.h> 40 #include <asm/arch/grf_rv1108.h> 41 #include "designware.h" 42 #include <dt-bindings/clock/rk3288-cru.h> 43 #endif 44 #include <dm/pinctrl.h> 45 #include <dm/of_access.h> 46 47 DECLARE_GLOBAL_DATA_PTR; 48 49 struct rockchip_eth_dev { 50 #ifdef CONFIG_DWC_ETH_QOS 51 struct eqos_priv eqos; 52 #else 53 struct dw_eth_dev dw; 54 #endif 55 int phy_interface; 56 }; 57 58 /* 59 * Platform data for the gmac 60 * 61 * dw_eth_pdata: Required platform data for designware driver (must be first) 62 */ 63 struct gmac_rockchip_platdata { 64 #ifndef CONFIG_DWC_ETH_QOS 65 struct dw_eth_pdata dw_eth_pdata; 66 #else 67 struct eth_pdata eth_pdata; 68 #endif 69 struct reset_ctl phy_reset; 70 bool integrated_phy; 71 bool clock_input; 72 int phy_interface; 73 int tx_delay; 74 int rx_delay; 75 int bus_id; 76 }; 77 78 struct rk_gmac_ops { 79 #ifdef CONFIG_DWC_ETH_QOS 80 const struct eqos_config config; 81 #endif 82 int (*fix_mac_speed)(struct gmac_rockchip_platdata *pdata, 83 struct rockchip_eth_dev *dev); 84 void (*set_to_rmii)(struct gmac_rockchip_platdata *pdata); 85 void (*set_to_rgmii)(struct gmac_rockchip_platdata *pdata); 86 void (*set_clock_selection)(struct gmac_rockchip_platdata *pdata); 87 void (*integrated_phy_powerup)(struct gmac_rockchip_platdata *pdata); 88 }; 89 90 #ifdef CONFIG_DWC_ETH_QOS 91 static const struct eqos_config eqos_rockchip_config = { 92 .reg_access_always_ok = false, 93 .mdio_wait = 10000, 94 .swr_wait = 200, 95 .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_NOT_ENABLED, 96 .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_100_150, 97 .ops = &eqos_rockchip_ops, 98 }; 99 #endif 100 101 void gmac_set_rgmii(struct udevice *dev, u32 tx_delay, u32 rx_delay) 102 { 103 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 104 struct rk_gmac_ops *ops = 105 (struct rk_gmac_ops *)dev_get_driver_data(dev); 106 107 pdata->tx_delay = tx_delay; 108 pdata->rx_delay = rx_delay; 109 110 ops->set_to_rgmii(pdata); 111 } 112 113 static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev) 114 { 115 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 116 struct ofnode_phandle_args args; 117 struct udevice *phydev; 118 const char *string; 119 int ret; 120 121 string = dev_read_string(dev, "clock_in_out"); 122 if (!strcmp(string, "input")) 123 pdata->clock_input = true; 124 else 125 pdata->clock_input = false; 126 127 /* If phy-handle property is passed from DT, use it as the PHY */ 128 ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, &args); 129 if (ret) { 130 debug("Cannot get phy phandle: ret=%d\n", ret); 131 pdata->integrated_phy = dev_read_bool(dev, "phy-is-integrated"); 132 } else { 133 debug("Found phy-handle subnode\n"); 134 pdata->integrated_phy = ofnode_read_bool(args.node, 135 "phy-is-integrated"); 136 } 137 138 if (pdata->integrated_phy) { 139 ret = reset_get_by_name(dev, "mac-phy", &pdata->phy_reset); 140 if (ret) { 141 ret = uclass_get_device_by_ofnode(UCLASS_ETH_PHY, args.node, &phydev); 142 if (ret) { 143 debug("Get phydev by ofnode failed: err=%d\n", ret); 144 return ret; 145 } 146 147 ret = reset_get_by_index(phydev, 0, &pdata->phy_reset); 148 if (ret) { 149 debug("No PHY reset control found: ret=%d\n", ret); 150 return ret; 151 } 152 } 153 } 154 155 /* Check the new naming-style first... */ 156 pdata->tx_delay = dev_read_u32_default(dev, "tx_delay", -ENOENT); 157 pdata->rx_delay = dev_read_u32_default(dev, "rx_delay", -ENOENT); 158 159 /* ... and fall back to the old naming style or default, if necessary */ 160 if (pdata->tx_delay == -ENOENT) 161 pdata->tx_delay = dev_read_u32_default(dev, "tx-delay", 0x30); 162 if (pdata->rx_delay == -ENOENT) 163 pdata->rx_delay = dev_read_u32_default(dev, "rx-delay", 0x10); 164 165 #ifdef CONFIG_DWC_ETH_QOS 166 return 0; 167 #else 168 return designware_eth_ofdata_to_platdata(dev); 169 #endif 170 } 171 172 #ifndef CONFIG_DWC_ETH_QOS 173 static int px30_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 174 struct rockchip_eth_dev *dev) 175 { 176 struct dw_eth_dev *priv = &dev->dw; 177 struct px30_grf *grf; 178 struct clk clk_speed; 179 int speed, ret; 180 enum { 181 PX30_GMAC_SPEED_SHIFT = 0x2, 182 PX30_GMAC_SPEED_MASK = BIT(2), 183 PX30_GMAC_SPEED_10M = 0, 184 PX30_GMAC_SPEED_100M = BIT(2), 185 }; 186 187 ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 188 &clk_speed); 189 if (ret) 190 return ret; 191 192 switch (priv->phydev->speed) { 193 case 10: 194 speed = PX30_GMAC_SPEED_10M; 195 ret = clk_set_rate(&clk_speed, 2500000); 196 if (ret) 197 return ret; 198 break; 199 case 100: 200 speed = PX30_GMAC_SPEED_100M; 201 ret = clk_set_rate(&clk_speed, 25000000); 202 if (ret) 203 return ret; 204 break; 205 default: 206 debug("Unknown phy speed: %d\n", priv->phydev->speed); 207 return -EINVAL; 208 } 209 210 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 211 rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed); 212 213 return 0; 214 } 215 216 static int rk1808_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 217 struct rockchip_eth_dev *dev) 218 { 219 struct dw_eth_dev *priv = &dev->dw; 220 struct clk clk_speed; 221 int ret; 222 223 ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 224 &clk_speed); 225 if (ret) 226 return ret; 227 228 switch (priv->phydev->speed) { 229 case 10: 230 ret = clk_set_rate(&clk_speed, 2500000); 231 if (ret) 232 return ret; 233 break; 234 case 100: 235 ret = clk_set_rate(&clk_speed, 25000000); 236 if (ret) 237 return ret; 238 break; 239 case 1000: 240 ret = clk_set_rate(&clk_speed, 125000000); 241 if (ret) 242 return ret; 243 break; 244 default: 245 debug("Unknown phy speed: %d\n", priv->phydev->speed); 246 return -EINVAL; 247 } 248 249 return 0; 250 } 251 252 static int rk3228_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 253 struct rockchip_eth_dev *dev) 254 { 255 struct dw_eth_dev *priv = &dev->dw; 256 struct rk322x_grf *grf; 257 int clk; 258 enum { 259 RK3228_GMAC_CLK_SEL_SHIFT = 8, 260 RK3228_GMAC_CLK_SEL_MASK = GENMASK(9, 8), 261 RK3228_GMAC_CLK_SEL_125M = 0 << 8, 262 RK3228_GMAC_CLK_SEL_25M = 3 << 8, 263 RK3228_GMAC_CLK_SEL_2_5M = 2 << 8, 264 265 RK3228_GMAC_RMII_CLK_MASK = BIT(7), 266 RK3228_GMAC_RMII_CLK_2_5M = 0, 267 RK3228_GMAC_RMII_CLK_25M = BIT(7), 268 269 RK3228_GMAC_RMII_SPEED_MASK = BIT(2), 270 RK3228_GMAC_RMII_SPEED_10 = 0, 271 RK3228_GMAC_RMII_SPEED_100 = BIT(2), 272 }; 273 274 switch (priv->phydev->speed) { 275 case 10: 276 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 277 (RK3228_GMAC_RMII_CLK_2_5M | RK3228_GMAC_RMII_SPEED_10) : 278 RK3228_GMAC_CLK_SEL_2_5M; 279 break; 280 case 100: 281 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 282 (RK3228_GMAC_RMII_CLK_25M | RK3228_GMAC_RMII_SPEED_100) : 283 RK3228_GMAC_CLK_SEL_25M; 284 break; 285 case 1000: 286 clk = RK3228_GMAC_CLK_SEL_125M; 287 break; 288 default: 289 debug("Unknown phy speed: %d\n", priv->phydev->speed); 290 return -EINVAL; 291 } 292 293 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 294 rk_clrsetreg(&grf->mac_con[1], 295 RK3228_GMAC_CLK_SEL_MASK | 296 RK3228_GMAC_RMII_CLK_MASK | 297 RK3228_GMAC_RMII_SPEED_MASK, 298 clk); 299 300 return 0; 301 } 302 303 static int rk3288_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 304 struct rockchip_eth_dev *dev) 305 { 306 struct dw_eth_dev *priv = &dev->dw; 307 struct rk3288_grf *grf; 308 int clk; 309 310 switch (priv->phydev->speed) { 311 case 10: 312 clk = RK3288_GMAC_CLK_SEL_2_5M; 313 break; 314 case 100: 315 clk = RK3288_GMAC_CLK_SEL_25M; 316 break; 317 case 1000: 318 clk = RK3288_GMAC_CLK_SEL_125M; 319 break; 320 default: 321 debug("Unknown phy speed: %d\n", priv->phydev->speed); 322 return -EINVAL; 323 } 324 325 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 326 rk_clrsetreg(&grf->soc_con1, RK3288_GMAC_CLK_SEL_MASK, clk); 327 328 return 0; 329 } 330 331 static int rk3308_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 332 struct rockchip_eth_dev *dev) 333 { 334 struct dw_eth_dev *priv = &dev->dw; 335 struct rk3308_grf *grf; 336 struct clk clk_speed; 337 int speed, ret; 338 enum { 339 RK3308_GMAC_SPEED_SHIFT = 0x0, 340 RK3308_GMAC_SPEED_MASK = BIT(0), 341 RK3308_GMAC_SPEED_10M = 0, 342 RK3308_GMAC_SPEED_100M = BIT(0), 343 }; 344 345 ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed", 346 &clk_speed); 347 if (ret) 348 return ret; 349 350 switch (priv->phydev->speed) { 351 case 10: 352 speed = RK3308_GMAC_SPEED_10M; 353 ret = clk_set_rate(&clk_speed, 2500000); 354 if (ret) 355 return ret; 356 break; 357 case 100: 358 speed = RK3308_GMAC_SPEED_100M; 359 ret = clk_set_rate(&clk_speed, 25000000); 360 if (ret) 361 return ret; 362 break; 363 default: 364 debug("Unknown phy speed: %d\n", priv->phydev->speed); 365 return -EINVAL; 366 } 367 368 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 369 rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed); 370 371 return 0; 372 } 373 374 static int rk3328_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 375 struct rockchip_eth_dev *dev) 376 { 377 struct dw_eth_dev *priv = &dev->dw; 378 struct rk3328_grf_regs *grf; 379 int clk; 380 enum { 381 RK3328_GMAC_CLK_SEL_SHIFT = 11, 382 RK3328_GMAC_CLK_SEL_MASK = GENMASK(12, 11), 383 RK3328_GMAC_CLK_SEL_125M = 0 << 11, 384 RK3328_GMAC_CLK_SEL_25M = 3 << 11, 385 RK3328_GMAC_CLK_SEL_2_5M = 2 << 11, 386 387 RK3328_GMAC_RMII_CLK_MASK = BIT(7), 388 RK3328_GMAC_RMII_CLK_2_5M = 0, 389 RK3328_GMAC_RMII_CLK_25M = BIT(7), 390 391 RK3328_GMAC_RMII_SPEED_MASK = BIT(2), 392 RK3328_GMAC_RMII_SPEED_10 = 0, 393 RK3328_GMAC_RMII_SPEED_100 = BIT(2), 394 }; 395 396 switch (priv->phydev->speed) { 397 case 10: 398 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 399 (RK3328_GMAC_RMII_CLK_2_5M | RK3328_GMAC_RMII_SPEED_10) : 400 RK3328_GMAC_CLK_SEL_2_5M; 401 break; 402 case 100: 403 clk = (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) ? 404 (RK3328_GMAC_RMII_CLK_25M | RK3328_GMAC_RMII_SPEED_100) : 405 RK3328_GMAC_CLK_SEL_25M; 406 break; 407 case 1000: 408 clk = RK3328_GMAC_CLK_SEL_125M; 409 break; 410 default: 411 debug("Unknown phy speed: %d\n", priv->phydev->speed); 412 return -EINVAL; 413 } 414 415 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 416 rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 417 RK3328_GMAC_CLK_SEL_MASK | 418 RK3328_GMAC_RMII_CLK_MASK | 419 RK3328_GMAC_RMII_SPEED_MASK, 420 clk); 421 422 return 0; 423 } 424 425 static int rk3368_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 426 struct rockchip_eth_dev *dev) 427 { 428 struct dw_eth_dev *priv = &dev->dw; 429 struct rk3368_grf *grf; 430 int clk; 431 enum { 432 RK3368_GMAC_CLK_SEL_2_5M = 2 << 4, 433 RK3368_GMAC_CLK_SEL_25M = 3 << 4, 434 RK3368_GMAC_CLK_SEL_125M = 0 << 4, 435 RK3368_GMAC_CLK_SEL_MASK = GENMASK(5, 4), 436 }; 437 438 switch (priv->phydev->speed) { 439 case 10: 440 clk = RK3368_GMAC_CLK_SEL_2_5M; 441 break; 442 case 100: 443 clk = RK3368_GMAC_CLK_SEL_25M; 444 break; 445 case 1000: 446 clk = RK3368_GMAC_CLK_SEL_125M; 447 break; 448 default: 449 debug("Unknown phy speed: %d\n", priv->phydev->speed); 450 return -EINVAL; 451 } 452 453 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 454 rk_clrsetreg(&grf->soc_con15, RK3368_GMAC_CLK_SEL_MASK, clk); 455 456 return 0; 457 } 458 459 static int rk3399_gmac_fix_mac_speed(struct gmac_rockchip_platdata *pdata, 460 struct rockchip_eth_dev *dev) 461 { 462 struct dw_eth_dev *priv = &dev->dw; 463 struct rk3399_grf_regs *grf; 464 int clk; 465 466 switch (priv->phydev->speed) { 467 case 10: 468 clk = RK3399_GMAC_CLK_SEL_2_5M; 469 break; 470 case 100: 471 clk = RK3399_GMAC_CLK_SEL_25M; 472 break; 473 case 1000: 474 clk = RK3399_GMAC_CLK_SEL_125M; 475 break; 476 default: 477 debug("Unknown phy speed: %d\n", priv->phydev->speed); 478 return -EINVAL; 479 } 480 481 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 482 rk_clrsetreg(&grf->soc_con5, RK3399_GMAC_CLK_SEL_MASK, clk); 483 484 return 0; 485 } 486 487 static int rv1108_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 488 struct rockchip_eth_dev *dev) 489 { 490 struct dw_eth_dev *priv = &dev->dw; 491 struct rv1108_grf *grf; 492 int clk, speed; 493 enum { 494 RV1108_GMAC_SPEED_MASK = BIT(2), 495 RV1108_GMAC_SPEED_10M = 0 << 2, 496 RV1108_GMAC_SPEED_100M = 1 << 2, 497 RV1108_GMAC_CLK_SEL_MASK = BIT(7), 498 RV1108_GMAC_CLK_SEL_2_5M = 0 << 7, 499 RV1108_GMAC_CLK_SEL_25M = 1 << 7, 500 }; 501 502 switch (priv->phydev->speed) { 503 case 10: 504 clk = RV1108_GMAC_CLK_SEL_2_5M; 505 speed = RV1108_GMAC_SPEED_10M; 506 break; 507 case 100: 508 clk = RV1108_GMAC_CLK_SEL_25M; 509 speed = RV1108_GMAC_SPEED_100M; 510 break; 511 default: 512 debug("Unknown phy speed: %d\n", priv->phydev->speed); 513 return -EINVAL; 514 } 515 516 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 517 rk_clrsetreg(&grf->gmac_con0, 518 RV1108_GMAC_CLK_SEL_MASK | RV1108_GMAC_SPEED_MASK, 519 clk | speed); 520 521 return 0; 522 } 523 #else 524 static int rk3506_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 525 struct rockchip_eth_dev *dev) 526 { 527 struct eqos_priv *priv = &dev->eqos; 528 struct rk3506_grf_reg *grf; 529 unsigned int div; 530 531 enum { 532 RK3506_GMAC_CLK_RMII_DIV_SHIFT = 3, 533 RK3506_GMAC_CLK_RMII_DIV_MASK = BIT(3), 534 RK3506_GMAC_CLK_RMII_DIV2 = BIT(3), 535 RK3506_GMAC_CLK_RMII_DIV20 = 0, 536 }; 537 538 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 539 540 switch (priv->phy->speed) { 541 case 10: 542 div = RK3506_GMAC_CLK_RMII_DIV20; 543 break; 544 case 100: 545 div = RK3506_GMAC_CLK_RMII_DIV2; 546 break; 547 default: 548 debug("Unknown phy speed: %d\n", priv->phy->speed); 549 return -EINVAL; 550 } 551 552 if (pdata->bus_id) 553 rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_DIV_MASK, div); 554 else 555 rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_DIV_MASK, div); 556 557 return 0; 558 } 559 560 static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 561 struct rockchip_eth_dev *dev) 562 { 563 struct eqos_priv *priv = &dev->eqos; 564 struct rk3528_grf *grf; 565 unsigned int div; 566 567 enum { 568 RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3, 569 RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3), 570 RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3), 571 RK3528_GMAC0_CLK_RMII_DIV20 = 0, 572 }; 573 574 enum { 575 RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10, 576 RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10), 577 RK3528_GMAC1_CLK_RGMII_DIV1 = 0, 578 RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10), 579 RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11), 580 RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11), 581 RK3528_GMAC1_CLK_RMII_DIV20 = 0, 582 }; 583 584 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 585 586 switch (priv->phy->speed) { 587 case 10: 588 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 589 div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 : 590 RK3528_GMAC0_CLK_RMII_DIV20; 591 else 592 div = RK3528_GMAC1_CLK_RGMII_DIV50; 593 break; 594 case 100: 595 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 596 div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 : 597 RK3528_GMAC0_CLK_RMII_DIV2; 598 else 599 div = RK3528_GMAC1_CLK_RGMII_DIV5; 600 break; 601 case 1000: 602 if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 603 div = RK3528_GMAC1_CLK_RGMII_DIV1; 604 else 605 return -EINVAL; 606 break; 607 default: 608 debug("Unknown phy speed: %d\n", priv->phy->speed); 609 return -EINVAL; 610 } 611 612 if (pdata->bus_id) 613 rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div); 614 else 615 rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div); 616 617 return 0; 618 } 619 620 static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata, 621 struct rockchip_eth_dev *dev) 622 { 623 struct eqos_priv *priv = &dev->eqos; 624 struct rk3562_grf *grf; 625 unsigned int div; 626 627 enum { 628 RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7, 629 RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7), 630 RK3562_GMAC0_CLK_RGMII_DIV1 = 0, 631 RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7), 632 RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8), 633 RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7), 634 RK3562_GMAC0_CLK_RMII_DIV20 = 0, 635 }; 636 637 enum { 638 RK3562_GMAC1_SPEED_SHIFT = 0x0, 639 RK3562_GMAC1_SPEED_MASK = BIT(0), 640 RK3562_GMAC1_SPEED_10M = 0, 641 RK3562_GMAC1_SPEED_100M = BIT(0), 642 }; 643 644 enum { 645 RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13, 646 RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13), 647 RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13), 648 RK3562_GMAC1_CLK_RMII_DIV20 = 0, 649 }; 650 651 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 652 653 switch (priv->phy->speed) { 654 case 10: 655 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { 656 if (pdata->bus_id > 0) { 657 div = RK3562_GMAC1_CLK_RMII_DIV20; 658 rk_clrsetreg(&grf->soc_con[0], 659 RK3562_GMAC1_SPEED_MASK, 660 RK3562_GMAC1_SPEED_10M); 661 } else { 662 div = RK3562_GMAC0_CLK_RMII_DIV20; 663 } 664 } else { 665 div = RK3562_GMAC0_CLK_RGMII_DIV50; 666 } 667 break; 668 case 100: 669 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { 670 if (pdata->bus_id > 0) { 671 div = RK3562_GMAC1_CLK_RMII_DIV2; 672 rk_clrsetreg(&grf->soc_con[0], 673 RK3562_GMAC1_SPEED_MASK, 674 RK3562_GMAC1_SPEED_100M); 675 } else { 676 div = RK3562_GMAC0_CLK_RMII_DIV2; 677 } 678 } else { 679 div = RK3562_GMAC0_CLK_RGMII_DIV5; 680 } 681 break; 682 case 1000: 683 if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 684 div = RK3562_GMAC0_CLK_RGMII_DIV1; 685 else 686 return -EINVAL; 687 break; 688 default: 689 debug("Unknown phy speed: %d\n", priv->phy->speed); 690 return -EINVAL; 691 } 692 693 if (pdata->bus_id) 694 rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div); 695 else 696 rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div); 697 698 return 0; 699 } 700 701 static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 702 struct rockchip_eth_dev *dev) 703 { 704 struct eqos_priv *priv = &dev->eqos; 705 struct rk3588_php_grf *php_grf; 706 unsigned int div, div_mask; 707 708 enum { 709 RK3588_GMAC_CLK_RGMII_DIV_SHIFT = 2, 710 RK3588_GMAC_CLK_RGMII_DIV_MASK = GENMASK(3, 2), 711 RK3588_GMAC_CLK_RGMII_DIV1 = 0, 712 RK3588_GMAC_CLK_RGMII_DIV5 = GENMASK(3, 2), 713 RK3588_GMAC_CLK_RGMII_DIV50 = BIT(3), 714 RK3588_GMAC_CLK_RMII_DIV2 = BIT(2), 715 RK3588_GMAC_CLK_RMII_DIV20 = 0, 716 RK3588_GMAC1_ID_SHIFT = 5, 717 }; 718 719 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 720 721 switch (priv->phy->speed) { 722 case 10: 723 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 724 div = RK3588_GMAC_CLK_RMII_DIV20; 725 else 726 div = RK3588_GMAC_CLK_RGMII_DIV50; 727 break; 728 case 100: 729 if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) 730 div = RK3588_GMAC_CLK_RMII_DIV2; 731 else 732 div = RK3588_GMAC_CLK_RGMII_DIV5; 733 break; 734 case 1000: 735 if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) 736 div = RK3588_GMAC_CLK_RGMII_DIV1; 737 else 738 return -EINVAL; 739 break; 740 default: 741 debug("Unknown phy speed: %d\n", priv->phy->speed); 742 return -EINVAL; 743 } 744 745 if (pdata->bus_id == 1) { 746 div <<= 5; 747 div_mask = RK3588_GMAC_CLK_RGMII_DIV_MASK << 5; 748 } 749 750 div <<= pdata->bus_id ? RK3588_GMAC1_ID_SHIFT : 0; 751 div_mask = pdata->bus_id ? (RK3588_GMAC_CLK_RGMII_DIV_MASK << 5) : 752 RK3588_GMAC_CLK_RGMII_DIV_MASK; 753 754 rk_clrsetreg(&php_grf->clk_con1, div_mask, div); 755 756 return 0; 757 } 758 759 static int rv1106_set_rmii_speed(struct gmac_rockchip_platdata *pdata, 760 struct rockchip_eth_dev *dev) 761 { 762 struct eqos_priv *priv = &dev->eqos; 763 #ifdef CONFIG_ROCKCHIP_RV1103B 764 struct rv1103b_grf *grf; 765 #else 766 struct rv1106_grf *grf; 767 #endif 768 unsigned int div; 769 770 enum { 771 RV1106_GMAC_CLK_RMII_DIV_SHIFT = 2, 772 RV1106_GMAC_CLK_RMII_DIV_MASK = GENMASK(3, 2), 773 RV1106_GMAC_CLK_RMII_DIV2 = BIT(2), 774 RV1106_GMAC_CLK_RMII_DIV20 = 0, 775 }; 776 777 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 778 779 switch (priv->phy->speed) { 780 case 10: 781 div = RV1106_GMAC_CLK_RMII_DIV20; 782 break; 783 case 100: 784 div = RV1106_GMAC_CLK_RMII_DIV2; 785 break; 786 default: 787 debug("Unknown phy speed: %d\n", priv->phy->speed); 788 return -EINVAL; 789 } 790 791 rk_clrsetreg(&grf->gmac_clk_con, RV1106_GMAC_CLK_RMII_DIV_MASK, div); 792 793 return 0; 794 } 795 796 static int rv1126_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, 797 struct rockchip_eth_dev *dev) 798 { 799 struct eqos_priv *priv = &dev->eqos; 800 struct clk clk_speed; 801 int ret; 802 803 ret = clk_get_by_name(priv->phy->dev, "clk_mac_speed", 804 &clk_speed); 805 if (ret) { 806 printf("%s can't get clk_mac_speed clock (ret=%d):\n", 807 __func__, ret); 808 return ret; 809 } 810 811 switch ( priv->phy->speed) { 812 case 10: 813 ret = clk_set_rate(&clk_speed, 2500000); 814 if (ret) 815 return ret; 816 break; 817 case 100: 818 ret = clk_set_rate(&clk_speed, 25000000); 819 if (ret) 820 return ret; 821 break; 822 case 1000: 823 ret = clk_set_rate(&clk_speed, 125000000); 824 if (ret) 825 return ret; 826 break; 827 default: 828 debug("Unknown phy speed: %d\n", priv->phy->speed); 829 return -EINVAL; 830 } 831 832 return 0; 833 } 834 #endif 835 836 #ifndef CONFIG_DWC_ETH_QOS 837 static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 838 { 839 struct px30_grf *grf; 840 enum { 841 px30_GMAC_PHY_INTF_SEL_SHIFT = 4, 842 px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6), 843 px30_GMAC_PHY_INTF_SEL_RMII = BIT(6), 844 }; 845 846 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 847 848 rk_clrsetreg(&grf->mac_con1, 849 px30_GMAC_PHY_INTF_SEL_MASK, 850 px30_GMAC_PHY_INTF_SEL_RMII); 851 } 852 853 static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 854 { 855 struct rk1808_grf *grf; 856 enum { 857 RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4, 858 RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 859 RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 860 861 RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 862 RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 863 RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 864 865 RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 866 RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 867 RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 868 }; 869 enum { 870 RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 871 RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7), 872 873 RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 874 RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 875 }; 876 877 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 878 rk_clrsetreg(&grf->mac_con1, 879 RK1808_GMAC_PHY_INTF_SEL_MASK | 880 RK1808_RXCLK_DLY_ENA_GMAC_MASK | 881 RK1808_TXCLK_DLY_ENA_GMAC_MASK, 882 RK1808_GMAC_PHY_INTF_SEL_RGMII | 883 RK1808_RXCLK_DLY_ENA_GMAC_ENABLE | 884 RK1808_TXCLK_DLY_ENA_GMAC_ENABLE); 885 886 rk_clrsetreg(&grf->mac_con0, 887 RK1808_CLK_RX_DL_CFG_GMAC_MASK | 888 RK1808_CLK_TX_DL_CFG_GMAC_MASK, 889 (pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT) | 890 (pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT)); 891 } 892 893 static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 894 { 895 struct rk322x_grf *grf; 896 enum { 897 RK3228_RMII_MODE_SHIFT = 10, 898 RK3228_RMII_MODE_MASK = BIT(10), 899 900 RK3228_GMAC_PHY_INTF_SEL_SHIFT = 4, 901 RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 902 RK3228_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 903 904 RK3228_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 905 RK3228_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 906 RK3228_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 907 908 RK3228_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 909 RK3228_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 910 RK3228_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 911 }; 912 enum { 913 RK3228_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 914 RK3228_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 915 916 RK3228_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 917 RK3228_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 918 }; 919 920 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 921 rk_clrsetreg(&grf->mac_con[1], 922 RK3228_RMII_MODE_MASK | 923 RK3228_GMAC_PHY_INTF_SEL_MASK | 924 RK3228_RXCLK_DLY_ENA_GMAC_MASK | 925 RK3228_TXCLK_DLY_ENA_GMAC_MASK, 926 RK3228_GMAC_PHY_INTF_SEL_RGMII | 927 RK3228_RXCLK_DLY_ENA_GMAC_ENABLE | 928 RK3228_TXCLK_DLY_ENA_GMAC_ENABLE); 929 930 rk_clrsetreg(&grf->mac_con[0], 931 RK3228_CLK_RX_DL_CFG_GMAC_MASK | 932 RK3228_CLK_TX_DL_CFG_GMAC_MASK, 933 pdata->rx_delay << RK3228_CLK_RX_DL_CFG_GMAC_SHIFT | 934 pdata->tx_delay << RK3228_CLK_TX_DL_CFG_GMAC_SHIFT); 935 } 936 937 static void rk3228_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 938 { 939 struct rk322x_grf *grf; 940 enum { 941 RK3228_GRF_CON_RMII_MODE_MASK = BIT(11), 942 RK3228_GRF_CON_RMII_MODE_SEL = BIT(11), 943 RK3228_RMII_MODE_MASK = BIT(10), 944 RK3228_RMII_MODE_SEL = BIT(10), 945 RK3228_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 946 RK3228_GMAC_PHY_INTF_SEL_RMII = BIT(6), 947 }; 948 949 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 950 rk_clrsetreg(&grf->mac_con[1], 951 RK3228_GRF_CON_RMII_MODE_MASK | 952 RK3228_RMII_MODE_MASK | 953 RK3228_GMAC_PHY_INTF_SEL_MASK, 954 RK3228_GRF_CON_RMII_MODE_SEL | 955 RK3228_RMII_MODE_SEL | 956 RK3228_GMAC_PHY_INTF_SEL_RMII); 957 } 958 959 static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 960 { 961 struct rk3288_grf *grf; 962 963 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 964 rk_clrsetreg(&grf->soc_con1, 965 RK3288_RMII_MODE_MASK | RK3288_GMAC_PHY_INTF_SEL_MASK, 966 RK3288_GMAC_PHY_INTF_SEL_RGMII); 967 968 rk_clrsetreg(&grf->soc_con3, 969 RK3288_RXCLK_DLY_ENA_GMAC_MASK | 970 RK3288_TXCLK_DLY_ENA_GMAC_MASK | 971 RK3288_CLK_RX_DL_CFG_GMAC_MASK | 972 RK3288_CLK_TX_DL_CFG_GMAC_MASK, 973 RK3288_RXCLK_DLY_ENA_GMAC_ENABLE | 974 RK3288_TXCLK_DLY_ENA_GMAC_ENABLE | 975 pdata->rx_delay << RK3288_CLK_RX_DL_CFG_GMAC_SHIFT | 976 pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT); 977 } 978 979 static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 980 { 981 struct rk3308_grf *grf; 982 enum { 983 RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2, 984 RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2), 985 RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4), 986 }; 987 988 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 989 990 rk_clrsetreg(&grf->mac_con0, 991 RK3308_GMAC_PHY_INTF_SEL_MASK, 992 RK3308_GMAC_PHY_INTF_SEL_RMII); 993 } 994 995 static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 996 { 997 struct rk3328_grf_regs *grf; 998 enum { 999 RK3328_RMII_MODE_SHIFT = 9, 1000 RK3328_RMII_MODE_MASK = BIT(9), 1001 1002 RK3328_GMAC_PHY_INTF_SEL_SHIFT = 4, 1003 RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1004 RK3328_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1005 1006 RK3328_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 1007 RK3328_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1008 RK3328_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 1009 1010 RK3328_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 1011 RK3328_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1012 RK3328_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 1013 }; 1014 enum { 1015 RK3328_CLK_RX_DL_CFG_GMAC_SHIFT = 0x7, 1016 RK3328_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(13, 7), 1017 1018 RK3328_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1019 RK3328_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1020 }; 1021 1022 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1023 rk_clrsetreg(&grf->mac_con[1], 1024 RK3328_RMII_MODE_MASK | 1025 RK3328_GMAC_PHY_INTF_SEL_MASK | 1026 RK3328_RXCLK_DLY_ENA_GMAC_MASK | 1027 RK3328_TXCLK_DLY_ENA_GMAC_MASK, 1028 RK3328_GMAC_PHY_INTF_SEL_RGMII | 1029 RK3328_RXCLK_DLY_ENA_GMAC_MASK | 1030 RK3328_TXCLK_DLY_ENA_GMAC_ENABLE); 1031 1032 rk_clrsetreg(&grf->mac_con[0], 1033 RK3328_CLK_RX_DL_CFG_GMAC_MASK | 1034 RK3328_CLK_TX_DL_CFG_GMAC_MASK, 1035 pdata->rx_delay << RK3328_CLK_RX_DL_CFG_GMAC_SHIFT | 1036 pdata->tx_delay << RK3328_CLK_TX_DL_CFG_GMAC_SHIFT); 1037 } 1038 1039 static void rk3328_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1040 { 1041 struct rk3328_grf_regs *grf; 1042 enum { 1043 RK3328_RMII_MODE_MASK = BIT(9), 1044 RK3328_RMII_MODE = BIT(9), 1045 1046 RK3328_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1047 RK3328_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1048 }; 1049 1050 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1051 rk_clrsetreg(pdata->integrated_phy ? &grf->mac_con[2] : &grf->mac_con[1], 1052 RK3328_RMII_MODE_MASK | 1053 RK3328_GMAC_PHY_INTF_SEL_MASK, 1054 RK3328_GMAC_PHY_INTF_SEL_RMII | 1055 RK3328_RMII_MODE); 1056 } 1057 1058 static void rk3368_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1059 { 1060 struct rk3368_grf *grf; 1061 enum { 1062 RK3368_GMAC_PHY_INTF_SEL_RGMII = 1 << 9, 1063 RK3368_GMAC_PHY_INTF_SEL_MASK = GENMASK(11, 9), 1064 RK3368_RMII_MODE_MASK = BIT(6), 1065 RK3368_RMII_MODE = BIT(6), 1066 }; 1067 enum { 1068 RK3368_RXCLK_DLY_ENA_GMAC_MASK = BIT(15), 1069 RK3368_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1070 RK3368_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(15), 1071 RK3368_TXCLK_DLY_ENA_GMAC_MASK = BIT(7), 1072 RK3368_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1073 RK3368_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(7), 1074 RK3368_CLK_RX_DL_CFG_GMAC_SHIFT = 8, 1075 RK3368_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1076 RK3368_CLK_TX_DL_CFG_GMAC_SHIFT = 0, 1077 RK3368_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1078 }; 1079 1080 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1081 rk_clrsetreg(&grf->soc_con15, 1082 RK3368_RMII_MODE_MASK | RK3368_GMAC_PHY_INTF_SEL_MASK, 1083 RK3368_GMAC_PHY_INTF_SEL_RGMII); 1084 1085 rk_clrsetreg(&grf->soc_con16, 1086 RK3368_RXCLK_DLY_ENA_GMAC_MASK | 1087 RK3368_TXCLK_DLY_ENA_GMAC_MASK | 1088 RK3368_CLK_RX_DL_CFG_GMAC_MASK | 1089 RK3368_CLK_TX_DL_CFG_GMAC_MASK, 1090 RK3368_RXCLK_DLY_ENA_GMAC_ENABLE | 1091 RK3368_TXCLK_DLY_ENA_GMAC_ENABLE | 1092 (pdata->rx_delay << RK3368_CLK_RX_DL_CFG_GMAC_SHIFT) | 1093 (pdata->tx_delay << RK3368_CLK_TX_DL_CFG_GMAC_SHIFT)); 1094 } 1095 1096 static void rk3399_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1097 { 1098 struct rk3399_grf_regs *grf; 1099 1100 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1101 1102 rk_clrsetreg(&grf->soc_con5, 1103 RK3399_GMAC_PHY_INTF_SEL_MASK, 1104 RK3399_GMAC_PHY_INTF_SEL_RGMII); 1105 1106 rk_clrsetreg(&grf->soc_con6, 1107 RK3399_RXCLK_DLY_ENA_GMAC_MASK | 1108 RK3399_TXCLK_DLY_ENA_GMAC_MASK | 1109 RK3399_CLK_RX_DL_CFG_GMAC_MASK | 1110 RK3399_CLK_TX_DL_CFG_GMAC_MASK, 1111 RK3399_RXCLK_DLY_ENA_GMAC_ENABLE | 1112 RK3399_TXCLK_DLY_ENA_GMAC_ENABLE | 1113 (pdata->rx_delay << RK3399_CLK_RX_DL_CFG_GMAC_SHIFT) | 1114 (pdata->tx_delay << RK3399_CLK_TX_DL_CFG_GMAC_SHIFT)); 1115 } 1116 1117 static void rv1108_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1118 { 1119 struct rv1108_grf *grf; 1120 1121 enum { 1122 RV1108_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1123 RV1108_GMAC_PHY_INTF_SEL_RMII = 4 << 4, 1124 }; 1125 1126 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1127 rk_clrsetreg(&grf->gmac_con0, 1128 RV1108_GMAC_PHY_INTF_SEL_MASK, 1129 RV1108_GMAC_PHY_INTF_SEL_RMII); 1130 } 1131 1132 static void rk3228_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1133 { 1134 struct rk322x_grf *grf; 1135 enum { 1136 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK = BIT(15), 1137 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY = BIT(15), 1138 }; 1139 enum { 1140 RK3228_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1141 RK3228_MACPHY_CFG_CLK_50M = BIT(14), 1142 1143 RK3228_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1144 RK3228_MACPHY_RMII_MODE = BIT(6), 1145 1146 RK3228_MACPHY_ENABLE_MASK = BIT(0), 1147 RK3228_MACPHY_DISENABLE = 0, 1148 RK3228_MACPHY_ENABLE = BIT(0), 1149 }; 1150 enum { 1151 RK3228_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1152 RK3228_RK_GRF_CON2_MACPHY_ID = 0x1234, 1153 }; 1154 enum { 1155 RK3228_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1156 RK3228_RK_GRF_CON3_MACPHY_ID = 0x35, 1157 }; 1158 1159 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1160 rk_clrsetreg(&grf->con_iomux, 1161 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY_MASK, 1162 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); 1163 1164 rk_clrsetreg(&grf->macphy_con[2], 1165 RK3228_RK_GRF_CON2_MACPHY_ID_MASK, 1166 RK3228_RK_GRF_CON2_MACPHY_ID); 1167 1168 rk_clrsetreg(&grf->macphy_con[3], 1169 RK3228_RK_GRF_CON3_MACPHY_ID_MASK, 1170 RK3228_RK_GRF_CON3_MACPHY_ID); 1171 1172 /* disabled before trying to reset it &*/ 1173 rk_clrsetreg(&grf->macphy_con[0], 1174 RK3228_MACPHY_CFG_CLK_50M_MASK | 1175 RK3228_MACPHY_RMII_MODE_MASK | 1176 RK3228_MACPHY_ENABLE_MASK, 1177 RK3228_MACPHY_CFG_CLK_50M | 1178 RK3228_MACPHY_RMII_MODE | 1179 RK3228_MACPHY_DISENABLE); 1180 1181 reset_assert(&pdata->phy_reset); 1182 udelay(10); 1183 reset_deassert(&pdata->phy_reset); 1184 udelay(10); 1185 1186 rk_clrsetreg(&grf->macphy_con[0], 1187 RK3228_MACPHY_ENABLE_MASK, 1188 RK3228_MACPHY_ENABLE); 1189 udelay(30 * 1000); 1190 } 1191 1192 static void rk3328_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1193 { 1194 struct rk3328_grf_regs *grf; 1195 enum { 1196 RK3328_GRF_CON_RMII_MODE_MASK = BIT(9), 1197 RK3328_GRF_CON_RMII_MODE = BIT(9), 1198 }; 1199 enum { 1200 RK3328_MACPHY_CFG_CLK_50M_MASK = BIT(14), 1201 RK3328_MACPHY_CFG_CLK_50M = BIT(14), 1202 1203 RK3328_MACPHY_RMII_MODE_MASK = GENMASK(7, 6), 1204 RK3328_MACPHY_RMII_MODE = BIT(6), 1205 1206 RK3328_MACPHY_ENABLE_MASK = BIT(0), 1207 RK3328_MACPHY_DISENABLE = 0, 1208 RK3328_MACPHY_ENABLE = BIT(0), 1209 }; 1210 enum { 1211 RK3328_RK_GRF_CON2_MACPHY_ID_MASK = GENMASK(6, 0), 1212 RK3328_RK_GRF_CON2_MACPHY_ID = 0x1234, 1213 }; 1214 enum { 1215 RK3328_RK_GRF_CON3_MACPHY_ID_MASK = GENMASK(5, 0), 1216 RK3328_RK_GRF_CON3_MACPHY_ID = 0x35, 1217 }; 1218 1219 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1220 rk_clrsetreg(&grf->macphy_con[1], 1221 RK3328_GRF_CON_RMII_MODE_MASK, 1222 RK3328_GRF_CON_RMII_MODE); 1223 1224 rk_clrsetreg(&grf->macphy_con[2], 1225 RK3328_RK_GRF_CON2_MACPHY_ID_MASK, 1226 RK3328_RK_GRF_CON2_MACPHY_ID); 1227 1228 rk_clrsetreg(&grf->macphy_con[3], 1229 RK3328_RK_GRF_CON3_MACPHY_ID_MASK, 1230 RK3328_RK_GRF_CON3_MACPHY_ID); 1231 1232 /* disabled before trying to reset it &*/ 1233 rk_clrsetreg(&grf->macphy_con[0], 1234 RK3328_MACPHY_CFG_CLK_50M_MASK | 1235 RK3328_MACPHY_RMII_MODE_MASK | 1236 RK3328_MACPHY_ENABLE_MASK, 1237 RK3328_MACPHY_CFG_CLK_50M | 1238 RK3328_MACPHY_RMII_MODE | 1239 RK3328_MACPHY_DISENABLE); 1240 1241 reset_assert(&pdata->phy_reset); 1242 udelay(10); 1243 reset_deassert(&pdata->phy_reset); 1244 udelay(10); 1245 1246 rk_clrsetreg(&grf->macphy_con[0], 1247 RK3328_MACPHY_ENABLE_MASK, 1248 RK3328_MACPHY_ENABLE); 1249 udelay(30 * 1000); 1250 } 1251 1252 #else 1253 static void rk3506_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1254 { 1255 unsigned int clk_mode; 1256 struct rk3506_grf_reg *grf; 1257 1258 enum { 1259 RK3506_GMAC_CLK_RMII_MODE_SHIFT = 0x1, 1260 RK3506_GMAC_CLK_RMII_MODE_MASK = BIT(1), 1261 RK3506_GMAC_CLK_RMII_MODE = BIT(1), 1262 }; 1263 1264 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1265 clk_mode = RK3506_GMAC_CLK_RMII_MODE; 1266 1267 if (pdata->bus_id == 1) 1268 rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode); 1269 else 1270 rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_RMII_MODE_MASK, clk_mode); 1271 } 1272 1273 static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1274 { 1275 struct rk3528_grf *grf; 1276 unsigned char bgs[1] = {0}; 1277 1278 enum { 1279 RK3528_MACPHY_ENABLE_MASK = BIT(1), 1280 RK3528_MACPHY_DISENABLE = BIT(1), 1281 RK3528_MACPHY_ENABLE = 0, 1282 RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 1283 RK3528_MACPHY_XMII_SEL = BIT(6), 1284 RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 1285 RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 1286 RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 1287 RK3528_MACPHY_PHY_ID = BIT(11), 1288 }; 1289 1290 enum { 1291 RK3528_MACPHY_BGS_MASK = GENMASK(3, 0), 1292 }; 1293 1294 #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1295 struct udevice *dev; 1296 u32 regs[2] = {0}; 1297 ofnode node; 1298 int ret = 0; 1299 1300 /* retrieve the device */ 1301 if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1302 ret = uclass_get_device_by_driver(UCLASS_MISC, 1303 DM_GET_DRIVER(rockchip_efuse), 1304 &dev); 1305 else 1306 ret = uclass_get_device_by_driver(UCLASS_MISC, 1307 DM_GET_DRIVER(rockchip_otp), 1308 &dev); 1309 if (!ret) { 1310 node = dev_read_subnode(dev, "macphy-bgs"); 1311 if (ofnode_valid(node)) { 1312 if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1313 /* read the bgs from the efuses */ 1314 ret = misc_read(dev, regs[0], &bgs, 1); 1315 if (ret) { 1316 printf("read bgs from efuse/otp failed, ret=%d\n", 1317 ret); 1318 bgs[0] = 0; 1319 } 1320 } 1321 } 1322 } 1323 #endif 1324 1325 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1326 1327 reset_assert(&pdata->phy_reset); 1328 udelay(20); 1329 rk_clrsetreg(&grf->macphy_con0, 1330 RK3528_MACPHY_ENABLE_MASK | 1331 RK3528_MACPHY_XMII_SEL_MASK | 1332 RK3528_MACPHY_24M_CLK_SEL_MASK | 1333 RK3528_MACPHY_PHY_ID_MASK, 1334 RK3528_MACPHY_ENABLE | 1335 RK3528_MACPHY_XMII_SEL | 1336 RK3528_MACPHY_24M_CLK_SEL_24M | 1337 RK3528_MACPHY_PHY_ID); 1338 1339 rk_clrsetreg(&grf->macphy_con1, 1340 RK3528_MACPHY_BGS_MASK, 1341 bgs[0]); 1342 udelay(20); 1343 reset_deassert(&pdata->phy_reset); 1344 udelay(30 * 1000); 1345 } 1346 1347 static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1348 { 1349 unsigned int clk_mode; 1350 struct rk3528_grf *grf; 1351 1352 enum { 1353 RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1, 1354 RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1), 1355 RK3528_GMAC0_CLK_RMII_MODE = 0x1, 1356 }; 1357 1358 enum { 1359 RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8, 1360 RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8), 1361 RK3528_GMAC1_CLK_RMII_MODE = 0x1, 1362 }; 1363 1364 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1365 1366 if (pdata->bus_id == 1) { 1367 clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT; 1368 rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode); 1369 } else { 1370 clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT; 1371 rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode); 1372 } 1373 } 1374 1375 static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1376 { 1377 unsigned int rx_enable; 1378 unsigned int rx_delay; 1379 struct rk3528_grf *grf; 1380 1381 enum { 1382 RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8, 1383 RK3528_GMAC1_RGMII_MODE_MASK = BIT(8), 1384 RK3528_GMAC1_RGMII_MODE = 0x0, 1385 1386 RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14), 1387 RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0, 1388 RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14), 1389 1390 RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15), 1391 RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0, 1392 RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15), 1393 }; 1394 1395 enum { 1396 RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8, 1397 RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8), 1398 1399 RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0, 1400 RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0), 1401 }; 1402 1403 if (!pdata->bus_id) 1404 return; 1405 1406 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1407 1408 if (pdata->rx_delay < 0) { 1409 rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE; 1410 rx_delay = 0; 1411 } else { 1412 rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE; 1413 rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT; 1414 } 1415 1416 rk_clrsetreg(&grf->gmac1_con0, 1417 RK3528_GMAC1_TXCLK_DLY_ENA_MASK | 1418 RK3528_GMAC1_RXCLK_DLY_ENA_MASK | 1419 RK3528_GMAC1_RGMII_MODE_MASK, 1420 rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE | 1421 (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT)); 1422 1423 rk_clrsetreg(&grf->gmac1_con1, 1424 RK3528_GMAC1_RX_DL_CFG_MASK | 1425 RK3528_GMAC1_TX_DL_CFG_MASK, 1426 (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) | 1427 rx_delay); 1428 } 1429 1430 static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1431 { 1432 struct rk3562_grf *grf; 1433 unsigned int mode; 1434 1435 enum { 1436 RK3562_GMAC0_RMII_MODE_SHIFT = 0x5, 1437 RK3562_GMAC0_RMII_MODE_MASK = BIT(5), 1438 RK3562_GMAC0_RMII_MODE = 0x1, 1439 }; 1440 1441 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1442 1443 if (!pdata->bus_id) { 1444 mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT; 1445 rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode); 1446 } 1447 } 1448 1449 static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1450 { 1451 struct rk3562_grf *grf; 1452 struct rk3562_ioc *ioc; 1453 unsigned int rx_enable; 1454 unsigned int rx_delay; 1455 1456 enum { 1457 RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5, 1458 RK3562_GMAC0_RGMII_MODE_MASK = BIT(5), 1459 RK3562_GMAC0_RGMII_MODE = 0x0, 1460 1461 RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0), 1462 RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0, 1463 RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0), 1464 1465 RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1), 1466 RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0, 1467 RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1), 1468 }; 1469 1470 enum { 1471 RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8, 1472 RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8), 1473 1474 RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0, 1475 RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0), 1476 }; 1477 1478 if (pdata->bus_id) 1479 return; 1480 1481 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1482 ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); 1483 1484 rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK, 1485 RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT); 1486 1487 if (pdata->rx_delay < 0) { 1488 rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE; 1489 rx_delay = 0; 1490 } else { 1491 rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE; 1492 rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT; 1493 } 1494 1495 rk_clrsetreg(&ioc->mac0_io_con1, 1496 RK3562_GMAC0_TXCLK_DLY_ENA_MASK | 1497 RK3562_GMAC0_RXCLK_DLY_ENA_MASK, 1498 rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); 1499 1500 rk_clrsetreg(&ioc->mac0_io_con0, 1501 RK3562_GMAC0_RX_DL_CFG_MASK | 1502 RK3562_GMAC0_TX_DL_CFG_MASK, 1503 (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | 1504 rx_delay); 1505 1506 rk_clrsetreg(&ioc->mac1_io_con1, 1507 RK3562_GMAC0_TXCLK_DLY_ENA_MASK | 1508 RK3562_GMAC0_RXCLK_DLY_ENA_MASK, 1509 rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); 1510 1511 rk_clrsetreg(&ioc->mac1_io_con0, 1512 RK3562_GMAC0_RX_DL_CFG_MASK | 1513 RK3562_GMAC0_TX_DL_CFG_MASK, 1514 (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | 1515 rx_delay); 1516 } 1517 1518 static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1519 { 1520 struct rk3568_grf *grf; 1521 void *con1; 1522 1523 enum { 1524 RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 1525 RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1526 RK3568_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1527 }; 1528 1529 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1530 1531 if (pdata->bus_id == 1) 1532 con1 = &grf->mac1_con1; 1533 else 1534 con1 = &grf->mac0_con1; 1535 1536 rk_clrsetreg(con1, 1537 RK3568_GMAC_PHY_INTF_SEL_MASK, 1538 RK3568_GMAC_PHY_INTF_SEL_RMII); 1539 } 1540 1541 static void rk3568_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1542 { 1543 struct rk3568_grf *grf; 1544 void *con0, *con1; 1545 1546 enum { 1547 RK3568_GMAC_PHY_INTF_SEL_SHIFT = 4, 1548 RK3568_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1549 RK3568_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1550 1551 RK3568_RXCLK_DLY_ENA_GMAC_MASK = BIT(1), 1552 RK3568_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1553 RK3568_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1), 1554 1555 RK3568_TXCLK_DLY_ENA_GMAC_MASK = BIT(0), 1556 RK3568_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1557 RK3568_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0), 1558 }; 1559 1560 enum { 1561 RK3568_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1562 RK3568_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1563 1564 RK3568_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1565 RK3568_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1566 }; 1567 1568 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1569 1570 if (pdata->bus_id == 1) { 1571 con0 = &grf->mac1_con0; 1572 con1 = &grf->mac1_con1; 1573 } else { 1574 con0 = &grf->mac0_con0; 1575 con1 = &grf->mac0_con1; 1576 } 1577 1578 rk_clrsetreg(con0, 1579 RK3568_CLK_RX_DL_CFG_GMAC_MASK | 1580 RK3568_CLK_TX_DL_CFG_GMAC_MASK, 1581 (pdata->rx_delay << RK3568_CLK_RX_DL_CFG_GMAC_SHIFT) | 1582 (pdata->tx_delay << RK3568_CLK_TX_DL_CFG_GMAC_SHIFT)); 1583 1584 rk_clrsetreg(con1, 1585 RK3568_TXCLK_DLY_ENA_GMAC_MASK | 1586 RK3568_RXCLK_DLY_ENA_GMAC_MASK | 1587 RK3568_GMAC_PHY_INTF_SEL_MASK, 1588 RK3568_TXCLK_DLY_ENA_GMAC_ENABLE | 1589 RK3568_RXCLK_DLY_ENA_GMAC_ENABLE | 1590 RK3568_GMAC_PHY_INTF_SEL_RGMII); 1591 } 1592 1593 static void rk3588_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1594 { 1595 unsigned int intf_sel, intf_sel_mask; 1596 unsigned int clk_mode, clk_mode_mask; 1597 struct rk3588_php_grf *php_grf; 1598 1599 enum { 1600 RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1601 RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1602 RK3588_GMAC_PHY_INTF_SEL_RMII = BIT(5), 1603 }; 1604 1605 enum { 1606 RK3588_GMAC_CLK_RMII_MODE_SHIFT = 0x0, 1607 RK3588_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1608 RK3588_GMAC_CLK_RMII_MODE = 0x1, 1609 }; 1610 1611 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1612 1613 if (pdata->bus_id == 1) { 1614 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII << 6; 1615 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1616 clk_mode = RK3588_GMAC_CLK_RMII_MODE << 5; 1617 clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK << 5; 1618 } else { 1619 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RMII; 1620 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1621 clk_mode = RK3588_GMAC_CLK_RMII_MODE; 1622 clk_mode_mask = RK3588_GMAC_CLK_RMII_MODE_MASK; 1623 } 1624 1625 rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1626 rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1627 } 1628 1629 static void rk3588_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1630 { 1631 unsigned int rx_enable, rx_enable_mask, tx_enable, tx_enable_mask; 1632 unsigned int intf_sel, intf_sel_mask; 1633 unsigned int clk_mode, clk_mode_mask; 1634 unsigned int rx_delay; 1635 struct rk3588_php_grf *php_grf; 1636 struct rk3588_sys_grf *grf; 1637 void *offset_con; 1638 1639 enum { 1640 RK3588_GMAC_PHY_INTF_SEL_SHIFT = 3, 1641 RK3588_GMAC_PHY_INTF_SEL_MASK = GENMASK(5, 3), 1642 RK3588_GMAC_PHY_INTF_SEL_RGMII = BIT(3), 1643 1644 RK3588_RXCLK_DLY_ENA_GMAC_MASK = BIT(3), 1645 RK3588_RXCLK_DLY_ENA_GMAC_DISABLE = 0, 1646 RK3588_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(3), 1647 1648 RK3588_TXCLK_DLY_ENA_GMAC_MASK = BIT(2), 1649 RK3588_TXCLK_DLY_ENA_GMAC_DISABLE = 0, 1650 RK3588_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(2), 1651 }; 1652 1653 enum { 1654 RK3588_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1655 RK3588_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 8), 1656 1657 RK3588_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1658 RK3588_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0), 1659 }; 1660 1661 enum { 1662 RK3588_GMAC_CLK_RGMII_MODE_SHIFT = 0x0, 1663 RK3588_GMAC_CLK_RGMII_MODE_MASK = BIT(0), 1664 RK3588_GMAC_CLK_RGMII_MODE = 0x0, 1665 }; 1666 1667 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1668 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 1669 1670 if (pdata->rx_delay < 0) { 1671 rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_DISABLE; 1672 rx_delay = 0; 1673 } else { 1674 rx_enable = RK3588_RXCLK_DLY_ENA_GMAC_ENABLE; 1675 rx_delay = pdata->rx_delay << RK3588_CLK_RX_DL_CFG_GMAC_SHIFT; 1676 } 1677 1678 if (pdata->bus_id == 1) { 1679 offset_con = &grf->soc_con9; 1680 rx_enable = rx_delay << 2; 1681 rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK << 2; 1682 tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE << 2; 1683 tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK << 2; 1684 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII << 6; 1685 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK << 6; 1686 clk_mode = RK3588_GMAC_CLK_RGMII_MODE << 5; 1687 clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK << 5; 1688 } else { 1689 offset_con = &grf->soc_con8; 1690 rx_enable_mask = RK3588_RXCLK_DLY_ENA_GMAC_MASK; 1691 tx_enable = RK3588_TXCLK_DLY_ENA_GMAC_ENABLE; 1692 tx_enable_mask = RK3588_TXCLK_DLY_ENA_GMAC_MASK; 1693 intf_sel = RK3588_GMAC_PHY_INTF_SEL_RGMII; 1694 intf_sel_mask = RK3588_GMAC_PHY_INTF_SEL_MASK; 1695 clk_mode = RK3588_GMAC_CLK_RGMII_MODE; 1696 clk_mode_mask = RK3588_GMAC_CLK_RGMII_MODE_MASK; 1697 } 1698 1699 rk_clrsetreg(offset_con, 1700 RK3588_CLK_TX_DL_CFG_GMAC_MASK | 1701 RK3588_CLK_RX_DL_CFG_GMAC_MASK, 1702 (pdata->tx_delay << RK3588_CLK_TX_DL_CFG_GMAC_SHIFT) | 1703 rx_delay); 1704 1705 rk_clrsetreg(&grf->soc_con7, tx_enable_mask | rx_enable_mask, 1706 tx_enable | rx_enable); 1707 1708 rk_clrsetreg(&php_grf->gmac_con0, intf_sel_mask, intf_sel); 1709 rk_clrsetreg(&php_grf->clk_con1, clk_mode_mask, clk_mode); 1710 } 1711 1712 static void rv1103b_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1713 { 1714 struct rv1103b_grf *grf; 1715 enum { 1716 RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK = BIT(2), 1717 RV1103B_SYSGRF_GMAC_CLK_RMII_50M = BIT(2), 1718 }; 1719 1720 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1721 rk_clrsetreg(&grf->gmac_clk_con, 1722 RV1103B_SYSGRF_GMAC_CLK_RMII_50M_MASK, 1723 RV1103B_SYSGRF_GMAC_CLK_RMII_50M); 1724 }; 1725 1726 static void rv1106_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) 1727 { 1728 #ifdef CONFIG_ROCKCHIP_RV1103B 1729 struct rv1103b_grf *grf; 1730 #else 1731 struct rv1106_grf *grf; 1732 #endif 1733 unsigned char bgs[1] = {0}; 1734 1735 enum { 1736 RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1737 RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1738 }; 1739 1740 enum { 1741 RV1106_MACPHY_ENABLE_MASK = BIT(1), 1742 RV1106_MACPHY_DISENABLE = BIT(1), 1743 RV1106_MACPHY_ENABLE = 0, 1744 RV1106_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), 1745 RV1106_MACPHY_XMII_SEL = BIT(6), 1746 RV1106_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), 1747 RV1106_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), 1748 RV1106_MACPHY_PHY_ID_MASK = GENMASK(14, 10), 1749 RV1106_MACPHY_PHY_ID = BIT(11), 1750 }; 1751 1752 enum { 1753 RV1106_MACPHY_BGS_MASK = GENMASK(3, 0), 1754 RV1106_MACPHY_BGS = BIT(2), 1755 }; 1756 1757 #if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) 1758 struct udevice *dev; 1759 u32 regs[2] = {0}; 1760 ofnode node; 1761 int ret = 0; 1762 1763 /* retrieve the device */ 1764 if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) 1765 ret = uclass_get_device_by_driver(UCLASS_MISC, 1766 DM_GET_DRIVER(rockchip_efuse), 1767 &dev); 1768 else 1769 ret = uclass_get_device_by_driver(UCLASS_MISC, 1770 DM_GET_DRIVER(rockchip_otp), 1771 &dev); 1772 if (!ret) { 1773 node = dev_read_subnode(dev, "macphy-bgs"); 1774 if (ofnode_valid(node)) { 1775 if (!ofnode_read_u32_array(node, "reg", regs, 2)) { 1776 /* read the bgs from the efuses */ 1777 ret = misc_read(dev, regs[0], &bgs, 1); 1778 if (ret) { 1779 printf("read bgs from efuse/otp failed, ret=%d\n", 1780 ret); 1781 bgs[0] = 0; 1782 } 1783 } 1784 } 1785 } 1786 #endif 1787 1788 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1789 1790 reset_assert(&pdata->phy_reset); 1791 udelay(20); 1792 rk_clrsetreg(&grf->macphy_con0, 1793 RV1106_MACPHY_ENABLE_MASK | 1794 RV1106_MACPHY_XMII_SEL_MASK | 1795 RV1106_MACPHY_24M_CLK_SEL_MASK | 1796 RV1106_MACPHY_PHY_ID_MASK, 1797 RV1106_MACPHY_ENABLE | 1798 RV1106_MACPHY_XMII_SEL | 1799 RV1106_MACPHY_24M_CLK_SEL_24M | 1800 RV1106_MACPHY_PHY_ID); 1801 1802 rk_clrsetreg(&grf->macphy_con1, 1803 RV1106_MACPHY_BGS_MASK, 1804 bgs[0]); 1805 udelay(20); 1806 reset_deassert(&pdata->phy_reset); 1807 udelay(30 * 1000); 1808 } 1809 1810 static void rv1106_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1811 { 1812 struct rv1106_grf *grf; 1813 enum { 1814 RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK = BIT(0), 1815 RV1106_VOGRF_GMAC_CLK_RMII_MODE = BIT(0), 1816 }; 1817 1818 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1819 rk_clrsetreg(&grf->gmac_clk_con, 1820 RV1106_VOGRF_GMAC_CLK_RMII_MODE_MASK, 1821 RV1106_VOGRF_GMAC_CLK_RMII_MODE); 1822 }; 1823 1824 static void rv1126_set_to_rmii(struct gmac_rockchip_platdata *pdata) 1825 { 1826 struct rv1126_grf *grf; 1827 1828 enum { 1829 RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1830 RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1831 RV1126_GMAC_PHY_INTF_SEL_RMII = BIT(6), 1832 }; 1833 1834 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1835 1836 rk_clrsetreg(&grf->mac_con0, 1837 RV1126_GMAC_PHY_INTF_SEL_MASK, 1838 RV1126_GMAC_PHY_INTF_SEL_RMII); 1839 } 1840 1841 static void rv1126_set_to_rgmii(struct gmac_rockchip_platdata *pdata) 1842 { 1843 struct rv1126_grf *grf; 1844 1845 enum { 1846 RV1126_GMAC_PHY_INTF_SEL_SHIFT = 4, 1847 RV1126_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4), 1848 RV1126_GMAC_PHY_INTF_SEL_RGMII = BIT(4), 1849 1850 RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK = BIT(3), 1851 RV1126_RXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1852 RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(3), 1853 1854 RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK = BIT(2), 1855 RV1126_TXCLK_M1_DLY_ENA_GMAC_DISABLE = 0, 1856 RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE = BIT(2), 1857 1858 RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK = BIT(1), 1859 RV1126_RXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1860 RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(1), 1861 1862 RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK = BIT(0), 1863 RV1126_TXCLK_M0_DLY_ENA_GMAC_DISABLE = 0, 1864 RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE = BIT(0), 1865 }; 1866 enum { 1867 RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1868 RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1869 1870 RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1871 RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1872 }; 1873 enum { 1874 RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8, 1875 RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(14, 8), 1876 1877 RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0, 1878 RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(6, 0), 1879 }; 1880 1881 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1882 1883 rk_clrsetreg(&grf->mac_con0, 1884 RV1126_TXCLK_M0_DLY_ENA_GMAC_MASK | 1885 RV1126_RXCLK_M0_DLY_ENA_GMAC_MASK | 1886 RV1126_TXCLK_M1_DLY_ENA_GMAC_MASK | 1887 RV1126_RXCLK_M1_DLY_ENA_GMAC_MASK | 1888 RV1126_GMAC_PHY_INTF_SEL_MASK, 1889 RV1126_TXCLK_M0_DLY_ENA_GMAC_ENABLE | 1890 RV1126_RXCLK_M0_DLY_ENA_GMAC_ENABLE | 1891 RV1126_TXCLK_M1_DLY_ENA_GMAC_ENABLE | 1892 RV1126_RXCLK_M1_DLY_ENA_GMAC_ENABLE | 1893 RV1126_GMAC_PHY_INTF_SEL_RGMII); 1894 1895 rk_clrsetreg(&grf->mac_con1, 1896 RV1126_M0_CLK_RX_DL_CFG_GMAC_MASK | 1897 RV1126_M0_CLK_TX_DL_CFG_GMAC_MASK, 1898 (pdata->rx_delay << RV1126_M0_CLK_RX_DL_CFG_GMAC_SHIFT) | 1899 (pdata->tx_delay << RV1126_M0_CLK_TX_DL_CFG_GMAC_SHIFT)); 1900 1901 rk_clrsetreg(&grf->mac_con2, 1902 RV1126_M1_CLK_RX_DL_CFG_GMAC_MASK | 1903 RV1126_M1_CLK_TX_DL_CFG_GMAC_MASK, 1904 (pdata->rx_delay << RV1126_M1_CLK_RX_DL_CFG_GMAC_SHIFT) | 1905 (pdata->tx_delay << RV1126_M1_CLK_TX_DL_CFG_GMAC_SHIFT)); 1906 } 1907 #endif 1908 1909 #ifdef CONFIG_DWC_ETH_QOS 1910 static void rk3506_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1911 { 1912 struct rk3506_grf_reg *grf; 1913 unsigned int val; 1914 1915 enum { 1916 RK3506_GMAC_CLK_SELET_SHIFT = 5, 1917 RK3506_GMAC_CLK_SELET_MASK = BIT(5), 1918 RK3506_GMAC_CLK_SELET_CRU = 0, 1919 RK3506_GMAC_CLK_SELET_IO = BIT(5), 1920 }; 1921 1922 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1923 1924 val = pdata->clock_input ? RK3506_GMAC_CLK_SELET_IO : 1925 RK3506_GMAC_CLK_SELET_CRU; 1926 1927 if (pdata->bus_id) 1928 rk_clrsetreg(&grf->soc_con11, RK3506_GMAC_CLK_SELET_MASK, val); 1929 else 1930 rk_clrsetreg(&grf->soc_con8, RK3506_GMAC_CLK_SELET_MASK, val); 1931 } 1932 1933 static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1934 { 1935 struct rk3528_grf *grf; 1936 unsigned int val; 1937 1938 enum { 1939 RK3528_GMAC1_CLK_SELET_SHIFT = 0x12, 1940 RK3528_GMAC1_CLK_SELET_MASK = BIT(12), 1941 RK3528_GMAC1_CLK_SELET_CRU = 0, 1942 RK3528_GMAC1_CLK_SELET_IO = BIT(12), 1943 }; 1944 1945 if (!pdata->bus_id) 1946 return; 1947 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1948 1949 val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO : 1950 RK3528_GMAC1_CLK_SELET_CRU; 1951 rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val); 1952 } 1953 1954 static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata) 1955 { 1956 struct rk3562_grf *grf; 1957 struct rk3562_ioc *ioc; 1958 unsigned int val; 1959 1960 enum { 1961 RK3562_GMAC0_CLK_SELET_SHIFT = 0x9, 1962 RK3562_GMAC0_CLK_SELET_MASK = BIT(9), 1963 RK3562_GMAC0_CLK_SELET_CRU = 0, 1964 RK3562_GMAC0_CLK_SELET_IO = BIT(9), 1965 }; 1966 1967 enum { 1968 RK3562_GMAC1_CLK_SELET_SHIFT = 15, 1969 RK3562_GMAC1_CLK_SELET_MASK = BIT(15), 1970 RK3562_GMAC1_CLK_SELET_CRU = 0, 1971 RK3562_GMAC1_CLK_SELET_IO = BIT(15), 1972 }; 1973 1974 enum { 1975 RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2, 1976 RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2), 1977 RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0, 1978 RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2), 1979 }; 1980 1981 enum { 1982 RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3, 1983 RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3), 1984 RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0, 1985 RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3), 1986 }; 1987 1988 grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); 1989 ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); 1990 1991 if (!pdata->bus_id) { 1992 val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO : 1993 RK3562_GMAC0_CLK_SELET_CRU; 1994 rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val); 1995 val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO : 1996 RK3562_GMAC0_IO_EXTCLK_SELET_CRU; 1997 rk_clrsetreg(&ioc->mac1_io_con1, 1998 RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); 1999 rk_clrsetreg(&ioc->mac0_io_con1, 2000 RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); 2001 2002 } else { 2003 val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO : 2004 RK3562_GMAC1_CLK_SELET_CRU; 2005 rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val); 2006 val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO : 2007 RK3562_GMAC1_IO_EXTCLK_SELET_CRU; 2008 rk_clrsetreg(&ioc->mac1_io_con1, 2009 RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val); 2010 } 2011 } 2012 2013 static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) 2014 { 2015 struct rk3588_php_grf *php_grf; 2016 unsigned int val, mask; 2017 2018 enum { 2019 RK3588_GMAC_CLK_SELET_SHIFT = 0x4, 2020 RK3588_GMAC_CLK_SELET_MASK = BIT(4), 2021 RK3588_GMAC_CLK_SELET_CRU = BIT(4), 2022 RK3588_GMAC_CLK_SELET_IO = 0, 2023 }; 2024 2025 php_grf = syscon_get_first_range(ROCKCHIP_SYSCON_PHP_GRF); 2026 val = pdata->clock_input ? RK3588_GMAC_CLK_SELET_IO : 2027 RK3588_GMAC_CLK_SELET_CRU; 2028 mask = RK3588_GMAC_CLK_SELET_MASK; 2029 2030 if (pdata->bus_id == 1) { 2031 val <<= 5; 2032 mask <<= 5; 2033 } 2034 2035 rk_clrsetreg(&php_grf->clk_con1, mask, val); 2036 } 2037 #endif 2038 2039 static int gmac_rockchip_probe(struct udevice *dev) 2040 { 2041 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 2042 struct rk_gmac_ops *ops = 2043 (struct rk_gmac_ops *)dev_get_driver_data(dev); 2044 #ifdef CONFIG_DWC_ETH_QOS 2045 struct eqos_config *config; 2046 #else 2047 struct dw_eth_pdata *dw_pdata; 2048 #endif 2049 struct eth_pdata *eth_pdata; 2050 struct clk clk; 2051 ulong rate; 2052 int ret; 2053 2054 #ifdef CONFIG_DWC_ETH_QOS 2055 eth_pdata = &pdata->eth_pdata; 2056 config = (struct eqos_config *)&ops->config; 2057 memcpy(config, &eqos_rockchip_config, sizeof(struct eqos_config)); 2058 eth_pdata->phy_interface = config->ops->eqos_get_interface(dev); 2059 #else 2060 dw_pdata = &pdata->dw_eth_pdata; 2061 eth_pdata = &dw_pdata->eth_pdata; 2062 #endif 2063 pdata->bus_id = dev->seq; 2064 2065 /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ 2066 ret = clk_set_defaults(dev); 2067 if (ret) 2068 debug("%s clk_set_defaults failed %d\n", __func__, ret); 2069 2070 ret = clk_get_by_index(dev, 0, &clk); 2071 if (ret) 2072 debug("%s clk_get_by_index failed %d\n", __func__, ret); 2073 2074 pdata->phy_interface = eth_pdata->phy_interface; 2075 2076 if (ops->set_clock_selection) 2077 ops->set_clock_selection(pdata); 2078 2079 if (pdata->integrated_phy && ops->integrated_phy_powerup) 2080 ops->integrated_phy_powerup(pdata); 2081 2082 switch (eth_pdata->phy_interface) { 2083 case PHY_INTERFACE_MODE_RGMII: 2084 case PHY_INTERFACE_MODE_RGMII_RXID: 2085 /* 2086 * If the gmac clock is from internal pll, need to set and 2087 * check the return value for gmac clock at RGMII mode. If 2088 * the gmac clock is from external source, the clock rate 2089 * is not set, because of it is bypassed. 2090 */ 2091 if (!pdata->clock_input) { 2092 if (clk.id) { 2093 rate = clk_set_rate(&clk, 125000000); 2094 if (rate != 125000000) 2095 return -EINVAL; 2096 } 2097 } 2098 2099 if (eth_pdata->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) 2100 pdata->rx_delay = -1; 2101 2102 /* Set to RGMII mode */ 2103 if (ops->set_to_rgmii) 2104 ops->set_to_rgmii(pdata); 2105 else 2106 return -EPERM; 2107 2108 break; 2109 case PHY_INTERFACE_MODE_RMII: 2110 /* The commet is the same as RGMII mode */ 2111 if (!pdata->clock_input) { 2112 printf("%s line: %d\n", __func__, __LINE__); 2113 if (clk.id) { 2114 rate = clk_set_rate(&clk, 50000000); 2115 printf("%s line: %d\n", __func__, __LINE__); 2116 if (rate != 50000000) 2117 return -EINVAL; 2118 } 2119 } 2120 2121 /* Set to RMII mode */ 2122 if (ops->set_to_rmii) 2123 ops->set_to_rmii(pdata); 2124 2125 break; 2126 default: 2127 debug("NO interface defined!\n"); 2128 return -ENXIO; 2129 } 2130 2131 #ifdef CONFIG_DWC_ETH_QOS 2132 return eqos_probe(dev); 2133 #else 2134 return designware_eth_probe(dev); 2135 #endif 2136 } 2137 2138 static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev) 2139 { 2140 #if defined(CONFIG_DWC_ETH_QOS) 2141 return eqos_write_hwaddr(dev); 2142 #else 2143 return designware_eth_write_hwaddr(dev); 2144 #endif 2145 } 2146 2147 static int gmac_rockchip_eth_free_pkt(struct udevice *dev, uchar *packet, 2148 int length) 2149 { 2150 #ifdef CONFIG_DWC_ETH_QOS 2151 return eqos_free_pkt(dev, packet, length); 2152 #else 2153 return designware_eth_free_pkt(dev, packet, length); 2154 #endif 2155 } 2156 2157 static int gmac_rockchip_eth_send(struct udevice *dev, void *packet, 2158 int length) 2159 { 2160 #ifdef CONFIG_DWC_ETH_QOS 2161 return eqos_send(dev, packet, length); 2162 #else 2163 return designware_eth_send(dev, packet, length); 2164 #endif 2165 } 2166 2167 static int gmac_rockchip_eth_recv(struct udevice *dev, int flags, 2168 uchar **packetp) 2169 { 2170 #ifdef CONFIG_DWC_ETH_QOS 2171 return eqos_recv(dev, flags, packetp); 2172 #else 2173 return designware_eth_recv(dev, flags, packetp); 2174 #endif 2175 } 2176 2177 static int gmac_rockchip_eth_start(struct udevice *dev) 2178 { 2179 struct rockchip_eth_dev *priv = dev_get_priv(dev); 2180 struct rk_gmac_ops *ops = 2181 (struct rk_gmac_ops *)dev_get_driver_data(dev); 2182 struct gmac_rockchip_platdata *pdata = dev_get_platdata(dev); 2183 #ifndef CONFIG_DWC_ETH_QOS 2184 struct dw_eth_pdata *dw_pdata; 2185 struct eth_pdata *eth_pdata; 2186 #endif 2187 int ret; 2188 2189 #ifdef CONFIG_DWC_ETH_QOS 2190 ret = eqos_init(dev); 2191 #else 2192 dw_pdata = &pdata->dw_eth_pdata; 2193 eth_pdata = &dw_pdata->eth_pdata; 2194 ret = designware_eth_init((struct dw_eth_dev *)priv, 2195 eth_pdata->enetaddr); 2196 #endif 2197 if (ret) 2198 return ret; 2199 ret = ops->fix_mac_speed(pdata, priv); 2200 if (ret) 2201 return ret; 2202 2203 #ifdef CONFIG_DWC_ETH_QOS 2204 eqos_enable(dev); 2205 #else 2206 ret = designware_eth_enable((struct dw_eth_dev *)priv); 2207 if (ret) 2208 return ret; 2209 #endif 2210 2211 return 0; 2212 } 2213 2214 static void gmac_rockchip_eth_stop(struct udevice *dev) 2215 { 2216 #ifdef CONFIG_DWC_ETH_QOS 2217 eqos_stop(dev); 2218 #else 2219 designware_eth_stop(dev); 2220 #endif 2221 } 2222 2223 const struct eth_ops gmac_rockchip_eth_ops = { 2224 .start = gmac_rockchip_eth_start, 2225 .send = gmac_rockchip_eth_send, 2226 .recv = gmac_rockchip_eth_recv, 2227 .free_pkt = gmac_rockchip_eth_free_pkt, 2228 .stop = gmac_rockchip_eth_stop, 2229 .write_hwaddr = gmac_rockchip_eth_write_hwaddr, 2230 }; 2231 2232 #ifndef CONFIG_DWC_ETH_QOS 2233 const struct rk_gmac_ops px30_gmac_ops = { 2234 .fix_mac_speed = px30_gmac_fix_mac_speed, 2235 .set_to_rmii = px30_gmac_set_to_rmii, 2236 }; 2237 2238 const struct rk_gmac_ops rk1808_gmac_ops = { 2239 .fix_mac_speed = rk1808_gmac_fix_mac_speed, 2240 .set_to_rgmii = rk1808_gmac_set_to_rgmii, 2241 }; 2242 2243 const struct rk_gmac_ops rk3228_gmac_ops = { 2244 .fix_mac_speed = rk3228_gmac_fix_mac_speed, 2245 .set_to_rmii = rk3228_gmac_set_to_rmii, 2246 .set_to_rgmii = rk3228_gmac_set_to_rgmii, 2247 .integrated_phy_powerup = rk3228_gmac_integrated_phy_powerup, 2248 }; 2249 2250 const struct rk_gmac_ops rk3288_gmac_ops = { 2251 .fix_mac_speed = rk3288_gmac_fix_mac_speed, 2252 .set_to_rgmii = rk3288_gmac_set_to_rgmii, 2253 }; 2254 2255 const struct rk_gmac_ops rk3308_gmac_ops = { 2256 .fix_mac_speed = rk3308_gmac_fix_mac_speed, 2257 .set_to_rmii = rk3308_gmac_set_to_rmii, 2258 }; 2259 2260 const struct rk_gmac_ops rk3328_gmac_ops = { 2261 .fix_mac_speed = rk3328_gmac_fix_mac_speed, 2262 .set_to_rmii = rk3328_gmac_set_to_rmii, 2263 .set_to_rgmii = rk3328_gmac_set_to_rgmii, 2264 .integrated_phy_powerup = rk3328_gmac_integrated_phy_powerup, 2265 }; 2266 2267 const struct rk_gmac_ops rk3368_gmac_ops = { 2268 .fix_mac_speed = rk3368_gmac_fix_mac_speed, 2269 .set_to_rgmii = rk3368_gmac_set_to_rgmii, 2270 }; 2271 2272 const struct rk_gmac_ops rk3399_gmac_ops = { 2273 .fix_mac_speed = rk3399_gmac_fix_mac_speed, 2274 .set_to_rgmii = rk3399_gmac_set_to_rgmii, 2275 }; 2276 2277 const struct rk_gmac_ops rv1108_gmac_ops = { 2278 .fix_mac_speed = rv1108_set_rmii_speed, 2279 .set_to_rmii = rv1108_gmac_set_to_rmii, 2280 }; 2281 #else 2282 const struct rk_gmac_ops rk3506_gmac_ops = { 2283 .fix_mac_speed = rk3506_set_rmii_speed, 2284 .set_to_rmii = rk3506_set_to_rmii, 2285 .set_clock_selection = rk3506_set_clock_selection, 2286 }; 2287 2288 const struct rk_gmac_ops rk3528_gmac_ops = { 2289 .fix_mac_speed = rk3528_set_rgmii_speed, 2290 .set_to_rgmii = rk3528_set_to_rgmii, 2291 .set_to_rmii = rk3528_set_to_rmii, 2292 .set_clock_selection = rk3528_set_clock_selection, 2293 .integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup, 2294 }; 2295 2296 const struct rk_gmac_ops rk3562_gmac_ops = { 2297 .fix_mac_speed = rk3562_set_gmac_speed, 2298 .set_to_rgmii = rk3562_set_to_rgmii, 2299 .set_to_rmii = rk3562_set_to_rmii, 2300 .set_clock_selection = rk3562_set_clock_selection, 2301 }; 2302 2303 const struct rk_gmac_ops rk3568_gmac_ops = { 2304 .fix_mac_speed = rv1126_set_rgmii_speed, 2305 .set_to_rgmii = rk3568_set_to_rgmii, 2306 .set_to_rmii = rk3568_set_to_rmii, 2307 }; 2308 2309 const struct rk_gmac_ops rk3588_gmac_ops = { 2310 .fix_mac_speed = rk3588_set_rgmii_speed, 2311 .set_to_rgmii = rk3588_set_to_rgmii, 2312 .set_to_rmii = rk3588_set_to_rmii, 2313 .set_clock_selection = rk3588_set_clock_selection, 2314 }; 2315 2316 const struct rk_gmac_ops rv1103b_gmac_ops = { 2317 .fix_mac_speed = rv1106_set_rmii_speed, 2318 .set_to_rmii = rv1103b_set_to_rmii, 2319 .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 2320 }; 2321 2322 const struct rk_gmac_ops rv1106_gmac_ops = { 2323 .fix_mac_speed = rv1106_set_rmii_speed, 2324 .set_to_rmii = rv1106_set_to_rmii, 2325 .integrated_phy_powerup = rv1106_gmac_integrated_phy_powerup, 2326 }; 2327 2328 const struct rk_gmac_ops rv1126_gmac_ops = { 2329 .fix_mac_speed = rv1126_set_rgmii_speed, 2330 .set_to_rgmii = rv1126_set_to_rgmii, 2331 .set_to_rmii = rv1126_set_to_rmii, 2332 }; 2333 #endif 2334 2335 static const struct udevice_id rockchip_gmac_ids[] = { 2336 #ifndef CONFIG_DWC_ETH_QOS 2337 #ifdef CONFIG_ROCKCHIP_PX30 2338 { .compatible = "rockchip,px30-gmac", 2339 .data = (ulong)&px30_gmac_ops }, 2340 #endif 2341 2342 #ifdef CONFIG_ROCKCHIP_RK1808 2343 { .compatible = "rockchip,rk1808-gmac", 2344 .data = (ulong)&rk1808_gmac_ops }, 2345 #endif 2346 2347 #ifdef CONFIG_ROCKCHIP_RK3228 2348 { .compatible = "rockchip,rk3228-gmac", 2349 .data = (ulong)&rk3228_gmac_ops }, 2350 #endif 2351 2352 #ifdef CONFIG_ROCKCHIP_RK3288 2353 { .compatible = "rockchip,rk3288-gmac", 2354 .data = (ulong)&rk3288_gmac_ops }, 2355 #endif 2356 2357 #ifdef CONFIG_ROCKCHIP_RK3308 2358 { .compatible = "rockchip,rk3308-mac", 2359 .data = (ulong)&rk3308_gmac_ops }, 2360 #endif 2361 2362 #ifdef CONFIG_ROCKCHIP_RK3328 2363 { .compatible = "rockchip,rk3328-gmac", 2364 .data = (ulong)&rk3328_gmac_ops }, 2365 #endif 2366 2367 #ifdef CONFIG_ROCKCHIP_RK3368 2368 { .compatible = "rockchip,rk3368-gmac", 2369 .data = (ulong)&rk3368_gmac_ops }, 2370 #endif 2371 2372 #ifdef CONFIG_ROCKCHIP_RK3399 2373 { .compatible = "rockchip,rk3399-gmac", 2374 .data = (ulong)&rk3399_gmac_ops }, 2375 #endif 2376 2377 #ifdef CONFIG_ROCKCHIP_RV1108 2378 { .compatible = "rockchip,rv1108-gmac", 2379 .data = (ulong)&rv1108_gmac_ops }, 2380 #endif 2381 #else 2382 #ifdef CONFIG_ROCKCHIP_RK3506 2383 { .compatible = "rockchip,rk3506-gmac", 2384 .data = (ulong)&rk3506_gmac_ops }, 2385 #endif 2386 2387 #ifdef CONFIG_ROCKCHIP_RK3528 2388 { .compatible = "rockchip,rk3528-gmac", 2389 .data = (ulong)&rk3528_gmac_ops }, 2390 #endif 2391 2392 #ifdef CONFIG_ROCKCHIP_RK3562 2393 { .compatible = "rockchip,rk3562-gmac", 2394 .data = (ulong)&rk3562_gmac_ops }, 2395 #endif 2396 2397 #ifdef CONFIG_ROCKCHIP_RK3568 2398 { .compatible = "rockchip,rk3568-gmac", 2399 .data = (ulong)&rk3568_gmac_ops }, 2400 #endif 2401 2402 #ifdef CONFIG_ROCKCHIP_RK3588 2403 { .compatible = "rockchip,rk3588-gmac", 2404 .data = (ulong)&rk3588_gmac_ops }, 2405 #endif 2406 2407 #ifdef CONFIG_ROCKCHIP_RV1103B 2408 { .compatible = "rockchip,rv1103b-gmac", 2409 .data = (ulong)&rv1103b_gmac_ops }, 2410 #endif 2411 2412 #ifdef CONFIG_ROCKCHIP_RV1106 2413 { .compatible = "rockchip,rv1106-gmac", 2414 .data = (ulong)&rv1106_gmac_ops }, 2415 #endif 2416 2417 #ifdef CONFIG_ROCKCHIP_RV1126 2418 { .compatible = "rockchip,rv1126-gmac", 2419 .data = (ulong)&rv1126_gmac_ops }, 2420 #endif 2421 #endif 2422 { } 2423 }; 2424 2425 U_BOOT_DRIVER(eth_gmac_rockchip) = { 2426 .name = "gmac_rockchip", 2427 .id = UCLASS_ETH, 2428 .of_match = rockchip_gmac_ids, 2429 .ofdata_to_platdata = gmac_rockchip_ofdata_to_platdata, 2430 .probe = gmac_rockchip_probe, 2431 .ops = &gmac_rockchip_eth_ops, 2432 .priv_auto_alloc_size = sizeof(struct rockchip_eth_dev), 2433 .platdata_auto_alloc_size = sizeof(struct gmac_rockchip_platdata), 2434 .flags = DM_FLAG_ALLOC_PRIV_DMA, 2435 }; 2436