ping
On 02/12/2018 10:52 AM, Oleksandr Andrushchenko wrote:
From: Oleksandr Andrushchenko <oleksandr_andrushche...@epam.com>

If simple_kms_helper based driver needs to work with vblanks,
then it has to provide drm_driver.{enable|disable}_vblank callbacks,
because drm_simple_kms_helper.drm_crtc_funcs does not provide any.
At the same time drm_driver.{enable|disable}_vblank callbacks
are marked as deprecated and shouldn't be used by new drivers.

Fix this by extending drm_simple_kms_helper.drm_crtc_funcs
to provide the missing callbacks.

Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushche...@epam.com>
---
  drivers/gpu/drm/drm_simple_kms_helper.c | 24 ++++++++++++++++++++++++
  include/drm/drm_simple_kms_helper.h     | 18 ++++++++++++++++++
  2 files changed, 42 insertions(+)

diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c 
b/drivers/gpu/drm/drm_simple_kms_helper.c
index 9d3f6b70812c..9ca8a4a59b74 100644
--- a/drivers/gpu/drm/drm_simple_kms_helper.c
+++ b/drivers/gpu/drm/drm_simple_kms_helper.c
@@ -77,6 +77,28 @@ static const struct drm_crtc_helper_funcs 
drm_simple_kms_crtc_helper_funcs = {
        .atomic_disable = drm_simple_kms_crtc_disable,
  };
+static int drm_simple_kms_crtc_enable_vblank(struct drm_crtc *crtc)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(crtc, struct drm_simple_display_pipe, crtc);
+       if (!pipe->funcs || !pipe->funcs->enable_vblank)
+               return 0;
+
+       return pipe->funcs->enable_vblank(pipe);
+}
+
+static void drm_simple_kms_crtc_disable_vblank(struct drm_crtc *crtc)
+{
+       struct drm_simple_display_pipe *pipe;
+
+       pipe = container_of(crtc, struct drm_simple_display_pipe, crtc);
+       if (!pipe->funcs || !pipe->funcs->disable_vblank)
+               return;
+
+       pipe->funcs->disable_vblank(pipe);
+}
+
  static const struct drm_crtc_funcs drm_simple_kms_crtc_funcs = {
        .reset = drm_atomic_helper_crtc_reset,
        .destroy = drm_crtc_cleanup,
@@ -84,6 +106,8 @@ static const struct drm_crtc_funcs drm_simple_kms_crtc_funcs 
= {
        .page_flip = drm_atomic_helper_page_flip,
        .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+       .enable_vblank = drm_simple_kms_crtc_enable_vblank,
+       .disable_vblank = drm_simple_kms_crtc_disable_vblank,
  };
static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,
diff --git a/include/drm/drm_simple_kms_helper.h 
b/include/drm/drm_simple_kms_helper.h
index 6d9adbb46293..79567826b099 100644
--- a/include/drm/drm_simple_kms_helper.h
+++ b/include/drm/drm_simple_kms_helper.h
@@ -93,6 +93,24 @@ struct drm_simple_display_pipe_funcs {
         */
        void (*cleanup_fb)(struct drm_simple_display_pipe *pipe,
                           struct drm_plane_state *plane_state);
+
+       /**
+        * @enable_vblank:
+        *
+        * Optional, called by &drm_crtc_funcs.enable_vblank. Please read
+        * the documentation for the &drm_crtc_funcs.enable_vblank hook for
+        * more details.
+        */
+       int (*enable_vblank)(struct drm_simple_display_pipe *pipe);
+
+       /**
+        * @disable_vblank:
+        *
+        * Optional, called by &drm_crtc_funcs.disable_vblank. Please read
+        * the documentation for the &drm_crtc_funcs.disable_vblank hook for
+        * more details.
+        */
+       void (*disable_vblank)(struct drm_simple_display_pipe *pipe);
  };
/**

Reply via email to