Initialize drm_brige with advertised colors formats straight on. Drivers that make use of DRM helpers would check the drm_brige::supported_formats bit-field list and refuse to use the color format passed. Drivers that make use of drm_bridge can pass the supported color formats in the bridge as well as supported color format for the DRM color format property.
This includes a fallback to RGB when Auto has been selected. Signed-off-by: Marius Vlad <marius.v...@collabora.com> --- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 2 +- drivers/gpu/drm/bridge/ite-it6263.c | 2 +- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 3 ++- drivers/gpu/drm/display/drm_bridge_connector.c | 4 ++-- drivers/gpu/drm/imx/dcss/dcss-kms.c | 2 +- drivers/gpu/drm/mediatek/mtk_dpi.c | 2 +- drivers/gpu/drm/mediatek/mtk_dsi.c | 2 +- drivers/gpu/drm/meson/meson_encoder_cvbs.c | 3 ++- drivers/gpu/drm/meson/meson_encoder_hdmi.c | 4 ++-- drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 2 +- drivers/gpu/drm/msm/dp/dp_drm.c | 3 ++- drivers/gpu/drm/msm/dsi/dsi_manager.c | 2 +- drivers/gpu/drm/msm/hdmi/hdmi.c | 2 +- drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c | 2 +- drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c | 2 +- drivers/gpu/drm/rockchip/cdn-dp-core.c | 2 +- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 2 +- drivers/gpu/drm/rockchip/rockchip_lvds.c | 2 +- drivers/gpu/drm/tegra/hdmi.c | 2 +- drivers/gpu/drm/tegra/rgb.c | 2 +- drivers/gpu/drm/tidss/tidss_encoder.c | 2 +- include/drm/drm_bridge_connector.h | 3 ++- 22 files changed, 28 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index 26f8ef482423..f2fea84b6415 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -762,7 +762,7 @@ static int adv7511_connector_init(struct adv7511 *adv) struct drm_bridge *bridge = &adv->bridge; struct drm_connector *connector; - connector = drm_bridge_connector_init(bridge->dev, bridge->encoder); + connector = drm_bridge_connector_init(bridge->dev, bridge->encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { DRM_ERROR("Failed to initialize connector with drm\n"); return PTR_ERR(connector); diff --git a/drivers/gpu/drm/bridge/ite-it6263.c b/drivers/gpu/drm/bridge/ite-it6263.c index cf813672b4ff..b45d2b4913e5 100644 --- a/drivers/gpu/drm/bridge/ite-it6263.c +++ b/drivers/gpu/drm/bridge/ite-it6263.c @@ -680,7 +680,7 @@ static int it6263_bridge_attach(struct drm_bridge *bridge, if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) return 0; - connector = drm_bridge_connector_init(bridge->dev, encoder); + connector = drm_bridge_connector_init(bridge->dev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { ret = PTR_ERR(connector); dev_err(it->dev, "failed to initialize bridge connector: %d\n", diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index 464390372b34..14fc58b28de8 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -719,7 +719,8 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge, return 0; pdata->connector = drm_bridge_connector_init(pdata->bridge.dev, - pdata->bridge.encoder); + pdata->bridge.encoder, + BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(pdata->connector)) { ret = PTR_ERR(pdata->connector); goto err_initted_aux; diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c index 54f3f16d64c7..83951aaf1ade 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -634,13 +634,13 @@ static const struct drm_connector_hdmi_cec_funcs drm_bridge_connector_hdmi_cec_f * pointer otherwise. */ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, - struct drm_encoder *encoder) + struct drm_encoder *encoder, + unsigned int supported_formats) { struct drm_bridge_connector *bridge_connector; struct drm_connector *connector; struct i2c_adapter *ddc = NULL; struct drm_bridge *bridge, *panel_bridge = NULL; - unsigned int supported_formats = BIT(HDMI_COLORSPACE_RGB); unsigned int max_bpc = 8; bool support_hdcp = false; int connector_type; diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.c b/drivers/gpu/drm/imx/dcss/dcss-kms.c index 3633e8f3aff6..2eccf62d6c45 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-kms.c +++ b/drivers/gpu/drm/imx/dcss/dcss-kms.c @@ -97,7 +97,7 @@ static int dcss_kms_bridge_connector_init(struct dcss_kms_dev *kms) if (ret < 0) return ret; - kms->connector = drm_bridge_connector_init(ddev, encoder); + kms->connector = drm_bridge_connector_init(ddev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(kms->connector)) { dev_err(ddev->dev, "Unable to create bridge connector.\n"); return PTR_ERR(kms->connector); diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c index 61cab32e213a..15820e6ba057 100644 --- a/drivers/gpu/drm/mediatek/mtk_dpi.c +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c @@ -1057,7 +1057,7 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data) if (ret) goto err_cleanup; - dpi->connector = drm_bridge_connector_init(drm_dev, &dpi->encoder); + dpi->connector = drm_bridge_connector_init(drm_dev, &dpi->encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(dpi->connector)) { dev_err(dev, "Unable to create bridge connector\n"); ret = PTR_ERR(dpi->connector); diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c index d7726091819c..91afdbf676f0 100644 --- a/drivers/gpu/drm/mediatek/mtk_dsi.c +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c @@ -930,7 +930,7 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi) if (ret) goto err_cleanup_encoder; - dsi->connector = drm_bridge_connector_init(drm, &dsi->encoder); + dsi->connector = drm_bridge_connector_init(drm, &dsi->encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(dsi->connector)) { DRM_ERROR("Unable to create bridge connector\n"); ret = PTR_ERR(dsi->connector); diff --git a/drivers/gpu/drm/meson/meson_encoder_cvbs.c b/drivers/gpu/drm/meson/meson_encoder_cvbs.c index dc374bfc5951..a475fc34ca23 100644 --- a/drivers/gpu/drm/meson/meson_encoder_cvbs.c +++ b/drivers/gpu/drm/meson/meson_encoder_cvbs.c @@ -275,7 +275,8 @@ int meson_encoder_cvbs_probe(struct meson_drm *priv) } /* Initialize & attach Bridge Connector */ - connector = drm_bridge_connector_init(priv->drm, &meson_encoder_cvbs->encoder); + connector = drm_bridge_connector_init(priv->drm, + &meson_encoder_cvbs->encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) return dev_err_probe(priv->dev, PTR_ERR(connector), "Unable to create CVBS bridge connector\n"); diff --git a/drivers/gpu/drm/meson/meson_encoder_hdmi.c b/drivers/gpu/drm/meson/meson_encoder_hdmi.c index 8205ee56a691..7d157de42d1c 100644 --- a/drivers/gpu/drm/meson/meson_encoder_hdmi.c +++ b/drivers/gpu/drm/meson/meson_encoder_hdmi.c @@ -425,8 +425,8 @@ int meson_encoder_hdmi_probe(struct meson_drm *priv) } /* Initialize & attach Bridge Connector */ - meson_encoder_hdmi->connector = drm_bridge_connector_init(priv->drm, - &meson_encoder_hdmi->encoder); + meson_encoder_hdmi->connector = + drm_bridge_connector_init(priv->drm, &meson_encoder_hdmi->encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(meson_encoder_hdmi->connector)) { ret = dev_err_probe(priv->dev, PTR_ERR(meson_encoder_hdmi->connector), diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c index 0952c7f18abd..65c51d9f083e 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c @@ -226,7 +226,7 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms, return ret; } - connector = drm_bridge_connector_init(dev, encoder); + connector = drm_bridge_connector_init(dev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n"); return PTR_ERR(connector); diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c index 9a461ab2f32f..8d5299849be6 100644 --- a/drivers/gpu/drm/msm/dp/dp_drm.c +++ b/drivers/gpu/drm/msm/dp/dp_drm.c @@ -368,7 +368,8 @@ struct drm_connector *msm_dp_drm_connector_init(struct msm_dp *msm_dp_display, { struct drm_connector *connector = NULL; - connector = drm_bridge_connector_init(msm_dp_display->drm_dev, encoder); + connector = drm_bridge_connector_init(msm_dp_display->drm_dev, encoder, + BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) return connector; diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c index ca400924d4ee..4b87f4f78d38 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c @@ -479,7 +479,7 @@ int msm_dsi_manager_connector_init(struct msm_dsi *msm_dsi, if (ret) return ret; - connector = drm_bridge_connector_init(dev, encoder); + connector = drm_bridge_connector_init(dev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { DRM_ERROR("Unable to create bridge connector\n"); return PTR_ERR(connector); diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c index 5afac09c0d33..6da03b5143b0 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -182,7 +182,7 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi, } } - hdmi->connector = drm_bridge_connector_init(hdmi->dev, encoder); + hdmi->connector = drm_bridge_connector_init(hdmi->dev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(hdmi->connector)) { ret = PTR_ERR(hdmi->connector); DRM_DEV_ERROR(dev->dev, "failed to create HDMI connector: %d\n", ret); diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c index 7ecec7b04a8d..8d903683f6f6 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c @@ -125,7 +125,7 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, } /* Create the connector for the chain of bridges. */ - connector = drm_bridge_connector_init(&rcdu->ddev, &renc->base); + connector = drm_bridge_connector_init(&rcdu->ddev, &renc->base, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { dev_err(rcdu->dev, "failed to created connector for output %s (%ld)\n", diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c index 5e6dd16705e6..4578cf5b756b 100644 --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c @@ -114,7 +114,7 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu, } /* Create the connector for the chain of bridges. */ - connector = drm_bridge_connector_init(&rcdu->ddev, &renc->base); + connector = drm_bridge_connector_init(&rcdu->ddev, &renc->base, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { dev_err(rcdu->dev, "failed to created connector for output %s (%ld)\n", diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index b7e3f5dcf8d5..d591d660d059 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -1016,7 +1016,7 @@ static int cdn_dp_bind(struct device *dev, struct device *master, void *data) if (ret) return ret; - connector = drm_bridge_connector_init(drm_dev, encoder); + connector = drm_bridge_connector_init(drm_dev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { ret = PTR_ERR(connector); dev_err(dp->dev, "failed to init bridge connector: %d\n", ret); diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c index 7d531b6f4c09..58e24669ef34 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -563,7 +563,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master, return ret; } - connector = drm_bridge_connector_init(drm, encoder); + connector = drm_bridge_connector_init(drm, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { ret = PTR_ERR(connector); dev_err(hdmi->dev, "failed to init bridge connector: %d\n", ret); diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index 2411260db51d..3727035d896e 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -619,7 +619,7 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master, if (ret) goto err_free_bridge; - connector = drm_bridge_connector_init(lvds->drm_dev, encoder); + connector = drm_bridge_connector_init(lvds->drm_dev, encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { drm_err(drm_dev, "failed to initialize bridge connector: %pe\n", diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index 8cd2969e7d4b..6419d152c8b3 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c @@ -1568,7 +1568,7 @@ static int tegra_hdmi_init(struct host1x_client *client) return err; } - connector = drm_bridge_connector_init(drm, &hdmi->output.encoder); + connector = drm_bridge_connector_init(drm, &hdmi->output.encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { dev_err(client->dev, "failed to initialize bridge connector: %pe\n", diff --git a/drivers/gpu/drm/tegra/rgb.c b/drivers/gpu/drm/tegra/rgb.c index ff5a749710db..f0b18491fa11 100644 --- a/drivers/gpu/drm/tegra/rgb.c +++ b/drivers/gpu/drm/tegra/rgb.c @@ -348,7 +348,7 @@ int tegra_dc_rgb_init(struct drm_device *drm, struct tegra_dc *dc) if (err) return err; - connector = drm_bridge_connector_init(drm, &output->encoder); + connector = drm_bridge_connector_init(drm, &output->encoder, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { dev_err(output->dev, "failed to initialize bridge connector: %pe\n", diff --git a/drivers/gpu/drm/tidss/tidss_encoder.c b/drivers/gpu/drm/tidss/tidss_encoder.c index 81a04f767770..8829d995811b 100644 --- a/drivers/gpu/drm/tidss/tidss_encoder.c +++ b/drivers/gpu/drm/tidss/tidss_encoder.c @@ -115,7 +115,7 @@ int tidss_encoder_create(struct tidss_device *tidss, } /* Initializing the connector at the end of bridge-chain */ - connector = drm_bridge_connector_init(&tidss->ddev, enc); + connector = drm_bridge_connector_init(&tidss->ddev, enc, BIT(HDMI_COLORSPACE_RGB)); if (IS_ERR(connector)) { dev_err(tidss->dev, "bridge_connector create failed\n"); return PTR_ERR(connector); diff --git a/include/drm/drm_bridge_connector.h b/include/drm/drm_bridge_connector.h index 69630815fb09..e1446d8af8b7 100644 --- a/include/drm/drm_bridge_connector.h +++ b/include/drm/drm_bridge_connector.h @@ -11,6 +11,7 @@ struct drm_device; struct drm_encoder; struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, - struct drm_encoder *encoder); + struct drm_encoder *encoder, + unsigned int supported_colorformats); #endif /* __DRM_BRIDGE_CONNECTOR_H__ */ -- 2.47.2