Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+24 -10
+24 -10
drivers/soc/tegra/pmc.c
··· 268 268 }, 269 269 }; 270 270 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 + 271 282 struct tegra_powergate { 272 283 struct generic_pm_domain genpd; 273 284 struct tegra_pmc *pmc; ··· 1398 1387 tegra_pmc_core_pd_set_performance_state(struct generic_pm_domain *genpd, 1399 1388 unsigned int level) 1400 1389 { 1390 + struct tegra_pmc_core_pd *pd = to_core_pd(genpd); 1391 + struct tegra_pmc *pmc = pd->pmc; 1401 1392 struct dev_pm_opp *opp; 1402 1393 int err; 1403 1394 ··· 1427 1414 1428 1415 static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np) 1429 1416 { 1430 - struct generic_pm_domain *genpd; 1431 1417 const char *rname[] = { "core", NULL}; 1418 + struct tegra_pmc_core_pd *pd; 1432 1419 int err; 1433 1420 1434 - genpd = devm_kzalloc(pmc->dev, sizeof(*genpd), GFP_KERNEL); 1435 - if (!genpd) 1421 + pd = devm_kzalloc(pmc->dev, sizeof(*pd), GFP_KERNEL); 1422 + if (!pd) 1436 1423 return -ENOMEM; 1437 1424 1438 - genpd->name = "core"; 1439 - genpd->flags = GENPD_FLAG_NO_SYNC_STATE; 1440 - genpd->set_performance_state = tegra_pmc_core_pd_set_performance_state; 1425 + pd->genpd.name = "core"; 1426 + pd->genpd.flags = GENPD_FLAG_NO_SYNC_STATE; 1427 + pd->genpd.set_performance_state = tegra_pmc_core_pd_set_performance_state; 1428 + pd->pmc = pmc; 1441 1429 1442 1430 err = devm_pm_opp_set_regulators(pmc->dev, rname); 1443 1431 if (err) 1444 1432 return dev_err_probe(pmc->dev, err, 1445 1433 "failed to set core OPP regulator\n"); 1446 1434 1447 - err = pm_genpd_init(genpd, NULL, false); 1435 + err = pm_genpd_init(&pd->genpd, NULL, false); 1448 1436 if (err) { 1449 1437 dev_err(pmc->dev, "failed to init core genpd: %d\n", err); 1450 1438 return err; 1451 1439 } 1452 1440 1453 - err = of_genpd_add_provider_simple(np, genpd); 1441 + err = of_genpd_add_provider_simple(np, &pd->genpd); 1454 1442 if (err) { 1455 1443 dev_err(pmc->dev, "failed to add core genpd: %d\n", err); 1456 1444 goto remove_genpd; ··· 1460 1446 return 0; 1461 1447 1462 1448 remove_genpd: 1463 - pm_genpd_remove(genpd); 1449 + pm_genpd_remove(&pd->genpd); 1464 1450 1465 1451 return err; 1466 1452 } ··· 1523 1509 1524 1510 kfree(pg->clks); 1525 1511 1526 - set_bit(pg->id, pmc->powergates_available); 1512 + set_bit(pg->id, pg->pmc->powergates_available); 1527 1513 1528 1514 kfree(pg); 1529 1515 }