drm: xlnx: zynqmp_dpsub: Don't use drmm_kcalloc() for temporary data
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 6 Aug 2021 11:29:52 +0000 (14:29 +0300)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 19 Oct 2022 13:51:04 +0000 (16:51 +0300)
The array of formats passed to drm_universal_plane_init() doesn't need
to outlive the function call, as it's copied internally. Use kcalloc()
instead of drmm_kcalloc() to allocate it, and free it right after usage.

While at it, move the allocation and initialization of the formats array
to a separate function, to prepare for splitting the DRM plane handling
to a separate file.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/gpu/drm/xlnx/zynqmp_disp.c

index e722af0..4f6c9af 100644 (file)
@@ -1001,6 +1001,33 @@ zynqmp_disp_layer_find_format(struct zynqmp_disp_layer *layer,
 }
 
 /**
+ * zynqmp_disp_layer_drm_formats - Return the DRM formats supported by the layer
+ * @layer: The layer
+ * @num_formats: Pointer to the returned number of formats
+ *
+ * Return: A newly allocated u32 array that stores all the DRM formats
+ * supported by the layer. The number of formats in the array is returned
+ * through the num_formats argument.
+ */
+static u32 *zynqmp_disp_layer_drm_formats(struct zynqmp_disp_layer *layer,
+                                         unsigned int *num_formats)
+{
+       unsigned int i;
+       u32 *formats;
+
+       formats = kcalloc(layer->info->num_formats, sizeof(*formats),
+                         GFP_KERNEL);
+       if (!formats)
+               return NULL;
+
+       for (i = 0; i < layer->info->num_formats; ++i)
+               formats[i] = layer->info->formats[i].drm_fmt;
+
+       *num_formats = layer->info->num_formats;
+       return formats;
+}
+
+/**
  * zynqmp_disp_layer_enable - Enable a layer
  * @layer: The layer
  *
@@ -1219,31 +1246,27 @@ static const struct drm_plane_funcs zynqmp_disp_plane_funcs = {
 
 static int zynqmp_disp_create_planes(struct zynqmp_disp *disp)
 {
-       unsigned int i, j;
+       unsigned int i;
        int ret;
 
        for (i = 0; i < ARRAY_SIZE(disp->layers); i++) {
                struct zynqmp_disp_layer *layer = &disp->layers[i];
                enum drm_plane_type type;
-               u32 *drm_formats;
+               unsigned int num_formats;
+               u32 *formats;
 
-               drm_formats = drmm_kcalloc(disp->drm, sizeof(*drm_formats),
-                                          layer->info->num_formats,
-                                          GFP_KERNEL);
-               if (!drm_formats)
+               formats = zynqmp_disp_layer_drm_formats(layer, &num_formats);
+               if (!formats)
                        return -ENOMEM;
 
-               for (j = 0; j < layer->info->num_formats; ++j)
-                       drm_formats[j] = layer->info->formats[j].drm_fmt;
-
                /* Graphics layer is primary, and video layer is overlay. */
                type = zynqmp_disp_layer_is_video(layer)
                     ? DRM_PLANE_TYPE_OVERLAY : DRM_PLANE_TYPE_PRIMARY;
                ret = drm_universal_plane_init(disp->drm, &layer->plane, 0,
                                               &zynqmp_disp_plane_funcs,
-                                              drm_formats,
-                                              layer->info->num_formats,
+                                              formats, num_formats,
                                               NULL, type, NULL);
+               kfree(formats);
                if (ret)
                        return ret;