@@ -1232,7 +1232,7 @@ static int tegra_powergate_of_get_clks(struct tegra_powergate *pg,
12321232}
12331233
12341234static int tegra_powergate_of_get_resets (struct tegra_powergate * pg ,
1235- struct device_node * np , bool off )
1235+ struct device_node * np )
12361236{
12371237 struct device * dev = pg -> pmc -> dev ;
12381238 int err ;
@@ -1247,22 +1247,6 @@ static int tegra_powergate_of_get_resets(struct tegra_powergate *pg,
12471247 err = reset_control_acquire (pg -> reset );
12481248 if (err < 0 ) {
12491249 pr_err ("failed to acquire resets: %d\n" , err );
1250- goto out ;
1251- }
1252-
1253- if (off ) {
1254- err = reset_control_assert (pg -> reset );
1255- } else {
1256- err = reset_control_deassert (pg -> reset );
1257- if (err < 0 )
1258- goto out ;
1259-
1260- reset_control_release (pg -> reset );
1261- }
1262-
1263- out :
1264- if (err ) {
1265- reset_control_release (pg -> reset );
12661250 reset_control_put (pg -> reset );
12671251 }
12681252
@@ -1308,20 +1292,43 @@ static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
13081292 goto set_available ;
13091293 }
13101294
1311- err = tegra_powergate_of_get_resets (pg , np , off );
1295+ err = tegra_powergate_of_get_resets (pg , np );
13121296 if (err < 0 ) {
13131297 dev_err (dev , "failed to get resets for %pOFn: %d\n" , np , err );
13141298 goto remove_clks ;
13151299 }
13161300
1317- if (!IS_ENABLED (CONFIG_PM_GENERIC_DOMAINS )) {
1318- if (off )
1319- WARN_ON (tegra_powergate_power_up (pg , true));
1301+ /*
1302+ * If the power-domain is off, then ensure the resets are asserted.
1303+ * If the power-domain is on, then power down to ensure that when is
1304+ * it turned on the power-domain, clocks and resets are all in the
1305+ * expected state.
1306+ */
1307+ if (off ) {
1308+ err = reset_control_assert (pg -> reset );
1309+ if (err ) {
1310+ pr_err ("failed to assert resets: %d\n" , err );
1311+ goto remove_resets ;
1312+ }
1313+ } else {
1314+ err = tegra_powergate_power_down (pg );
1315+ if (err ) {
1316+ dev_err (dev , "failed to turn off PM domain %s: %d\n" ,
1317+ pg -> genpd .name , err );
1318+ goto remove_resets ;
1319+ }
1320+ }
13201321
1322+ /*
1323+ * If PM_GENERIC_DOMAINS is not enabled, power-on
1324+ * the domain and skip the genpd registration.
1325+ */
1326+ if (!IS_ENABLED (CONFIG_PM_GENERIC_DOMAINS )) {
1327+ WARN_ON (tegra_powergate_power_up (pg , true));
13211328 goto remove_resets ;
13221329 }
13231330
1324- err = pm_genpd_init (& pg -> genpd , NULL , off );
1331+ err = pm_genpd_init (& pg -> genpd , NULL , true );
13251332 if (err < 0 ) {
13261333 dev_err (dev , "failed to initialise PM domain %pOFn: %d\n" , np ,
13271334 err );
0 commit comments