drm/tegra: Fixes for v5.10-rc7
This is a set of small fixes for various issues found during the last couple of weeks. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEiOrDCAFJzPfAjcif3SOs138+s6EFAl/BEZ4THHRyZWRpbmdA bnZpZGlhLmNvbQAKCRDdI6zXfz6zoaXQD/4+tXtppx4JhyP7hC3ATN6z2bEqflpl +rpvj/a5p5RmY0kIjaNiZt6JrLREPn7hAXvLKqqOX21EZMPSr3zxmuZGlXLr8w+H J2jUii5Pwkh/HNjwy5BHsfjqpp7v++VZLpHSTeeNqoxdkOfeM3w0bbXAfxS11R4v Iu9s7MKv67Zs+IPj2m/BGMU0+ah8jWNfeo5GH1zEoo9xEhMP1RAM4SCkB/2UAk8Z eHVS7/6+4wVktqum/u8EPYQJOujOB/sdmAjTggIzGkkZSEuRSuuzCkJpWxyRDdeZ hJCmRP0NWc3cvy2kP/IjrRdFghtvffSsxRGte0QXoLTfEodOsNqpT6Som9by+cEj YlqAyfugEgx0b8rGEqyInq4E5ahXHPn9sdlg1OWDluhk0Xj0BwLhebkuc/EwXRkw Kkf0CrSxbSAB2WBSwYJ00tqjNhd61fwwLYbv0KFfk5GwPbFvsl9ZfLGzBn2LGRXt t/N/6joD48d29mJWMdHZSDuzYKytZl96TY1Ie9ePPItfwh+3cGwhG28M0qh1ssRm NsCP+xQgf5D+gtxAK8iaXpcMbpXrBdXsNoPLn98wmARkVGMy309VQaqcIKRctJ1G GXDY9ZutxMAOZ5itlpwOHQJdh/jqA43Tmajuwol1Mxy7yn7/p0FCPGiUw1Dr2F+k k8Uw3VHW+clpkw== =NEOg -----END PGP SIGNATURE----- Merge tag 'drm/tegra/for-5.10-rc7' of ssh://git.freedesktop.org/git/tegra/linux into drm-fixes drm/tegra: Fixes for v5.10-rc7 This is a set of small fixes for various issues found during the last couple of weeks. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thierry Reding <thierry.reding@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20201127145324.125776-1-thierry.reding@gmail.com
This commit is contained in:
commit
aac06646aa
@ -90,7 +90,7 @@ static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
|
||||
if (!fpriv)
|
||||
return -ENOMEM;
|
||||
|
||||
idr_init(&fpriv->contexts);
|
||||
idr_init_base(&fpriv->contexts, 1);
|
||||
mutex_init(&fpriv->lock);
|
||||
filp->driver_priv = fpriv;
|
||||
|
||||
|
@ -129,7 +129,6 @@ int tegra_output_probe(struct tegra_output *output)
|
||||
|
||||
if (!output->ddc) {
|
||||
err = -EPROBE_DEFER;
|
||||
of_node_put(ddc);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
@ -397,7 +397,6 @@ struct tegra_sor;
|
||||
struct tegra_sor_ops {
|
||||
const char *name;
|
||||
int (*probe)(struct tegra_sor *sor);
|
||||
int (*remove)(struct tegra_sor *sor);
|
||||
void (*audio_enable)(struct tegra_sor *sor);
|
||||
void (*audio_disable)(struct tegra_sor *sor);
|
||||
};
|
||||
@ -2942,6 +2941,24 @@ static const struct drm_encoder_helper_funcs tegra_sor_dp_helpers = {
|
||||
.atomic_check = tegra_sor_encoder_atomic_check,
|
||||
};
|
||||
|
||||
static void tegra_sor_disable_regulator(void *data)
|
||||
{
|
||||
struct regulator *reg = data;
|
||||
|
||||
regulator_disable(reg);
|
||||
}
|
||||
|
||||
static int tegra_sor_enable_regulator(struct tegra_sor *sor, struct regulator *reg)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = regulator_enable(reg);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return devm_add_action_or_reset(sor->dev, tegra_sor_disable_regulator, reg);
|
||||
}
|
||||
|
||||
static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
|
||||
{
|
||||
int err;
|
||||
@ -2953,7 +2970,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
|
||||
return PTR_ERR(sor->avdd_io_supply);
|
||||
}
|
||||
|
||||
err = regulator_enable(sor->avdd_io_supply);
|
||||
err = tegra_sor_enable_regulator(sor, sor->avdd_io_supply);
|
||||
if (err < 0) {
|
||||
dev_err(sor->dev, "failed to enable AVDD I/O supply: %d\n",
|
||||
err);
|
||||
@ -2967,7 +2984,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
|
||||
return PTR_ERR(sor->vdd_pll_supply);
|
||||
}
|
||||
|
||||
err = regulator_enable(sor->vdd_pll_supply);
|
||||
err = tegra_sor_enable_regulator(sor, sor->vdd_pll_supply);
|
||||
if (err < 0) {
|
||||
dev_err(sor->dev, "failed to enable VDD PLL supply: %d\n",
|
||||
err);
|
||||
@ -2981,7 +2998,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
|
||||
return PTR_ERR(sor->hdmi_supply);
|
||||
}
|
||||
|
||||
err = regulator_enable(sor->hdmi_supply);
|
||||
err = tegra_sor_enable_regulator(sor, sor->hdmi_supply);
|
||||
if (err < 0) {
|
||||
dev_err(sor->dev, "failed to enable HDMI supply: %d\n", err);
|
||||
return err;
|
||||
@ -2992,19 +3009,9 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_sor_hdmi_remove(struct tegra_sor *sor)
|
||||
{
|
||||
regulator_disable(sor->hdmi_supply);
|
||||
regulator_disable(sor->vdd_pll_supply);
|
||||
regulator_disable(sor->avdd_io_supply);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct tegra_sor_ops tegra_sor_hdmi_ops = {
|
||||
.name = "HDMI",
|
||||
.probe = tegra_sor_hdmi_probe,
|
||||
.remove = tegra_sor_hdmi_remove,
|
||||
.audio_enable = tegra_sor_hdmi_audio_enable,
|
||||
.audio_disable = tegra_sor_hdmi_audio_disable,
|
||||
};
|
||||
@ -3017,7 +3024,7 @@ static int tegra_sor_dp_probe(struct tegra_sor *sor)
|
||||
if (IS_ERR(sor->avdd_io_supply))
|
||||
return PTR_ERR(sor->avdd_io_supply);
|
||||
|
||||
err = regulator_enable(sor->avdd_io_supply);
|
||||
err = tegra_sor_enable_regulator(sor, sor->avdd_io_supply);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@ -3025,25 +3032,16 @@ static int tegra_sor_dp_probe(struct tegra_sor *sor)
|
||||
if (IS_ERR(sor->vdd_pll_supply))
|
||||
return PTR_ERR(sor->vdd_pll_supply);
|
||||
|
||||
err = regulator_enable(sor->vdd_pll_supply);
|
||||
err = tegra_sor_enable_regulator(sor, sor->vdd_pll_supply);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_sor_dp_remove(struct tegra_sor *sor)
|
||||
{
|
||||
regulator_disable(sor->vdd_pll_supply);
|
||||
regulator_disable(sor->avdd_io_supply);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct tegra_sor_ops tegra_sor_dp_ops = {
|
||||
.name = "DP",
|
||||
.probe = tegra_sor_dp_probe,
|
||||
.remove = tegra_sor_dp_remove,
|
||||
};
|
||||
|
||||
static int tegra_sor_init(struct host1x_client *client)
|
||||
@ -3145,6 +3143,7 @@ static int tegra_sor_init(struct host1x_client *client)
|
||||
if (err < 0) {
|
||||
dev_err(sor->dev, "failed to deassert SOR reset: %d\n",
|
||||
err);
|
||||
clk_disable_unprepare(sor->clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -3152,12 +3151,17 @@ static int tegra_sor_init(struct host1x_client *client)
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(sor->clk_safe);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
clk_disable_unprepare(sor->clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(sor->clk_dp);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
clk_disable_unprepare(sor->clk_safe);
|
||||
clk_disable_unprepare(sor->clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3764,17 +3768,16 @@ static int tegra_sor_probe(struct platform_device *pdev)
|
||||
return err;
|
||||
|
||||
err = tegra_output_probe(&sor->output);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "failed to probe output: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
if (err < 0)
|
||||
return dev_err_probe(&pdev->dev, err,
|
||||
"failed to probe output\n");
|
||||
|
||||
if (sor->ops && sor->ops->probe) {
|
||||
err = sor->ops->probe(sor);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "failed to probe %s: %d\n",
|
||||
sor->ops->name, err);
|
||||
goto output;
|
||||
goto remove;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3955,9 +3958,6 @@ unregister:
|
||||
rpm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
remove:
|
||||
if (sor->ops && sor->ops->remove)
|
||||
sor->ops->remove(sor);
|
||||
output:
|
||||
tegra_output_remove(&sor->output);
|
||||
return err;
|
||||
}
|
||||
@ -3976,12 +3976,6 @@ static int tegra_sor_remove(struct platform_device *pdev)
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
if (sor->ops && sor->ops->remove) {
|
||||
err = sor->ops->remove(sor);
|
||||
if (err < 0)
|
||||
dev_err(&pdev->dev, "failed to remove SOR: %d\n", err);
|
||||
}
|
||||
|
||||
tegra_output_remove(&sor->output);
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user