Switch the dw-hdmi driver to drm_bridge_funcs, and add the default supported
YUV444 bus format to the encoder output_bus_caps.

Signed-off-by: Neil Armstrong <narmstr...@baylibre.com>
---
 drivers/gpu/drm/meson/meson_dw_hdmi.c | 37 +++++++++++++++++----------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c 
b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 9f0b08eaf003..9a99d3920610 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -368,7 +368,7 @@ static inline void meson_dw_hdmi_phy_reset(struct 
meson_dw_hdmi *dw_hdmi)
 }
 
 static void dw_hdmi_set_vclk(struct meson_dw_hdmi *dw_hdmi,
-                            struct drm_display_mode *mode)
+                            const struct drm_display_mode *mode)
 {
        struct meson_drm *priv = dw_hdmi->priv;
        int vic = drm_match_cea_mode(mode);
@@ -670,15 +670,17 @@ static const struct drm_encoder_funcs 
meson_venc_hdmi_encoder_funcs = {
        .destroy        = meson_venc_hdmi_encoder_destroy,
 };
 
-static int meson_venc_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
+static int meson_venc_hdmi_encoder_atomic_check(struct drm_bridge *bridge,
+                                       struct drm_bridge_state *bridge_state,
                                        struct drm_crtc_state *crtc_state,
                                        struct drm_connector_state *conn_state)
 {
        return 0;
 }
 
-static void meson_venc_hdmi_encoder_disable(struct drm_encoder *encoder)
+static void meson_venc_hdmi_encoder_disable(struct drm_bridge *bridge)
 {
+       struct drm_encoder *encoder = bridge_to_encoder(bridge);
        struct meson_dw_hdmi *dw_hdmi = encoder_to_meson_dw_hdmi(encoder);
        struct meson_drm *priv = dw_hdmi->priv;
 
@@ -691,8 +693,9 @@ static void meson_venc_hdmi_encoder_disable(struct 
drm_encoder *encoder)
        writel_relaxed(0, priv->io_base + _REG(ENCP_VIDEO_EN));
 }
 
-static void meson_venc_hdmi_encoder_enable(struct drm_encoder *encoder)
+static void meson_venc_hdmi_encoder_enable(struct drm_bridge *bridge)
 {
+       struct drm_encoder *encoder = bridge_to_encoder(bridge);
        struct meson_dw_hdmi *dw_hdmi = encoder_to_meson_dw_hdmi(encoder);
        struct meson_drm *priv = dw_hdmi->priv;
 
@@ -704,10 +707,11 @@ static void meson_venc_hdmi_encoder_enable(struct 
drm_encoder *encoder)
                writel_relaxed(1, priv->io_base + _REG(ENCP_VIDEO_EN));
 }
 
-static void meson_venc_hdmi_encoder_mode_set(struct drm_encoder *encoder,
-                                  struct drm_display_mode *mode,
-                                  struct drm_display_mode *adjusted_mode)
+static void meson_venc_hdmi_encoder_mode_set(struct drm_bridge *bridge,
+                                  const struct drm_display_mode *mode,
+                                  const struct drm_display_mode *adjusted_mode)
 {
+       struct drm_encoder *encoder = bridge_to_encoder(bridge);
        struct meson_dw_hdmi *dw_hdmi = encoder_to_meson_dw_hdmi(encoder);
        struct meson_drm *priv = dw_hdmi->priv;
        int vic = drm_match_cea_mode(mode);
@@ -724,11 +728,10 @@ static void meson_venc_hdmi_encoder_mode_set(struct 
drm_encoder *encoder,
        writel_relaxed(0, priv->io_base + _REG(VPU_HDMI_FMT_CTRL));
 }
 
-static const struct drm_encoder_helper_funcs
-                               meson_venc_hdmi_encoder_helper_funcs = {
-       .atomic_check   = meson_venc_hdmi_encoder_atomic_check,
-       .disable        = meson_venc_hdmi_encoder_disable,
+static const struct drm_bridge_funcs meson_venc_hdmi_encoder_bridge_funcs = {
        .enable         = meson_venc_hdmi_encoder_enable,
+       .disable        = meson_venc_hdmi_encoder_disable,
+       .atomic_check   = meson_venc_hdmi_encoder_atomic_check,
        .mode_set       = meson_venc_hdmi_encoder_mode_set,
 };
 
@@ -800,6 +803,10 @@ static bool meson_hdmi_connector_is_available(struct 
device *dev)
        return false;
 }
 
+static const u32 meson_dw_hdmi_out_bus_fmts[] = {
+       MEDIA_BUS_FMT_YUV8_1X24,
+};
+
 static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
                                void *data)
 {
@@ -810,6 +817,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct 
device *master,
        struct meson_drm *priv = drm->dev_private;
        struct dw_hdmi_plat_data *dw_plat_data;
        struct drm_encoder *encoder;
+       struct drm_bus_caps *bus_caps;
        struct resource *res;
        int irq;
        int ret;
@@ -837,6 +845,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct 
device *master,
        meson_dw_hdmi->data = match;
        dw_plat_data = &meson_dw_hdmi->dw_plat_data;
        encoder = &meson_dw_hdmi->encoder;
+       bus_caps = &encoder->bridge.output_bus_caps;
 
        meson_dw_hdmi->hdmi_supply = devm_regulator_get_optional(dev, "hdmi");
        if (IS_ERR(meson_dw_hdmi->hdmi_supply)) {
@@ -910,8 +919,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct 
device *master,
 
        /* Encoder */
 
-       drm_encoder_helper_add(encoder, &meson_venc_hdmi_encoder_helper_funcs);
-
+       encoder->bridge.funcs = &meson_venc_hdmi_encoder_bridge_funcs;
        ret = drm_encoder_init(drm, encoder, &meson_venc_hdmi_encoder_funcs,
                               DRM_MODE_ENCODER_TMDS, "meson_hdmi");
        if (ret) {
@@ -919,6 +927,9 @@ static int meson_dw_hdmi_bind(struct device *dev, struct 
device *master,
                return ret;
        }
 
+       bus_caps->supported_fmts = meson_dw_hdmi_out_bus_fmts;
+       bus_caps->num_supported_fmts = ARRAY_SIZE(meson_dw_hdmi_out_bus_fmts);
+
        encoder->possible_crtcs = BIT(0);
 
        DRM_DEBUG_DRIVER("encoder initialized\n");
-- 
2.22.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to