Now that we can initialize a drm_writeback_connector without
having to initialize the drm_connector within it and leaving the
responsibility of initialising the drm_connector and maintaining
the association with drm_writeback_connector to it. This helper
hooks lets drivers return the drm_writeback_connector associated
with the give drm_connector.

Signed-off-by: Suraj Kandpal <suraj.kand...@intel.com>
---
 drivers/gpu/drm/drm_writeback.c          | 14 ++++++
 include/drm/drm_modeset_helper_vtables.h | 59 ++++++++++++++++++++++++
 include/drm/drm_writeback.h              | 14 ++++--
 3 files changed, 82 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index fa58eb0dc7bf..e9f7123270d6 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -107,6 +107,19 @@ static const struct dma_fence_ops drm_writeback_fence_ops 
= {
        .get_timeline_name = drm_writeback_fence_get_timeline_name,
 };
 
+struct drm_writeback_connector *
+drm_connector_to_writeback(struct drm_connector *connector)
+{
+       const struct drm_connector_helper_funcs *funcs =
+               connector->helper_private;
+
+       if (funcs->get_writeback_connector)
+               return funcs->get_writeback_connector(connector);
+
+       return container_of(connector, struct drm_writeback_connector, base);
+}
+EXPORT_SYMBOL(drm_connector_to_writeback);
+
 static int create_writeback_properties(struct drm_device *dev)
 {
        struct drm_property *prop;
@@ -443,6 +456,7 @@ drm_writeback_connector_init_with_conn(struct drm_device 
*dev, struct drm_connec
                                       struct drm_writeback_connector 
*wb_connector,
                                       struct drm_encoder *enc,
                                       const struct drm_connector_funcs 
*con_funcs,
+                                      const struct 
drm_writeback_connector_helper_funcs *wb_funcs,
                                       const u32 *formats, int n_formats)
 {
        struct drm_property_blob *blob;
diff --git a/include/drm/drm_modeset_helper_vtables.h 
b/include/drm/drm_modeset_helper_vtables.h
index ce7c7aeac887..6b89b33d2304 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -31,6 +31,7 @@
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_encoder.h>
+#include <drm/drm_writeback.h>
 
 /**
  * DOC: overview
@@ -1179,6 +1180,25 @@ struct drm_connector_helper_funcs {
         *
         */
        void (*disable_hpd)(struct drm_connector *connector);
+
+       /**
+        * @get_writeback_connector:
+        *
+        * This callback is used by drivers to get the writeback connector in
+        * case the init is done via drm_writeback_init_with_conn. Which means
+        * the drivers don't have drm_connector embedded in 
drm_writeback_connector
+        * so they need to send the associated writeback connector with this
+        * function.
+        *
+        * This operation is optional.
+        *
+        * This is mainly called from drm_writeback_set_gb.
+        *
+        * RETURNS:
+        *
+        * drm_writeback_connector assoiciated with the drm connector.
+        */
+       struct drm_writeback_connector *(*get_writeback_connector)(struct 
drm_connector *connector);
 };
 
 /**
@@ -1192,6 +1212,45 @@ static inline void drm_connector_helper_add(struct 
drm_connector *connector,
        connector->helper_private = funcs;
 }
 
+/**
+ * struct drm_writeback_connector_helper_funcs - helper operations for 
writeback
+ * connectors.
+ *
+ * These functions are used by the atomic and legacy modeset helpers and by the
+ * probe helpers.
+ */
+struct drm_writeback_connector_helper_funcs {
+       /**
+        * @get_connector_from_writeback:
+        *
+        * This callback is used by drivers to get the drm_connector in
+        * case the init is done via drm_writeback_init_with_conn. Which means
+        * the drivers don't have drm_connector embedded in 
drm_writeback_connector
+        * so they need to send the associated drm_connector with this
+        * function.
+        *
+        * This operation is optional.
+        *
+        * RETURNS:
+        *
+        * drm_connector assoiciated with the drm_writeback_connector.
+        */
+       struct drm_connector
+       *(*get_connector_from_writeback)(struct drm_writeback_connector 
*wbconnector);
+};
+
+/**
+ * drm_writeback_connector_helper_add - sets the helper vtable for a connector
+ * @wb_connector: DRM writeback connector
+ * @funcs: helper vtable to set for @wb_connector
+ */
+static inline void
+drm_writeback_connector_helper_add(struct drm_writeback_connector 
*wb_connector,
+                                  const struct 
drm_writeback_connector_helper_funcs *funcs)
+{
+       wb_connector->helper_private = funcs;
+}
+
 /**
  * struct drm_plane_helper_funcs - helper operations for planes
  *
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 149744dbeef0..77c3c64c132d 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -84,6 +84,13 @@ struct drm_writeback_connector {
         * The name of the connector's fence timeline.
         */
        char timeline_name[32];
+
+       /**
+        * @helper_private:
+        *
+        * helper private funcs for writeback_connector
+        */
+       const struct drm_writeback_connector_helper_funcs *helper_private;
 };
 
 /**
@@ -142,11 +149,7 @@ struct drm_writeback_job {
        void *priv;
 };
 
-static inline struct drm_writeback_connector *
-drm_connector_to_writeback(struct drm_connector *connector)
-{
-       return container_of(connector, struct drm_writeback_connector, base);
-}
+struct drm_writeback_connector *drm_connector_to_writeback(struct 
drm_connector *connector);
 
 int drm_writeback_connector_init(struct drm_device *dev,
                                 struct drm_writeback_connector *wb_connector,
@@ -172,6 +175,7 @@ drm_writeback_connector_init_with_conn(struct drm_device 
*dev, struct drm_connec
                                       struct drm_writeback_connector 
*wb_connector,
                                       struct drm_encoder *enc,
                                       const struct drm_connector_funcs 
*con_funcs,
+                                      const struct 
drm_writeback_connector_helper_funcs *wb_funcs,
                                       const u32 *formats, int n_formats);
 
 int drm_writeback_set_fb(struct drm_connector_state *conn_state,
-- 
2.34.1

Reply via email to