Lines Matching +full:- +full:- +full:retry +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2018-19, Linaro Limited
119 return readl(ethqos->rgmii_base + offset); in rgmii_readl()
125 writel(value, ethqos->rgmii_base + offset); in rgmii_writel()
141 struct device *dev = &ethqos->pdev->dev; in rgmii_dump()
174 ethqos->link_clk_rate = RGMII_1000_NOM_CLK_FREQ; in ethqos_update_link_clk()
178 ethqos->link_clk_rate = RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ; in ethqos_update_link_clk()
182 ethqos->link_clk_rate = RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ; in ethqos_update_link_clk()
186 clk_set_rate(ethqos->link_clk, ethqos->link_clk_rate); in ethqos_update_link_clk()
295 struct device *dev = &ethqos->pdev->dev; in ethqos_dll_configure()
297 int retry = 1000; in ethqos_dll_configure() local
315 if (!ethqos->has_emac_ge_3) { in ethqos_dll_configure()
330 retry--; in ethqos_dll_configure()
331 } while (retry > 0); in ethqos_dll_configure()
332 if (!retry) in ethqos_dll_configure()
340 retry = 1000; in ethqos_dll_configure()
347 retry--; in ethqos_dll_configure()
348 } while (retry > 0); in ethqos_dll_configure()
349 if (!retry) in ethqos_dll_configure()
356 if (!ethqos->has_emac_ge_3) { in ethqos_dll_configure()
376 struct device *dev = &ethqos->pdev->dev; in ethqos_rgmii_macro_init()
380 /* Determine if the PHY adds a 2 ns TX delay or the MAC handles it */ in ethqos_rgmii_macro_init()
381 if (ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_ID || in ethqos_rgmii_macro_init()
382 ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_TXID) in ethqos_rgmii_macro_init()
392 if (ethqos->rgmii_config_loopback_en) in ethqos_rgmii_macro_init()
401 switch (ethqos->speed) { in ethqos_rgmii_macro_init()
423 /* PRG_RCLK_DLY = TCXO period * TCXO_CYCLES_CNT / 2 * RX delay ns, in ethqos_rgmii_macro_init()
424 * in practice this becomes PRG_RCLK_DLY = 52 * 4 / 2 * RX delay ns in ethqos_rgmii_macro_init()
426 if (ethqos->has_emac_ge_3) { in ethqos_rgmii_macro_init()
461 if (ethqos->has_emac_ge_3) in ethqos_rgmii_macro_init()
501 if (ethqos->has_emac_ge_3) in ethqos_rgmii_macro_init()
521 dev_err(dev, "Invalid speed %d\n", ethqos->speed); in ethqos_rgmii_macro_init()
522 return -EINVAL; in ethqos_rgmii_macro_init()
530 struct device *dev = &ethqos->pdev->dev; in ethqos_configure_rgmii()
532 unsigned int i, retry = 1000; in ethqos_configure_rgmii() local
535 for (i = 0; i < ethqos->num_por; i++) in ethqos_configure_rgmii()
536 rgmii_writel(ethqos, ethqos->por[i].value, in ethqos_configure_rgmii()
537 ethqos->por[i].offset); in ethqos_configure_rgmii()
550 if (ethqos->has_emac_ge_3) { in ethqos_configure_rgmii()
551 if (ethqos->speed == SPEED_1000) { in ethqos_configure_rgmii()
569 if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) { in ethqos_configure_rgmii()
580 if (!ethqos->has_emac_ge_3) in ethqos_configure_rgmii()
590 retry--; in ethqos_configure_rgmii()
591 } while (retry > 0); in ethqos_configure_rgmii()
592 if (!retry) in ethqos_configure_rgmii()
596 if (ethqos->speed == SPEED_1000) in ethqos_configure_rgmii()
611 val = readl(ethqos->mac_base + MAC_CTRL_REG); in ethqos_configure_sgmii()
613 switch (ethqos->speed) { in ethqos_configure_sgmii()
633 writel(val, ethqos->mac_base + MAC_CTRL_REG); in ethqos_configure_sgmii()
640 return ethqos->configure_func(ethqos); in ethqos_configure()
647 ethqos->speed = speed; in ethqos_fix_mac_speed()
657 ret = phy_init(ethqos->serdes_phy); in qcom_ethqos_serdes_powerup()
661 ret = phy_power_on(ethqos->serdes_phy); in qcom_ethqos_serdes_powerup()
665 return phy_set_speed(ethqos->serdes_phy, ethqos->speed); in qcom_ethqos_serdes_powerup()
672 phy_power_off(ethqos->serdes_phy); in qcom_ethqos_serdes_powerdown()
673 phy_exit(ethqos->serdes_phy); in qcom_ethqos_serdes_powerdown()
682 ret = clk_prepare_enable(ethqos->link_clk); in ethqos_clks_config()
684 dev_err(&ethqos->pdev->dev, "link_clk enable failed\n"); in ethqos_clks_config()
695 clk_disable_unprepare(ethqos->link_clk); in ethqos_clks_config()
708 struct plat_stmmacenet_data *plat_dat = priv->plat; in ethqos_ptp_clk_freq_config()
711 if (!plat_dat->clk_ptp_ref) in ethqos_ptp_clk_freq_config()
715 err = clk_set_rate(plat_dat->clk_ptp_ref, ULONG_MAX); in ethqos_ptp_clk_freq_config()
717 netdev_err(priv->dev, "Failed to max out clk_ptp_ref: %d\n", err); in ethqos_ptp_clk_freq_config()
718 plat_dat->clk_ptp_rate = clk_get_rate(plat_dat->clk_ptp_ref); in ethqos_ptp_clk_freq_config()
720 netdev_dbg(priv->dev, "PTP rate %d\n", plat_dat->clk_ptp_rate); in ethqos_ptp_clk_freq_config()
725 struct device_node *np = pdev->dev.of_node; in qcom_ethqos_probe()
729 struct device *dev = &pdev->dev; in qcom_ethqos_probe()
744 plat_dat->clks_config = ethqos_clks_config; in qcom_ethqos_probe()
748 return -ENOMEM; in qcom_ethqos_probe()
750 ret = of_get_phy_mode(np, &ethqos->phy_mode); in qcom_ethqos_probe()
753 switch (ethqos->phy_mode) { in qcom_ethqos_probe()
758 ethqos->configure_func = ethqos_configure_rgmii; in qcom_ethqos_probe()
761 ethqos->configure_func = ethqos_configure_sgmii; in qcom_ethqos_probe()
765 phy_modes(ethqos->phy_mode)); in qcom_ethqos_probe()
766 return -EINVAL; in qcom_ethqos_probe()
769 ethqos->pdev = pdev; in qcom_ethqos_probe()
770 ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii"); in qcom_ethqos_probe()
771 if (IS_ERR(ethqos->rgmii_base)) in qcom_ethqos_probe()
772 return dev_err_probe(dev, PTR_ERR(ethqos->rgmii_base), in qcom_ethqos_probe()
775 ethqos->mac_base = stmmac_res.addr; in qcom_ethqos_probe()
778 ethqos->por = data->por; in qcom_ethqos_probe()
779 ethqos->num_por = data->num_por; in qcom_ethqos_probe()
780 ethqos->rgmii_config_loopback_en = data->rgmii_config_loopback_en; in qcom_ethqos_probe()
781 ethqos->has_emac_ge_3 = data->has_emac_ge_3; in qcom_ethqos_probe()
783 ethqos->link_clk = devm_clk_get(dev, data->link_clk_name ?: "rgmii"); in qcom_ethqos_probe()
784 if (IS_ERR(ethqos->link_clk)) in qcom_ethqos_probe()
785 return dev_err_probe(dev, PTR_ERR(ethqos->link_clk), in qcom_ethqos_probe()
796 ethqos->serdes_phy = devm_phy_optional_get(dev, "serdes"); in qcom_ethqos_probe()
797 if (IS_ERR(ethqos->serdes_phy)) in qcom_ethqos_probe()
798 return dev_err_probe(dev, PTR_ERR(ethqos->serdes_phy), in qcom_ethqos_probe()
801 ethqos->speed = SPEED_1000; in qcom_ethqos_probe()
805 plat_dat->bsp_priv = ethqos; in qcom_ethqos_probe()
806 plat_dat->fix_mac_speed = ethqos_fix_mac_speed; in qcom_ethqos_probe()
807 plat_dat->dump_debug_regs = rgmii_dump; in qcom_ethqos_probe()
808 plat_dat->ptp_clk_freq_config = ethqos_ptp_clk_freq_config; in qcom_ethqos_probe()
809 plat_dat->has_gmac4 = 1; in qcom_ethqos_probe()
810 if (ethqos->has_emac_ge_3) in qcom_ethqos_probe()
811 plat_dat->dwmac4_addrs = &data->dwmac4_addrs; in qcom_ethqos_probe()
812 plat_dat->pmt = 1; in qcom_ethqos_probe()
814 plat_dat->flags |= STMMAC_FLAG_TSO_EN; in qcom_ethqos_probe()
815 if (of_device_is_compatible(np, "qcom,qcs404-ethqos")) in qcom_ethqos_probe()
816 plat_dat->flags |= STMMAC_FLAG_RX_CLK_RUNS_IN_LPI; in qcom_ethqos_probe()
817 if (data->has_integrated_pcs) in qcom_ethqos_probe()
818 plat_dat->flags |= STMMAC_FLAG_HAS_INTEGRATED_PCS; in qcom_ethqos_probe()
820 if (ethqos->serdes_phy) { in qcom_ethqos_probe()
821 plat_dat->serdes_powerup = qcom_ethqos_serdes_powerup; in qcom_ethqos_probe()
822 plat_dat->serdes_powerdown = qcom_ethqos_serdes_powerdown; in qcom_ethqos_probe()
829 { .compatible = "qcom,qcs404-ethqos", .data = &emac_v2_3_0_data},
830 { .compatible = "qcom,sa8775p-ethqos", .data = &emac_v4_0_0_data},
831 { .compatible = "qcom,sc8280xp-ethqos", .data = &emac_v3_0_0_data},
832 { .compatible = "qcom,sm8150-ethqos", .data = &emac_v2_1_0_data},
840 .name = "qcom-ethqos",