xref: /openbmc/linux/sound/soc/codecs/lpass-tx-macro.c (revision d0c44de2d8ffd2e4780d360b34ee6614aa4af080)
1c39667ddSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0-only
2c39667ddSSrinivas Kandagatla // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
3c39667ddSSrinivas Kandagatla 
4c39667ddSSrinivas Kandagatla #include <linux/module.h>
5c39667ddSSrinivas Kandagatla #include <linux/init.h>
6c39667ddSSrinivas Kandagatla #include <linux/clk.h>
7c39667ddSSrinivas Kandagatla #include <linux/io.h>
8c39667ddSSrinivas Kandagatla #include <linux/platform_device.h>
9512864c4SSrinivas Kandagatla #include <linux/pm_runtime.h>
10c39667ddSSrinivas Kandagatla #include <linux/regmap.h>
11c39667ddSSrinivas Kandagatla #include <sound/soc.h>
12c39667ddSSrinivas Kandagatla #include <sound/soc-dapm.h>
13c39667ddSSrinivas Kandagatla #include <sound/tlv.h>
14c39667ddSSrinivas Kandagatla #include <linux/of_clk.h>
15c39667ddSSrinivas Kandagatla #include <linux/clk-provider.h>
16c39667ddSSrinivas Kandagatla 
179e3d83c5SSrinivasa Rao Mandadapu #include "lpass-macro-common.h"
189e3d83c5SSrinivasa Rao Mandadapu 
19c39667ddSSrinivas Kandagatla #define CDC_TX_CLK_RST_CTRL_MCLK_CONTROL (0x0000)
20c39667ddSSrinivas Kandagatla #define CDC_TX_MCLK_EN_MASK		BIT(0)
21c39667ddSSrinivas Kandagatla #define CDC_TX_MCLK_ENABLE		BIT(0)
22c39667ddSSrinivas Kandagatla #define CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL (0x0004)
23c39667ddSSrinivas Kandagatla #define CDC_TX_FS_CNT_EN_MASK		BIT(0)
24c39667ddSSrinivas Kandagatla #define CDC_TX_FS_CNT_ENABLE		BIT(0)
25c39667ddSSrinivas Kandagatla #define CDC_TX_CLK_RST_CTRL_SWR_CONTROL	(0x0008)
26c39667ddSSrinivas Kandagatla #define CDC_TX_SWR_RESET_MASK		BIT(1)
27c39667ddSSrinivas Kandagatla #define CDC_TX_SWR_RESET_ENABLE		BIT(1)
28c39667ddSSrinivas Kandagatla #define CDC_TX_SWR_CLK_EN_MASK		BIT(0)
29c39667ddSSrinivas Kandagatla #define CDC_TX_SWR_CLK_ENABLE		BIT(0)
30c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_TOP_CFG0		(0x0080)
31c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_ANC_CFG		(0x0084)
32c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_CTRL		(0x0088)
33c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_FREQ_MCLK	(0x0090)
34c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_DEBUG_BUS	(0x0094)
35c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_DEBUG_EN		(0x0098)
36c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_TX_I2S_CTL	(0x00A4)
37c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_I2S_CLK		(0x00A8)
38c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_I2S_RESET	(0x00AC)
39c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_DMICn_CTL(n)	(0x00C0 + n * 0x4)
40c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_DMIC0_CTL	(0x00C0)
41c39667ddSSrinivas Kandagatla #define CDC_TX_SWR_DMIC_CLK_SEL_MASK	GENMASK(3, 1)
42c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_DMIC1_CTL	(0x00C4)
43c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_DMIC2_CTL	(0x00C8)
44c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_DMIC3_CTL	(0x00CC)
45c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_AMIC0_CTL	(0x00D0)
46c39667ddSSrinivas Kandagatla #define CDC_TX_TOP_CSR_SWR_AMIC1_CTL	(0x00D4)
47c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUXn_CFG0(n)	(0x0100 + 0x8 * n)
48c39667ddSSrinivas Kandagatla #define CDC_TX_MACRO_SWR_MIC_MUX_SEL_MASK GENMASK(3, 0)
49710ccba0SSrinivas Kandagatla #define CDC_TX_MACRO_DMIC_MUX_SEL_MASK GENMASK(7, 4)
50c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX0_CFG0	(0x0100)
51c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUXn_CFG1(n)	(0x0104 + 0x8 * n)
52c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX0_CFG1	(0x0104)
53c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX1_CFG0	(0x0108)
54c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX1_CFG1	(0x010C)
55c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX2_CFG0	(0x0110)
56c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX2_CFG1	(0x0114)
57c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX3_CFG0	(0x0118)
58c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX3_CFG1	(0x011C)
59c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX4_CFG0	(0x0120)
60c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX4_CFG1	(0x0124)
61c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX5_CFG0	(0x0128)
62c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX5_CFG1	(0x012C)
63c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX6_CFG0	(0x0130)
64c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX6_CFG1	(0x0134)
65c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX7_CFG0	(0x0138)
66c39667ddSSrinivas Kandagatla #define CDC_TX_INP_MUX_ADC_MUX7_CFG1	(0x013C)
67c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_CLK_RESET_CTL	(0x0200)
68c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_MODE_1_CTL		(0x0204)
69c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_MODE_2_CTL		(0x0208)
70c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_FF_SHIFT		(0x020C)
71c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_FB_SHIFT		(0x0210)
72c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_LPF_FF_A_CTL	(0x0214)
73c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_LPF_FF_B_CTL	(0x0218)
74c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_LPF_FB_CTL		(0x021C)
75c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_SMLPF_CTL		(0x0220)
76c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_DCFLT_SHIFT_CTL	(0x0224)
77c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_IIR_ADAPT_CTL	(0x0228)
78c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_IIR_COEFF_1_CTL	(0x022C)
79c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_IIR_COEFF_2_CTL	(0x0230)
80c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_FF_A_GAIN_CTL	(0x0234)
81c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_FF_B_GAIN_CTL	(0x0238)
82c39667ddSSrinivas Kandagatla #define CDC_TX_ANC0_FB_GAIN_CTL		(0x023C)
83c39667ddSSrinivas Kandagatla #define CDC_TXn_TX_PATH_CTL(n)		(0x0400 + 0x80 * n)
84c39667ddSSrinivas Kandagatla #define CDC_TXn_PCM_RATE_MASK		GENMASK(3, 0)
85c39667ddSSrinivas Kandagatla #define CDC_TXn_PGA_MUTE_MASK		BIT(4)
86c39667ddSSrinivas Kandagatla #define CDC_TXn_CLK_EN_MASK		BIT(5)
87c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_CTL		(0x0400)
88c39667ddSSrinivas Kandagatla #define CDC_TXn_TX_PATH_CFG0(n)		(0x0404 + 0x80 * n)
89c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_CFG0		(0x0404)
90c39667ddSSrinivas Kandagatla #define CDC_TXn_PH_EN_MASK		BIT(0)
91c39667ddSSrinivas Kandagatla #define CDC_TXn_ADC_MODE_MASK		GENMASK(2, 1)
92c39667ddSSrinivas Kandagatla #define CDC_TXn_HPF_CUT_FREQ_MASK	GENMASK(6, 5)
93c39667ddSSrinivas Kandagatla #define CDC_TXn_ADC_DMIC_SEL_MASK	BIT(7)
94c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_CFG1		(0x0408)
95c39667ddSSrinivas Kandagatla #define CDC_TXn_TX_VOL_CTL(n)		(0x040C + 0x80 * n)
96c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_VOL_CTL		(0x040C)
97c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC0		(0x0410)
98c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC1		(0x0414)
99c39667ddSSrinivas Kandagatla #define CDC_TXn_TX_PATH_SEC2(n)		(0x0418 + 0x80 * n)
100c39667ddSSrinivas Kandagatla #define CDC_TXn_HPF_F_CHANGE_MASK	 BIT(1)
101c39667ddSSrinivas Kandagatla #define CDC_TXn_HPF_ZERO_GATE_MASK	 BIT(0)
102c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC2		(0x0418)
103c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC3		(0x041C)
104c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC4		(0x0420)
105c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC5		(0x0424)
106c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC6		(0x0428)
107c39667ddSSrinivas Kandagatla #define CDC_TX0_TX_PATH_SEC7		(0x042C)
108c39667ddSSrinivas Kandagatla #define CDC_TX0_MBHC_CTL_EN_MASK	BIT(6)
109c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_CTL		(0x0480)
110c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_CFG0		(0x0484)
111c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_CFG1		(0x0488)
112c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_VOL_CTL		(0x048C)
113c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC0		(0x0490)
114c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC1		(0x0494)
115c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC2		(0x0498)
116c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC3		(0x049C)
117c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC4		(0x04A0)
118c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC5		(0x04A4)
119c39667ddSSrinivas Kandagatla #define CDC_TX1_TX_PATH_SEC6		(0x04A8)
120c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_CTL		(0x0500)
121c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_CFG0		(0x0504)
122c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_CFG1		(0x0508)
123c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_VOL_CTL		(0x050C)
124c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC0		(0x0510)
125c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC1		(0x0514)
126c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC2		(0x0518)
127c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC3		(0x051C)
128c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC4		(0x0520)
129c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC5		(0x0524)
130c39667ddSSrinivas Kandagatla #define CDC_TX2_TX_PATH_SEC6		(0x0528)
131c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_CTL		(0x0580)
132c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_CFG0		(0x0584)
133c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_CFG1		(0x0588)
134c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_VOL_CTL		(0x058C)
135c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC0		(0x0590)
136c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC1		(0x0594)
137c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC2		(0x0598)
138c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC3		(0x059C)
139c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC4		(0x05A0)
140c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC5		(0x05A4)
141c39667ddSSrinivas Kandagatla #define CDC_TX3_TX_PATH_SEC6		(0x05A8)
142c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_CTL		(0x0600)
143c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_CFG0		(0x0604)
144c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_CFG1		(0x0608)
145c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_VOL_CTL		(0x060C)
146c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC0		(0x0610)
147c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC1		(0x0614)
148c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC2		(0x0618)
149c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC3		(0x061C)
150c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC4		(0x0620)
151c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC5		(0x0624)
152c39667ddSSrinivas Kandagatla #define CDC_TX4_TX_PATH_SEC6		(0x0628)
153c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_CTL		(0x0680)
154c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_CFG0		(0x0684)
155c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_CFG1		(0x0688)
156c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_VOL_CTL		(0x068C)
157c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC0		(0x0690)
158c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC1		(0x0694)
159c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC2		(0x0698)
160c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC3		(0x069C)
161c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC4		(0x06A0)
162c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC5		(0x06A4)
163c39667ddSSrinivas Kandagatla #define CDC_TX5_TX_PATH_SEC6		(0x06A8)
164c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_CTL		(0x0700)
165c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_CFG0		(0x0704)
166c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_CFG1		(0x0708)
167c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_VOL_CTL		(0x070C)
168c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC0		(0x0710)
169c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC1		(0x0714)
170c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC2		(0x0718)
171c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC3		(0x071C)
172c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC4		(0x0720)
173c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC5		(0x0724)
174c39667ddSSrinivas Kandagatla #define CDC_TX6_TX_PATH_SEC6		(0x0728)
175c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_CTL		(0x0780)
176c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_CFG0		(0x0784)
177c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_CFG1		(0x0788)
178c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_VOL_CTL		(0x078C)
179c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC0		(0x0790)
180c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC1		(0x0794)
181c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC2		(0x0798)
182c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC3		(0x079C)
183c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC4		(0x07A0)
184c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC5		(0x07A4)
185c39667ddSSrinivas Kandagatla #define CDC_TX7_TX_PATH_SEC6		(0x07A8)
186c39667ddSSrinivas Kandagatla #define TX_MAX_OFFSET			(0x07A8)
187c39667ddSSrinivas Kandagatla 
188c39667ddSSrinivas Kandagatla #define TX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
189c39667ddSSrinivas Kandagatla 			SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
190c39667ddSSrinivas Kandagatla 			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
191c39667ddSSrinivas Kandagatla #define TX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
192c39667ddSSrinivas Kandagatla 			SNDRV_PCM_FMTBIT_S24_LE |\
193c39667ddSSrinivas Kandagatla 			SNDRV_PCM_FMTBIT_S24_3LE)
194c39667ddSSrinivas Kandagatla 
195c39667ddSSrinivas Kandagatla #define  CF_MIN_3DB_4HZ			0x0
196c39667ddSSrinivas Kandagatla #define  CF_MIN_3DB_75HZ		0x1
197c39667ddSSrinivas Kandagatla #define  CF_MIN_3DB_150HZ		0x2
198c39667ddSSrinivas Kandagatla #define	TX_ADC_MAX	5
199c39667ddSSrinivas Kandagatla #define TX_ADC_TO_DMIC(n) ((n - TX_ADC_MAX)/2)
200c39667ddSSrinivas Kandagatla #define NUM_DECIMATORS 8
201c39667ddSSrinivas Kandagatla #define TX_NUM_CLKS_MAX	5
202c39667ddSSrinivas Kandagatla #define TX_MACRO_DMIC_UNMUTE_DELAY_MS	40
203c39667ddSSrinivas Kandagatla #define TX_MACRO_AMIC_UNMUTE_DELAY_MS	100
204c39667ddSSrinivas Kandagatla #define TX_MACRO_DMIC_HPF_DELAY_MS	300
205c39667ddSSrinivas Kandagatla #define TX_MACRO_AMIC_HPF_DELAY_MS	300
206e7621434SSrinivas Kandagatla #define MCLK_FREQ		19200000
207c39667ddSSrinivas Kandagatla 
208c39667ddSSrinivas Kandagatla enum {
209c39667ddSSrinivas Kandagatla 	TX_MACRO_AIF_INVALID = 0,
210c39667ddSSrinivas Kandagatla 	TX_MACRO_AIF1_CAP,
211c39667ddSSrinivas Kandagatla 	TX_MACRO_AIF2_CAP,
212c39667ddSSrinivas Kandagatla 	TX_MACRO_AIF3_CAP,
213c39667ddSSrinivas Kandagatla 	TX_MACRO_MAX_DAIS
214c39667ddSSrinivas Kandagatla };
215c39667ddSSrinivas Kandagatla 
216c39667ddSSrinivas Kandagatla enum {
217c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC0,
218c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC1,
219c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC2,
220c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC3,
221c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC4,
222c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC5,
223c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC6,
224c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC7,
225c39667ddSSrinivas Kandagatla 	TX_MACRO_DEC_MAX,
226c39667ddSSrinivas Kandagatla };
227c39667ddSSrinivas Kandagatla 
228c39667ddSSrinivas Kandagatla enum {
229c39667ddSSrinivas Kandagatla 	TX_MACRO_CLK_DIV_2,
230c39667ddSSrinivas Kandagatla 	TX_MACRO_CLK_DIV_3,
231c39667ddSSrinivas Kandagatla 	TX_MACRO_CLK_DIV_4,
232c39667ddSSrinivas Kandagatla 	TX_MACRO_CLK_DIV_6,
233c39667ddSSrinivas Kandagatla 	TX_MACRO_CLK_DIV_8,
234c39667ddSSrinivas Kandagatla 	TX_MACRO_CLK_DIV_16,
235c39667ddSSrinivas Kandagatla };
236c39667ddSSrinivas Kandagatla 
237c39667ddSSrinivas Kandagatla enum {
238c39667ddSSrinivas Kandagatla 	MSM_DMIC,
239c39667ddSSrinivas Kandagatla 	SWR_MIC,
240c39667ddSSrinivas Kandagatla 	ANC_FB_TUNE1
241c39667ddSSrinivas Kandagatla };
242c39667ddSSrinivas Kandagatla 
243c39667ddSSrinivas Kandagatla struct tx_mute_work {
244c39667ddSSrinivas Kandagatla 	struct tx_macro *tx;
245e5e7e398SRavulapati Vishnu Vardhan Rao 	u8 decimator;
246c39667ddSSrinivas Kandagatla 	struct delayed_work dwork;
247c39667ddSSrinivas Kandagatla };
248c39667ddSSrinivas Kandagatla 
249c39667ddSSrinivas Kandagatla struct hpf_work {
250c39667ddSSrinivas Kandagatla 	struct tx_macro *tx;
251c39667ddSSrinivas Kandagatla 	u8 decimator;
252c39667ddSSrinivas Kandagatla 	u8 hpf_cut_off_freq;
253c39667ddSSrinivas Kandagatla 	struct delayed_work dwork;
254c39667ddSSrinivas Kandagatla };
255c39667ddSSrinivas Kandagatla 
256c39667ddSSrinivas Kandagatla struct tx_macro {
257c39667ddSSrinivas Kandagatla 	struct device *dev;
258c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component;
259c39667ddSSrinivas Kandagatla 	struct hpf_work tx_hpf_work[NUM_DECIMATORS];
260c39667ddSSrinivas Kandagatla 	struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS];
261c39667ddSSrinivas Kandagatla 	unsigned long active_ch_mask[TX_MACRO_MAX_DAIS];
262c39667ddSSrinivas Kandagatla 	unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS];
2631c6a7f52SSrinivas Kandagatla 	int active_decimator[TX_MACRO_MAX_DAIS];
264c39667ddSSrinivas Kandagatla 	struct regmap *regmap;
265512864c4SSrinivas Kandagatla 	struct clk *mclk;
266512864c4SSrinivas Kandagatla 	struct clk *npl;
267512864c4SSrinivas Kandagatla 	struct clk *macro;
268512864c4SSrinivas Kandagatla 	struct clk *dcodec;
269512864c4SSrinivas Kandagatla 	struct clk *fsgen;
270c39667ddSSrinivas Kandagatla 	struct clk_hw hw;
271c39667ddSSrinivas Kandagatla 	bool dec_active[NUM_DECIMATORS];
272c39667ddSSrinivas Kandagatla 	int tx_mclk_users;
273c39667ddSSrinivas Kandagatla 	u16 dmic_clk_div;
274c39667ddSSrinivas Kandagatla 	bool bcs_enable;
275c39667ddSSrinivas Kandagatla 	int dec_mode[NUM_DECIMATORS];
2769e3d83c5SSrinivasa Rao Mandadapu 	struct lpass_macro *pds;
277c39667ddSSrinivas Kandagatla 	bool bcs_clk_en;
278c39667ddSSrinivas Kandagatla };
279c39667ddSSrinivas Kandagatla #define to_tx_macro(_hw) container_of(_hw, struct tx_macro, hw)
280c39667ddSSrinivas Kandagatla 
281c39667ddSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
282c39667ddSSrinivas Kandagatla 
2837b285c74SSrinivasa Rao Mandadapu static struct reg_default tx_defaults[] = {
284c39667ddSSrinivas Kandagatla 	/* TX Macro */
285c39667ddSSrinivas Kandagatla 	{ CDC_TX_CLK_RST_CTRL_MCLK_CONTROL, 0x00 },
286c39667ddSSrinivas Kandagatla 	{ CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00 },
287c39667ddSSrinivas Kandagatla 	{ CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 0x00},
288c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_TOP_CFG0, 0x00},
289c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_ANC_CFG, 0x00},
290c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_CTRL, 0x00},
291c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_FREQ_MCLK, 0x00},
292c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_DEBUG_BUS, 0x00},
293c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_DEBUG_EN, 0x00},
294c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_TX_I2S_CTL, 0x0C},
295c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_I2S_CLK, 0x00},
296c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_I2S_RESET, 0x00},
297c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_DMIC0_CTL, 0x00},
298c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_DMIC1_CTL, 0x00},
299c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_DMIC2_CTL, 0x00},
300c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_DMIC3_CTL, 0x00},
301c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_AMIC0_CTL, 0x00},
302c39667ddSSrinivas Kandagatla 	{ CDC_TX_TOP_CSR_SWR_AMIC1_CTL, 0x00},
303c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0x00},
304c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0x00},
305c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0x00},
306c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0x00},
307c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0x00},
308c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0x00},
309c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0x00},
310c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0x00},
311c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0x00},
312c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX4_CFG1, 0x00},
313c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0x00},
314c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX5_CFG1, 0x00},
315c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0x00},
316c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX6_CFG1, 0x00},
317c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0x00},
318c39667ddSSrinivas Kandagatla 	{ CDC_TX_INP_MUX_ADC_MUX7_CFG1, 0x00},
319c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_CLK_RESET_CTL, 0x00},
320c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_MODE_1_CTL, 0x00},
321c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_MODE_2_CTL, 0x00},
322c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_FF_SHIFT, 0x00},
323c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_FB_SHIFT, 0x00},
324c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_LPF_FF_A_CTL, 0x00},
325c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_LPF_FF_B_CTL, 0x00},
326c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_LPF_FB_CTL, 0x00},
327c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_SMLPF_CTL, 0x00},
328c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_DCFLT_SHIFT_CTL, 0x00},
329c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_IIR_ADAPT_CTL, 0x00},
330c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_IIR_COEFF_1_CTL, 0x00},
331c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_IIR_COEFF_2_CTL, 0x00},
332c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_FF_A_GAIN_CTL, 0x00},
333c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_FF_B_GAIN_CTL, 0x00},
334c39667ddSSrinivas Kandagatla 	{ CDC_TX_ANC0_FB_GAIN_CTL, 0x00},
335c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_CTL, 0x04},
336c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_CFG0, 0x10},
337c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_CFG1, 0x0B},
338c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_VOL_CTL, 0x00},
339c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC0, 0x00},
340c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC1, 0x00},
341c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC2, 0x01},
342c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC3, 0x3C},
343c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC4, 0x20},
344c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC5, 0x00},
345c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC6, 0x00},
346c39667ddSSrinivas Kandagatla 	{ CDC_TX0_TX_PATH_SEC7, 0x25},
347c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_CTL, 0x04},
348c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_CFG0, 0x10},
349c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_CFG1, 0x0B},
350c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_VOL_CTL, 0x00},
351c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC0, 0x00},
352c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC1, 0x00},
353c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC2, 0x01},
354c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC3, 0x3C},
355c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC4, 0x20},
356c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC5, 0x00},
357c39667ddSSrinivas Kandagatla 	{ CDC_TX1_TX_PATH_SEC6, 0x00},
358c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_CTL, 0x04},
359c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_CFG0, 0x10},
360c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_CFG1, 0x0B},
361c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_VOL_CTL, 0x00},
362c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC0, 0x00},
363c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC1, 0x00},
364c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC2, 0x01},
365c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC3, 0x3C},
366c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC4, 0x20},
367c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC5, 0x00},
368c39667ddSSrinivas Kandagatla 	{ CDC_TX2_TX_PATH_SEC6, 0x00},
369c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_CTL, 0x04},
370c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_CFG0, 0x10},
371c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_CFG1, 0x0B},
372c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_VOL_CTL, 0x00},
373c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC0, 0x00},
374c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC1, 0x00},
375c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC2, 0x01},
376c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC3, 0x3C},
377c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC4, 0x20},
378c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC5, 0x00},
379c39667ddSSrinivas Kandagatla 	{ CDC_TX3_TX_PATH_SEC6, 0x00},
380c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_CTL, 0x04},
381c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_CFG0, 0x10},
382c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_CFG1, 0x0B},
383c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_VOL_CTL, 0x00},
384c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC0, 0x00},
385c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC1, 0x00},
386c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC2, 0x01},
387c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC3, 0x3C},
388c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC4, 0x20},
389c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC5, 0x00},
390c39667ddSSrinivas Kandagatla 	{ CDC_TX4_TX_PATH_SEC6, 0x00},
391c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_CTL, 0x04},
392c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_CFG0, 0x10},
393c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_CFG1, 0x0B},
394c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_VOL_CTL, 0x00},
395c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC0, 0x00},
396c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC1, 0x00},
397c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC2, 0x01},
398c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC3, 0x3C},
399c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC4, 0x20},
400c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC5, 0x00},
401c39667ddSSrinivas Kandagatla 	{ CDC_TX5_TX_PATH_SEC6, 0x00},
402c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_CTL, 0x04},
403c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_CFG0, 0x10},
404c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_CFG1, 0x0B},
405c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_VOL_CTL, 0x00},
406c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC0, 0x00},
407c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC1, 0x00},
408c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC2, 0x01},
409c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC3, 0x3C},
410c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC4, 0x20},
411c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC5, 0x00},
412c39667ddSSrinivas Kandagatla 	{ CDC_TX6_TX_PATH_SEC6, 0x00},
413c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_CTL, 0x04},
414c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_CFG0, 0x10},
415c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_CFG1, 0x0B},
416c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_VOL_CTL, 0x00},
417c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC0, 0x00},
418c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC1, 0x00},
419c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC2, 0x01},
420c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC3, 0x3C},
421c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC4, 0x20},
422c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC5, 0x00},
423c39667ddSSrinivas Kandagatla 	{ CDC_TX7_TX_PATH_SEC6, 0x00},
424c39667ddSSrinivas Kandagatla };
425c39667ddSSrinivas Kandagatla 
tx_is_volatile_register(struct device * dev,unsigned int reg)426c39667ddSSrinivas Kandagatla static bool tx_is_volatile_register(struct device *dev, unsigned int reg)
427c39667ddSSrinivas Kandagatla {
428c39667ddSSrinivas Kandagatla 	/* Update volatile list for tx/tx macros */
429c39667ddSSrinivas Kandagatla 	switch (reg) {
430c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC0_CTL:
431c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC1_CTL:
432c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC2_CTL:
433c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC3_CTL:
434c39667ddSSrinivas Kandagatla 		return true;
435c39667ddSSrinivas Kandagatla 	}
436c39667ddSSrinivas Kandagatla 	return false;
437c39667ddSSrinivas Kandagatla }
438c39667ddSSrinivas Kandagatla 
tx_is_rw_register(struct device * dev,unsigned int reg)439c39667ddSSrinivas Kandagatla static bool tx_is_rw_register(struct device *dev, unsigned int reg)
440c39667ddSSrinivas Kandagatla {
441c39667ddSSrinivas Kandagatla 	switch (reg) {
442c39667ddSSrinivas Kandagatla 	case CDC_TX_CLK_RST_CTRL_MCLK_CONTROL:
443c39667ddSSrinivas Kandagatla 	case CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL:
444c39667ddSSrinivas Kandagatla 	case CDC_TX_CLK_RST_CTRL_SWR_CONTROL:
445c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_TOP_CFG0:
446c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_ANC_CFG:
447c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_CTRL:
448c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_FREQ_MCLK:
449c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_DEBUG_BUS:
450c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_DEBUG_EN:
451c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_TX_I2S_CTL:
452c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_I2S_CLK:
453c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_I2S_RESET:
454c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC0_CTL:
455c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC1_CTL:
456c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC2_CTL:
457c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_DMIC3_CTL:
458c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_AMIC0_CTL:
459c39667ddSSrinivas Kandagatla 	case CDC_TX_TOP_CSR_SWR_AMIC1_CTL:
460c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_CLK_RESET_CTL:
461c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_MODE_1_CTL:
462c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_MODE_2_CTL:
463c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_FF_SHIFT:
464c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_FB_SHIFT:
465c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_LPF_FF_A_CTL:
466c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_LPF_FF_B_CTL:
467c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_LPF_FB_CTL:
468c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_SMLPF_CTL:
469c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_DCFLT_SHIFT_CTL:
470c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_IIR_ADAPT_CTL:
471c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_IIR_COEFF_1_CTL:
472c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_IIR_COEFF_2_CTL:
473c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_FF_A_GAIN_CTL:
474c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_FF_B_GAIN_CTL:
475c39667ddSSrinivas Kandagatla 	case CDC_TX_ANC0_FB_GAIN_CTL:
476c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX0_CFG0:
477c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX0_CFG1:
478c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX1_CFG0:
479c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX1_CFG1:
480c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX2_CFG0:
481c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX2_CFG1:
482c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX3_CFG0:
483c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX3_CFG1:
484c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX4_CFG0:
485c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX4_CFG1:
486c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX5_CFG0:
487c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX5_CFG1:
488c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX6_CFG0:
489c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX6_CFG1:
490c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX7_CFG0:
491c39667ddSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX7_CFG1:
492c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_CTL:
493c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_CFG0:
494c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_CFG1:
495c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_VOL_CTL:
496c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC0:
497c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC1:
498c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC2:
499c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC3:
500c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC4:
501c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC5:
502c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC6:
503c39667ddSSrinivas Kandagatla 	case CDC_TX0_TX_PATH_SEC7:
504c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_CTL:
505c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_CFG0:
506c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_CFG1:
507c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_VOL_CTL:
508c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC0:
509c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC1:
510c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC2:
511c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC3:
512c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC4:
513c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC5:
514c39667ddSSrinivas Kandagatla 	case CDC_TX1_TX_PATH_SEC6:
515c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_CTL:
516c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_CFG0:
517c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_CFG1:
518c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_VOL_CTL:
519c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC0:
520c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC1:
521c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC2:
522c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC3:
523c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC4:
524c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC5:
525c39667ddSSrinivas Kandagatla 	case CDC_TX2_TX_PATH_SEC6:
526c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_CTL:
527c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_CFG0:
528c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_CFG1:
529c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_VOL_CTL:
530c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC0:
531c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC1:
532c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC2:
533c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC3:
534c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC4:
535c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC5:
536c39667ddSSrinivas Kandagatla 	case CDC_TX3_TX_PATH_SEC6:
537c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_CTL:
538c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_CFG0:
539c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_CFG1:
540c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_VOL_CTL:
541c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC0:
542c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC1:
543c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC2:
544c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC3:
545c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC4:
546c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC5:
547c39667ddSSrinivas Kandagatla 	case CDC_TX4_TX_PATH_SEC6:
548c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_CTL:
549c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_CFG0:
550c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_CFG1:
551c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_VOL_CTL:
552c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC0:
553c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC1:
554c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC2:
555c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC3:
556c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC4:
557c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC5:
558c39667ddSSrinivas Kandagatla 	case CDC_TX5_TX_PATH_SEC6:
559c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_CTL:
560c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_CFG0:
561c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_CFG1:
562c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_VOL_CTL:
563c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC0:
564c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC1:
565c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC2:
566c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC3:
567c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC4:
568c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC5:
569c39667ddSSrinivas Kandagatla 	case CDC_TX6_TX_PATH_SEC6:
570c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_CTL:
571c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_CFG0:
572c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_CFG1:
573c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_VOL_CTL:
574c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC0:
575c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC1:
576c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC2:
577c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC3:
578c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC4:
579c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC5:
580c39667ddSSrinivas Kandagatla 	case CDC_TX7_TX_PATH_SEC6:
581c39667ddSSrinivas Kandagatla 		return true;
582c39667ddSSrinivas Kandagatla 	}
583c39667ddSSrinivas Kandagatla 
584c39667ddSSrinivas Kandagatla 	return false;
585c39667ddSSrinivas Kandagatla }
586c39667ddSSrinivas Kandagatla 
587c39667ddSSrinivas Kandagatla static const struct regmap_config tx_regmap_config = {
588c39667ddSSrinivas Kandagatla 	.name = "tx_macro",
589c39667ddSSrinivas Kandagatla 	.reg_bits = 16,
590c39667ddSSrinivas Kandagatla 	.val_bits = 32,
591c39667ddSSrinivas Kandagatla 	.reg_stride = 4,
592c39667ddSSrinivas Kandagatla 	.cache_type = REGCACHE_FLAT,
593c39667ddSSrinivas Kandagatla 	.max_register = TX_MAX_OFFSET,
594c39667ddSSrinivas Kandagatla 	.reg_defaults = tx_defaults,
595c39667ddSSrinivas Kandagatla 	.num_reg_defaults = ARRAY_SIZE(tx_defaults),
596c39667ddSSrinivas Kandagatla 	.writeable_reg = tx_is_rw_register,
597c39667ddSSrinivas Kandagatla 	.volatile_reg = tx_is_volatile_register,
598c39667ddSSrinivas Kandagatla 	.readable_reg = tx_is_rw_register,
599c39667ddSSrinivas Kandagatla };
600c39667ddSSrinivas Kandagatla 
tx_macro_mclk_enable(struct tx_macro * tx,bool mclk_enable)601c39667ddSSrinivas Kandagatla static int tx_macro_mclk_enable(struct tx_macro *tx,
602c39667ddSSrinivas Kandagatla 				bool mclk_enable)
603c39667ddSSrinivas Kandagatla {
604c39667ddSSrinivas Kandagatla 	struct regmap *regmap = tx->regmap;
605c39667ddSSrinivas Kandagatla 
606c39667ddSSrinivas Kandagatla 	if (mclk_enable) {
607c39667ddSSrinivas Kandagatla 		if (tx->tx_mclk_users == 0) {
608c39667ddSSrinivas Kandagatla 			/* 9.6MHz MCLK, set value 0x00 if other frequency */
609c39667ddSSrinivas Kandagatla 			regmap_update_bits(regmap, CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01);
610c39667ddSSrinivas Kandagatla 			regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
611c39667ddSSrinivas Kandagatla 					   CDC_TX_MCLK_EN_MASK,
612c39667ddSSrinivas Kandagatla 					   CDC_TX_MCLK_ENABLE);
613c39667ddSSrinivas Kandagatla 			regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
614c39667ddSSrinivas Kandagatla 					   CDC_TX_FS_CNT_EN_MASK,
615c39667ddSSrinivas Kandagatla 					   CDC_TX_FS_CNT_ENABLE);
616c39667ddSSrinivas Kandagatla 			regcache_mark_dirty(regmap);
617c39667ddSSrinivas Kandagatla 			regcache_sync(regmap);
618c39667ddSSrinivas Kandagatla 		}
619c39667ddSSrinivas Kandagatla 		tx->tx_mclk_users++;
620c39667ddSSrinivas Kandagatla 	} else {
621c39667ddSSrinivas Kandagatla 		if (tx->tx_mclk_users <= 0) {
622c39667ddSSrinivas Kandagatla 			dev_err(tx->dev, "clock already disabled\n");
623c39667ddSSrinivas Kandagatla 			tx->tx_mclk_users = 0;
624c39667ddSSrinivas Kandagatla 			goto exit;
625c39667ddSSrinivas Kandagatla 		}
626c39667ddSSrinivas Kandagatla 		tx->tx_mclk_users--;
627c39667ddSSrinivas Kandagatla 		if (tx->tx_mclk_users == 0) {
628c39667ddSSrinivas Kandagatla 			regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
629c39667ddSSrinivas Kandagatla 					   CDC_TX_FS_CNT_EN_MASK, 0x0);
630c39667ddSSrinivas Kandagatla 			regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
631c39667ddSSrinivas Kandagatla 					   CDC_TX_MCLK_EN_MASK, 0x0);
632c39667ddSSrinivas Kandagatla 		}
633c39667ddSSrinivas Kandagatla 	}
634c39667ddSSrinivas Kandagatla exit:
635c39667ddSSrinivas Kandagatla 	return 0;
636c39667ddSSrinivas Kandagatla }
637c39667ddSSrinivas Kandagatla 
is_amic_enabled(struct snd_soc_component * component,u8 decimator)638e5e7e398SRavulapati Vishnu Vardhan Rao static bool is_amic_enabled(struct snd_soc_component *component, u8 decimator)
639c39667ddSSrinivas Kandagatla {
640c39667ddSSrinivas Kandagatla 	u16 adc_mux_reg, adc_reg, adc_n;
641c39667ddSSrinivas Kandagatla 
642c39667ddSSrinivas Kandagatla 	adc_mux_reg = CDC_TX_INP_MUX_ADC_MUXn_CFG1(decimator);
643c39667ddSSrinivas Kandagatla 
644c39667ddSSrinivas Kandagatla 	if (snd_soc_component_read(component, adc_mux_reg) & SWR_MIC) {
645c39667ddSSrinivas Kandagatla 		adc_reg = CDC_TX_INP_MUX_ADC_MUXn_CFG0(decimator);
646c39667ddSSrinivas Kandagatla 		adc_n = snd_soc_component_read_field(component, adc_reg,
647c39667ddSSrinivas Kandagatla 					     CDC_TX_MACRO_SWR_MIC_MUX_SEL_MASK);
648c39667ddSSrinivas Kandagatla 		if (adc_n < TX_ADC_MAX)
649c39667ddSSrinivas Kandagatla 			return true;
650c39667ddSSrinivas Kandagatla 	}
651c39667ddSSrinivas Kandagatla 
652c39667ddSSrinivas Kandagatla 	return false;
653c39667ddSSrinivas Kandagatla }
654c39667ddSSrinivas Kandagatla 
tx_macro_tx_hpf_corner_freq_callback(struct work_struct * work)655c39667ddSSrinivas Kandagatla static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
656c39667ddSSrinivas Kandagatla {
657c39667ddSSrinivas Kandagatla 	struct delayed_work *hpf_delayed_work;
658c39667ddSSrinivas Kandagatla 	struct hpf_work *hpf_work;
659c39667ddSSrinivas Kandagatla 	struct tx_macro *tx;
660c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component;
661c39667ddSSrinivas Kandagatla 	u16 dec_cfg_reg, hpf_gate_reg;
662c39667ddSSrinivas Kandagatla 	u8 hpf_cut_off_freq;
663c39667ddSSrinivas Kandagatla 
664c39667ddSSrinivas Kandagatla 	hpf_delayed_work = to_delayed_work(work);
665c39667ddSSrinivas Kandagatla 	hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
666c39667ddSSrinivas Kandagatla 	tx = hpf_work->tx;
667c39667ddSSrinivas Kandagatla 	component = tx->component;
668c39667ddSSrinivas Kandagatla 	hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
669c39667ddSSrinivas Kandagatla 
670c39667ddSSrinivas Kandagatla 	dec_cfg_reg = CDC_TXn_TX_PATH_CFG0(hpf_work->decimator);
671c39667ddSSrinivas Kandagatla 	hpf_gate_reg = CDC_TXn_TX_PATH_SEC2(hpf_work->decimator);
672c39667ddSSrinivas Kandagatla 
673c39667ddSSrinivas Kandagatla 	if (is_amic_enabled(component, hpf_work->decimator)) {
674c39667ddSSrinivas Kandagatla 		snd_soc_component_write_field(component,
675c39667ddSSrinivas Kandagatla 				dec_cfg_reg,
676c39667ddSSrinivas Kandagatla 				CDC_TXn_HPF_CUT_FREQ_MASK,
677c39667ddSSrinivas Kandagatla 				hpf_cut_off_freq);
678c39667ddSSrinivas Kandagatla 		snd_soc_component_update_bits(component, hpf_gate_reg,
679c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
680c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
681c39667ddSSrinivas Kandagatla 					      0x02);
682c39667ddSSrinivas Kandagatla 		snd_soc_component_update_bits(component, hpf_gate_reg,
683c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
684c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
685c39667ddSSrinivas Kandagatla 					      0x01);
686c39667ddSSrinivas Kandagatla 	} else {
687c39667ddSSrinivas Kandagatla 		snd_soc_component_write_field(component, dec_cfg_reg,
688c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_CUT_FREQ_MASK,
689c39667ddSSrinivas Kandagatla 					      hpf_cut_off_freq);
690c39667ddSSrinivas Kandagatla 		snd_soc_component_write_field(component, hpf_gate_reg,
691c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK, 0x1);
692c39667ddSSrinivas Kandagatla 		/* Minimum 1 clk cycle delay is required as per HW spec */
693c39667ddSSrinivas Kandagatla 		usleep_range(1000, 1010);
694c39667ddSSrinivas Kandagatla 		snd_soc_component_write_field(component, hpf_gate_reg,
695c39667ddSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK, 0x0);
696c39667ddSSrinivas Kandagatla 	}
697c39667ddSSrinivas Kandagatla }
698c39667ddSSrinivas Kandagatla 
tx_macro_mute_update_callback(struct work_struct * work)699c39667ddSSrinivas Kandagatla static void tx_macro_mute_update_callback(struct work_struct *work)
700c39667ddSSrinivas Kandagatla {
701c39667ddSSrinivas Kandagatla 	struct tx_mute_work *tx_mute_dwork;
702c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component;
703c39667ddSSrinivas Kandagatla 	struct tx_macro *tx;
704c39667ddSSrinivas Kandagatla 	struct delayed_work *delayed_work;
705c39667ddSSrinivas Kandagatla 	u8 decimator;
706c39667ddSSrinivas Kandagatla 
707c39667ddSSrinivas Kandagatla 	delayed_work = to_delayed_work(work);
708c39667ddSSrinivas Kandagatla 	tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
709c39667ddSSrinivas Kandagatla 	tx = tx_mute_dwork->tx;
710c39667ddSSrinivas Kandagatla 	component = tx->component;
711c39667ddSSrinivas Kandagatla 	decimator = tx_mute_dwork->decimator;
712c39667ddSSrinivas Kandagatla 
713c39667ddSSrinivas Kandagatla 	snd_soc_component_write_field(component, CDC_TXn_TX_PATH_CTL(decimator),
714c39667ddSSrinivas Kandagatla 				      CDC_TXn_PGA_MUTE_MASK, 0x0);
715c39667ddSSrinivas Kandagatla }
716c39667ddSSrinivas Kandagatla 
tx_macro_mclk_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)717d207bdeaSSrinivas Kandagatla static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w,
718d207bdeaSSrinivas Kandagatla 			       struct snd_kcontrol *kcontrol, int event)
719d207bdeaSSrinivas Kandagatla {
720d207bdeaSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
721d207bdeaSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
722d207bdeaSSrinivas Kandagatla 
723d207bdeaSSrinivas Kandagatla 	switch (event) {
724d207bdeaSSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
725d207bdeaSSrinivas Kandagatla 		tx_macro_mclk_enable(tx, true);
726d207bdeaSSrinivas Kandagatla 		break;
727d207bdeaSSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
728d207bdeaSSrinivas Kandagatla 		tx_macro_mclk_enable(tx, false);
729d207bdeaSSrinivas Kandagatla 		break;
730d207bdeaSSrinivas Kandagatla 	default:
731d207bdeaSSrinivas Kandagatla 		break;
732d207bdeaSSrinivas Kandagatla 	}
733d207bdeaSSrinivas Kandagatla 
734d207bdeaSSrinivas Kandagatla 	return 0;
735d207bdeaSSrinivas Kandagatla }
736d207bdeaSSrinivas Kandagatla 
tx_macro_put_dec_enum(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)737d207bdeaSSrinivas Kandagatla static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
738d207bdeaSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
739d207bdeaSSrinivas Kandagatla {
740d207bdeaSSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
741d207bdeaSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
742d207bdeaSSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
743d207bdeaSSrinivas Kandagatla 	unsigned int val, dmic;
744d207bdeaSSrinivas Kandagatla 	u16 mic_sel_reg;
745d207bdeaSSrinivas Kandagatla 	u16 dmic_clk_reg;
746d207bdeaSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
747d207bdeaSSrinivas Kandagatla 
748d207bdeaSSrinivas Kandagatla 	val = ucontrol->value.enumerated.item[0];
74975e5fab7SRavulapati Vishnu Vardhan Rao 	if (val >= e->items)
75075e5fab7SRavulapati Vishnu Vardhan Rao 		return -EINVAL;
751d207bdeaSSrinivas Kandagatla 
752d207bdeaSSrinivas Kandagatla 	switch (e->reg) {
753d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX0_CFG0:
754d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX0_TX_PATH_CFG0;
755d207bdeaSSrinivas Kandagatla 		break;
756d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX1_CFG0:
757d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX1_TX_PATH_CFG0;
758d207bdeaSSrinivas Kandagatla 		break;
759d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX2_CFG0:
760d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX2_TX_PATH_CFG0;
761d207bdeaSSrinivas Kandagatla 		break;
762d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX3_CFG0:
763d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX3_TX_PATH_CFG0;
764d207bdeaSSrinivas Kandagatla 		break;
765d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX4_CFG0:
766d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX4_TX_PATH_CFG0;
767d207bdeaSSrinivas Kandagatla 		break;
768d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX5_CFG0:
769d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX5_TX_PATH_CFG0;
770d207bdeaSSrinivas Kandagatla 		break;
771d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX6_CFG0:
772d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX6_TX_PATH_CFG0;
773d207bdeaSSrinivas Kandagatla 		break;
774d207bdeaSSrinivas Kandagatla 	case CDC_TX_INP_MUX_ADC_MUX7_CFG0:
775d207bdeaSSrinivas Kandagatla 		mic_sel_reg = CDC_TX7_TX_PATH_CFG0;
776d207bdeaSSrinivas Kandagatla 		break;
77775e5fab7SRavulapati Vishnu Vardhan Rao 	default:
77875e5fab7SRavulapati Vishnu Vardhan Rao 		dev_err(component->dev, "Error in configuration!!\n");
77975e5fab7SRavulapati Vishnu Vardhan Rao 		return -EINVAL;
780d207bdeaSSrinivas Kandagatla 	}
781d207bdeaSSrinivas Kandagatla 
782d207bdeaSSrinivas Kandagatla 	if (val != 0) {
783710ccba0SSrinivas Kandagatla 		if (widget->shift) { /* MSM DMIC */
784710ccba0SSrinivas Kandagatla 			snd_soc_component_write_field(component, mic_sel_reg,
785710ccba0SSrinivas Kandagatla 						      CDC_TXn_ADC_DMIC_SEL_MASK, 1);
786710ccba0SSrinivas Kandagatla 		} else if (val < 5) {
787d207bdeaSSrinivas Kandagatla 			snd_soc_component_write_field(component, mic_sel_reg,
788d207bdeaSSrinivas Kandagatla 						      CDC_TXn_ADC_DMIC_SEL_MASK, 0);
789d207bdeaSSrinivas Kandagatla 		} else {
790d207bdeaSSrinivas Kandagatla 			snd_soc_component_write_field(component, mic_sel_reg,
791d207bdeaSSrinivas Kandagatla 						      CDC_TXn_ADC_DMIC_SEL_MASK, 1);
792d207bdeaSSrinivas Kandagatla 			dmic = TX_ADC_TO_DMIC(val);
793d207bdeaSSrinivas Kandagatla 			dmic_clk_reg = CDC_TX_TOP_CSR_SWR_DMICn_CTL(dmic);
794d207bdeaSSrinivas Kandagatla 			snd_soc_component_write_field(component, dmic_clk_reg,
795d207bdeaSSrinivas Kandagatla 						CDC_TX_SWR_DMIC_CLK_SEL_MASK,
796d207bdeaSSrinivas Kandagatla 						tx->dmic_clk_div);
797d207bdeaSSrinivas Kandagatla 		}
798d207bdeaSSrinivas Kandagatla 	}
799d207bdeaSSrinivas Kandagatla 
800d207bdeaSSrinivas Kandagatla 	return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
801d207bdeaSSrinivas Kandagatla }
802d207bdeaSSrinivas Kandagatla 
tx_macro_tx_mixer_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)803d207bdeaSSrinivas Kandagatla static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
804d207bdeaSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
805d207bdeaSSrinivas Kandagatla {
806d207bdeaSSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
807d207bdeaSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
808d207bdeaSSrinivas Kandagatla 	struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value;
809d207bdeaSSrinivas Kandagatla 	u32 dai_id = widget->shift;
810d207bdeaSSrinivas Kandagatla 	u32 dec_id = mc->shift;
811d207bdeaSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
812d207bdeaSSrinivas Kandagatla 
813d207bdeaSSrinivas Kandagatla 	if (test_bit(dec_id, &tx->active_ch_mask[dai_id]))
814d207bdeaSSrinivas Kandagatla 		ucontrol->value.integer.value[0] = 1;
815d207bdeaSSrinivas Kandagatla 	else
816d207bdeaSSrinivas Kandagatla 		ucontrol->value.integer.value[0] = 0;
817d207bdeaSSrinivas Kandagatla 
818d207bdeaSSrinivas Kandagatla 	return 0;
819d207bdeaSSrinivas Kandagatla }
820d207bdeaSSrinivas Kandagatla 
tx_macro_tx_mixer_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)821d207bdeaSSrinivas Kandagatla static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
822d207bdeaSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
823d207bdeaSSrinivas Kandagatla {
824d207bdeaSSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
825d207bdeaSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
826d207bdeaSSrinivas Kandagatla 	struct snd_soc_dapm_update *update = NULL;
827d207bdeaSSrinivas Kandagatla 	struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value;
828d207bdeaSSrinivas Kandagatla 	u32 dai_id = widget->shift;
829d207bdeaSSrinivas Kandagatla 	u32 dec_id = mc->shift;
830d207bdeaSSrinivas Kandagatla 	u32 enable = ucontrol->value.integer.value[0];
831d207bdeaSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
832d207bdeaSSrinivas Kandagatla 
833d207bdeaSSrinivas Kandagatla 	if (enable) {
834c1057a08SSrinivas Kandagatla 		if (tx->active_decimator[dai_id] == dec_id)
835c1057a08SSrinivas Kandagatla 			return 0;
836c1057a08SSrinivas Kandagatla 
837d207bdeaSSrinivas Kandagatla 		set_bit(dec_id, &tx->active_ch_mask[dai_id]);
838d207bdeaSSrinivas Kandagatla 		tx->active_ch_cnt[dai_id]++;
839d207bdeaSSrinivas Kandagatla 		tx->active_decimator[dai_id] = dec_id;
840d207bdeaSSrinivas Kandagatla 	} else {
841c1057a08SSrinivas Kandagatla 		if (tx->active_decimator[dai_id] == -1)
842c1057a08SSrinivas Kandagatla 			return 0;
843c1057a08SSrinivas Kandagatla 
844d207bdeaSSrinivas Kandagatla 		tx->active_ch_cnt[dai_id]--;
845d207bdeaSSrinivas Kandagatla 		clear_bit(dec_id, &tx->active_ch_mask[dai_id]);
846d207bdeaSSrinivas Kandagatla 		tx->active_decimator[dai_id] = -1;
847d207bdeaSSrinivas Kandagatla 	}
848d207bdeaSSrinivas Kandagatla 	snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
849d207bdeaSSrinivas Kandagatla 
850c1057a08SSrinivas Kandagatla 	return 1;
851d207bdeaSSrinivas Kandagatla }
852d207bdeaSSrinivas Kandagatla 
tx_macro_enable_dec(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)853d207bdeaSSrinivas Kandagatla static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
854d207bdeaSSrinivas Kandagatla 			       struct snd_kcontrol *kcontrol, int event)
855d207bdeaSSrinivas Kandagatla {
856d207bdeaSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
857e5e7e398SRavulapati Vishnu Vardhan Rao 	u8 decimator;
858d207bdeaSSrinivas Kandagatla 	u16 tx_vol_ctl_reg, dec_cfg_reg, hpf_gate_reg, tx_gain_ctl_reg;
859d207bdeaSSrinivas Kandagatla 	u8 hpf_cut_off_freq;
860d207bdeaSSrinivas Kandagatla 	int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
861d207bdeaSSrinivas Kandagatla 	int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
862d207bdeaSSrinivas Kandagatla 	u16 adc_mux_reg, adc_reg, adc_n, dmic;
863d207bdeaSSrinivas Kandagatla 	u16 dmic_clk_reg;
864d207bdeaSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
865d207bdeaSSrinivas Kandagatla 
866d207bdeaSSrinivas Kandagatla 	decimator = w->shift;
867d207bdeaSSrinivas Kandagatla 	tx_vol_ctl_reg = CDC_TXn_TX_PATH_CTL(decimator);
868d207bdeaSSrinivas Kandagatla 	hpf_gate_reg = CDC_TXn_TX_PATH_SEC2(decimator);
869d207bdeaSSrinivas Kandagatla 	dec_cfg_reg = CDC_TXn_TX_PATH_CFG0(decimator);
870d207bdeaSSrinivas Kandagatla 	tx_gain_ctl_reg = CDC_TXn_TX_VOL_CTL(decimator);
871d207bdeaSSrinivas Kandagatla 
872d207bdeaSSrinivas Kandagatla 	switch (event) {
873d207bdeaSSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
874d207bdeaSSrinivas Kandagatla 		adc_mux_reg = CDC_TX_INP_MUX_ADC_MUXn_CFG1(decimator);
875d207bdeaSSrinivas Kandagatla 		if (snd_soc_component_read(component, adc_mux_reg) & SWR_MIC) {
876d207bdeaSSrinivas Kandagatla 			adc_reg = CDC_TX_INP_MUX_ADC_MUXn_CFG0(decimator);
877d207bdeaSSrinivas Kandagatla 			adc_n = snd_soc_component_read(component, adc_reg) &
878d207bdeaSSrinivas Kandagatla 				CDC_TX_MACRO_SWR_MIC_MUX_SEL_MASK;
879d207bdeaSSrinivas Kandagatla 			if (adc_n >= TX_ADC_MAX) {
880d207bdeaSSrinivas Kandagatla 				dmic = TX_ADC_TO_DMIC(adc_n);
881d207bdeaSSrinivas Kandagatla 				dmic_clk_reg = CDC_TX_TOP_CSR_SWR_DMICn_CTL(dmic);
882d207bdeaSSrinivas Kandagatla 
883d207bdeaSSrinivas Kandagatla 				snd_soc_component_write_field(component, dmic_clk_reg,
884d207bdeaSSrinivas Kandagatla 							CDC_TX_SWR_DMIC_CLK_SEL_MASK,
885d207bdeaSSrinivas Kandagatla 							tx->dmic_clk_div);
886d207bdeaSSrinivas Kandagatla 			}
887d207bdeaSSrinivas Kandagatla 		}
888d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, dec_cfg_reg,
889d207bdeaSSrinivas Kandagatla 					      CDC_TXn_ADC_MODE_MASK,
890d207bdeaSSrinivas Kandagatla 					      tx->dec_mode[decimator]);
891d207bdeaSSrinivas Kandagatla 		/* Enable TX PGA Mute */
892d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, tx_vol_ctl_reg,
893d207bdeaSSrinivas Kandagatla 					      CDC_TXn_PGA_MUTE_MASK, 0x1);
894d207bdeaSSrinivas Kandagatla 		break;
895d207bdeaSSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
896d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, tx_vol_ctl_reg,
897d207bdeaSSrinivas Kandagatla 					     CDC_TXn_CLK_EN_MASK, 0x1);
898d207bdeaSSrinivas Kandagatla 		if (!is_amic_enabled(component, decimator)) {
899d207bdeaSSrinivas Kandagatla 			snd_soc_component_update_bits(component, hpf_gate_reg, 0x01, 0x00);
900d207bdeaSSrinivas Kandagatla 			/* Minimum 1 clk cycle delay is required as per HW spec */
901d207bdeaSSrinivas Kandagatla 			usleep_range(1000, 1010);
902d207bdeaSSrinivas Kandagatla 		}
903d207bdeaSSrinivas Kandagatla 		hpf_cut_off_freq = snd_soc_component_read_field(component, dec_cfg_reg,
904d207bdeaSSrinivas Kandagatla 								CDC_TXn_HPF_CUT_FREQ_MASK);
905d207bdeaSSrinivas Kandagatla 
906d207bdeaSSrinivas Kandagatla 		tx->tx_hpf_work[decimator].hpf_cut_off_freq =
907d207bdeaSSrinivas Kandagatla 						hpf_cut_off_freq;
908d207bdeaSSrinivas Kandagatla 
909d207bdeaSSrinivas Kandagatla 		if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
910d207bdeaSSrinivas Kandagatla 			snd_soc_component_write_field(component, dec_cfg_reg,
911d207bdeaSSrinivas Kandagatla 						      CDC_TXn_HPF_CUT_FREQ_MASK,
912d207bdeaSSrinivas Kandagatla 						      CF_MIN_3DB_150HZ);
913d207bdeaSSrinivas Kandagatla 
914d207bdeaSSrinivas Kandagatla 		if (is_amic_enabled(component, decimator)) {
915d207bdeaSSrinivas Kandagatla 			hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
916d207bdeaSSrinivas Kandagatla 			unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
917d207bdeaSSrinivas Kandagatla 		}
918d207bdeaSSrinivas Kandagatla 		/* schedule work queue to Remove Mute */
919d207bdeaSSrinivas Kandagatla 		queue_delayed_work(system_freezable_wq,
920d207bdeaSSrinivas Kandagatla 				   &tx->tx_mute_dwork[decimator].dwork,
921d207bdeaSSrinivas Kandagatla 				   msecs_to_jiffies(unmute_delay));
922d207bdeaSSrinivas Kandagatla 		if (tx->tx_hpf_work[decimator].hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
923d207bdeaSSrinivas Kandagatla 			queue_delayed_work(system_freezable_wq,
924d207bdeaSSrinivas Kandagatla 				&tx->tx_hpf_work[decimator].dwork,
925d207bdeaSSrinivas Kandagatla 				msecs_to_jiffies(hpf_delay));
926d207bdeaSSrinivas Kandagatla 			snd_soc_component_update_bits(component, hpf_gate_reg,
927d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
928d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
929d207bdeaSSrinivas Kandagatla 					      0x02);
930d207bdeaSSrinivas Kandagatla 			if (!is_amic_enabled(component, decimator))
931d207bdeaSSrinivas Kandagatla 				snd_soc_component_update_bits(component, hpf_gate_reg,
932d207bdeaSSrinivas Kandagatla 						      CDC_TXn_HPF_F_CHANGE_MASK |
933d207bdeaSSrinivas Kandagatla 						      CDC_TXn_HPF_ZERO_GATE_MASK,
934d207bdeaSSrinivas Kandagatla 						      0x00);
935d207bdeaSSrinivas Kandagatla 			snd_soc_component_update_bits(component, hpf_gate_reg,
936d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
937d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
938d207bdeaSSrinivas Kandagatla 					      0x01);
939d207bdeaSSrinivas Kandagatla 
940d207bdeaSSrinivas Kandagatla 			/*
941d207bdeaSSrinivas Kandagatla 			 * 6ms delay is required as per HW spec
942d207bdeaSSrinivas Kandagatla 			 */
943d207bdeaSSrinivas Kandagatla 			usleep_range(6000, 6010);
944d207bdeaSSrinivas Kandagatla 		}
945d207bdeaSSrinivas Kandagatla 		/* apply gain after decimator is enabled */
946d207bdeaSSrinivas Kandagatla 		snd_soc_component_write(component, tx_gain_ctl_reg,
947d207bdeaSSrinivas Kandagatla 			      snd_soc_component_read(component,
948d207bdeaSSrinivas Kandagatla 					tx_gain_ctl_reg));
949d207bdeaSSrinivas Kandagatla 		if (tx->bcs_enable) {
950d207bdeaSSrinivas Kandagatla 			snd_soc_component_update_bits(component, dec_cfg_reg,
951d207bdeaSSrinivas Kandagatla 					0x01, 0x01);
952d207bdeaSSrinivas Kandagatla 			tx->bcs_clk_en = true;
953d207bdeaSSrinivas Kandagatla 		}
954d207bdeaSSrinivas Kandagatla 		break;
955d207bdeaSSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMD:
956d207bdeaSSrinivas Kandagatla 		hpf_cut_off_freq =
957d207bdeaSSrinivas Kandagatla 			tx->tx_hpf_work[decimator].hpf_cut_off_freq;
958d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, tx_vol_ctl_reg,
959d207bdeaSSrinivas Kandagatla 					      CDC_TXn_PGA_MUTE_MASK, 0x1);
960d207bdeaSSrinivas Kandagatla 		if (cancel_delayed_work_sync(
961d207bdeaSSrinivas Kandagatla 		    &tx->tx_hpf_work[decimator].dwork)) {
962d207bdeaSSrinivas Kandagatla 			if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
963d207bdeaSSrinivas Kandagatla 				snd_soc_component_write_field(
964d207bdeaSSrinivas Kandagatla 						component, dec_cfg_reg,
965d207bdeaSSrinivas Kandagatla 						CDC_TXn_HPF_CUT_FREQ_MASK,
966d207bdeaSSrinivas Kandagatla 						hpf_cut_off_freq);
967d207bdeaSSrinivas Kandagatla 				if (is_amic_enabled(component, decimator))
968d207bdeaSSrinivas Kandagatla 					snd_soc_component_update_bits(component,
969d207bdeaSSrinivas Kandagatla 					      hpf_gate_reg,
970d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
971d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
972d207bdeaSSrinivas Kandagatla 					      0x02);
973d207bdeaSSrinivas Kandagatla 				else
974d207bdeaSSrinivas Kandagatla 					snd_soc_component_update_bits(component,
975d207bdeaSSrinivas Kandagatla 					      hpf_gate_reg,
976d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
977d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
978d207bdeaSSrinivas Kandagatla 					      0x03);
979d207bdeaSSrinivas Kandagatla 
980d207bdeaSSrinivas Kandagatla 				/*
981d207bdeaSSrinivas Kandagatla 				 * Minimum 1 clk cycle delay is required
982d207bdeaSSrinivas Kandagatla 				 * as per HW spec
983d207bdeaSSrinivas Kandagatla 				 */
984d207bdeaSSrinivas Kandagatla 				usleep_range(1000, 1010);
985d207bdeaSSrinivas Kandagatla 				snd_soc_component_update_bits(component, hpf_gate_reg,
986d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_F_CHANGE_MASK |
987d207bdeaSSrinivas Kandagatla 					      CDC_TXn_HPF_ZERO_GATE_MASK,
988d207bdeaSSrinivas Kandagatla 					      0x1);
989d207bdeaSSrinivas Kandagatla 			}
990d207bdeaSSrinivas Kandagatla 		}
991d207bdeaSSrinivas Kandagatla 		cancel_delayed_work_sync(&tx->tx_mute_dwork[decimator].dwork);
992d207bdeaSSrinivas Kandagatla 		break;
993d207bdeaSSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
994d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, tx_vol_ctl_reg,
995d207bdeaSSrinivas Kandagatla 					      CDC_TXn_CLK_EN_MASK, 0x0);
996d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, dec_cfg_reg,
997d207bdeaSSrinivas Kandagatla 					      CDC_TXn_ADC_MODE_MASK, 0x0);
998d207bdeaSSrinivas Kandagatla 		snd_soc_component_write_field(component, tx_vol_ctl_reg,
999d207bdeaSSrinivas Kandagatla 					      CDC_TXn_PGA_MUTE_MASK, 0x0);
1000d207bdeaSSrinivas Kandagatla 		if (tx->bcs_enable) {
1001d207bdeaSSrinivas Kandagatla 			snd_soc_component_write_field(component, dec_cfg_reg,
1002d207bdeaSSrinivas Kandagatla 						      CDC_TXn_PH_EN_MASK, 0x0);
1003d207bdeaSSrinivas Kandagatla 			snd_soc_component_write_field(component,
1004d207bdeaSSrinivas Kandagatla 						      CDC_TX0_TX_PATH_SEC7,
1005d207bdeaSSrinivas Kandagatla 						      CDC_TX0_MBHC_CTL_EN_MASK,
1006d207bdeaSSrinivas Kandagatla 						      0x0);
1007d207bdeaSSrinivas Kandagatla 			tx->bcs_clk_en = false;
1008d207bdeaSSrinivas Kandagatla 		}
1009d207bdeaSSrinivas Kandagatla 		break;
1010d207bdeaSSrinivas Kandagatla 	}
1011d207bdeaSSrinivas Kandagatla 	return 0;
1012d207bdeaSSrinivas Kandagatla }
1013d207bdeaSSrinivas Kandagatla 
tx_macro_dec_mode_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1014c39667ddSSrinivas Kandagatla static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
1015c39667ddSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
1016c39667ddSSrinivas Kandagatla {
1017c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1018c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1019c39667ddSSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1020c39667ddSSrinivas Kandagatla 	int path = e->shift_l;
1021c39667ddSSrinivas Kandagatla 
1022c39667ddSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = tx->dec_mode[path];
1023c39667ddSSrinivas Kandagatla 
1024c39667ddSSrinivas Kandagatla 	return 0;
1025c39667ddSSrinivas Kandagatla }
1026c39667ddSSrinivas Kandagatla 
tx_macro_dec_mode_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1027c39667ddSSrinivas Kandagatla static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol,
1028c39667ddSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
1029c39667ddSSrinivas Kandagatla {
1030c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1031c39667ddSSrinivas Kandagatla 	int value = ucontrol->value.integer.value[0];
1032c39667ddSSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1033c39667ddSSrinivas Kandagatla 	int path = e->shift_l;
1034c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1035c39667ddSSrinivas Kandagatla 
1036c1057a08SSrinivas Kandagatla 	if (tx->dec_mode[path] == value)
1037c1057a08SSrinivas Kandagatla 		return 0;
1038c1057a08SSrinivas Kandagatla 
1039c39667ddSSrinivas Kandagatla 	tx->dec_mode[path] = value;
1040c39667ddSSrinivas Kandagatla 
1041c1057a08SSrinivas Kandagatla 	return 1;
1042c39667ddSSrinivas Kandagatla }
1043c39667ddSSrinivas Kandagatla 
tx_macro_get_bcs(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1044c39667ddSSrinivas Kandagatla static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
1045c39667ddSSrinivas Kandagatla 			    struct snd_ctl_elem_value *ucontrol)
1046c39667ddSSrinivas Kandagatla {
1047c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1048c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1049c39667ddSSrinivas Kandagatla 
1050c39667ddSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = tx->bcs_enable;
1051c39667ddSSrinivas Kandagatla 
1052c39667ddSSrinivas Kandagatla 	return 0;
1053c39667ddSSrinivas Kandagatla }
1054c39667ddSSrinivas Kandagatla 
tx_macro_set_bcs(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1055c39667ddSSrinivas Kandagatla static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
1056c39667ddSSrinivas Kandagatla 			    struct snd_ctl_elem_value *ucontrol)
1057c39667ddSSrinivas Kandagatla {
1058c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1059c39667ddSSrinivas Kandagatla 	int value = ucontrol->value.integer.value[0];
1060c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1061c39667ddSSrinivas Kandagatla 
1062c39667ddSSrinivas Kandagatla 	tx->bcs_enable = value;
1063c39667ddSSrinivas Kandagatla 
1064c39667ddSSrinivas Kandagatla 	return 0;
1065c39667ddSSrinivas Kandagatla }
1066c39667ddSSrinivas Kandagatla 
tx_macro_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)1067c39667ddSSrinivas Kandagatla static int tx_macro_hw_params(struct snd_pcm_substream *substream,
1068c39667ddSSrinivas Kandagatla 			      struct snd_pcm_hw_params *params,
1069c39667ddSSrinivas Kandagatla 			      struct snd_soc_dai *dai)
1070c39667ddSSrinivas Kandagatla {
1071c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
1072e5e7e398SRavulapati Vishnu Vardhan Rao 	u32 sample_rate;
1073e5e7e398SRavulapati Vishnu Vardhan Rao 	u8 decimator;
1074c39667ddSSrinivas Kandagatla 	int tx_fs_rate;
1075c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1076c39667ddSSrinivas Kandagatla 
1077c39667ddSSrinivas Kandagatla 	sample_rate = params_rate(params);
1078c39667ddSSrinivas Kandagatla 	switch (sample_rate) {
1079c39667ddSSrinivas Kandagatla 	case 8000:
1080c39667ddSSrinivas Kandagatla 		tx_fs_rate = 0;
1081c39667ddSSrinivas Kandagatla 		break;
1082c39667ddSSrinivas Kandagatla 	case 16000:
1083c39667ddSSrinivas Kandagatla 		tx_fs_rate = 1;
1084c39667ddSSrinivas Kandagatla 		break;
1085c39667ddSSrinivas Kandagatla 	case 32000:
1086c39667ddSSrinivas Kandagatla 		tx_fs_rate = 3;
1087c39667ddSSrinivas Kandagatla 		break;
1088c39667ddSSrinivas Kandagatla 	case 48000:
1089c39667ddSSrinivas Kandagatla 		tx_fs_rate = 4;
1090c39667ddSSrinivas Kandagatla 		break;
1091c39667ddSSrinivas Kandagatla 	case 96000:
1092c39667ddSSrinivas Kandagatla 		tx_fs_rate = 5;
1093c39667ddSSrinivas Kandagatla 		break;
1094c39667ddSSrinivas Kandagatla 	case 192000:
1095c39667ddSSrinivas Kandagatla 		tx_fs_rate = 6;
1096c39667ddSSrinivas Kandagatla 		break;
1097c39667ddSSrinivas Kandagatla 	case 384000:
1098c39667ddSSrinivas Kandagatla 		tx_fs_rate = 7;
1099c39667ddSSrinivas Kandagatla 		break;
1100c39667ddSSrinivas Kandagatla 	default:
1101c39667ddSSrinivas Kandagatla 		dev_err(component->dev, "%s: Invalid TX sample rate: %d\n",
1102c39667ddSSrinivas Kandagatla 			__func__, params_rate(params));
1103c39667ddSSrinivas Kandagatla 		return -EINVAL;
1104c39667ddSSrinivas Kandagatla 	}
1105c39667ddSSrinivas Kandagatla 
1106c39667ddSSrinivas Kandagatla 	for_each_set_bit(decimator, &tx->active_ch_mask[dai->id], TX_MACRO_DEC_MAX)
1107c39667ddSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_TXn_TX_PATH_CTL(decimator),
1108c39667ddSSrinivas Kandagatla 					      CDC_TXn_PCM_RATE_MASK,
1109c39667ddSSrinivas Kandagatla 					      tx_fs_rate);
1110c39667ddSSrinivas Kandagatla 	return 0;
1111c39667ddSSrinivas Kandagatla }
1112c39667ddSSrinivas Kandagatla 
tx_macro_get_channel_map(struct snd_soc_dai * dai,unsigned int * tx_num,unsigned int * tx_slot,unsigned int * rx_num,unsigned int * rx_slot)1113c39667ddSSrinivas Kandagatla static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
1114c39667ddSSrinivas Kandagatla 				    unsigned int *tx_num, unsigned int *tx_slot,
1115c39667ddSSrinivas Kandagatla 				    unsigned int *rx_num, unsigned int *rx_slot)
1116c39667ddSSrinivas Kandagatla {
1117c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
1118c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1119c39667ddSSrinivas Kandagatla 
1120c39667ddSSrinivas Kandagatla 	switch (dai->id) {
1121c39667ddSSrinivas Kandagatla 	case TX_MACRO_AIF1_CAP:
1122c39667ddSSrinivas Kandagatla 	case TX_MACRO_AIF2_CAP:
1123c39667ddSSrinivas Kandagatla 	case TX_MACRO_AIF3_CAP:
1124c39667ddSSrinivas Kandagatla 		*tx_slot = tx->active_ch_mask[dai->id];
1125c39667ddSSrinivas Kandagatla 		*tx_num = tx->active_ch_cnt[dai->id];
1126c39667ddSSrinivas Kandagatla 		break;
1127c39667ddSSrinivas Kandagatla 	default:
1128c39667ddSSrinivas Kandagatla 		break;
1129c39667ddSSrinivas Kandagatla 	}
1130c39667ddSSrinivas Kandagatla 	return 0;
1131c39667ddSSrinivas Kandagatla }
1132c39667ddSSrinivas Kandagatla 
tx_macro_digital_mute(struct snd_soc_dai * dai,int mute,int stream)1133c39667ddSSrinivas Kandagatla static int tx_macro_digital_mute(struct snd_soc_dai *dai, int mute, int stream)
1134c39667ddSSrinivas Kandagatla {
1135c39667ddSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
1136c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(component);
1137e5e7e398SRavulapati Vishnu Vardhan Rao 	u8 decimator;
1138c39667ddSSrinivas Kandagatla 
11391c6a7f52SSrinivas Kandagatla 	/* active decimator not set yet */
11401c6a7f52SSrinivas Kandagatla 	if (tx->active_decimator[dai->id] == -1)
11411c6a7f52SSrinivas Kandagatla 		return 0;
11421c6a7f52SSrinivas Kandagatla 
1143c39667ddSSrinivas Kandagatla 	decimator = tx->active_decimator[dai->id];
1144c39667ddSSrinivas Kandagatla 
1145c39667ddSSrinivas Kandagatla 	if (mute)
1146c39667ddSSrinivas Kandagatla 		snd_soc_component_write_field(component,
1147c39667ddSSrinivas Kandagatla 					      CDC_TXn_TX_PATH_CTL(decimator),
1148c39667ddSSrinivas Kandagatla 					      CDC_TXn_PGA_MUTE_MASK, 0x1);
1149c39667ddSSrinivas Kandagatla 	else
1150c39667ddSSrinivas Kandagatla 		snd_soc_component_update_bits(component,
1151c39667ddSSrinivas Kandagatla 					      CDC_TXn_TX_PATH_CTL(decimator),
1152c39667ddSSrinivas Kandagatla 					      CDC_TXn_PGA_MUTE_MASK, 0x0);
1153c39667ddSSrinivas Kandagatla 
1154c39667ddSSrinivas Kandagatla 	return 0;
1155c39667ddSSrinivas Kandagatla }
1156c39667ddSSrinivas Kandagatla 
115781df40a0SYe Bin static const struct snd_soc_dai_ops tx_macro_dai_ops = {
1158c39667ddSSrinivas Kandagatla 	.hw_params = tx_macro_hw_params,
1159c39667ddSSrinivas Kandagatla 	.get_channel_map = tx_macro_get_channel_map,
1160c39667ddSSrinivas Kandagatla 	.mute_stream = tx_macro_digital_mute,
1161c39667ddSSrinivas Kandagatla };
1162c39667ddSSrinivas Kandagatla 
1163c39667ddSSrinivas Kandagatla static struct snd_soc_dai_driver tx_macro_dai[] = {
1164c39667ddSSrinivas Kandagatla 	{
1165c39667ddSSrinivas Kandagatla 		.name = "tx_macro_tx1",
1166c39667ddSSrinivas Kandagatla 		.id = TX_MACRO_AIF1_CAP,
1167c39667ddSSrinivas Kandagatla 		.capture = {
1168c39667ddSSrinivas Kandagatla 			.stream_name = "TX_AIF1 Capture",
1169c39667ddSSrinivas Kandagatla 			.rates = TX_MACRO_RATES,
1170c39667ddSSrinivas Kandagatla 			.formats = TX_MACRO_FORMATS,
1171c39667ddSSrinivas Kandagatla 			.rate_max = 192000,
1172c39667ddSSrinivas Kandagatla 			.rate_min = 8000,
1173c39667ddSSrinivas Kandagatla 			.channels_min = 1,
1174c39667ddSSrinivas Kandagatla 			.channels_max = 8,
1175c39667ddSSrinivas Kandagatla 		},
1176c39667ddSSrinivas Kandagatla 		.ops = &tx_macro_dai_ops,
1177c39667ddSSrinivas Kandagatla 	},
1178c39667ddSSrinivas Kandagatla 	{
1179c39667ddSSrinivas Kandagatla 		.name = "tx_macro_tx2",
1180c39667ddSSrinivas Kandagatla 		.id = TX_MACRO_AIF2_CAP,
1181c39667ddSSrinivas Kandagatla 		.capture = {
1182c39667ddSSrinivas Kandagatla 			.stream_name = "TX_AIF2 Capture",
1183c39667ddSSrinivas Kandagatla 			.rates = TX_MACRO_RATES,
1184c39667ddSSrinivas Kandagatla 			.formats = TX_MACRO_FORMATS,
1185c39667ddSSrinivas Kandagatla 			.rate_max = 192000,
1186c39667ddSSrinivas Kandagatla 			.rate_min = 8000,
1187c39667ddSSrinivas Kandagatla 			.channels_min = 1,
1188c39667ddSSrinivas Kandagatla 			.channels_max = 8,
1189c39667ddSSrinivas Kandagatla 		},
1190c39667ddSSrinivas Kandagatla 		.ops = &tx_macro_dai_ops,
1191c39667ddSSrinivas Kandagatla 	},
1192c39667ddSSrinivas Kandagatla 	{
1193c39667ddSSrinivas Kandagatla 		.name = "tx_macro_tx3",
1194c39667ddSSrinivas Kandagatla 		.id = TX_MACRO_AIF3_CAP,
1195c39667ddSSrinivas Kandagatla 		.capture = {
1196c39667ddSSrinivas Kandagatla 			.stream_name = "TX_AIF3 Capture",
1197c39667ddSSrinivas Kandagatla 			.rates = TX_MACRO_RATES,
1198c39667ddSSrinivas Kandagatla 			.formats = TX_MACRO_FORMATS,
1199c39667ddSSrinivas Kandagatla 			.rate_max = 192000,
1200c39667ddSSrinivas Kandagatla 			.rate_min = 8000,
1201c39667ddSSrinivas Kandagatla 			.channels_min = 1,
1202c39667ddSSrinivas Kandagatla 			.channels_max = 8,
1203c39667ddSSrinivas Kandagatla 		},
1204c39667ddSSrinivas Kandagatla 		.ops = &tx_macro_dai_ops,
1205c39667ddSSrinivas Kandagatla 	},
1206c39667ddSSrinivas Kandagatla };
1207c39667ddSSrinivas Kandagatla 
1208d207bdeaSSrinivas Kandagatla static const char * const adc_mux_text[] = {
1209d207bdeaSSrinivas Kandagatla 	"MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
1210d207bdeaSSrinivas Kandagatla };
1211d207bdeaSSrinivas Kandagatla 
1212d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec0_enum, CDC_TX_INP_MUX_ADC_MUX0_CFG1,
1213d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1214d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec1_enum, CDC_TX_INP_MUX_ADC_MUX1_CFG1,
1215d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1216d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec2_enum, CDC_TX_INP_MUX_ADC_MUX2_CFG1,
1217d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1218d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec3_enum, CDC_TX_INP_MUX_ADC_MUX3_CFG1,
1219d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1220d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec4_enum, CDC_TX_INP_MUX_ADC_MUX4_CFG1,
1221d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1222d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec5_enum, CDC_TX_INP_MUX_ADC_MUX5_CFG1,
1223d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1224d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec6_enum, CDC_TX_INP_MUX_ADC_MUX6_CFG1,
1225d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1226d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dec7_enum, CDC_TX_INP_MUX_ADC_MUX7_CFG1,
1227d207bdeaSSrinivas Kandagatla 		   0, adc_mux_text);
1228d207bdeaSSrinivas Kandagatla 
1229d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec0_mux = SOC_DAPM_ENUM("tx_dec0", tx_dec0_enum);
1230d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec1_mux = SOC_DAPM_ENUM("tx_dec1", tx_dec1_enum);
1231d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec2_mux = SOC_DAPM_ENUM("tx_dec2", tx_dec2_enum);
1232d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec3_mux = SOC_DAPM_ENUM("tx_dec3", tx_dec3_enum);
1233d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec4_mux = SOC_DAPM_ENUM("tx_dec4", tx_dec4_enum);
1234d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec5_mux = SOC_DAPM_ENUM("tx_dec5", tx_dec5_enum);
1235d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec6_mux = SOC_DAPM_ENUM("tx_dec6", tx_dec6_enum);
1236d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_dec7_mux = SOC_DAPM_ENUM("tx_dec7", tx_dec7_enum);
1237d207bdeaSSrinivas Kandagatla 
1238d207bdeaSSrinivas Kandagatla static const char * const smic_mux_text[] = {
1239d207bdeaSSrinivas Kandagatla 	"ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
1240d207bdeaSSrinivas Kandagatla 	"SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
1241d207bdeaSSrinivas Kandagatla 	"SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
1242d207bdeaSSrinivas Kandagatla };
1243d207bdeaSSrinivas Kandagatla 
1244d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic0_enum, CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1245d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1246d207bdeaSSrinivas Kandagatla 
1247d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic1_enum, CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1248d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1249d207bdeaSSrinivas Kandagatla 
1250d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic2_enum, CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1251d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1252d207bdeaSSrinivas Kandagatla 
1253d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic3_enum, CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1254d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1255d207bdeaSSrinivas Kandagatla 
1256d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic4_enum, CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1257d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1258d207bdeaSSrinivas Kandagatla 
1259d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic5_enum, CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1260d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1261d207bdeaSSrinivas Kandagatla 
1262d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic6_enum, CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1263d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1264d207bdeaSSrinivas Kandagatla 
1265d207bdeaSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_smic7_enum, CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1266d207bdeaSSrinivas Kandagatla 			0, smic_mux_text);
1267d207bdeaSSrinivas Kandagatla 
1268d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic0_mux = SOC_DAPM_ENUM_EXT("tx_smic0", tx_smic0_enum,
1269d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1270d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic1_mux = SOC_DAPM_ENUM_EXT("tx_smic1", tx_smic1_enum,
1271d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1272d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic2_mux = SOC_DAPM_ENUM_EXT("tx_smic2", tx_smic2_enum,
1273d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1274d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic3_mux = SOC_DAPM_ENUM_EXT("tx_smic3", tx_smic3_enum,
1275d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1276d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic4_mux = SOC_DAPM_ENUM_EXT("tx_smic4", tx_smic4_enum,
1277d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1278d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic5_mux = SOC_DAPM_ENUM_EXT("tx_smic5", tx_smic5_enum,
1279d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1280d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic6_mux = SOC_DAPM_ENUM_EXT("tx_smic6", tx_smic6_enum,
1281d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1282d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_smic7_mux = SOC_DAPM_ENUM_EXT("tx_smic7", tx_smic7_enum,
1283d207bdeaSSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1284d207bdeaSSrinivas Kandagatla 
1285710ccba0SSrinivas Kandagatla static const char * const dmic_mux_text[] = {
1286710ccba0SSrinivas Kandagatla 	"ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
1287710ccba0SSrinivas Kandagatla 	"DMIC4", "DMIC5", "DMIC6", "DMIC7"
1288710ccba0SSrinivas Kandagatla };
1289710ccba0SSrinivas Kandagatla 
1290710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic0_enum, CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1291710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1292710ccba0SSrinivas Kandagatla 
1293710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic1_enum, CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1294710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1295710ccba0SSrinivas Kandagatla 
1296710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic2_enum, CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1297710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1298710ccba0SSrinivas Kandagatla 
1299710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic3_enum, CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1300710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1301710ccba0SSrinivas Kandagatla 
1302710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic4_enum, CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1303710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1304710ccba0SSrinivas Kandagatla 
1305710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic5_enum, CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1306710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1307710ccba0SSrinivas Kandagatla 
1308710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic6_enum, CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1309710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1310710ccba0SSrinivas Kandagatla 
1311710ccba0SSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(tx_dmic7_enum, CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1312710ccba0SSrinivas Kandagatla 			4, dmic_mux_text);
1313710ccba0SSrinivas Kandagatla 
1314710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic0_mux = SOC_DAPM_ENUM_EXT("tx_dmic0", tx_dmic0_enum,
1315710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1316710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic1_mux = SOC_DAPM_ENUM_EXT("tx_dmic1", tx_dmic1_enum,
1317710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1318710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic2_mux = SOC_DAPM_ENUM_EXT("tx_dmic2", tx_dmic2_enum,
1319710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1320710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic3_mux = SOC_DAPM_ENUM_EXT("tx_dmic3", tx_dmic3_enum,
1321710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1322710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic4_mux = SOC_DAPM_ENUM_EXT("tx_dmic4", tx_dmic4_enum,
1323710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1324710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic5_mux = SOC_DAPM_ENUM_EXT("tx_dmic5", tx_dmic5_enum,
1325710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1326710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic6_mux = SOC_DAPM_ENUM_EXT("tx_dmic6", tx_dmic6_enum,
1327710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1328710ccba0SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic7_mux = SOC_DAPM_ENUM_EXT("tx_dmic7", tx_dmic7_enum,
1329710ccba0SSrinivas Kandagatla 			snd_soc_dapm_get_enum_double, tx_macro_put_dec_enum);
1330710ccba0SSrinivas Kandagatla 
1331c39667ddSSrinivas Kandagatla static const char * const dec_mode_mux_text[] = {
1332c39667ddSSrinivas Kandagatla 	"ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
1333c39667ddSSrinivas Kandagatla };
1334c39667ddSSrinivas Kandagatla 
1335c39667ddSSrinivas Kandagatla static const struct soc_enum dec_mode_mux_enum[] = {
1336c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(dec_mode_mux_text),
1337c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1338c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(dec_mode_mux_text),
1339c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1340c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 2,  ARRAY_SIZE(dec_mode_mux_text),
1341c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1342c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(dec_mode_mux_text),
1343c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1344c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 4, ARRAY_SIZE(dec_mode_mux_text),
1345c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1346c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 5, ARRAY_SIZE(dec_mode_mux_text),
1347c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1348c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 6, ARRAY_SIZE(dec_mode_mux_text),
1349c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1350c39667ddSSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 7, ARRAY_SIZE(dec_mode_mux_text),
1351c39667ddSSrinivas Kandagatla 			dec_mode_mux_text),
1352c39667ddSSrinivas Kandagatla };
1353c39667ddSSrinivas Kandagatla 
1354d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
1355d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1356d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1357d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1358d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1359d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1360d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1361d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1362d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1363d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1364d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1365d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1366d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1367d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1368d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1369d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1370d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1371d207bdeaSSrinivas Kandagatla };
1372d207bdeaSSrinivas Kandagatla 
1373d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
1374d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1375d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1376d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1377d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1378d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1379d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1380d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1381d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1382d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1383d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1384d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1385d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1386d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1387d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1388d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1389d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1390d207bdeaSSrinivas Kandagatla };
1391d207bdeaSSrinivas Kandagatla 
1392d207bdeaSSrinivas Kandagatla static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
1393d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1394d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1395d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1396d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1397d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1398d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1399d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1400d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1401d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1402d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1403d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1404d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1405d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1406d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1407d207bdeaSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1408d207bdeaSSrinivas Kandagatla 			tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1409d207bdeaSSrinivas Kandagatla };
1410d207bdeaSSrinivas Kandagatla 
1411d207bdeaSSrinivas Kandagatla static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
1412d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1413d207bdeaSSrinivas Kandagatla 		SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1414d207bdeaSSrinivas Kandagatla 
1415d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1416d207bdeaSSrinivas Kandagatla 		SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1417d207bdeaSSrinivas Kandagatla 
1418d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1419d207bdeaSSrinivas Kandagatla 		SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1420d207bdeaSSrinivas Kandagatla 
1421d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
1422d207bdeaSSrinivas Kandagatla 		tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1423d207bdeaSSrinivas Kandagatla 
1424d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
1425d207bdeaSSrinivas Kandagatla 		tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1426d207bdeaSSrinivas Kandagatla 
1427d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
1428d207bdeaSSrinivas Kandagatla 		tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1429d207bdeaSSrinivas Kandagatla 
1430d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX0", SND_SOC_NOPM, 0, 0, &tx_smic0_mux),
1431d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX1", SND_SOC_NOPM, 0, 0, &tx_smic1_mux),
1432d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX2", SND_SOC_NOPM, 0, 0, &tx_smic2_mux),
1433d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX3", SND_SOC_NOPM, 0, 0, &tx_smic3_mux),
1434d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX4", SND_SOC_NOPM, 0, 0, &tx_smic4_mux),
1435d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX5", SND_SOC_NOPM, 0, 0, &tx_smic5_mux),
1436d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_smic6_mux),
1437d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX SMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_smic7_mux),
1438d207bdeaSSrinivas Kandagatla 
1439710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX0", SND_SOC_NOPM, 4, 0, &tx_dmic0_mux),
1440710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX1", SND_SOC_NOPM, 4, 0, &tx_dmic1_mux),
1441710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX2", SND_SOC_NOPM, 4, 0, &tx_dmic2_mux),
1442710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX3", SND_SOC_NOPM, 4, 0, &tx_dmic3_mux),
1443710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX4", SND_SOC_NOPM, 4, 0, &tx_dmic4_mux),
1444710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX5", SND_SOC_NOPM, 4, 0, &tx_dmic5_mux),
1445710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX6", SND_SOC_NOPM, 4, 0, &tx_dmic6_mux),
1446710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("TX DMIC MUX7", SND_SOC_NOPM, 4, 0, &tx_dmic7_mux),
1447710ccba0SSrinivas Kandagatla 
1448d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
1449d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
1450d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
1451d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
1452d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
1453d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
1454d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
1455d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
1456d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
1457d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
1458d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
1459d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
1460710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC0"),
1461710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC1"),
1462710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC2"),
1463710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC3"),
1464710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC4"),
1465710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC5"),
1466710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC6"),
1467710ccba0SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("TX DMIC7"),
1468d207bdeaSSrinivas Kandagatla 
1469d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
1470d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC0, 0,
1471d207bdeaSSrinivas Kandagatla 			   &tx_dec0_mux, tx_macro_enable_dec,
1472d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1473d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1474d207bdeaSSrinivas Kandagatla 
1475d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
1476d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC1, 0,
1477d207bdeaSSrinivas Kandagatla 			   &tx_dec1_mux, tx_macro_enable_dec,
1478d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1479d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1480d207bdeaSSrinivas Kandagatla 
1481d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
1482d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC2, 0,
1483d207bdeaSSrinivas Kandagatla 			   &tx_dec2_mux, tx_macro_enable_dec,
1484d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1485d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1486d207bdeaSSrinivas Kandagatla 
1487d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
1488d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC3, 0,
1489d207bdeaSSrinivas Kandagatla 			   &tx_dec3_mux, tx_macro_enable_dec,
1490d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1491d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1492d207bdeaSSrinivas Kandagatla 
1493d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
1494d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC4, 0,
1495d207bdeaSSrinivas Kandagatla 			   &tx_dec4_mux, tx_macro_enable_dec,
1496d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1497d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1498d207bdeaSSrinivas Kandagatla 
1499d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
1500d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC5, 0,
1501d207bdeaSSrinivas Kandagatla 			   &tx_dec5_mux, tx_macro_enable_dec,
1502d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1503d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1504d207bdeaSSrinivas Kandagatla 
1505d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
1506d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC6, 0,
1507d207bdeaSSrinivas Kandagatla 			   &tx_dec6_mux, tx_macro_enable_dec,
1508d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1509d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1510d207bdeaSSrinivas Kandagatla 
1511d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
1512d207bdeaSSrinivas Kandagatla 			   TX_MACRO_DEC7, 0,
1513d207bdeaSSrinivas Kandagatla 			   &tx_dec7_mux, tx_macro_enable_dec,
1514d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1515d207bdeaSSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1516d207bdeaSSrinivas Kandagatla 
1517d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1518d207bdeaSSrinivas Kandagatla 	tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1519d207bdeaSSrinivas Kandagatla 
1520d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, NULL, 0),
1521d207bdeaSSrinivas Kandagatla 
1522d207bdeaSSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1523d207bdeaSSrinivas Kandagatla 			NULL, 0),
1524d207bdeaSSrinivas Kandagatla };
1525d207bdeaSSrinivas Kandagatla 
1526d207bdeaSSrinivas Kandagatla static const struct snd_soc_dapm_route tx_audio_map[] = {
1527d207bdeaSSrinivas Kandagatla 	{"TX_AIF1 CAP", NULL, "TX_MCLK"},
1528d207bdeaSSrinivas Kandagatla 	{"TX_AIF2 CAP", NULL, "TX_MCLK"},
1529d207bdeaSSrinivas Kandagatla 	{"TX_AIF3 CAP", NULL, "TX_MCLK"},
1530d207bdeaSSrinivas Kandagatla 
1531d207bdeaSSrinivas Kandagatla 	{"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1532d207bdeaSSrinivas Kandagatla 	{"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1533d207bdeaSSrinivas Kandagatla 	{"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
1534d207bdeaSSrinivas Kandagatla 
1535d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1536d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1537d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1538d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1539d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1540d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1541d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1542d207bdeaSSrinivas Kandagatla 	{"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1543d207bdeaSSrinivas Kandagatla 
1544d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1545d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1546d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1547d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1548d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1549d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1550d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1551d207bdeaSSrinivas Kandagatla 	{"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1552d207bdeaSSrinivas Kandagatla 
1553d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1554d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1555d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1556d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1557d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1558d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1559d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1560d207bdeaSSrinivas Kandagatla 	{"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1561d207bdeaSSrinivas Kandagatla 
1562d207bdeaSSrinivas Kandagatla 	{"TX DEC0 MUX", NULL, "TX_MCLK"},
1563d207bdeaSSrinivas Kandagatla 	{"TX DEC1 MUX", NULL, "TX_MCLK"},
1564d207bdeaSSrinivas Kandagatla 	{"TX DEC2 MUX", NULL, "TX_MCLK"},
1565d207bdeaSSrinivas Kandagatla 	{"TX DEC3 MUX", NULL, "TX_MCLK"},
1566d207bdeaSSrinivas Kandagatla 	{"TX DEC4 MUX", NULL, "TX_MCLK"},
1567d207bdeaSSrinivas Kandagatla 	{"TX DEC5 MUX", NULL, "TX_MCLK"},
1568d207bdeaSSrinivas Kandagatla 	{"TX DEC6 MUX", NULL, "TX_MCLK"},
1569d207bdeaSSrinivas Kandagatla 	{"TX DEC7 MUX", NULL, "TX_MCLK"},
1570d207bdeaSSrinivas Kandagatla 
1571710ccba0SSrinivas Kandagatla 	{"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1572710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1573710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1574710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1575710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1576710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1577710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1578710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1579710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1580710ccba0SSrinivas Kandagatla 
1581d207bdeaSSrinivas Kandagatla 	{"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1582d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
1583d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
1584d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
1585d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
1586d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
1587d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
1588d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
1589d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
1590d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
1591d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
1592d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
1593d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
1594d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
1595d207bdeaSSrinivas Kandagatla 
1596710ccba0SSrinivas Kandagatla 	{"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1597710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1598710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1599710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1600710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1601710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1602710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1603710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1604710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1605710ccba0SSrinivas Kandagatla 
1606d207bdeaSSrinivas Kandagatla 	{"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1607d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
1608d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
1609d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
1610d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
1611d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
1612d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
1613d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
1614d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
1615d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
1616d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
1617d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
1618d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
1619d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
1620d207bdeaSSrinivas Kandagatla 
1621710ccba0SSrinivas Kandagatla 	{"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1622710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1623710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1624710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1625710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1626710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1627710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1628710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1629710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1630710ccba0SSrinivas Kandagatla 
1631d207bdeaSSrinivas Kandagatla 	{"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1632d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
1633d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
1634d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
1635d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
1636d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
1637d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
1638d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
1639d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
1640d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
1641d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
1642d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
1643d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
1644d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
1645d207bdeaSSrinivas Kandagatla 
1646710ccba0SSrinivas Kandagatla 	{"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1647710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1648710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1649710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1650710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1651710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1652710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1653710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1654710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1655710ccba0SSrinivas Kandagatla 
1656d207bdeaSSrinivas Kandagatla 	{"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1657d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
1658d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
1659d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
1660d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
1661d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
1662d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
1663d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
1664d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
1665d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
1666d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
1667d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
1668d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
1669d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
1670d207bdeaSSrinivas Kandagatla 
1671710ccba0SSrinivas Kandagatla 	{"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1672710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1673710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1674710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1675710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1676710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1677710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1678710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1679710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1680710ccba0SSrinivas Kandagatla 
1681d207bdeaSSrinivas Kandagatla 	{"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1682d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
1683d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
1684d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
1685d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
1686d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
1687d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
1688d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
1689d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
1690d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
1691d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
1692d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
1693d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
1694d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
1695d207bdeaSSrinivas Kandagatla 
1696710ccba0SSrinivas Kandagatla 	{"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1697710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1698710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1699710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1700710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1701710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1702710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1703710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1704710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1705710ccba0SSrinivas Kandagatla 
1706d207bdeaSSrinivas Kandagatla 	{"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1707d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
1708d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
1709d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
1710d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
1711d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
1712d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
1713d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
1714d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
1715d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
1716d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
1717d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
1718d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
1719d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
1720d207bdeaSSrinivas Kandagatla 
1721710ccba0SSrinivas Kandagatla 	{"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
1722710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
1723710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
1724710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
1725710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
1726710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
1727710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
1728710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
1729710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
1730710ccba0SSrinivas Kandagatla 
1731d207bdeaSSrinivas Kandagatla 	{"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
1732d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
1733d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
1734d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
1735d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
1736d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
1737d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
1738d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
1739d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
1740d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
1741d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
1742d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
1743d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
1744d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
1745d207bdeaSSrinivas Kandagatla 
1746710ccba0SSrinivas Kandagatla 	{"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
1747710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
1748710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
1749710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
1750710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
1751710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
1752710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
1753710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
1754710ccba0SSrinivas Kandagatla 	{"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
1755710ccba0SSrinivas Kandagatla 
1756d207bdeaSSrinivas Kandagatla 	{"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
1757d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
1758d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
1759d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
1760d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
1761d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
1762d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
1763d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
1764d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
1765d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
1766d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
1767d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
1768d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
1769d207bdeaSSrinivas Kandagatla 	{"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
1770d207bdeaSSrinivas Kandagatla };
1771d207bdeaSSrinivas Kandagatla 
1772c39667ddSSrinivas Kandagatla static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
1773c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC0 Volume",
1774c39667ddSSrinivas Kandagatla 			  CDC_TX0_TX_VOL_CTL,
1775c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1776c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC1 Volume",
1777c39667ddSSrinivas Kandagatla 			  CDC_TX1_TX_VOL_CTL,
1778c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1779c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC2 Volume",
1780c39667ddSSrinivas Kandagatla 			  CDC_TX2_TX_VOL_CTL,
1781c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1782c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC3 Volume",
1783c39667ddSSrinivas Kandagatla 			  CDC_TX3_TX_VOL_CTL,
1784c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1785c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC4 Volume",
1786c39667ddSSrinivas Kandagatla 			  CDC_TX4_TX_VOL_CTL,
1787c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1788c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC5 Volume",
1789c39667ddSSrinivas Kandagatla 			  CDC_TX5_TX_VOL_CTL,
1790c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1791c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC6 Volume",
1792c39667ddSSrinivas Kandagatla 			  CDC_TX6_TX_VOL_CTL,
1793c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1794c39667ddSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("TX_DEC7 Volume",
1795c39667ddSSrinivas Kandagatla 			  CDC_TX7_TX_VOL_CTL,
1796c39667ddSSrinivas Kandagatla 			  -84, 40, digital_gain),
1797c39667ddSSrinivas Kandagatla 
1798c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum[0],
1799c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1800c39667ddSSrinivas Kandagatla 
1801c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum[1],
1802c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1803c39667ddSSrinivas Kandagatla 
1804c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum[2],
1805c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1806c39667ddSSrinivas Kandagatla 
1807c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum[3],
1808c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1809c39667ddSSrinivas Kandagatla 
1810c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum[4],
1811c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1812c39667ddSSrinivas Kandagatla 
1813c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum[5],
1814c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1815c39667ddSSrinivas Kandagatla 
1816c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum[6],
1817c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1818c39667ddSSrinivas Kandagatla 
1819c39667ddSSrinivas Kandagatla 	SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum[7],
1820c39667ddSSrinivas Kandagatla 			tx_macro_dec_mode_get, tx_macro_dec_mode_put),
1821c39667ddSSrinivas Kandagatla 
1822c39667ddSSrinivas Kandagatla 	SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
1823c39667ddSSrinivas Kandagatla 		       tx_macro_get_bcs, tx_macro_set_bcs),
1824c39667ddSSrinivas Kandagatla };
1825c39667ddSSrinivas Kandagatla 
tx_macro_component_probe(struct snd_soc_component * comp)1826c39667ddSSrinivas Kandagatla static int tx_macro_component_probe(struct snd_soc_component *comp)
1827c39667ddSSrinivas Kandagatla {
1828c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = snd_soc_component_get_drvdata(comp);
1829c39667ddSSrinivas Kandagatla 	int i;
1830c39667ddSSrinivas Kandagatla 
1831c39667ddSSrinivas Kandagatla 	snd_soc_component_init_regmap(comp, tx->regmap);
1832c39667ddSSrinivas Kandagatla 
1833c39667ddSSrinivas Kandagatla 	for (i = 0; i < NUM_DECIMATORS; i++) {
1834c39667ddSSrinivas Kandagatla 		tx->tx_hpf_work[i].tx = tx;
1835c39667ddSSrinivas Kandagatla 		tx->tx_hpf_work[i].decimator = i;
1836c39667ddSSrinivas Kandagatla 		INIT_DELAYED_WORK(&tx->tx_hpf_work[i].dwork,
1837c39667ddSSrinivas Kandagatla 			tx_macro_tx_hpf_corner_freq_callback);
1838c39667ddSSrinivas Kandagatla 	}
1839c39667ddSSrinivas Kandagatla 
1840c39667ddSSrinivas Kandagatla 	for (i = 0; i < NUM_DECIMATORS; i++) {
1841c39667ddSSrinivas Kandagatla 		tx->tx_mute_dwork[i].tx = tx;
1842c39667ddSSrinivas Kandagatla 		tx->tx_mute_dwork[i].decimator = i;
1843c39667ddSSrinivas Kandagatla 		INIT_DELAYED_WORK(&tx->tx_mute_dwork[i].dwork,
1844c39667ddSSrinivas Kandagatla 			  tx_macro_mute_update_callback);
1845c39667ddSSrinivas Kandagatla 	}
1846c39667ddSSrinivas Kandagatla 	tx->component = comp;
1847c39667ddSSrinivas Kandagatla 
1848c39667ddSSrinivas Kandagatla 	snd_soc_component_update_bits(comp, CDC_TX0_TX_PATH_SEC7, 0x3F,
1849c39667ddSSrinivas Kandagatla 				      0x0A);
1850864b9b58SSrinivasa Rao Mandadapu 	/* Enable swr mic0 and mic1 clock */
1851864b9b58SSrinivasa Rao Mandadapu 	snd_soc_component_update_bits(comp, CDC_TX_TOP_CSR_SWR_AMIC0_CTL, 0xFF, 0x00);
1852864b9b58SSrinivasa Rao Mandadapu 	snd_soc_component_update_bits(comp, CDC_TX_TOP_CSR_SWR_AMIC1_CTL, 0xFF, 0x00);
1853c39667ddSSrinivas Kandagatla 
1854c39667ddSSrinivas Kandagatla 	return 0;
1855c39667ddSSrinivas Kandagatla }
1856c39667ddSSrinivas Kandagatla 
swclk_gate_enable(struct clk_hw * hw)1857c39667ddSSrinivas Kandagatla static int swclk_gate_enable(struct clk_hw *hw)
1858c39667ddSSrinivas Kandagatla {
1859c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = to_tx_macro(hw);
1860c39667ddSSrinivas Kandagatla 	struct regmap *regmap = tx->regmap;
186131bd0db8SSrinivas Kandagatla 	int ret;
186231bd0db8SSrinivas Kandagatla 
186331bd0db8SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->mclk);
186431bd0db8SSrinivas Kandagatla 	if (ret) {
186531bd0db8SSrinivas Kandagatla 		dev_err(tx->dev, "failed to enable mclk\n");
186631bd0db8SSrinivas Kandagatla 		return ret;
186731bd0db8SSrinivas Kandagatla 	}
1868c39667ddSSrinivas Kandagatla 
1869c39667ddSSrinivas Kandagatla 	tx_macro_mclk_enable(tx, true);
1870c39667ddSSrinivas Kandagatla 
1871c39667ddSSrinivas Kandagatla 	regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
1872c39667ddSSrinivas Kandagatla 			   CDC_TX_SWR_CLK_EN_MASK,
1873c39667ddSSrinivas Kandagatla 			   CDC_TX_SWR_CLK_ENABLE);
1874c39667ddSSrinivas Kandagatla 	return 0;
1875c39667ddSSrinivas Kandagatla }
1876c39667ddSSrinivas Kandagatla 
swclk_gate_disable(struct clk_hw * hw)1877c39667ddSSrinivas Kandagatla static void swclk_gate_disable(struct clk_hw *hw)
1878c39667ddSSrinivas Kandagatla {
1879c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = to_tx_macro(hw);
1880c39667ddSSrinivas Kandagatla 	struct regmap *regmap = tx->regmap;
1881c39667ddSSrinivas Kandagatla 
1882c39667ddSSrinivas Kandagatla 	regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
1883c39667ddSSrinivas Kandagatla 			   CDC_TX_SWR_CLK_EN_MASK, 0x0);
1884c39667ddSSrinivas Kandagatla 
1885c39667ddSSrinivas Kandagatla 	tx_macro_mclk_enable(tx, false);
188631bd0db8SSrinivas Kandagatla 	clk_disable_unprepare(tx->mclk);
1887c39667ddSSrinivas Kandagatla }
1888c39667ddSSrinivas Kandagatla 
swclk_gate_is_enabled(struct clk_hw * hw)1889c39667ddSSrinivas Kandagatla static int swclk_gate_is_enabled(struct clk_hw *hw)
1890c39667ddSSrinivas Kandagatla {
1891c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = to_tx_macro(hw);
1892c39667ddSSrinivas Kandagatla 	int ret, val;
1893c39667ddSSrinivas Kandagatla 
1894c39667ddSSrinivas Kandagatla 	regmap_read(tx->regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL, &val);
1895c39667ddSSrinivas Kandagatla 	ret = val & BIT(0);
1896c39667ddSSrinivas Kandagatla 
1897c39667ddSSrinivas Kandagatla 	return ret;
1898c39667ddSSrinivas Kandagatla }
1899c39667ddSSrinivas Kandagatla 
swclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1900c39667ddSSrinivas Kandagatla static unsigned long swclk_recalc_rate(struct clk_hw *hw,
1901c39667ddSSrinivas Kandagatla 				       unsigned long parent_rate)
1902c39667ddSSrinivas Kandagatla {
1903c39667ddSSrinivas Kandagatla 	return parent_rate / 2;
1904c39667ddSSrinivas Kandagatla }
1905c39667ddSSrinivas Kandagatla 
1906c39667ddSSrinivas Kandagatla static const struct clk_ops swclk_gate_ops = {
1907c39667ddSSrinivas Kandagatla 	.prepare = swclk_gate_enable,
1908c39667ddSSrinivas Kandagatla 	.unprepare = swclk_gate_disable,
1909c39667ddSSrinivas Kandagatla 	.is_enabled = swclk_gate_is_enabled,
1910c39667ddSSrinivas Kandagatla 	.recalc_rate = swclk_recalc_rate,
1911c39667ddSSrinivas Kandagatla 
1912c39667ddSSrinivas Kandagatla };
1913c39667ddSSrinivas Kandagatla 
tx_macro_register_mclk_output(struct tx_macro * tx)1914db8665a3SSrinivas Kandagatla static int tx_macro_register_mclk_output(struct tx_macro *tx)
1915c39667ddSSrinivas Kandagatla {
1916c39667ddSSrinivas Kandagatla 	struct device *dev = tx->dev;
1917c39667ddSSrinivas Kandagatla 	const char *parent_clk_name = NULL;
1918c39667ddSSrinivas Kandagatla 	const char *clk_name = "lpass-tx-mclk";
1919c39667ddSSrinivas Kandagatla 	struct clk_hw *hw;
1920c39667ddSSrinivas Kandagatla 	struct clk_init_data init;
1921c39667ddSSrinivas Kandagatla 	int ret;
1922c39667ddSSrinivas Kandagatla 
19235faf6a1cSKrzysztof Kozlowski 	if (tx->npl)
192431bd0db8SSrinivas Kandagatla 		parent_clk_name = __clk_get_name(tx->npl);
19255faf6a1cSKrzysztof Kozlowski 	else
19265faf6a1cSKrzysztof Kozlowski 		parent_clk_name = __clk_get_name(tx->mclk);
1927c39667ddSSrinivas Kandagatla 
1928c39667ddSSrinivas Kandagatla 	init.name = clk_name;
1929c39667ddSSrinivas Kandagatla 	init.ops = &swclk_gate_ops;
1930c39667ddSSrinivas Kandagatla 	init.flags = 0;
1931c39667ddSSrinivas Kandagatla 	init.parent_names = &parent_clk_name;
1932c39667ddSSrinivas Kandagatla 	init.num_parents = 1;
1933c39667ddSSrinivas Kandagatla 	tx->hw.init = &init;
1934c39667ddSSrinivas Kandagatla 	hw = &tx->hw;
1935db8665a3SSrinivas Kandagatla 	ret = devm_clk_hw_register(dev, hw);
1936c39667ddSSrinivas Kandagatla 	if (ret)
1937db8665a3SSrinivas Kandagatla 		return ret;
1938c39667ddSSrinivas Kandagatla 
1939db8665a3SSrinivas Kandagatla 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
1940c39667ddSSrinivas Kandagatla }
1941c39667ddSSrinivas Kandagatla 
1942c39667ddSSrinivas Kandagatla static const struct snd_soc_component_driver tx_macro_component_drv = {
1943c39667ddSSrinivas Kandagatla 	.name = "RX-MACRO",
1944c39667ddSSrinivas Kandagatla 	.probe = tx_macro_component_probe,
1945c39667ddSSrinivas Kandagatla 	.controls = tx_macro_snd_controls,
1946c39667ddSSrinivas Kandagatla 	.num_controls = ARRAY_SIZE(tx_macro_snd_controls),
1947d207bdeaSSrinivas Kandagatla 	.dapm_widgets = tx_macro_dapm_widgets,
1948d207bdeaSSrinivas Kandagatla 	.num_dapm_widgets = ARRAY_SIZE(tx_macro_dapm_widgets),
1949d207bdeaSSrinivas Kandagatla 	.dapm_routes = tx_audio_map,
1950d207bdeaSSrinivas Kandagatla 	.num_dapm_routes = ARRAY_SIZE(tx_audio_map),
1951c39667ddSSrinivas Kandagatla };
1952c39667ddSSrinivas Kandagatla 
tx_macro_probe(struct platform_device * pdev)1953c39667ddSSrinivas Kandagatla static int tx_macro_probe(struct platform_device *pdev)
1954c39667ddSSrinivas Kandagatla {
1955c39667ddSSrinivas Kandagatla 	struct device *dev = &pdev->dev;
19567b285c74SSrinivasa Rao Mandadapu 	struct device_node *np = dev->of_node;
19575faf6a1cSKrzysztof Kozlowski 	kernel_ulong_t flags;
1958c39667ddSSrinivas Kandagatla 	struct tx_macro *tx;
1959c39667ddSSrinivas Kandagatla 	void __iomem *base;
19607b285c74SSrinivasa Rao Mandadapu 	int ret, reg;
1961c39667ddSSrinivas Kandagatla 
19625faf6a1cSKrzysztof Kozlowski 	flags = (kernel_ulong_t)device_get_match_data(dev);
19635faf6a1cSKrzysztof Kozlowski 
1964c39667ddSSrinivas Kandagatla 	tx = devm_kzalloc(dev, sizeof(*tx), GFP_KERNEL);
1965c39667ddSSrinivas Kandagatla 	if (!tx)
1966c39667ddSSrinivas Kandagatla 		return -ENOMEM;
1967c39667ddSSrinivas Kandagatla 
1968512864c4SSrinivas Kandagatla 	tx->macro = devm_clk_get_optional(dev, "macro");
1969512864c4SSrinivas Kandagatla 	if (IS_ERR(tx->macro))
1970f54e3474SBjorn Andersson 		return dev_err_probe(dev, PTR_ERR(tx->macro), "unable to get macro clock\n");
1971c39667ddSSrinivas Kandagatla 
1972512864c4SSrinivas Kandagatla 	tx->dcodec = devm_clk_get_optional(dev, "dcodec");
1973512864c4SSrinivas Kandagatla 	if (IS_ERR(tx->dcodec))
1974f54e3474SBjorn Andersson 		return dev_err_probe(dev, PTR_ERR(tx->dcodec), "unable to get dcodec clock\n");
1975512864c4SSrinivas Kandagatla 
1976512864c4SSrinivas Kandagatla 	tx->mclk = devm_clk_get(dev, "mclk");
1977512864c4SSrinivas Kandagatla 	if (IS_ERR(tx->mclk))
1978f54e3474SBjorn Andersson 		return dev_err_probe(dev, PTR_ERR(tx->mclk), "unable to get mclk clock\n");
1979512864c4SSrinivas Kandagatla 
19805faf6a1cSKrzysztof Kozlowski 	if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
1981512864c4SSrinivas Kandagatla 		tx->npl = devm_clk_get(dev, "npl");
1982512864c4SSrinivas Kandagatla 		if (IS_ERR(tx->npl))
1983f54e3474SBjorn Andersson 			return dev_err_probe(dev, PTR_ERR(tx->npl), "unable to get npl clock\n");
19845faf6a1cSKrzysztof Kozlowski 	}
1985512864c4SSrinivas Kandagatla 
1986512864c4SSrinivas Kandagatla 	tx->fsgen = devm_clk_get(dev, "fsgen");
1987512864c4SSrinivas Kandagatla 	if (IS_ERR(tx->fsgen))
1988f54e3474SBjorn Andersson 		return dev_err_probe(dev, PTR_ERR(tx->fsgen), "unable to get fsgen clock\n");
1989c39667ddSSrinivas Kandagatla 
19909e3d83c5SSrinivasa Rao Mandadapu 	tx->pds = lpass_macro_pds_init(dev);
19919e3d83c5SSrinivasa Rao Mandadapu 	if (IS_ERR(tx->pds))
19929e3d83c5SSrinivasa Rao Mandadapu 		return PTR_ERR(tx->pds);
19939e3d83c5SSrinivasa Rao Mandadapu 
1994c39667ddSSrinivas Kandagatla 	base = devm_platform_ioremap_resource(pdev, 0);
1995ddfd5345SChristophe JAILLET 	if (IS_ERR(base)) {
1996ddfd5345SChristophe JAILLET 		ret = PTR_ERR(base);
1997ddfd5345SChristophe JAILLET 		goto err;
1998ddfd5345SChristophe JAILLET 	}
1999c39667ddSSrinivas Kandagatla 
20007b285c74SSrinivasa Rao Mandadapu 	/* Update defaults for lpass sc7280 */
20017b285c74SSrinivasa Rao Mandadapu 	if (of_device_is_compatible(np, "qcom,sc7280-lpass-tx-macro")) {
20027b285c74SSrinivasa Rao Mandadapu 		for (reg = 0; reg < ARRAY_SIZE(tx_defaults); reg++) {
20037b285c74SSrinivasa Rao Mandadapu 			switch (tx_defaults[reg].reg) {
20047b285c74SSrinivasa Rao Mandadapu 			case CDC_TX_TOP_CSR_SWR_AMIC0_CTL:
20057b285c74SSrinivasa Rao Mandadapu 			case CDC_TX_TOP_CSR_SWR_AMIC1_CTL:
20067b285c74SSrinivasa Rao Mandadapu 				tx_defaults[reg].def = 0x0E;
20077b285c74SSrinivasa Rao Mandadapu 				break;
20087b285c74SSrinivasa Rao Mandadapu 			default:
20097b285c74SSrinivasa Rao Mandadapu 				break;
20107b285c74SSrinivasa Rao Mandadapu 			}
20117b285c74SSrinivasa Rao Mandadapu 		}
20127b285c74SSrinivasa Rao Mandadapu 	}
20137b285c74SSrinivasa Rao Mandadapu 
2014c39667ddSSrinivas Kandagatla 	tx->regmap = devm_regmap_init_mmio(dev, base, &tx_regmap_config);
2015ddfd5345SChristophe JAILLET 	if (IS_ERR(tx->regmap)) {
2016ddfd5345SChristophe JAILLET 		ret = PTR_ERR(tx->regmap);
2017ddfd5345SChristophe JAILLET 		goto err;
2018ddfd5345SChristophe JAILLET 	}
2019c39667ddSSrinivas Kandagatla 
2020c39667ddSSrinivas Kandagatla 	dev_set_drvdata(dev, tx);
2021c39667ddSSrinivas Kandagatla 
2022c39667ddSSrinivas Kandagatla 	tx->dev = dev;
2023c39667ddSSrinivas Kandagatla 
2024*8d73500fSNeil Armstrong 	/* Set active_decimator default value */
2025*8d73500fSNeil Armstrong 	tx->active_decimator[TX_MACRO_AIF1_CAP] = -1;
2026*8d73500fSNeil Armstrong 	tx->active_decimator[TX_MACRO_AIF2_CAP] = -1;
2027*8d73500fSNeil Armstrong 	tx->active_decimator[TX_MACRO_AIF3_CAP] = -1;
2028*8d73500fSNeil Armstrong 
2029c39667ddSSrinivas Kandagatla 	/* set MCLK and NPL rates */
2030512864c4SSrinivas Kandagatla 	clk_set_rate(tx->mclk, MCLK_FREQ);
2031e7621434SSrinivas Kandagatla 	clk_set_rate(tx->npl, MCLK_FREQ);
2032c39667ddSSrinivas Kandagatla 
2033512864c4SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->macro);
2034c39667ddSSrinivas Kandagatla 	if (ret)
2035512864c4SSrinivas Kandagatla 		goto err;
2036512864c4SSrinivas Kandagatla 
2037512864c4SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->dcodec);
2038512864c4SSrinivas Kandagatla 	if (ret)
2039512864c4SSrinivas Kandagatla 		goto err_dcodec;
2040512864c4SSrinivas Kandagatla 
2041512864c4SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->mclk);
2042512864c4SSrinivas Kandagatla 	if (ret)
2043512864c4SSrinivas Kandagatla 		goto err_mclk;
2044512864c4SSrinivas Kandagatla 
2045512864c4SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->npl);
2046512864c4SSrinivas Kandagatla 	if (ret)
2047512864c4SSrinivas Kandagatla 		goto err_npl;
2048512864c4SSrinivas Kandagatla 
2049512864c4SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->fsgen);
2050512864c4SSrinivas Kandagatla 	if (ret)
2051512864c4SSrinivas Kandagatla 		goto err_fsgen;
2052c39667ddSSrinivas Kandagatla 
2053ddffe3b8SSrinivas Kandagatla 	/* reset soundwire block */
2054ddffe3b8SSrinivas Kandagatla 	regmap_update_bits(tx->regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2055ddffe3b8SSrinivas Kandagatla 			   CDC_TX_SWR_RESET_MASK, CDC_TX_SWR_RESET_ENABLE);
2056ddffe3b8SSrinivas Kandagatla 
2057ddffe3b8SSrinivas Kandagatla 	regmap_update_bits(tx->regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2058ddffe3b8SSrinivas Kandagatla 			   CDC_TX_SWR_CLK_EN_MASK,
2059ddffe3b8SSrinivas Kandagatla 			   CDC_TX_SWR_CLK_ENABLE);
2060ddffe3b8SSrinivas Kandagatla 	regmap_update_bits(tx->regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2061ddffe3b8SSrinivas Kandagatla 			   CDC_TX_SWR_RESET_MASK, 0x0);
2062ddffe3b8SSrinivas Kandagatla 
2063c39667ddSSrinivas Kandagatla 	ret = devm_snd_soc_register_component(dev, &tx_macro_component_drv,
2064c39667ddSSrinivas Kandagatla 					      tx_macro_dai,
2065c39667ddSSrinivas Kandagatla 					      ARRAY_SIZE(tx_macro_dai));
2066c39667ddSSrinivas Kandagatla 	if (ret)
2067512864c4SSrinivas Kandagatla 		goto err_clkout;
2068c39667ddSSrinivas Kandagatla 
20691fb83bc5SSrinivas Kandagatla 	pm_runtime_set_autosuspend_delay(dev, 3000);
20701fb83bc5SSrinivas Kandagatla 	pm_runtime_use_autosuspend(dev);
20711fb83bc5SSrinivas Kandagatla 	pm_runtime_mark_last_busy(dev);
20721fb83bc5SSrinivas Kandagatla 	pm_runtime_set_active(dev);
20731fb83bc5SSrinivas Kandagatla 	pm_runtime_enable(dev);
20741fb83bc5SSrinivas Kandagatla 
20751dc34590SSrinivas Kandagatla 	ret = tx_macro_register_mclk_output(tx);
20761dc34590SSrinivas Kandagatla 	if (ret)
20771dc34590SSrinivas Kandagatla 		goto err_clkout;
20781dc34590SSrinivas Kandagatla 
2079512864c4SSrinivas Kandagatla 	return 0;
2080512864c4SSrinivas Kandagatla 
2081512864c4SSrinivas Kandagatla err_clkout:
2082512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->fsgen);
2083512864c4SSrinivas Kandagatla err_fsgen:
2084512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->npl);
2085512864c4SSrinivas Kandagatla err_npl:
2086512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->mclk);
2087512864c4SSrinivas Kandagatla err_mclk:
2088512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->dcodec);
2089512864c4SSrinivas Kandagatla err_dcodec:
2090512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->macro);
2091512864c4SSrinivas Kandagatla err:
2092ddfd5345SChristophe JAILLET 	lpass_macro_pds_exit(tx->pds);
2093ddfd5345SChristophe JAILLET 
2094c39667ddSSrinivas Kandagatla 	return ret;
2095c39667ddSSrinivas Kandagatla }
2096c39667ddSSrinivas Kandagatla 
tx_macro_remove(struct platform_device * pdev)209710b4f1edSUwe Kleine-König static void tx_macro_remove(struct platform_device *pdev)
2098c39667ddSSrinivas Kandagatla {
2099c39667ddSSrinivas Kandagatla 	struct tx_macro *tx = dev_get_drvdata(&pdev->dev);
2100c39667ddSSrinivas Kandagatla 
2101512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->macro);
2102512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->dcodec);
2103512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->mclk);
2104512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->npl);
2105512864c4SSrinivas Kandagatla 	clk_disable_unprepare(tx->fsgen);
2106c39667ddSSrinivas Kandagatla 
21071c19601dSSrinivasa Rao Mandadapu 	lpass_macro_pds_exit(tx->pds);
2108c39667ddSSrinivas Kandagatla }
2109c39667ddSSrinivas Kandagatla 
tx_macro_runtime_suspend(struct device * dev)21101fb83bc5SSrinivas Kandagatla static int __maybe_unused tx_macro_runtime_suspend(struct device *dev)
21111fb83bc5SSrinivas Kandagatla {
21121fb83bc5SSrinivas Kandagatla 	struct tx_macro *tx = dev_get_drvdata(dev);
21131fb83bc5SSrinivas Kandagatla 
21141fb83bc5SSrinivas Kandagatla 	regcache_cache_only(tx->regmap, true);
21151fb83bc5SSrinivas Kandagatla 	regcache_mark_dirty(tx->regmap);
21161fb83bc5SSrinivas Kandagatla 
21171fb83bc5SSrinivas Kandagatla 	clk_disable_unprepare(tx->fsgen);
2118a4a32034SSrinivas Kandagatla 	clk_disable_unprepare(tx->npl);
2119a4a32034SSrinivas Kandagatla 	clk_disable_unprepare(tx->mclk);
21201fb83bc5SSrinivas Kandagatla 
21211fb83bc5SSrinivas Kandagatla 	return 0;
21221fb83bc5SSrinivas Kandagatla }
21231fb83bc5SSrinivas Kandagatla 
tx_macro_runtime_resume(struct device * dev)21241fb83bc5SSrinivas Kandagatla static int __maybe_unused tx_macro_runtime_resume(struct device *dev)
21251fb83bc5SSrinivas Kandagatla {
21261fb83bc5SSrinivas Kandagatla 	struct tx_macro *tx = dev_get_drvdata(dev);
21271fb83bc5SSrinivas Kandagatla 	int ret;
21281fb83bc5SSrinivas Kandagatla 
21291fb83bc5SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->mclk);
21301fb83bc5SSrinivas Kandagatla 	if (ret) {
21311fb83bc5SSrinivas Kandagatla 		dev_err(dev, "unable to prepare mclk\n");
21321fb83bc5SSrinivas Kandagatla 		return ret;
21331fb83bc5SSrinivas Kandagatla 	}
21341fb83bc5SSrinivas Kandagatla 
21351fb83bc5SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->npl);
21361fb83bc5SSrinivas Kandagatla 	if (ret) {
21371fb83bc5SSrinivas Kandagatla 		dev_err(dev, "unable to prepare npl\n");
21381fb83bc5SSrinivas Kandagatla 		goto err_npl;
21391fb83bc5SSrinivas Kandagatla 	}
21401fb83bc5SSrinivas Kandagatla 
21411fb83bc5SSrinivas Kandagatla 	ret = clk_prepare_enable(tx->fsgen);
21421fb83bc5SSrinivas Kandagatla 	if (ret) {
21431fb83bc5SSrinivas Kandagatla 		dev_err(dev, "unable to prepare fsgen\n");
21441fb83bc5SSrinivas Kandagatla 		goto err_fsgen;
21451fb83bc5SSrinivas Kandagatla 	}
21461fb83bc5SSrinivas Kandagatla 
21471fb83bc5SSrinivas Kandagatla 	regcache_cache_only(tx->regmap, false);
21481fb83bc5SSrinivas Kandagatla 	regcache_sync(tx->regmap);
21491fb83bc5SSrinivas Kandagatla 
21501fb83bc5SSrinivas Kandagatla 	return 0;
21511fb83bc5SSrinivas Kandagatla err_fsgen:
21521fb83bc5SSrinivas Kandagatla 	clk_disable_unprepare(tx->npl);
21531fb83bc5SSrinivas Kandagatla err_npl:
21541fb83bc5SSrinivas Kandagatla 	clk_disable_unprepare(tx->mclk);
21551fb83bc5SSrinivas Kandagatla 
21561fb83bc5SSrinivas Kandagatla 	return ret;
21571fb83bc5SSrinivas Kandagatla }
21581fb83bc5SSrinivas Kandagatla 
21591fb83bc5SSrinivas Kandagatla static const struct dev_pm_ops tx_macro_pm_ops = {
21601fb83bc5SSrinivas Kandagatla 	SET_RUNTIME_PM_OPS(tx_macro_runtime_suspend, tx_macro_runtime_resume, NULL)
21611fb83bc5SSrinivas Kandagatla };
21621fb83bc5SSrinivas Kandagatla 
2163c39667ddSSrinivas Kandagatla static const struct of_device_id tx_macro_dt_match[] = {
21645faf6a1cSKrzysztof Kozlowski 	{
21655faf6a1cSKrzysztof Kozlowski 		.compatible = "qcom,sc7280-lpass-tx-macro",
21665faf6a1cSKrzysztof Kozlowski 		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
21675faf6a1cSKrzysztof Kozlowski 	}, {
21685faf6a1cSKrzysztof Kozlowski 		.compatible = "qcom,sm8250-lpass-tx-macro",
21695faf6a1cSKrzysztof Kozlowski 		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
21705faf6a1cSKrzysztof Kozlowski 	}, {
21715faf6a1cSKrzysztof Kozlowski 		.compatible = "qcom,sm8450-lpass-tx-macro",
21725faf6a1cSKrzysztof Kozlowski 		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
21735faf6a1cSKrzysztof Kozlowski 	}, {
21745faf6a1cSKrzysztof Kozlowski 		.compatible = "qcom,sm8550-lpass-tx-macro",
21755faf6a1cSKrzysztof Kozlowski 	}, {
21765faf6a1cSKrzysztof Kozlowski 		.compatible = "qcom,sc8280xp-lpass-tx-macro",
21775faf6a1cSKrzysztof Kozlowski 		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
21785faf6a1cSKrzysztof Kozlowski 	},
2179c39667ddSSrinivas Kandagatla 	{ }
2180c39667ddSSrinivas Kandagatla };
218114c0c423SBixuan Cui MODULE_DEVICE_TABLE(of, tx_macro_dt_match);
2182c39667ddSSrinivas Kandagatla static struct platform_driver tx_macro_driver = {
2183c39667ddSSrinivas Kandagatla 	.driver = {
2184c39667ddSSrinivas Kandagatla 		.name = "tx_macro",
2185c39667ddSSrinivas Kandagatla 		.of_match_table = tx_macro_dt_match,
2186c39667ddSSrinivas Kandagatla 		.suppress_bind_attrs = true,
21871fb83bc5SSrinivas Kandagatla 		.pm = &tx_macro_pm_ops,
2188c39667ddSSrinivas Kandagatla 	},
2189c39667ddSSrinivas Kandagatla 	.probe = tx_macro_probe,
219010b4f1edSUwe Kleine-König 	.remove_new = tx_macro_remove,
2191c39667ddSSrinivas Kandagatla };
2192c39667ddSSrinivas Kandagatla 
2193c39667ddSSrinivas Kandagatla module_platform_driver(tx_macro_driver);
2194c39667ddSSrinivas Kandagatla 
2195c39667ddSSrinivas Kandagatla MODULE_DESCRIPTION("TX macro driver");
2196c39667ddSSrinivas Kandagatla MODULE_LICENSE("GPL");
2197