17
17
#include <drm/drm_edid.h>
18
18
#include <drm/drm_managed.h>
19
19
#include <drm/drm_modeset_helper_vtables.h>
20
+ #include <drm/drm_print.h>
20
21
#include <drm/drm_probe_helper.h>
21
22
#include <drm/display/drm_hdmi_audio_helper.h>
22
23
#include <drm/display/drm_hdmi_helper.h>
@@ -181,11 +182,15 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
181
182
struct drm_bridge_connector * bridge_connector =
182
183
to_drm_bridge_connector (connector );
183
184
struct drm_bridge * detect = bridge_connector -> bridge_detect ;
185
+ struct drm_bridge * hdmi = bridge_connector -> bridge_hdmi ;
184
186
enum drm_connector_status status ;
185
187
186
188
if (detect ) {
187
189
status = detect -> funcs -> detect (detect );
188
190
191
+ if (hdmi )
192
+ drm_atomic_helper_connector_hdmi_hotplug (connector , status );
193
+
189
194
drm_bridge_connector_hpd_notify (connector , status );
190
195
} else {
191
196
switch (connector -> connector_type ) {
@@ -204,6 +209,16 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
204
209
return status ;
205
210
}
206
211
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
+
207
222
static void drm_bridge_connector_debugfs_init (struct drm_connector * connector ,
208
223
struct dentry * root )
209
224
{
@@ -232,6 +247,7 @@ static void drm_bridge_connector_reset(struct drm_connector *connector)
232
247
static const struct drm_connector_funcs drm_bridge_connector_funcs = {
233
248
.reset = drm_bridge_connector_reset ,
234
249
.detect = drm_bridge_connector_detect ,
250
+ .force = drm_bridge_connector_force ,
235
251
.fill_modes = drm_helper_probe_single_connector_modes ,
236
252
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state ,
237
253
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
@@ -277,6 +293,14 @@ static int drm_bridge_connector_get_modes(struct drm_connector *connector)
277
293
to_drm_bridge_connector (connector );
278
294
struct drm_bridge * bridge ;
279
295
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
+
280
304
/*
281
305
* If display exposes EDID, then we parse that in the normal way to
282
306
* build table of supported modes.
@@ -382,10 +406,25 @@ static int drm_bridge_connector_write_infoframe(struct drm_connector *connector,
382
406
return bridge -> funcs -> hdmi_write_infoframe (bridge , type , buffer , len );
383
407
}
384
408
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
+
385
423
static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_funcs = {
386
424
.tmds_char_rate_valid = drm_bridge_connector_tmds_char_rate_valid ,
387
425
.clear_infoframe = drm_bridge_connector_clear_infoframe ,
388
426
.write_infoframe = drm_bridge_connector_write_infoframe ,
427
+ .read_edid = drm_bridge_connector_read_edid ,
389
428
};
390
429
391
430
static int drm_bridge_connector_audio_startup (struct drm_connector * connector )
0 commit comments