Skip to content

Commit 4b5a79d

Browse files
committed
drm/bridge_connector: hook drm_atomic_helper_connector_hdmi_hotplug()
Extend drm_bridge_connector code to read the EDID and use it to update connector status if the bridge chain implements HDMI bridge. Performing it from the generic location minimizes individual bridge's code and enforces standard behaviour from all corresponding drivers. Reviewed-by: Maxime Ripard <[email protected]> Tested-by: Dave Stevenson <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent ab716b7 commit 4b5a79d

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

drivers/gpu/drm/display/drm_bridge_connector.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
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+
207222
static 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)
232247
static 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+
385423
static 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

391430
static int drm_bridge_connector_audio_startup(struct drm_connector *connector)

0 commit comments

Comments
 (0)