Lines Matching refs:pmc
127 struct tegra_pmc *pmc; member
162 void (*init)(struct tegra_pmc *pmc);
163 void (*setup_irq_polarity)(struct tegra_pmc *pmc,
221 static struct tegra_pmc *pmc = &(struct tegra_pmc) { variable
234 return readl(pmc->base + offset); in tegra_pmc_readl()
239 writel(value, pmc->base + offset); in tegra_pmc_writel()
244 if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps) in tegra_powergate_state()
252 return (pmc->soc && pmc->soc->powergates[id]); in tegra_powergate_is_valid()
257 return test_bit(id, pmc->powergates_available); in tegra_powergate_is_available()
260 static int tegra_powergate_lookup(struct tegra_pmc *pmc, const char *name) in tegra_powergate_lookup() argument
264 if (!pmc || !pmc->soc || !name) in tegra_powergate_lookup()
267 for (i = 0; i < pmc->soc->num_powergates; i++) { in tegra_powergate_lookup()
271 if (!strcmp(name, pmc->soc->powergates[i])) in tegra_powergate_lookup()
288 if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps) in tegra_powergate_set()
291 mutex_lock(&pmc->powergates_lock); in tegra_powergate_set()
294 mutex_unlock(&pmc->powergates_lock); in tegra_powergate_set()
303 mutex_unlock(&pmc->powergates_lock); in tegra_powergate_set()
312 mutex_lock(&pmc->powergates_lock); in __tegra_powergate_remove_clamping()
319 if (pmc->soc->has_gpu_clamps) { in __tegra_powergate_remove_clamping()
339 mutex_unlock(&pmc->powergates_lock); in __tegra_powergate_remove_clamping()
412 if (pg->pmc->soc->needs_mbist_war) in tegra_powergate_power_up()
532 mutex_lock(&pmc->powergates_lock); in tegra_powergate_is_powered()
534 mutex_unlock(&pmc->powergates_lock); in tegra_powergate_is_powered()
577 pg->pmc = pmc; in tegra_powergate_sequence_power_up()
599 if (pmc->soc && cpuid < pmc->soc->num_cpu_powergates) in tegra_get_cpu_powergate_id()
600 return pmc->soc->cpu_powergates[cpuid]; in tegra_get_cpu_powergate_id()
657 value = readl(pmc->scratch + pmc->soc->regs->scratch0); in tegra_pmc_restart_notify()
671 writel(value, pmc->scratch + pmc->soc->regs->scratch0); in tegra_pmc_restart_notify()
694 for (i = 0; i < pmc->soc->num_powergates; i++) { in powergate_show()
699 seq_printf(s, " %9s %7s\n", pmc->soc->powergates[i], in powergate_show()
720 pmc->debugfs = debugfs_create_file("powergate", S_IRUGO, NULL, NULL, in tegra_powergate_debugfs_init()
722 if (!pmc->debugfs) in tegra_powergate_debugfs_init()
787 static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np) in tegra_powergate_add() argument
797 id = tegra_powergate_lookup(pmc, np->name); in tegra_powergate_add()
807 clear_bit(id, pmc->powergates_available); in tegra_powergate_add()
813 pg->pmc = pmc; in tegra_powergate_add()
883 set_bit(id, pmc->powergates_available); in tegra_powergate_add()
889 static void tegra_powergate_init(struct tegra_pmc *pmc, in tegra_powergate_init() argument
896 for (i = 0; i < pmc->soc->num_powergates; i++) in tegra_powergate_init()
897 if (pmc->soc->powergates[i]) in tegra_powergate_init()
898 set_bit(i, pmc->powergates_available); in tegra_powergate_init()
905 tegra_powergate_add(pmc, child); in tegra_powergate_init()
911 tegra_io_pad_find(struct tegra_pmc *pmc, enum tegra_io_pad id) in tegra_io_pad_find() argument
915 for (i = 0; i < pmc->soc->num_io_pads; i++) in tegra_io_pad_find()
916 if (pmc->soc->io_pads[i].id == id) in tegra_io_pad_find()
917 return &pmc->soc->io_pads[i]; in tegra_io_pad_find()
928 pad = tegra_io_pad_find(pmc, id); in tegra_io_pad_prepare()
940 *status = pmc->soc->regs->dpd_status; in tegra_io_pad_prepare()
941 *request = pmc->soc->regs->dpd_req; in tegra_io_pad_prepare()
943 *status = pmc->soc->regs->dpd2_status; in tegra_io_pad_prepare()
944 *request = pmc->soc->regs->dpd2_req; in tegra_io_pad_prepare()
947 if (pmc->clk) { in tegra_io_pad_prepare()
948 rate = clk_get_rate(pmc->clk); in tegra_io_pad_prepare()
985 if (pmc->clk) in tegra_io_pad_unprepare()
1001 mutex_lock(&pmc->powergates_lock); in tegra_io_pad_power_enable()
1020 mutex_unlock(&pmc->powergates_lock); in tegra_io_pad_power_enable()
1037 mutex_lock(&pmc->powergates_lock); in tegra_io_pad_power_disable()
1056 mutex_unlock(&pmc->powergates_lock); in tegra_io_pad_power_disable()
1067 pad = tegra_io_pad_find(pmc, id); in tegra_io_pad_set_voltage()
1074 mutex_lock(&pmc->powergates_lock); in tegra_io_pad_set_voltage()
1091 mutex_unlock(&pmc->powergates_lock); in tegra_io_pad_set_voltage()
1104 pad = tegra_io_pad_find(pmc, id); in tegra_io_pad_get_voltage()
1147 return pmc->suspend_mode; in tegra_pmc_get_suspend_mode()
1155 pmc->suspend_mode = mode; in tegra_pmc_set_suspend_mode()
1169 rate = clk_get_rate(pmc->clk); in tegra_pmc_enter_suspend_mode()
1179 if (rate != pmc->rate) { in tegra_pmc_enter_suspend_mode()
1182 ticks = pmc->cpu_good_time * rate + USEC_PER_SEC - 1; in tegra_pmc_enter_suspend_mode()
1186 ticks = pmc->cpu_off_time * rate + USEC_PER_SEC - 1; in tegra_pmc_enter_suspend_mode()
1192 pmc->rate = rate; in tegra_pmc_enter_suspend_mode()
1202 static int tegra_pmc_parse_dt(struct tegra_pmc *pmc, struct device_node *np) in tegra_pmc_parse_dt() argument
1210 pmc->suspend_mode = TEGRA_SUSPEND_LP0; in tegra_pmc_parse_dt()
1214 pmc->suspend_mode = TEGRA_SUSPEND_LP1; in tegra_pmc_parse_dt()
1218 pmc->suspend_mode = TEGRA_SUSPEND_LP2; in tegra_pmc_parse_dt()
1222 pmc->suspend_mode = TEGRA_SUSPEND_NONE; in tegra_pmc_parse_dt()
1227 pmc->suspend_mode = tegra_pm_validate_suspend_mode(pmc->suspend_mode); in tegra_pmc_parse_dt()
1230 pmc->suspend_mode = TEGRA_SUSPEND_NONE; in tegra_pmc_parse_dt()
1232 pmc->cpu_good_time = value; in tegra_pmc_parse_dt()
1235 pmc->suspend_mode = TEGRA_SUSPEND_NONE; in tegra_pmc_parse_dt()
1237 pmc->cpu_off_time = value; in tegra_pmc_parse_dt()
1241 pmc->suspend_mode = TEGRA_SUSPEND_NONE; in tegra_pmc_parse_dt()
1243 pmc->core_osc_time = values[0]; in tegra_pmc_parse_dt()
1244 pmc->core_pmu_time = values[1]; in tegra_pmc_parse_dt()
1247 pmc->suspend_mode = TEGRA_SUSPEND_NONE; in tegra_pmc_parse_dt()
1249 pmc->core_off_time = value; in tegra_pmc_parse_dt()
1251 pmc->corereq_high = of_property_read_bool(np, in tegra_pmc_parse_dt()
1254 pmc->sysclkreq_high = of_property_read_bool(np, in tegra_pmc_parse_dt()
1257 pmc->combined_req = of_property_read_bool(np, in tegra_pmc_parse_dt()
1260 pmc->cpu_pwr_good_en = of_property_read_bool(np, in tegra_pmc_parse_dt()
1265 if (pmc->suspend_mode == TEGRA_SUSPEND_LP0) in tegra_pmc_parse_dt()
1266 pmc->suspend_mode = TEGRA_SUSPEND_LP1; in tegra_pmc_parse_dt()
1268 pmc->lp0_vec_phys = values[0]; in tegra_pmc_parse_dt()
1269 pmc->lp0_vec_size = values[1]; in tegra_pmc_parse_dt()
1274 static void tegra_pmc_init(struct tegra_pmc *pmc) in tegra_pmc_init() argument
1276 if (pmc->soc->init) in tegra_pmc_init()
1277 pmc->soc->init(pmc); in tegra_pmc_init()
1280 static void tegra_pmc_init_tsense_reset(struct tegra_pmc *pmc) in tegra_pmc_init_tsense_reset() argument
1284 struct device *dev = pmc->dev; in tegra_pmc_init_tsense_reset()
1288 if (!pmc->soc->has_tsense_reset) in tegra_pmc_init_tsense_reset()
1291 np = of_find_node_by_name(pmc->dev->of_node, "i2c-thermtrip"); in tegra_pmc_init_tsense_reset()
1350 dev_info(pmc->dev, "emergency thermal reset enabled\n"); in tegra_pmc_init_tsense_reset()
1367 if (WARN_ON(!pmc->base || !pmc->soc)) in tegra_pmc_probe()
1370 err = tegra_pmc_parse_dt(pmc, pdev->dev.of_node); in tegra_pmc_probe()
1382 pmc->wake = devm_ioremap_resource(&pdev->dev, res); in tegra_pmc_probe()
1383 if (IS_ERR(pmc->wake)) in tegra_pmc_probe()
1384 return PTR_ERR(pmc->wake); in tegra_pmc_probe()
1386 pmc->wake = base; in tegra_pmc_probe()
1391 pmc->aotag = devm_ioremap_resource(&pdev->dev, res); in tegra_pmc_probe()
1392 if (IS_ERR(pmc->aotag)) in tegra_pmc_probe()
1393 return PTR_ERR(pmc->aotag); in tegra_pmc_probe()
1395 pmc->aotag = base; in tegra_pmc_probe()
1400 pmc->scratch = devm_ioremap_resource(&pdev->dev, res); in tegra_pmc_probe()
1401 if (IS_ERR(pmc->scratch)) in tegra_pmc_probe()
1402 return PTR_ERR(pmc->scratch); in tegra_pmc_probe()
1404 pmc->scratch = base; in tegra_pmc_probe()
1407 pmc->clk = devm_clk_get(&pdev->dev, "pclk"); in tegra_pmc_probe()
1408 if (IS_ERR(pmc->clk)) { in tegra_pmc_probe()
1409 err = PTR_ERR(pmc->clk); in tegra_pmc_probe()
1416 pmc->clk = NULL; in tegra_pmc_probe()
1419 pmc->dev = &pdev->dev; in tegra_pmc_probe()
1421 tegra_pmc_init(pmc); in tegra_pmc_probe()
1423 tegra_pmc_init_tsense_reset(pmc); in tegra_pmc_probe()
1433 debugfs_remove(pmc->debugfs); in tegra_pmc_probe()
1439 mutex_lock(&pmc->powergates_lock); in tegra_pmc_probe()
1440 iounmap(pmc->base); in tegra_pmc_probe()
1441 pmc->base = base; in tegra_pmc_probe()
1442 mutex_unlock(&pmc->powergates_lock); in tegra_pmc_probe()
1484 static void tegra20_pmc_init(struct tegra_pmc *pmc) in tegra20_pmc_init() argument
1495 if (pmc->sysclkreq_high) in tegra20_pmc_init()
1509 static void tegra20_pmc_setup_irq_polarity(struct tegra_pmc *pmc, in tegra20_pmc_setup_irq_polarity() argument
1837 static void tegra186_pmc_setup_irq_polarity(struct tegra_pmc *pmc, in tegra186_pmc_setup_irq_polarity() argument
1922 mutex_init(&pmc->powergates_lock); in tegra_pmc_early_init()
1963 pmc->base = ioremap_nocache(regs.start, resource_size(®s)); in tegra_pmc_early_init()
1964 if (!pmc->base) { in tegra_pmc_early_init()
1971 pmc->soc = match->data; in tegra_pmc_early_init()
1973 tegra_powergate_init(pmc, np); in tegra_pmc_early_init()
1981 pmc->soc->setup_irq_polarity(pmc, np, invert); in tegra_pmc_early_init()