Lines Matching refs:pg
671 static int tegra_powergate_prepare_clocks(struct tegra_powergate *pg) in tegra_powergate_prepare_clocks() argument
677 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_prepare_clocks()
678 pg->clk_rates[i] = clk_get_rate(pg->clks[i]); in tegra_powergate_prepare_clocks()
680 if (!pg->clk_rates[i]) { in tegra_powergate_prepare_clocks()
685 if (pg->clk_rates[i] <= safe_rate) in tegra_powergate_prepare_clocks()
694 err = clk_set_rate(pg->clks[i], safe_rate); in tegra_powergate_prepare_clocks()
703 clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_prepare_clocks()
708 static int tegra_powergate_unprepare_clocks(struct tegra_powergate *pg) in tegra_powergate_unprepare_clocks() argument
713 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_unprepare_clocks()
714 err = clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_unprepare_clocks()
722 static void tegra_powergate_disable_clocks(struct tegra_powergate *pg) in tegra_powergate_disable_clocks() argument
726 for (i = 0; i < pg->num_clks; i++) in tegra_powergate_disable_clocks()
727 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_disable_clocks()
730 static int tegra_powergate_enable_clocks(struct tegra_powergate *pg) in tegra_powergate_enable_clocks() argument
735 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_enable_clocks()
736 err = clk_prepare_enable(pg->clks[i]); in tegra_powergate_enable_clocks()
745 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_enable_clocks()
750 static int tegra_powergate_power_up(struct tegra_powergate *pg, in tegra_powergate_power_up() argument
755 err = reset_control_assert(pg->reset); in tegra_powergate_power_up()
761 err = tegra_powergate_set(pg->pmc, pg->id, true); in tegra_powergate_power_up()
767 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_up()
771 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_up()
777 err = __tegra_powergate_remove_clamping(pg->pmc, pg->id); in tegra_powergate_power_up()
783 err = reset_control_deassert(pg->reset); in tegra_powergate_power_up()
789 if (pg->pmc->soc->needs_mbist_war) in tegra_powergate_power_up()
790 err = tegra210_clk_handle_mbist_war(pg->id); in tegra_powergate_power_up()
795 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
797 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
804 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
808 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
811 tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_up()
816 static int tegra_powergate_power_down(struct tegra_powergate *pg) in tegra_powergate_power_down() argument
820 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_down()
824 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
830 err = reset_control_assert(pg->reset); in tegra_powergate_power_down()
836 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
840 err = tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_down()
844 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
851 tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
853 reset_control_deassert(pg->reset); in tegra_powergate_power_down()
857 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
860 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
867 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_on() local
868 struct device *dev = pg->pmc->dev; in tegra_genpd_power_on()
871 err = tegra_powergate_power_up(pg, true); in tegra_genpd_power_on()
874 pg->genpd.name, err); in tegra_genpd_power_on()
878 reset_control_release(pg->reset); in tegra_genpd_power_on()
886 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_off() local
887 struct device *dev = pg->pmc->dev; in tegra_genpd_power_off()
890 err = reset_control_acquire(pg->reset); in tegra_genpd_power_off()
893 pg->genpd.name, err); in tegra_genpd_power_off()
897 err = tegra_powergate_power_down(pg); in tegra_genpd_power_off()
900 pg->genpd.name, err); in tegra_genpd_power_off()
901 reset_control_release(pg->reset); in tegra_genpd_power_off()
970 struct tegra_powergate *pg; in tegra_powergate_sequence_power_up() local
976 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_sequence_power_up()
977 if (!pg) in tegra_powergate_sequence_power_up()
980 pg->clk_rates = kzalloc(sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_sequence_power_up()
981 if (!pg->clk_rates) { in tegra_powergate_sequence_power_up()
982 kfree(pg->clks); in tegra_powergate_sequence_power_up()
986 pg->id = id; in tegra_powergate_sequence_power_up()
987 pg->clks = &clk; in tegra_powergate_sequence_power_up()
988 pg->num_clks = 1; in tegra_powergate_sequence_power_up()
989 pg->reset = rst; in tegra_powergate_sequence_power_up()
990 pg->pmc = pmc; in tegra_powergate_sequence_power_up()
992 err = tegra_powergate_power_up(pg, false); in tegra_powergate_sequence_power_up()
997 kfree(pg->clk_rates); in tegra_powergate_sequence_power_up()
998 kfree(pg); in tegra_powergate_sequence_power_up()
1133 static int tegra_powergate_of_get_clks(struct tegra_powergate *pg, in tegra_powergate_of_get_clks() argument
1144 pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL); in tegra_powergate_of_get_clks()
1145 if (!pg->clks) in tegra_powergate_of_get_clks()
1148 pg->clk_rates = kcalloc(count, sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_of_get_clks()
1149 if (!pg->clk_rates) { in tegra_powergate_of_get_clks()
1150 kfree(pg->clks); in tegra_powergate_of_get_clks()
1155 pg->clks[i] = of_clk_get(np, i); in tegra_powergate_of_get_clks()
1156 if (IS_ERR(pg->clks[i])) { in tegra_powergate_of_get_clks()
1157 err = PTR_ERR(pg->clks[i]); in tegra_powergate_of_get_clks()
1162 pg->num_clks = count; in tegra_powergate_of_get_clks()
1168 clk_put(pg->clks[i]); in tegra_powergate_of_get_clks()
1170 kfree(pg->clk_rates); in tegra_powergate_of_get_clks()
1171 kfree(pg->clks); in tegra_powergate_of_get_clks()
1176 static int tegra_powergate_of_get_resets(struct tegra_powergate *pg, in tegra_powergate_of_get_resets() argument
1179 struct device *dev = pg->pmc->dev; in tegra_powergate_of_get_resets()
1182 pg->reset = of_reset_control_array_get_exclusive_released(np); in tegra_powergate_of_get_resets()
1183 if (IS_ERR(pg->reset)) { in tegra_powergate_of_get_resets()
1184 err = PTR_ERR(pg->reset); in tegra_powergate_of_get_resets()
1189 err = reset_control_acquire(pg->reset); in tegra_powergate_of_get_resets()
1196 err = reset_control_assert(pg->reset); in tegra_powergate_of_get_resets()
1198 err = reset_control_deassert(pg->reset); in tegra_powergate_of_get_resets()
1202 reset_control_release(pg->reset); in tegra_powergate_of_get_resets()
1207 reset_control_release(pg->reset); in tegra_powergate_of_get_resets()
1208 reset_control_put(pg->reset); in tegra_powergate_of_get_resets()
1217 struct tegra_powergate *pg; in tegra_powergate_add() local
1221 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_add()
1222 if (!pg) in tegra_powergate_add()
1238 pg->id = id; in tegra_powergate_add()
1239 pg->genpd.name = np->name; in tegra_powergate_add()
1240 pg->genpd.power_off = tegra_genpd_power_off; in tegra_powergate_add()
1241 pg->genpd.power_on = tegra_genpd_power_on; in tegra_powergate_add()
1242 pg->pmc = pmc; in tegra_powergate_add()
1244 off = !tegra_powergate_is_powered(pmc, pg->id); in tegra_powergate_add()
1246 err = tegra_powergate_of_get_clks(pg, np); in tegra_powergate_add()
1252 err = tegra_powergate_of_get_resets(pg, np, off); in tegra_powergate_add()
1260 WARN_ON(tegra_powergate_power_up(pg, true)); in tegra_powergate_add()
1265 err = pm_genpd_init(&pg->genpd, NULL, off); in tegra_powergate_add()
1272 err = of_genpd_add_provider_simple(np, &pg->genpd); in tegra_powergate_add()
1279 dev_dbg(dev, "added PM domain %s\n", pg->genpd.name); in tegra_powergate_add()
1284 pm_genpd_remove(&pg->genpd); in tegra_powergate_add()
1287 reset_control_put(pg->reset); in tegra_powergate_add()
1290 while (pg->num_clks--) in tegra_powergate_add()
1291 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_add()
1293 kfree(pg->clks); in tegra_powergate_add()
1299 kfree(pg); in tegra_powergate_add()
1439 struct tegra_powergate *pg = to_powergate(genpd); in tegra_powergate_remove() local
1441 reset_control_put(pg->reset); in tegra_powergate_remove()
1443 while (pg->num_clks--) in tegra_powergate_remove()
1444 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_remove()
1446 kfree(pg->clks); in tegra_powergate_remove()
1448 set_bit(pg->id, pmc->powergates_available); in tegra_powergate_remove()
1450 kfree(pg); in tegra_powergate_remove()