]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: pse-pd: pd692x0: Add support for controller and manager power supplies
authorKory Maincent (Dent Project) <kory.maincent@bootlin.com>
Tue, 17 Jun 2025 12:12:09 +0000 (14:12 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 19 Jun 2025 02:00:18 +0000 (19:00 -0700)
Add support for managing the VDD and VDDA power supplies for the PD692x0
PSE controller, as well as the VAUX5 and VAUX3P3 power supplies for the
PD6920x PSE managers.

Signed-off-by: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
Reviewed-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://patch.msgid.link/20250617-feature_poe_port_prio-v14-10-78a1a645e2ee@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/pse-pd/pd692x0.c

index a4766c18f3338a83d8b87127aa36b4361f816ff0..4de004813560d6620b2c0f0b216f346d6554cf32 100644 (file)
@@ -976,8 +976,10 @@ pd692x0_register_managers_regulator(struct pd692x0_priv *priv,
        reg_name_len = strlen(dev_name(dev)) + 23;
 
        for (i = 0; i < nmanagers; i++) {
+               static const char * const regulators[] = { "vaux5", "vaux3p3" };
                struct regulator_dev *rdev;
                char *reg_name;
+               int ret;
 
                reg_name = devm_kzalloc(dev, reg_name_len, GFP_KERNEL);
                if (!reg_name)
@@ -988,6 +990,17 @@ pd692x0_register_managers_regulator(struct pd692x0_priv *priv,
                if (IS_ERR(rdev))
                        return PTR_ERR(rdev);
 
+               /* VMAIN is described as main supply for the manager.
+                * Add other VAUX power supplies and link them to the
+                * virtual device rdev->dev.
+                */
+               ret = devm_regulator_bulk_get_enable(&rdev->dev,
+                                                    ARRAY_SIZE(regulators),
+                                                    regulators);
+               if (ret)
+                       return dev_err_probe(&rdev->dev, ret,
+                                            "Failed to enable regulators\n");
+
                priv->manager_reg[i] = rdev;
        }
 
@@ -1640,6 +1653,7 @@ static const struct fw_upload_ops pd692x0_fw_ops = {
 
 static int pd692x0_i2c_probe(struct i2c_client *client)
 {
+       static const char * const regulators[] = { "vdd", "vdda" };
        struct pd692x0_msg msg, buf = {0}, zero = {0};
        struct device *dev = &client->dev;
        struct pd692x0_msg_ver ver;
@@ -1647,6 +1661,12 @@ static int pd692x0_i2c_probe(struct i2c_client *client)
        struct fw_upload *fwl;
        int ret;
 
+       ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulators),
+                                            regulators);
+       if (ret)
+               return dev_err_probe(dev, ret,
+                                    "Failed to enable regulators\n");
+
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
                dev_err(dev, "i2c check functionality failed\n");
                return -ENXIO;