Lines Matching +full:- +full:- +full:retry +full:- +full:delay
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2018-19, Linaro Limited
116 return readl(ethqos->rgmii_base + offset); in rgmii_readl()
122 writel(value, ethqos->rgmii_base + offset); in rgmii_writel()
138 struct device *dev = ðqos->pdev->dev; in rgmii_dump()
171 ethqos->link_clk_rate = RGMII_1000_NOM_CLK_FREQ; in ethqos_update_link_clk()
175 ethqos->link_clk_rate = RGMII_ID_MODE_100_LOW_SVS_CLK_FREQ; in ethqos_update_link_clk()
179 ethqos->link_clk_rate = RGMII_ID_MODE_10_LOW_SVS_CLK_FREQ; in ethqos_update_link_clk()
183 clk_set_rate(ethqos->link_clk, ethqos->link_clk_rate); in ethqos_update_link_clk()
292 struct device *dev = ðqos->pdev->dev; in ethqos_dll_configure()
294 int retry = 1000; in ethqos_dll_configure() local
312 if (!ethqos->has_emac_ge_3) { in ethqos_dll_configure()
327 retry--; in ethqos_dll_configure()
328 } while (retry > 0); in ethqos_dll_configure()
329 if (!retry) in ethqos_dll_configure()
337 retry = 1000; in ethqos_dll_configure()
344 retry--; in ethqos_dll_configure()
345 } while (retry > 0); in ethqos_dll_configure()
346 if (!retry) in ethqos_dll_configure()
353 if (!ethqos->has_emac_ge_3) { in ethqos_dll_configure()
373 struct device *dev = ðqos->pdev->dev; in ethqos_rgmii_macro_init()
377 /* Determine if the PHY adds a 2 ns TX delay or the MAC handles it */ in ethqos_rgmii_macro_init()
378 if (ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_ID || in ethqos_rgmii_macro_init()
379 ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_TXID) in ethqos_rgmii_macro_init()
389 if (ethqos->rgmii_config_loopback_en) in ethqos_rgmii_macro_init()
398 switch (ethqos->speed) { in ethqos_rgmii_macro_init()
420 /* PRG_RCLK_DLY = TCXO period * TCXO_CYCLES_CNT / 2 * RX delay ns, in ethqos_rgmii_macro_init()
421 * in practice this becomes PRG_RCLK_DLY = 52 * 4 / 2 * RX delay ns in ethqos_rgmii_macro_init()
423 if (ethqos->has_emac_ge_3) { in ethqos_rgmii_macro_init()
458 if (ethqos->has_emac_ge_3) in ethqos_rgmii_macro_init()
498 if (ethqos->has_emac_ge_3) in ethqos_rgmii_macro_init()
518 dev_err(dev, "Invalid speed %d\n", ethqos->speed); in ethqos_rgmii_macro_init()
519 return -EINVAL; in ethqos_rgmii_macro_init()
527 struct device *dev = ðqos->pdev->dev; in ethqos_configure_rgmii()
529 unsigned int i, retry = 1000; in ethqos_configure_rgmii() local
532 for (i = 0; i < ethqos->num_por; i++) in ethqos_configure_rgmii()
533 rgmii_writel(ethqos, ethqos->por[i].value, in ethqos_configure_rgmii()
534 ethqos->por[i].offset); in ethqos_configure_rgmii()
547 if (ethqos->has_emac_ge_3) { in ethqos_configure_rgmii()
548 if (ethqos->speed == SPEED_1000) { in ethqos_configure_rgmii()
566 if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) { in ethqos_configure_rgmii()
577 if (!ethqos->has_emac_ge_3) in ethqos_configure_rgmii()
587 retry--; in ethqos_configure_rgmii()
588 } while (retry > 0); in ethqos_configure_rgmii()
589 if (!retry) in ethqos_configure_rgmii()
593 if (ethqos->speed == SPEED_1000) in ethqos_configure_rgmii()
605 val = readl(ethqos->mac_base + MAC_CTRL_REG); in ethqos_configure_sgmii()
607 switch (ethqos->speed) { in ethqos_configure_sgmii()
623 writel(val, ethqos->mac_base + MAC_CTRL_REG); in ethqos_configure_sgmii()
630 return ethqos->configure_func(ethqos); in ethqos_configure()
637 ethqos->speed = speed; in ethqos_fix_mac_speed()
647 ret = phy_init(ethqos->serdes_phy); in qcom_ethqos_serdes_powerup()
651 ret = phy_power_on(ethqos->serdes_phy); in qcom_ethqos_serdes_powerup()
655 return phy_set_speed(ethqos->serdes_phy, ethqos->speed); in qcom_ethqos_serdes_powerup()
662 phy_power_off(ethqos->serdes_phy); in qcom_ethqos_serdes_powerdown()
663 phy_exit(ethqos->serdes_phy); in qcom_ethqos_serdes_powerdown()
672 ret = clk_prepare_enable(ethqos->link_clk); in ethqos_clks_config()
674 dev_err(ðqos->pdev->dev, "link_clk enable failed\n"); in ethqos_clks_config()
685 clk_disable_unprepare(ethqos->link_clk); in ethqos_clks_config()
698 struct plat_stmmacenet_data *plat_dat = priv->plat; in ethqos_ptp_clk_freq_config()
701 if (!plat_dat->clk_ptp_ref) in ethqos_ptp_clk_freq_config()
705 err = clk_set_rate(plat_dat->clk_ptp_ref, ULONG_MAX); in ethqos_ptp_clk_freq_config()
707 netdev_err(priv->dev, "Failed to max out clk_ptp_ref: %d\n", err); in ethqos_ptp_clk_freq_config()
708 plat_dat->clk_ptp_rate = clk_get_rate(plat_dat->clk_ptp_ref); in ethqos_ptp_clk_freq_config()
710 netdev_dbg(priv->dev, "PTP rate %d\n", plat_dat->clk_ptp_rate); in ethqos_ptp_clk_freq_config()
715 struct device_node *np = pdev->dev.of_node; in qcom_ethqos_probe()
719 struct device *dev = &pdev->dev; in qcom_ethqos_probe()
734 plat_dat->clks_config = ethqos_clks_config; in qcom_ethqos_probe()
738 return -ENOMEM; in qcom_ethqos_probe()
740 ret = of_get_phy_mode(np, ðqos->phy_mode); in qcom_ethqos_probe()
743 switch (ethqos->phy_mode) { in qcom_ethqos_probe()
748 ethqos->configure_func = ethqos_configure_rgmii; in qcom_ethqos_probe()
751 ethqos->configure_func = ethqos_configure_sgmii; in qcom_ethqos_probe()
755 phy_modes(ethqos->phy_mode)); in qcom_ethqos_probe()
756 return -EINVAL; in qcom_ethqos_probe()
759 ethqos->pdev = pdev; in qcom_ethqos_probe()
760 ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii"); in qcom_ethqos_probe()
761 if (IS_ERR(ethqos->rgmii_base)) in qcom_ethqos_probe()
762 return dev_err_probe(dev, PTR_ERR(ethqos->rgmii_base), in qcom_ethqos_probe()
765 ethqos->mac_base = stmmac_res.addr; in qcom_ethqos_probe()
768 ethqos->por = data->por; in qcom_ethqos_probe()
769 ethqos->num_por = data->num_por; in qcom_ethqos_probe()
770 ethqos->rgmii_config_loopback_en = data->rgmii_config_loopback_en; in qcom_ethqos_probe()
771 ethqos->has_emac_ge_3 = data->has_emac_ge_3; in qcom_ethqos_probe()
773 ethqos->link_clk = devm_clk_get(dev, data->link_clk_name ?: "rgmii"); in qcom_ethqos_probe()
774 if (IS_ERR(ethqos->link_clk)) in qcom_ethqos_probe()
775 return dev_err_probe(dev, PTR_ERR(ethqos->link_clk), in qcom_ethqos_probe()
786 ethqos->serdes_phy = devm_phy_optional_get(dev, "serdes"); in qcom_ethqos_probe()
787 if (IS_ERR(ethqos->serdes_phy)) in qcom_ethqos_probe()
788 return dev_err_probe(dev, PTR_ERR(ethqos->serdes_phy), in qcom_ethqos_probe()
791 ethqos->speed = SPEED_1000; in qcom_ethqos_probe()
795 plat_dat->bsp_priv = ethqos; in qcom_ethqos_probe()
796 plat_dat->fix_mac_speed = ethqos_fix_mac_speed; in qcom_ethqos_probe()
797 plat_dat->dump_debug_regs = rgmii_dump; in qcom_ethqos_probe()
798 plat_dat->ptp_clk_freq_config = ethqos_ptp_clk_freq_config; in qcom_ethqos_probe()
799 plat_dat->has_gmac4 = 1; in qcom_ethqos_probe()
800 if (ethqos->has_emac_ge_3) in qcom_ethqos_probe()
801 plat_dat->dwmac4_addrs = &data->dwmac4_addrs; in qcom_ethqos_probe()
802 plat_dat->pmt = 1; in qcom_ethqos_probe()
804 plat_dat->flags |= STMMAC_FLAG_TSO_EN; in qcom_ethqos_probe()
805 if (of_device_is_compatible(np, "qcom,qcs404-ethqos")) in qcom_ethqos_probe()
806 plat_dat->flags |= STMMAC_FLAG_RX_CLK_RUNS_IN_LPI; in qcom_ethqos_probe()
807 if (data->has_integrated_pcs) in qcom_ethqos_probe()
808 plat_dat->flags |= STMMAC_FLAG_HAS_INTEGRATED_PCS; in qcom_ethqos_probe()
810 if (ethqos->serdes_phy) { in qcom_ethqos_probe()
811 plat_dat->serdes_powerup = qcom_ethqos_serdes_powerup; in qcom_ethqos_probe()
812 plat_dat->serdes_powerdown = qcom_ethqos_serdes_powerdown; in qcom_ethqos_probe()
819 { .compatible = "qcom,qcs404-ethqos", .data = &emac_v2_3_0_data},
820 { .compatible = "qcom,sa8775p-ethqos", .data = &emac_v4_0_0_data},
821 { .compatible = "qcom,sc8280xp-ethqos", .data = &emac_v3_0_0_data},
822 { .compatible = "qcom,sm8150-ethqos", .data = &emac_v2_1_0_data},
830 .name = "qcom-ethqos",