[PATCH v7 2/9] drm/komeda: embed the writeback encoder in komeda_wb_connector
From: Dmitry Baryshkov
Date: Mon Oct 19 2026 - 09:21:26 EST
drm_writeback_connector_init() hides the encoder inside struct
drm_writeback_connector, which is the only reason that structure carries
an encoder at all. Every other writeback user already owns its encoder.
Embed the encoder in the driver's own structure and register the
connector with drm_writeback_connector_init_with_encoder(), so that the
encoder can be dropped from drm_writeback_connector.
Assisted-by: LLM
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxxxxxxxx>
---
drivers/gpu/drm/arm/display/komeda/komeda_kms.h | 3 +++
.../drm/arm/display/komeda/komeda_wb_connector.c | 28 ++++++++++++++++------
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
index 83e61c4080c2..4d41681a834b 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
@@ -56,6 +56,9 @@ struct komeda_wb_connector {
/** @base: &drm_writeback_connector */
struct drm_writeback_connector base;
+ /** @encoder: writeback encoder */
+ struct drm_encoder encoder;
+
/** @wb_layer: represents associated writeback pipeline of komeda */
struct komeda_layer *wb_layer;
};
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
index 4872253a2449..77aecf4d3f09 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -127,6 +127,10 @@ static void komeda_wb_connector_destroy(struct drm_connector *connector)
kfree(to_kconn(to_wb_conn(connector)));
}
+static const struct drm_encoder_funcs komeda_wb_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_connector_funcs komeda_wb_connector_funcs = {
.reset = drm_atomic_helper_connector_reset,
.detect = komeda_wb_connector_detect,
@@ -170,18 +174,28 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
return -ENOMEM;
}
- err = drm_writeback_connector_init(&kms->base, wb_conn,
- &komeda_wb_connector_funcs,
- &komeda_wb_encoder_helper_funcs,
- formats, n_formats,
- BIT(drm_crtc_index(&kcrtc->base)));
- komeda_put_fourcc_list(formats);
+ wb_encoder = &kwb_conn->encoder;
+ drm_encoder_helper_add(wb_encoder, &komeda_wb_encoder_helper_funcs);
+ wb_encoder->possible_crtcs = crtc_mask;
+
+ err = drm_encoder_init(&kms->base, wb_encoder, &komeda_wb_encoder_funcs,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
if (err) {
+ komeda_put_fourcc_list(formats);
kfree(kwb_conn);
return err;
}
- wb_encoder = &wb_conn->encoder;
+ err = drm_writeback_connector_init_with_encoder(&kms->base, wb_conn,
+ wb_encoder,
+ &komeda_wb_connector_funcs,
+ formats, n_formats);
+ komeda_put_fourcc_list(formats);
+ if (err) {
+ drm_encoder_cleanup(wb_encoder);
+ kfree(kwb_conn);
+ return err;
+ }
/*
* The writeback connector is associated with a single CRTC. Make its
--
2.47.3