Lines Matching refs:pg
706 static int tegra_powergate_prepare_clocks(struct tegra_powergate *pg) in tegra_powergate_prepare_clocks() argument
712 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_prepare_clocks()
713 pg->clk_rates[i] = clk_get_rate(pg->clks[i]); in tegra_powergate_prepare_clocks()
715 if (!pg->clk_rates[i]) { in tegra_powergate_prepare_clocks()
720 if (pg->clk_rates[i] <= safe_rate) in tegra_powergate_prepare_clocks()
729 err = clk_set_rate(pg->clks[i], safe_rate); in tegra_powergate_prepare_clocks()
738 clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_prepare_clocks()
743 static int tegra_powergate_unprepare_clocks(struct tegra_powergate *pg) in tegra_powergate_unprepare_clocks() argument
748 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_unprepare_clocks()
749 err = clk_set_rate(pg->clks[i], pg->clk_rates[i]); in tegra_powergate_unprepare_clocks()
757 static void tegra_powergate_disable_clocks(struct tegra_powergate *pg) in tegra_powergate_disable_clocks() argument
761 for (i = 0; i < pg->num_clks; i++) in tegra_powergate_disable_clocks()
762 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_disable_clocks()
765 static int tegra_powergate_enable_clocks(struct tegra_powergate *pg) in tegra_powergate_enable_clocks() argument
770 for (i = 0; i < pg->num_clks; i++) { in tegra_powergate_enable_clocks()
771 err = clk_prepare_enable(pg->clks[i]); in tegra_powergate_enable_clocks()
780 clk_disable_unprepare(pg->clks[i]); in tegra_powergate_enable_clocks()
785 static int tegra_powergate_power_up(struct tegra_powergate *pg, in tegra_powergate_power_up() argument
790 err = reset_control_assert(pg->reset); in tegra_powergate_power_up()
796 err = tegra_powergate_set(pg->pmc, pg->id, true); in tegra_powergate_power_up()
802 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_up()
806 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_up()
812 err = __tegra_powergate_remove_clamping(pg->pmc, pg->id); in tegra_powergate_power_up()
818 err = reset_control_deassert(pg->reset); in tegra_powergate_power_up()
824 if (pg->pmc->soc->needs_mbist_war) in tegra_powergate_power_up()
825 err = tegra210_clk_handle_mbist_war(pg->id); in tegra_powergate_power_up()
830 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
832 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
839 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_up()
843 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_up()
846 tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_up()
851 static int tegra_powergate_power_down(struct tegra_powergate *pg) in tegra_powergate_power_down() argument
855 err = tegra_powergate_prepare_clocks(pg); in tegra_powergate_power_down()
859 err = tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
865 err = reset_control_assert(pg->reset); in tegra_powergate_power_down()
871 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
875 err = tegra_powergate_set(pg->pmc, pg->id, false); in tegra_powergate_power_down()
879 err = tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
886 tegra_powergate_enable_clocks(pg); in tegra_powergate_power_down()
888 reset_control_deassert(pg->reset); in tegra_powergate_power_down()
892 tegra_powergate_disable_clocks(pg); in tegra_powergate_power_down()
895 tegra_powergate_unprepare_clocks(pg); in tegra_powergate_power_down()
902 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_on() local
903 struct device *dev = pg->pmc->dev; in tegra_genpd_power_on()
906 err = tegra_powergate_power_up(pg, true); in tegra_genpd_power_on()
909 pg->genpd.name, err); in tegra_genpd_power_on()
913 reset_control_release(pg->reset); in tegra_genpd_power_on()
921 struct tegra_powergate *pg = to_powergate(domain); in tegra_genpd_power_off() local
922 struct device *dev = pg->pmc->dev; in tegra_genpd_power_off()
925 err = reset_control_acquire(pg->reset); in tegra_genpd_power_off()
928 pg->genpd.name, err); in tegra_genpd_power_off()
932 err = tegra_powergate_power_down(pg); in tegra_genpd_power_off()
935 pg->genpd.name, err); in tegra_genpd_power_off()
936 reset_control_release(pg->reset); in tegra_genpd_power_off()
1005 struct tegra_powergate *pg; in tegra_powergate_sequence_power_up() local
1011 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_sequence_power_up()
1012 if (!pg) in tegra_powergate_sequence_power_up()
1015 pg->clk_rates = kzalloc(sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_sequence_power_up()
1016 if (!pg->clk_rates) { in tegra_powergate_sequence_power_up()
1017 kfree(pg->clks); in tegra_powergate_sequence_power_up()
1021 pg->id = id; in tegra_powergate_sequence_power_up()
1022 pg->clks = &clk; in tegra_powergate_sequence_power_up()
1023 pg->num_clks = 1; in tegra_powergate_sequence_power_up()
1024 pg->reset = rst; in tegra_powergate_sequence_power_up()
1025 pg->pmc = pmc; in tegra_powergate_sequence_power_up()
1027 err = tegra_powergate_power_up(pg, false); in tegra_powergate_sequence_power_up()
1032 kfree(pg->clk_rates); in tegra_powergate_sequence_power_up()
1033 kfree(pg); in tegra_powergate_sequence_power_up()
1191 static int tegra_powergate_of_get_clks(struct tegra_powergate *pg, in tegra_powergate_of_get_clks() argument
1202 pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL); in tegra_powergate_of_get_clks()
1203 if (!pg->clks) in tegra_powergate_of_get_clks()
1206 pg->clk_rates = kcalloc(count, sizeof(*pg->clk_rates), GFP_KERNEL); in tegra_powergate_of_get_clks()
1207 if (!pg->clk_rates) { in tegra_powergate_of_get_clks()
1208 kfree(pg->clks); in tegra_powergate_of_get_clks()
1213 pg->clks[i] = of_clk_get(np, i); in tegra_powergate_of_get_clks()
1214 if (IS_ERR(pg->clks[i])) { in tegra_powergate_of_get_clks()
1215 err = PTR_ERR(pg->clks[i]); in tegra_powergate_of_get_clks()
1220 pg->num_clks = count; in tegra_powergate_of_get_clks()
1226 clk_put(pg->clks[i]); in tegra_powergate_of_get_clks()
1228 kfree(pg->clk_rates); in tegra_powergate_of_get_clks()
1229 kfree(pg->clks); in tegra_powergate_of_get_clks()
1234 static int tegra_powergate_of_get_resets(struct tegra_powergate *pg, in tegra_powergate_of_get_resets() argument
1237 struct device *dev = pg->pmc->dev; in tegra_powergate_of_get_resets()
1240 pg->reset = of_reset_control_array_get_exclusive_released(np); in tegra_powergate_of_get_resets()
1241 if (IS_ERR(pg->reset)) { in tegra_powergate_of_get_resets()
1242 err = PTR_ERR(pg->reset); in tegra_powergate_of_get_resets()
1247 err = reset_control_acquire(pg->reset); in tegra_powergate_of_get_resets()
1250 reset_control_put(pg->reset); in tegra_powergate_of_get_resets()
1259 struct tegra_powergate *pg; in tegra_powergate_add() local
1263 pg = kzalloc(sizeof(*pg), GFP_KERNEL); in tegra_powergate_add()
1264 if (!pg) in tegra_powergate_add()
1280 pg->id = id; in tegra_powergate_add()
1281 pg->genpd.name = np->name; in tegra_powergate_add()
1282 pg->genpd.flags = GENPD_FLAG_NO_SYNC_STATE; in tegra_powergate_add()
1283 pg->genpd.power_off = tegra_genpd_power_off; in tegra_powergate_add()
1284 pg->genpd.power_on = tegra_genpd_power_on; in tegra_powergate_add()
1285 pg->pmc = pmc; in tegra_powergate_add()
1287 off = !tegra_powergate_is_powered(pmc, pg->id); in tegra_powergate_add()
1289 err = tegra_powergate_of_get_clks(pg, np); in tegra_powergate_add()
1295 err = tegra_powergate_of_get_resets(pg, np); in tegra_powergate_add()
1308 err = reset_control_assert(pg->reset); in tegra_powergate_add()
1314 err = tegra_powergate_power_down(pg); in tegra_powergate_add()
1317 pg->genpd.name, err); in tegra_powergate_add()
1327 WARN_ON(tegra_powergate_power_up(pg, true)); in tegra_powergate_add()
1331 err = pm_genpd_init(&pg->genpd, NULL, true); in tegra_powergate_add()
1338 err = of_genpd_add_provider_simple(np, &pg->genpd); in tegra_powergate_add()
1345 dev_dbg(dev, "added PM domain %s\n", pg->genpd.name); in tegra_powergate_add()
1350 pm_genpd_remove(&pg->genpd); in tegra_powergate_add()
1353 reset_control_put(pg->reset); in tegra_powergate_add()
1356 while (pg->num_clks--) in tegra_powergate_add()
1357 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_add()
1359 kfree(pg->clks); in tegra_powergate_add()
1365 kfree(pg); in tegra_powergate_add()
1492 struct tegra_powergate *pg = to_powergate(genpd); in tegra_powergate_remove() local
1494 reset_control_put(pg->reset); in tegra_powergate_remove()
1496 while (pg->num_clks--) in tegra_powergate_remove()
1497 clk_put(pg->clks[pg->num_clks]); in tegra_powergate_remove()
1499 kfree(pg->clks); in tegra_powergate_remove()
1501 set_bit(pg->id, pmc->powergates_available); in tegra_powergate_remove()
1503 kfree(pg); in tegra_powergate_remove()