msm: audio: qdsp6v2: Support for RX & TX ADM topology
This adds support to store separate RX & TX topology for
the audio device manager (ADM).
Signed-off-by: Ben Romberger <bromberg@codeaurora.org>
diff --git a/arch/arm/mach-msm/include/mach/qdsp6v2/audio_acdb.h b/arch/arm/mach-msm/include/mach/qdsp6v2/audio_acdb.h
index 477a122..1251e5b 100644
--- a/arch/arm/mach-msm/include/mach/qdsp6v2/audio_acdb.h
+++ b/arch/arm/mach-msm/include/mach/qdsp6v2/audio_acdb.h
@@ -18,6 +18,12 @@
#define NUM_AUDPROC_BUFFERS 6
+enum {
+ RX_CAL,
+ TX_CAL,
+ MAX_AUDPROC_TYPES
+};
+
struct acdb_cal_block {
uint32_t cal_size;
uint32_t cal_kvaddr;
@@ -37,7 +43,8 @@
uint32_t get_voice_rx_topology(void);
uint32_t get_voice_tx_topology(void);
-uint32_t get_adm_topology(void);
+uint32_t get_adm_rx_topology(void);
+uint32_t get_adm_tx_topology(void);
uint32_t get_asm_topology(void);
void get_all_voice_cal(struct acdb_cal_block *cal_block);
void get_all_cvp_cal(struct acdb_cal_block *cal_block);
diff --git a/arch/arm/mach-msm/include/mach/qdsp6v2/audio_dev_ctl.h b/arch/arm/mach-msm/include/mach/qdsp6v2/audio_dev_ctl.h
index 5358209..ee87e86 100644
--- a/arch/arm/mach-msm/include/mach/qdsp6v2/audio_dev_ctl.h
+++ b/arch/arm/mach-msm/include/mach/qdsp6v2/audio_dev_ctl.h
@@ -30,6 +30,11 @@
per clients, MAX_BIT_PER_CLIENT >= MAX_SESSIONS */
#define MAX_BIT_PER_CLIENT 16
+/* Path ID used by dev ctrl & Q6 */
+#define PLAYBACK 0x1
+#define LIVE_RECORDING 0x2
+#define NON_LIVE_RECORDING 0x3
+
#define VOICE_STATE_INVALID 0x0
#define VOICE_STATE_INCALL 0x1
#define VOICE_STATE_OFFCALL 0x2
diff --git a/arch/arm/mach-msm/qdsp6v2/audio_acdb.c b/arch/arm/mach-msm/qdsp6v2/audio_acdb.c
index 7ce070c..7be28a7 100644
--- a/arch/arm/mach-msm/qdsp6v2/audio_acdb.c
+++ b/arch/arm/mach-msm/qdsp6v2/audio_acdb.c
@@ -29,12 +29,6 @@
#define ACDB_BLOCK_SIZE 4096
#define NUM_VOCPROC_BLOCKS 18
-enum {
- RX_CAL,
- TX_CAL,
- MAX_AUDPROC_TYPES
-};
-
struct acdb_data {
struct mutex acdb_mutex;
@@ -42,8 +36,8 @@
struct acdb_cal_block anc_cal;
/* AudProc Cal */
- uint32_t adm_topology;
uint32_t asm_topology;
+ uint32_t adm_topology[MAX_AUDPROC_TYPES];
struct acdb_cal_block audproc_cal[MAX_AUDPROC_TYPES];
struct acdb_cal_block audstrm_cal[MAX_AUDPROC_TYPES];
struct acdb_cal_block audvol_cal[MAX_AUDPROC_TYPES];
@@ -98,14 +92,24 @@
acdb_data.voice_tx_topology = topology;
}
-uint32_t get_adm_topology(void)
+uint32_t get_adm_rx_topology(void)
{
- return acdb_data.adm_topology;
+ return acdb_data.adm_topology[RX_CAL];
}
-void store_adm_topology(uint32_t topology)
+void store_adm_rx_topology(uint32_t topology)
{
- acdb_data.adm_topology = topology;
+ acdb_data.adm_topology[RX_CAL] = topology;
+}
+
+uint32_t get_adm_tx_topology(void)
+{
+ return acdb_data.adm_topology[TX_CAL];
+}
+
+void store_adm_tx_topology(uint32_t topology)
+{
+ acdb_data.adm_topology[TX_CAL] = topology;
}
uint32_t get_asm_topology(void)
@@ -709,13 +713,21 @@
}
store_voice_tx_topology(topology);
goto done;
- case AUDIO_SET_ADM_TOPOLOGY:
+ case AUDIO_SET_ADM_RX_TOPOLOGY:
if (copy_from_user(&topology, (void *)arg,
sizeof(topology))) {
pr_err("%s: fail to copy topology!\n", __func__);
result = -EFAULT;
}
- store_adm_topology(topology);
+ store_adm_rx_topology(topology);
+ goto done;
+ case AUDIO_SET_ADM_TX_TOPOLOGY:
+ if (copy_from_user(&topology, (void *)arg,
+ sizeof(topology))) {
+ pr_err("%s: fail to copy topology!\n", __func__);
+ result = -EFAULT;
+ }
+ store_adm_tx_topology(topology);
goto done;
case AUDIO_SET_ASM_TOPOLOGY:
if (copy_from_user(&topology, (void *)arg,
diff --git a/arch/arm/mach-msm/qdsp6v2/audio_dev_ctl.c b/arch/arm/mach-msm/qdsp6v2/audio_dev_ctl.c
index 08e5266..9415306 100644
--- a/arch/arm/mach-msm/qdsp6v2/audio_dev_ctl.c
+++ b/arch/arm/mach-msm/qdsp6v2/audio_dev_ctl.c
@@ -45,9 +45,6 @@
static struct audio_dev_ctrl_state audio_dev_ctrl;
struct event_listner event;
-#define PLAYBACK 0x1
-#define LIVE_RECORDING 0x2
-#define NON_LIVE_RECORDING 0x3
#define MAX_COPP_DEVICES 4
struct session_freq {
diff --git a/include/linux/msm_audio_acdb.h b/include/linux/msm_audio_acdb.h
index 04cb67f..546c57a 100644
--- a/include/linux/msm_audio_acdb.h
+++ b/include/linux/msm_audio_acdb.h
@@ -29,10 +29,12 @@
(AUDIO_MAX_COMMON_IOCTL_NUM+11), unsigned)
#define AUDIO_SET_VOICE_TX_TOPOLOGY _IOW(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+12), unsigned)
-#define AUDIO_SET_ADM_TOPOLOGY _IOW(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_SET_ADM_RX_TOPOLOGY _IOW(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+13), unsigned)
-#define AUDIO_SET_ASM_TOPOLOGY _IOW(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_SET_ADM_TX_TOPOLOGY _IOW(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+14), unsigned)
+#define AUDIO_SET_ASM_TOPOLOGY _IOW(AUDIO_IOCTL_MAGIC, \
+ (AUDIO_MAX_COMMON_IOCTL_NUM+15), unsigned)
/* ACDB structures */
struct cal_block {
@@ -47,27 +49,27 @@
/* For Real-Time Audio Calibration */
#define AUDIO_GET_RTAC_DEV_CTRL_INFO _IOR(AUDIO_IOCTL_MAGIC, \
- (AUDIO_MAX_COMMON_IOCTL_NUM+15), unsigned)
-#define AUDIO_GET_RTAC_ADM_INFO _IOR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+16), unsigned)
-#define AUDIO_GET_RTAC_VOICE_INFO _IOR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_GET_RTAC_ADM_INFO _IOR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+17), unsigned)
-#define AUDIO_GET_RTAC_ADM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_GET_RTAC_VOICE_INFO _IOR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+18), unsigned)
-#define AUDIO_SET_RTAC_ADM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_GET_RTAC_ADM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+19), unsigned)
-#define AUDIO_GET_RTAC_ASM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_SET_RTAC_ADM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+20), unsigned)
-#define AUDIO_SET_RTAC_ASM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_GET_RTAC_ASM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+21), unsigned)
-#define AUDIO_GET_RTAC_CVS_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_SET_RTAC_ASM_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+22), unsigned)
-#define AUDIO_SET_RTAC_CVS_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_GET_RTAC_CVS_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+23), unsigned)
-#define AUDIO_GET_RTAC_CVP_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_SET_RTAC_CVS_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+24), unsigned)
-#define AUDIO_SET_RTAC_CVP_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+#define AUDIO_GET_RTAC_CVP_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
(AUDIO_MAX_COMMON_IOCTL_NUM+25), unsigned)
+#define AUDIO_SET_RTAC_CVP_CAL _IOWR(AUDIO_IOCTL_MAGIC, \
+ (AUDIO_MAX_COMMON_IOCTL_NUM+26), unsigned)
#endif /* __MSM_AUDIO_ACDB_H */
diff --git a/sound/soc/msm/qdsp6/q6adm.c b/sound/soc/msm/qdsp6/q6adm.c
index 65d1fbc..4170a6a 100644
--- a/sound/soc/msm/qdsp6/q6adm.c
+++ b/sound/soc/msm/qdsp6/q6adm.c
@@ -344,7 +344,12 @@
open.endpoint_id1 = port_id;
open.endpoint_id2 = 0xFFFF;
- open.topology_id = get_adm_topology();
+ /* convert path to acdb path */
+ if (path == PLAYBACK)
+ open.topology_id = get_adm_rx_topology();
+ else
+ open.topology_id = get_adm_tx_topology();
+
if (open.topology_id == 0)
open.topology_id = topology;
@@ -438,7 +443,12 @@
open.endpoint_id1 = port_id;
open.endpoint_id2 = 0xFFFF;
- open.topology_id = get_adm_topology();
+ /* convert path to acdb path */
+ if (path == PLAYBACK)
+ open.topology_id = get_adm_rx_topology();
+ else
+ open.topology_id = get_adm_tx_topology();
+
if (open.topology_id == 0)
open.topology_id = topology;