diff options
| author | Narender Ankam <nankam@codeaurora.org> | 2017-07-24 17:28:46 +0530 |
|---|---|---|
| committer | Narender Ankam <nankam@codeaurora.org> | 2017-09-12 12:57:33 +0530 |
| commit | 8eb5765563205136a32fabe216a1504465ad540d (patch) | |
| tree | 32d55fcf4a40f0ca17266d1a62713accf9446965 | |
| parent | 1cbd1cdf8491634cca7f06812dbe8d1906033656 (diff) | |
msm: mdss: hdmi: notify hdmi audio event after video is up
Modify HDMI driver so that video and audio events are notified
separately. Notify video events asynchronously. send audio
events only after video is up.
Change-Id: Ie6e4e564456d65f6b6d733b8accd14b9ce4c7e15
Signed-off-by: Narender Ankam <nankam@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_tx.c | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_tx.c b/drivers/video/fbdev/msm/mdss_hdmi_tx.c index 837147dc5036..22467f1aa414 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_tx.c +++ b/drivers/video/fbdev/msm/mdss_hdmi_tx.c @@ -410,29 +410,33 @@ static inline void hdmi_tx_cec_device_suspend(struct hdmi_tx_ctrl *hdmi_ctrl) hdmi_cec_device_suspend(fd, hdmi_ctrl->panel_suspend); } -static inline void hdmi_tx_send_cable_notification( +static inline void hdmi_tx_send_audio_notification( + struct hdmi_tx_ctrl *hdmi_ctrl, int val) +{ + if (hdmi_ctrl && hdmi_ctrl->ext_audio_data.intf_ops.hpd) { + u32 flags = 0; + + if (!hdmi_tx_is_dvi_mode(hdmi_ctrl)) + flags |= MSM_EXT_DISP_HPD_AUDIO; + + if (flags) + hdmi_ctrl->ext_audio_data.intf_ops.hpd( + hdmi_ctrl->ext_pdev, + hdmi_ctrl->ext_audio_data.type, val, flags); + } +} + +static inline void hdmi_tx_send_video_notification( struct hdmi_tx_ctrl *hdmi_ctrl, int val, bool async) { if (hdmi_ctrl && hdmi_ctrl->ext_audio_data.intf_ops.hpd) { u32 flags = 0; - if (async || hdmi_tx_is_in_splash(hdmi_ctrl)) { + if (async || hdmi_tx_is_in_splash(hdmi_ctrl)) flags |= MSM_EXT_DISP_HPD_ASYNC_VIDEO; - - if (async) { - if (!hdmi_tx_is_dvi_mode(hdmi_ctrl)) - flags |= MSM_EXT_DISP_HPD_ASYNC_AUDIO; - } else - if (!hdmi_tx_is_dvi_mode(hdmi_ctrl)) - flags |= MSM_EXT_DISP_HPD_AUDIO; - - } else { + else flags |= MSM_EXT_DISP_HPD_VIDEO; - if (!hdmi_tx_is_dvi_mode(hdmi_ctrl)) - flags |= MSM_EXT_DISP_HPD_AUDIO; - } - hdmi_ctrl->ext_audio_data.intf_ops.hpd(hdmi_ctrl->ext_pdev, hdmi_ctrl->ext_audio_data.type, val, flags); } @@ -445,6 +449,8 @@ static inline void hdmi_tx_ack_state( !hdmi_tx_is_dvi_mode(hdmi_ctrl)) hdmi_ctrl->ext_audio_data.intf_ops.notify(hdmi_ctrl->ext_pdev, val); + + hdmi_tx_send_audio_notification(hdmi_ctrl, val); } static struct hdmi_tx_ctrl *hdmi_tx_get_drvdata_from_panel_data( @@ -876,7 +882,8 @@ static ssize_t hdmi_tx_sysfs_wta_hpd(struct device *dev, * No need to blocking wait for display/audio in this * case since HAL is not up so no ACK can be expected. */ - hdmi_tx_send_cable_notification(hdmi_ctrl, 0, true); + hdmi_tx_send_audio_notification(hdmi_ctrl, 0); + hdmi_tx_send_video_notification(hdmi_ctrl, 0, true); } break; @@ -2373,7 +2380,15 @@ static void hdmi_tx_hpd_int_work(struct work_struct *work) mutex_unlock(&hdmi_ctrl->tx_lock); - hdmi_tx_send_cable_notification(hdmi_ctrl, hdmi_ctrl->hpd_state, false); + if (hdmi_ctrl->hpd_state) + hdmi_tx_send_video_notification(hdmi_ctrl, + hdmi_ctrl->hpd_state, true); + else { + hdmi_tx_send_audio_notification(hdmi_ctrl, + hdmi_ctrl->hpd_state); + hdmi_tx_send_video_notification(hdmi_ctrl, + hdmi_ctrl->hpd_state, true); + } } /* hdmi_tx_hpd_int_work */ static int hdmi_tx_check_capability(struct hdmi_tx_ctrl *hdmi_ctrl) @@ -3988,7 +4003,8 @@ static int hdmi_tx_post_evt_handle_resume(struct hdmi_tx_ctrl *hdmi_ctrl) &hdmi_ctrl->hpd_int_done, HZ/10); if (!timeout) { pr_debug("cable removed during suspend\n"); - hdmi_tx_send_cable_notification(hdmi_ctrl, 0, false); + hdmi_tx_send_audio_notification(hdmi_ctrl, 0); + hdmi_tx_send_video_notification(hdmi_ctrl, 0, true); } } @@ -3999,7 +4015,8 @@ static int hdmi_tx_post_evt_handle_panel_on(struct hdmi_tx_ctrl *hdmi_ctrl) { if (hdmi_ctrl->panel_suspend) { pr_debug("panel suspend has triggered\n"); - hdmi_tx_send_cable_notification(hdmi_ctrl, 0, false); + hdmi_tx_send_audio_notification(hdmi_ctrl, 0); + hdmi_tx_send_video_notification(hdmi_ctrl, 0, true); } return 0; |
