From 338a4245bf1b625883a23432822eb8862676bf09 Mon Sep 17 00:00:00 2001 From: "Yoon (Seungyoon) Lee" Date: Mon, 22 Oct 2018 15:56:18 -0500 Subject: [PATCH] modules: cspl: move usecase switch checks to DSP There is a corner case in separate earpiece and speaker system, where speaker path isn't open (so DSP isn't enabled yet) when usecase switches but AP consumes the event and doesn't send again to DSP when DSP enabled. Send usecase switches to DSP everytime, let it decide to switch or ignore. Change-Id: I014d4d607f5a134970c3f8e43d41c296b62b3a46 Signed-off-by: Yoon (Seungyoon) Lee Reviewed-on: https://gerrit.mot.com/1259187 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Seungyoon Lee Submit-Approved: Jira Key --- sound/soc/codecs/msm-cirrus-playback.c | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/sound/soc/codecs/msm-cirrus-playback.c b/sound/soc/codecs/msm-cirrus-playback.c index 29e4650b9584..86ca7bfdf706 100644 --- a/sound/soc/codecs/msm-cirrus-playback.c +++ b/sound/soc/codecs/msm-cirrus-playback.c @@ -457,6 +457,7 @@ static int msm_crus_se_enable_get(struct snd_kcontrol *kcontrol, static int msm_crus_se_usecase(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { + int ret = 0; struct crus_rx_run_case_ctrl_t case_ctrl; const int crus_set = ucontrol->value.integer.value[0]; struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; @@ -470,19 +471,18 @@ static int msm_crus_se_usecase(struct snd_kcontrol *kcontrol, return -EINVAL; } - if (cirrus_se_usecase != crus_se_usecase_dt_index[crus_set]) { + case_ctrl.status_l = 0; + case_ctrl.status_r = 0; + case_ctrl.atemp = 0; + case_ctrl.value = crus_se_usecase_dt_index[crus_set]; + + ret = crus_set_param(cirrus_ff_port, CIRRUS_SE, + CRUS_PARAM_RX_SET_USECASE, sizeof(case_ctrl), + (void *)&case_ctrl); + + if (ret == 0) cirrus_se_usecase = crus_se_usecase_dt_index[crus_set]; - case_ctrl.status_l = 0; - case_ctrl.status_r = 0; - case_ctrl.atemp = 0; - case_ctrl.value = cirrus_se_usecase; - - crus_set_param(cirrus_ff_port, CIRRUS_SE, - CRUS_PARAM_RX_SET_USECASE, sizeof(case_ctrl), - (void *)&case_ctrl); - } - return 0; } @@ -496,8 +496,10 @@ static int msm_crus_se_usecase_get(struct snd_kcontrol *kcontrol, crus_get_param(cirrus_ff_port, CIRRUS_SE, CRUS_PARAM_RX_GET_USECASE, sizeof(struct crus_single_data_t), (void *)&crus_usecase); - if (crus_usecase.value == 0) { - /* QDSP/LPASS default */ + pr_debug("Usecase from qdsp returned as %d\n", crus_usecase.value); + + if (crus_usecase.value < 0) { + /* QDSP/LPASS default, module isn't running */ ucontrol->value.integer.value[0] = 0; } else { ucontrol->value.integer.value[0] =