Commit 23650e03d6908e3462102103908a2dba0d7a03ee
Committed by
Ye Li
1 parent
120b0893b9
Exists in
smarc_8mq_lf_v2020.04
and in
4 other branches
MLK-23165-15 net: dwc_eth_qos: add dwc eqos for imx support
Add dwc eqos for imx support. Reviewed-by: Ye Li <ye.li@nxp.com> Signed-off-by: Fugang Duan <fugang.duan@nxp.com> (cherry picked from commit 52751a41c92a719891c8154cfc488165cc42f713)
Showing 1 changed file with 173 additions and 14 deletions Side-by-side Diff
drivers/net/dwc_eth_qos.c
| ... | ... | @@ -81,6 +81,7 @@ |
| 81 | 81 | #define EQOS_MAC_CONFIGURATION_PS BIT(15) |
| 82 | 82 | #define EQOS_MAC_CONFIGURATION_FES BIT(14) |
| 83 | 83 | #define EQOS_MAC_CONFIGURATION_DM BIT(13) |
| 84 | +#define EQOS_MAC_CONFIGURATION_LM BIT(12) | |
| 84 | 85 | #define EQOS_MAC_CONFIGURATION_TE BIT(1) |
| 85 | 86 | #define EQOS_MAC_CONFIGURATION_RE BIT(0) |
| 86 | 87 | |
| 87 | 88 | |
| ... | ... | @@ -102,11 +103,19 @@ |
| 102 | 103 | #define EQOS_MAC_RXQ_CTRL2_PSRQ0_SHIFT 0 |
| 103 | 104 | #define EQOS_MAC_RXQ_CTRL2_PSRQ0_MASK 0xff |
| 104 | 105 | |
| 106 | +#define EQOS_MAC_HW_FEATURE0_MMCSEL_SHIFT 8 | |
| 107 | +#define EQOS_MAC_HW_FEATURE0_HDSEL_SHIFT 2 | |
| 108 | +#define EQOS_MAC_HW_FEATURE0_GMIISEL_SHIFT 1 | |
| 109 | +#define EQOS_MAC_HW_FEATURE0_MIISEL_SHIFT 0 | |
| 110 | + | |
| 105 | 111 | #define EQOS_MAC_HW_FEATURE1_TXFIFOSIZE_SHIFT 6 |
| 106 | 112 | #define EQOS_MAC_HW_FEATURE1_TXFIFOSIZE_MASK 0x1f |
| 107 | 113 | #define EQOS_MAC_HW_FEATURE1_RXFIFOSIZE_SHIFT 0 |
| 108 | 114 | #define EQOS_MAC_HW_FEATURE1_RXFIFOSIZE_MASK 0x1f |
| 109 | 115 | |
| 116 | +#define EQOS_MAC_HW_FEATURE3_ASP_SHIFT 28 | |
| 117 | +#define EQOS_MAC_HW_FEATURE3_ASP_MASK 0x3 | |
| 118 | + | |
| 110 | 119 | #define EQOS_MAC_MDIO_ADDRESS_PA_SHIFT 21 |
| 111 | 120 | #define EQOS_MAC_MDIO_ADDRESS_RDA_SHIFT 16 |
| 112 | 121 | #define EQOS_MAC_MDIO_ADDRESS_CR_SHIFT 8 |
| ... | ... | @@ -154,6 +163,8 @@ |
| 154 | 163 | #define EQOS_MTL_RXQ0_OPERATION_MODE_RFA_MASK 0x3f |
| 155 | 164 | #define EQOS_MTL_RXQ0_OPERATION_MODE_EHFC BIT(7) |
| 156 | 165 | #define EQOS_MTL_RXQ0_OPERATION_MODE_RSF BIT(5) |
| 166 | +#define EQOS_MTL_RXQ0_OPERATION_MODE_FEP BIT(4) | |
| 167 | +#define EQOS_MTL_RXQ0_OPERATION_MODE_FUP BIT(3) | |
| 157 | 168 | |
| 158 | 169 | #define EQOS_MTL_RXQ0_DEBUG_PRXQ_SHIFT 16 |
| 159 | 170 | #define EQOS_MTL_RXQ0_DEBUG_PRXQ_MASK 0x7fff |
| ... | ... | @@ -366,7 +377,7 @@ |
| 366 | 377 | #endif |
| 367 | 378 | } |
| 368 | 379 | |
| 369 | -static void eqos_inval_desc_stm32(void *desc) | |
| 380 | +static void eqos_inval_desc_generic(void *desc) | |
| 370 | 381 | { |
| 371 | 382 | #ifndef CONFIG_SYS_NONCACHED_MEMORY |
| 372 | 383 | unsigned long start = rounddown((unsigned long)desc, ARCH_DMA_MINALIGN); |
| ... | ... | @@ -384,7 +395,7 @@ |
| 384 | 395 | #endif |
| 385 | 396 | } |
| 386 | 397 | |
| 387 | -static void eqos_flush_desc_stm32(void *desc) | |
| 398 | +static void eqos_flush_desc_generic(void *desc) | |
| 388 | 399 | { |
| 389 | 400 | #ifndef CONFIG_SYS_NONCACHED_MEMORY |
| 390 | 401 | unsigned long start = rounddown((unsigned long)desc, ARCH_DMA_MINALIGN); |
| ... | ... | @@ -403,7 +414,7 @@ |
| 403 | 414 | invalidate_dcache_range(start, end); |
| 404 | 415 | } |
| 405 | 416 | |
| 406 | -static void eqos_inval_buffer_stm32(void *buf, size_t size) | |
| 417 | +static void eqos_inval_buffer_generic(void *buf, size_t size) | |
| 407 | 418 | { |
| 408 | 419 | unsigned long start = rounddown((unsigned long)buf, ARCH_DMA_MINALIGN); |
| 409 | 420 | unsigned long end = roundup((unsigned long)buf + size, |
| ... | ... | @@ -417,7 +428,7 @@ |
| 417 | 428 | flush_cache((unsigned long)buf, size); |
| 418 | 429 | } |
| 419 | 430 | |
| 420 | -static void eqos_flush_buffer_stm32(void *buf, size_t size) | |
| 431 | +static void eqos_flush_buffer_generic(void *buf, size_t size) | |
| 421 | 432 | { |
| 422 | 433 | unsigned long start = rounddown((unsigned long)buf, ARCH_DMA_MINALIGN); |
| 423 | 434 | unsigned long end = roundup((unsigned long)buf + size, |
| ... | ... | @@ -520,6 +531,7 @@ |
| 520 | 531 | |
| 521 | 532 | static int eqos_start_clks_tegra186(struct udevice *dev) |
| 522 | 533 | { |
| 534 | +#ifdef CONFIG_CLK | |
| 523 | 535 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 524 | 536 | int ret; |
| 525 | 537 | |
| 526 | 538 | |
| ... | ... | @@ -560,10 +572,12 @@ |
| 560 | 572 | pr_err("clk_enable(clk_tx) failed: %d", ret); |
| 561 | 573 | goto err_disable_clk_ptp_ref; |
| 562 | 574 | } |
| 575 | +#endif | |
| 563 | 576 | |
| 564 | 577 | debug("%s: OK\n", __func__); |
| 565 | 578 | return 0; |
| 566 | 579 | |
| 580 | +#ifdef CONFIG_CLK | |
| 567 | 581 | err_disable_clk_ptp_ref: |
| 568 | 582 | clk_disable(&eqos->clk_ptp_ref); |
| 569 | 583 | err_disable_clk_rx: |
| 570 | 584 | |
| ... | ... | @@ -575,10 +589,12 @@ |
| 575 | 589 | err: |
| 576 | 590 | debug("%s: FAILED: %d\n", __func__, ret); |
| 577 | 591 | return ret; |
| 592 | +#endif | |
| 578 | 593 | } |
| 579 | 594 | |
| 580 | 595 | static int eqos_start_clks_stm32(struct udevice *dev) |
| 581 | 596 | { |
| 597 | +#ifdef CONFIG_CLK | |
| 582 | 598 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 583 | 599 | int ret; |
| 584 | 600 | |
| 585 | 601 | |
| ... | ... | @@ -609,10 +625,12 @@ |
| 609 | 625 | goto err_disable_clk_tx; |
| 610 | 626 | } |
| 611 | 627 | } |
| 628 | +#endif | |
| 612 | 629 | |
| 613 | 630 | debug("%s: OK\n", __func__); |
| 614 | 631 | return 0; |
| 615 | 632 | |
| 633 | +#ifdef CONFIG_CLK | |
| 616 | 634 | err_disable_clk_tx: |
| 617 | 635 | clk_disable(&eqos->clk_tx); |
| 618 | 636 | err_disable_clk_rx: |
| 619 | 637 | |
| 620 | 638 | |
| ... | ... | @@ -622,10 +640,17 @@ |
| 622 | 640 | err: |
| 623 | 641 | debug("%s: FAILED: %d\n", __func__, ret); |
| 624 | 642 | return ret; |
| 643 | +#endif | |
| 625 | 644 | } |
| 626 | 645 | |
| 646 | +static int eqos_start_clks_imx(struct udevice *dev) | |
| 647 | +{ | |
| 648 | + return 0; | |
| 649 | +} | |
| 650 | + | |
| 627 | 651 | static void eqos_stop_clks_tegra186(struct udevice *dev) |
| 628 | 652 | { |
| 653 | +#ifdef CONFIG_CLK | |
| 629 | 654 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 630 | 655 | |
| 631 | 656 | debug("%s(dev=%p):\n", __func__, dev); |
| 632 | 657 | |
| ... | ... | @@ -635,12 +660,14 @@ |
| 635 | 660 | clk_disable(&eqos->clk_rx); |
| 636 | 661 | clk_disable(&eqos->clk_master_bus); |
| 637 | 662 | clk_disable(&eqos->clk_slave_bus); |
| 663 | +#endif | |
| 638 | 664 | |
| 639 | 665 | debug("%s: OK\n", __func__); |
| 640 | 666 | } |
| 641 | 667 | |
| 642 | 668 | static void eqos_stop_clks_stm32(struct udevice *dev) |
| 643 | 669 | { |
| 670 | +#ifdef CONFIG_CLK | |
| 644 | 671 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 645 | 672 | |
| 646 | 673 | debug("%s(dev=%p):\n", __func__, dev); |
| 647 | 674 | |
| ... | ... | @@ -650,10 +677,16 @@ |
| 650 | 677 | clk_disable(&eqos->clk_master_bus); |
| 651 | 678 | if (clk_valid(&eqos->clk_ck)) |
| 652 | 679 | clk_disable(&eqos->clk_ck); |
| 680 | +#endif | |
| 653 | 681 | |
| 654 | 682 | debug("%s: OK\n", __func__); |
| 655 | 683 | } |
| 656 | 684 | |
| 685 | +static void eqos_stop_clks_imx(struct udevice *dev) | |
| 686 | +{ | |
| 687 | + /* empty */ | |
| 688 | +} | |
| 689 | + | |
| 657 | 690 | static int eqos_start_resets_tegra186(struct udevice *dev) |
| 658 | 691 | { |
| 659 | 692 | struct eqos_priv *eqos = dev_get_priv(dev); |
| ... | ... | @@ -698,6 +731,11 @@ |
| 698 | 731 | return 0; |
| 699 | 732 | } |
| 700 | 733 | |
| 734 | +static int eqos_start_resets_imx(struct udevice *dev) | |
| 735 | +{ | |
| 736 | + return 0; | |
| 737 | +} | |
| 738 | + | |
| 701 | 739 | static int eqos_stop_resets_tegra186(struct udevice *dev) |
| 702 | 740 | { |
| 703 | 741 | struct eqos_priv *eqos = dev_get_priv(dev); |
| ... | ... | @@ -713,6 +751,11 @@ |
| 713 | 751 | return 0; |
| 714 | 752 | } |
| 715 | 753 | |
| 754 | +static int eqos_stop_resets_imx(struct udevice *dev) | |
| 755 | +{ | |
| 756 | + return 0; | |
| 757 | +} | |
| 758 | + | |
| 716 | 759 | static int eqos_calibrate_pads_tegra186(struct udevice *dev) |
| 717 | 760 | { |
| 718 | 761 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 719 | 762 | |
| 720 | 763 | |
| 721 | 764 | |
| 722 | 765 | |
| 723 | 766 | |
| 724 | 767 | |
| ... | ... | @@ -767,28 +810,52 @@ |
| 767 | 810 | |
| 768 | 811 | static ulong eqos_get_tick_clk_rate_tegra186(struct udevice *dev) |
| 769 | 812 | { |
| 813 | +#ifdef CONFIG_CLK | |
| 770 | 814 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 771 | 815 | |
| 772 | 816 | return clk_get_rate(&eqos->clk_slave_bus); |
| 817 | +#else | |
| 818 | + return 0; | |
| 819 | +#endif | |
| 773 | 820 | } |
| 774 | 821 | |
| 775 | 822 | static ulong eqos_get_tick_clk_rate_stm32(struct udevice *dev) |
| 776 | 823 | { |
| 824 | +#ifdef CONFIG_CLK | |
| 777 | 825 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 778 | 826 | |
| 779 | 827 | return clk_get_rate(&eqos->clk_master_bus); |
| 828 | +#else | |
| 829 | + return 0; | |
| 830 | +#endif | |
| 780 | 831 | } |
| 781 | 832 | |
| 833 | +static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) | |
| 834 | +{ | |
| 835 | + /* TODO: retrieve from CSR clock */ | |
| 836 | + return 100 * 1000000; | |
| 837 | +} | |
| 838 | + | |
| 782 | 839 | static int eqos_calibrate_pads_stm32(struct udevice *dev) |
| 783 | 840 | { |
| 784 | 841 | return 0; |
| 785 | 842 | } |
| 786 | 843 | |
| 844 | +static int eqos_calibrate_pads_imx(struct udevice *dev) | |
| 845 | +{ | |
| 846 | + return 0; | |
| 847 | +} | |
| 848 | + | |
| 787 | 849 | static int eqos_disable_calibration_stm32(struct udevice *dev) |
| 788 | 850 | { |
| 789 | 851 | return 0; |
| 790 | 852 | } |
| 791 | 853 | |
| 854 | +static int eqos_disable_calibration_imx(struct udevice *dev) | |
| 855 | +{ | |
| 856 | + return 0; | |
| 857 | +} | |
| 858 | + | |
| 792 | 859 | static int eqos_set_full_duplex(struct udevice *dev) |
| 793 | 860 | { |
| 794 | 861 | struct eqos_priv *eqos = dev_get_priv(dev); |
| ... | ... | @@ -853,6 +920,7 @@ |
| 853 | 920 | |
| 854 | 921 | static int eqos_set_tx_clk_speed_tegra186(struct udevice *dev) |
| 855 | 922 | { |
| 923 | +#ifdef CONFIG_CLK | |
| 856 | 924 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 857 | 925 | ulong rate; |
| 858 | 926 | int ret; |
| ... | ... | @@ -879,6 +947,7 @@ |
| 879 | 947 | pr_err("clk_set_rate(tx_clk, %lu) failed: %d", rate, ret); |
| 880 | 948 | return ret; |
| 881 | 949 | } |
| 950 | +#endif | |
| 882 | 951 | |
| 883 | 952 | return 0; |
| 884 | 953 | } |
| ... | ... | @@ -888,6 +957,11 @@ |
| 888 | 957 | return 0; |
| 889 | 958 | } |
| 890 | 959 | |
| 960 | +static int eqos_set_tx_clk_speed_imx(struct udevice *dev) | |
| 961 | +{ | |
| 962 | + return 0; | |
| 963 | +} | |
| 964 | + | |
| 891 | 965 | static int eqos_adjust_link(struct udevice *dev) |
| 892 | 966 | { |
| 893 | 967 | struct eqos_priv *eqos = dev_get_priv(dev); |
| ... | ... | @@ -1085,6 +1159,7 @@ |
| 1085 | 1159 | } |
| 1086 | 1160 | |
| 1087 | 1161 | /* Configure MTL */ |
| 1162 | + writel(0x60, &eqos->mtl_regs->txq0_quantum_weight - 0x100); | |
| 1088 | 1163 | |
| 1089 | 1164 | /* Enable Store and Forward mode for TX */ |
| 1090 | 1165 | /* Program Tx operating mode */ |
| ... | ... | @@ -1098,7 +1173,9 @@ |
| 1098 | 1173 | |
| 1099 | 1174 | /* Enable Store and Forward mode for RX, since no jumbo frame */ |
| 1100 | 1175 | setbits_le32(&eqos->mtl_regs->rxq0_operation_mode, |
| 1101 | - EQOS_MTL_RXQ0_OPERATION_MODE_RSF); | |
| 1176 | + EQOS_MTL_RXQ0_OPERATION_MODE_RSF | | |
| 1177 | + EQOS_MTL_RXQ0_OPERATION_MODE_FEP | | |
| 1178 | + EQOS_MTL_RXQ0_OPERATION_MODE_FUP); | |
| 1102 | 1179 | |
| 1103 | 1180 | /* Transmit/Receive queue fifo size; use all RAM for 1 queue */ |
| 1104 | 1181 | val = readl(&eqos->mac_regs->hw_feature1); |
| ... | ... | @@ -1174,6 +1251,19 @@ |
| 1174 | 1251 | eqos->config->config_mac << |
| 1175 | 1252 | EQOS_MAC_RXQ_CTRL0_RXQ0EN_SHIFT); |
| 1176 | 1253 | |
| 1254 | + clrsetbits_le32(&eqos->mac_regs->rxq_ctrl0, | |
| 1255 | + EQOS_MAC_RXQ_CTRL0_RXQ0EN_MASK << | |
| 1256 | + EQOS_MAC_RXQ_CTRL0_RXQ0EN_SHIFT, | |
| 1257 | + 0x2 << | |
| 1258 | + EQOS_MAC_RXQ_CTRL0_RXQ0EN_SHIFT); | |
| 1259 | + | |
| 1260 | + /* Multicast and Broadcast Queue Enable */ | |
| 1261 | + setbits_le32(&eqos->mac_regs->unused_0a4, | |
| 1262 | + 0x00100000); | |
| 1263 | + /* enable promise mode */ | |
| 1264 | + setbits_le32(&eqos->mac_regs->unused_004[1], | |
| 1265 | + 0x1); | |
| 1266 | + | |
| 1177 | 1267 | /* Set TX flow control parameters */ |
| 1178 | 1268 | /* Set Pause Time */ |
| 1179 | 1269 | setbits_le32(&eqos->mac_regs->q0_tx_flow_ctrl, |
| ... | ... | @@ -1251,6 +1341,11 @@ |
| 1251 | 1341 | rx_desc->des0 = (u32)(ulong)(eqos->rx_dma_buf + |
| 1252 | 1342 | (i * EQOS_MAX_PACKET_SIZE)); |
| 1253 | 1343 | rx_desc->des3 |= EQOS_DESC3_OWN | EQOS_DESC3_BUF1V; |
| 1344 | + mb(); | |
| 1345 | + eqos->config->ops->eqos_flush_desc(rx_desc); | |
| 1346 | + eqos->config->ops->eqos_inval_buffer(eqos->rx_dma_buf + | |
| 1347 | + (i * EQOS_MAX_PACKET_SIZE), | |
| 1348 | + EQOS_MAX_PACKET_SIZE); | |
| 1254 | 1349 | } |
| 1255 | 1350 | eqos->config->ops->eqos_flush_desc(eqos->descs); |
| 1256 | 1351 | |
| 1257 | 1352 | |
| ... | ... | @@ -1265,14 +1360,12 @@ |
| 1265 | 1360 | &eqos->dma_regs->ch0_rxdesc_ring_length); |
| 1266 | 1361 | |
| 1267 | 1362 | /* Enable everything */ |
| 1268 | - | |
| 1269 | - setbits_le32(&eqos->mac_regs->configuration, | |
| 1270 | - EQOS_MAC_CONFIGURATION_TE | EQOS_MAC_CONFIGURATION_RE); | |
| 1271 | - | |
| 1272 | 1363 | setbits_le32(&eqos->dma_regs->ch0_tx_control, |
| 1273 | 1364 | EQOS_DMA_CH0_TX_CONTROL_ST); |
| 1274 | 1365 | setbits_le32(&eqos->dma_regs->ch0_rx_control, |
| 1275 | 1366 | EQOS_DMA_CH0_RX_CONTROL_SR); |
| 1367 | + setbits_le32(&eqos->mac_regs->configuration, | |
| 1368 | + EQOS_MAC_CONFIGURATION_TE | EQOS_MAC_CONFIGURATION_RE); | |
| 1276 | 1369 | |
| 1277 | 1370 | /* TX tail pointer not written until we need to TX a packet */ |
| 1278 | 1371 | /* |
| ... | ... | @@ -1404,6 +1497,7 @@ |
| 1404 | 1497 | debug("%s(dev=%p, flags=%x):\n", __func__, dev, flags); |
| 1405 | 1498 | |
| 1406 | 1499 | rx_desc = &(eqos->rx_descs[eqos->rx_desc_idx]); |
| 1500 | + eqos->config->ops->eqos_inval_desc(rx_desc); | |
| 1407 | 1501 | if (rx_desc->des3 & EQOS_DESC3_OWN) { |
| 1408 | 1502 | debug("%s: RX packet not available\n", __func__); |
| 1409 | 1503 | return -EAGAIN; |
| ... | ... | @@ -1435,6 +1529,8 @@ |
| 1435 | 1529 | return -EINVAL; |
| 1436 | 1530 | } |
| 1437 | 1531 | |
| 1532 | + eqos->config->ops->eqos_inval_buffer(packet, length); | |
| 1533 | + | |
| 1438 | 1534 | rx_desc = &(eqos->rx_descs[eqos->rx_desc_idx]); |
| 1439 | 1535 | rx_desc->des0 = (u32)(ulong)packet; |
| 1440 | 1536 | rx_desc->des1 = 0; |
| 1441 | 1537 | |
| 1442 | 1538 | |
| ... | ... | @@ -1682,17 +1778,42 @@ |
| 1682 | 1778 | return PHY_INTERFACE_MODE_MII; |
| 1683 | 1779 | } |
| 1684 | 1780 | |
| 1781 | +static int eqos_probe_resources_imx(struct udevice *dev) | |
| 1782 | +{ | |
| 1783 | + struct eqos_priv *eqos = dev_get_priv(dev); | |
| 1784 | + phy_interface_t interface; | |
| 1785 | + | |
| 1786 | + debug("%s(dev=%p):\n", __func__, dev); | |
| 1787 | + | |
| 1788 | + interface = eqos->config->interface(dev); | |
| 1789 | + | |
| 1790 | + if (interface == PHY_INTERFACE_MODE_NONE) { | |
| 1791 | + pr_err("Invalid PHY interface\n"); | |
| 1792 | + return -EINVAL; | |
| 1793 | + } | |
| 1794 | + | |
| 1795 | + debug("%s: OK\n", __func__); | |
| 1796 | + return 0; | |
| 1797 | +} | |
| 1798 | + | |
| 1799 | +static phy_interface_t eqos_get_interface_imx(struct udevice *dev) | |
| 1800 | +{ | |
| 1801 | + return PHY_INTERFACE_MODE_RGMII; | |
| 1802 | +} | |
| 1803 | + | |
| 1685 | 1804 | static int eqos_remove_resources_tegra186(struct udevice *dev) |
| 1686 | 1805 | { |
| 1687 | 1806 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 1688 | 1807 | |
| 1689 | 1808 | debug("%s(dev=%p):\n", __func__, dev); |
| 1690 | 1809 | |
| 1810 | +#ifdef CONFIG_CLK | |
| 1691 | 1811 | clk_free(&eqos->clk_tx); |
| 1692 | 1812 | clk_free(&eqos->clk_ptp_ref); |
| 1693 | 1813 | clk_free(&eqos->clk_rx); |
| 1694 | 1814 | clk_free(&eqos->clk_slave_bus); |
| 1695 | 1815 | clk_free(&eqos->clk_master_bus); |
| 1816 | +#endif | |
| 1696 | 1817 | dm_gpio_free(dev, &eqos->phy_reset_gpio); |
| 1697 | 1818 | reset_free(&eqos->reset_ctl); |
| 1698 | 1819 | |
| ... | ... | @@ -1702,6 +1823,7 @@ |
| 1702 | 1823 | |
| 1703 | 1824 | static int eqos_remove_resources_stm32(struct udevice *dev) |
| 1704 | 1825 | { |
| 1826 | +#ifdef CONFIG_CLK | |
| 1705 | 1827 | struct eqos_priv *eqos = dev_get_priv(dev); |
| 1706 | 1828 | |
| 1707 | 1829 | debug("%s(dev=%p):\n", __func__, dev); |
| 1708 | 1830 | |
| ... | ... | @@ -1711,11 +1833,17 @@ |
| 1711 | 1833 | clk_free(&eqos->clk_master_bus); |
| 1712 | 1834 | if (clk_valid(&eqos->clk_ck)) |
| 1713 | 1835 | clk_free(&eqos->clk_ck); |
| 1836 | +#endif | |
| 1714 | 1837 | |
| 1715 | 1838 | debug("%s: OK\n", __func__); |
| 1716 | 1839 | return 0; |
| 1717 | 1840 | } |
| 1718 | 1841 | |
| 1842 | +static int eqos_remove_resources_imx(struct udevice *dev) | |
| 1843 | +{ | |
| 1844 | + return 0; | |
| 1845 | +} | |
| 1846 | + | |
| 1719 | 1847 | static int eqos_probe(struct udevice *dev) |
| 1720 | 1848 | { |
| 1721 | 1849 | struct eqos_priv *eqos = dev_get_priv(dev); |
| ... | ... | @@ -1841,10 +1969,10 @@ |
| 1841 | 1969 | }; |
| 1842 | 1970 | |
| 1843 | 1971 | static struct eqos_ops eqos_stm32_ops = { |
| 1844 | - .eqos_inval_desc = eqos_inval_desc_stm32, | |
| 1845 | - .eqos_flush_desc = eqos_flush_desc_stm32, | |
| 1846 | - .eqos_inval_buffer = eqos_inval_buffer_stm32, | |
| 1847 | - .eqos_flush_buffer = eqos_flush_buffer_stm32, | |
| 1972 | + .eqos_inval_desc = eqos_inval_desc_generic, | |
| 1973 | + .eqos_flush_desc = eqos_flush_desc_generic, | |
| 1974 | + .eqos_inval_buffer = eqos_inval_buffer_generic, | |
| 1975 | + .eqos_flush_buffer = eqos_flush_buffer_generic, | |
| 1848 | 1976 | .eqos_probe_resources = eqos_probe_resources_stm32, |
| 1849 | 1977 | .eqos_remove_resources = eqos_remove_resources_stm32, |
| 1850 | 1978 | .eqos_stop_resets = eqos_stop_resets_stm32, |
| ... | ... | @@ -1867,6 +1995,33 @@ |
| 1867 | 1995 | .ops = &eqos_stm32_ops |
| 1868 | 1996 | }; |
| 1869 | 1997 | |
| 1998 | +static struct eqos_ops eqos_imx_ops = { | |
| 1999 | + .eqos_inval_desc = eqos_inval_desc_generic, | |
| 2000 | + .eqos_flush_desc = eqos_flush_desc_generic, | |
| 2001 | + .eqos_inval_buffer = eqos_inval_buffer_generic, | |
| 2002 | + .eqos_flush_buffer = eqos_flush_buffer_generic, | |
| 2003 | + .eqos_probe_resources = eqos_probe_resources_imx, | |
| 2004 | + .eqos_remove_resources = eqos_remove_resources_imx, | |
| 2005 | + .eqos_stop_resets = eqos_stop_resets_imx, | |
| 2006 | + .eqos_start_resets = eqos_start_resets_imx, | |
| 2007 | + .eqos_stop_clks = eqos_stop_clks_imx, | |
| 2008 | + .eqos_start_clks = eqos_start_clks_imx, | |
| 2009 | + .eqos_calibrate_pads = eqos_calibrate_pads_imx, | |
| 2010 | + .eqos_disable_calibration = eqos_disable_calibration_imx, | |
| 2011 | + .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_imx, | |
| 2012 | + .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_imx | |
| 2013 | +}; | |
| 2014 | + | |
| 2015 | +struct eqos_config eqos_imx_config = { | |
| 2016 | + .reg_access_always_ok = false, | |
| 2017 | + .mdio_wait = 10000, | |
| 2018 | + .swr_wait = 50, | |
| 2019 | + .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB, | |
| 2020 | + .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300, | |
| 2021 | + .interface = eqos_get_interface_imx, | |
| 2022 | + .ops = &eqos_imx_ops | |
| 2023 | +}; | |
| 2024 | + | |
| 1870 | 2025 | static const struct udevice_id eqos_ids[] = { |
| 1871 | 2026 | { |
| 1872 | 2027 | .compatible = "nvidia,tegra186-eqos", |
| ... | ... | @@ -1876,6 +2031,10 @@ |
| 1876 | 2031 | .compatible = "snps,dwmac-4.20a", |
| 1877 | 2032 | .data = (ulong)&eqos_stm32_config |
| 1878 | 2033 | }, |
| 2034 | + { | |
| 2035 | + .compatible = "fsl,imx-eqos", | |
| 2036 | + .data = (ulong)&eqos_imx_config | |
| 2037 | + }, | |
| 1879 | 2038 | |
| 1880 | 2039 | { } |
| 1881 | 2040 | }; |
| ... | ... | @@ -1883,7 +2042,7 @@ |
| 1883 | 2042 | U_BOOT_DRIVER(eth_eqos) = { |
| 1884 | 2043 | .name = "eth_eqos", |
| 1885 | 2044 | .id = UCLASS_ETH, |
| 1886 | - .of_match = eqos_ids, | |
| 2045 | + .of_match = of_match_ptr(eqos_ids), | |
| 1887 | 2046 | .probe = eqos_probe, |
| 1888 | 2047 | .remove = eqos_remove, |
| 1889 | 2048 | .ops = &eqos_ops, |