Let's implement the hardware state readout for the sii902x bridge now that we have all the infrastructure in place.
Signed-off-by: Maxime Ripard <mrip...@kernel.org> --- drivers/gpu/drm/bridge/sii902x.c | 51 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c index d537b1d036fb09ce55a690a0809dcc28fc0f41be..5ffceb9131540d2cb1b82a74b4f7cec9bc7fd8ca 100644 --- a/drivers/gpu/drm/bridge/sii902x.c +++ b/drivers/gpu/drm/bridge/sii902x.c @@ -540,17 +540,66 @@ sii902x_bridge_mode_valid(struct drm_bridge *bridge, return MODE_CLOCK_HIGH; return MODE_OK; } +static int sii902x_bridge_connector_hw_readout(struct drm_bridge *bridge, + struct drm_atomic_state *state, + struct drm_connector_state *conn_state) +{ + struct sii902x *sii902x = bridge_to_sii902x(bridge); + struct drm_connector *connector = conn_state->connector; + struct drm_crtc_state *crtc_state; + struct drm_encoder *encoder; + struct drm_crtc *crtc; + + if (regmap_test_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA, SII902X_SYS_CTRL_PWR_DWN)) + return 0; + + encoder = bridge->encoder; + crtc = encoder->funcs->get_current_crtc(encoder); + if (!crtc) + return -ENODEV; + + crtc_state = drm_atomic_get_old_crtc_state(state, crtc); + if (!crtc_state) + return -ENODEV; + + crtc_state->encoder_mask |= drm_encoder_mask(encoder); + crtc_state->connector_mask |= drm_connector_mask(connector); + + conn_state->crtc = crtc; + conn_state->best_encoder = encoder; + + return 0; +} + +static int sii902x_bridge_readout_state(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state) +{ + struct sii902x *sii902x = bridge_to_sii902x(bridge); + + if (regmap_test_bits(sii902x->regmap, SII902X_SYS_CTRL_DATA, SII902X_SYS_CTRL_PWR_DWN)) + return 0; + + /* bridge_state is pretty trivial, we don't have anything to do here */ + + return 0; +} + static const struct drm_bridge_funcs sii902x_bridge_funcs = { .attach = sii902x_bridge_attach, .mode_set = sii902x_bridge_mode_set, .atomic_disable = sii902x_bridge_atomic_disable, .atomic_enable = sii902x_bridge_atomic_enable, + .connector_hw_readout = sii902x_bridge_connector_hw_readout, .detect = sii902x_bridge_detect, .edid_read = sii902x_bridge_edid_read, + .atomic_compare_state = drm_atomic_helper_bridge_compare_state, + .atomic_readout_state = sii902x_bridge_readout_state, .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, .atomic_get_input_bus_fmts = sii902x_bridge_atomic_get_input_bus_fmts, .atomic_check = sii902x_bridge_atomic_check, @@ -1136,11 +1185,11 @@ static int sii902x_init(struct sii902x *sii902x) if (ret) goto err_unreg_audio; sii902x->bridge.of_node = dev->of_node; sii902x->bridge.timings = &default_sii902x_timings; - sii902x->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; + sii902x->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_CONNECTOR_HW_READOUT; sii902x->bridge.type = DRM_MODE_CONNECTOR_HDMIA; if (sii902x->i2c->irq > 0) sii902x->bridge.ops |= DRM_BRIDGE_OP_HPD; -- 2.50.1