diff mbox

[52/72] imx-drm: Reset ipu unit pointers to NULL on errors

Message ID 1414796095-10107-53-git-send-email-steve_longerbeam@mentor.com (mailing list archive)
State New, archived
Headers show

Commit Message

Steve Longerbeam Oct. 31, 2014, 10:54 p.m. UTC
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@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 mbox

Patch

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;
 		}