"armada-drm"))
                return -EBUSY;
 
-       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-
-       /*
-        * The drm_device structure must be at the start of
-        * armada_private for drm_dev_put() to work correctly.
-        */
-       BUILD_BUG_ON(offsetof(struct armada_private, drm) != 0);
-
-       ret = drm_dev_init(&priv->drm, &armada_drm_driver, dev);
-       if (ret) {
-               dev_err(dev, "[" DRM_NAME ":%s] drm_dev_init failed: %d\n",
-                       __func__, ret);
-               kfree(priv);
-               return ret;
+       priv = devm_drm_dev_alloc(dev, &armada_drm_driver,
+                                 struct armada_private, drm);
+       if (IS_ERR(priv)) {
+               dev_err(dev, "[" DRM_NAME ":%s] devm_drm_dev_alloc failed: %li\n",
+                       __func__, PTR_ERR(priv));
+               return PTR_ERR(priv);
        }
-       drmm_add_final_kfree(&priv->drm, priv);
 
        /* Remove early framebuffers */
        ret = drm_fb_helper_remove_conflicting_framebuffers(NULL,
  err_kms:
        drm_mode_config_cleanup(&priv->drm);
        drm_mm_takedown(&priv->linear);
-       drm_dev_put(&priv->drm);
        return ret;
 }
 
 
        drm_mode_config_cleanup(&priv->drm);
        drm_mm_takedown(&priv->linear);
-
-       drm_dev_put(&priv->drm);
 }
 
 static int compare_of(struct device *dev, void *data)