Use drmm_kzalloc() to align plane memory lifetime with the drm device,
and use drmm_add_action_or_reset() to make sure drm_plane_cleanup() is
called before the memory is freed. Also handle error return values of
the plane property creation functions.

Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
Acked-by: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 drivers/gpu/drm/imx/ipuv3-plane.c | 34 +++++++++++++++++--------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c 
b/drivers/gpu/drm/imx/ipuv3-plane.c
index 8a4235d9d9f1..d3e6c37bf0fb 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -11,6 +11,7 @@
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_managed.h>
 #include <drm/drm_plane_helper.h>
 
 #include <video/imx-ipu-v3.h>
@@ -262,16 +263,6 @@ void ipu_plane_disable_deferred(struct drm_plane *plane)
 }
 EXPORT_SYMBOL_GPL(ipu_plane_disable_deferred);
 
-static void ipu_plane_destroy(struct drm_plane *plane)
-{
-       struct ipu_plane *ipu_plane = to_ipu_plane(plane);
-
-       DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
-
-       drm_plane_cleanup(plane);
-       kfree(ipu_plane);
-}
-
 static void ipu_plane_state_reset(struct drm_plane *plane)
 {
        unsigned int zpos = (plane->type == DRM_PLANE_TYPE_PRIMARY) ? 0 : 1;
@@ -336,7 +327,6 @@ static bool ipu_plane_format_mod_supported(struct drm_plane 
*plane,
 static const struct drm_plane_funcs ipu_plane_funcs = {
        .update_plane   = drm_atomic_helper_update_plane,
        .disable_plane  = drm_atomic_helper_disable_plane,
-       .destroy        = ipu_plane_destroy,
        .reset          = ipu_plane_state_reset,
        .atomic_duplicate_state = ipu_plane_duplicate_state,
        .atomic_destroy_state   = ipu_plane_destroy_state,
@@ -822,6 +812,13 @@ int ipu_planes_assign_pre(struct drm_device *dev,
 }
 EXPORT_SYMBOL_GPL(ipu_planes_assign_pre);
 
+static void ipu_plane_cleanup(struct drm_device *dev, void *data)
+{
+       struct ipu_plane *ipu_plane = data;
+
+       drm_plane_cleanup(&ipu_plane->base);
+}
+
 struct ipu_plane *ipu_plane_init(struct drm_device *dev, struct ipu_soc *ipu,
                                 int dma, int dp, unsigned int possible_crtcs,
                                 enum drm_plane_type type)
@@ -834,7 +831,7 @@ struct ipu_plane *ipu_plane_init(struct drm_device *dev, 
struct ipu_soc *ipu,
        DRM_DEBUG_KMS("channel %d, dp flow %d, possible_crtcs=0x%x\n",
                      dma, dp, possible_crtcs);
 
-       ipu_plane = kzalloc(sizeof(*ipu_plane), GFP_KERNEL);
+       ipu_plane = drmm_kzalloc(dev, sizeof(*ipu_plane), GFP_KERNEL);
        if (!ipu_plane) {
                DRM_ERROR("failed to allocate plane\n");
                return ERR_PTR(-ENOMEM);
@@ -853,16 +850,23 @@ struct ipu_plane *ipu_plane_init(struct drm_device *dev, 
struct ipu_soc *ipu,
                                       modifiers, type, NULL);
        if (ret) {
                DRM_ERROR("failed to initialize plane\n");
-               kfree(ipu_plane);
                return ERR_PTR(ret);
        }
 
+       ret = drmm_add_action_or_reset(dev, ipu_plane_cleanup, ipu_plane);
+       if (ret)
+               return ERR_PTR(ret);
+
        drm_plane_helper_add(&ipu_plane->base, &ipu_plane_helper_funcs);
 
        if (dp == IPU_DP_FLOW_SYNC_BG || dp == IPU_DP_FLOW_SYNC_FG)
-               drm_plane_create_zpos_property(&ipu_plane->base, zpos, 0, 1);
+               ret = drm_plane_create_zpos_property(&ipu_plane->base, zpos, 0,
+                                                    1);
        else
-               drm_plane_create_zpos_immutable_property(&ipu_plane->base, 0);
+               ret = drm_plane_create_zpos_immutable_property(&ipu_plane->base,
+                                                              0);
+       if (ret)
+               return ERR_PTR(ret);
 
        return ipu_plane;
 }
-- 
2.20.1

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

Reply via email to