Merge d3b58cccbaf7bc3767f1db0fde53a0d127d62a87 on remote branch
Change-Id: I54fe7f75254eec5714bc67a88ff1c3dbaccdee93
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 417cbc0..bab28d1 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -985,6 +985,9 @@
cal_block = list_entry(ptr,
struct cal_block_data, list);
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
+
if (((struct audio_cal_info_adm_top *)cal_block
->cal_info)->path == path) {
return cal_block;
@@ -1012,6 +1015,9 @@
cal_block = list_entry(ptr,
struct cal_block_data, list);
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
+
cal_info = (struct audio_cal_info_adm_top *)
cal_block->cal_info;
if ((cal_info->path == path) &&
@@ -1045,6 +1051,11 @@
return topology;
}
+/*
+ * Retrieving cal_block will mark cal_block as stale.
+ * Hence it cannot be reused or resent unless the flag
+ * is reset.
+ */
static int msm_routing_get_adm_topology(int fedai_id, int session_type,
int be_id)
{
@@ -1534,7 +1545,7 @@
if ((copp_idx < 0) ||
(copp_idx >= MAX_COPPS_PER_PORT)) {
pr_err("%s: adm open failed copp_idx:%d\n",
- __func__, copp_idx);
+ __func__, copp_idx);
mutex_unlock(&routing_lock);
return -EINVAL;
}
diff --git a/dsp/audio_cal_utils.c b/dsp/audio_cal_utils.c
index c6449dd..f989a97 100644
--- a/dsp/audio_cal_utils.c
+++ b/dsp/audio_cal_utils.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2019, 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
@@ -1041,9 +1041,40 @@
((uint8_t *)data + sizeof(struct audio_cal_type_basic)),
data_size - sizeof(struct audio_cal_type_basic));
+ /* reset buffer stale flag */
+ cal_block->cal_stale = false;
+
err:
mutex_unlock(&cal_type->lock);
done:
return ret;
}
EXPORT_SYMBOL(cal_utils_set_cal);
+
+/**
+ * cal_utils_mark_cal_used
+ *
+ * @cal_block: pointer to cal block
+ */
+void cal_utils_mark_cal_used(struct cal_block_data *cal_block)
+{
+ if (cal_block)
+ cal_block->cal_stale = true;
+}
+EXPORT_SYMBOL(cal_utils_mark_cal_used);
+
+/**
+ * cal_utils_is_cal_stale
+ *
+ * @cal_block: pointer to cal block
+ *
+ * Returns true if cal block is stale, false otherwise
+ */
+bool cal_utils_is_cal_stale(struct cal_block_data *cal_block)
+{
+ if ((cal_block) && (cal_block->cal_stale))
+ return true;
+
+ return false;
+}
+EXPORT_SYMBOL(cal_utils_is_cal_stale);
diff --git a/dsp/q6adm.c b/dsp/q6adm.c
index 03fa6a6..8d8a473 100644
--- a/dsp/q6adm.c
+++ b/dsp/q6adm.c
@@ -1570,7 +1570,7 @@
}
adm_callback_debug_print(data);
- if (data->payload_size) {
+ if (data->payload_size >= sizeof(uint32_t)) {
copp_idx = (data->token) & 0XFF;
port_idx = ((data->token) >> 16) & 0xFF;
client_id = ((data->token) >> 8) & 0xFF;
@@ -1592,6 +1592,15 @@
if (data->opcode == APR_BASIC_RSP_RESULT) {
pr_debug("%s: APR_BASIC_RSP_RESULT id 0x%x\n",
__func__, payload[0]);
+ if (!((client_id != ADM_CLIENT_ID_SOURCE_TRACKING) &&
+ (payload[0] == ADM_CMD_SET_PP_PARAMS_V5))) {
+ if (data->payload_size <
+ (2 * sizeof(uint32_t))) {
+ pr_err("%s: Invalid payload size %d\n",
+ __func__, data->payload_size);
+ return 0;
+ }
+ }
if (payload[1] != 0) {
pr_err("%s: cmd = 0x%x returned error = 0x%x\n",
__func__, payload[0], payload[1]);
@@ -1710,9 +1719,16 @@
switch (data->opcode) {
case ADM_CMDRSP_DEVICE_OPEN_V5:
case ADM_CMDRSP_DEVICE_OPEN_V6: {
- struct adm_cmd_rsp_device_open_v5 *open =
- (struct adm_cmd_rsp_device_open_v5 *)data->payload;
+ struct adm_cmd_rsp_device_open_v5 *open = NULL;
+ if (data->payload_size <
+ sizeof(struct adm_cmd_rsp_device_open_v5)) {
+ pr_err("%s: Invalid payload size %d\n",
+ __func__, data->payload_size);
+ return 0;
+ }
+ open =
+ (struct adm_cmd_rsp_device_open_v5 *)data->payload;
if (open->copp_id == INVALID_COPP_ID) {
pr_err("%s: invalid coppid rxed %d\n",
__func__, open->copp_id);
@@ -1785,25 +1801,31 @@
pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST",
__func__);
pr_err(":err = 0x%x\n", payload[0]);
- } else if (payload[1] >
- ((ADM_GET_TOPO_MODULE_LIST_LENGTH /
- sizeof(uint32_t)) - 1)) {
- pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST",
- __func__);
- pr_err(":size = %d\n", payload[1]);
- } else {
- idx = ADM_GET_TOPO_MODULE_LIST_LENGTH *
- copp_idx;
- pr_debug("%s:Num modules payload[1] %d\n",
- __func__, payload[1]);
- adm_module_topo_list[idx] = payload[1];
- for (i = 1; i <= payload[1]; i++) {
- adm_module_topo_list[idx+i] =
- payload[1+i];
- pr_debug("%s:payload[%d] = %x\n",
- __func__, (i+1), payload[1+i]);
+ } else if (data->payload_size >=
+ (2 * sizeof(uint32_t))) {
+ if (payload[1] >
+ ((ADM_GET_TOPO_MODULE_LIST_LENGTH /
+ sizeof(uint32_t)) - 1)) {
+ pr_err("%s: ADM_CMDRSP_GET_PP_TOPO_MODULE_LIST",
+ __func__);
+ pr_err(":size = %d\n", payload[1]);
+ } else {
+ idx = ADM_GET_TOPO_MODULE_LIST_LENGTH *
+ copp_idx;
+ pr_debug("%s:Num modules payload[1] %d\n",
+ __func__, payload[1]);
+ adm_module_topo_list[idx] = payload[1];
+ for (i = 1; i <= payload[1]; i++) {
+ adm_module_topo_list[idx+i] =
+ payload[1+i];
+ pr_debug("%s:payload[%d] = %x\n",
+ __func__, (i+1),
+ payload[1+i]);
+ }
}
- }
+ } else
+ pr_err("%s: Invalid payload size %d\n",
+ __func__, data->payload_size);
atomic_set(&this_adm.copp.stat
[port_idx][copp_idx], payload[0]);
wake_up(&this_adm.copp.wait[port_idx][copp_idx]);
@@ -2016,7 +2038,7 @@
this_adm.set_custom_topology = 0;
cal_block = cal_utils_get_only_cal_block(this_adm.cal_data[cal_index]);
- if (cal_block == NULL)
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block))
goto unlock;
pr_debug("%s: Sending cal_index %d\n", __func__, cal_index);
@@ -2197,6 +2219,9 @@
cal_block = list_entry(ptr,
struct cal_block_data, list);
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
+
if (cal_index == ADM_AUDPROC_CAL ||
cal_index == ADM_LSM_AUDPROC_CAL ||
cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) {
@@ -2232,6 +2257,9 @@
cal_block = list_entry(ptr,
struct cal_block_data, list);
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
+
if (cal_index == ADM_AUDPROC_CAL ||
cal_index == ADM_LSM_AUDPROC_CAL ||
cal_index == ADM_LSM_AUDPROC_PERSISTENT_CAL) {
@@ -2270,6 +2298,8 @@
cal_block = list_entry(ptr,
struct cal_block_data, list);
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
if (cal_index == ADM_AUDPROC_CAL ||
cal_index == ADM_LSM_AUDPROC_CAL ||
@@ -2340,6 +2370,8 @@
ret = adm_remap_and_send_cal_block(cal_index, port_id, copp_idx,
cal_block, perf_mode, app_type, acdb_id, sample_rate);
+
+ cal_utils_mark_cal_used(cal_block);
unlock:
mutex_unlock(&this_adm.cal_data[cal_index]->lock);
done:
@@ -3376,7 +3408,7 @@
cal_block = cal_utils_get_only_cal_block(
this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]);
- if (cal_block == NULL) {
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) {
pr_err("%s: can't find cal block!\n", __func__);
goto unlock;
}
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 8e6fa1d..2243326 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -945,7 +945,7 @@
goto unlock;
this_afe.set_custom_topology = 0;
cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]);
- if (cal_block == NULL) {
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) {
pr_err("%s cal_block not found!!\n", __func__);
goto unlock;
}
@@ -1405,7 +1405,9 @@
&cal_type->cal_blocks) {
cal_block = list_entry(ptr,
struct cal_block_data, list);
-
+ /* Skip cal_block if it is already marked stale */
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
path = ((afe_get_port_type(port_id) ==
MSM_AFE_PORT_TYPE_TX)?(TX_DEVICE):(RX_DEVICE));
afe_top =
@@ -1433,6 +1435,11 @@
return NULL;
}
+/*
+ * Retrieving cal_block will mark cal_block as stale.
+ * Hence it cannot be reused or resent unless the flag
+ * is reset.
+ */
static int afe_get_cal_topology_id(u16 port_id, u32 *topology_id,
int cal_type_index)
{
@@ -1442,7 +1449,8 @@
struct audio_cal_info_afe_top *afe_top_info = NULL;
if (this_afe.cal_data[cal_type_index] == NULL) {
- pr_err("%s: [AFE_TOPOLOGY_CAL] not initialized\n", __func__);
+ pr_err("%s: cal_type %d not initialized\n", __func__,
+ cal_type_index);
return -EINVAL;
}
if (topology_id == NULL) {
@@ -1455,8 +1463,8 @@
cal_block = afe_find_cal_topo_id_by_port(
this_afe.cal_data[cal_type_index], port_id);
if (cal_block == NULL) {
- pr_err("%s: [AFE_TOPOLOGY_CAL] not initialized for this port %d\n",
- __func__, port_id);
+ pr_err("%s: cal_type %d not initialized for this port %d\n",
+ __func__, cal_type_index, port_id);
ret = -EINVAL;
goto unlock;
}
@@ -1470,6 +1478,7 @@
goto unlock;
}
*topology_id = (u32)afe_top_info->topology;
+ cal_utils_mark_cal_used(cal_block);
pr_debug("%s: port_id = %u acdb_id = %d topology_id = %u ret=%d\n",
__func__, port_id, afe_top_info->acdb_id,
@@ -1648,7 +1657,7 @@
cal_block = cal_utils_get_only_cal_block(
this_afe.cal_data[cal_index]);
- if (cal_block == NULL) {
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) {
pr_err("%s cal_block not found!!\n", __func__);
ret = -EINVAL;
goto unlock;
@@ -1667,6 +1676,9 @@
if (ret < 0)
pr_debug("%s: No cal sent for cal_index %d, port_id = 0x%x! ret %d\n",
__func__, cal_index, port_id, ret);
+
+ cal_utils_mark_cal_used(cal_block);
+
unlock:
mutex_unlock(&this_afe.cal_data[cal_index]->lock);
done:
@@ -5674,7 +5686,7 @@
}
mutex_lock(&this_afe.cal_data[cal_index]->lock);
cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]);
- if (cal_block == NULL) {
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) {
pr_err("%s: cal_block not found\n ", __func__);
mutex_unlock(&this_afe.cal_data[cal_index]->lock);
ret = -EINVAL;
@@ -5780,7 +5792,7 @@
}
mutex_lock(&this_afe.cal_data[cal_index]->lock);
cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]);
- if (cal_block == NULL) {
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) {
pr_err("%s: cal_block not found\n", __func__);
mutex_unlock(&this_afe.cal_data[cal_index]->lock);
ret = -EINVAL;
@@ -7326,6 +7338,9 @@
cal_block = list_entry(ptr,
struct cal_block_data, list);
+ if (cal_utils_is_cal_stale(cal_block))
+ continue;
+
if (((struct audio_cal_info_hw_delay *)cal_block->cal_info)
->path == path) {
return cal_block;
@@ -7389,6 +7404,8 @@
ret = -EFAULT;
goto unlock;
}
+
+ cal_utils_mark_cal_used(cal_block);
pr_debug("%s: Path = %d samplerate = %u usec = %u status %d\n",
__func__, path, entry->sample_rate, entry->delay_usec, ret);
unlock:
diff --git a/dsp/q6asm.c b/dsp/q6asm.c
index c4c90fe..e415db0 100644
--- a/dsp/q6asm.c
+++ b/dsp/q6asm.c
@@ -125,8 +125,7 @@
void *q6asm_mmap_apr_reg(void);
static int q6asm_is_valid_session(struct apr_client_data *data, void *priv);
-static int q6asm_get_asm_topology_cal(void);
-static int q6asm_get_asm_app_type_cal(void);
+static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info);
/* for ASM custom topology */
static struct cal_type_data *cal_data[ASM_MAX_CAL_TYPES];
@@ -774,7 +773,7 @@
set_custom_topology = 0;
cal_block = cal_utils_get_only_cal_block(cal_data[ASM_CUSTOM_TOP_CAL]);
- if (cal_block == NULL)
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block))
goto unlock;
if (cal_block->cal_data.size == 0) {
@@ -2812,6 +2811,7 @@
{
int rc = 0x00;
struct asm_stream_cmd_open_read_v3 open;
+ struct q6asm_cal_info cal_info;
config_debug_fs_reset_index();
@@ -2831,12 +2831,15 @@
/* Stream prio : High, provide meta info with encoded frames */
open.src_endpointype = ASM_END_POINT_DEVICE_MATRIX;
- open.preprocopo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open.preprocopo_id = cal_info.topology_id;
+
+
open.bits_per_sample = bits_per_sample;
open.mode_flags = 0x0;
ac->topology = open.preprocopo_id;
- ac->app_type = q6asm_get_asm_app_type_cal();
+ ac->app_type = cal_info.app_type;
if (ac->perf_mode == LOW_LATENCY_PCM_MODE) {
open.mode_flags |= ASM_LOW_LATENCY_TX_STREAM_SESSION <<
ASM_SHIFT_STREAM_PERF_MODE_FLAG_IN_OPEN_READ;
@@ -3098,6 +3101,7 @@
{
int rc = 0x00;
struct asm_stream_cmd_open_write_v3 open;
+ struct q6asm_cal_info cal_info;
if (ac == NULL) {
pr_err("%s: APR handle NULL\n", __func__);
@@ -3146,7 +3150,9 @@
open.sink_endpointype = ASM_END_POINT_DEVICE_MATRIX;
open.bits_per_sample = bits_per_sample;
- open.postprocopo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open.postprocopo_id = cal_info.topology_id;
+
if (ac->perf_mode != LEGACY_PCM_MODE)
open.postprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE;
@@ -3159,7 +3165,7 @@
*/
if (!ac->topology) {
ac->topology = open.postprocopo_id;
- ac->app_type = q6asm_get_asm_app_type_cal();
+ ac->app_type = cal_info.app_type;
}
switch (format) {
case FORMAT_LINEAR_PCM:
@@ -3346,6 +3352,7 @@
{
int rc = 0x00;
struct asm_stream_cmd_open_readwrite_v2 open;
+ struct q6asm_cal_info cal_info;
if (ac == NULL) {
pr_err("%s: APR handle NULL\n", __func__);
@@ -3367,12 +3374,13 @@
open.mode_flags = is_meta_data_mode ? BUFFER_META_ENABLE : 0;
open.bits_per_sample = bits_per_sample;
/* source endpoint : matrix */
- open.postprocopo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open.postprocopo_id = cal_info.topology_id;
open.postprocopo_id = overwrite_topology ?
topology : open.postprocopo_id;
ac->topology = open.postprocopo_id;
- ac->app_type = q6asm_get_asm_app_type_cal();
+ ac->app_type = cal_info.app_type;
switch (wr_format) {
@@ -3565,6 +3573,7 @@
int q6asm_open_loopback_v2(struct audio_client *ac, uint16_t bits_per_sample)
{
int rc = 0x00;
+ struct q6asm_cal_info cal_info;
if (ac == NULL) {
pr_err("%s: APR handle NULL\n", __func__);
@@ -3589,9 +3598,10 @@
open.src_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2;
open.sink_format_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2;
/* source endpoint : matrix */
- open.audproc_topo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open.audproc_topo_id = cal_info.topology_id;
- ac->app_type = q6asm_get_asm_app_type_cal();
+ ac->app_type = cal_info.app_type;
if (ac->perf_mode == LOW_LATENCY_PCM_MODE)
open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION;
else
@@ -3620,9 +3630,10 @@
open.src_endpointype = 0;
open.sink_endpointype = 0;
/* source endpoint : matrix */
- open.postprocopo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open.postprocopo_id = cal_info.topology_id;
- ac->app_type = q6asm_get_asm_app_type_cal();
+ ac->app_type = cal_info.app_type;
ac->topology = open.postprocopo_id;
open.bits_per_sample = bits_per_sample;
open.reserved = 0;
@@ -3677,6 +3688,7 @@
{
int rc = 0x00;
struct asm_stream_cmd_open_transcode_loopback_t open;
+ struct q6asm_cal_info cal_info;
if (ac == NULL) {
pr_err("%s: APR handle NULL\n", __func__);
@@ -3724,9 +3736,11 @@
}
/* source endpoint : matrix */
- open.audproc_topo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open.audproc_topo_id = cal_info.topology_id;
- ac->app_type = q6asm_get_asm_app_type_cal();
+
+ ac->app_type = cal_info.app_type;
if (ac->perf_mode == LOW_LATENCY_PCM_MODE)
open.mode_flags |= ASM_LOW_LATENCY_STREAM_SESSION;
else
@@ -3896,6 +3910,7 @@
struct asm_stream_cmd_open_shared_io *open;
u8 *channel_mapping;
int i, size_of_open, num_watermarks, bufsz, bufcnt, rc, flags = 0;
+ struct q6asm_cal_info cal_info;
if (!ac || !config)
return -EINVAL;
@@ -3968,7 +3983,8 @@
open->endpoint_type = ASM_END_POINT_DEVICE_MATRIX;
open->topo_bits_per_sample = config->bits_per_sample;
- open->topo_id = q6asm_get_asm_topology_cal();
+ rc = q6asm_get_asm_topology_apptype(&cal_info);
+ open->topo_id = cal_info.topology_id;
if (config->format == FORMAT_LINEAR_PCM)
open->fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V3;
@@ -10344,51 +10360,39 @@
return app_type;
}
-static int q6asm_get_asm_topology_cal(void)
+/*
+ * Retrieving cal_block will mark cal_block as stale.
+ * Hence it cannot be reused or resent unless the flag
+ * is reset.
+ */
+static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info)
{
- int topology = DEFAULT_POPP_TOPOLOGY;
struct cal_block_data *cal_block = NULL;
+ cal_info->topology_id = DEFAULT_POPP_TOPOLOGY;
+ cal_info->app_type = DEFAULT_APP_TYPE;
+
if (cal_data[ASM_TOPOLOGY_CAL] == NULL)
goto done;
mutex_lock(&cal_data[ASM_TOPOLOGY_CAL]->lock);
cal_block = cal_utils_get_only_cal_block(cal_data[ASM_TOPOLOGY_CAL]);
- if (cal_block == NULL)
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block))
goto unlock;
-
- topology = ((struct audio_cal_info_asm_top *)
+ cal_info->topology_id = ((struct audio_cal_info_asm_top *)
cal_block->cal_info)->topology;
-unlock:
- mutex_unlock(&cal_data[ASM_TOPOLOGY_CAL]->lock);
-done:
- pr_debug("%s: Using topology %d\n", __func__, topology);
- return topology;
-}
-
-static int q6asm_get_asm_app_type_cal(void)
-{
- int app_type = DEFAULT_APP_TYPE;
- struct cal_block_data *cal_block = NULL;
-
- if (cal_data[ASM_TOPOLOGY_CAL] == NULL)
- goto done;
-
- mutex_lock(&cal_data[ASM_TOPOLOGY_CAL]->lock);
- cal_block = cal_utils_get_only_cal_block(cal_data[ASM_TOPOLOGY_CAL]);
- if (cal_block == NULL)
- goto unlock;
-
- app_type = ((struct audio_cal_info_asm_top *)
+ cal_info->app_type = ((struct audio_cal_info_asm_top *)
cal_block->cal_info)->app_type;
- if (app_type == 0)
- app_type = DEFAULT_APP_TYPE;
+ cal_utils_mark_cal_used(cal_block);
+
unlock:
mutex_unlock(&cal_data[ASM_TOPOLOGY_CAL]->lock);
done:
- pr_debug("%s: Using app_type %d\n", __func__, app_type);
- return app_type;
+ pr_debug("%s: Using topology %d app_type %d\n", __func__,
+ cal_info->topology_id, cal_info->app_type);
+
+ return 0;
}
/**
@@ -10423,8 +10427,9 @@
mutex_lock(&cal_data[ASM_AUDSTRM_CAL]->lock);
cal_block = cal_utils_get_only_cal_block(cal_data[ASM_AUDSTRM_CAL]);
- if (cal_block == NULL) {
- pr_err("%s: cal_block is NULL\n",
+ if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) {
+ rc = 0; /* not error case */
+ pr_err("%s: cal_block is NULL or stale\n",
__func__);
goto unlock;
}
@@ -10515,6 +10520,8 @@
goto free;
}
+ if (cal_block)
+ cal_utils_mark_cal_used(cal_block);
rc = 0;
free:
diff --git a/include/dsp/audio_cal_utils.h b/include/dsp/audio_cal_utils.h
index e12d8c1..6e5acfc 100644
--- a/include/dsp/audio_cal_utils.h
+++ b/include/dsp/audio_cal_utils.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014, 2019, 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
@@ -38,6 +38,7 @@
void *cal_info;
struct list_head list;
struct cal_data cal_data;
+ bool cal_stale;
struct mem_map_data map_data;
int32_t buffer_number;
};
@@ -99,4 +100,8 @@
/* Version of the cal type*/
int32_t cal_utils_get_cal_type_version(void *cal_type_data);
+
+void cal_utils_mark_cal_used(struct cal_block_data *cal_block);
+
+bool cal_utils_is_cal_stale(struct cal_block_data *cal_block);
#endif
diff --git a/include/dsp/q6asm-v2.h b/include/dsp/q6asm-v2.h
index 157c243..c2ff559 100644
--- a/include/dsp/q6asm-v2.h
+++ b/include/dsp/q6asm-v2.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2017, 2019, 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
@@ -246,6 +246,11 @@
struct shared_io_config config;
};
+struct q6asm_cal_info {
+ int topology_id;
+ int app_type;
+};
+
void q6asm_audio_client_free(struct audio_client *ac);
struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv);