On Oct 15, Alex Elder wrote: > From: Daniel Thompson > > QCA8081 appears in embedded board designs paired with GPIO controlled > regulators for its power rails. Add logic to allow these regulators to > be turned on during a probe. > > In order to avoid the complexity of tracking state for suspend with and > without WoL we take a tremendously simple "always-on" approach to > regulator management, essentially relying on BMCR_PDOWN to conserve > power when the phy device exists. > > Signed-off-by: Daniel Thompson > Co-developed-by: Alex Elder > Signed-off-by: Alex Elder > --- > drivers/net/phy/qcom/qca808x.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/drivers/net/phy/qcom/qca808x.c b/drivers/net/phy/qcom/qca808x.c > index bab26e4c61408..4aba513b9a512 100644 > --- a/drivers/net/phy/qcom/qca808x.c > +++ b/drivers/net/phy/qcom/qca808x.c > @@ -1,6 +1,7 @@ > // SPDX-License-Identifier: GPL-2.0+ > > #include > +#include > #include > > #include "qcom.h" > @@ -181,15 +182,43 @@ static void qca808x_fill_possible_interfaces(struct phy_device *phydev) > __set_bit(PHY_INTERFACE_MODE_2500BASEX, possible); > } > > +static int qca808x_power_on(struct phy_device *phydev) > +{ > + static const char * const regulator_names[] = { > + "avdd18", "vdd", "vdd18", "vdd125" > + }; > + struct device *dev = &phydev->mdio.dev; > + u32 count = 0; > + int ret; > + > + for (u32 i = 0; i < ARRAY_SIZE(regulator_names); i++) { > + ret = devm_regulator_get_enable_optional(dev, regulator_names[i]); > + if (!ret) > + count++; > + else if (ret != -ENODEV) > + return ret; > + } > + > + if (count) > + fsleep(phydev->mdio.reset_assert_delay); nit: should we check reset_assert_delay field is actually set? Regards, Lorenzo > + > + return 0; > +} > + > static int qca808x_probe(struct phy_device *phydev) > { > struct device *dev = &phydev->mdio.dev; > struct qca808x_priv *priv; > + int ret; > > priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > if (!priv) > return -ENOMEM; > > + ret = qca808x_power_on(phydev); > + if (ret) > + return ret; > + > priv->led_polarity_mode = QCA808X_PHY_LED_UNSET; > > phydev->priv = priv; > -- > 2.53.0 >