1
0
Fork 0

[PATCH 2/4] drm/bridge-connector: Switch to using ->detect_ctx hook

In preparation to allow bridge drivers relying on the HDMI connector
framework to provide HDMI 2.0 support, make use of the atomic version of
drm_connector_funcs.detect() hook and invoke the newly introduced
drm_bridge_detect_ctx() helper.

In particular, this is going to be used for triggering an empty modeset
in drm_bridge_funcs.detect_ctx() callback, in order to manage SCDC
status lost on sink disconnects.

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
This commit is contained in:
dvab-sarma 2025-12-04 16:39:25 -06:00
parent 780a87c4da
commit 201447bee4

View file

@ -176,38 +176,38 @@ static void drm_bridge_connector_disable_hpd(struct drm_connector *connector)
* Bridge Connector Functions
*/
static enum drm_connector_status
drm_bridge_connector_detect(struct drm_connector *connector, bool force)
{
struct drm_bridge_connector *bridge_connector =
to_drm_bridge_connector(connector);
struct drm_bridge *detect = bridge_connector->bridge_detect;
struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
enum drm_connector_status status;
// static enum drm_connector_status
// drm_bridge_connector_detect(struct drm_connector *connector, bool force)
// {
// struct drm_bridge_connector *bridge_connector =
// to_drm_bridge_connector(connector);
// struct drm_bridge *detect = bridge_connector->bridge_detect;
// struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
// enum drm_connector_status status;
if (detect) {
status = detect->funcs->detect(detect);
// if (detect) {
// status = detect->funcs->detect(detect);
if (hdmi)
drm_atomic_helper_connector_hdmi_hotplug(connector, status);
// if (hdmi)
// drm_atomic_helper_connector_hdmi_hotplug(connector, status);
drm_bridge_connector_hpd_notify(connector, status);
} else {
switch (connector->connector_type) {
case DRM_MODE_CONNECTOR_DPI:
case DRM_MODE_CONNECTOR_LVDS:
case DRM_MODE_CONNECTOR_DSI:
case DRM_MODE_CONNECTOR_eDP:
status = connector_status_connected;
break;
default:
status = connector_status_unknown;
break;
}
}
// drm_bridge_connector_hpd_notify(connector, status);
// } else {
// switch (connector->connector_type) {
// case DRM_MODE_CONNECTOR_DPI:
// case DRM_MODE_CONNECTOR_LVDS:
// case DRM_MODE_CONNECTOR_DSI:
// case DRM_MODE_CONNECTOR_eDP:
// status = connector_status_connected;
// break;
// default:
// status = connector_status_unknown;
// break;
// }
// }
return status;
}
// return status;
// }
static void drm_bridge_connector_force(struct drm_connector *connector)
{
@ -246,7 +246,7 @@ static void drm_bridge_connector_reset(struct drm_connector *connector)
static const struct drm_connector_funcs drm_bridge_connector_funcs = {
.reset = drm_bridge_connector_reset,
.detect = drm_bridge_connector_detect,
//.detect = drm_bridge_connector_detect,
.force = drm_bridge_connector_force,
.fill_modes = drm_helper_probe_single_connector_modes,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
@ -259,6 +259,43 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = {
* Bridge Connector Helper Functions
*/
static int drm_bridge_connector_detect_ctx(struct drm_connector *connector,
struct drm_modeset_acquire_ctx *ctx,
bool force)
{
struct drm_bridge_connector *bridge_connector =
to_drm_bridge_connector(connector);
struct drm_bridge *detect = bridge_connector->bridge_detect;
struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
int ret;
if (detect) {
ret = drm_bridge_detect_ctx(detect, connector, ctx);
if (ret < 0)
return ret;
if (hdmi)
drm_atomic_helper_connector_hdmi_hotplug(connector, ret);
drm_bridge_connector_hpd_notify(connector, ret);
} else {
switch (connector->connector_type) {
case DRM_MODE_CONNECTOR_DPI:
case DRM_MODE_CONNECTOR_LVDS:
case DRM_MODE_CONNECTOR_DSI:
case DRM_MODE_CONNECTOR_eDP:
ret = connector_status_connected;
break;
default:
ret = connector_status_unknown;
break;
}
}
return ret;
}
static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector,
struct drm_bridge *bridge)
{
@ -266,7 +303,8 @@ static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector,
const struct drm_edid *drm_edid;
int n;
status = drm_bridge_connector_detect(connector, false);
//status = drm_bridge_connector_detect(connector, false);
status = drm_bridge_connector_detect_ctx(connector, NULL, false);
if (status != connector_status_connected)
goto no_edid;
@ -352,6 +390,7 @@ static int drm_bridge_connector_atomic_check(struct drm_connector *connector,
static const struct drm_connector_helper_funcs drm_bridge_connector_helper_funcs = {
.get_modes = drm_bridge_connector_get_modes,
.detect_ctx = drm_bridge_connector_detect_ctx,
.mode_valid = drm_bridge_connector_mode_valid,
.enable_hpd = drm_bridge_connector_enable_hpd,
.disable_hpd = drm_bridge_connector_disable_hpd,