Lines Matching refs:pg
688 static int tegra_powergate_prepare_clocks(struct tegra_powergate *pg) in tegra_powergate_prepare_clocks() argument
694 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_prepare_clocks()
695 pg->clk_rates[i] = clk_get_rate(pg->clks[i]); in tegra_powergate_prepare_clocks()
697 if (!pg->clk_rates[i]) { in tegra_powergate_prepare_clocks()
702 if (pg->clk_rates[i] <= safe_rate) in tegra_powergate_prepare_clocks()
711 err = clk_set_rate(pg->clks[i], safe_rate); in tegra_powergate_prepare_clocks()
720 clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_prepare_clocks()
725 static int tegra_powergate_unprepare_clocks(struct tegra_powergate *pg) in tegra_powergate_unprepare_clocks() argument
730 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_unprepare_clocks()
731 err = clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_unprepare_clocks()
739 static void tegra_powergate_disable_clocks(struct tegra_powergate *pg) in tegra_powergate_disable_clocks() argument
743 for (i = 0; i < pg->num_clks; i++) in tegra_powergate_disable_clocks()
744 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_disable_clocks()
747 static int tegra_powergate_enable_clocks(struct tegra_powergate *pg) in tegra_powergate_enable_clocks() argument
752 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_enable_clocks()
753 err = clk_prepare_enable(pg->clks[i]); in tegra_powergate_enable_clocks()
762 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_enable_clocks()
767 static int tegra_powergate_power_up(struct tegra_powergate *pg, in tegra_powergate_power_up() argument
772 err = reset_control_assert(pg->reset); in tegra_powergate_power_up()
778 err = tegra_powergate_set(pg->pmc, pg->id, true); in tegra_powergate_power_up()
784 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_up()
788 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_up()
794 err = __tegra_powergate_remove_clamping(pg->pmc, pg->id); in tegra_powergate_power_up()
800 err = reset_control_deassert(pg->reset); in tegra_powergate_power_up()
806 if (pg->pmc->soc->needs_mbist_war) in tegra_powergate_power_up()
807 err = tegra210_clk_handle_mbist_war(pg->id); in tegra_powergate_power_up()
812 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
814 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
821 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
825 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
828 tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_up()
833 static int tegra_powergate_power_down(struct tegra_powergate *pg) in tegra_powergate_power_down() argument
837 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_down()
841 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
847 err = reset_control_assert(pg->reset); in tegra_powergate_power_down()
853 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
857 err = tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_down()
861 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
868 tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
870 reset_control_deassert(pg->reset); in tegra_powergate_power_down()
874 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
877 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
884 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_on() local
885 struct device *dev = pg->pmc->dev; in tegra_genpd_power_on()
888 err = tegra_powergate_power_up(pg, true); in tegra_genpd_power_on()
891 pg->genpd.name, err); in tegra_genpd_power_on()
895 reset_control_release(pg->reset); in tegra_genpd_power_on()
903 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_off() local
904 struct device *dev = pg->pmc->dev; in tegra_genpd_power_off()
907 err = reset_control_acquire(pg->reset); in tegra_genpd_power_off()
910 pg->genpd.name, err); in tegra_genpd_power_off()
914 err = tegra_powergate_power_down(pg); in tegra_genpd_power_off()
917 pg->genpd.name, err); in tegra_genpd_power_off()
918 reset_control_release(pg->reset); in tegra_genpd_power_off()
987 struct tegra_powergate *pg; in tegra_powergate_sequence_power_up() local
993 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_sequence_power_up()
994 if (!pg) in tegra_powergate_sequence_power_up()
997 pg->clk_rates = kzalloc(sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_sequence_power_up()
998 if (!pg->clk_rates) { in tegra_powergate_sequence_power_up()
999 kfree(pg->clks); in tegra_powergate_sequence_power_up()
1003 pg->id = id; in tegra_powergate_sequence_power_up()
1004 pg->clks = &clk; in tegra_powergate_sequence_power_up()
1005 pg->num_clks = 1; in tegra_powergate_sequence_power_up()
1006 pg->reset = rst; in tegra_powergate_sequence_power_up()
1007 pg->pmc = pmc; in tegra_powergate_sequence_power_up()
1009 err = tegra_powergate_power_up(pg, false); in tegra_powergate_sequence_power_up()
1014 kfree(pg->clk_rates); in tegra_powergate_sequence_power_up()
1015 kfree(pg); in tegra_powergate_sequence_power_up()
1183 static int tegra_powergate_of_get_clks(struct tegra_powergate *pg, in tegra_powergate_of_get_clks() argument
1194 pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL); in tegra_powergate_of_get_clks()
1195 if (!pg->clks) in tegra_powergate_of_get_clks()
1198 pg->clk_rates = kcalloc(count, sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_of_get_clks()
1199 if (!pg->clk_rates) { in tegra_powergate_of_get_clks()
1200 kfree(pg->clks); in tegra_powergate_of_get_clks()
1205 pg->clks[i] = of_clk_get(np, i); in tegra_powergate_of_get_clks()
1206 if (IS_ERR(pg->clks[i])) { in tegra_powergate_of_get_clks()
1207 err = PTR_ERR(pg->clks[i]); in tegra_powergate_of_get_clks()
1212 pg->num_clks = count; in tegra_powergate_of_get_clks()
1218 clk_put(pg->clks[i]); in tegra_powergate_of_get_clks()
1220 kfree(pg->clk_rates); in tegra_powergate_of_get_clks()
1221 kfree(pg->clks); in tegra_powergate_of_get_clks()
1226 static int tegra_powergate_of_get_resets(struct tegra_powergate *pg, in tegra_powergate_of_get_resets() argument
1229 struct device *dev = pg->pmc->dev; in tegra_powergate_of_get_resets()
1232 pg->reset = of_reset_control_array_get_exclusive_released(np); in tegra_powergate_of_get_resets()
1233 if (IS_ERR(pg->reset)) { in tegra_powergate_of_get_resets()
1234 err = PTR_ERR(pg->reset); in tegra_powergate_of_get_resets()
1239 err = reset_control_acquire(pg->reset); in tegra_powergate_of_get_resets()
1246 err = reset_control_assert(pg->reset); in tegra_powergate_of_get_resets()
1248 err = reset_control_deassert(pg->reset); in tegra_powergate_of_get_resets()
1252 reset_control_release(pg->reset); in tegra_powergate_of_get_resets()
1257 reset_control_release(pg->reset); in tegra_powergate_of_get_resets()
1258 reset_control_put(pg->reset); in tegra_powergate_of_get_resets()
1267 struct tegra_powergate *pg; in tegra_powergate_add() local
1271 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_add()
1272 if (!pg) in tegra_powergate_add()
1288 pg->id = id; in tegra_powergate_add()
1289 pg->genpd.name = np->name; in tegra_powergate_add()
1290 pg->genpd.power_off = tegra_genpd_power_off; in tegra_powergate_add()
1291 pg->genpd.power_on = tegra_genpd_power_on; in tegra_powergate_add()
1292 pg->pmc = pmc; in tegra_powergate_add()
1294 off = !tegra_powergate_is_powered(pmc, pg->id); in tegra_powergate_add()
1296 err = tegra_powergate_of_get_clks(pg, np); in tegra_powergate_add()
1302 err = tegra_powergate_of_get_resets(pg, np, off); in tegra_powergate_add()
1310 WARN_ON(tegra_powergate_power_up(pg, true)); in tegra_powergate_add()
1315 err = pm_genpd_init(&pg->genpd, NULL, off); in tegra_powergate_add()
1322 err = of_genpd_add_provider_simple(np, &pg->genpd); in tegra_powergate_add()
1329 dev_dbg(dev, "added PM domain %s\n", pg->genpd.name); in tegra_powergate_add()
1334 pm_genpd_remove(&pg->genpd); in tegra_powergate_add()
1337 reset_control_put(pg->reset); in tegra_powergate_add()
1340 while (pg->num_clks--) in tegra_powergate_add()
1341 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_add()
1343 kfree(pg->clks); in tegra_powergate_add()
1349 kfree(pg); in tegra_powergate_add()
1489 struct tegra_powergate *pg = to_powergate(genpd); in tegra_powergate_remove() local
1491 reset_control_put(pg->reset); in tegra_powergate_remove()
1493 while (pg->num_clks--) in tegra_powergate_remove()
1494 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_remove()
1496 kfree(pg->clks); in tegra_powergate_remove()
1498 set_bit(pg->id, pmc->powergates_available); in tegra_powergate_remove()
1500 kfree(pg); in tegra_powergate_remove()