]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pmdomain: arm_scmi: add support for domain hierarchies
authorKevin Hilman (TI) <khilman@baylibre.com>
Mon, 20 Apr 2026 23:51:19 +0000 (16:51 -0700)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 11 May 2026 10:54:03 +0000 (12:54 +0200)
After primary SCMI pmdomain is created, use new of_genpd helper which
checks for child domain mappings defined in power-domains-child-ids.

Also remove any child domain mappings when SCMI domain is removed.

Signed-off-by: Kevin Hilman (TI) <khilman@baylibre.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/pmdomain/arm/scmi_pm_domain.c

index 5454faed7d5d45180ecec447b64da74dc3b2cd19..3d73aef21d2f994287cd08442accdfb2c821896b 100644 (file)
@@ -113,6 +113,15 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev)
                goto err_rm_genpds;
 
        dev_set_drvdata(dev, scmi_pd_data);
+
+       /*
+        * Parse (optional) power-domains-child-ids property to establish
+        * parent-child relationships.
+       */
+       ret = of_genpd_add_child_ids(np, scmi_pd_data);
+       if (ret < 0)
+               dev_err(dev, "Failed to add child domain hierarchy: %d\n", ret);
+
        dev_info(dev, "Initialized %d power domains", num_domains);
 
        return 0;
@@ -130,9 +139,13 @@ static void scmi_pm_domain_remove(struct scmi_device *sdev)
        struct device *dev = &sdev->dev;
        struct device_node *np = dev->of_node;
 
+       scmi_pd_data = dev_get_drvdata(dev);
+
+       /* Remove any parent-child relationships established at probe time */
+       of_genpd_remove_child_ids(np, scmi_pd_data);
+
        of_genpd_del_provider(np);
 
-       scmi_pd_data = dev_get_drvdata(dev);
        for (i = 0; i < scmi_pd_data->num_domains; i++) {
                if (!scmi_pd_data->domains[i])
                        continue;