diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c index a7c12d5e..607e2380 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.c @@ -314,6 +314,10 @@ static void ether_disable_eqos_clks(struct ether_priv_data *pdata) clk_disable_unprepare(pdata->pllrefe_clk); } + if (!IS_ERR_OR_NULL(pdata->rx_m_clk)) { + clk_disable_unprepare(pdata->rx_m_clk); + } + pdata->clks_enable = false; } @@ -529,10 +533,21 @@ static int ether_enable_eqos_clks(struct ether_priv_data *pdata) } } + if (!IS_ERR_OR_NULL(pdata->rx_m_clk)) { + ret = clk_prepare_enable(pdata->rx_m_clk); + if (ret < 0) { + goto err_rx_m; + } + } + pdata->clks_enable = true; return 0; +err_rx_m: + if (!IS_ERR_OR_NULL(pdata->tx_clk)) { + clk_disable_unprepare(pdata->tx_clk); + } err_tx: if (!IS_ERR_OR_NULL(pdata->ptp_ref_clk)) { clk_disable_unprepare(pdata->ptp_ref_clk); @@ -4456,8 +4471,37 @@ static int ether_get_eqos_clks(struct ether_priv_data *pdata) goto err_tx; } + if (osi_core->mac_ver == OSI_EQOS_MAC_5_30) { + pdata->rx_m_clk = devm_clk_get(dev, "eqos_rx_m"); + if (IS_ERR(pdata->rx_m_clk)) { + ret = PTR_ERR(pdata->rx_m_clk); + dev_err(dev, "failed to get eqos_rx_m clk\n"); + goto err_rx_m; + } + + pdata->rx_input_clk = devm_clk_get(dev, "eqos_rx_input"); + if (IS_ERR(pdata->rx_input_clk)) { + ret = PTR_ERR(pdata->rx_input_clk); + dev_err(dev, "failed to get eqos_rx_input clk\n"); + goto err_rx_input; + } + + /* Set default rate to 1G */ + clk_set_rate(pdata->rx_input_clk, + ETHER_RX_INPUT_CLK_RATE); + } else { + pdata->rx_m_clk = NULL; + pdata->rx_input_clk = NULL; + } + return 0; +err_rx_input: + if (osi_core->mac_ver == OSI_EQOS_MAC_5_30) { + devm_clk_put(dev, pdata->rx_m_clk); +err_rx_m: + devm_clk_put(dev, pdata->tx_clk); + } err_tx: devm_clk_put(dev, pdata->ptp_ref_clk); err_ptp_ref: diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index 2dcbb09b..a3d9064d 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -99,6 +99,11 @@ */ #define ETHER_DFLT_PTP_CLK 312500000U +/** + * @brief Ethernet default Rx Input clock frequency + */ +#define ETHER_RX_INPUT_CLK_RATE 125000000U + /** * @addtogroup CONFIG Ethernet configuration error codes * @@ -358,6 +363,8 @@ struct ether_priv_data { struct clk *eee_pcs_clk; /** APP clock */ struct clk *app_clk; + /** MAC Rx input clk */ + struct clk *rx_input_clk; /** Pointer to PHY device tree node */ struct device_node *phy_node; /** Pointer to MDIO device tree node */