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

Commit e86e6c91 authored by Xiaowen Wu's avatar Xiaowen Wu Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/dp: add display-type support in dp



Add display-type in connector's capability blob for DP-SST and
fixed-topology DP-MST. This allows user to configure DP as primary
display.

Change-Id: Ib5f6d9d72e8c42f88d38e06ed504848b8fc52029
Signed-off-by: default avatarXiaowen Wu <wxiaowen@codeaurora.org>
parent b2bd8f9e
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -2629,6 +2629,46 @@ static void dp_display_wakeup_phy_layer(struct dp_display *dp_display,
		hpd->wakeup_phy(hpd, wakeup);
}

static int dp_display_get_display_type(struct dp_display *dp_display,
		const char **display_type)
{
	struct dp_display_private *dp;

	if (!dp_display || !display_type) {
		pr_err("invalid input\n");
		return -EINVAL;
	}

	dp = container_of(dp_display, struct dp_display_private, dp_display);

	*display_type = dp->parser->display_type;

	return 0;
}

static int dp_display_mst_get_fixed_topology_display_type(
		struct dp_display *dp_display, u32 strm_id,
		const char **display_type)
{
	struct dp_display_private *dp;

	if (!dp_display || !display_type) {
		pr_err("invalid input\n");
		return -EINVAL;
	}

	if (strm_id >= DP_STREAM_MAX) {
		pr_err("invalid stream id:%d\n", strm_id);
		return -EINVAL;
	}

	dp = container_of(dp_display, struct dp_display_private, dp_display);

	*display_type = dp->parser->mst_fixed_display_type[strm_id];

	return 0;
}

static int dp_display_probe(struct platform_device *pdev)
{
	int rc = 0;
@@ -2707,6 +2747,9 @@ static int dp_display_probe(struct platform_device *pdev)
					dp_display_mst_get_fixed_topology_port;
	g_dp_display->wakeup_phy_layer =
					dp_display_wakeup_phy_layer;
	g_dp_display->get_display_type = dp_display_get_display_type;
	g_dp_display->mst_get_fixed_topology_display_type =
				dp_display_mst_get_fixed_topology_display_type;

	rc = component_add(&pdev->dev, &dp_display_comp_ops);
	if (rc) {
+5 −0
Original line number Diff line number Diff line
@@ -130,6 +130,11 @@ struct dp_display {
			struct drm_connector *connector, char *pps_cmd);
	void (*wakeup_phy_layer)(struct dp_display *dp_display,
			bool wakeup);
	int (*get_display_type)(struct dp_display *dp_display,
			const char **display_type);
	int (*mst_get_fixed_topology_display_type)(
			struct dp_display *dp_display, u32 strm_id,
			const char **display_type);
};

int dp_display_get_num_of_displays(void);
+13 −0
Original line number Diff line number Diff line
@@ -532,6 +532,19 @@ int dp_connector_get_modes(struct drm_connector *connector,
	return rc;
}

int dp_connnector_set_info_blob(struct drm_connector *connector,
		void *info, void *display, struct msm_mode_info *mode_info)
{
	struct dp_display *dp_display = display;
	const char *display_type = NULL;

	dp_display->get_display_type(dp_display, &display_type);
	sde_kms_info_add_keystr(info,
		"display type", display_type);

	return 0;
}

int dp_drm_bridge_init(void *data, struct drm_encoder *encoder)
{
	int rc = 0;
+12 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -114,6 +114,17 @@ int dp_connector_get_info(struct drm_connector *connector,
 */
void dp_connector_post_open(struct drm_connector *connector, void *display);

/**
 * dp_conn_set_info_blob - callback to perform info blob initialization
 * @connector: Pointer to drm connector structure
 * @info: Pointer to sde connector info structure
 * @display: Pointer to private display handle
 * @mode_info: Pointer to mode info structure
 * Returns: Zero on success
 */
int dp_connnector_set_info_blob(struct drm_connector *connector,
		void *info, void *display, struct msm_mode_info *mode_info);

int dp_drm_bridge_init(void *display,
	struct drm_encoder *encoder);

+26 −1
Original line number Diff line number Diff line
@@ -1706,12 +1706,37 @@ static void dp_mst_destroy_fixed_connector(struct drm_dp_mst_topology_mgr *mgr,
	dp_mst_destroy_connector(mgr, connector);
}

static int dp_mst_fixed_connnector_set_info_blob(
		struct drm_connector *connector,
		void *info, void *display, struct msm_mode_info *mode_info)
{
	struct sde_connector *c_conn = to_sde_connector(connector);
	struct dp_display *dp_display = display;
	struct dp_mst_private *mst = dp_display->dp_mst_prv_info;
	const char *display_type = NULL;
	int i;

	for (i = 0; i < MAX_DP_MST_DRM_BRIDGES; i++) {
		if (mst->mst_bridge[i].base.encoder != c_conn->encoder)
			continue;

		dp_display->mst_get_fixed_topology_display_type(dp_display,
			mst->mst_bridge[i].id, &display_type);
		sde_kms_info_add_keystr(info,
			"display type", display_type);

		break;
	}

	return 0;
}

static struct drm_connector *
dp_mst_drm_fixed_connector_init(struct dp_display *dp_display,
			struct drm_encoder *encoder)
{
	static const struct sde_connector_ops dp_mst_connector_ops = {
		.post_init  = NULL,
		.set_info_blob = dp_mst_fixed_connnector_set_info_blob,
		.detect     = dp_mst_fixed_connector_detect,
		.get_modes  = dp_mst_connector_get_modes,
		.mode_valid = dp_mst_connector_mode_valid,
Loading