The SN75LVDS83 bridge support several input formats except the input format is directly related to the expected output format. Let's express that constraint by setting the bridge_state->output_bus_cfg.fmt field to the appropriate value. The previous element in the chain might be able to use this information to pick the appropriate output bus format. Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> --- drivers/gpu/drm/bridge/lvds-encoder.c | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c b/drivers/gpu/drm/bridge/lvds-encoder.c index da7013c5faf1..8d399d1828b0 100644 --- a/drivers/gpu/drm/bridge/lvds-encoder.c +++ b/drivers/gpu/drm/bridge/lvds-encoder.c @@ -159,9 +159,57 @@ static int lvds_encoder_remove(struct platform_device *pdev) return 0; } +static int sn75lvds83_atomic_check(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state) +{ + int ret; + + ret = drm_atomic_bridge_choose_output_bus_cfg(bridge_state, crtc_state, + conn_state); + if (ret) + return ret; + + /* + * The output bus format has a direct impact on the expected input bus + * format. + */ + switch (bridge_state->output_bus_cfg.fmt) { + case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: + case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: + /* + * JEIDA and SPWG variants theoretically require different pin + * mapping, but MEDIA_BUS_FMT_ definitions do not allow + * fined-grained pin placement definition, and this is + * something we expect to be taken care of at board design + * time, so let's ignore this for now. + * If it becomes a problem, we can always add a way to override + * the bus format with a FW property. + */ + bridge_state->input_bus_cfg.fmt = MEDIA_BUS_FMT_RGB888_1X24; + break; + case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: + bridge_state->input_bus_cfg.fmt = MEDIA_BUS_FMT_RGB666_1X18; + break; + default: + bridge_state->input_bus_cfg.fmt = 0; + break; + } + + /* Propagate the bus_flags. */ + bridge_state->input_bus_cfg.flags = bridge_state->output_bus_cfg.flags; + return 0; +} + +static const struct lvds_encoder_ops sn75lvds83_ops = { + .atomic_check = sn75lvds83_atomic_check, +}; + static const struct of_device_id lvds_encoder_match[] = { { .compatible = "lvds-encoder" }, { .compatible = "thine,thc63lvdm83d" }, + { .compatible = "ti,sn75lvds83", .data = &sn75lvds83_ops }, {}, }; MODULE_DEVICE_TABLE(of, lvds_encoder_match); -- 2.21.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel