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

Commit 81d5533c authored by Xiaowen Wu's avatar Xiaowen Wu
Browse files

drm/msm/dsi-staging: move ext bridge init from postopen to hw_init



Move ext bridge init from postopen to hw_init to avoid file open racing
issue, also make sure ext bridge is functional during cont splash.

Add ext bridge checking in bind stage, defer if ext bridge is not attached.

CRs-Fixed: 2393741
Change-Id: Idfab267a0f8741e45bcaf41e92e1bf28b321f627
Signed-off-by: default avatarXiaowen Wu <wxiaowen@codeaurora.org>
parent 70f35db1
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -4854,6 +4854,15 @@ static int dsi_display_bind(struct device *dev,
	if (!display->disp_node)
		return 0;

	/* defer bind if ext bridge driver is not loaded */
	for (i = 0; i < display->ext_bridge_cnt; i++) {
		if (!of_drm_find_bridge(display->ext_bridge[i].node_of)) {
			pr_err("defer for bridge[%d] %s\n", i,
				display->ext_bridge[i].node_of->full_name);
			return -EPROBE_DEFER;
		}
	}

	mutex_lock(&display->display_lock);

	rc = dsi_display_validate_split_link(display);
+12 −14
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -1467,6 +1467,17 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
			SDE_ERROR("dsi %d connector init failed\n", i);
			dsi_display_drm_bridge_deinit(display);
			sde_encoder_destroy(encoder);
			continue;
		}

		rc = dsi_display_drm_ext_bridge_init(display,
					encoder,
					connector);
		if (rc) {
			SDE_ERROR("dsi %d ext bridge init failed\n", rc);
			dsi_display_drm_bridge_deinit(display);
			sde_encoder_destroy(encoder);
			sde_connector_destroy(connector);
		}
	}

@@ -2359,7 +2370,6 @@ static void _sde_kms_post_open(struct msm_kms *kms, struct drm_file *file)
	struct drm_connector *connector = NULL;
	struct drm_connector_list_iter conn_iter;
	struct sde_connector *sde_conn = NULL;
	int i;

	if (!kms) {
		SDE_ERROR("invalid kms\n");
@@ -2377,18 +2387,6 @@ static void _sde_kms_post_open(struct msm_kms *kms, struct drm_file *file)
	if (!dev->mode_config.poll_enabled)
		return;

	/* init external dsi bridge here to make sure ext bridge is probed*/
	for (i = 0; i < sde_kms->dsi_display_count; ++i) {
		struct dsi_display *dsi_display;

		dsi_display = sde_kms->dsi_displays[i];
		if (dsi_display->bridge) {
			dsi_display_drm_ext_bridge_init(dsi_display,
				dsi_display->bridge->base.encoder,
				dsi_display->drm_conn);
		}
	}

	mutex_lock(&dev->mode_config.mutex);
	drm_connector_list_iter_begin(dev, &conn_iter);
	drm_for_each_connector_iter(connector, &conn_iter) {