mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
ASoC: msm: Fix delay in switching from WFD session
- When a running WFD session is paused/disconnected, there is a delay of about 10-15 seconds in switching audio from WFD sink to target. - pcm_write is blocked because pausing/disconnecting the WFD session closes the backend DAI before a new link is established. - Avoid closing afe if front end PCM session is still active. CRs-Fixed: 444163 CRs-Fixed: 425512 Change-Id: I1ad6de1e201aa6130c397007219c0d370c7be2a1 Signed-off-by: Satya Krishna Pindiproli <satyak@codeaurora.org>
This commit is contained in:
parent
3a8193dd58
commit
aa50f8292b
1 changed files with 41 additions and 5 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
|
||||
/* Copyright (c) 2010-2013, 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,8 @@ struct afe_ctl {
|
|||
static struct afe_ctl this_afe;
|
||||
|
||||
static struct acdb_cal_block afe_cal_addr[MAX_AUDPROC_TYPES];
|
||||
static int pcm_afe_instance[2];
|
||||
static int proxy_afe_instance[2];
|
||||
|
||||
#define TIMEOUT_MS 1000
|
||||
#define Q6AFE_MAX_VOLUME 0x3FFF
|
||||
|
@ -447,11 +449,22 @@ int afe_port_start(u16 port_id, union afe_port_config *afe_config,
|
|||
pr_debug("%s: %d %d\n", __func__, port_id, rate);
|
||||
|
||||
if ((port_id == RT_PROXY_DAI_001_RX) ||
|
||||
(port_id == RT_PROXY_DAI_002_TX))
|
||||
return 0;
|
||||
if ((port_id == RT_PROXY_DAI_002_RX) ||
|
||||
(port_id == RT_PROXY_DAI_001_TX))
|
||||
(port_id == RT_PROXY_DAI_002_TX)) {
|
||||
pr_debug("%s: before incrementing pcm_afe_instance %d"\
|
||||
"port_id %d\n", __func__,
|
||||
pcm_afe_instance[port_id & 0x1], port_id);
|
||||
port_id = VIRTUAL_ID_TO_PORTID(port_id);
|
||||
pcm_afe_instance[port_id & 0x1]++;
|
||||
return 0;
|
||||
}
|
||||
if ((port_id == RT_PROXY_DAI_002_RX) ||
|
||||
(port_id == RT_PROXY_DAI_001_TX)) {
|
||||
pr_debug("%s: before incrementing proxy_afe_instance %d"\
|
||||
"port_id %d\n", __func__,
|
||||
proxy_afe_instance[port_id & 0x1], port_id);
|
||||
port_id = VIRTUAL_ID_TO_PORTID(port_id);
|
||||
proxy_afe_instance[port_id & 0x1]++;
|
||||
}
|
||||
|
||||
ret = afe_q6_interface_prepare();
|
||||
if (IS_ERR_VALUE(ret))
|
||||
|
@ -1700,6 +1713,29 @@ int afe_close(int port_id)
|
|||
goto fail_cmd;
|
||||
}
|
||||
pr_debug("%s: port_id=%d\n", __func__, port_id);
|
||||
|
||||
if ((port_id == RT_PROXY_DAI_001_RX) ||
|
||||
(port_id == RT_PROXY_DAI_002_TX)) {
|
||||
pr_debug("%s: before decrementing pcm_afe_instance %d\n",
|
||||
__func__, pcm_afe_instance[port_id & 0x1]);
|
||||
port_id = VIRTUAL_ID_TO_PORTID(port_id);
|
||||
pcm_afe_instance[port_id & 0x1]--;
|
||||
if (!(pcm_afe_instance[port_id & 0x1] == 0 &&
|
||||
proxy_afe_instance[port_id & 0x1] == 0))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((port_id == RT_PROXY_DAI_002_RX) ||
|
||||
(port_id == RT_PROXY_DAI_001_TX)) {
|
||||
pr_debug("%s: before decrementing proxy_afe_instance %d\n",
|
||||
__func__, proxy_afe_instance[port_id & 0x1]);
|
||||
port_id = VIRTUAL_ID_TO_PORTID(port_id);
|
||||
proxy_afe_instance[port_id & 0x1]--;
|
||||
if (!(pcm_afe_instance[port_id & 0x1] == 0 &&
|
||||
proxy_afe_instance[port_id & 0x1] == 0))
|
||||
return 0;
|
||||
}
|
||||
|
||||
port_id = afe_convert_virtual_to_portid(port_id);
|
||||
|
||||
stop.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
|
||||
|
|
Loading…
Reference in a new issue