asoc: msm-lsm-client: deregister SM even if SVA is not started

To prevent potential memory leaks in kernel and ADSP, always try to
deregister sound model in msm_lsm_close so that sound model and
calibration buffer can be freed.

Change-Id: If665fcb00f67fa268a4c543649fee12627fccedd
Signed-off-by: Xiaoyu Ye <benyxy@codeaurora.org>
This commit is contained in:
Xiaoyu Ye 2020-12-08 19:22:19 -08:00
commit 73d788af1c
2 changed files with 29 additions and 26 deletions

View file

@ -3117,22 +3117,22 @@ static int msm_lsm_close(struct snd_pcm_substream *substream)
"%s: LSM client session stopped %d\n",
__func__, ret);
/*
* Go Ahead and try de-register sound model,
* even if stop failed
*/
prtd->lsm_client->started = false;
ret = q6lsm_deregister_sound_model(prtd->lsm_client);
if (ret)
dev_err(rtd->dev,
"%s: dereg_snd_model failed, err = %d\n",
__func__, ret);
else
dev_dbg(rtd->dev, "%s: dereg_snd_model successful\n",
__func__);
}
/*
* De-register existing sound models
* to free SM and CAL buffer, even if
* lsm client is not started.
*/
ret = q6lsm_deregister_sound_model(prtd->lsm_client);
if (ret)
dev_err(rtd->dev, "%s: dereg_snd_model failed, err = %d\n",
__func__, ret);
else
dev_dbg(rtd->dev, "%s: dereg_snd_model successful\n",
__func__);
msm_pcm_routing_dereg_phy_stream(rtd->dai_link->id,
SNDRV_PCM_STREAM_CAPTURE);

View file

@ -1735,21 +1735,24 @@ int q6lsm_deregister_sound_model(struct lsm_client *client)
break;
}
} else {
memset(&cmd, 0, sizeof(cmd));
q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd.hdr), false);
cmd.hdr.opcode = LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL;
rc = q6lsm_apr_send_pkt(client, client->apr, &cmd.hdr, true, NULL);
if (rc) {
pr_err("%s: Failed cmd opcode 0x%x, rc %d\n", __func__,
cmd.hdr.opcode, rc);
} else {
pr_debug("%s: Deregister sound model succeeded\n", __func__);
}
p_info.param_type = LSM_DEREG_SND_MODEL;
sm = &client->stage_cfg[p_info.stage_idx].sound_model;
q6lsm_snd_model_buf_free(client, &p_info, sm);
if (sm && sm->data) {
memset(&cmd, 0, sizeof(cmd));
q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd.hdr), false);
cmd.hdr.opcode = LSM_SESSION_CMD_DEREGISTER_SOUND_MODEL;
p_info.param_type = LSM_DEREG_SND_MODEL;
rc = q6lsm_apr_send_pkt(client, client->apr, &cmd.hdr, true, NULL);
if (rc) {
pr_err("%s: Failed cmd opcode 0x%x, rc %d\n", __func__,
cmd.hdr.opcode, rc);
} else {
pr_debug("%s: Deregister sound model succeeded\n", __func__);
}
q6lsm_snd_model_buf_free(client, &p_info, sm);
}
}
return rc;