Messages in this thread | | | From | Andy Duan <> | Subject | RE: [EXT] [PATCH] net: fec: add missed clk_disable_unprepare in remove | Date | Tue, 5 Nov 2019 16:46:30 +0000 |
| |
From: Chuhong Yuan <hslester96@gmail.com> Sent: Tuesday, November 5, 2019 11:34 PM > On Tue, Nov 5, 2019 at 9:26 AM Andy Duan <fugang.duan@nxp.com> wrote: > > > > From: Chuhong Yuan <hslester96@gmail.com> Sent: Monday, November 4, > > 2019 11:50 PM > > > This driver forgets to disable and unprepare clks when remove. > > > Add calls to clk_disable_unprepare to fix it. > > > > > > Signed-off-by: Chuhong Yuan <hslester96@gmail.com> > > > > If runtime is enabled, the patch will introduce clock count mis-match. > > Probe-> > > Enable clk_ipg, clk_ahb clocks > > ... > > In the end, runtime auto suspend callback disable clk_ipg, clk_ahb > clocks. > > > > You should check CONFIG_PM is enabled or not in your platform, if not, > > it can disable these two clocks by checking CONFIG_PM. > > > > Thanks for your hint! > But I am still not very clear about the mechanism. > In my opinion, it means that if CONFIG_PM is disabled, runtime_suspend will > be called automatically to disable clks. CONFIG_PM is enabled, runtime pm works. Otherwise, it doesn't work, then it Requires .remove() to disable the clks.
Andy > Therefore, #ifdef CONFIG_PM check should be added before disabling clks in > remove. > I am not sure whether this understanding is right or not? > > Regards, > Chuhong > > > Regards, > > Andy > > > --- > > > drivers/net/ethernet/freescale/fec_main.c | 2 ++ > > > 1 file changed, 2 insertions(+) > > > > > > diff --git a/drivers/net/ethernet/freescale/fec_main.c > > > b/drivers/net/ethernet/freescale/fec_main.c > > > index 22c01b224baa..a9c386b63581 100644 > > > --- a/drivers/net/ethernet/freescale/fec_main.c > > > +++ b/drivers/net/ethernet/freescale/fec_main.c > > > @@ -3645,6 +3645,8 @@ fec_drv_remove(struct platform_device *pdev) > > > regulator_disable(fep->reg_phy); > > > pm_runtime_put(&pdev->dev); > > > pm_runtime_disable(&pdev->dev); > > > + clk_disable_unprepare(fep->clk_ahb); > > > + clk_disable_unprepare(fep->clk_ipg); > > > if (of_phy_is_fixed_link(np)) > > > of_phy_deregister_fixed_link(np); > > > of_node_put(fep->phy_node); > > > -- > > > 2.23.0 > >
| |