Use drm_fb_cma_fbdev_init() and drm_fb_cma_fbdev_fini() which relies on
the fact that drm_device holds a pointer to the drm_fb_helper structure.
This means that the driver doesn't have to keep track of that.
Also use the drm_fb_helper functions directly.

Cc: Xinliang Liu <z.liuxinli...@hisilicon.com>
Cc: Rongrong Zou <zourongr...@gmail.com>
Cc: Xinwei Kong <kong.kongxin...@hisilicon.com>
Cc: Chen Feng <puck.c...@hisilicon.com>
Signed-off-by: Noralf Trønnes <nor...@tronnes.org>
---
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 35 ++++---------------------
 drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h |  4 ---
 2 files changed, 5 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c 
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
index ddb0403f1975..e3673efbf1c2 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
@@ -21,6 +21,7 @@
 
 #include <drm/drmP.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_fb_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_atomic_helper.h>
@@ -33,32 +34,17 @@ static struct kirin_dc_ops *dc_ops;
 
 static int kirin_drm_kms_cleanup(struct drm_device *dev)
 {
-       struct kirin_drm_private *priv = dev->dev_private;
-
-       if (priv->fbdev) {
-               drm_fbdev_cma_fini(priv->fbdev);
-               priv->fbdev = NULL;
-       }
-
+       drm_fb_cma_fbdev_fini(dev);
        drm_kms_helper_poll_fini(dev);
        dc_ops->cleanup(to_platform_device(dev->dev));
        drm_mode_config_cleanup(dev);
-       devm_kfree(dev->dev, priv);
-       dev->dev_private = NULL;
 
        return 0;
 }
 
-static void kirin_fbdev_output_poll_changed(struct drm_device *dev)
-{
-       struct kirin_drm_private *priv = dev->dev_private;
-
-       drm_fbdev_cma_hotplug_event(priv->fbdev);
-}
-
 static const struct drm_mode_config_funcs kirin_drm_mode_config_funcs = {
        .fb_create = drm_gem_fb_create,
-       .output_poll_changed = kirin_fbdev_output_poll_changed,
+       .output_poll_changed = drm_fb_helper_output_poll_changed,
        .atomic_check = drm_atomic_helper_check,
        .atomic_commit = drm_atomic_helper_commit,
 };
@@ -76,14 +62,8 @@ static void kirin_drm_mode_config_init(struct drm_device 
*dev)
 
 static int kirin_drm_kms_init(struct drm_device *dev)
 {
-       struct kirin_drm_private *priv;
        int ret;
 
-       priv = devm_kzalloc(dev->dev, sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-
-       dev->dev_private = priv;
        dev_set_drvdata(dev->dev, dev);
 
        /* dev->mode_config initialization */
@@ -117,12 +97,9 @@ static int kirin_drm_kms_init(struct drm_device *dev)
        /* init kms poll for handling hpd */
        drm_kms_helper_poll_init(dev);
 
-       priv->fbdev = drm_fbdev_cma_init(dev, 32,
-                                        dev->mode_config.num_connector);
-
-       if (IS_ERR(priv->fbdev)) {
+       ret = drm_fb_cma_fbdev_init(dev, 32, 0);
+       if (ret) {
                DRM_ERROR("failed to initialize fbdev.\n");
-               ret = PTR_ERR(priv->fbdev);
                goto err_cleanup_poll;
        }
        return 0;
@@ -135,8 +112,6 @@ static int kirin_drm_kms_init(struct drm_device *dev)
        dc_ops->cleanup(to_platform_device(dev->dev));
 err_mode_config_cleanup:
        drm_mode_config_cleanup(dev);
-       devm_kfree(dev->dev, priv);
-       dev->dev_private = NULL;
 
        return ret;
 }
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h 
b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h
index 56cb62df065c..ad027d1cc826 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h
@@ -19,10 +19,6 @@ struct kirin_dc_ops {
        void (*cleanup)(struct platform_device *pdev);
 };
 
-struct kirin_drm_private {
-       struct drm_fbdev_cma *fbdev;
-};
-
 extern const struct kirin_dc_ops ade_dc_ops;
 
 #endif /* __KIRIN_DRM_DRV_H__ */
-- 
2.14.2

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

Reply via email to