Message ID | 1649465635-20542-5-git-send-email-quic_abhinavk@quicinc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Allow drm_writeback_connector to accept pointer to drm_encoder | expand |
I am dropping this change because originally I had made this only to show usage of drm_writeback_connector_init_with_encoder(). For writeback functionality, vc4 doesnt need this and this seems redundant. To show the usage of drm_writeback_connector_init_with_encoder(), I have posted the MSM writeback driver changes here [1]. [1] https://patchwork.freedesktop.org/series/99724/ Thanks Abhinav On 4/8/2022 5:53 PM, Abhinav Kumar wrote: > vc4 driver currently embeds the drm_encoder into struct vc4_txp > and later on uses container_of to retrieve the vc4_txp from > the drm_encoder. > > Make vc4 driver use the new API so that the embedded encoder model > can be retained in the driver and there is no change in > functionality. > > changes in v7: > - remove the drm core changes to previous patch in the series > > Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com> > --- > drivers/gpu/drm/vc4/vc4_txp.c | 32 ++++++++++++++++++++++++-------- > 1 file changed, 24 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c > index 7e063a9..0d461df 100644 > --- a/drivers/gpu/drm/vc4/vc4_txp.c > +++ b/drivers/gpu/drm/vc4/vc4_txp.c > @@ -151,6 +151,8 @@ struct vc4_txp { > > struct platform_device *pdev; > > + struct drm_encoder drm_enc; > + > struct drm_writeback_connector connector; > > void __iomem *regs; > @@ -159,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.internal_encoder); > + return container_of(encoder, struct vc4_txp, drm_enc); > } > > static inline struct vc4_txp *connector_to_vc4_txp(struct drm_connector *conn) > @@ -368,6 +370,10 @@ static const struct drm_encoder_helper_funcs vc4_txp_encoder_helper_funcs = { > .disable = vc4_txp_encoder_disable, > }; > > +static const struct drm_encoder_funcs vc4_txp_encoder_funcs = { > + .destroy = drm_encoder_cleanup, > +}; > + > static int vc4_txp_enable_vblank(struct drm_crtc *crtc) > { > return 0; > @@ -467,6 +473,7 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data) > struct vc4_txp *txp; > struct drm_crtc *crtc; > struct drm_encoder *encoder; > + struct drm_writeback_connector *wb_conn; > int ret, irq; > > irq = platform_get_irq(pdev, 0); > @@ -492,16 +499,25 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data) > txp->regset.regs = txp_regs; > txp->regset.nregs = ARRAY_SIZE(txp_regs); > > - 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); > + wb_conn = &txp->connector; > + > + drm_encoder_helper_add(&txp->drm_enc, &vc4_txp_encoder_helper_funcs); > + > + ret = drm_encoder_init(drm, &txp->drm_enc, &vc4_txp_encoder_funcs, > + DRM_MODE_ENCODER_VIRTUAL, NULL); > if (ret) > return ret; > > + drm_connector_helper_add(&wb_conn->base, &vc4_txp_connector_helper_funcs); > + > + ret = drm_writeback_connector_init_with_encoder(drm, wb_conn, &txp->drm_enc, > + &vc4_txp_connector_funcs, drm_fmts, ARRAY_SIZE(drm_fmts)); > + > + if (ret) { > + drm_encoder_cleanup(&txp->drm_enc); > + return ret; > + } > + > ret = vc4_crtc_init(drm, vc4_crtc, > &vc4_txp_crtc_funcs, &vc4_txp_crtc_helper_funcs); > if (ret)
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c index 7e063a9..0d461df 100644 --- a/drivers/gpu/drm/vc4/vc4_txp.c +++ b/drivers/gpu/drm/vc4/vc4_txp.c @@ -151,6 +151,8 @@ struct vc4_txp { struct platform_device *pdev; + struct drm_encoder drm_enc; + struct drm_writeback_connector connector; void __iomem *regs; @@ -159,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.internal_encoder); + return container_of(encoder, struct vc4_txp, drm_enc); } static inline struct vc4_txp *connector_to_vc4_txp(struct drm_connector *conn) @@ -368,6 +370,10 @@ static const struct drm_encoder_helper_funcs vc4_txp_encoder_helper_funcs = { .disable = vc4_txp_encoder_disable, }; +static const struct drm_encoder_funcs vc4_txp_encoder_funcs = { + .destroy = drm_encoder_cleanup, +}; + static int vc4_txp_enable_vblank(struct drm_crtc *crtc) { return 0; @@ -467,6 +473,7 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data) struct vc4_txp *txp; struct drm_crtc *crtc; struct drm_encoder *encoder; + struct drm_writeback_connector *wb_conn; int ret, irq; irq = platform_get_irq(pdev, 0); @@ -492,16 +499,25 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data) txp->regset.regs = txp_regs; txp->regset.nregs = ARRAY_SIZE(txp_regs); - 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); + wb_conn = &txp->connector; + + drm_encoder_helper_add(&txp->drm_enc, &vc4_txp_encoder_helper_funcs); + + ret = drm_encoder_init(drm, &txp->drm_enc, &vc4_txp_encoder_funcs, + DRM_MODE_ENCODER_VIRTUAL, NULL); if (ret) return ret; + drm_connector_helper_add(&wb_conn->base, &vc4_txp_connector_helper_funcs); + + ret = drm_writeback_connector_init_with_encoder(drm, wb_conn, &txp->drm_enc, + &vc4_txp_connector_funcs, drm_fmts, ARRAY_SIZE(drm_fmts)); + + if (ret) { + drm_encoder_cleanup(&txp->drm_enc); + return ret; + } + ret = vc4_crtc_init(drm, vc4_crtc, &vc4_txp_crtc_funcs, &vc4_txp_crtc_helper_funcs); if (ret)
vc4 driver currently embeds the drm_encoder into struct vc4_txp and later on uses container_of to retrieve the vc4_txp from the drm_encoder. Make vc4 driver use the new API so that the embedded encoder model can be retained in the driver and there is no change in functionality. changes in v7: - remove the drm core changes to previous patch in the series Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com> --- drivers/gpu/drm/vc4/vc4_txp.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-)