Commit b76bbb34 authored by Jisheng Zhang's avatar Jisheng Zhang Committed by David S. Miller

net: stmmac: dwmac-sun8i: make clk really gated during rpm suspended

Currently, the dwmac-sun8i's stmmaceth clk isn't disabled even if the
the device has been runtime suspended. The reason is the driver gets
the "stmmaceth" clk as tx_clk and enabling it during probe. But
there's no other usage of tx_clk except preparing and enabling, so
we can remove tx_clk and its usage then rely on the common routine
stmmac_probe_config_dt() to prepare and enable the stmmaceth clk
during driver initialization, and benefit from the runtime pm feature
after probed.
Signed-off-by: default avatarJisheng Zhang <jszhang@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 34a79c5d
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/stmmac.h> #include <linux/stmmac.h>
...@@ -57,7 +58,6 @@ struct emac_variant { ...@@ -57,7 +58,6 @@ struct emac_variant {
}; };
/* struct sunxi_priv_data - hold all sunxi private data /* struct sunxi_priv_data - hold all sunxi private data
* @tx_clk: reference to MAC TX clock
* @ephy_clk: reference to the optional EPHY clock for the internal PHY * @ephy_clk: reference to the optional EPHY clock for the internal PHY
* @regulator: reference to the optional regulator * @regulator: reference to the optional regulator
* @rst_ephy: reference to the optional EPHY reset for the internal PHY * @rst_ephy: reference to the optional EPHY reset for the internal PHY
...@@ -68,7 +68,6 @@ struct emac_variant { ...@@ -68,7 +68,6 @@ struct emac_variant {
* @mux_handle: Internal pointer used by mdio-mux lib * @mux_handle: Internal pointer used by mdio-mux lib
*/ */
struct sunxi_priv_data { struct sunxi_priv_data {
struct clk *tx_clk;
struct clk *ephy_clk; struct clk *ephy_clk;
struct regulator *regulator; struct regulator *regulator;
struct reset_control *rst_ephy; struct reset_control *rst_ephy;
...@@ -579,22 +578,14 @@ static int sun8i_dwmac_init(struct platform_device *pdev, void *priv) ...@@ -579,22 +578,14 @@ static int sun8i_dwmac_init(struct platform_device *pdev, void *priv)
} }
} }
ret = clk_prepare_enable(gmac->tx_clk);
if (ret) {
dev_err(&pdev->dev, "Could not enable AHB clock\n");
goto err_disable_regulator;
}
if (gmac->use_internal_phy) { if (gmac->use_internal_phy) {
ret = sun8i_dwmac_power_internal_phy(netdev_priv(ndev)); ret = sun8i_dwmac_power_internal_phy(netdev_priv(ndev));
if (ret) if (ret)
goto err_disable_clk; goto err_disable_regulator;
} }
return 0; return 0;
err_disable_clk:
clk_disable_unprepare(gmac->tx_clk);
err_disable_regulator: err_disable_regulator:
if (gmac->regulator) if (gmac->regulator)
regulator_disable(gmac->regulator); regulator_disable(gmac->regulator);
...@@ -1043,8 +1034,6 @@ static void sun8i_dwmac_exit(struct platform_device *pdev, void *priv) ...@@ -1043,8 +1034,6 @@ static void sun8i_dwmac_exit(struct platform_device *pdev, void *priv)
if (gmac->variant->soc_has_internal_phy) if (gmac->variant->soc_has_internal_phy)
sun8i_dwmac_unpower_internal_phy(gmac); sun8i_dwmac_unpower_internal_phy(gmac);
clk_disable_unprepare(gmac->tx_clk);
if (gmac->regulator) if (gmac->regulator)
regulator_disable(gmac->regulator); regulator_disable(gmac->regulator);
} }
...@@ -1167,12 +1156,6 @@ static int sun8i_dwmac_probe(struct platform_device *pdev) ...@@ -1167,12 +1156,6 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
gmac->tx_clk = devm_clk_get(dev, "stmmaceth");
if (IS_ERR(gmac->tx_clk)) {
dev_err(dev, "Could not get TX clock\n");
return PTR_ERR(gmac->tx_clk);
}
/* Optional regulator for PHY */ /* Optional regulator for PHY */
gmac->regulator = devm_regulator_get_optional(dev, "phy"); gmac->regulator = devm_regulator_get_optional(dev, "phy");
if (IS_ERR(gmac->regulator)) { if (IS_ERR(gmac->regulator)) {
...@@ -1254,6 +1237,12 @@ static int sun8i_dwmac_probe(struct platform_device *pdev) ...@@ -1254,6 +1237,12 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
ndev = dev_get_drvdata(&pdev->dev); ndev = dev_get_drvdata(&pdev->dev);
priv = netdev_priv(ndev); priv = netdev_priv(ndev);
/* the MAC is runtime suspended after stmmac_dvr_probe(), so we
* need to ensure the MAC resume back before other operations such
* as reset.
*/
pm_runtime_get_sync(&pdev->dev);
/* The mux must be registered after parent MDIO /* The mux must be registered after parent MDIO
* so after stmmac_dvr_probe() * so after stmmac_dvr_probe()
*/ */
...@@ -1272,12 +1261,15 @@ static int sun8i_dwmac_probe(struct platform_device *pdev) ...@@ -1272,12 +1261,15 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
goto dwmac_remove; goto dwmac_remove;
} }
pm_runtime_put(&pdev->dev);
return 0; return 0;
dwmac_mux: dwmac_mux:
reset_control_put(gmac->rst_ephy); reset_control_put(gmac->rst_ephy);
clk_put(gmac->ephy_clk); clk_put(gmac->ephy_clk);
dwmac_remove: dwmac_remove:
pm_runtime_put_noidle(&pdev->dev);
stmmac_dvr_remove(&pdev->dev); stmmac_dvr_remove(&pdev->dev);
dwmac_exit: dwmac_exit:
sun8i_dwmac_exit(pdev, gmac); sun8i_dwmac_exit(pdev, gmac);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment