The TXP is integrated as a separate CRTC/Encoder/Connector combo, but
for some reason doesn't rely on the vc4_encoder type and it's associated
type.

Let's create a type to make it consistent with the other encoders.

Signed-off-by: Maxime Ripard <max...@cerno.tech>
---
 drivers/gpu/drm/vc4/vc4_drv.h |  1 +
 drivers/gpu/drm/vc4/vc4_txp.c | 30 ++++++++++++++++++++----------
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 855207c07e2e..31228d4cf080 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -473,6 +473,7 @@ enum vc4_encoder_type {
        VC4_ENCODER_TYPE_DSI1,
        VC4_ENCODER_TYPE_SMI,
        VC4_ENCODER_TYPE_DPI,
+       VC4_ENCODER_TYPE_TXP,
 };
 
 struct vc4_encoder {
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index b00c6fae972f..0bb8e97d7891 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -153,6 +153,7 @@ struct vc4_txp {
 
        struct platform_device *pdev;
 
+       struct vc4_encoder encoder;
        struct drm_writeback_connector connector;
 
        void __iomem *regs;
@@ -160,7 +161,7 @@ struct vc4_txp {
 
 static inline struct vc4_txp *encoder_to_vc4_txp(struct drm_encoder *encoder)
 {
-       return container_of(encoder, struct vc4_txp, connector.encoder);
+       return container_of(encoder, struct vc4_txp, encoder.base);
 }
 
 static inline struct vc4_txp *connector_to_vc4_txp(struct drm_connector *conn)
@@ -488,9 +489,10 @@ static int vc4_txp_bind(struct device *dev, struct device 
*master, void *data)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct drm_device *drm = dev_get_drvdata(master);
+       struct vc4_encoder *vc4_encoder;
+       struct drm_encoder *encoder;
        struct vc4_crtc *vc4_crtc;
        struct vc4_txp *txp;
-       struct drm_encoder *encoder;
        int ret, irq;
 
        irq = platform_get_irq(pdev, 0);
@@ -514,13 +516,24 @@ static int vc4_txp_bind(struct device *dev, struct device 
*master, void *data)
        vc4_crtc->regset.regs = txp_regs;
        vc4_crtc->regset.nregs = ARRAY_SIZE(txp_regs);
 
+       vc4_encoder = &txp->encoder;
+       txp->encoder.type = VC4_ENCODER_TYPE_TXP;
+
+       encoder = &vc4_encoder->base;
+       encoder->possible_crtcs = drm_crtc_mask(&vc4_crtc->base);
+
+       drm_encoder_helper_add(encoder, &vc4_txp_encoder_helper_funcs);
+
+       ret = drmm_encoder_init(drm, encoder, NULL, DRM_MODE_ENCODER_VIRTUAL, 
NULL);
+       if (ret)
+               return ret;
+
        drm_connector_helper_add(&txp->connector.base,
                                 &vc4_txp_connector_helper_funcs);
-       ret = drm_writeback_connector_init(drm, &txp->connector,
-                                          &vc4_txp_connector_funcs,
-                                          &vc4_txp_encoder_helper_funcs,
-                                          drm_fmts, ARRAY_SIZE(drm_fmts),
-                                          0);
+       ret = drm_writeback_connector_init_with_encoder(drm, &txp->connector,
+                                                       encoder,
+                                                       
&vc4_txp_connector_funcs,
+                                                       drm_fmts, 
ARRAY_SIZE(drm_fmts));
        if (ret)
                return ret;
 
@@ -529,9 +542,6 @@ static int vc4_txp_bind(struct device *dev, struct device 
*master, void *data)
        if (ret)
                return ret;
 
-       encoder = &txp->connector.encoder;
-       encoder->possible_crtcs = drm_crtc_mask(&vc4_crtc->base);
-
        ret = devm_request_irq(dev, irq, vc4_txp_interrupt, 0,
                               dev_name(dev), txp);
        if (ret)

-- 
2.38.1-b4-0.11.0-dev-d416f

Reply via email to