diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-21 17:57:38 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-21 17:57:37 -0700 |
commit | 6cf6835d964a71fa857d03f8e2f28a581da3b3b2 (patch) | |
tree | 2885b9fdda94cf5209fa7c7935709954206a500c | |
parent | 35cc04df55ef4099f88a48c8d0bf715510f9cdc4 (diff) | |
parent | 4086c86ed082b01506486e383f67330ba5731f48 (diff) |
Merge "msm: mdss: check for audio support before notifying frameworks"
-rw-r--r-- | drivers/video/fbdev/msm/mdss_dba_utils.c | 54 |
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); } |