Loading drivers/gpu/drm/msm/dp/dp_audio.c +15 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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)); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading drivers/gpu/drm/msm/dp/dp_catalog.c +96 −98 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; Loading @@ -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; Loading @@ -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) Loading @@ -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"); Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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: Loading @@ -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"); Loading @@ -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); Loading drivers/gpu/drm/msm/dp/dp_catalog.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); }; Loading drivers/gpu/drm/msm/dp/dp_ctrl.c +20 −42 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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"); Loading Loading @@ -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; Loading Loading @@ -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: Loading drivers/gpu/drm/msm/dp/dp_ctrl.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/gpu/drm/msm/dp/dp_audio.c +15 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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)); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading
drivers/gpu/drm/msm/dp/dp_catalog.c +96 −98 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; Loading @@ -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; Loading @@ -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) Loading @@ -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"); Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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: Loading @@ -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"); Loading @@ -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); Loading
drivers/gpu/drm/msm/dp/dp_catalog.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); }; Loading
drivers/gpu/drm/msm/dp/dp_ctrl.c +20 −42 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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"); Loading Loading @@ -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; Loading Loading @@ -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: Loading
drivers/gpu/drm/msm/dp/dp_ctrl.h +2 −0 Original line number Diff line number Diff line Loading @@ -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