[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:
parent
780a87c4da
commit
201447bee4
1 changed files with 69 additions and 30 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue