Re: [PATCH 14/15] net: phy: add PHY regulator support
From: Russell King - ARM Linux admin
Date: Mon Jun 22 2020 - 09:29:42 EST
On Mon, Jun 22, 2020 at 11:37:43AM +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx>
>
> The MDIO sub-system now supports PHY regulators. Let's reuse the code
> to extend this support over to the PHY device.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx>
> ---
> drivers/net/phy/phy_device.c | 49 ++++++++++++++++++++++++++++--------
> include/linux/phy.h | 10 ++++++++
> 2 files changed, 48 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
> index 58923826838b..d755adb748a5 100644
> --- a/drivers/net/phy/phy_device.c
> +++ b/drivers/net/phy/phy_device.c
> @@ -827,7 +827,12 @@ int phy_device_register(struct phy_device *phydev)
>
> err = mdiobus_register_device(&phydev->mdio);
> if (err)
> - return err;
> + goto err_out;
> +
> + /* Enable the PHY regulator */
> + err = phy_device_power_on(phydev);
> + if (err)
> + goto err_unregister_mdio;
>
> /* Deassert the reset signal */
> phy_device_reset(phydev, 0);
> @@ -846,22 +851,25 @@ int phy_device_register(struct phy_device *phydev)
> err = phy_scan_fixups(phydev);
> if (err) {
> phydev_err(phydev, "failed to initialize\n");
> - goto out;
> + goto err_reset;
> }
>
> err = device_add(&phydev->mdio.dev);
> if (err) {
> phydev_err(phydev, "failed to add\n");
> - goto out;
> + goto err_reset;
> }
>
> return 0;
>
> - out:
> +err_reset:
> /* Assert the reset signal */
> phy_device_reset(phydev, 1);
> -
> + /* Disable the PHY regulator */
> + phy_device_power_off(phydev);
> +err_unregister_mdio:
> mdiobus_unregister_device(&phydev->mdio);
> +err_out:
> return err;
> }
> EXPORT_SYMBOL(phy_device_register);
> @@ -883,6 +891,8 @@ void phy_device_remove(struct phy_device *phydev)
>
> /* Assert the reset signal */
> phy_device_reset(phydev, 1);
> + /* Disable the PHY regulator */
> + phy_device_power_off(phydev);
>
> mdiobus_unregister_device(&phydev->mdio);
> }
> @@ -1064,6 +1074,11 @@ int phy_init_hw(struct phy_device *phydev)
> {
> int ret = 0;
>
> + /* Enable the PHY regulator */
> + ret = phy_device_power_on(phydev);
> + if (ret)
> + return ret;
> +
> /* Deassert the reset signal */
> phy_device_reset(phydev, 0);
>
> @@ -1644,6 +1659,8 @@ void phy_detach(struct phy_device *phydev)
>
> /* Assert the reset signal */
> phy_device_reset(phydev, 1);
> + /* Disable the PHY regulator */
> + phy_device_power_off(phydev);
This is likely to cause issues for some PHY drivers. Note that we have
some PHY drivers which register a temperature sensor in the probe
function, which means they can be accessed independently of the lifetime
of the PHY bound to the network driver (which may only be while the
network device is "up".) We certainly do not want hwmon failing just
because the network device is down.
That's kind of worked around for the reset stuff, because there are two
layers to that: the mdio device layer reset support which knows nothing
of the PHY binding state to the network driver, and the phylib reset
support, but it is not nice.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!