mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
drm/tegra: Explicitly specify PMC instance to use
Currently the kernel relies on a global variable to reference the PMC context. Use an explicit lookup for the PMC and pass that to the public PMC APIs. Acked-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
parent
3ef27f1ad5
commit
e68c424413
|
|
@ -2780,7 +2780,7 @@ static int tegra_dc_runtime_suspend(struct host1x_client *client)
|
|||
}
|
||||
|
||||
if (dc->soc->has_powergate)
|
||||
tegra_powergate_power_off(dc->powergate);
|
||||
tegra_pmc_powergate_power_off(dc->pmc, dc->powergate);
|
||||
|
||||
clk_disable_unprepare(dc->clk);
|
||||
pm_runtime_put_sync(dev);
|
||||
|
|
@ -2801,8 +2801,9 @@ static int tegra_dc_runtime_resume(struct host1x_client *client)
|
|||
}
|
||||
|
||||
if (dc->soc->has_powergate) {
|
||||
err = tegra_powergate_sequence_power_up(dc->powergate, dc->clk,
|
||||
dc->rst);
|
||||
err = tegra_pmc_powergate_sequence_power_up(dc->pmc,
|
||||
dc->powergate,
|
||||
dc->clk, dc->rst);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "failed to power partition: %d\n", err);
|
||||
goto put_rpm;
|
||||
|
|
@ -3231,12 +3232,17 @@ static int tegra_dc_probe(struct platform_device *pdev)
|
|||
clk_disable_unprepare(dc->clk);
|
||||
|
||||
if (dc->soc->has_powergate) {
|
||||
dc->pmc = devm_tegra_pmc_get(dc->dev);
|
||||
if (IS_ERR(dc->pmc))
|
||||
return dev_err_probe(dc->dev, PTR_ERR(dc->pmc),
|
||||
"failed to get PMC\n");
|
||||
|
||||
if (dc->pipe == 0)
|
||||
dc->powergate = TEGRA_POWERGATE_DIS;
|
||||
else
|
||||
dc->powergate = TEGRA_POWERGATE_DISB;
|
||||
|
||||
tegra_powergate_power_off(dc->powergate);
|
||||
tegra_pmc_powergate_power_off(dc->pmc, dc->powergate);
|
||||
}
|
||||
|
||||
err = tegra_dc_init_opp_table(dc);
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ struct tegra_dc {
|
|||
int irq;
|
||||
|
||||
struct tegra_output *rgb;
|
||||
struct tegra_pmc *pmc;
|
||||
|
||||
struct tegra_dc_stats stats;
|
||||
struct list_head list;
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ struct gr3d {
|
|||
unsigned int nclocks;
|
||||
struct reset_control_bulk_data resets[RST_GR3D_MAX];
|
||||
unsigned int nresets;
|
||||
struct tegra_pmc *pmc;
|
||||
struct dev_pm_domain_list *pd_list;
|
||||
|
||||
DECLARE_BITMAP(addr_regs, GR3D_NUM_REGS);
|
||||
|
|
@ -353,7 +354,8 @@ static int gr3d_power_up_legacy_domain(struct device *dev, const char *name,
|
|||
if (err) {
|
||||
dev_err(dev, "failed to acquire %s reset: %d\n", name, err);
|
||||
} else {
|
||||
err = tegra_powergate_sequence_power_up(id, clk, reset);
|
||||
err = tegra_pmc_powergate_sequence_power_up(gr3d->pmc, id,
|
||||
clk, reset);
|
||||
reset_control_release(reset);
|
||||
}
|
||||
|
||||
|
|
@ -385,6 +387,11 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d)
|
|||
if (err != -ENOENT)
|
||||
return err;
|
||||
|
||||
gr3d->pmc = devm_tegra_pmc_get(dev);
|
||||
if (IS_ERR(gr3d->pmc))
|
||||
return dev_err_probe(dev, PTR_ERR(gr3d->pmc),
|
||||
"failed to get PMC\n");
|
||||
|
||||
/*
|
||||
* Older device-trees don't use GENPD. In this case we should
|
||||
* toggle power domain manually.
|
||||
|
|
|
|||
|
|
@ -422,6 +422,8 @@ struct tegra_sor {
|
|||
struct clk *clk_dp;
|
||||
struct clk *clk;
|
||||
|
||||
struct tegra_pmc *pmc;
|
||||
|
||||
u8 xbar_cfg[5];
|
||||
|
||||
struct drm_dp_link link;
|
||||
|
|
@ -2237,7 +2239,7 @@ static void tegra_sor_hdmi_disable(struct drm_encoder *encoder)
|
|||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to power down SOR: %d\n", err);
|
||||
|
||||
err = tegra_io_pad_power_disable(sor->pad);
|
||||
err = tegra_pmc_io_pad_power_disable(sor->pmc, sor->pad);
|
||||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to power off I/O pad: %d\n", err);
|
||||
|
||||
|
|
@ -2277,7 +2279,7 @@ static void tegra_sor_hdmi_enable(struct drm_encoder *encoder)
|
|||
|
||||
div = clk_get_rate(sor->clk) / 1000000 * 4;
|
||||
|
||||
err = tegra_io_pad_power_enable(sor->pad);
|
||||
err = tegra_pmc_io_pad_power_enable(sor->pmc, sor->pad);
|
||||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to power on I/O pad: %d\n", err);
|
||||
|
||||
|
|
@ -2701,7 +2703,7 @@ static void tegra_sor_dp_disable(struct drm_encoder *encoder)
|
|||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to power down SOR: %d\n", err);
|
||||
|
||||
err = tegra_io_pad_power_disable(sor->pad);
|
||||
err = tegra_pmc_io_pad_power_disable(sor->pmc, sor->pad);
|
||||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to power off I/O pad: %d\n", err);
|
||||
|
||||
|
|
@ -2743,7 +2745,7 @@ static void tegra_sor_dp_enable(struct drm_encoder *encoder)
|
|||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to set safe parent clock: %d\n", err);
|
||||
|
||||
err = tegra_io_pad_power_enable(sor->pad);
|
||||
err = tegra_pmc_io_pad_power_enable(sor->pmc, sor->pad);
|
||||
if (err < 0)
|
||||
dev_err(sor->dev, "failed to power on LVDS rail: %d\n", err);
|
||||
|
||||
|
|
@ -3730,6 +3732,12 @@ static int tegra_sor_probe(struct platform_device *pdev)
|
|||
|
||||
sor->num_settings = sor->soc->num_settings;
|
||||
|
||||
sor->pmc = devm_tegra_pmc_get(&pdev->dev);
|
||||
if (IS_ERR(sor->pmc)) {
|
||||
err = PTR_ERR(sor->pmc);
|
||||
goto put_aux;
|
||||
}
|
||||
|
||||
np = of_parse_phandle(pdev->dev.of_node, "nvidia,dpaux", 0);
|
||||
if (np) {
|
||||
sor->aux = drm_dp_aux_find_by_of_node(np);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user