#include <linux/dma-mapping.h>
 #include <linux/of_platform.h>
 #include <linux/scatterlist.h>
+#include <linux/slab.h>
 #include <linux/videodev2.h>
 
 #include <media/vsp1.h>
 static void rcar_du_vsp_cleanup(struct drm_device *dev, void *res)
 {
        struct rcar_du_vsp *vsp = res;
+       unsigned int i;
+
+       for (i = 0; i < vsp->num_planes; ++i) {
+               struct rcar_du_vsp_plane *plane = &vsp->planes[i];
+
+               drm_plane_cleanup(&plane->plane);
+       }
+
+       kfree(vsp->planes);
 
        put_device(vsp->vsp);
 }
        struct rcar_du_device *rcdu = vsp->dev;
        struct platform_device *pdev;
        unsigned int num_crtcs = hweight32(crtcs);
+       unsigned int num_planes;
        unsigned int i;
        int ret;
 
          * The VSP2D (Gen3) has 5 RPFs, but the VSP1D (Gen2) is limited to
          * 4 RPFs.
          */
-       vsp->num_planes = rcdu->info->gen >= 3 ? 5 : 4;
+       num_planes = rcdu->info->gen >= 3 ? 5 : 4;
 
-       vsp->planes = devm_kcalloc(rcdu->dev, vsp->num_planes,
-                                  sizeof(*vsp->planes), GFP_KERNEL);
+       vsp->planes = kcalloc(num_planes, sizeof(*vsp->planes), GFP_KERNEL);
        if (!vsp->planes)
                return -ENOMEM;
 
-       for (i = 0; i < vsp->num_planes; ++i) {
+       for (i = 0; i < num_planes; ++i) {
                enum drm_plane_type type = i < num_crtcs
                                         ? DRM_PLANE_TYPE_PRIMARY
                                         : DRM_PLANE_TYPE_OVERLAY;
                } else {
                        drm_plane_create_alpha_property(&plane->plane);
                        drm_plane_create_zpos_property(&plane->plane, 1, 1,
-                                                      vsp->num_planes - 1);
+                                                      num_planes - 1);
                }
+
+               vsp->num_planes++;
        }
 
        return 0;