Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: stmmac: dwmac-rk: add rk3366 & rk3399 specific data

Add constants and callback functions for the dwmac on rk3228/rk3229 socs.
As can be seen, the base structure is the same, only registers and the
bits in them moved slightly.

Signed-off-by: Roger Chen <roger.chen@rock-chips.com>
Signed-off-by: Caesar Wang <wxt@rock-chips.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Roger Chen and committed by
David S. Miller
ba289af8 dd19bde3

+232 -2
+6 -2
Documentation/devicetree/bindings/net/rockchip-dwmac.txt
··· 3 3 The device node has following properties. 4 4 5 5 Required properties: 6 - - compatible: Can be one of "rockchip,rk3228-gmac", "rockchip,rk3288-gmac", 7 - "rockchip,rk3368-gmac" 6 + - compatible: should be "rockchip,<name>-gamc" 7 + "rockchip,rk3228-gmac": found on RK322x SoCs 8 + "rockchip,rk3288-gmac": found on RK3288 SoCs 9 + "rockchip,rk3366-gmac": found on RK3366 SoCs 10 + "rockchip,rk3368-gmac": found on RK3368 SoCs 11 + "rockchip,rk3399-gmac": found on RK3399 SoCs 8 12 - reg: addresses and length of the register sets for the device. 9 13 - interrupts: Should contain the GMAC interrupts. 10 14 - interrupt-names: Should contain the interrupt names "macirq".
+226
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
··· 301 301 .set_rmii_speed = rk3288_set_rmii_speed, 302 302 }; 303 303 304 + #define RK3366_GRF_SOC_CON6 0x0418 305 + #define RK3366_GRF_SOC_CON7 0x041c 306 + 307 + /* RK3366_GRF_SOC_CON6 */ 308 + #define RK3366_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \ 309 + GRF_CLR_BIT(11)) 310 + #define RK3366_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \ 311 + GRF_BIT(11)) 312 + #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8) 313 + #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8) 314 + #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7) 315 + #define RK3366_GMAC_SPEED_100M GRF_BIT(7) 316 + #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3) 317 + #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3) 318 + #define RK3366_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5)) 319 + #define RK3366_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5)) 320 + #define RK3366_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5)) 321 + #define RK3366_GMAC_RMII_MODE GRF_BIT(6) 322 + #define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6) 323 + 324 + /* RK3366_GRF_SOC_CON7 */ 325 + #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7) 326 + #define RK3366_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7) 327 + #define RK3366_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) 328 + #define RK3366_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) 329 + #define RK3366_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) 330 + #define RK3366_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) 331 + 332 + static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv, 333 + int tx_delay, int rx_delay) 334 + { 335 + struct device *dev = &bsp_priv->pdev->dev; 336 + 337 + if (IS_ERR(bsp_priv->grf)) { 338 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 339 + return; 340 + } 341 + 342 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 343 + RK3366_GMAC_PHY_INTF_SEL_RGMII | 344 + RK3366_GMAC_RMII_MODE_CLR); 345 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7, 346 + RK3366_GMAC_RXCLK_DLY_ENABLE | 347 + RK3366_GMAC_TXCLK_DLY_ENABLE | 348 + RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) | 349 + RK3366_GMAC_CLK_TX_DL_CFG(tx_delay)); 350 + } 351 + 352 + static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv) 353 + { 354 + struct device *dev = &bsp_priv->pdev->dev; 355 + 356 + if (IS_ERR(bsp_priv->grf)) { 357 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 358 + return; 359 + } 360 + 361 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 362 + RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE); 363 + } 364 + 365 + static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) 366 + { 367 + struct device *dev = &bsp_priv->pdev->dev; 368 + 369 + if (IS_ERR(bsp_priv->grf)) { 370 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 371 + return; 372 + } 373 + 374 + if (speed == 10) 375 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 376 + RK3366_GMAC_CLK_2_5M); 377 + else if (speed == 100) 378 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 379 + RK3366_GMAC_CLK_25M); 380 + else if (speed == 1000) 381 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 382 + RK3366_GMAC_CLK_125M); 383 + else 384 + dev_err(dev, "unknown speed value for RGMII! speed=%d", speed); 385 + } 386 + 387 + static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) 388 + { 389 + struct device *dev = &bsp_priv->pdev->dev; 390 + 391 + if (IS_ERR(bsp_priv->grf)) { 392 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 393 + return; 394 + } 395 + 396 + if (speed == 10) { 397 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 398 + RK3366_GMAC_RMII_CLK_2_5M | 399 + RK3366_GMAC_SPEED_10M); 400 + } else if (speed == 100) { 401 + regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6, 402 + RK3366_GMAC_RMII_CLK_25M | 403 + RK3366_GMAC_SPEED_100M); 404 + } else { 405 + dev_err(dev, "unknown speed value for RMII! speed=%d", speed); 406 + } 407 + } 408 + 409 + static const struct rk_gmac_ops rk3366_ops = { 410 + .set_to_rgmii = rk3366_set_to_rgmii, 411 + .set_to_rmii = rk3366_set_to_rmii, 412 + .set_rgmii_speed = rk3366_set_rgmii_speed, 413 + .set_rmii_speed = rk3366_set_rmii_speed, 414 + }; 415 + 304 416 #define RK3368_GRF_SOC_CON15 0x043c 305 417 #define RK3368_GRF_SOC_CON16 0x0440 306 418 ··· 523 411 .set_to_rmii = rk3368_set_to_rmii, 524 412 .set_rgmii_speed = rk3368_set_rgmii_speed, 525 413 .set_rmii_speed = rk3368_set_rmii_speed, 414 + }; 415 + 416 + #define RK3399_GRF_SOC_CON5 0xc214 417 + #define RK3399_GRF_SOC_CON6 0xc218 418 + 419 + /* RK3399_GRF_SOC_CON5 */ 420 + #define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \ 421 + GRF_CLR_BIT(11)) 422 + #define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \ 423 + GRF_BIT(11)) 424 + #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8) 425 + #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8) 426 + #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7) 427 + #define RK3399_GMAC_SPEED_100M GRF_BIT(7) 428 + #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3) 429 + #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3) 430 + #define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5)) 431 + #define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5)) 432 + #define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5)) 433 + #define RK3399_GMAC_RMII_MODE GRF_BIT(6) 434 + #define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6) 435 + 436 + /* RK3399_GRF_SOC_CON6 */ 437 + #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7) 438 + #define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7) 439 + #define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) 440 + #define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) 441 + #define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) 442 + #define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) 443 + 444 + static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv, 445 + int tx_delay, int rx_delay) 446 + { 447 + struct device *dev = &bsp_priv->pdev->dev; 448 + 449 + if (IS_ERR(bsp_priv->grf)) { 450 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 451 + return; 452 + } 453 + 454 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 455 + RK3399_GMAC_PHY_INTF_SEL_RGMII | 456 + RK3399_GMAC_RMII_MODE_CLR); 457 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6, 458 + RK3399_GMAC_RXCLK_DLY_ENABLE | 459 + RK3399_GMAC_TXCLK_DLY_ENABLE | 460 + RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) | 461 + RK3399_GMAC_CLK_TX_DL_CFG(tx_delay)); 462 + } 463 + 464 + static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv) 465 + { 466 + struct device *dev = &bsp_priv->pdev->dev; 467 + 468 + if (IS_ERR(bsp_priv->grf)) { 469 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 470 + return; 471 + } 472 + 473 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 474 + RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE); 475 + } 476 + 477 + static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) 478 + { 479 + struct device *dev = &bsp_priv->pdev->dev; 480 + 481 + if (IS_ERR(bsp_priv->grf)) { 482 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 483 + return; 484 + } 485 + 486 + if (speed == 10) 487 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 488 + RK3399_GMAC_CLK_2_5M); 489 + else if (speed == 100) 490 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 491 + RK3399_GMAC_CLK_25M); 492 + else if (speed == 1000) 493 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 494 + RK3399_GMAC_CLK_125M); 495 + else 496 + dev_err(dev, "unknown speed value for RGMII! speed=%d", speed); 497 + } 498 + 499 + static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) 500 + { 501 + struct device *dev = &bsp_priv->pdev->dev; 502 + 503 + if (IS_ERR(bsp_priv->grf)) { 504 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 505 + return; 506 + } 507 + 508 + if (speed == 10) { 509 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 510 + RK3399_GMAC_RMII_CLK_2_5M | 511 + RK3399_GMAC_SPEED_10M); 512 + } else if (speed == 100) { 513 + regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5, 514 + RK3399_GMAC_RMII_CLK_25M | 515 + RK3399_GMAC_SPEED_100M); 516 + } else { 517 + dev_err(dev, "unknown speed value for RMII! speed=%d", speed); 518 + } 519 + } 520 + 521 + static const struct rk_gmac_ops rk3399_ops = { 522 + .set_to_rgmii = rk3399_set_to_rgmii, 523 + .set_to_rmii = rk3399_set_to_rmii, 524 + .set_rgmii_speed = rk3399_set_rgmii_speed, 525 + .set_rmii_speed = rk3399_set_rmii_speed, 526 526 }; 527 527 528 528 static int gmac_clk_init(struct rk_priv_data *bsp_priv) ··· 984 760 static const struct of_device_id rk_gmac_dwmac_match[] = { 985 761 { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops }, 986 762 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops }, 763 + { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops }, 987 764 { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops }, 765 + { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops }, 988 766 { } 989 767 }; 990 768 MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);