Merge "net: stmmac: Enable Deep sleep support"

This commit is contained in:
QCTECMDR Service 2024-08-12 13:14:21 -07:00 committed by Gerrit - the friendly Code Review server
commit d34faa6089
2 changed files with 43 additions and 8 deletions

View File

@ -19,7 +19,7 @@
#include <linux/iommu.h> #include <linux/iommu.h>
#include <linux/micrel_phy.h> #include <linux/micrel_phy.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/suspend.h>
#include <linux/tcp.h> #include <linux/tcp.h>
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
@ -171,6 +171,8 @@
void *ipc_emac_log_ctxt; void *ipc_emac_log_ctxt;
struct emac_emb_smmu_cb_ctx emac_emb_smmu_ctx = {0}; struct emac_emb_smmu_cb_ctx emac_emb_smmu_ctx = {0};
static int qcom_ethqos_hib_restore(struct device *dev);
static int qcom_ethqos_hib_freeze(struct device *dev);
struct plat_stmmacenet_data *plat_dat; struct plat_stmmacenet_data *plat_dat;
struct qcom_ethqos *pethqos; struct qcom_ethqos *pethqos;
@ -2470,6 +2472,9 @@ static int qcom_ethqos_suspend(struct device *dev)
return 0; return 0;
} }
if (pm_suspend_target_state == PM_SUSPEND_MEM)
return qcom_ethqos_hib_freeze(dev);
ethqos = get_stmmac_bsp_priv(dev); ethqos = get_stmmac_bsp_priv(dev);
if (!ethqos) if (!ethqos)
return -ENODEV; return -ENODEV;
@ -2505,6 +2510,9 @@ static int qcom_ethqos_resume(struct device *dev)
if (of_device_is_compatible(dev->of_node, "qcom,emac-smmu-embedded")) if (of_device_is_compatible(dev->of_node, "qcom,emac-smmu-embedded"))
return 0; return 0;
if (pm_suspend_target_state == PM_SUSPEND_MEM)
return qcom_ethqos_hib_restore(dev);
ethqos = get_stmmac_bsp_priv(dev); ethqos = get_stmmac_bsp_priv(dev);
if (!ethqos) if (!ethqos)
@ -2581,8 +2589,32 @@ static int qcom_ethqos_enable_clks(struct qcom_ethqos *ethqos, struct device *de
goto error_rgmii_get; goto error_rgmii_get;
} }
} }
ethqos->sgmiref_clk = devm_clk_get(dev, "sgmi_ref");
if (IS_ERR(ethqos->sgmiref_clk)) {
dev_warn(dev, "Failed sgmi_ref\n");
ret = PTR_ERR(ethqos->sgmiref_clk);
goto error_sgmi_ref;
} else {
ret = clk_prepare_enable(ethqos->sgmiref_clk);
if (ret)
goto error_sgmi_ref;
}
ethqos->phyaux_clk = devm_clk_get(dev, "phyaux");
if (IS_ERR(ethqos->phyaux_clk)) {
dev_warn(dev, "Failed phyaux\n");
ret = PTR_ERR(ethqos->phyaux_clk);
goto error_phyaux_ref;
} else {
ret = clk_prepare_enable(ethqos->phyaux_clk);
if (ret)
goto error_phyaux_ref;
}
return 0; return 0;
error_phyaux_ref:
clk_disable_unprepare(ethqos->sgmiref_clk);
error_sgmi_ref:
clk_disable_unprepare(ethqos->rgmii_clk);
error_rgmii_get: error_rgmii_get:
clk_disable_unprepare(priv->plat->pclk); clk_disable_unprepare(priv->plat->pclk);
error_pclk_get: error_pclk_get:
@ -2605,6 +2637,12 @@ static void qcom_ethqos_disable_clks(struct qcom_ethqos *ethqos, struct device *
if (ethqos->rgmii_clk) if (ethqos->rgmii_clk)
clk_disable_unprepare(ethqos->rgmii_clk); clk_disable_unprepare(ethqos->rgmii_clk);
if (priv->plat->has_gmac4 && ethqos->phyaux_clk)
clk_disable_unprepare(ethqos->phyaux_clk);
if (priv->plat->has_gmac4 && ethqos->sgmiref_clk)
clk_disable_unprepare(ethqos->sgmiref_clk);
ETHQOSINFO("Exit\n"); ETHQOSINFO("Exit\n");
} }
@ -2636,7 +2674,7 @@ static int qcom_ethqos_hib_restore(struct device *dev)
ret = ethqos_init_gpio(ethqos); ret = ethqos_init_gpio(ethqos);
if (ret) if (ret)
return ret; ETHQOSINFO("GPIO init failed\n");
ret = qcom_ethqos_enable_clks(ethqos, dev); ret = qcom_ethqos_enable_clks(ethqos, dev);
if (ret) if (ret)
@ -2666,11 +2704,6 @@ static int qcom_ethqos_hib_restore(struct device *dev)
#endif /* end of DWC_ETH_QOS_CONFIG_PTP */ #endif /* end of DWC_ETH_QOS_CONFIG_PTP */
/* issue software reset to device */ /* issue software reset to device */
ret = stmmac_reset(priv, priv->ioaddr);
if (ret) {
dev_err(priv->device, "Failed to reset\n");
return ret;
}
if (!netif_running(ndev)) { if (!netif_running(ndev)) {
rtnl_lock(); rtnl_lock();
@ -2724,6 +2757,8 @@ static int qcom_ethqos_hib_freeze(struct device *dev)
ethqos_free_gpios(ethqos); ethqos_free_gpios(ethqos);
ethqos->curr_serdes_speed = 0;
ETHQOSINFO("end\n"); ETHQOSINFO("end\n");
return ret; return ret;

View File

@ -1188,7 +1188,7 @@ static int qcom_ethqos_serdes_update_sgmii(struct qcom_ethqos *ethqos,
switch (speed) { switch (speed) {
case SPEED_1000: case SPEED_1000:
if (ethqos->curr_serdes_speed == SPEED_2500) if (ethqos->curr_serdes_speed != SPEED_1000)
ret = qcom_ethqos_serdes_sgmii_1Gb(ethqos); ret = qcom_ethqos_serdes_sgmii_1Gb(ethqos);
ethqos->curr_serdes_speed = SPEED_1000; ethqos->curr_serdes_speed = SPEED_1000;