1717#include <drm/drm_edid.h>
1818#include <drm/drm_managed.h>
1919#include <drm/drm_modeset_helper_vtables.h>
20+ #include <drm/drm_print.h>
2021#include <drm/drm_probe_helper.h>
2122#include <drm/display/drm_hdmi_audio_helper.h>
2223#include <drm/display/drm_hdmi_helper.h>
@@ -181,11 +182,15 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
181182 struct drm_bridge_connector * bridge_connector =
182183 to_drm_bridge_connector (connector );
183184 struct drm_bridge * detect = bridge_connector -> bridge_detect ;
185+ struct drm_bridge * hdmi = bridge_connector -> bridge_hdmi ;
184186 enum drm_connector_status status ;
185187
186188 if (detect ) {
187189 status = detect -> funcs -> detect (detect );
188190
191+ if (hdmi )
192+ drm_atomic_helper_connector_hdmi_hotplug (connector , status );
193+
189194 drm_bridge_connector_hpd_notify (connector , status );
190195 } else {
191196 switch (connector -> connector_type ) {
@@ -204,6 +209,16 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
204209 return status ;
205210}
206211
212+ static void drm_bridge_connector_force (struct drm_connector * connector )
213+ {
214+ struct drm_bridge_connector * bridge_connector =
215+ to_drm_bridge_connector (connector );
216+ struct drm_bridge * hdmi = bridge_connector -> bridge_hdmi ;
217+
218+ if (hdmi )
219+ drm_atomic_helper_connector_hdmi_force (connector );
220+ }
221+
207222static void drm_bridge_connector_debugfs_init (struct drm_connector * connector ,
208223 struct dentry * root )
209224{
@@ -232,6 +247,7 @@ static void drm_bridge_connector_reset(struct drm_connector *connector)
232247static const struct drm_connector_funcs drm_bridge_connector_funcs = {
233248 .reset = drm_bridge_connector_reset ,
234249 .detect = drm_bridge_connector_detect ,
250+ .force = drm_bridge_connector_force ,
235251 .fill_modes = drm_helper_probe_single_connector_modes ,
236252 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state ,
237253 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
@@ -277,6 +293,14 @@ static int drm_bridge_connector_get_modes(struct drm_connector *connector)
277293 to_drm_bridge_connector (connector );
278294 struct drm_bridge * bridge ;
279295
296+ /*
297+ * If there is a HDMI bridge, EDID has been updated as a part of
298+ * the .detect(). Just update the modes here.
299+ */
300+ bridge = bridge_connector -> bridge_hdmi ;
301+ if (bridge )
302+ return drm_edid_connector_add_modes (connector );
303+
280304 /*
281305 * If display exposes EDID, then we parse that in the normal way to
282306 * build table of supported modes.
@@ -382,10 +406,25 @@ static int drm_bridge_connector_write_infoframe(struct drm_connector *connector,
382406 return bridge -> funcs -> hdmi_write_infoframe (bridge , type , buffer , len );
383407}
384408
409+ static const struct drm_edid *
410+ drm_bridge_connector_read_edid (struct drm_connector * connector )
411+ {
412+ struct drm_bridge_connector * bridge_connector =
413+ to_drm_bridge_connector (connector );
414+ struct drm_bridge * bridge ;
415+
416+ bridge = bridge_connector -> bridge_edid ;
417+ if (!bridge )
418+ return NULL ;
419+
420+ return drm_bridge_edid_read (bridge , connector );
421+ }
422+
385423static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_funcs = {
386424 .tmds_char_rate_valid = drm_bridge_connector_tmds_char_rate_valid ,
387425 .clear_infoframe = drm_bridge_connector_clear_infoframe ,
388426 .write_infoframe = drm_bridge_connector_write_infoframe ,
427+ .read_edid = drm_bridge_connector_read_edid ,
389428};
390429
391430static int drm_bridge_connector_audio_startup (struct drm_connector * connector )
0 commit comments