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:
Dave Airlie 2020-12-03 11:34:06 +10:00
commit aac06646aa
3 changed files with 36 additions and 43 deletions

View File

@ -90,7 +90,7 @@ static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
if (!fpriv) if (!fpriv)
return -ENOMEM; return -ENOMEM;
idr_init(&fpriv->contexts); idr_init_base(&fpriv->contexts, 1);
mutex_init(&fpriv->lock); mutex_init(&fpriv->lock);
filp->driver_priv = fpriv; filp->driver_priv = fpriv;

View File

@ -129,7 +129,6 @@ int tegra_output_probe(struct tegra_output *output)
if (!output->ddc) { if (!output->ddc) {
err = -EPROBE_DEFER; err = -EPROBE_DEFER;
of_node_put(ddc);
return err; return err;
} }
} }

View File

@ -397,7 +397,6 @@ struct tegra_sor;
struct tegra_sor_ops { struct tegra_sor_ops {
const char *name; const char *name;
int (*probe)(struct tegra_sor *sor); int (*probe)(struct tegra_sor *sor);
int (*remove)(struct tegra_sor *sor);
void (*audio_enable)(struct tegra_sor *sor); void (*audio_enable)(struct tegra_sor *sor);
void (*audio_disable)(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, .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) static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
{ {
int err; int err;
@ -2953,7 +2970,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
return PTR_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) { if (err < 0) {
dev_err(sor->dev, "failed to enable AVDD I/O supply: %d\n", dev_err(sor->dev, "failed to enable AVDD I/O supply: %d\n",
err); err);
@ -2967,7 +2984,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
return PTR_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) { if (err < 0) {
dev_err(sor->dev, "failed to enable VDD PLL supply: %d\n", dev_err(sor->dev, "failed to enable VDD PLL supply: %d\n",
err); err);
@ -2981,7 +2998,7 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
return PTR_ERR(sor->hdmi_supply); return PTR_ERR(sor->hdmi_supply);
} }
err = regulator_enable(sor->hdmi_supply); err = tegra_sor_enable_regulator(sor, sor->hdmi_supply);
if (err < 0) { if (err < 0) {
dev_err(sor->dev, "failed to enable HDMI supply: %d\n", err); dev_err(sor->dev, "failed to enable HDMI supply: %d\n", err);
return err; return err;
@ -2992,19 +3009,9 @@ static int tegra_sor_hdmi_probe(struct tegra_sor *sor)
return 0; 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 = { static const struct tegra_sor_ops tegra_sor_hdmi_ops = {
.name = "HDMI", .name = "HDMI",
.probe = tegra_sor_hdmi_probe, .probe = tegra_sor_hdmi_probe,
.remove = tegra_sor_hdmi_remove,
.audio_enable = tegra_sor_hdmi_audio_enable, .audio_enable = tegra_sor_hdmi_audio_enable,
.audio_disable = tegra_sor_hdmi_audio_disable, .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)) if (IS_ERR(sor->avdd_io_supply))
return PTR_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) if (err < 0)
return err; return err;
@ -3025,25 +3032,16 @@ static int tegra_sor_dp_probe(struct tegra_sor *sor)
if (IS_ERR(sor->vdd_pll_supply)) if (IS_ERR(sor->vdd_pll_supply))
return PTR_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) if (err < 0)
return err; return err;
return 0; 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 = { static const struct tegra_sor_ops tegra_sor_dp_ops = {
.name = "DP", .name = "DP",
.probe = tegra_sor_dp_probe, .probe = tegra_sor_dp_probe,
.remove = tegra_sor_dp_remove,
}; };
static int tegra_sor_init(struct host1x_client *client) 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) { if (err < 0) {
dev_err(sor->dev, "failed to deassert SOR reset: %d\n", dev_err(sor->dev, "failed to deassert SOR reset: %d\n",
err); err);
clk_disable_unprepare(sor->clk);
return err; return err;
} }
@ -3152,12 +3151,17 @@ static int tegra_sor_init(struct host1x_client *client)
} }
err = clk_prepare_enable(sor->clk_safe); err = clk_prepare_enable(sor->clk_safe);
if (err < 0) if (err < 0) {
clk_disable_unprepare(sor->clk);
return err; return err;
}
err = clk_prepare_enable(sor->clk_dp); 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 err;
}
return 0; return 0;
} }
@ -3764,17 +3768,16 @@ static int tegra_sor_probe(struct platform_device *pdev)
return err; return err;
err = tegra_output_probe(&sor->output); err = tegra_output_probe(&sor->output);
if (err < 0) { if (err < 0)
dev_err(&pdev->dev, "failed to probe output: %d\n", err); return dev_err_probe(&pdev->dev, err,
return err; "failed to probe output\n");
}
if (sor->ops && sor->ops->probe) { if (sor->ops && sor->ops->probe) {
err = sor->ops->probe(sor); err = sor->ops->probe(sor);
if (err < 0) { if (err < 0) {
dev_err(&pdev->dev, "failed to probe %s: %d\n", dev_err(&pdev->dev, "failed to probe %s: %d\n",
sor->ops->name, err); sor->ops->name, err);
goto output; goto remove;
} }
} }
@ -3955,9 +3958,6 @@ unregister:
rpm_disable: rpm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
remove: remove:
if (sor->ops && sor->ops->remove)
sor->ops->remove(sor);
output:
tegra_output_remove(&sor->output); tegra_output_remove(&sor->output);
return err; return err;
} }
@ -3976,12 +3976,6 @@ static int tegra_sor_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev); 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); tegra_output_remove(&sor->output);
return 0; return 0;