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;