Am Donnerstag, dem 24.02.2022 um 20:58 +0100 schrieb Marek Vasut: > Implement .atomic_check callback which prevents user space from setting > unsupported mode. The tc_edp_common_atomic_check() variant is already > prepared for DSI-to-DPI mode addition, which has different frequency > limits. > > Signed-off-by: Marek Vasut <marex@xxxxxxx> > Cc: Jonas Karlman <jonas@xxxxxxxxx> > Cc: Laurent Pinchart <Laurent.pinchart@xxxxxxxxxxxxxxxx> > Cc: Maxime Ripard <maxime@xxxxxxxxxx> > Cc: Neil Armstrong <narmstrong@xxxxxxxxxxxx> > Cc: Sam Ravnborg <sam@xxxxxxxxxxxx> Reviewed-by: Lucas Stach <l.stach@xxxxxxxxxxxxxx> > --- > V2: - New patch > V3: - Drop edp from tc_edp_common_atomic_check, > s@\<tc_edp_common_atomic_check\>@tc_common_atomic_check@g > - Return -EINVAL in case clock frequency is too high > --- > drivers/gpu/drm/bridge/tc358767.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c > index f88d8e616f7f8..e95153d9c1499 100644 > --- a/drivers/gpu/drm/bridge/tc358767.c > +++ b/drivers/gpu/drm/bridge/tc358767.c > @@ -1289,6 +1289,31 @@ static bool tc_bridge_mode_fixup(struct drm_bridge *bridge, > return true; > } > > +static int tc_common_atomic_check(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state, > + const unsigned int max_khz) > +{ > + tc_bridge_mode_fixup(bridge, &crtc_state->mode, > + &crtc_state->adjusted_mode); > + > + if (crtc_state->adjusted_mode.clock > max_khz) > + return -EINVAL; > + > + return 0; > +} > + > +static int tc_edp_atomic_check(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state) > +{ > + /* DPI->(e)DP interface clock limitation: upto 154 MHz */ > + return tc_common_atomic_check(bridge, bridge_state, crtc_state, > + conn_state, 154000); > +} > + > static enum drm_mode_status > tc_edp_mode_valid(struct drm_bridge *bridge, > const struct drm_display_info *info, > @@ -1463,6 +1488,7 @@ static const struct drm_bridge_funcs tc_edp_bridge_funcs = { > .detach = tc_edp_bridge_detach, > .mode_valid = tc_edp_mode_valid, > .mode_set = tc_bridge_mode_set, > + .atomic_check = tc_edp_atomic_check, > .atomic_enable = tc_edp_bridge_atomic_enable, > .atomic_disable = tc_edp_bridge_atomic_disable, > .mode_fixup = tc_bridge_mode_fixup,