Commit 96e0e3e3 authored by Laurent Pinchart's avatar Laurent Pinchart

drm: xlnx: zynqmp_dpsub: Don't use drmm_kcalloc() for temporary data

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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
parent 531306f5
...@@ -1000,6 +1000,33 @@ zynqmp_disp_layer_find_format(struct zynqmp_disp_layer *layer, ...@@ -1000,6 +1000,33 @@ zynqmp_disp_layer_find_format(struct zynqmp_disp_layer *layer,
return NULL; return NULL;
} }
/**
* 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 * zynqmp_disp_layer_enable - Enable a layer
* @layer: The layer * @layer: The layer
...@@ -1219,31 +1246,27 @@ static const struct drm_plane_funcs zynqmp_disp_plane_funcs = { ...@@ -1219,31 +1246,27 @@ static const struct drm_plane_funcs zynqmp_disp_plane_funcs = {
static int zynqmp_disp_create_planes(struct zynqmp_disp *disp) static int zynqmp_disp_create_planes(struct zynqmp_disp *disp)
{ {
unsigned int i, j; unsigned int i;
int ret; int ret;
for (i = 0; i < ARRAY_SIZE(disp->layers); i++) { for (i = 0; i < ARRAY_SIZE(disp->layers); i++) {
struct zynqmp_disp_layer *layer = &disp->layers[i]; struct zynqmp_disp_layer *layer = &disp->layers[i];
enum drm_plane_type type; enum drm_plane_type type;
u32 *drm_formats; unsigned int num_formats;
u32 *formats;
drm_formats = drmm_kcalloc(disp->drm, sizeof(*drm_formats), formats = zynqmp_disp_layer_drm_formats(layer, &num_formats);
layer->info->num_formats, if (!formats)
GFP_KERNEL);
if (!drm_formats)
return -ENOMEM; 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. */ /* Graphics layer is primary, and video layer is overlay. */
type = zynqmp_disp_layer_is_video(layer) type = zynqmp_disp_layer_is_video(layer)
? DRM_PLANE_TYPE_OVERLAY : DRM_PLANE_TYPE_PRIMARY; ? DRM_PLANE_TYPE_OVERLAY : DRM_PLANE_TYPE_PRIMARY;
ret = drm_universal_plane_init(disp->drm, &layer->plane, 0, ret = drm_universal_plane_init(disp->drm, &layer->plane, 0,
&zynqmp_disp_plane_funcs, &zynqmp_disp_plane_funcs,
drm_formats, formats, num_formats,
layer->info->num_formats,
NULL, type, NULL); NULL, type, NULL);
kfree(formats);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment