summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-21 17:57:38 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-21 17:57:37 -0700
commit6cf6835d964a71fa857d03f8e2f28a581da3b3b2 (patch)
tree2885b9fdda94cf5209fa7c7935709954206a500c
parent35cc04df55ef4099f88a48c8d0bf715510f9cdc4 (diff)
parent4086c86ed082b01506486e383f67330ba5731f48 (diff)
Merge "msm: mdss: check for audio support before notifying frameworks"
-rw-r--r--drivers/video/fbdev/msm/mdss_dba_utils.c54
1 files changed, 44 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dba_utils.c b/drivers/video/fbdev/msm/mdss_dba_utils.c
index 0808a1a6e14b..3330f8f62b78 100644
--- a/drivers/video/fbdev/msm/mdss_dba_utils.c
+++ b/drivers/video/fbdev/msm/mdss_dba_utils.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -46,6 +46,7 @@ struct mdss_dba_utils_data {
struct cec_cbs ccbs;
char disp_switch_name[MAX_SWITCH_NAME_SIZE];
u32 current_vic;
+ bool support_audio;
};
static struct mdss_dba_utils_data *mdss_dba_utils_get_data(
@@ -84,7 +85,7 @@ end:
return udata;
}
-static void mdss_dba_utils_send_display_notification(
+static void mdss_dba_utils_notify_display(
struct mdss_dba_utils_data *udata, int val)
{
int state = 0;
@@ -109,7 +110,7 @@ static void mdss_dba_utils_send_display_notification(
udata->sdev_display.state);
}
-static void mdss_dba_utils_send_audio_notification(
+static void mdss_dba_utils_notify_audio(
struct mdss_dba_utils_data *udata, int val)
{
int state = 0;
@@ -291,6 +292,31 @@ static void mdss_dba_utils_sysfs_remove(struct kobject *kobj)
sysfs_remove_group(kobj, &mdss_dba_utils_fs_attrs_group);
}
+static bool mdss_dba_check_audio_support(struct mdss_dba_utils_data *udata)
+{
+ bool dvi_mode = false;
+ int audio_blk_size = 0;
+ struct msm_ext_disp_audio_edid_blk audio_blk;
+
+ if (!udata) {
+ pr_debug("%s: Invalid input\n", __func__);
+ return false;
+ }
+ memset(&audio_blk, 0, sizeof(audio_blk));
+
+ /* check if sink is in DVI mode */
+ dvi_mode = hdmi_edid_is_dvi_mode(udata->edid_data);
+
+ /* get the audio block size info from EDID */
+ hdmi_edid_get_audio_blk(udata->edid_data, &audio_blk);
+ audio_blk_size = audio_blk.audio_data_blk_size;
+
+ if (dvi_mode || !audio_blk_size)
+ return false;
+ else
+ return true;
+}
+
static void mdss_dba_utils_dba_cb(void *data, enum msm_dba_callback_event event)
{
int ret = -EINVAL;
@@ -322,19 +348,26 @@ static void mdss_dba_utils_dba_cb(void *data, enum msm_dba_callback_event event)
if (!ret) {
hdmi_edid_parser(udata->edid_data);
- hdmi_edid_get_audio_blk(udata->edid_data, &blk);
- if (udata->ops.set_audio_block)
- udata->ops.set_audio_block(
+ /* check whether audio is supported or not */
+ udata->support_audio =
+ mdss_dba_check_audio_support(udata);
+ if (udata->support_audio) {
+ hdmi_edid_get_audio_blk(
+ udata->edid_data, &blk);
+ if (udata->ops.set_audio_block)
+ udata->ops.set_audio_block(
udata->dba_data,
sizeof(blk), &blk);
+ }
} else {
pr_err("failed to get edid%d\n", ret);
}
}
if (pluggable) {
- mdss_dba_utils_send_display_notification(udata, 1);
- mdss_dba_utils_send_audio_notification(udata, 1);
+ mdss_dba_utils_notify_display(udata, 1);
+ if (udata->support_audio)
+ mdss_dba_utils_notify_audio(udata, 1);
} else {
mdss_dba_utils_video_on(udata, udata->pinfo);
}
@@ -346,8 +379,9 @@ static void mdss_dba_utils_dba_cb(void *data, enum msm_dba_callback_event event)
if (!udata->hpd_state)
break;
if (pluggable) {
- mdss_dba_utils_send_audio_notification(udata, 0);
- mdss_dba_utils_send_display_notification(udata, 0);
+ if (udata->support_audio)
+ mdss_dba_utils_notify_audio(udata, 0);
+ mdss_dba_utils_notify_display(udata, 0);
} else {
mdss_dba_utils_video_off(udata);
}