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

Commit 6ee75e91 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/dp: fix programming of DisplayPort SDP registers"

parents 68f1f99b 9fe06237
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ static void dp_audio_stream_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 1 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
	value &= 0x0000ffff;

	new_value = 0x02;
	parity_byte = dp_header_get_parity(new_value);
@@ -87,7 +88,8 @@ static void dp_audio_stream_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 2 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
	new_value = value;
	value &= 0xffff0000;
	new_value = 0x0;
	parity_byte = dp_header_get_parity(new_value);
	value |= ((new_value << HEADER_BYTE_2_BIT)
			| (parity_byte << PARITY_BYTE_2_BIT));
@@ -100,6 +102,7 @@ static void dp_audio_stream_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 3 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
	value &= 0x0000ffff;

	new_value = audio->channels - 1;
	parity_byte = dp_header_get_parity(new_value);
@@ -121,6 +124,7 @@ static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 1 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
	value &= 0x0000ffff;

	new_value = 0x1;
	parity_byte = dp_header_get_parity(new_value);
@@ -134,6 +138,7 @@ static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 2 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
	value &= 0xffff0000;

	new_value = 0x17;
	parity_byte = dp_header_get_parity(new_value);
@@ -147,6 +152,7 @@ static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 3 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
	value &= 0x0000ffff;

	new_value = (0x0 | (0x11 << 2));
	parity_byte = dp_header_get_parity(new_value);
@@ -167,6 +173,7 @@ static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 1 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
	value &= 0x0000ffff;

	new_value = 0x84;
	parity_byte = dp_header_get_parity(new_value);
@@ -180,6 +187,7 @@ static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 2 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
	value &= 0xffff0000;

	new_value = 0x1b;
	parity_byte = dp_header_get_parity(new_value);
@@ -193,6 +201,7 @@ static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 3 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
	value &= 0x0000ffff;

	new_value = (0x0 | (0x11 << 2));
	parity_byte = dp_header_get_parity(new_value);
@@ -213,6 +222,7 @@ static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 1 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
	value &= 0x0000ffff;

	new_value = 0x05;
	parity_byte = dp_header_get_parity(new_value);
@@ -226,6 +236,7 @@ static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 2 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
	value &= 0xffff0000;

	new_value = 0x0F;
	parity_byte = dp_header_get_parity(new_value);
@@ -239,6 +250,7 @@ static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 3 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
	value &= 0x0000ffff;

	new_value = 0x0;
	parity_byte = dp_header_get_parity(new_value);
@@ -259,6 +271,7 @@ static void dp_audio_isrc_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 1 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
	value &= 0x0000ffff;

	new_value = 0x06;
	parity_byte = dp_header_get_parity(new_value);
