msm: audio: qdsp6v2: Change RTAC to remove ADM devices correctly

This creates a separate function in Real-Time Audio
Calibration (RTAC) to remove popp's from all ADM devices.
This also removes popp information from the RTAC remove
ADM device function and calls that function from ADM close.

Change-Id: I6aed7717a789cdbce5ce39b42d945853a7524418
CRs-fixed: 306716
Signed-off-by: Ben Romberger <bromberg@codeaurora.org>
This commit is contained in:
Ben Romberger
2011-10-19 23:04:02 -07:00
parent 54932793d5
commit 93d4d2db90
4 changed files with 34 additions and 24 deletions

View File

@@ -20,7 +20,8 @@
#define RTAC_VOICE_MODES 2
void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id);
void rtac_remove_adm_device(u32 port_id, u32 popp_id);
void rtac_remove_adm_device(u32 port_id);
void rtac_remove_popp_from_adm_devices(u32 popp_id);
void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port,
u32 tx_afe_port, u32 session_id);
void rtac_remove_voice(u32 cvs_handle);

View File

@@ -28,7 +28,8 @@
#ifndef CONFIG_RTAC
void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id) {}
void rtac_remove_adm_device(u32 port_id, u32 popp_id) {}
void rtac_remove_adm_device(u32 port_id) {}
void rtac_remove_popp_from_adm_devices(u32 popp_id) {}
void rtac_set_adm_handle(void *handle) {}
bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size)
{return false; }
@@ -222,44 +223,49 @@ static void shift_popp(u32 copp_idx, u32 popp_idx)
}
}
void rtac_remove_adm_device(u32 port_id, u32 popp_id)
void rtac_remove_adm_device(u32 port_id)
{
s32 i, j;
pr_debug("%s: port_id = %d, popp_id = %d\n", __func__, port_id,
popp_id);
s32 i;
pr_debug("%s: port_id = %d\n", __func__, port_id);
mutex_lock(&rtac_adm_mutex);
/* look for device */
for (i = 0; i < rtac_adm_data.num_of_dev; i++) {
if (rtac_adm_data.device[i].afe_port == port_id) {
if (rtac_adm_data.device[i].num_of_popp == 1) {
memset(&rtac_adm_data.device[i], 0,
sizeof(rtac_adm_data.device[i]));
rtac_adm_data.num_of_dev--;
} else {
for (j = 0; j <
rtac_adm_data.device[i].num_of_popp; j++) {
if (rtac_adm_data.device[i].popp[j] ==
popp_id) {
rtac_adm_data.device[i].popp[j]
= 0;
rtac_adm_data.device[i].num_of_popp--;
shift_popp(i, j);
goto done;
}
}
}
memset(&rtac_adm_data.device[i], 0,
sizeof(rtac_adm_data.device[i]));
rtac_adm_data.num_of_dev--;
if (rtac_adm_data.num_of_dev >= 1) {
shift_adm_devices(i);
break;
}
}
}
done:
mutex_unlock(&rtac_adm_mutex);
return;
}
void rtac_remove_popp_from_adm_devices(u32 popp_id)
{
s32 i, j;
pr_debug("%s: popp_id = %d\n", __func__, popp_id);
mutex_lock(&rtac_adm_mutex);
for (i = 0; i < rtac_adm_data.num_of_dev; i++) {
for (j = 0; j < rtac_adm_data.device[i].num_of_popp; j++) {
if (rtac_adm_data.device[i].popp[j] == popp_id) {
rtac_adm_data.device[i].popp[j] = 0;
rtac_adm_data.device[i].num_of_popp--;
shift_popp(i, j);
}
}
}
mutex_unlock(&rtac_adm_mutex);
}
/* Voice Info */
static void set_rtac_voice_data(int idx, u32 cvs_handle, u32 cvp_handle,

View File

@@ -609,6 +609,8 @@ int adm_close(int port_id)
ret = -EINVAL;
goto fail_cmd;
}
rtac_remove_adm_device(port_id);
}
fail_cmd:

View File

@@ -205,6 +205,7 @@ static int q6asm_session_alloc(struct audio_client *ac)
static void q6asm_session_free(struct audio_client *ac)
{
pr_debug("%s: sessionid[%d]\n", __func__, ac->session);
rtac_remove_popp_from_adm_devices(ac->session);
mutex_lock(&session_lock);
session[ac->session] = 0;
mutex_unlock(&session_lock);