static int __init scpsys_probe_mt8173(struct platform_device *pdev) { struct scp *scp; struct genpd_onecell_data *pd_data; int ret; scp = init_scp(pdev, scp_domain_data_mt8173, NUM_DOMAINS_MT8173); if (IS_ERR(scp)) return PTR_ERR(scp); mtk_register_power_domains(pdev, scp, NUM_DOMAINS_MT8173); pd_data = &scp->pd_data; ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_ASYNC], pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D]); if (ret && IS_ENABLED(CONFIG_PM)) dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); ret = pm_genpd_add_subdomain(pd_data->domains[MT8173_POWER_DOMAIN_MFG_2D], pd_data->domains[MT8173_POWER_DOMAIN_MFG]); if (ret && IS_ENABLED(CONFIG_PM)) dev_err(&pdev->dev, "Failed to add subdomain: %d\n", ret); return 0; }
void tegra_pd_add_sd(struct generic_pm_domain *sd) { struct generic_pm_domain *master = tegra_pd_get_domain(sd->name); if (!master) return; pm_genpd_add_subdomain(master, sd); }
static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu, struct device_node *parent) { struct device_node *np; struct generic_pm_domain *child_domain, *parent_domain; int error; for_each_child_of_node(parent, np) { u32 idx; error = of_property_read_u32(parent, "reg", &idx); if (error) { dev_err(pmu->dev, "%s: failed to retrieve domain id (reg): %d\n", parent->name, error); goto err_out; } parent_domain = pmu->genpd_data.domains[idx]; error = rockchip_pm_add_one_domain(pmu, np); if (error) { dev_err(pmu->dev, "failed to handle node %s: %d\n", np->name, error); goto err_out; } error = of_property_read_u32(np, "reg", &idx); if (error) { dev_err(pmu->dev, "%s: failed to retrieve domain id (reg): %d\n", np->name, error); goto err_out; } child_domain = pmu->genpd_data.domains[idx]; error = pm_genpd_add_subdomain(parent_domain, child_domain); if (error) { dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n", parent_domain->name, child_domain->name, error); goto err_out; } else { dev_dbg(pmu->dev, "%s add subdomain: %s\n", parent_domain->name, child_domain->name); } rockchip_pm_add_subdomain(pmu, np); }
int gdsc_register(struct gdsc_desc *desc, struct reset_controller_dev *rcdev, struct regmap *regmap) { int i, ret; struct genpd_onecell_data *data; struct device *dev = desc->dev; struct gdsc **scs = desc->scs; size_t num = desc->num; data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->domains = devm_kcalloc(dev, num, sizeof(*data->domains), GFP_KERNEL); if (!data->domains) return -ENOMEM; data->num_domains = num; for (i = 0; i < num; i++) { if (!scs[i]) continue; scs[i]->regmap = regmap; scs[i]->rcdev = rcdev; ret = gdsc_init(scs[i]); if (ret) return ret; data->domains[i] = &scs[i]->pd; } /* Add subdomains */ for (i = 0; i < num; i++) { if (!scs[i]) continue; if (scs[i]->parent) pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd); } return of_genpd_add_provider_onecell(dev->of_node, data); }