power: regulator: scmi: Move regulator subnode hack to scmi_regulator
authorMarek Vasut <marex@denx.de>
Sat, 22 Mar 2025 01:44:40 +0000 (02:44 +0100)
committerPeng Fan <peng.fan@nxp.com>
Wed, 23 Apr 2025 03:28:12 +0000 (11:28 +0800)
The current code attempts to bind scmi_voltage_domain to regulator subnode
of the SCMI protocol node, so scmi_voltage_domain can then bind regulators
directly to subnodes of its node. This kind of behavior should not be in
core code, move it into scmi_voltage_domain driver code. Let the driver
descend into regulator node and bind regulators to its subnodes.

Fixes: 1f213ee4dbf2 ("firmware: scmi: voltage regulator")
Signed-off-by: Marek Vasut <marex@denx.de>
[Alice Guo: Fix scmi_regulator_bind]
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/firmware/scmi/scmi_agent-uclass.c
drivers/power/regulator/scmi_regulator.c

index 8c907c3..e6e43ae 100644 (file)
@@ -427,14 +427,8 @@ static int scmi_bind_protocols(struct udevice *dev)
                        break;
                case SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN:
                        if (IS_ENABLED(CONFIG_DM_REGULATOR_SCMI) &&
-                           scmi_protocol_is_supported(dev, protocol_id)) {
-                               node = ofnode_find_subnode(node, "regulators");
-                               if (!ofnode_valid(node)) {
-                                       dev_err(dev, "no regulators node\n");
-                                       return -ENXIO;
-                               }
+                           scmi_protocol_is_supported(dev, protocol_id))
                                drv = DM_DRIVER_GET(scmi_voltage_domain);
-                       }
                        break;
                default:
                        break;
index 99f6506..79db1a6 100644 (file)
@@ -175,12 +175,19 @@ U_BOOT_DRIVER(scmi_regulator) = {
 static int scmi_regulator_bind(struct udevice *dev)
 {
        struct driver *drv;
+       ofnode regul_node;
        ofnode node;
        int ret;
 
+       regul_node = ofnode_find_subnode(dev_ofnode(dev), "regulators");
+       if (!ofnode_valid(regul_node)) {
+               dev_err(dev, "no regulators node\n");
+               return -ENXIO;
+       }
+
        drv = DM_DRIVER_GET(scmi_regulator);
 
-       ofnode_for_each_subnode(node, dev_ofnode(dev)) {
+       ofnode_for_each_subnode(node, regul_node) {
                ret = device_bind(dev, drv, ofnode_get_name(node),
                                  NULL, node, NULL);
                if (ret)