Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cf6835d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: check for audio support before notifying frameworks"

parents 35cc04df 4086c86e
Loading
Loading
Loading
Loading
+44 −10
Original line number Diff line number Diff line
/* 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);
				/* 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);
		}