Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 458a5d08 authored by Clarence Ip's avatar Clarence Ip Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/sde: trigger connector pre commit during disables



Trigger a final pre-commit callback on DSI connectors during
disable call flows. This allows for any final cleanup operations
to be performed.

Change-Id: I49a280bf7d31d75f91087e9631c36f1847f1ff10
Signed-off-by: default avatarClarence Ip <cip@codeaurora.org>
parent d9961b39
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -184,6 +184,9 @@ static void dp_bridge_disable(struct drm_bridge *drm_bridge)
	bridge = to_dp_bridge(drm_bridge);
	dp = bridge->display;

	if (dp && dp->connector)
		sde_connector_helper_bridge_disable(dp->connector);

	rc = dp->pre_disable(dp);
	if (rc) {
		pr_err("[%d] DP display pre disable failed, rc=%d\n",
+2 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ struct dsi_display_clk_info {
 * struct dsi_display - dsi display information
 * @pdev:             Pointer to platform device.
 * @drm_dev:          DRM device associated with the display.
 * @drm_conn:         Pointer to DRM connector associated with the display
 * @name:             Name of the display.
 * @display_type:     Display type as defined in device tree.
 * @list:             List pointer.
@@ -161,6 +162,7 @@ struct dsi_display_clk_info {
struct dsi_display {
	struct platform_device *pdev;
	struct drm_device *drm_dev;
	struct drm_connector *drm_conn;

	const char *name;
	const char *display_type;
+7 −0
Original line number Diff line number Diff line
@@ -197,12 +197,17 @@ static void dsi_bridge_enable(struct drm_bridge *bridge)
static void dsi_bridge_disable(struct drm_bridge *bridge)
{
	int rc = 0;
	struct dsi_display *display;
	struct dsi_bridge *c_bridge = to_dsi_bridge(bridge);

	if (!bridge) {
		pr_err("Invalid params\n");
		return;
	}
	display = c_bridge->display;

	if (display && display->drm_conn)
		sde_connector_helper_bridge_disable(display->drm_conn);

	rc = dsi_display_pre_disable(c_bridge->display);
	if (rc) {
@@ -369,6 +374,8 @@ int dsi_conn_set_info_blob(struct drm_connector *connector,
	if (!info || !dsi_display)
		return -EINVAL;

	dsi_display->drm_conn = connector;

	sde_kms_info_add_keystr(info,
		"display type", dsi_display->display_type);

+14 −0
Original line number Diff line number Diff line
@@ -425,6 +425,20 @@ void sde_connector_schedule_status_work(struct drm_connector *connector,
	}
}

void sde_connector_helper_bridge_disable(struct drm_connector *connector)
{
	int rc;

	if (!connector)
		return;

	/* trigger a final connector pre-kickoff for power mode updates */
	rc = sde_connector_pre_kickoff(connector);
	if (rc)
		SDE_ERROR("conn %d final pre kickoff failed %d\n",
				connector->base.id, rc);
}

static int _sde_connector_update_power_locked(struct sde_connector *c_conn)
{
	struct drm_connector *connector;
+7 −0
Original line number Diff line number Diff line
@@ -705,4 +705,11 @@ int sde_connector_get_mode_info(struct drm_connector_state *conn_state,
 * conn: Pointer to drm_connector struct
 */
void sde_conn_timeline_status(struct drm_connector *conn);

/**
 * sde_connector_helper_bridge_disable - helper function for drm bridge disable
 * @connector: Pointer to DRM connector object
 */
void sde_connector_helper_bridge_disable(struct drm_connector *connector);

#endif /* _SDE_CONNECTOR_H_ */