aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoger Chen <roger.chen@rock-chips.com>2016-09-01 13:49:59 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-02 20:08:56 -0400
commitba289af8020a6e81eac424e1d4ef3fcc8ff1b23d (patch)
tree65d6be2289d25abcd0331bde1930d88ce501450e
parentdd19bde36739702bbd9a832b5d4995bc0fa8d6d7 (diff)
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>
-rw-r--r--Documentation/devicetree/bindings/net/rockchip-dwmac.txt8
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c226
2 files changed, 232 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/net/rockchip-dwmac.txt b/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
index cccd945fc45b..95383c5131fc 100644
--- a/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
+++ b/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
@@ -3,8 +3,12 @@ Rockchip SoC RK3288 10/100/1000 Ethernet driver(GMAC)
3The device node has following properties. 3The device node has following properties.
4 4
5Required properties: 5Required properties:
6 - compatible: Can be one of "rockchip,rk3228-gmac", "rockchip,rk3288-gmac", 6 - compatible: should be "rockchip,<name>-gamc"
7 "rockchip,rk3368-gmac" 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 - reg: addresses and length of the register sets for the device. 12 - reg: addresses and length of the register sets for the device.
9 - interrupts: Should contain the GMAC interrupts. 13 - interrupts: Should contain the GMAC interrupts.
10 - interrupt-names: Should contain the interrupt names "macirq". 14 - interrupt-names: Should contain the interrupt names "macirq".
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 92105916ef40..4e6a27088313 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -301,6 +301,118 @@ static const struct rk_gmac_ops rk3288_ops = {
301 .set_rmii_speed = rk3288_set_rmii_speed, 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
332static 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
352static 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
365static 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
387static 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
409static 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#define RK3368_GRF_SOC_CON15 0x043c 416#define RK3368_GRF_SOC_CON15 0x043c
305#define RK3368_GRF_SOC_CON16 0x0440 417#define RK3368_GRF_SOC_CON16 0x0440
306 418
@@ -413,6 +525,118 @@ static const struct rk_gmac_ops rk3368_ops = {
413 .set_rmii_speed = rk3368_set_rmii_speed, 525 .set_rmii_speed = rk3368_set_rmii_speed,
414}; 526};
415 527
528#define RK3399_GRF_SOC_CON5 0xc214
529#define RK3399_GRF_SOC_CON6 0xc218
530
531/* RK3399_GRF_SOC_CON5 */
532#define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
533 GRF_CLR_BIT(11))
534#define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
535 GRF_BIT(11))
536#define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
537#define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
538#define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
539#define RK3399_GMAC_SPEED_100M GRF_BIT(7)
540#define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
541#define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
542#define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
543#define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
544#define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
545#define RK3399_GMAC_RMII_MODE GRF_BIT(6)
546#define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
547
548/* RK3399_GRF_SOC_CON6 */
549#define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
550#define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
551#define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
552#define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
553#define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
554#define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
555
556static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
557 int tx_delay, int rx_delay)
558{
559 struct device *dev = &bsp_priv->pdev->dev;
560
561 if (IS_ERR(bsp_priv->grf)) {
562 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
563 return;
564 }
565
566 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
567 RK3399_GMAC_PHY_INTF_SEL_RGMII |
568 RK3399_GMAC_RMII_MODE_CLR);
569 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
570 RK3399_GMAC_RXCLK_DLY_ENABLE |
571 RK3399_GMAC_TXCLK_DLY_ENABLE |
572 RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
573 RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
574}
575
576static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
577{
578 struct device *dev = &bsp_priv->pdev->dev;
579
580 if (IS_ERR(bsp_priv->grf)) {
581 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
582 return;
583 }
584
585 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
586 RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
587}
588
589static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
590{
591 struct device *dev = &bsp_priv->pdev->dev;
592
593 if (IS_ERR(bsp_priv->grf)) {
594 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
595 return;
596 }
597
598 if (speed == 10)
599 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
600 RK3399_GMAC_CLK_2_5M);
601 else if (speed == 100)
602 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
603 RK3399_GMAC_CLK_25M);
604 else if (speed == 1000)
605 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
606 RK3399_GMAC_CLK_125M);
607 else
608 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
609}
610
611static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
612{
613 struct device *dev = &bsp_priv->pdev->dev;
614
615 if (IS_ERR(bsp_priv->grf)) {
616 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
617 return;
618 }
619
620 if (speed == 10) {
621 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
622 RK3399_GMAC_RMII_CLK_2_5M |
623 RK3399_GMAC_SPEED_10M);
624 } else if (speed == 100) {
625 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
626 RK3399_GMAC_RMII_CLK_25M |
627 RK3399_GMAC_SPEED_100M);
628 } else {
629 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
630 }
631}
632
633static const struct rk_gmac_ops rk3399_ops = {
634 .set_to_rgmii = rk3399_set_to_rgmii,
635 .set_to_rmii = rk3399_set_to_rmii,
636 .set_rgmii_speed = rk3399_set_rgmii_speed,
637 .set_rmii_speed = rk3399_set_rmii_speed,
638};
639
416static int gmac_clk_init(struct rk_priv_data *bsp_priv) 640static int gmac_clk_init(struct rk_priv_data *bsp_priv)
417{ 641{
418 struct device *dev = &bsp_priv->pdev->dev; 642 struct device *dev = &bsp_priv->pdev->dev;
@@ -760,7 +984,9 @@ static int rk_gmac_probe(struct platform_device *pdev)
760static const struct of_device_id rk_gmac_dwmac_match[] = { 984static const struct of_device_id rk_gmac_dwmac_match[] = {
761 { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops }, 985 { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
762 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops }, 986 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
987 { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
763 { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops }, 988 { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
989 { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
764 { } 990 { }
765}; 991};
766MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match); 992MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);