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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 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

_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel





[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux