summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuan Zhao <yzhao@codeaurora.org>2017-07-14 14:10:31 +0800
committerYuan Zhao <yzhao@codeaurora.org>2017-07-14 14:10:31 +0800
commitd2df88ebbc0e0595780a090760e34e23aea0997f (patch)
tree01150e352923bd921bb79f50d3a487f2b6c3bb65
parentd9fbe4b9210bcf0b7553d224f1c7390c15b91022 (diff)
msm: mdss: sink mode needs to be read from EDID
DVI/HDMI mode of sink could be read from EDID. Now, we set the mode according to the video format. For a HDMI device, if we choose VIC mode larger than 127, it would be set as DVI mode. It would be confused that a HDMI device is treated as a DVI device, and would lead some issue for display. CRs-Fixed: 2030216 Change-Id: I122faf6f4f8d7e620bc6ce7ce1b5757caa188b8e Signed-off-by: zhaoyuan <yzhao@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_dba_utils.c3
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_edid.c33
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_edid.h6
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_tx.c14
4 files changed, 19 insertions, 37 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dba_utils.c b/drivers/video/fbdev/msm/mdss_dba_utils.c
index c6ff92ed1686..3330f8f62b78 100644
--- a/drivers/video/fbdev/msm/mdss_dba_utils.c
+++ b/drivers/video/fbdev/msm/mdss_dba_utils.c
@@ -576,6 +576,7 @@ int mdss_dba_utils_video_on(void *data, struct mdss_panel_info *pinfo)
video_cfg.h_pulse_width = pinfo->lcdc.h_pulse_width;
video_cfg.v_pulse_width = pinfo->lcdc.v_pulse_width;
video_cfg.pclk_khz = (unsigned long)pinfo->clk_rate / 1000;
+ video_cfg.hdmi_mode = !hdmi_edid_is_dvi_mode(ud->edid_data);
/* Calculate number of DSI lanes configured */
video_cfg.num_of_input_lanes = 0;
@@ -591,8 +592,6 @@ int mdss_dba_utils_video_on(void *data, struct mdss_panel_info *pinfo)
/* Get scan information from EDID */
video_cfg.vic = mdss_dba_get_vic_panel_info(ud, pinfo);
ud->current_vic = video_cfg.vic;
- video_cfg.hdmi_mode = hdmi_edid_get_sink_mode(ud->edid_data,
- video_cfg.vic);
video_cfg.scaninfo = hdmi_edid_get_sink_scaninfo(ud->edid_data,
video_cfg.vic);
if (ud->ops.video_on)
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_edid.c b/drivers/video/fbdev/msm/mdss_hdmi_edid.c
index a953dd1a2ac2..abd2192997e5 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_edid.c
+++ b/drivers/video/fbdev/msm/mdss_hdmi_edid.c
@@ -62,6 +62,11 @@
#define EDID_VENDOR_ID_SIZE 4
#define EDID_IEEE_REG_ID 0x0c03
+enum edid_sink_mode {
+ SINK_MODE_DVI,
+ SINK_MODE_HDMI
+};
+
enum luminance_value {
NO_LUMINANCE_DATA = 3,
MAXIMUM_LUMINANCE = 4,
@@ -2418,7 +2423,7 @@ end:
return scaninfo;
} /* hdmi_edid_get_sink_scaninfo */
-u32 hdmi_edid_get_sink_mode(void *input, u32 mode)
+static u32 hdmi_edid_get_sink_mode(void *input)
{
struct hdmi_edid_ctrl *edid_ctrl = (struct hdmi_edid_ctrl *)input;
bool sink_mode;
@@ -2431,13 +2436,8 @@ u32 hdmi_edid_get_sink_mode(void *input, u32 mode)
if (edid_ctrl->edid_override &&
(edid_ctrl->override_data.sink_mode != -1))
sink_mode = edid_ctrl->override_data.sink_mode;
- else {
- if (edid_ctrl->sink_mode &&
- (mode > 0 && mode <= HDMI_EVFRMT_END))
- sink_mode = SINK_MODE_HDMI;
- else
- sink_mode = SINK_MODE_DVI;
- }
+ else
+ sink_mode = edid_ctrl->sink_mode;
return sink_mode;
} /* hdmi_edid_get_sink_mode */
@@ -2452,21 +2452,10 @@ u32 hdmi_edid_get_sink_mode(void *input, u32 mode)
*/
bool hdmi_edid_is_dvi_mode(void *input)
{
- struct hdmi_edid_ctrl *edid_ctrl = (struct hdmi_edid_ctrl *)input;
- int sink_mode;
-
- if (!edid_ctrl) {
- DEV_ERR("%s: invalid input\n", __func__);
- return true;
- }
-
- if (edid_ctrl->edid_override &&
- (edid_ctrl->override_data.sink_mode != -1))
- sink_mode = edid_ctrl->override_data.sink_mode;
+ if (hdmi_edid_get_sink_mode(input))
+ return false;
else
- sink_mode = edid_ctrl->sink_mode;
-
- return (sink_mode == SINK_MODE_DVI);
+ return true;
}
/**
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_edid.h b/drivers/video/fbdev/msm/mdss_hdmi_edid.h
index c604d0fbf7b2..af802bb45f89 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_edid.h
+++ b/drivers/video/fbdev/msm/mdss_hdmi_edid.h
@@ -58,16 +58,10 @@ struct hdmi_edid_override_data {
int vic;
};
-enum edid_sink_mode {
- SINK_MODE_DVI,
- SINK_MODE_HDMI
-};
-
int hdmi_edid_parser(void *edid_ctrl);
u32 hdmi_edid_get_raw_data(void *edid_ctrl, u8 *buf, u32 size);
u8 hdmi_edid_get_sink_scaninfo(void *edid_ctrl, u32 resolution);
bool hdmi_edid_is_dvi_mode(void *input);
-u32 hdmi_edid_get_sink_mode(void *edid_ctrl, u32 mode);
bool hdmi_edid_sink_scramble_override(void *input);
bool hdmi_edid_get_sink_scrambler_support(void *input);
bool hdmi_edid_get_scdc_support(void *input);
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_tx.c b/drivers/video/fbdev/msm/mdss_hdmi_tx.c
index 2e267f2695d7..9ee0c27b225e 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_tx.c
+++ b/drivers/video/fbdev/msm/mdss_hdmi_tx.c
@@ -375,12 +375,11 @@ static void hdmi_tx_audio_setup(struct hdmi_tx_ctrl *hdmi_ctrl)
}
}
-static inline bool hdmi_tx_is_dvi_mode(struct hdmi_tx_ctrl *hdmi_ctrl)
+static inline u32 hdmi_tx_is_dvi_mode(struct hdmi_tx_ctrl *hdmi_ctrl)
{
void *data = hdmi_tx_get_fd(HDMI_TX_FEAT_EDID);
- return (hdmi_edid_get_sink_mode(data,
- hdmi_ctrl->vic) == SINK_MODE_DVI);
+ return hdmi_edid_is_dvi_mode(data);
} /* hdmi_tx_is_dvi_mode */
static inline u32 hdmi_tx_is_in_splash(struct hdmi_tx_ctrl *hdmi_ctrl)
@@ -2482,8 +2481,7 @@ static void hdmi_tx_set_mode(struct hdmi_tx_ctrl *hdmi_ctrl, u32 power_on)
hdmi_ctrl_reg |= BIT(2);
/* Set transmission mode to DVI based in EDID info */
- if (hdmi_edid_get_sink_mode(data,
- hdmi_ctrl->vic) == SINK_MODE_DVI)
+ if (hdmi_edid_is_dvi_mode(data))
hdmi_ctrl_reg &= ~BIT(1); /* DVI mode */
/*
@@ -2942,6 +2940,7 @@ static int hdmi_tx_audio_info_setup(struct platform_device *pdev,
{
int rc = 0;
struct hdmi_tx_ctrl *hdmi_ctrl = platform_get_drvdata(pdev);
+ u32 is_mode_dvi;
if (!hdmi_ctrl || !params) {
DEV_ERR("%s: invalid input\n", __func__);
@@ -2950,8 +2949,9 @@ static int hdmi_tx_audio_info_setup(struct platform_device *pdev,
mutex_lock(&hdmi_ctrl->tx_lock);
- if (!hdmi_tx_is_dvi_mode(hdmi_ctrl) &&
- hdmi_tx_is_panel_on(hdmi_ctrl)) {
+ is_mode_dvi = hdmi_tx_is_dvi_mode(hdmi_ctrl);
+
+ if (!is_mode_dvi && hdmi_tx_is_panel_on(hdmi_ctrl)) {
memcpy(&hdmi_ctrl->audio_params, params,
sizeof(struct msm_ext_disp_audio_setup_params));