On 20-09-04 08:37, Florian Fainelli wrote: > > > On 9/3/2020 11:15 PM, Marco Felsch wrote: > > Hi Florian, > > > > On 20-09-02 21:39, Florian Fainelli wrote: > > > The internal Gigabit PHY on Broadcom STB chips has a digital clock which > > > drives its MDIO interface among other things, the driver now requests > > > and manage that clock during .probe() and .remove() accordingly. > > > > > > Signed-off-by: Florian Fainelli <f.fainelli@xxxxxxxxx> > > > --- > > > drivers/net/phy/bcm7xxx.c | 18 +++++++++++++++++- > > > 1 file changed, 17 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c > > > index 692048d86ab1..f0ffcdcaef03 100644 > > > --- a/drivers/net/phy/bcm7xxx.c > > > +++ b/drivers/net/phy/bcm7xxx.c > > > @@ -11,6 +11,7 @@ > > > #include "bcm-phy-lib.h" > > > #include <linux/bitops.h> > > > #include <linux/brcmphy.h> > > > +#include <linux/clk.h> > > > #include <linux/mdio.h> > > > /* Broadcom BCM7xxx internal PHY registers */ > > > @@ -39,6 +40,7 @@ > > > struct bcm7xxx_phy_priv { > > > u64 *stats; > > > + struct clk *clk; > > > }; > > > static int bcm7xxx_28nm_d0_afe_config_init(struct phy_device *phydev) > > > @@ -534,7 +536,19 @@ static int bcm7xxx_28nm_probe(struct phy_device *phydev) > > > if (!priv->stats) > > > return -ENOMEM; > > > - return 0; > > > + priv->clk = devm_clk_get_optional(&phydev->mdio.dev, NULL); > > > > Since the clock is binded to the mdio-dev here.. > > > > > + if (IS_ERR(priv->clk)) > > > + return PTR_ERR(priv->clk); > > > + > > > + return clk_prepare_enable(priv->clk); > > > > clould we use devm_add_action_or_reset() here so we don't have to > > register the .remove() hook? > > Maybe, more on that below. > > > > > > +} > > > + > > > +static void bcm7xxx_28nm_remove(struct phy_device *phydev) > > > +{ > > > + struct bcm7xxx_phy_priv *priv = phydev->priv; > > > + > > > + clk_disable_unprepare(priv->clk); > > > + devm_clk_put(&phydev->mdio.dev, priv->clk); > > > > Is this really necessary? The devm_clk_get_optional() function already > > registers the devm_clk_release() hook. > > Yes, because you can unbind the PHY driver from sysfs, and if you want to > bind that driver again, which will call .probe() again, you must undo > strictly everything that .probe() did. The embedded mdio_device does not go > away, so there will be no automatic freeing of resources. Okay I got this. Sry. I'm not that deep into the net-stack and the device live time. Thanks for the clarification. > Using devm_* may > be confusing, so using just the plain clk_get() and clk_put() may be clearer > here. That would be better for others including me because I detected a failure on my patchset. Regards, Marco