Merge "rtac: Add mutex protection for rtac cal apis"
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index cf2f264..3cacfc0 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2020, 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
@@ -18,6 +18,7 @@
#include <linux/time.h>
#include <linux/math64.h>
#include <linux/wait.h>
+#include <linux/mutex.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <sound/core.h>
@@ -104,6 +105,7 @@
struct msm_compr_dec_params *dec_params[MSM_FRONTEND_DAI_MAX];
struct msm_compr_ch_map *ch_map[MSM_FRONTEND_DAI_MAX];
bool is_in_use[MSM_FRONTEND_DAI_MAX];
+ struct mutex lock;
};
struct msm_compr_audio {
@@ -1798,6 +1800,7 @@
}
spin_unlock_irqrestore(&prtd->lock, flags);
+ mutex_lock(&pdata->lock);
pdata->cstream[soc_prtd->dai_link->id] = NULL;
if (cstream->direction == SND_COMPRESS_PLAYBACK) {
msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id,
@@ -1819,6 +1822,7 @@
pdata->is_in_use[soc_prtd->dai_link->id] = false;
kfree(prtd);
runtime->private_data = NULL;
+ mutex_unlock(&pdata->lock);
return 0;
}
@@ -1869,6 +1873,7 @@
}
spin_unlock_irqrestore(&prtd->lock, flags);
+ mutex_lock(&pdata->lock);
pdata->cstream[soc_prtd->dai_link->id] = NULL;
msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->id,
SNDRV_PCM_STREAM_CAPTURE);
@@ -1879,6 +1884,7 @@
kfree(prtd);
runtime->private_data = NULL;
+ mutex_unlock(&pdata->lock);
return 0;
}
@@ -3157,6 +3163,7 @@
struct snd_compr_stream *cstream = NULL;
struct msm_compr_audio *prtd = NULL;
long *values = &(ucontrol->value.integer.value[0]);
+ int ret = 0;
int effects_module;
pr_debug("%s\n", __func__);
@@ -3165,21 +3172,25 @@
__func__, fe_id);
return -EINVAL;
}
+
+ mutex_lock(&pdata->lock);
cstream = pdata->cstream[fe_id];
audio_effects = pdata->audio_effects[fe_id];
if (!cstream || !audio_effects) {
pr_err("%s: stream or effects inactive\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto done;
}
prtd = cstream->runtime->private_data;
if (!prtd) {
pr_err("%s: cannot set audio effects\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto done;
}
if (prtd->compr_passthr != LEGACY_PCM) {
pr_debug("%s: No effects for compr_type[%d]\n",
__func__, prtd->compr_passthr);
- return 0;
+ goto done;
}
pr_debug("%s: Effects supported for compr_type[%d]\n",
__func__, prtd->compr_passthr);
@@ -3240,9 +3251,11 @@
break;
default:
pr_err("%s Invalid effects config module\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
}
- return 0;
+done:
+ mutex_unlock(&pdata->lock);
+ return ret;
}
static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol,
@@ -3254,6 +3267,7 @@
snd_soc_component_get_drvdata(comp);
struct msm_compr_audio_effects *audio_effects = NULL;
struct snd_compr_stream *cstream = NULL;
+ int ret = 0;
struct msm_compr_audio *prtd = NULL;
pr_debug("%s\n", __func__);
@@ -3262,19 +3276,23 @@
__func__, fe_id);
return -EINVAL;
}
+
+ mutex_lock(&pdata->lock);
cstream = pdata->cstream[fe_id];
audio_effects = pdata->audio_effects[fe_id];
if (!cstream || !audio_effects) {
- pr_err("%s: stream or effects inactive\n", __func__);
- return -EINVAL;
+ pr_debug("%s: stream or effects inactive\n", __func__);
+ ret = -EINVAL;
+ goto done;
}
prtd = cstream->runtime->private_data;
if (!prtd) {
pr_err("%s: cannot set audio effects\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
}
-
- return 0;
+done:
+ mutex_unlock(&pdata->lock);
+ return ret;
}
static int msm_compr_query_audio_effect_put(struct snd_kcontrol *kcontrol,
@@ -3287,6 +3305,7 @@
struct msm_compr_audio_effects *audio_effects = NULL;
struct snd_compr_stream *cstream = NULL;
struct msm_compr_audio *prtd = NULL;
+ int ret = 0;
long *values = &(ucontrol->value.integer.value[0]);
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
@@ -3294,28 +3313,37 @@
__func__, fe_id);
return -EINVAL;
}
+
+ mutex_lock(&pdata->lock);
+
cstream = pdata->cstream[fe_id];
audio_effects = pdata->audio_effects[fe_id];
if (!cstream || !audio_effects) {
pr_err("%s: stream or effects inactive\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto done;
}
prtd = cstream->runtime->private_data;
if (!prtd) {
pr_err("%s: cannot set audio effects\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto done;
}
if (prtd->compr_passthr != LEGACY_PCM) {
pr_err("%s: No effects for compr_type[%d]\n",
__func__, prtd->compr_passthr);
- return -EPERM;
+ ret = -EPERM;
+ goto done;
}
audio_effects->query.mod_id = (u32)*values++;
audio_effects->query.parm_id = (u32)*values++;
audio_effects->query.size = (u32)*values++;
audio_effects->query.offset = (u32)*values++;
audio_effects->query.device = (u32)*values++;
- return 0;
+
+done:
+ mutex_unlock(&pdata->lock);
+ return ret;
}
static int msm_compr_query_audio_effect_get(struct snd_kcontrol *kcontrol,
@@ -3328,6 +3356,7 @@
struct msm_compr_audio_effects *audio_effects = NULL;
struct snd_compr_stream *cstream = NULL;
struct msm_compr_audio *prtd = NULL;
+ int ret = 0;
long *values = &(ucontrol->value.integer.value[0]);
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
@@ -3335,23 +3364,29 @@
__func__, fe_id);
return -EINVAL;
}
+
+ mutex_lock(&pdata->lock);
cstream = pdata->cstream[fe_id];
audio_effects = pdata->audio_effects[fe_id];
if (!cstream || !audio_effects) {
pr_debug("%s: stream or effects inactive\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto done;
}
prtd = cstream->runtime->private_data;
if (!prtd) {
pr_err("%s: cannot set audio effects\n", __func__);
- return -EINVAL;
+ ret = -EINVAL;
+ goto done;
}
values[0] = (long)audio_effects->query.mod_id;
values[1] = (long)audio_effects->query.parm_id;
values[2] = (long)audio_effects->query.size;
values[3] = (long)audio_effects->query.offset;
values[4] = (long)audio_effects->query.device;
- return 0;
+done:
+ mutex_unlock(&pdata->lock);
+ return ret;
}
static int msm_compr_send_dec_params(struct snd_compr_stream *cstream,
@@ -3418,8 +3453,7 @@
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
pr_err("%s Received out of bounds fe_id %lu\n",
__func__, fe_id);
- rc = -EINVAL;
- goto end;
+ return -EINVAL;
}
cstream = pdata->cstream[fe_id];
@@ -3427,16 +3461,15 @@
if (!cstream || !dec_params) {
pr_err("%s: stream or dec_params inactive\n", __func__);
- rc = -EINVAL;
- goto end;
+ return -EINVAL;
}
prtd = cstream->runtime->private_data;
if (!prtd) {
pr_err("%s: cannot set dec_params\n", __func__);
- rc = -EINVAL;
- goto end;
+ return -EINVAL;
}
+ mutex_lock(&pdata->lock);
switch (prtd->codec) {
case FORMAT_MP3:
case FORMAT_MPEG4_AAC:
@@ -3468,6 +3501,7 @@
pr_err("%s: invalid num of params:: %d\n", __func__,
ddp->params_length);
rc = -EINVAL;
+ mutex_unlock(&pdata->lock);
goto end;
}
for (cnt = 0; cnt < ddp->params_length; cnt++) {
@@ -3483,6 +3517,7 @@
default:
break;
}
+ mutex_unlock(&pdata->lock);
end:
pr_debug("%s: ret %d\n", __func__, rc);
return rc;
@@ -3672,6 +3707,7 @@
struct msm_adsp_event_data *event_data = NULL;
uint64_t actual_payload_len = 0;
+ mutex_lock(&pdata->lock);
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
pr_err("%s Received invalid fe_id %lu\n",
__func__, fe_id);
@@ -3730,6 +3766,7 @@
pr_err("%s: failed to send stream event cmd, err = %d\n",
__func__, ret);
done:
+ mutex_unlock(&pdata->lock);
return ret;
}
@@ -3745,6 +3782,7 @@
int fd;
int ret = 0;
+ mutex_lock(&pdata->lock);
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
pr_err("%s Received out of bounds invalid fe_id %lu\n",
__func__, fe_id);
@@ -3777,6 +3815,7 @@
if (ret < 0)
pr_err("%s: failed to register ion fd\n", __func__);
done:
+ mutex_unlock(&pdata->lock);
return ret;
}
@@ -3792,6 +3831,7 @@
int ret = 0;
int param_length = 0;
+ mutex_lock(&pdata->lock);
if (fe_id >= MSM_FRONTEND_DAI_MAX) {
pr_err("%s Received invalid fe_id %lu\n",
__func__, fe_id);
@@ -3836,6 +3876,7 @@
pr_err("%s: failed to send rtic event ack, err = %d\n",
__func__, ret);
done:
+ mutex_unlock(&pdata->lock);
return ret;
}
@@ -3884,6 +3925,7 @@
if (!pdata)
return -ENOMEM;
+ mutex_init(&pdata->lock);
snd_soc_platform_set_drvdata(platform, pdata);
for (i = 0; i < MSM_FRONTEND_DAI_MAX; i++) {
@@ -3927,6 +3969,23 @@
uinfo->count = 128;
uinfo->value.integer.min = 0;
uinfo->value.integer.max = 0xFFFFFFFF;
+
+ return 0;
+}
+
+static int msm_compr_remove(struct snd_soc_platform *platform)
+{
+
+ struct msm_compr_pdata *pdata = (struct msm_compr_pdata *)
+ snd_soc_platform_get_drvdata(platform);
+ if (!pdata) {
+ pr_err("%s pdata is null\n", __func__);
+ return -ENOMEM;
+ }
+
+ mutex_destroy(&pdata->lock);
+ kfree(pdata);
+
return 0;
}
@@ -4681,6 +4740,7 @@
.probe = msm_compr_probe,
.compr_ops = &msm_compr_ops,
.pcm_new = msm_compr_new,
+ .remove = msm_compr_remove,
};
static int msm_compr_dev_probe(struct platform_device *pdev)
@@ -4691,7 +4751,7 @@
&msm_soc_platform);
}
-static int msm_compr_remove(struct platform_device *pdev)
+static int msm_compr_dev_remove(struct platform_device *pdev)
{
snd_soc_unregister_platform(&pdev->dev);
return 0;
@@ -4710,7 +4770,7 @@
.of_match_table = msm_compr_dt_match,
},
.probe = msm_compr_dev_probe,
- .remove = msm_compr_remove,
+ .remove = msm_compr_dev_remove,
};
int __init msm_compress_dsp_init(void)
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index a33f028..5fcde20 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -14393,15 +14393,18 @@
struct snd_ctl_elem_value *ucontrol)
{
int i = 0, j;
- int num_app_types = ucontrol->value.integer.value[i++];
+ int num_app_types;
- memset(lsm_app_type_cfg, 0, MAX_APP_TYPES*
- sizeof(struct msm_pcm_routing_app_type_data));
- if (num_app_types > MAX_APP_TYPES) {
+ if (ucontrol->value.integer.value[0] > MAX_APP_TYPES) {
pr_err("%s: number of app types exceed the max supported\n",
__func__);
return -EINVAL;
}
+
+ num_app_types = ucontrol->value.integer.value[i++];
+ memset(lsm_app_type_cfg, 0, MAX_APP_TYPES*
+ sizeof(struct msm_pcm_routing_app_type_data));
+
for (j = 0; j < num_app_types; j++) {
lsm_app_type_cfg[j].app_type =
ucontrol->value.integer.value[i++];