Loading drivers/video/fbdev/msm/mdss_hdmi_edid.c +39 −3 Original line number Diff line number Diff line Loading @@ -1283,6 +1283,7 @@ static void hdmi_edid_extract_speaker_allocation_data( static void hdmi_edid_extract_sink_caps(struct hdmi_edid_ctrl *edid_ctrl, const u8 *in_buf) { u8 len; const u8 *vsd = NULL; if (!edid_ctrl) { Loading @@ -1297,11 +1298,27 @@ static void hdmi_edid_extract_sink_caps(struct hdmi_edid_ctrl *edid_ctrl, edid_ctrl->basic_audio_supp = false; pr_debug("%s: basic audio supported: %s\n", __func__, edid_ctrl->basic_audio_supp ? "true" : "false"); vsd = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, VENDOR_SPECIFIC_DATA_BLOCK, &len); if (vsd == NULL || len == 0 || len > MAX_DATA_BLOCK_SIZE) return; /* Max TMDS clock is in multiples of 5Mhz. */ edid_ctrl->sink_caps.max_pclk_in_hz = vsd[7] * 5000000; vsd = hdmi_edid_find_hfvsdb(in_buf); if (vsd) { /* Max pixel clock is in multiples of 5Mhz. */ /* * HF-VSDB define larger TMDS clock than VSDB. If sink * supports TMDS Character Rates > 340M, the sink shall * set Max_TMDS_Character_Rates appropriately and non-zero. * Or, if sink dose not support TMDS Character Rates > 340M, * the sink shall set this filed to 0. The max TMDS support * clock Rate = Max_TMDS_Character_Rates * 5Mhz. */ if (vsd[5] != 0) edid_ctrl->sink_caps.max_pclk_in_hz = vsd[5] * 5000000; edid_ctrl->sink_caps.scdc_present = Loading Loading @@ -2424,6 +2441,25 @@ bool hdmi_edid_is_dvi_mode(void *input) return true; } /** * hdmi_edid_get_sink_caps_max_tmds_clk() - get max tmds clock supported. * Sink side's limitation should be concerned as well. * @input: edid parser data * * Return: max tmds clock */ u32 hdmi_edid_get_sink_caps_max_tmds_clk(void *input) { struct hdmi_edid_ctrl *edid_ctrl = (struct hdmi_edid_ctrl *)input; if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return 0; } return edid_ctrl->sink_caps.max_pclk_in_hz; } /** * hdmi_edid_get_deep_color() - get deep color info supported by sink * @input: edid parser data Loading drivers/video/fbdev/msm/mdss_hdmi_edid.h +1 −0 Original line number Diff line number Diff line Loading @@ -81,5 +81,6 @@ void hdmi_edid_config_override(void *input, bool enable, struct hdmi_edid_override_data *data); void hdmi_edid_set_max_pclk_rate(void *input, u32 max_pclk_khz); bool hdmi_edid_is_audio_supported(void *input); u32 hdmi_edid_get_sink_caps_max_tmds_clk(void *input); #endif /* __HDMI_EDID_H__ */ drivers/video/fbdev/msm/mdss_hdmi_tx.c +8 −0 Original line number Diff line number Diff line Loading @@ -2224,6 +2224,14 @@ static int hdmi_tx_read_sink_info(struct hdmi_tx_ctrl *hdmi_ctrl) status = hdmi_edid_parser(data); if (status) DEV_ERR("%s: edid parse failed\n", __func__); else /* * Updata HDMI max supported TMDS clock, consider * both sink and source capicity. */ hdmi_edid_set_max_pclk_rate(data, min(hdmi_edid_get_sink_caps_max_tmds_clk(data) / 1000, hdmi_ctrl->max_pclk_khz)); } bail: if (hdmi_tx_enable_power(hdmi_ctrl, HDMI_TX_DDC_PM, false)) Loading Loading
drivers/video/fbdev/msm/mdss_hdmi_edid.c +39 −3 Original line number Diff line number Diff line Loading @@ -1283,6 +1283,7 @@ static void hdmi_edid_extract_speaker_allocation_data( static void hdmi_edid_extract_sink_caps(struct hdmi_edid_ctrl *edid_ctrl, const u8 *in_buf) { u8 len; const u8 *vsd = NULL; if (!edid_ctrl) { Loading @@ -1297,11 +1298,27 @@ static void hdmi_edid_extract_sink_caps(struct hdmi_edid_ctrl *edid_ctrl, edid_ctrl->basic_audio_supp = false; pr_debug("%s: basic audio supported: %s\n", __func__, edid_ctrl->basic_audio_supp ? "true" : "false"); vsd = hdmi_edid_find_block(in_buf, DBC_START_OFFSET, VENDOR_SPECIFIC_DATA_BLOCK, &len); if (vsd == NULL || len == 0 || len > MAX_DATA_BLOCK_SIZE) return; /* Max TMDS clock is in multiples of 5Mhz. */ edid_ctrl->sink_caps.max_pclk_in_hz = vsd[7] * 5000000; vsd = hdmi_edid_find_hfvsdb(in_buf); if (vsd) { /* Max pixel clock is in multiples of 5Mhz. */ /* * HF-VSDB define larger TMDS clock than VSDB. If sink * supports TMDS Character Rates > 340M, the sink shall * set Max_TMDS_Character_Rates appropriately and non-zero. * Or, if sink dose not support TMDS Character Rates > 340M, * the sink shall set this filed to 0. The max TMDS support * clock Rate = Max_TMDS_Character_Rates * 5Mhz. */ if (vsd[5] != 0) edid_ctrl->sink_caps.max_pclk_in_hz = vsd[5] * 5000000; edid_ctrl->sink_caps.scdc_present = Loading Loading @@ -2424,6 +2441,25 @@ bool hdmi_edid_is_dvi_mode(void *input) return true; } /** * hdmi_edid_get_sink_caps_max_tmds_clk() - get max tmds clock supported. * Sink side's limitation should be concerned as well. * @input: edid parser data * * Return: max tmds clock */ u32 hdmi_edid_get_sink_caps_max_tmds_clk(void *input) { struct hdmi_edid_ctrl *edid_ctrl = (struct hdmi_edid_ctrl *)input; if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return 0; } return edid_ctrl->sink_caps.max_pclk_in_hz; } /** * hdmi_edid_get_deep_color() - get deep color info supported by sink * @input: edid parser data Loading
drivers/video/fbdev/msm/mdss_hdmi_edid.h +1 −0 Original line number Diff line number Diff line Loading @@ -81,5 +81,6 @@ void hdmi_edid_config_override(void *input, bool enable, struct hdmi_edid_override_data *data); void hdmi_edid_set_max_pclk_rate(void *input, u32 max_pclk_khz); bool hdmi_edid_is_audio_supported(void *input); u32 hdmi_edid_get_sink_caps_max_tmds_clk(void *input); #endif /* __HDMI_EDID_H__ */
drivers/video/fbdev/msm/mdss_hdmi_tx.c +8 −0 Original line number Diff line number Diff line Loading @@ -2224,6 +2224,14 @@ static int hdmi_tx_read_sink_info(struct hdmi_tx_ctrl *hdmi_ctrl) status = hdmi_edid_parser(data); if (status) DEV_ERR("%s: edid parse failed\n", __func__); else /* * Updata HDMI max supported TMDS clock, consider * both sink and source capicity. */ hdmi_edid_set_max_pclk_rate(data, min(hdmi_edid_get_sink_caps_max_tmds_clk(data) / 1000, hdmi_ctrl->max_pclk_khz)); } bail: if (hdmi_tx_enable_power(hdmi_ctrl, HDMI_TX_DDC_PM, false)) Loading