Re: [PATCH net-next v2 2/2] net: phy: qcom: qca808x: Add regulator management
flat view
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Date: 2026-10-15 15:17:17
Also in:
linux-arm-msm, linux-devicetree, lkml
Hi, On 10/15/26 16:38, Alex Elder wrote:
quoted hunk ↗ jump to hunk
From: Daniel Thompson <redacted> 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 <redacted> Co-developed-by: Alex Elder <redacted> Signed-off-by: Alex Elder <redacted> --- 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 <linux/phy.h> +#include <linux/regulator/consumer.h> #include <linux/module.h> #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);
Kinda makes sense to use that delay as a basis, it may be too short in some odd cases but I guess it's good enough of an approximation here,
quoted hunk ↗ jump to hunk
+ + 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;
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Maxime