net: stmmac: dwmac-oxnas: fix leaks and simplify pm
Subsystems (4)
cover net: stmmac: dwmac-oxnas: fix leaks and simplify pm
These patches fixes of-node and fixed-phydev leaks in the recently added dwmac-oxnas driver, and ultimately switches over to using the generic pm implementation as the required callbacks are now in place.
Note that this series has only been compile tested.
Johan
Johan Hovold (3):
net: stmmac: dwmac-oxnas: fix of-node leak
net: stmmac: dwmac-oxnas: fix fixed-link-phydev leaks
net: stmmac: dwmac-oxnas: use generic pm implementation
drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c | 89 +++++++++-------------- 1 file changed, 33 insertions(+), 56 deletions(-)
Signature · 1 line
2.10.2
PATCH 2/3 net: stmmac: dwmac-oxnas: fix fixed-link-phydev leaks
Make sure to deregister and free any fixed-link phy registered during probe on probe errors and on driver unbind by calling the new glue helper function.
For driver unbind, use the generic stmmac-platform remove implementation and add an exit callback to disable the clock.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c | 41 ++++++++++++++--------- 1 file changed, 26 insertions(+), 15 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c +26 -15
@@ -105,6 +105,13 @@ static int oxnas_dwmac_init(struct oxnas_dwmac *dwmac)return 0 ; } +static void oxnas_dwmac_exit (struct platform_device *pdev,void *priv) +{ +struct oxnas_dwmac *dwmac = priv; + +clk_disable_unprepare (dwmac->clk); +} +static int oxnas_dwmac_probe (struct platform_device *pdev) {struct plat_stmmacenet_data *plat_dat;
@@ -121,40 +128,44 @@ static int oxnas_dwmac_probe(struct platform_device *pdev)return PTR_ERR (plat_dat); dwmac =devm_kzalloc (&pdev->dev,sizeof (*dwmac),GFP_KERNEL ); -if (!dwmac) -return -ENOMEM ; +if (!dwmac) { + ret = -ENOMEM ; + goto err_remove_config_dt; + } dwmac->dev = &pdev->dev; plat_dat->bsp_priv = dwmac; + plat_dat->exit = oxnas_dwmac_exit; dwmac->regmap =syscon_regmap_lookup_by_phandle (pdev->dev.of_node,"oxsemi,sys-ctrl" );if (IS_ERR (dwmac->regmap)) {dev_err (&pdev->dev,"failed to have sysctrl regmap\n" ); -return PTR_ERR (dwmac->regmap); + ret =PTR_ERR (dwmac->regmap); + goto err_remove_config_dt; } dwmac->clk =devm_clk_get (&pdev->dev,"gmac" ); -if (IS_ERR (dwmac->clk)) -return PTR_ERR (dwmac->clk); +if (IS_ERR (dwmac->clk)) { + ret =PTR_ERR (dwmac->clk); + goto err_remove_config_dt; + } ret =oxnas_dwmac_init (dwmac);if (ret) -return ret; + goto err_remove_config_dt; ret =stmmac_dvr_probe (&pdev->dev, plat_dat, &stmmac_res);if (ret) -clk_disable_unprepare (dwmac->clk); + goto err_dwmac_exit; -return ret; -} -static int oxnas_dwmac_remove (struct platform_device *pdev) -{ -struct oxnas_dwmac *dwmac =get_stmmac_bsp_priv (&pdev->dev); -int ret =stmmac_dvr_remove (&pdev->dev); +return 0 ; -clk_disable_unprepare (dwmac->clk); +err_dwmac_exit: +oxnas_dwmac_exit (pdev, plat_dat->bsp_priv); +err_remove_config_dt: +stmmac_remove_config_dt (pdev, plat_dat);return ret; }
@@ -197,7 +208,7 @@ MODULE_DEVICE_TABLE(of, oxnas_dwmac_match);static struct platform_driver oxnas_dwmac_driver = { .probe = oxnas_dwmac_probe, - .remove = oxnas_dwmac_remove, + .remove = stmmac_pltfr_remove, .driver = { .name ="oxnas-dwmac" , .pm = &oxnas_dwmac_pm_ops,
Signature · 1 line
2.10.2
PATCH 1/3 net: stmmac: dwmac-oxnas: fix of-node leak
In reply to Johan HovoldUse the syscon lookup-by-phandle helper so that the reference taken by of_parse_phandle() is released when done with the node.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c +2 -8
@@ -109,16 +109,9 @@ static int oxnas_dwmac_probe(struct platform_device *pdev) {struct plat_stmmacenet_data *plat_dat;struct stmmac_resources stmmac_res; -struct device_node *sysctrl;struct oxnas_dwmac *dwmac;int ret; - sysctrl =of_parse_phandle (pdev->dev.of_node,"oxsemi,sys-ctrl" ,0 ); -if (!sysctrl) { -dev_err (&pdev->dev,"failed to get sys-ctrl node\n" ); -return -EINVAL ; - } - ret =stmmac_get_platform_resources (pdev, &stmmac_res);if (ret)return ret;
@@ -134,7 +127,8 @@ static int oxnas_dwmac_probe(struct platform_device *pdev) dwmac->dev = &pdev->dev; plat_dat->bsp_priv = dwmac; - dwmac->regmap =syscon_node_to_regmap (sysctrl); + dwmac->regmap =syscon_regmap_lookup_by_phandle (pdev->dev.of_node, +"oxsemi,sys-ctrl" );if (IS_ERR (dwmac->regmap)) {dev_err (&pdev->dev,"failed to have sysctrl regmap\n" );return PTR_ERR (dwmac->regmap);
Signature · 1 line
2.10.2
PATCH 3/3 net: stmmac: dwmac-oxnas: use generic pm implementation
In reply to Johan HovoldNow that we have an exit callback in place, add init as well and get rid of the custom PM callbacks in favour of the generic ones.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c | 38 +++-------------------- 1 file changed, 5 insertions(+), 33 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c +5 -33
@@ -60,8 +60,9 @@ struct oxnas_dwmac {struct regmap *regmap; }; -static int oxnas_dwmac_init (struct oxnas_dwmac *dwmac) +static int oxnas_dwmac_init (struct platform_device *pdev,void *priv) { +struct oxnas_dwmac *dwmac = priv;unsigned int value;int ret;
@@ -135,6 +136,7 @@ static int oxnas_dwmac_probe(struct platform_device *pdev) dwmac->dev = &pdev->dev; plat_dat->bsp_priv = dwmac; + plat_dat->init = oxnas_dwmac_init; plat_dat->exit = oxnas_dwmac_exit; dwmac->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
@@ -151,7 +153,7 @@ static int oxnas_dwmac_probe(struct platform_device *pdev) goto err_remove_config_dt; } - ret =oxnas_dwmac_init (dwmac); + ret =oxnas_dwmac_init (pdev, plat_dat->bsp_priv);if (ret) goto err_remove_config_dt;
@@ -170,36 +172,6 @@ static int oxnas_dwmac_probe(struct platform_device *pdev)return ret; } -#ifdef CONFIG_PM_SLEEP -static int oxnas_dwmac_suspend (struct device *dev) -{ -struct oxnas_dwmac *dwmac =get_stmmac_bsp_priv (dev); -int ret; - - ret =stmmac_suspend (dev); -clk_disable_unprepare (dwmac->clk); - -return ret; -} - -static int oxnas_dwmac_resume (struct device *dev) -{ -struct oxnas_dwmac *dwmac =get_stmmac_bsp_priv (dev); -int ret; - - ret =oxnas_dwmac_init (dwmac); -if (ret) -return ret; - - ret =stmmac_resume (dev); - -return ret; -} -#endif /* CONFIG_PM_SLEEP */ - -static SIMPLE_DEV_PM_OPS(oxnas_dwmac_pm_ops, - oxnas_dwmac_suspend, oxnas_dwmac_resume); -static const struct of_device_id oxnas_dwmac_match[] = { { .compatible ="oxsemi,ox820-dwmac" }, { }
@@ -211,7 +183,7 @@ static struct platform_driver oxnas_dwmac_driver = { .remove = stmmac_pltfr_remove, .driver = { .name = "oxnas-dwmac", - .pm = &oxnas_dwmac_pm_ops, + .pm = &stmmac_pltfr_pm_ops, .of_match_table = oxnas_dwmac_match, }, };
Signature · 1 line
2.10.2
Quoted 9 lines · Johan Hovold
These patches fixes of-node and fixed-phydev leaks in the recently added dwmac-oxnas driver, and ultimately switches over to using the generic pm implementation as the required callbacks are now in place.
Note that this series has only been compile tested.
Johan
Quoted 8 lines
Johan Hovold (3):
net: stmmac: dwmac-oxnas: fix of-node leak
net: stmmac: dwmac-oxnas: fix fixed-link-phydev leaks
net: stmmac: dwmac-oxnas: use generic pm implementationdrivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c | 89 +++++++++-------------- 1 file changed, 33 insertions(+), 56 deletions(-)
Hi Johan,
This series looks good, I will (hopefully) send a Tested-by in the next few days.
Thanks,
Neil
David Miller
maintainerFrom: Johan Hovold <[email protected]>
Date: Mon, 2 Jan 2017 12:56:01 +0100
Quoted 3 lines
These patches fixes of-node and fixed-phydev leaks in the recently added dwmac-oxnas driver, and ultimately switches over to using the generic pm implementation as the required callbacks are now in place.
Series applied.