Lines Matching refs:pg

672 static int tegra_powergate_prepare_clocks(struct tegra_powergate *pg)  in tegra_powergate_prepare_clocks()  argument
678 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_prepare_clocks()
679 pg->clk_rates[i] = clk_get_rate(pg->clks[i]); in tegra_powergate_prepare_clocks()
681 if (!pg->clk_rates[i]) { in tegra_powergate_prepare_clocks()
686 if (pg->clk_rates[i] <= safe_rate) in tegra_powergate_prepare_clocks()
695 err = clk_set_rate(pg->clks[i], safe_rate); in tegra_powergate_prepare_clocks()
704 clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_prepare_clocks()
709 static int tegra_powergate_unprepare_clocks(struct tegra_powergate *pg) in tegra_powergate_unprepare_clocks() argument
714 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_unprepare_clocks()
715 err = clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_unprepare_clocks()
723 static void tegra_powergate_disable_clocks(struct tegra_powergate *pg) in tegra_powergate_disable_clocks() argument
727 for (i = 0; i < pg->num_clks; i++) in tegra_powergate_disable_clocks()
728 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_disable_clocks()
731 static int tegra_powergate_enable_clocks(struct tegra_powergate *pg) in tegra_powergate_enable_clocks() argument
736 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_enable_clocks()
737 err = clk_prepare_enable(pg->clks[i]); in tegra_powergate_enable_clocks()
746 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_enable_clocks()
751 static int tegra_powergate_power_up(struct tegra_powergate *pg, in tegra_powergate_power_up() argument
756 err = reset_control_assert(pg->reset); in tegra_powergate_power_up()
762 err = tegra_powergate_set(pg->pmc, pg->id, true); in tegra_powergate_power_up()
768 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_up()
772 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_up()
778 err = __tegra_powergate_remove_clamping(pg->pmc, pg->id); in tegra_powergate_power_up()
784 err = reset_control_deassert(pg->reset); in tegra_powergate_power_up()
790 if (pg->pmc->soc->needs_mbist_war) in tegra_powergate_power_up()
791 err = tegra210_clk_handle_mbist_war(pg->id); in tegra_powergate_power_up()
796 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
798 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
805 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
809 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
812 tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_up()
817 static int tegra_powergate_power_down(struct tegra_powergate *pg) in tegra_powergate_power_down() argument
821 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_down()
825 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
831 err = reset_control_assert(pg->reset); in tegra_powergate_power_down()
837 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
841 err = tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_down()
845 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
852 tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
854 reset_control_deassert(pg->reset); in tegra_powergate_power_down()
858 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
861 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
868 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_on() local
869 struct device *dev = pg->pmc->dev; in tegra_genpd_power_on()
872 err = tegra_powergate_power_up(pg, true); in tegra_genpd_power_on()
875 pg->genpd.name, err); in tegra_genpd_power_on()
879 reset_control_release(pg->reset); in tegra_genpd_power_on()
887 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_off() local
888 struct device *dev = pg->pmc->dev; in tegra_genpd_power_off()
891 err = reset_control_acquire(pg->reset); in tegra_genpd_power_off()
894 pg->genpd.name, err); in tegra_genpd_power_off()
898 err = tegra_powergate_power_down(pg); in tegra_genpd_power_off()
901 pg->genpd.name, err); in tegra_genpd_power_off()
902 reset_control_release(pg->reset); in tegra_genpd_power_off()
971 struct tegra_powergate *pg; in tegra_powergate_sequence_power_up() local
977 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_sequence_power_up()
978 if (!pg) in tegra_powergate_sequence_power_up()
981 pg->clk_rates = kzalloc(sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_sequence_power_up()
982 if (!pg->clk_rates) { in tegra_powergate_sequence_power_up()
983 kfree(pg->clks); in tegra_powergate_sequence_power_up()
987 pg->id = id; in tegra_powergate_sequence_power_up()
988 pg->clks = &clk; in tegra_powergate_sequence_power_up()
989 pg->num_clks = 1; in tegra_powergate_sequence_power_up()
990 pg->reset = rst; in tegra_powergate_sequence_power_up()
991 pg->pmc = pmc; in tegra_powergate_sequence_power_up()
993 err = tegra_powergate_power_up(pg, false); in tegra_powergate_sequence_power_up()
998 kfree(pg->clk_rates); in tegra_powergate_sequence_power_up()
999 kfree(pg); in tegra_powergate_sequence_power_up()
1134 static int tegra_powergate_of_get_clks(struct tegra_powergate *pg, in tegra_powergate_of_get_clks() argument
1145 pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL); in tegra_powergate_of_get_clks()
1146 if (!pg->clks) in tegra_powergate_of_get_clks()
1149 pg->clk_rates = kcalloc(count, sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_of_get_clks()
1150 if (!pg->clk_rates) { in tegra_powergate_of_get_clks()
1151 kfree(pg->clks); in tegra_powergate_of_get_clks()
1156 pg->clks[i] = of_clk_get(np, i); in tegra_powergate_of_get_clks()
1157 if (IS_ERR(pg->clks[i])) { in tegra_powergate_of_get_clks()
1158 err = PTR_ERR(pg->clks[i]); in tegra_powergate_of_get_clks()
1163 pg->num_clks = count; in tegra_powergate_of_get_clks()
1169 clk_put(pg->clks[i]); in tegra_powergate_of_get_clks()
1171 kfree(pg->clk_rates); in tegra_powergate_of_get_clks()
1172 kfree(pg->clks); in tegra_powergate_of_get_clks()
1177 static int tegra_powergate_of_get_resets(struct tegra_powergate *pg, in tegra_powergate_of_get_resets() argument
1180 struct device *dev = pg->pmc->dev; in tegra_powergate_of_get_resets()
1183 pg->reset = of_reset_control_array_get_exclusive_released(np); in tegra_powergate_of_get_resets()
1184 if (IS_ERR(pg->reset)) { in tegra_powergate_of_get_resets()
1185 err = PTR_ERR(pg->reset); in tegra_powergate_of_get_resets()
1190 err = reset_control_acquire(pg->reset); in tegra_powergate_of_get_resets()
1197 err = reset_control_assert(pg->reset); in tegra_powergate_of_get_resets()
1199 err = reset_control_deassert(pg->reset); in tegra_powergate_of_get_resets()
1203 reset_control_release(pg->reset); in tegra_powergate_of_get_resets()
1208 reset_control_release(pg->reset); in tegra_powergate_of_get_resets()
1209 reset_control_put(pg->reset); in tegra_powergate_of_get_resets()
1218 struct tegra_powergate *pg; in tegra_powergate_add() local
1222 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_add()
1223 if (!pg) in tegra_powergate_add()
1239 pg->id = id; in tegra_powergate_add()
1240 pg->genpd.name = np->name; in tegra_powergate_add()
1241 pg->genpd.power_off = tegra_genpd_power_off; in tegra_powergate_add()
1242 pg->genpd.power_on = tegra_genpd_power_on; in tegra_powergate_add()
1243 pg->pmc = pmc; in tegra_powergate_add()
1245 off = !tegra_powergate_is_powered(pmc, pg->id); in tegra_powergate_add()
1247 err = tegra_powergate_of_get_clks(pg, np); in tegra_powergate_add()
1253 err = tegra_powergate_of_get_resets(pg, np, off); in tegra_powergate_add()
1261 WARN_ON(tegra_powergate_power_up(pg, true)); in tegra_powergate_add()
1266 err = pm_genpd_init(&pg->genpd, NULL, off); in tegra_powergate_add()
1273 err = of_genpd_add_provider_simple(np, &pg->genpd); in tegra_powergate_add()
1280 dev_dbg(dev, "added PM domain %s\n", pg->genpd.name); in tegra_powergate_add()
1285 pm_genpd_remove(&pg->genpd); in tegra_powergate_add()
1288 reset_control_put(pg->reset); in tegra_powergate_add()
1291 while (pg->num_clks--) in tegra_powergate_add()
1292 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_add()
1294 kfree(pg->clks); in tegra_powergate_add()
1300 kfree(pg); in tegra_powergate_add()
1440 struct tegra_powergate *pg = to_powergate(genpd); in tegra_powergate_remove() local
1442 reset_control_put(pg->reset); in tegra_powergate_remove()
1444 while (pg->num_clks--) in tegra_powergate_remove()
1445 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_remove()
1447 kfree(pg->clks); in tegra_powergate_remove()
1449 set_bit(pg->id, pmc->powergates_available); in tegra_powergate_remove()
1451 kfree(pg); in tegra_powergate_remove()