stmmac: dwmac-mediatek: fix clock issue
The pm_runtime takes care of the clock handling in current stmmac drivers, and dwmac-mediatek implement the mediatek_dwmac_clks_config() as the callback for pm_runtime. Then, stripping duplicated clocks handling in old init()/exit() to fix clock issue in suspend/resume test. As to clocks in probe/remove, vendor need symmetric handling to ensure clocks balance. Test pass, including suspend/resume and ko insertion/remove. Fixes: 3186bdad97d5 ("stmmac: dwmac-mediatek: add platform level clocks management") Signed-off-by: Biao Huang <biao.huang@mediatek.com> Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
782d86fe44
commit
fa4b3ca60e
@ -576,32 +576,7 @@ static int mediatek_dwmac_init(struct platform_device *pdev, void *priv)
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_bulk_prepare_enable(variant->num_clks, plat->clks);
|
||||
if (ret) {
|
||||
dev_err(plat->dev, "failed to enable clks, err = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(plat->rmii_internal_clk);
|
||||
if (ret) {
|
||||
dev_err(plat->dev, "failed to enable rmii internal clk, err = %d\n", ret);
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_clk:
|
||||
clk_bulk_disable_unprepare(variant->num_clks, plat->clks);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mediatek_dwmac_exit(struct platform_device *pdev, void *priv)
|
||||
{
|
||||
struct mediatek_dwmac_plat_data *plat = priv;
|
||||
const struct mediatek_dwmac_variant *variant = plat->variant;
|
||||
|
||||
clk_disable_unprepare(plat->rmii_internal_clk);
|
||||
clk_bulk_disable_unprepare(variant->num_clks, plat->clks);
|
||||
}
|
||||
|
||||
static int mediatek_dwmac_clks_config(void *priv, bool enabled)
|
||||
@ -643,7 +618,6 @@ static int mediatek_dwmac_common_data(struct platform_device *pdev,
|
||||
plat->addr64 = priv_plat->variant->dma_bit_mask;
|
||||
plat->bsp_priv = priv_plat;
|
||||
plat->init = mediatek_dwmac_init;
|
||||
plat->exit = mediatek_dwmac_exit;
|
||||
plat->clks_config = mediatek_dwmac_clks_config;
|
||||
if (priv_plat->variant->dwmac_fix_mac_speed)
|
||||
plat->fix_mac_speed = priv_plat->variant->dwmac_fix_mac_speed;
|
||||
@ -712,13 +686,32 @@ static int mediatek_dwmac_probe(struct platform_device *pdev)
|
||||
mediatek_dwmac_common_data(pdev, plat_dat, priv_plat);
|
||||
mediatek_dwmac_init(pdev, priv_plat);
|
||||
|
||||
ret = mediatek_dwmac_clks_config(priv_plat, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
if (ret) {
|
||||
stmmac_remove_config_dt(pdev, plat_dat);
|
||||
return ret;
|
||||
goto err_drv_probe;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_drv_probe:
|
||||
mediatek_dwmac_clks_config(priv_plat, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mediatek_dwmac_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mediatek_dwmac_plat_data *priv_plat = get_stmmac_bsp_priv(&pdev->dev);
|
||||
int ret;
|
||||
|
||||
ret = stmmac_pltfr_remove(pdev);
|
||||
mediatek_dwmac_clks_config(priv_plat, false);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id mediatek_dwmac_match[] = {
|
||||
@ -733,7 +726,7 @@ MODULE_DEVICE_TABLE(of, mediatek_dwmac_match);
|
||||
|
||||
static struct platform_driver mediatek_dwmac_driver = {
|
||||
.probe = mediatek_dwmac_probe,
|
||||
.remove = stmmac_pltfr_remove,
|
||||
.remove = mediatek_dwmac_remove,
|
||||
.driver = {
|
||||
.name = "dwmac-mediatek",
|
||||
.pm = &stmmac_pltfr_pm_ops,
|
||||
|
Loading…
x
Reference in New Issue
Block a user