3838#include <linux/pinctrl/pinctrl.h>
3939#include <linux/platform_device.h>
4040#include <linux/pm_domain.h>
41+ #include <linux/pm_opp.h>
4142#include <linux/reboot.h>
4243#include <linux/regmap.h>
4344#include <linux/reset.h>
@@ -428,6 +429,9 @@ struct tegra_pmc {
428429 struct irq_chip irq ;
429430
430431 struct notifier_block clk_nb ;
432+
433+ bool core_domain_state_synced ;
434+ bool core_domain_registered ;
431435};
432436
433437static struct tegra_pmc * pmc = & (struct tegra_pmc ) {
@@ -1302,12 +1306,107 @@ static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
13021306 return err ;
13031307}
13041308
1309+ bool tegra_pmc_core_domain_state_synced (void )
1310+ {
1311+ return pmc -> core_domain_state_synced ;
1312+ }
1313+
1314+ static int
1315+ tegra_pmc_core_pd_set_performance_state (struct generic_pm_domain * genpd ,
1316+ unsigned int level )
1317+ {
1318+ struct dev_pm_opp * opp ;
1319+ int err ;
1320+
1321+ opp = dev_pm_opp_find_level_ceil (& genpd -> dev , & level );
1322+ if (IS_ERR (opp )) {
1323+ dev_err (& genpd -> dev , "failed to find OPP for level %u: %pe\n" ,
1324+ level , opp );
1325+ return PTR_ERR (opp );
1326+ }
1327+
1328+ mutex_lock (& pmc -> powergates_lock );
1329+ err = dev_pm_opp_set_opp (pmc -> dev , opp );
1330+ mutex_unlock (& pmc -> powergates_lock );
1331+
1332+ dev_pm_opp_put (opp );
1333+
1334+ if (err ) {
1335+ dev_err (& genpd -> dev , "failed to set voltage to %duV: %d\n" ,
1336+ level , err );
1337+ return err ;
1338+ }
1339+
1340+ return 0 ;
1341+ }
1342+
1343+ static unsigned int
1344+ tegra_pmc_core_pd_opp_to_performance_state (struct generic_pm_domain * genpd ,
1345+ struct dev_pm_opp * opp )
1346+ {
1347+ return dev_pm_opp_get_level (opp );
1348+ }
1349+
1350+ static int tegra_pmc_core_pd_add (struct tegra_pmc * pmc , struct device_node * np )
1351+ {
1352+ struct generic_pm_domain * genpd ;
1353+ const char * rname = "core" ;
1354+ int err ;
1355+
1356+ genpd = devm_kzalloc (pmc -> dev , sizeof (* genpd ), GFP_KERNEL );
1357+ if (!genpd )
1358+ return - ENOMEM ;
1359+
1360+ genpd -> name = np -> name ;
1361+ genpd -> set_performance_state = tegra_pmc_core_pd_set_performance_state ;
1362+ genpd -> opp_to_performance_state = tegra_pmc_core_pd_opp_to_performance_state ;
1363+
1364+ err = devm_pm_opp_set_regulators (pmc -> dev , & rname , 1 );
1365+ if (err )
1366+ return dev_err_probe (pmc -> dev , err ,
1367+ "failed to set core OPP regulator\n" );
1368+
1369+ err = pm_genpd_init (genpd , NULL , false);
1370+ if (err ) {
1371+ dev_err (pmc -> dev , "failed to init core genpd: %d\n" , err );
1372+ return err ;
1373+ }
1374+
1375+ err = of_genpd_add_provider_simple (np , genpd );
1376+ if (err ) {
1377+ dev_err (pmc -> dev , "failed to add core genpd: %d\n" , err );
1378+ goto remove_genpd ;
1379+ }
1380+
1381+ pmc -> core_domain_registered = true;
1382+
1383+ return 0 ;
1384+
1385+ remove_genpd :
1386+ pm_genpd_remove (genpd );
1387+
1388+ return err ;
1389+ }
1390+
13051391static int tegra_powergate_init (struct tegra_pmc * pmc ,
13061392 struct device_node * parent )
13071393{
1394+ struct of_phandle_args child_args , parent_args ;
13081395 struct device_node * np , * child ;
13091396 int err = 0 ;
13101397
1398+ /*
1399+ * Core power domain is the parent of powergate domains, hence it
1400+ * should be registered first.
1401+ */
1402+ np = of_get_child_by_name (parent , "core-domain" );
1403+ if (np ) {
1404+ err = tegra_pmc_core_pd_add (pmc , np );
1405+ of_node_put (np );
1406+ if (err )
1407+ return err ;
1408+ }
1409+
13111410 np = of_get_child_by_name (parent , "powergates" );
13121411 if (!np )
13131412 return 0 ;
@@ -1318,6 +1417,21 @@ static int tegra_powergate_init(struct tegra_pmc *pmc,
13181417 of_node_put (child );
13191418 break ;
13201419 }
1420+
1421+ if (of_parse_phandle_with_args (child , "power-domains" ,
1422+ "#power-domain-cells" ,
1423+ 0 , & parent_args ))
1424+ continue ;
1425+
1426+ child_args .np = child ;
1427+ child_args .args_count = 0 ;
1428+
1429+ err = of_genpd_add_subdomain (& parent_args , & child_args );
1430+ of_node_put (parent_args .np );
1431+ if (err ) {
1432+ of_node_put (child );
1433+ break ;
1434+ }
13211435 }
13221436
13231437 of_node_put (np );
@@ -1361,6 +1475,12 @@ static void tegra_powergate_remove_all(struct device_node *parent)
13611475 }
13621476
13631477 of_node_put (np );
1478+
1479+ np = of_get_child_by_name (parent , "core-domain" );
1480+ if (np ) {
1481+ of_genpd_del_provider (np );
1482+ of_genpd_remove_last (np );
1483+ }
13641484}
13651485
13661486static const struct tegra_io_pad_soc *
@@ -3672,6 +3792,29 @@ static const struct of_device_id tegra_pmc_match[] = {
36723792 { }
36733793};
36743794
3795+ static void tegra_pmc_sync_state (struct device * dev )
3796+ {
3797+ int err ;
3798+
3799+ /*
3800+ * Older device-trees don't have core PD, and thus, there are
3801+ * no dependencies that will block the state syncing. We shouldn't
3802+ * mark the domain as synced in this case.
3803+ */
3804+ if (!pmc -> core_domain_registered )
3805+ return ;
3806+
3807+ pmc -> core_domain_state_synced = true;
3808+
3809+ /* this is a no-op if core regulator isn't used */
3810+ mutex_lock (& pmc -> powergates_lock );
3811+ err = dev_pm_opp_sync_regulators (dev );
3812+ mutex_unlock (& pmc -> powergates_lock );
3813+
3814+ if (err )
3815+ dev_err (dev , "failed to sync regulators: %d\n" , err );
3816+ }
3817+
36753818static struct platform_driver tegra_pmc_driver = {
36763819 .driver = {
36773820 .name = "tegra-pmc" ,
@@ -3680,6 +3823,7 @@ static struct platform_driver tegra_pmc_driver = {
36803823#if defined(CONFIG_PM_SLEEP ) && defined (CONFIG_ARM )
36813824 .pm = & tegra_pmc_pm_ops ,
36823825#endif
3826+ .sync_state = tegra_pmc_sync_state ,
36833827 },
36843828 .probe = tegra_pmc_probe ,
36853829};
0 commit comments