drm/tegra: dpaux: Fix crash if VDD supply is absent
authorThierry Reding <treding@nvidia.com>
Mon, 24 Jun 2019 11:30:24 +0000 (13:30 +0200)
committerThierry Reding <treding@nvidia.com>
Mon, 28 Oct 2019 10:18:43 +0000 (11:18 +0100)
In order to properly make the VDD supply optional, all accesses to the
regulator need to be ignored, because the regulator core doesn't treat
NULL special.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/dpaux.c

index 819fdd9b4413b175ccfd493e6b13d48bfff652f9..1b3acb5852a0d369a4e99acc5b95b122a166851c 100644 (file)
@@ -505,6 +505,8 @@ static int tegra_dpaux_probe(struct platform_device *pdev)
 
                        return PTR_ERR(dpaux->vdd);
                }
+
+               dpaux->vdd = NULL;
        }
 
        platform_set_drvdata(pdev, dpaux);
@@ -698,13 +700,15 @@ int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output)
        output->connector.polled = DRM_CONNECTOR_POLL_HPD;
        dpaux->output = output;
 
-       err = regulator_enable(dpaux->vdd);
-       if (err < 0)
-               return err;
-
        if (output->panel) {
                enum drm_connector_status status;
 
+               if (dpaux->vdd) {
+                       err = regulator_enable(dpaux->vdd);
+                       if (err < 0)
+                               return err;
+               }
+
                timeout = jiffies + msecs_to_jiffies(250);
 
                while (time_before(jiffies, timeout)) {
@@ -732,13 +736,15 @@ int drm_dp_aux_detach(struct drm_dp_aux *aux)
 
        disable_irq(dpaux->irq);
 
-       err = regulator_disable(dpaux->vdd);
-       if (err < 0)
-               return err;
-
        if (dpaux->output->panel) {
                enum drm_connector_status status;
 
+               if (dpaux->vdd) {
+                       err = regulator_disable(dpaux->vdd);
+                       if (err < 0)
+                               return err;
+               }
+
                timeout = jiffies + msecs_to_jiffies(250);
 
                while (time_before(jiffies, timeout)) {