@@ -272,6 +285,7 @@ static void dp_audio_isrc_sdp(struct dp_audio_private *audio)
	/* Config header and parity byte 2 */
	value = dp_audio_get_header(catalog,
			DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
	value &= 0xffff0000;

	new_value = 0x0F;
	parity_byte = dp_header_get_parity(new_value);
+96 −98
Original line number Diff line number Diff line
@@ -338,6 +338,7 @@ static void dp_catalog_panel_setup_infoframe_sdp(struct dp_catalog_panel *panel)
	struct drm_msm_ext_hdr_metadata *hdr;
	void __iomem *base;
	u32 header, parity, data;
	u8 buf[SZ_128], off = 0;

	if (!panel) {
		pr_err("invalid input\n");
@@ -354,8 +355,8 @@ static void dp_catalog_panel_setup_infoframe_sdp(struct dp_catalog_panel *panel)
	data   = ((header << HEADER_BYTE_1_BIT)
			| (parity << PARITY_BYTE_1_BIT));
	dp_write(base + MMSS_DP_VSCEXT_0, data);
	pr_debug("Header#1: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_VSCEXT_0: 0x%x\n", data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	/* HEADER BYTE 2 */
	header = panel->hdr_data.vscext_header_byte2;
@@ -363,8 +364,6 @@ static void dp_catalog_panel_setup_infoframe_sdp(struct dp_catalog_panel *panel)
	data   = ((header << HEADER_BYTE_2_BIT)
			| (parity << PARITY_BYTE_2_BIT));
	dp_write(base + MMSS_DP_VSCEXT_1, data);
	pr_debug("Header#2: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_VSCEXT_1: 0x%x\n", data);

	/* HEADER BYTE 3 */
	header = panel->hdr_data.vscext_header_byte3;
@@ -373,101 +372,71 @@ static void dp_catalog_panel_setup_infoframe_sdp(struct dp_catalog_panel *panel)
			| (parity << PARITY_BYTE_3_BIT));
	data |= dp_read(base + MMSS_DP_VSCEXT_1);
	dp_write(base + MMSS_DP_VSCEXT_1, data);
	pr_debug("Header#3: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_VSCEXT_1: 0x%x\n", data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = panel->hdr_data.version;
	data |= panel->hdr_data.length << 8;
	data |= hdr->eotf << 16;
	pr_debug("DP_VSCEXT_2: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_2, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = (DP_GET_LSB(hdr->display_primaries_x[0]) |
		(DP_GET_MSB(hdr->display_primaries_x[0]) << 8) |
		(DP_GET_LSB(hdr->display_primaries_y[0]) << 16) |
		(DP_GET_MSB(hdr->display_primaries_y[0]) << 24));
	pr_debug("DP_VSCEXT_3: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_3, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = (DP_GET_LSB(hdr->display_primaries_x[1]) |
		(DP_GET_MSB(hdr->display_primaries_x[1]) << 8) |
		(DP_GET_LSB(hdr->display_primaries_y[1]) << 16) |
		(DP_GET_MSB(hdr->display_primaries_y[1]) << 24));
	pr_debug("DP_VSCEXT_4: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_4, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = (DP_GET_LSB(hdr->display_primaries_x[2]) |
		(DP_GET_MSB(hdr->display_primaries_x[2]) << 8) |
		(DP_GET_LSB(hdr->display_primaries_y[2]) << 16) |
		(DP_GET_MSB(hdr->display_primaries_y[2]) << 24));
	pr_debug("DP_VSCEXT_5: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_5, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = (DP_GET_LSB(hdr->white_point_x) |
		(DP_GET_MSB(hdr->white_point_x) << 8) |
		(DP_GET_LSB(hdr->white_point_y) << 16) |
		(DP_GET_MSB(hdr->white_point_y) << 24));
	pr_debug("DP_VSCEXT_6: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_6, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = (DP_GET_LSB(hdr->max_luminance) |
		(DP_GET_MSB(hdr->max_luminance) << 8) |
		(DP_GET_LSB(hdr->min_luminance) << 16) |
		(DP_GET_MSB(hdr->min_luminance) << 24));
	pr_debug("DP_VSCEXT_7: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_7, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = (DP_GET_LSB(hdr->max_content_light_level) |
		(DP_GET_MSB(hdr->max_content_light_level) << 8) |
		(DP_GET_LSB(hdr->max_average_light_level) << 16) |
		(DP_GET_MSB(hdr->max_average_light_level) << 24));
	pr_debug("DP_VSCEXT_8: 0x%x\n", data);
	dp_write(base + MMSS_DP_VSCEXT_8, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	dp_write(base + MMSS_DP_VSCEXT_9, 0x00);
}

static void dp_catalog_panel_setup_ext_sdp(struct dp_catalog_panel *panel)
{
	struct dp_catalog_private *catalog;
	void __iomem *base;
	u32 header, parity, data;
	data = 0;
	dp_write(base + MMSS_DP_VSCEXT_9, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	if (!panel) {
		pr_err("invalid input\n");
		return;
	}

	dp_catalog_get_priv(panel);
	base = catalog->io->dp_link.base;

	/* HEADER BYTE 1 */
	header = panel->hdr_data.ext_header_byte1;
	parity = dp_header_get_parity(header);
	data   = ((header << HEADER_BYTE_1_BIT)
			| (parity << PARITY_BYTE_1_BIT));
	dp_write(base + MMSS_DP_EXTENSION_0, data);
	pr_debug("Header#1: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_EXTENSION_0: 0x%x\n", data);

	/* HEADER BYTE 2 */
	header = panel->hdr_data.ext_header_byte2;
	parity = dp_header_get_parity(header);
	data   = ((header << HEADER_BYTE_2_BIT)
			| (parity << PARITY_BYTE_2_BIT));
	dp_write(base + MMSS_DP_EXTENSION_1, data);
	pr_debug("Header#2: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_EXTENSION_1: 0x%x\n", data);

	dp_write(base + MMSS_DP_EXTENSION_1, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_2, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_3, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_4, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_5, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_6, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_7, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_8, 0x5AA55AA5);
	dp_write(base + MMSS_DP_EXTENSION_9, 0x5AA55AA5);
	print_hex_dump(KERN_DEBUG, "[drm-dp] VSCEXT: ",
			DUMP_PREFIX_NONE, 16, 4, buf, off, false);
}

static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
@@ -475,7 +444,8 @@ static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
	struct dp_catalog_private *catalog;
	void __iomem *base;
	u32 header, parity, data;
	u8 bpc;
	u8 bpc, off = 0;
	u8 buf[SZ_128];

	if (!panel) {
		pr_err("invalid input\n");
@@ -483,7 +453,7 @@ static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
	}

	dp_catalog_get_priv(panel);
	base = catalog->io->ctrl_io.base;
	base = catalog->io->dp_link.base;

	/* HEADER BYTE 1 */
	header = panel->hdr_data.vsc_header_byte1;
@@ -491,8 +461,8 @@ static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
	data   = ((header << HEADER_BYTE_1_BIT)
			| (parity << PARITY_BYTE_1_BIT));
	dp_write(base + MMSS_DP_GENERIC0_0, data);
	pr_debug("Header#1: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_GENERIC0_0: 0x%x\n", data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	/* HEADER BYTE 2 */
	header = panel->hdr_data.vsc_header_byte2;
@@ -500,8 +470,6 @@ static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
	data   = ((header << HEADER_BYTE_2_BIT)
			| (parity << PARITY_BYTE_2_BIT));
	dp_write(base + MMSS_DP_GENERIC0_1, data);
	pr_debug("Header#2: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_GENERIC0_1: 0x%x\n", data);

	/* HEADER BYTE 3 */
	header = panel->hdr_data.vsc_header_byte3;
@@ -510,14 +478,25 @@ static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
			| (parity << PARITY_BYTE_3_BIT));
	data |= dp_read(base + MMSS_DP_GENERIC0_1);
	dp_write(base + MMSS_DP_GENERIC0_1, data);
	pr_debug("Header#3: 0x%x, parity = 0x%x\n", header, parity);
	pr_debug("DP_GENERIC0_1: 0x%x\n", data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = 0;
	dp_write(base + MMSS_DP_GENERIC0_2, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	dp_write(base + MMSS_DP_GENERIC0_2, 0x00);
	dp_write(base + MMSS_DP_GENERIC0_3, 0x00);
	dp_write(base + MMSS_DP_GENERIC0_4, 0x00);
	dp_write(base + MMSS_DP_GENERIC0_5, 0x00);
	dp_write(base + MMSS_DP_GENERIC0_3, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	dp_write(base + MMSS_DP_GENERIC0_4, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	dp_write(base + MMSS_DP_GENERIC0_5, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	switch (panel->hdr_data.bpc) {
	default:
@@ -538,18 +517,32 @@ static void dp_catalog_panel_setup_vsc_sdp(struct dp_catalog_panel *panel)
		((panel->hdr_data.dynamic_range & 0x1) << 15) |
		((panel->hdr_data.content_type & 0x7) << 16);

	pr_debug("DP_GENERIC0_6: 0x%x\n", data);
	dp_write(base + MMSS_DP_GENERIC0_6, data);
	dp_write(base + MMSS_DP_GENERIC0_7, 0x00);
	dp_write(base + MMSS_DP_GENERIC0_8, 0x00);
	dp_write(base + MMSS_DP_GENERIC0_9, 0x00);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	data = 0;
	dp_write(base + MMSS_DP_GENERIC0_7, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	dp_write(base + MMSS_DP_GENERIC0_8, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	dp_write(base + MMSS_DP_GENERIC0_9, data);
	memcpy(buf + off, &data, sizeof(data));
	off += sizeof(data);

	print_hex_dump(KERN_DEBUG, "[drm-dp] VSC: ",
			DUMP_PREFIX_NONE, 16, 4, buf, off, false);
}

static void dp_catalog_panel_config_hdr(struct dp_catalog_panel *panel)
static void dp_catalog_panel_config_hdr(struct dp_catalog_panel *panel, bool en)
{
	struct dp_catalog_private *catalog;
	void __iomem *base;
	u32 cfg, cfg2;
	u32 cfg, cfg2, misc;

	if (!panel) {
		pr_err("invalid input\n");
@@ -560,39 +553,44 @@ static void dp_catalog_panel_config_hdr(struct dp_catalog_panel *panel)
	base = catalog->io->dp_link.base;

	cfg = dp_read(base + MMSS_DP_SDP_CFG);
	/* EXTENSION_SDP_EN */
	cfg |= BIT(4);
	cfg2 = dp_read(base + MMSS_DP_SDP_CFG2);
	misc = dp_read(base + DP_MISC1_MISC0);

	/* VSCEXT_SDP_EN */
	cfg |= BIT(16);
	if (en) {
		/* VSCEXT_SDP_EN, GEN0_SDP_EN */
		cfg |= BIT(16) | BIT(17);
		dp_write(base + MMSS_DP_SDP_CFG, cfg);

	/* GEN0_SDP_EN */
	cfg |= BIT(17);
		/* EXTN_SDPSIZE GENERIC0_SDPSIZE */
		cfg2 |= BIT(15) | BIT(16);
		dp_write(base + MMSS_DP_SDP_CFG2, cfg2);

	/* GEN1_SDP_EN */
	cfg |= BIT(18);
	dp_write(base + MMSS_DP_SDP_CFG, cfg);
		dp_catalog_panel_setup_vsc_sdp(panel);
		dp_catalog_panel_setup_infoframe_sdp(panel);

	cfg2 = dp_read(base + MMSS_DP_SDP_CFG2);
	/* EXTN_SDPSIZE */
	cfg2 |= BIT(15);
		/* indicates presence of VSC (BIT(6) of MISC1) */
		misc |= BIT(14);

	/* GENERIC0_SDPSIZE */
	cfg |= BIT(16);
		if (panel->hdr_data.hdr_meta.eotf)
			pr_debug("Enabled\n");
		else
			pr_debug("Reset\n");
	} else {
		/* VSCEXT_SDP_EN, GEN0_SDP_EN */
		cfg &= ~BIT(16) & ~BIT(17);
		dp_write(base + MMSS_DP_SDP_CFG, cfg);

	/* GENERIC1_SDPSIZE */
	cfg |= BIT(17);
		/* EXTN_SDPSIZE GENERIC0_SDPSIZE */
		cfg2 &= ~BIT(15) & ~BIT(16);
		dp_write(base + MMSS_DP_SDP_CFG2, cfg2);

	dp_catalog_panel_setup_ext_sdp(panel);
	dp_catalog_panel_setup_vsc_sdp(panel);
	dp_catalog_panel_setup_infoframe_sdp(panel);
		/* switch back to MSA */
		misc &= ~BIT(14);

	cfg = dp_read(base + DP_MISC1_MISC0);
	/* Indicates presence of VSC */
	cfg |= BIT(6) << 8;
		pr_debug("Disabled\n");
	}

	dp_write(base + DP_MISC1_MISC0, cfg);
	dp_write(base + DP_MISC1_MISC0, misc);

	dp_write(base + MMSS_DP_SDP_CFG3, 0x01);
	dp_write(base + MMSS_DP_SDP_CFG3, 0x00);
+1 −1
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ struct dp_catalog_panel {
	u32 display_hctl;

	int (*timing_cfg)(struct dp_catalog_panel *panel);
	void (*config_hdr)(struct dp_catalog_panel *panel);
	void (*config_hdr)(struct dp_catalog_panel *panel, bool en);
	void (*tpg_config)(struct dp_catalog_panel *panel, bool enable);
	void (*config_spd)(struct dp_catalog_panel *panel);
};
+20 −42
Original line number Diff line number Diff line
@@ -1168,9 +1168,17 @@ static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl)
	return false;
}

static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl)
static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl)
{
	int ret = 0;
	struct dp_ctrl_private *ctrl;

	if (!dp_ctrl) {
		pr_err("Invalid input data\n");
		return -EINVAL;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);

	ctrl->dp_ctrl.push_idle(&ctrl->dp_ctrl);
	ctrl->dp_ctrl.reset(&ctrl->dp_ctrl);
@@ -1214,9 +1222,17 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl)
	return ret;
}

static void dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl)
static void dp_ctrl_process_phy_test_request(struct dp_ctrl *dp_ctrl)
{
	int ret = 0;
	struct dp_ctrl_private *ctrl;

	if (!dp_ctrl) {
		pr_err("Invalid input data\n");
		return;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);

	if (!ctrl->link->phy_params.phy_test_pattern_sel) {
		pr_debug("no test pattern selected by sink\n");
@@ -1294,45 +1310,6 @@ static void dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl)
			dp_link_get_phy_test_pattern(pattern_requested));
}

static bool dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl)
{
	struct dp_ctrl_private *ctrl;
	u32 sink_request = 0x0;
	bool req_handled = false;

	if (!dp_ctrl) {
		pr_err("invalid input\n");
		goto end;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);
	sink_request = ctrl->link->sink_request;

	if (sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) {
		pr_info("PHY_TEST_PATTERN\n");
		dp_ctrl_process_phy_test_request(ctrl);

		req_handled = true;
	}

	if (sink_request & DP_LINK_STATUS_UPDATED) {
		pr_info("DP_LINK_STATUS_UPDATED\n");
		dp_ctrl_link_maintenance(ctrl);

		req_handled = true;
	}

	if (sink_request & DP_TEST_LINK_TRAINING) {
		pr_info("DP_TEST_LINK_TRAINING\n");
		ctrl->link->send_test_response(ctrl->link);
		dp_ctrl_link_maintenance(ctrl);

		req_handled = true;
	}
end:
	return req_handled;
}

static void dp_ctrl_reset(struct dp_ctrl *dp_ctrl)
{
	struct dp_ctrl_private *ctrl;
@@ -1505,7 +1482,8 @@ struct dp_ctrl *dp_ctrl_get(struct dp_ctrl_in *in)
	dp_ctrl->abort     = dp_ctrl_abort;
	dp_ctrl->isr       = dp_ctrl_isr;
	dp_ctrl->reset	   = dp_ctrl_reset;
	dp_ctrl->handle_sink_request = dp_ctrl_handle_sink_request;
	dp_ctrl->link_maintenance = dp_ctrl_link_maintenance;
	dp_ctrl->process_phy_test_request = dp_ctrl_process_phy_test_request;

	return dp_ctrl;
error:
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ struct dp_ctrl {
	void (*abort)(struct dp_ctrl *dp_ctrl);
	void (*isr)(struct dp_ctrl *dp_ctrl);
	bool (*handle_sink_request)(struct dp_ctrl *dp_ctrl);
	void (*process_phy_test_request)(struct dp_ctrl *dp_ctrl);
	int (*link_maintenance)(struct dp_ctrl *dp_ctrl);
};

struct dp_ctrl_in {
Loading