In the crtc and plane drivers it is possible the ipu unit pointers
could be left at error pointer values. Reset them to NULL on errors
to prevent this. Also ipu_put_resources() should reset the units to
NULL after releasing them.

Signed-off-by: Steve Longerbeam <steve_longerbeam at mentor.com>
---
 drivers/staging/imx-drm/ipuv3-crtc.c  |   11 +++++++++--
 drivers/staging/imx-drm/ipuv3-plane.c |   15 ++++++++++++---
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c 
b/drivers/staging/imx-drm/ipuv3-crtc.c
index 423b004..3040f8e 100644
--- a/drivers/staging/imx-drm/ipuv3-crtc.c
+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
@@ -375,13 +375,18 @@ dev_put:

 static void ipu_put_resources(struct ipu_crtc *ipu_crtc)
 {
-       if (!IS_ERR_OR_NULL(ipu_crtc->dc))
+       if (!IS_ERR_OR_NULL(ipu_crtc->dc)) {
                ipu_dc_put(ipu_crtc->dc);
-       if (!IS_ERR_OR_NULL(ipu_crtc->di))
+               ipu_crtc->dc = NULL;
+       }
+       if (!IS_ERR_OR_NULL(ipu_crtc->di)) {
                ipu_di_put(ipu_crtc->di);
+               ipu_crtc->di = NULL;
+       }
        if (!IS_ERR_OR_NULL(ipu_crtc->ipu_dev)) {
                module_put(ipu_crtc->ipu_dev->driver->owner);
                put_device(ipu_crtc->ipu_dev);
+               ipu_crtc->ipu_dev = NULL;
        }
 }

@@ -411,6 +416,7 @@ static int ipu_get_resources(struct ipu_crtc *ipu_crtc,
        ipu_crtc->di = ipu_di_get(ipu_crtc->ipu, di);
        if (IS_ERR(ipu_crtc->di)) {
                ret = PTR_ERR(ipu_crtc->di);
+               ipu_crtc->di = NULL;
                goto err_out;
        }

@@ -425,6 +431,7 @@ static int ipu_get_resources(struct ipu_crtc *ipu_crtc,
        ipu_crtc->dc = ipu_dc_get(ipu_crtc->ipu, ipu_crtc->ch->dc);
        if (IS_ERR(ipu_crtc->dc)) {
                ret = PTR_ERR(ipu_crtc->dc);
+               ipu_crtc->dc = NULL;
                goto err_out;
        }

diff --git a/drivers/staging/imx-drm/ipuv3-plane.c 
b/drivers/staging/imx-drm/ipuv3-plane.c
index 76ac178..3a1ebfe 100644
--- a/drivers/staging/imx-drm/ipuv3-plane.c
+++ b/drivers/staging/imx-drm/ipuv3-plane.c
@@ -285,12 +285,18 @@ void ipu_plane_put_resources(struct ipu_plane *ipu_plane)
                              ipu_plane->irq, ipu_plane);
                ipu_plane->irq = 0;
        }
-       if (!IS_ERR_OR_NULL(ipu_plane->dp))
+       if (!IS_ERR_OR_NULL(ipu_plane->dp)) {
                ipu_dp_put(ipu_plane->dp);
-       if (!IS_ERR_OR_NULL(ipu_plane->dmfc))
+               ipu_plane->dp = NULL;
+       }
+       if (!IS_ERR_OR_NULL(ipu_plane->dmfc)) {
                ipu_dmfc_put(ipu_plane->dmfc);
-       if (!IS_ERR_OR_NULL(ipu_plane->ipu_ch))
+               ipu_plane->dmfc = NULL;
+       }
+       if (!IS_ERR_OR_NULL(ipu_plane->ipu_ch)) {
                ipu_idmac_put(ipu_plane->ipu_ch);
+               ipu_plane->ipu_ch = NULL;
+       }
 }

 int ipu_plane_get_resources(struct ipu_plane *ipu_plane)
@@ -300,6 +306,7 @@ int ipu_plane_get_resources(struct ipu_plane *ipu_plane)
        ipu_plane->ipu_ch = ipu_idmac_get(ipu_plane->ipu, ipu_plane->dma);
        if (IS_ERR(ipu_plane->ipu_ch)) {
                ret = PTR_ERR(ipu_plane->ipu_ch);
+               ipu_plane->ipu_ch = NULL;
                DRM_ERROR("failed to get idmac channel: %d\n", ret);
                return ret;
        }
@@ -307,6 +314,7 @@ int ipu_plane_get_resources(struct ipu_plane *ipu_plane)
        ipu_plane->dmfc = ipu_dmfc_get(ipu_plane->ipu, ipu_plane->dma);
        if (IS_ERR(ipu_plane->dmfc)) {
                ret = PTR_ERR(ipu_plane->dmfc);
+               ipu_plane->dmfc = NULL;
                DRM_ERROR("failed to get dmfc: ret %d\n", ret);
                goto err_out;
        }
@@ -315,6 +323,7 @@ int ipu_plane_get_resources(struct ipu_plane *ipu_plane)
                ipu_plane->dp = ipu_dp_get(ipu_plane->ipu, ipu_plane->dp_flow);
                if (IS_ERR(ipu_plane->dp)) {
                        ret = PTR_ERR(ipu_plane->dp);
+                       ipu_plane->dp = NULL;
                        DRM_ERROR("failed to get dp flow: %d\n", ret);
                        goto err_out;
                }
-- 
1.7.9.5

Reply via email to