Skip to content

Commit bb946b0

Browse files
committed
soc/tegra: pmc: Use PMC context embedded in powergates
The powergates exposed by the PMC have a pointer to the PMC context embedded. Use that embedded reference instead of relying on a global variable. For the core power domain a new structure needs to be introduced to wrap the generic PM domain and store the PMC context. Signed-off-by: Thierry Reding <treding@nvidia.com>
1 parent b2a3e82 commit bb946b0

1 file changed

Lines changed: 24 additions & 10 deletions

File tree

drivers/soc/tegra/pmc.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,17 @@ static const struct pmc_clk_init_data tegra_pmc_clks_data[] = {
268268
},
269269
};
270270

271+
struct tegra_pmc_core_pd {
272+
struct generic_pm_domain genpd;
273+
struct tegra_pmc *pmc;
274+
};
275+
276+
static inline struct tegra_pmc_core_pd *
277+
to_core_pd(struct generic_pm_domain *genpd)
278+
{
279+
return container_of(genpd, struct tegra_pmc_core_pd, genpd);
280+
}
281+
271282
struct tegra_powergate {
272283
struct generic_pm_domain genpd;
273284
struct tegra_pmc *pmc;
@@ -1387,6 +1398,8 @@ static int
13871398
tegra_pmc_core_pd_set_performance_state(struct generic_pm_domain *genpd,
13881399
unsigned int level)
13891400
{
1401+
struct tegra_pmc_core_pd *pd = to_core_pd(genpd);
1402+
struct tegra_pmc *pmc = pd->pmc;
13901403
struct dev_pm_opp *opp;
13911404
int err;
13921405

@@ -1414,30 +1427,31 @@ tegra_pmc_core_pd_set_performance_state(struct generic_pm_domain *genpd,
14141427

14151428
static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np)
14161429
{
1417-
struct generic_pm_domain *genpd;
14181430
const char *rname[] = { "core", NULL};
1431+
struct tegra_pmc_core_pd *pd;
14191432
int err;
14201433

1421-
genpd = devm_kzalloc(pmc->dev, sizeof(*genpd), GFP_KERNEL);
1422-
if (!genpd)
1434+
pd = devm_kzalloc(pmc->dev, sizeof(*pd), GFP_KERNEL);
1435+
if (!pd)
14231436
return -ENOMEM;
14241437

1425-
genpd->name = "core";
1426-
genpd->flags = GENPD_FLAG_NO_SYNC_STATE;
1427-
genpd->set_performance_state = tegra_pmc_core_pd_set_performance_state;
1438+
pd->genpd.name = "core";
1439+
pd->genpd.flags = GENPD_FLAG_NO_SYNC_STATE;
1440+
pd->genpd.set_performance_state = tegra_pmc_core_pd_set_performance_state;
1441+
pd->pmc = pmc;
14281442

14291443
err = devm_pm_opp_set_regulators(pmc->dev, rname);
14301444
if (err)
14311445
return dev_err_probe(pmc->dev, err,
14321446
"failed to set core OPP regulator\n");
14331447

1434-
err = pm_genpd_init(genpd, NULL, false);
1448+
err = pm_genpd_init(&pd->genpd, NULL, false);
14351449
if (err) {
14361450
dev_err(pmc->dev, "failed to init core genpd: %d\n", err);
14371451
return err;
14381452
}
14391453

1440-
err = of_genpd_add_provider_simple(np, genpd);
1454+
err = of_genpd_add_provider_simple(np, &pd->genpd);
14411455
if (err) {
14421456
dev_err(pmc->dev, "failed to add core genpd: %d\n", err);
14431457
goto remove_genpd;
@@ -1446,7 +1460,7 @@ static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np)
14461460
return 0;
14471461

14481462
remove_genpd:
1449-
pm_genpd_remove(genpd);
1463+
pm_genpd_remove(&pd->genpd);
14501464

14511465
return err;
14521466
}
@@ -1509,7 +1523,7 @@ static void tegra_powergate_remove(struct generic_pm_domain *genpd)
15091523

15101524
kfree(pg->clks);
15111525

1512-
set_bit(pg->id, pmc->powergates_available);
1526+
set_bit(pg->id, pg->pmc->powergates_available);
15131527

15141528
kfree(pg);
15151529
}

0 commit comments

Comments
 (0)