Now that drm_connector may not always be embedded within drm_writeback_connector, let's define a function which either uses the writeback helper hook that returns the drm_connector associated with the drm_writeback_connector or just return the drm_connector embedded inside drm_writeback_connector if the helper hook is not present. Lets use this function and call it whenever drm_connector is required mostly when connector helper private funcs need to be fetched.
Signed-off-by: Suraj Kandpal <suraj.kand...@intel.com> --- drivers/gpu/drm/drm_writeback.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c index e9f7123270d6..d610cb827975 100644 --- a/drivers/gpu/drm/drm_writeback.c +++ b/drivers/gpu/drm/drm_writeback.c @@ -120,6 +120,18 @@ drm_connector_to_writeback(struct drm_connector *connector) } EXPORT_SYMBOL(drm_connector_to_writeback); +static struct drm_connector * +drm_connector_from_writeback(struct drm_writeback_connector *wb_connector) +{ + const struct drm_writeback_connector_helper_funcs *funcs = + wb_connector->helper_private; + + if (funcs && funcs->get_connector_from_writeback) + return funcs->get_connector_from_writeback(wb_connector); + + return &wb_connector->base; +} + static int create_writeback_properties(struct drm_device *dev) { struct drm_property *prop; @@ -478,6 +490,7 @@ drm_writeback_connector_init_with_conn(struct drm_device *dev, struct drm_connec if (ret) goto connector_fail; + drm_writeback_connector_helper_add(wb_connector, wb_funcs); INIT_LIST_HEAD(&wb_connector->job_queue); spin_lock_init(&wb_connector->job_lock); @@ -527,13 +540,15 @@ int drm_writeback_set_fb(struct drm_connector_state *conn_state, int drm_writeback_prepare_job(struct drm_writeback_job *job) { - struct drm_writeback_connector *connector = job->connector; + struct drm_writeback_connector *wb_connector = job->connector; + struct drm_connector *connector = + drm_connector_from_writeback(wb_connector); const struct drm_connector_helper_funcs *funcs = - connector->base.helper_private; + connector->helper_private; int ret; if (funcs->prepare_writeback_job) { - ret = funcs->prepare_writeback_job(connector, job); + ret = funcs->prepare_writeback_job(wb_connector, job); if (ret < 0) return ret; } @@ -579,12 +594,14 @@ EXPORT_SYMBOL(drm_writeback_queue_job); void drm_writeback_cleanup_job(struct drm_writeback_job *job) { - struct drm_writeback_connector *connector = job->connector; + struct drm_writeback_connector *wb_connector = job->connector; + struct drm_connector *connector = + drm_connector_from_writeback(wb_connector); const struct drm_connector_helper_funcs *funcs = - connector->base.helper_private; + connector->helper_private; if (job->prepared && funcs->cleanup_writeback_job) - funcs->cleanup_writeback_job(connector, job); + funcs->cleanup_writeback_job(wb_connector, job); if (job->fb) drm_framebuffer_put(job->fb); @@ -665,9 +682,11 @@ EXPORT_SYMBOL(drm_writeback_signal_completion); struct dma_fence * drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector) { + struct drm_connector *connector = + drm_connector_from_writeback(wb_connector); struct dma_fence *fence; - if (WARN_ON(wb_connector->base.connector_type != + if (WARN_ON(connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)) return NULL; -- 2.34.1