1809bcbceSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0-only
2809bcbceSSrinivas Kandagatla // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
3809bcbceSSrinivas Kandagatla 
4809bcbceSSrinivas Kandagatla #include <linux/module.h>
5809bcbceSSrinivas Kandagatla #include <linux/init.h>
6809bcbceSSrinivas Kandagatla #include <linux/io.h>
7809bcbceSSrinivas Kandagatla #include <linux/platform_device.h>
8809bcbceSSrinivas Kandagatla #include <linux/clk.h>
9809bcbceSSrinivas Kandagatla #include <linux/of_clk.h>
10809bcbceSSrinivas Kandagatla #include <linux/clk-provider.h>
11809bcbceSSrinivas Kandagatla #include <sound/soc.h>
12809bcbceSSrinivas Kandagatla #include <sound/soc-dapm.h>
13809bcbceSSrinivas Kandagatla #include <linux/of_platform.h>
14809bcbceSSrinivas Kandagatla #include <sound/tlv.h>
15809bcbceSSrinivas Kandagatla #include "lpass-wsa-macro.h"
16809bcbceSSrinivas Kandagatla 
17809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL	(0x0000)
18809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_EN_MASK			BIT(0)
19809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_ENABLE			BIT(0)
20809bcbceSSrinivas Kandagatla #define CDC_WSA_MCLK_DISABLE			0
21809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL	(0x0004)
22809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_EN_MASK			BIT(0)
23809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_ENABLE			BIT(0)
24809bcbceSSrinivas Kandagatla #define CDC_WSA_FS_CNT_DISABLE			0
25809bcbceSSrinivas Kandagatla #define CDC_WSA_CLK_RST_CTRL_SWR_CONTROL	(0x0008)
26809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_CLK_EN_MASK			BIT(0)
27809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_CLK_ENABLE			BIT(0)
28809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_EN_MASK			BIT(1)
29809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_ENABLE			BIT(1)
30809bcbceSSrinivas Kandagatla #define CDC_WSA_SWR_RST_DISABLE			0
31809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TOP_CFG0			(0x0080)
32809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TOP_CFG1			(0x0084)
33809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_FREQ_MCLK			(0x0088)
34809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_BUS_SEL		(0x008C)
35809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_EN0			(0x0090)
36809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_EN1			(0x0094)
37809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_DEBUG_DSM_LB		(0x0098)
38809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_RX_I2S_CTL			(0x009C)
39809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_TX_I2S_CTL			(0x00A0)
40809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_I2S_CLK			(0x00A4)
41809bcbceSSrinivas Kandagatla #define CDC_WSA_TOP_I2S_RESET			(0x00A8)
42809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT0_CFG0		(0x0100)
437db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK	GENMASK(2, 0)
447db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK	GENMASK(5, 3)
45809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT0_CFG1		(0x0104)
467db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_2_SEL_MASK		GENMASK(2, 0)
477db4c4cdSSrinivas Kandagatla #define CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK	GENMASK(5, 3)
48809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT1_CFG0		(0x0108)
49809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_INT1_CFG1		(0x010C)
50809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_MIX_CFG0		(0x0110)
51809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX1_SEL_MASK		GENMASK(5, 3)
52809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX1_SEL_SHFT		3
53809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_MIX_TX0_SEL_MASK		GENMASK(2, 0)
54809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_RX_EC_CFG0		(0x0114)
55809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0	(0x0118)
56809bcbceSSrinivas Kandagatla #define CDC_WSA_TX0_SPKR_PROT_PATH_CTL		(0x0244)
57809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_RESET_MASK		BIT(5)
58809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_RESET		BIT(5)
59809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_NO_RESET		0
60809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK	BIT(4)
61809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_ENABLE		BIT(4)
62809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE	0
63809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK	GENMASK(3, 0)
64809bcbceSSrinivas Kandagatla #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K	0
65809bcbceSSrinivas Kandagatla #define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0		(0x0248)
66809bcbceSSrinivas Kandagatla #define CDC_WSA_TX1_SPKR_PROT_PATH_CTL		(0x0264)
67809bcbceSSrinivas Kandagatla #define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0		(0x0268)
68809bcbceSSrinivas Kandagatla #define CDC_WSA_TX2_SPKR_PROT_PATH_CTL		(0x0284)
69809bcbceSSrinivas Kandagatla #define CDC_WSA_TX2_SPKR_PROT_PATH_CFG0		(0x0288)
70809bcbceSSrinivas Kandagatla #define CDC_WSA_TX3_SPKR_PROT_PATH_CTL		(0x02A4)
71809bcbceSSrinivas Kandagatla #define CDC_WSA_TX3_SPKR_PROT_PATH_CFG0		(0x02A8)
72809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_CFG			(0x0340)
73809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_CLR_COMMIT		(0x0344)
74809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_MASK0		(0x0360)
75809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_STATUS0		(0x0368)
76809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN1_CLEAR0		(0x0370)
77809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_MASK0		(0x0380)
78809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_STATUS0		(0x0388)
79809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_PIN2_CLEAR0		(0x0390)
80809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_LEVEL0		(0x03C0)
81809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_BYPASS0		(0x03C8)
82809bcbceSSrinivas Kandagatla #define CDC_WSA_INTR_CTRL_SET0			(0x03D0)
83809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CTL			(0x0400)
84809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_EN_MASK		BIT(5)
85809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_ENABLE		BIT(5)
86809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_CLK_DISABLE		0
87809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK	BIT(4)
88809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_ENABLE		BIT(4)
89809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_PGA_MUTE_DISABLE	0
90809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG0		(0x0404)
91809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_COMP_EN_MASK		BIT(1)
92809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_COMP_ENABLE		BIT(1)
93809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_EN_MASK		BIT(2)
94809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_ENABLE		BIT(2)
95809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SPKR_RATE_MASK		BIT(3)
96809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072	BIT(3)
97809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG1		(0x0408)
98809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_EN_MASK	BIT(0)
99809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_ENABLE	BIT(0)
100809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_SMART_BST_DISABLE	0
101809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG2		(0x040C)
102809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_CFG3		(0x0410)
103809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DC_DCOEFF_MASK		GENMASK(1, 0)
104809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_VOL_CTL			(0x0414)
105809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_CTL		(0x0418)
106809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_EN_MASK		BIT(5)
107809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_ENABLE		BIT(5)
108809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_MIX_CLK_DISABLE		0
109809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_CFG		(0x041C)
110809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_VOL_MIX_CTL		(0x0420)
111809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC0		(0x0424)
112809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC1		(0x0428)
113809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_MASK		BIT(0)
114809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_ENABLE		BIT(0)
115809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PGA_HALF_DB_DISABLE		0
116809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC2		(0x042C)
117809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC3		(0x0430)
118809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_SCALE_MASK		GENMASK(1, 0)
119809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_PATH_HD2_ALPHA_MASK		GENMASK(5, 2)
120809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC5		(0x0438)
121809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC6		(0x043C)
122809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_SEC7		(0x0440)
123809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_SEC0		(0x0444)
124809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_MIX_SEC1		(0x0448)
125809bcbceSSrinivas Kandagatla #define CDC_WSA_RX0_RX_PATH_DSMDEM_CTL		(0x044C)
126809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DSMDEM_CLK_EN_MASK		BIT(0)
127809bcbceSSrinivas Kandagatla #define CDC_WSA_RX_DSMDEM_CLK_ENABLE		BIT(0)
128809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CTL			(0x0480)
129809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG0		(0x0484)
130809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG1		(0x0488)
131809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG2		(0x048C)
132809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_CFG3		(0x0490)
133809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_VOL_CTL			(0x0494)
134809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_CTL		(0x0498)
135809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_CFG		(0x049C)
136809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_VOL_MIX_CTL		(0x04A0)
137809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC0		(0x04A4)
138809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC1		(0x04A8)
139809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC2		(0x04AC)
140809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC3		(0x04B0)
141809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC5		(0x04B8)
142809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC6		(0x04BC)
143809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_SEC7		(0x04C0)
144809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_SEC0		(0x04C4)
145809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_MIX_SEC1		(0x04C8)
146809bcbceSSrinivas Kandagatla #define CDC_WSA_RX1_RX_PATH_DSMDEM_CTL		(0x04CC)
147809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_PATH_CTL		(0x0500)
148809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_EN_MASK		BIT(4)
149809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_ENABLE		BIT(4)
150809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST_PATH_CLK_DISABLE		0
151809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CTL		(0x0504)
152809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CFG1		(0x0508)
153809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST0_BOOST_CFG2		(0x050C)
154809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_PATH_CTL		(0x0540)
155809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CTL		(0x0544)
156809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CFG1		(0x0548)
157809bcbceSSrinivas Kandagatla #define CDC_WSA_BOOST1_BOOST_CFG2		(0x054C)
158809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL0			(0x0580)
159809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_CLK_EN_MASK		BIT(0)
160809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_CLK_ENABLE		BIT(0)
161809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_SOFT_RST_MASK		BIT(1)
162809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_SOFT_RST_ENABLE	BIT(1)
163809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_HALT_MASK		BIT(2)
164809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER_HALT			BIT(2)
165809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL1			(0x0584)
166809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL2			(0x0588)
167809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL3			(0x058C)
168809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL4			(0x0590)
169809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL5			(0x0594)
170809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL6			(0x0598)
171809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER0_CTL7			(0x059C)
172809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL0			(0x05C0)
173809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL1			(0x05C4)
174809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL2			(0x05C8)
175809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL3			(0x05CC)
176809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL4			(0x05D0)
177809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL5			(0x05D4)
178809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL6			(0x05D8)
179809bcbceSSrinivas Kandagatla #define CDC_WSA_COMPANDER1_CTL7			(0x05DC)
180809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP0_CRC			(0x0600)
181809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_CLK_EN_MASK		BIT(0)
182809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_CLK_ENABLE		BIT(0)
183809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL		(0x0604)
184809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_EN_MASK		BIT(0)
185809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP_ENABLE			BIT(0)
186809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP1_CRC			(0x0640)
187809bcbceSSrinivas Kandagatla #define CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL		(0x0644)
188809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL	(0x0680)
189809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_CLK_EN_MASK		BIT(0)
190809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_CLK_ENABLE		BIT(0)
191809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0		(0x0684)
192809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK	GENMASK(4, 1)
193809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K	BIT(3)
194809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL	(0x06C0)
195809bcbceSSrinivas Kandagatla #define CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0		(0x06C4)
196809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL	(0x0700)
197809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CTL0		(0x0704)
198809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_CTL1		(0x0708)
199809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_FIFO_CTL		(0x070C)
200809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB	(0x0710)
201809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB	(0x0714)
202809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB	(0x0718)
203809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB	(0x071C)
204809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC0_STATUS_FIFO		(0x0720)
205809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL		(0x0740)
206809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CTL0		(0x0744)
207809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_CTL1		(0x0748)
208809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_FIFO_CTL		(0x074C)
209809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB (0x0750)
210809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB (0x0754)
211809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB (0x0758)
212809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB (0x075C)
213809bcbceSSrinivas Kandagatla #define CDC_WSA_SPLINE_ASRC1_STATUS_FIFO	(0x0760)
214809bcbceSSrinivas Kandagatla #define WSA_MAX_OFFSET				(0x0760)
215809bcbceSSrinivas Kandagatla 
216809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
217809bcbceSSrinivas Kandagatla 			SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
218809bcbceSSrinivas Kandagatla 			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
219809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\
220809bcbceSSrinivas Kandagatla 			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
221809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
222809bcbceSSrinivas Kandagatla 		SNDRV_PCM_FMTBIT_S24_LE |\
223809bcbceSSrinivas Kandagatla 		SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
224809bcbceSSrinivas Kandagatla 
225809bcbceSSrinivas Kandagatla #define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
226809bcbceSSrinivas Kandagatla 			SNDRV_PCM_RATE_48000)
227809bcbceSSrinivas Kandagatla #define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
228809bcbceSSrinivas Kandagatla 		SNDRV_PCM_FMTBIT_S24_LE |\
229809bcbceSSrinivas Kandagatla 		SNDRV_PCM_FMTBIT_S24_3LE)
230809bcbceSSrinivas Kandagatla 
231809bcbceSSrinivas Kandagatla #define NUM_INTERPOLATORS 2
232809bcbceSSrinivas Kandagatla #define WSA_NUM_CLKS_MAX	5
233809bcbceSSrinivas Kandagatla #define WSA_MACRO_MCLK_FREQ 19200000
234809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_INP_MASK2 0x38
235809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_CFG_OFFSET 0x8
236809bcbceSSrinivas Kandagatla #define WSA_MACRO_MUX_CFG1_OFFSET 0x4
237809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_COMP_OFFSET 0x40
238809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40
239809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_OFFSET 0x80
240809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10
241809bcbceSSrinivas Kandagatla #define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C
242809bcbceSSrinivas Kandagatla #define WSA_MACRO_FS_RATE_MASK 0x0F
243809bcbceSSrinivas Kandagatla #define WSA_MACRO_EC_MIX_TX0_MASK 0x03
244809bcbceSSrinivas Kandagatla #define WSA_MACRO_EC_MIX_TX1_MASK 0x18
245809bcbceSSrinivas Kandagatla #define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2
246809bcbceSSrinivas Kandagatla 
247809bcbceSSrinivas Kandagatla enum {
248809bcbceSSrinivas Kandagatla 	WSA_MACRO_GAIN_OFFSET_M1P5_DB,
249809bcbceSSrinivas Kandagatla 	WSA_MACRO_GAIN_OFFSET_0_DB,
250809bcbceSSrinivas Kandagatla };
251809bcbceSSrinivas Kandagatla enum {
252809bcbceSSrinivas Kandagatla 	WSA_MACRO_RX0 = 0,
253809bcbceSSrinivas Kandagatla 	WSA_MACRO_RX1,
254809bcbceSSrinivas Kandagatla 	WSA_MACRO_RX_MIX,
255809bcbceSSrinivas Kandagatla 	WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX,
256809bcbceSSrinivas Kandagatla 	WSA_MACRO_RX_MIX1,
257809bcbceSSrinivas Kandagatla 	WSA_MACRO_RX_MAX,
258809bcbceSSrinivas Kandagatla };
259809bcbceSSrinivas Kandagatla 
260809bcbceSSrinivas Kandagatla enum {
261809bcbceSSrinivas Kandagatla 	WSA_MACRO_TX0 = 0,
262809bcbceSSrinivas Kandagatla 	WSA_MACRO_TX1,
263809bcbceSSrinivas Kandagatla 	WSA_MACRO_TX_MAX,
264809bcbceSSrinivas Kandagatla };
265809bcbceSSrinivas Kandagatla 
266809bcbceSSrinivas Kandagatla enum {
267809bcbceSSrinivas Kandagatla 	WSA_MACRO_EC0_MUX = 0,
268809bcbceSSrinivas Kandagatla 	WSA_MACRO_EC1_MUX,
269809bcbceSSrinivas Kandagatla 	WSA_MACRO_EC_MUX_MAX,
270809bcbceSSrinivas Kandagatla };
271809bcbceSSrinivas Kandagatla 
272809bcbceSSrinivas Kandagatla enum {
273809bcbceSSrinivas Kandagatla 	WSA_MACRO_COMP1, /* SPK_L */
274809bcbceSSrinivas Kandagatla 	WSA_MACRO_COMP2, /* SPK_R */
275809bcbceSSrinivas Kandagatla 	WSA_MACRO_COMP_MAX
276809bcbceSSrinivas Kandagatla };
277809bcbceSSrinivas Kandagatla 
278809bcbceSSrinivas Kandagatla enum {
279809bcbceSSrinivas Kandagatla 	WSA_MACRO_SOFTCLIP0, /* RX0 */
280809bcbceSSrinivas Kandagatla 	WSA_MACRO_SOFTCLIP1, /* RX1 */
281809bcbceSSrinivas Kandagatla 	WSA_MACRO_SOFTCLIP_MAX
282809bcbceSSrinivas Kandagatla };
283809bcbceSSrinivas Kandagatla 
284809bcbceSSrinivas Kandagatla enum {
285809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_ZERO = 0,
286809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_RX0,
287809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_RX1,
288809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_RX2,
289809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_RX3,
290809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_DEC0,
291809bcbceSSrinivas Kandagatla 	INTn_1_INP_SEL_DEC1,
292809bcbceSSrinivas Kandagatla };
293809bcbceSSrinivas Kandagatla 
294809bcbceSSrinivas Kandagatla enum {
295809bcbceSSrinivas Kandagatla 	INTn_2_INP_SEL_ZERO = 0,
296809bcbceSSrinivas Kandagatla 	INTn_2_INP_SEL_RX0,
297809bcbceSSrinivas Kandagatla 	INTn_2_INP_SEL_RX1,
298809bcbceSSrinivas Kandagatla 	INTn_2_INP_SEL_RX2,
299809bcbceSSrinivas Kandagatla 	INTn_2_INP_SEL_RX3,
300809bcbceSSrinivas Kandagatla };
301809bcbceSSrinivas Kandagatla 
302809bcbceSSrinivas Kandagatla struct interp_sample_rate {
303809bcbceSSrinivas Kandagatla 	int sample_rate;
304809bcbceSSrinivas Kandagatla 	int rate_val;
305809bcbceSSrinivas Kandagatla };
306809bcbceSSrinivas Kandagatla 
307809bcbceSSrinivas Kandagatla static struct interp_sample_rate int_prim_sample_rate_val[] = {
308809bcbceSSrinivas Kandagatla 	{8000, 0x0},	/* 8K */
309809bcbceSSrinivas Kandagatla 	{16000, 0x1},	/* 16K */
310809bcbceSSrinivas Kandagatla 	{24000, -EINVAL},/* 24K */
311809bcbceSSrinivas Kandagatla 	{32000, 0x3},	/* 32K */
312809bcbceSSrinivas Kandagatla 	{48000, 0x4},	/* 48K */
313809bcbceSSrinivas Kandagatla 	{96000, 0x5},	/* 96K */
314809bcbceSSrinivas Kandagatla 	{192000, 0x6},	/* 192K */
315809bcbceSSrinivas Kandagatla 	{384000, 0x7},	/* 384K */
316809bcbceSSrinivas Kandagatla 	{44100, 0x8}, /* 44.1K */
317809bcbceSSrinivas Kandagatla };
318809bcbceSSrinivas Kandagatla 
319809bcbceSSrinivas Kandagatla static struct interp_sample_rate int_mix_sample_rate_val[] = {
320809bcbceSSrinivas Kandagatla 	{48000, 0x4},	/* 48K */
321809bcbceSSrinivas Kandagatla 	{96000, 0x5},	/* 96K */
322809bcbceSSrinivas Kandagatla 	{192000, 0x6},	/* 192K */
323809bcbceSSrinivas Kandagatla };
324809bcbceSSrinivas Kandagatla 
325809bcbceSSrinivas Kandagatla enum {
326809bcbceSSrinivas Kandagatla 	WSA_MACRO_AIF_INVALID = 0,
327809bcbceSSrinivas Kandagatla 	WSA_MACRO_AIF1_PB,
328809bcbceSSrinivas Kandagatla 	WSA_MACRO_AIF_MIX1_PB,
329809bcbceSSrinivas Kandagatla 	WSA_MACRO_AIF_VI,
330809bcbceSSrinivas Kandagatla 	WSA_MACRO_AIF_ECHO,
331809bcbceSSrinivas Kandagatla 	WSA_MACRO_MAX_DAIS,
332809bcbceSSrinivas Kandagatla };
333809bcbceSSrinivas Kandagatla 
334809bcbceSSrinivas Kandagatla struct wsa_macro {
335809bcbceSSrinivas Kandagatla 	struct device *dev;
336809bcbceSSrinivas Kandagatla 	int comp_enabled[WSA_MACRO_COMP_MAX];
337809bcbceSSrinivas Kandagatla 	int ec_hq[WSA_MACRO_RX1 + 1];
338809bcbceSSrinivas Kandagatla 	u16 prim_int_users[WSA_MACRO_RX1 + 1];
339809bcbceSSrinivas Kandagatla 	u16 wsa_mclk_users;
340809bcbceSSrinivas Kandagatla 	bool reset_swr;
341809bcbceSSrinivas Kandagatla 	unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS];
342809bcbceSSrinivas Kandagatla 	unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS];
343809bcbceSSrinivas Kandagatla 	int rx_port_value[WSA_MACRO_RX_MAX];
344809bcbceSSrinivas Kandagatla 	int ear_spkr_gain;
345809bcbceSSrinivas Kandagatla 	int spkr_gain_offset;
346809bcbceSSrinivas Kandagatla 	int spkr_mode;
347809bcbceSSrinivas Kandagatla 	int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX];
348809bcbceSSrinivas Kandagatla 	int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX];
349809bcbceSSrinivas Kandagatla 	struct regmap *regmap;
350e252801dSSrinivas Kandagatla 	struct clk *mclk;
351e252801dSSrinivas Kandagatla 	struct clk *npl;
352e252801dSSrinivas Kandagatla 	struct clk *macro;
353e252801dSSrinivas Kandagatla 	struct clk *dcodec;
354e252801dSSrinivas Kandagatla 	struct clk *fsgen;
355809bcbceSSrinivas Kandagatla 	struct clk_hw hw;
356809bcbceSSrinivas Kandagatla };
357809bcbceSSrinivas Kandagatla #define to_wsa_macro(_hw) container_of(_hw, struct wsa_macro, hw)
358809bcbceSSrinivas Kandagatla 
359809bcbceSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
360809bcbceSSrinivas Kandagatla 
3612c4066e5SSrinivas Kandagatla static const char *const rx_text[] = {
3622c4066e5SSrinivas Kandagatla 	"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1"
3632c4066e5SSrinivas Kandagatla };
3642c4066e5SSrinivas Kandagatla 
3652c4066e5SSrinivas Kandagatla static const char *const rx_mix_text[] = {
3662c4066e5SSrinivas Kandagatla 	"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1"
3672c4066e5SSrinivas Kandagatla };
3682c4066e5SSrinivas Kandagatla 
3692c4066e5SSrinivas Kandagatla static const char *const rx_mix_ec_text[] = {
3702c4066e5SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX0", "RX_MIX_TX1"
3712c4066e5SSrinivas Kandagatla };
3722c4066e5SSrinivas Kandagatla 
3732c4066e5SSrinivas Kandagatla static const char *const rx_mux_text[] = {
3742c4066e5SSrinivas Kandagatla 	"ZERO", "AIF1_PB", "AIF_MIX1_PB"
3752c4066e5SSrinivas Kandagatla };
3762c4066e5SSrinivas Kandagatla 
3772c4066e5SSrinivas Kandagatla static const char *const rx_sidetone_mix_text[] = {
3782c4066e5SSrinivas Kandagatla 	"ZERO", "SRC0"
3792c4066e5SSrinivas Kandagatla };
3802c4066e5SSrinivas Kandagatla 
381809bcbceSSrinivas Kandagatla static const char * const wsa_macro_ear_spkr_pa_gain_text[] = {
382809bcbceSSrinivas Kandagatla 	"G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB",
383809bcbceSSrinivas Kandagatla 	"G_4_DB", "G_5_DB", "G_6_DB"
384809bcbceSSrinivas Kandagatla };
385809bcbceSSrinivas Kandagatla 
386809bcbceSSrinivas Kandagatla static SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum,
387809bcbceSSrinivas Kandagatla 				wsa_macro_ear_spkr_pa_gain_text);
388809bcbceSSrinivas Kandagatla 
3892c4066e5SSrinivas Kandagatla /* RX INT0 */
3902c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_prim_inp0_chain_enum =
3912c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
3922c4066e5SSrinivas Kandagatla 		0, 7, rx_text);
3932c4066e5SSrinivas Kandagatla 
3942c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_prim_inp1_chain_enum =
3952c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
3962c4066e5SSrinivas Kandagatla 		3, 7, rx_text);
3972c4066e5SSrinivas Kandagatla 
3982c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_prim_inp2_chain_enum =
3992c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
4002c4066e5SSrinivas Kandagatla 		3, 7, rx_text);
4012c4066e5SSrinivas Kandagatla 
4022c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_mix_chain_enum =
4032c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
4042c4066e5SSrinivas Kandagatla 		0, 5, rx_mix_text);
4052c4066e5SSrinivas Kandagatla 
4062c4066e5SSrinivas Kandagatla static const struct soc_enum rx0_sidetone_mix_enum =
4072c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text);
4082c4066e5SSrinivas Kandagatla 
4092c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_prim_inp0_mux =
4102c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum);
4112c4066e5SSrinivas Kandagatla 
4122c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_prim_inp1_mux =
4132c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum);
4142c4066e5SSrinivas Kandagatla 
4152c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_prim_inp2_mux =
4162c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum);
4172c4066e5SSrinivas Kandagatla 
4182c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_mix_mux =
4192c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum);
4202c4066e5SSrinivas Kandagatla 
4212c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx0_sidetone_mix_mux =
4222c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum);
4232c4066e5SSrinivas Kandagatla 
4242c4066e5SSrinivas Kandagatla /* RX INT1 */
4252c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_prim_inp0_chain_enum =
4262c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
4272c4066e5SSrinivas Kandagatla 		0, 7, rx_text);
4282c4066e5SSrinivas Kandagatla 
4292c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_prim_inp1_chain_enum =
4302c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
4312c4066e5SSrinivas Kandagatla 		3, 7, rx_text);
4322c4066e5SSrinivas Kandagatla 
4332c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_prim_inp2_chain_enum =
4342c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
4352c4066e5SSrinivas Kandagatla 		3, 7, rx_text);
4362c4066e5SSrinivas Kandagatla 
4372c4066e5SSrinivas Kandagatla static const struct soc_enum rx1_mix_chain_enum =
4382c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
4392c4066e5SSrinivas Kandagatla 		0, 5, rx_mix_text);
4402c4066e5SSrinivas Kandagatla 
4412c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_prim_inp0_mux =
4422c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum);
4432c4066e5SSrinivas Kandagatla 
4442c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_prim_inp1_mux =
4452c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum);
4462c4066e5SSrinivas Kandagatla 
4472c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_prim_inp2_mux =
4482c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum);
4492c4066e5SSrinivas Kandagatla 
4502c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx1_mix_mux =
4512c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum);
4522c4066e5SSrinivas Kandagatla 
4532c4066e5SSrinivas Kandagatla static const struct soc_enum rx_mix_ec0_enum =
4542c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0,
4552c4066e5SSrinivas Kandagatla 		0, 3, rx_mix_ec_text);
4562c4066e5SSrinivas Kandagatla 
4572c4066e5SSrinivas Kandagatla static const struct soc_enum rx_mix_ec1_enum =
4582c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0,
4592c4066e5SSrinivas Kandagatla 		3, 3, rx_mix_ec_text);
4602c4066e5SSrinivas Kandagatla 
4612c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx_mix_ec0_mux =
4622c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA RX_MIX EC0_Mux", rx_mix_ec0_enum);
4632c4066e5SSrinivas Kandagatla 
4642c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx_mix_ec1_mux =
4652c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM("WSA RX_MIX EC1_Mux", rx_mix_ec1_enum);
4662c4066e5SSrinivas Kandagatla 
467809bcbceSSrinivas Kandagatla static const struct reg_default wsa_defaults[] = {
468809bcbceSSrinivas Kandagatla 	/* WSA Macro */
469809bcbceSSrinivas Kandagatla 	{ CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00},
470809bcbceSSrinivas Kandagatla 	{ CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00},
471809bcbceSSrinivas Kandagatla 	{ CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00},
472809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_TOP_CFG0, 0x00},
473809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_TOP_CFG1, 0x00},
474809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_FREQ_MCLK, 0x00},
475809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00},
476809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_DEBUG_EN0, 0x00},
477809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_DEBUG_EN1, 0x00},
478809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_DEBUG_DSM_LB, 0x88},
479809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_RX_I2S_CTL, 0x0C},
480809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_TX_I2S_CTL, 0x0C},
481809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_I2S_CLK, 0x02},
482809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TOP_I2S_RESET, 0x00},
483809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00},
484809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00},
485809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00},
486809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00},
487809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00},
488809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00},
489809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00},
490809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02},
491809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00},
492809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02},
493809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00},
494809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02},
495809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00},
496809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02},
497809bcbceSSrinivas Kandagatla 	{ CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00},
498809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_CFG, 0x00},
499809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00},
500809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF},
501809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00},
502809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00},
503809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF},
504809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00},
505809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00},
506809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_LEVEL0, 0x00},
507809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_BYPASS0, 0x00},
508809bcbceSSrinivas Kandagatla 	{ CDC_WSA_INTR_CTRL_SET0, 0x00},
509809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_CTL, 0x04},
510809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_CFG0, 0x00},
511809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_CFG1, 0x64},
512809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_CFG2, 0x8F},
513809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_CFG3, 0x00},
514809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_VOL_CTL, 0x00},
515809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04},
516809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E},
517809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00},
518809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC0, 0x04},
519809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC1, 0x08},
520809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC2, 0x00},
521809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC3, 0x00},
522809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC5, 0x00},
523809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC6, 0x00},
524809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_SEC7, 0x00},
525809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08},
526809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00},
527809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00},
528809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_CFG0, 0x00},
529809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_CFG1, 0x64},
530809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_CFG2, 0x8F},
531809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_CFG3, 0x00},
532809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_VOL_CTL, 0x00},
533809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04},
534809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E},
535809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00},
536809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC0, 0x04},
537809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC1, 0x08},
538809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC2, 0x00},
539809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC3, 0x00},
540809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC5, 0x00},
541809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC6, 0x00},
542809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_SEC7, 0x00},
543809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08},
544809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00},
545809bcbceSSrinivas Kandagatla 	{ CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00},
546809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00},
547809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST0_BOOST_CTL, 0xD0},
548809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST0_BOOST_CFG1, 0x89},
549809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST0_BOOST_CFG2, 0x04},
550809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00},
551809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST1_BOOST_CTL, 0xD0},
552809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST1_BOOST_CFG1, 0x89},
553809bcbceSSrinivas Kandagatla 	{ CDC_WSA_BOOST1_BOOST_CFG2, 0x04},
554809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL0, 0x60},
555809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL1, 0xDB},
556809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL2, 0xFF},
557809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL3, 0x35},
558809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL4, 0xFF},
559809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL5, 0x00},
560809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL6, 0x01},
561809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER0_CTL7, 0x28},
562809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL0, 0x60},
563809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL1, 0xDB},
564809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL2, 0xFF},
565809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL3, 0x35},
566809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL4, 0xFF},
567809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL5, 0x00},
568809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL6, 0x01},
569809bcbceSSrinivas Kandagatla 	{ CDC_WSA_COMPANDER1_CTL7, 0x28},
570809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SOFTCLIP0_CRC, 0x00},
571809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38},
572809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SOFTCLIP1_CRC, 0x00},
573809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38},
574809bcbceSSrinivas Kandagatla 	{ CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00},
575809bcbceSSrinivas Kandagatla 	{ CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01},
576809bcbceSSrinivas Kandagatla 	{ CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00},
577809bcbceSSrinivas Kandagatla 	{ CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01},
578809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00},
579809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_CTL0, 0x00},
580809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_CTL1, 0x00},
581809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8},
582809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00},
583809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00},
584809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00},
585809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00},
586809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00},
587809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00},
588809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_CTL0, 0x00},
589809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_CTL1, 0x00},
590809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8},
591809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00},
592809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00},
593809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00},
594809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00},
595809bcbceSSrinivas Kandagatla 	{ CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00},
596809bcbceSSrinivas Kandagatla };
597809bcbceSSrinivas Kandagatla 
598809bcbceSSrinivas Kandagatla static bool wsa_is_wronly_register(struct device *dev,
599809bcbceSSrinivas Kandagatla 					unsigned int reg)
600809bcbceSSrinivas Kandagatla {
601809bcbceSSrinivas Kandagatla 	switch (reg) {
602809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_CLR_COMMIT:
603809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN1_CLEAR0:
604809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN2_CLEAR0:
605809bcbceSSrinivas Kandagatla 		return true;
606809bcbceSSrinivas Kandagatla 	}
607809bcbceSSrinivas Kandagatla 
608809bcbceSSrinivas Kandagatla 	return false;
609809bcbceSSrinivas Kandagatla }
610809bcbceSSrinivas Kandagatla 
611809bcbceSSrinivas Kandagatla static bool wsa_is_rw_register(struct device *dev, unsigned int reg)
612809bcbceSSrinivas Kandagatla {
613809bcbceSSrinivas Kandagatla 	switch (reg) {
614809bcbceSSrinivas Kandagatla 	case CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL:
615809bcbceSSrinivas Kandagatla 	case CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL:
616809bcbceSSrinivas Kandagatla 	case CDC_WSA_CLK_RST_CTRL_SWR_CONTROL:
617809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_TOP_CFG0:
618809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_TOP_CFG1:
619809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_FREQ_MCLK:
620809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_DEBUG_BUS_SEL:
621809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_DEBUG_EN0:
622809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_DEBUG_EN1:
623809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_DEBUG_DSM_LB:
624809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_RX_I2S_CTL:
625809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_TX_I2S_CTL:
626809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_I2S_CLK:
627809bcbceSSrinivas Kandagatla 	case CDC_WSA_TOP_I2S_RESET:
628809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_RX_INT0_CFG0:
629809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_RX_INT0_CFG1:
630809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_RX_INT1_CFG0:
631809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_RX_INT1_CFG1:
632809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_RX_MIX_CFG0:
633809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_RX_EC_CFG0:
634809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0:
635809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX0_SPKR_PROT_PATH_CTL:
636809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX0_SPKR_PROT_PATH_CFG0:
637809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX1_SPKR_PROT_PATH_CTL:
638809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX1_SPKR_PROT_PATH_CFG0:
639809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX2_SPKR_PROT_PATH_CTL:
640809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX2_SPKR_PROT_PATH_CFG0:
641809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX3_SPKR_PROT_PATH_CTL:
642809bcbceSSrinivas Kandagatla 	case CDC_WSA_TX3_SPKR_PROT_PATH_CFG0:
643809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_CFG:
644809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN1_MASK0:
645809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN2_MASK0:
646809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_LEVEL0:
647809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_BYPASS0:
648809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_SET0:
649809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_CTL:
650809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_CFG0:
651809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_CFG1:
652809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_CFG2:
653809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_CFG3:
654809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_VOL_CTL:
655809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_MIX_CTL:
656809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_MIX_CFG:
657809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_VOL_MIX_CTL:
658809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC0:
659809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC1:
660809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC2:
661809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC3:
662809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC5:
663809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC6:
664809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_SEC7:
665809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_MIX_SEC0:
666809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_MIX_SEC1:
667809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_DSMDEM_CTL:
668809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_CTL:
669809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_CFG0:
670809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_CFG1:
671809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_CFG2:
672809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_CFG3:
673809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_VOL_CTL:
674809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_MIX_CTL:
675809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_MIX_CFG:
676809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_VOL_MIX_CTL:
677809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC0:
678809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC1:
679809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC2:
680809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC3:
681809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC5:
682809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC6:
683809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_SEC7:
684809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_MIX_SEC0:
685809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_MIX_SEC1:
686809bcbceSSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_DSMDEM_CTL:
687809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST0_BOOST_PATH_CTL:
688809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST0_BOOST_CTL:
689809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST0_BOOST_CFG1:
690809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST0_BOOST_CFG2:
691809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST1_BOOST_PATH_CTL:
692809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST1_BOOST_CTL:
693809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST1_BOOST_CFG1:
694809bcbceSSrinivas Kandagatla 	case CDC_WSA_BOOST1_BOOST_CFG2:
695809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL0:
696809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL1:
697809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL2:
698809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL3:
699809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL4:
700809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL5:
701809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL7:
702809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL0:
703809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL1:
704809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL2:
705809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL3:
706809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL4:
707809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL5:
708809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL7:
709809bcbceSSrinivas Kandagatla 	case CDC_WSA_SOFTCLIP0_CRC:
710809bcbceSSrinivas Kandagatla 	case CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL:
711809bcbceSSrinivas Kandagatla 	case CDC_WSA_SOFTCLIP1_CRC:
712809bcbceSSrinivas Kandagatla 	case CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL:
713809bcbceSSrinivas Kandagatla 	case CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL:
714809bcbceSSrinivas Kandagatla 	case CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0:
715809bcbceSSrinivas Kandagatla 	case CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL:
716809bcbceSSrinivas Kandagatla 	case CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0:
717809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL:
718809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_CTL0:
719809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_CTL1:
720809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_FIFO_CTL:
721809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL:
722809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_CTL0:
723809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_CTL1:
724809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_FIFO_CTL:
725809bcbceSSrinivas Kandagatla 		return true;
726809bcbceSSrinivas Kandagatla 	}
727809bcbceSSrinivas Kandagatla 
728809bcbceSSrinivas Kandagatla 	return false;
729809bcbceSSrinivas Kandagatla }
730809bcbceSSrinivas Kandagatla 
731809bcbceSSrinivas Kandagatla static bool wsa_is_writeable_register(struct device *dev, unsigned int reg)
732809bcbceSSrinivas Kandagatla {
733809bcbceSSrinivas Kandagatla 	bool ret;
734809bcbceSSrinivas Kandagatla 
735809bcbceSSrinivas Kandagatla 	ret = wsa_is_rw_register(dev, reg);
736809bcbceSSrinivas Kandagatla 	if (!ret)
737809bcbceSSrinivas Kandagatla 		return wsa_is_wronly_register(dev, reg);
738809bcbceSSrinivas Kandagatla 
739809bcbceSSrinivas Kandagatla 	return ret;
740809bcbceSSrinivas Kandagatla }
741809bcbceSSrinivas Kandagatla 
742809bcbceSSrinivas Kandagatla static bool wsa_is_readable_register(struct device *dev, unsigned int reg)
743809bcbceSSrinivas Kandagatla {
744809bcbceSSrinivas Kandagatla 	switch (reg) {
745809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_CLR_COMMIT:
746809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN1_CLEAR0:
747809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN2_CLEAR0:
748809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN1_STATUS0:
749809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN2_STATUS0:
750809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL6:
751809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL6:
752809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB:
753809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB:
754809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB:
755809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB:
756809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO:
757809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB:
758809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB:
759809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB:
760809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB:
761809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO:
762809bcbceSSrinivas Kandagatla 		return true;
763809bcbceSSrinivas Kandagatla 	}
764809bcbceSSrinivas Kandagatla 
765809bcbceSSrinivas Kandagatla 	return wsa_is_rw_register(dev, reg);
766809bcbceSSrinivas Kandagatla }
767809bcbceSSrinivas Kandagatla 
768809bcbceSSrinivas Kandagatla static bool wsa_is_volatile_register(struct device *dev, unsigned int reg)
769809bcbceSSrinivas Kandagatla {
770809bcbceSSrinivas Kandagatla 	/* Update volatile list for rx/tx macros */
771809bcbceSSrinivas Kandagatla 	switch (reg) {
772809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN1_STATUS0:
773809bcbceSSrinivas Kandagatla 	case CDC_WSA_INTR_CTRL_PIN2_STATUS0:
774809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER0_CTL6:
775809bcbceSSrinivas Kandagatla 	case CDC_WSA_COMPANDER1_CTL6:
776809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB:
777809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB:
778809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB:
779809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB:
780809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO:
781809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB:
782809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB:
783809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB:
784809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB:
785809bcbceSSrinivas Kandagatla 	case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO:
786809bcbceSSrinivas Kandagatla 		return true;
787809bcbceSSrinivas Kandagatla 	}
788809bcbceSSrinivas Kandagatla 	return false;
789809bcbceSSrinivas Kandagatla }
790809bcbceSSrinivas Kandagatla 
791809bcbceSSrinivas Kandagatla static const struct regmap_config wsa_regmap_config = {
792809bcbceSSrinivas Kandagatla 	.name = "wsa_macro",
793809bcbceSSrinivas Kandagatla 	.reg_bits = 16,
794809bcbceSSrinivas Kandagatla 	.val_bits = 32, /* 8 but with 32 bit read/write */
795809bcbceSSrinivas Kandagatla 	.reg_stride = 4,
796809bcbceSSrinivas Kandagatla 	.cache_type = REGCACHE_FLAT,
797809bcbceSSrinivas Kandagatla 	.reg_defaults = wsa_defaults,
798809bcbceSSrinivas Kandagatla 	.num_reg_defaults = ARRAY_SIZE(wsa_defaults),
799809bcbceSSrinivas Kandagatla 	.max_register = WSA_MAX_OFFSET,
800809bcbceSSrinivas Kandagatla 	.writeable_reg = wsa_is_writeable_register,
801809bcbceSSrinivas Kandagatla 	.volatile_reg = wsa_is_volatile_register,
802809bcbceSSrinivas Kandagatla 	.readable_reg = wsa_is_readable_register,
803809bcbceSSrinivas Kandagatla };
804809bcbceSSrinivas Kandagatla 
805809bcbceSSrinivas Kandagatla /**
806809bcbceSSrinivas Kandagatla  * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost
807809bcbceSSrinivas Kandagatla  * settings based on speaker mode.
808809bcbceSSrinivas Kandagatla  *
809809bcbceSSrinivas Kandagatla  * @component: codec instance
810809bcbceSSrinivas Kandagatla  * @mode: Indicates speaker configuration mode.
811809bcbceSSrinivas Kandagatla  *
812809bcbceSSrinivas Kandagatla  * Returns 0 on success or -EINVAL on error.
813809bcbceSSrinivas Kandagatla  */
814809bcbceSSrinivas Kandagatla int wsa_macro_set_spkr_mode(struct snd_soc_component *component, int mode)
815809bcbceSSrinivas Kandagatla {
816809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
817809bcbceSSrinivas Kandagatla 
818809bcbceSSrinivas Kandagatla 	wsa->spkr_mode = mode;
819809bcbceSSrinivas Kandagatla 
820809bcbceSSrinivas Kandagatla 	switch (mode) {
821809bcbceSSrinivas Kandagatla 	case WSA_MACRO_SPKR_MODE_1:
822809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00);
823809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00);
824809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00);
825809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00);
826809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44);
827809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44);
828809bcbceSSrinivas Kandagatla 		break;
829809bcbceSSrinivas Kandagatla 	default:
830809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80);
831809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80);
832809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01);
833809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01);
834809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58);
835809bcbceSSrinivas Kandagatla 		snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58);
836809bcbceSSrinivas Kandagatla 		break;
837809bcbceSSrinivas Kandagatla 	}
838809bcbceSSrinivas Kandagatla 	return 0;
839809bcbceSSrinivas Kandagatla }
840809bcbceSSrinivas Kandagatla EXPORT_SYMBOL(wsa_macro_set_spkr_mode);
841809bcbceSSrinivas Kandagatla 
842809bcbceSSrinivas Kandagatla static int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai,
843809bcbceSSrinivas Kandagatla 						u8 int_prim_fs_rate_reg_val,
844809bcbceSSrinivas Kandagatla 						u32 sample_rate)
845809bcbceSSrinivas Kandagatla {
846809bcbceSSrinivas Kandagatla 	u8 int_1_mix1_inp;
847809bcbceSSrinivas Kandagatla 	u32 j, port;
848809bcbceSSrinivas Kandagatla 	u16 int_mux_cfg0, int_mux_cfg1;
849809bcbceSSrinivas Kandagatla 	u16 int_fs_reg;
850809bcbceSSrinivas Kandagatla 	u8 inp0_sel, inp1_sel, inp2_sel;
851809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
852809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
853809bcbceSSrinivas Kandagatla 
854809bcbceSSrinivas Kandagatla 	for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) {
855809bcbceSSrinivas Kandagatla 		int_1_mix1_inp = port;
856809bcbceSSrinivas Kandagatla 		if ((int_1_mix1_inp < WSA_MACRO_RX0) || (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) {
857809bcbceSSrinivas Kandagatla 			dev_err(component->dev,	"%s: Invalid RX port, Dai ID is %d\n",
858809bcbceSSrinivas Kandagatla 				__func__, dai->id);
859809bcbceSSrinivas Kandagatla 			return -EINVAL;
860809bcbceSSrinivas Kandagatla 		}
861809bcbceSSrinivas Kandagatla 
862809bcbceSSrinivas Kandagatla 		int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0;
863809bcbceSSrinivas Kandagatla 
864809bcbceSSrinivas Kandagatla 		/*
865809bcbceSSrinivas Kandagatla 		 * Loop through all interpolator MUX inputs and find out
866809bcbceSSrinivas Kandagatla 		 * to which interpolator input, the cdc_dma rx port
867809bcbceSSrinivas Kandagatla 		 * is connected
868809bcbceSSrinivas Kandagatla 		 */
869809bcbceSSrinivas Kandagatla 		for (j = 0; j < NUM_INTERPOLATORS; j++) {
870809bcbceSSrinivas Kandagatla 			int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET;
8717db4c4cdSSrinivas Kandagatla 			inp0_sel = snd_soc_component_read_field(component, int_mux_cfg0,
8727db4c4cdSSrinivas Kandagatla 								CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK);
8737db4c4cdSSrinivas Kandagatla 			inp1_sel = snd_soc_component_read_field(component, int_mux_cfg0,
8747db4c4cdSSrinivas Kandagatla 								CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK);
8757db4c4cdSSrinivas Kandagatla 			inp2_sel = snd_soc_component_read_field(component, int_mux_cfg1,
8767db4c4cdSSrinivas Kandagatla 								CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK);
8777db4c4cdSSrinivas Kandagatla 
878809bcbceSSrinivas Kandagatla 			if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||
879809bcbceSSrinivas Kandagatla 			    (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||
880809bcbceSSrinivas Kandagatla 			    (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) {
881809bcbceSSrinivas Kandagatla 				int_fs_reg = CDC_WSA_RX0_RX_PATH_CTL +
882809bcbceSSrinivas Kandagatla 					     WSA_MACRO_RX_PATH_OFFSET * j;
883809bcbceSSrinivas Kandagatla 				/* sample_rate is in Hz */
884809bcbceSSrinivas Kandagatla 				snd_soc_component_update_bits(component, int_fs_reg,
885809bcbceSSrinivas Kandagatla 							      WSA_MACRO_FS_RATE_MASK,
886809bcbceSSrinivas Kandagatla 							      int_prim_fs_rate_reg_val);
887809bcbceSSrinivas Kandagatla 			}
888809bcbceSSrinivas Kandagatla 			int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET;
889809bcbceSSrinivas Kandagatla 		}
890809bcbceSSrinivas Kandagatla 	}
891809bcbceSSrinivas Kandagatla 
892809bcbceSSrinivas Kandagatla 	return 0;
893809bcbceSSrinivas Kandagatla }
894809bcbceSSrinivas Kandagatla 
895809bcbceSSrinivas Kandagatla static int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai,
896809bcbceSSrinivas Kandagatla 					       u8 int_mix_fs_rate_reg_val,
897809bcbceSSrinivas Kandagatla 					       u32 sample_rate)
898809bcbceSSrinivas Kandagatla {
899809bcbceSSrinivas Kandagatla 	u8 int_2_inp;
900809bcbceSSrinivas Kandagatla 	u32 j, port;
901809bcbceSSrinivas Kandagatla 	u16 int_mux_cfg1, int_fs_reg;
902809bcbceSSrinivas Kandagatla 	u8 int_mux_cfg1_val;
903809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
904809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
905809bcbceSSrinivas Kandagatla 
906809bcbceSSrinivas Kandagatla 	for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) {
907809bcbceSSrinivas Kandagatla 		int_2_inp = port;
908809bcbceSSrinivas Kandagatla 		if ((int_2_inp < WSA_MACRO_RX0) || (int_2_inp > WSA_MACRO_RX_MIX1)) {
909809bcbceSSrinivas Kandagatla 			dev_err(component->dev,	"%s: Invalid RX port, Dai ID is %d\n",
910809bcbceSSrinivas Kandagatla 				__func__, dai->id);
911809bcbceSSrinivas Kandagatla 			return -EINVAL;
912809bcbceSSrinivas Kandagatla 		}
913809bcbceSSrinivas Kandagatla 
914809bcbceSSrinivas Kandagatla 		int_mux_cfg1 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG1;
915809bcbceSSrinivas Kandagatla 		for (j = 0; j < NUM_INTERPOLATORS; j++) {
9167db4c4cdSSrinivas Kandagatla 			int_mux_cfg1_val = snd_soc_component_read_field(component, int_mux_cfg1,
9177db4c4cdSSrinivas Kandagatla 									CDC_WSA_RX_INTX_2_SEL_MASK);
9187db4c4cdSSrinivas Kandagatla 
919809bcbceSSrinivas Kandagatla 			if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) {
920809bcbceSSrinivas Kandagatla 				int_fs_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL +
921809bcbceSSrinivas Kandagatla 					WSA_MACRO_RX_PATH_OFFSET * j;
922809bcbceSSrinivas Kandagatla 
923809bcbceSSrinivas Kandagatla 				snd_soc_component_update_bits(component,
924809bcbceSSrinivas Kandagatla 						      int_fs_reg,
925809bcbceSSrinivas Kandagatla 						      WSA_MACRO_FS_RATE_MASK,
926809bcbceSSrinivas Kandagatla 						      int_mix_fs_rate_reg_val);
927809bcbceSSrinivas Kandagatla 			}
928809bcbceSSrinivas Kandagatla 			int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET;
929809bcbceSSrinivas Kandagatla 		}
930809bcbceSSrinivas Kandagatla 	}
931809bcbceSSrinivas Kandagatla 	return 0;
932809bcbceSSrinivas Kandagatla }
933809bcbceSSrinivas Kandagatla 
934809bcbceSSrinivas Kandagatla static int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai,
935809bcbceSSrinivas Kandagatla 					   u32 sample_rate)
936809bcbceSSrinivas Kandagatla {
937809bcbceSSrinivas Kandagatla 	int rate_val = 0;
938809bcbceSSrinivas Kandagatla 	int i, ret;
939809bcbceSSrinivas Kandagatla 
940809bcbceSSrinivas Kandagatla 	/* set mixing path rate */
941809bcbceSSrinivas Kandagatla 	for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) {
942809bcbceSSrinivas Kandagatla 		if (sample_rate == int_mix_sample_rate_val[i].sample_rate) {
943809bcbceSSrinivas Kandagatla 			rate_val = int_mix_sample_rate_val[i].rate_val;
944809bcbceSSrinivas Kandagatla 			break;
945809bcbceSSrinivas Kandagatla 		}
946809bcbceSSrinivas Kandagatla 	}
947809bcbceSSrinivas Kandagatla 	if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || (rate_val < 0))
948809bcbceSSrinivas Kandagatla 		goto prim_rate;
949809bcbceSSrinivas Kandagatla 
950809bcbceSSrinivas Kandagatla 	ret = wsa_macro_set_mix_interpolator_rate(dai, (u8) rate_val, sample_rate);
9514b4f2119SPierre-Louis Bossart 	if (ret < 0)
9524b4f2119SPierre-Louis Bossart 		return ret;
953809bcbceSSrinivas Kandagatla prim_rate:
954809bcbceSSrinivas Kandagatla 	/* set primary path sample rate */
955809bcbceSSrinivas Kandagatla 	for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) {
956809bcbceSSrinivas Kandagatla 		if (sample_rate == int_prim_sample_rate_val[i].sample_rate) {
957809bcbceSSrinivas Kandagatla 			rate_val = int_prim_sample_rate_val[i].rate_val;
958809bcbceSSrinivas Kandagatla 			break;
959809bcbceSSrinivas Kandagatla 		}
960809bcbceSSrinivas Kandagatla 	}
961809bcbceSSrinivas Kandagatla 	if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || (rate_val < 0))
962809bcbceSSrinivas Kandagatla 		return -EINVAL;
963809bcbceSSrinivas Kandagatla 
964809bcbceSSrinivas Kandagatla 	ret = wsa_macro_set_prim_interpolator_rate(dai, (u8) rate_val, sample_rate);
965809bcbceSSrinivas Kandagatla 
966809bcbceSSrinivas Kandagatla 	return ret;
967809bcbceSSrinivas Kandagatla }
968809bcbceSSrinivas Kandagatla 
969809bcbceSSrinivas Kandagatla static int wsa_macro_hw_params(struct snd_pcm_substream *substream,
970809bcbceSSrinivas Kandagatla 			       struct snd_pcm_hw_params *params,
971809bcbceSSrinivas Kandagatla 			       struct snd_soc_dai *dai)
972809bcbceSSrinivas Kandagatla {
973809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
974809bcbceSSrinivas Kandagatla 	int ret;
975809bcbceSSrinivas Kandagatla 
976809bcbceSSrinivas Kandagatla 	switch (substream->stream) {
977809bcbceSSrinivas Kandagatla 	case SNDRV_PCM_STREAM_PLAYBACK:
978809bcbceSSrinivas Kandagatla 		ret = wsa_macro_set_interpolator_rate(dai, params_rate(params));
979809bcbceSSrinivas Kandagatla 		if (ret) {
980809bcbceSSrinivas Kandagatla 			dev_err(component->dev,
981809bcbceSSrinivas Kandagatla 				"%s: cannot set sample rate: %u\n",
982809bcbceSSrinivas Kandagatla 				__func__, params_rate(params));
983809bcbceSSrinivas Kandagatla 			return ret;
984809bcbceSSrinivas Kandagatla 		}
985809bcbceSSrinivas Kandagatla 		break;
986809bcbceSSrinivas Kandagatla 	default:
987809bcbceSSrinivas Kandagatla 		break;
988809bcbceSSrinivas Kandagatla 	}
989809bcbceSSrinivas Kandagatla 	return 0;
990809bcbceSSrinivas Kandagatla }
991809bcbceSSrinivas Kandagatla 
992809bcbceSSrinivas Kandagatla static int wsa_macro_get_channel_map(struct snd_soc_dai *dai,
993809bcbceSSrinivas Kandagatla 				     unsigned int *tx_num, unsigned int *tx_slot,
994809bcbceSSrinivas Kandagatla 				     unsigned int *rx_num, unsigned int *rx_slot)
995809bcbceSSrinivas Kandagatla {
996809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
997809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
998809bcbceSSrinivas Kandagatla 	u16 val, mask = 0, cnt = 0, temp;
999809bcbceSSrinivas Kandagatla 
1000809bcbceSSrinivas Kandagatla 	switch (dai->id) {
1001809bcbceSSrinivas Kandagatla 	case WSA_MACRO_AIF_VI:
1002809bcbceSSrinivas Kandagatla 		*tx_slot = wsa->active_ch_mask[dai->id];
1003809bcbceSSrinivas Kandagatla 		*tx_num = wsa->active_ch_cnt[dai->id];
1004809bcbceSSrinivas Kandagatla 		break;
1005809bcbceSSrinivas Kandagatla 	case WSA_MACRO_AIF1_PB:
1006809bcbceSSrinivas Kandagatla 	case WSA_MACRO_AIF_MIX1_PB:
1007809bcbceSSrinivas Kandagatla 		for_each_set_bit(temp, &wsa->active_ch_mask[dai->id],
1008809bcbceSSrinivas Kandagatla 					WSA_MACRO_RX_MAX) {
1009809bcbceSSrinivas Kandagatla 			mask |= (1 << temp);
1010809bcbceSSrinivas Kandagatla 			if (++cnt == WSA_MACRO_MAX_DMA_CH_PER_PORT)
1011809bcbceSSrinivas Kandagatla 				break;
1012809bcbceSSrinivas Kandagatla 		}
1013809bcbceSSrinivas Kandagatla 		if (mask & 0x0C)
1014809bcbceSSrinivas Kandagatla 			mask = mask >> 0x2;
1015809bcbceSSrinivas Kandagatla 		*rx_slot = mask;
1016809bcbceSSrinivas Kandagatla 		*rx_num = cnt;
1017809bcbceSSrinivas Kandagatla 		break;
1018809bcbceSSrinivas Kandagatla 	case WSA_MACRO_AIF_ECHO:
1019809bcbceSSrinivas Kandagatla 		val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0);
1020809bcbceSSrinivas Kandagatla 		if (val & WSA_MACRO_EC_MIX_TX1_MASK) {
1021809bcbceSSrinivas Kandagatla 			mask |= 0x2;
1022809bcbceSSrinivas Kandagatla 			cnt++;
1023809bcbceSSrinivas Kandagatla 		}
1024809bcbceSSrinivas Kandagatla 		if (val & WSA_MACRO_EC_MIX_TX0_MASK) {
1025809bcbceSSrinivas Kandagatla 			mask |= 0x1;
1026809bcbceSSrinivas Kandagatla 			cnt++;
1027809bcbceSSrinivas Kandagatla 		}
1028809bcbceSSrinivas Kandagatla 		*tx_slot = mask;
1029809bcbceSSrinivas Kandagatla 		*tx_num = cnt;
1030809bcbceSSrinivas Kandagatla 		break;
1031809bcbceSSrinivas Kandagatla 	default:
1032809bcbceSSrinivas Kandagatla 		dev_err(component->dev, "%s: Invalid AIF\n", __func__);
1033809bcbceSSrinivas Kandagatla 		break;
1034809bcbceSSrinivas Kandagatla 	}
1035809bcbceSSrinivas Kandagatla 	return 0;
1036809bcbceSSrinivas Kandagatla }
1037809bcbceSSrinivas Kandagatla 
1038a893a666SYe Bin static const struct snd_soc_dai_ops wsa_macro_dai_ops = {
1039809bcbceSSrinivas Kandagatla 	.hw_params = wsa_macro_hw_params,
1040809bcbceSSrinivas Kandagatla 	.get_channel_map = wsa_macro_get_channel_map,
1041809bcbceSSrinivas Kandagatla };
1042809bcbceSSrinivas Kandagatla 
1043809bcbceSSrinivas Kandagatla static struct snd_soc_dai_driver wsa_macro_dai[] = {
1044809bcbceSSrinivas Kandagatla 	{
1045809bcbceSSrinivas Kandagatla 		.name = "wsa_macro_rx1",
1046809bcbceSSrinivas Kandagatla 		.id = WSA_MACRO_AIF1_PB,
1047809bcbceSSrinivas Kandagatla 		.playback = {
1048809bcbceSSrinivas Kandagatla 			.stream_name = "WSA_AIF1 Playback",
1049809bcbceSSrinivas Kandagatla 			.rates = WSA_MACRO_RX_RATES,
1050809bcbceSSrinivas Kandagatla 			.formats = WSA_MACRO_RX_FORMATS,
1051809bcbceSSrinivas Kandagatla 			.rate_max = 384000,
1052809bcbceSSrinivas Kandagatla 			.rate_min = 8000,
1053809bcbceSSrinivas Kandagatla 			.channels_min = 1,
1054809bcbceSSrinivas Kandagatla 			.channels_max = 2,
1055809bcbceSSrinivas Kandagatla 		},
1056809bcbceSSrinivas Kandagatla 		.ops = &wsa_macro_dai_ops,
1057809bcbceSSrinivas Kandagatla 	},
1058809bcbceSSrinivas Kandagatla 	{
1059809bcbceSSrinivas Kandagatla 		.name = "wsa_macro_rx_mix",
1060809bcbceSSrinivas Kandagatla 		.id = WSA_MACRO_AIF_MIX1_PB,
1061809bcbceSSrinivas Kandagatla 		.playback = {
1062809bcbceSSrinivas Kandagatla 			.stream_name = "WSA_AIF_MIX1 Playback",
1063809bcbceSSrinivas Kandagatla 			.rates = WSA_MACRO_RX_MIX_RATES,
1064809bcbceSSrinivas Kandagatla 			.formats = WSA_MACRO_RX_FORMATS,
1065809bcbceSSrinivas Kandagatla 			.rate_max = 192000,
1066809bcbceSSrinivas Kandagatla 			.rate_min = 48000,
1067809bcbceSSrinivas Kandagatla 			.channels_min = 1,
1068809bcbceSSrinivas Kandagatla 			.channels_max = 2,
1069809bcbceSSrinivas Kandagatla 		},
1070809bcbceSSrinivas Kandagatla 		.ops = &wsa_macro_dai_ops,
1071809bcbceSSrinivas Kandagatla 	},
1072809bcbceSSrinivas Kandagatla 	{
1073809bcbceSSrinivas Kandagatla 		.name = "wsa_macro_vifeedback",
1074809bcbceSSrinivas Kandagatla 		.id = WSA_MACRO_AIF_VI,
1075809bcbceSSrinivas Kandagatla 		.capture = {
1076809bcbceSSrinivas Kandagatla 			.stream_name = "WSA_AIF_VI Capture",
1077809bcbceSSrinivas Kandagatla 			.rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
1078809bcbceSSrinivas Kandagatla 			.formats = WSA_MACRO_RX_FORMATS,
1079809bcbceSSrinivas Kandagatla 			.rate_max = 48000,
1080809bcbceSSrinivas Kandagatla 			.rate_min = 8000,
1081809bcbceSSrinivas Kandagatla 			.channels_min = 1,
1082809bcbceSSrinivas Kandagatla 			.channels_max = 4,
1083809bcbceSSrinivas Kandagatla 		},
1084809bcbceSSrinivas Kandagatla 		.ops = &wsa_macro_dai_ops,
1085809bcbceSSrinivas Kandagatla 	},
1086809bcbceSSrinivas Kandagatla 	{
1087809bcbceSSrinivas Kandagatla 		.name = "wsa_macro_echo",
1088809bcbceSSrinivas Kandagatla 		.id = WSA_MACRO_AIF_ECHO,
1089809bcbceSSrinivas Kandagatla 		.capture = {
1090809bcbceSSrinivas Kandagatla 			.stream_name = "WSA_AIF_ECHO Capture",
1091809bcbceSSrinivas Kandagatla 			.rates = WSA_MACRO_ECHO_RATES,
1092809bcbceSSrinivas Kandagatla 			.formats = WSA_MACRO_ECHO_FORMATS,
1093809bcbceSSrinivas Kandagatla 			.rate_max = 48000,
1094809bcbceSSrinivas Kandagatla 			.rate_min = 8000,
1095809bcbceSSrinivas Kandagatla 			.channels_min = 1,
1096809bcbceSSrinivas Kandagatla 			.channels_max = 2,
1097809bcbceSSrinivas Kandagatla 		},
1098809bcbceSSrinivas Kandagatla 		.ops = &wsa_macro_dai_ops,
1099809bcbceSSrinivas Kandagatla 	},
1100809bcbceSSrinivas Kandagatla };
1101809bcbceSSrinivas Kandagatla 
1102809bcbceSSrinivas Kandagatla static void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable)
1103809bcbceSSrinivas Kandagatla {
1104809bcbceSSrinivas Kandagatla 	struct regmap *regmap = wsa->regmap;
1105809bcbceSSrinivas Kandagatla 
1106809bcbceSSrinivas Kandagatla 	if (mclk_enable) {
1107809bcbceSSrinivas Kandagatla 		if (wsa->wsa_mclk_users == 0) {
1108809bcbceSSrinivas Kandagatla 			regcache_mark_dirty(regmap);
1109809bcbceSSrinivas Kandagatla 			regcache_sync(regmap);
1110809bcbceSSrinivas Kandagatla 			/* 9.6MHz MCLK, set value 0x00 if other frequency */
1111809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap, CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01);
1112809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap,
1113809bcbceSSrinivas Kandagatla 					   CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL,
1114809bcbceSSrinivas Kandagatla 					   CDC_WSA_MCLK_EN_MASK,
1115809bcbceSSrinivas Kandagatla 					   CDC_WSA_MCLK_ENABLE);
1116809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap,
1117809bcbceSSrinivas Kandagatla 					   CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
1118809bcbceSSrinivas Kandagatla 					   CDC_WSA_FS_CNT_EN_MASK,
1119809bcbceSSrinivas Kandagatla 					   CDC_WSA_FS_CNT_ENABLE);
1120809bcbceSSrinivas Kandagatla 		}
1121809bcbceSSrinivas Kandagatla 		wsa->wsa_mclk_users++;
1122809bcbceSSrinivas Kandagatla 	} else {
1123809bcbceSSrinivas Kandagatla 		if (wsa->wsa_mclk_users <= 0) {
1124809bcbceSSrinivas Kandagatla 			dev_err(wsa->dev, "clock already disabled\n");
1125809bcbceSSrinivas Kandagatla 			wsa->wsa_mclk_users = 0;
1126809bcbceSSrinivas Kandagatla 			return;
1127809bcbceSSrinivas Kandagatla 		}
1128809bcbceSSrinivas Kandagatla 		wsa->wsa_mclk_users--;
1129809bcbceSSrinivas Kandagatla 		if (wsa->wsa_mclk_users == 0) {
1130809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap,
1131809bcbceSSrinivas Kandagatla 					   CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
1132809bcbceSSrinivas Kandagatla 					   CDC_WSA_FS_CNT_EN_MASK,
1133809bcbceSSrinivas Kandagatla 					   CDC_WSA_FS_CNT_DISABLE);
1134809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap,
1135809bcbceSSrinivas Kandagatla 					   CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL,
1136809bcbceSSrinivas Kandagatla 					   CDC_WSA_MCLK_EN_MASK,
1137809bcbceSSrinivas Kandagatla 					   CDC_WSA_MCLK_DISABLE);
1138809bcbceSSrinivas Kandagatla 		}
1139809bcbceSSrinivas Kandagatla 	}
1140809bcbceSSrinivas Kandagatla }
1141809bcbceSSrinivas Kandagatla 
11422c4066e5SSrinivas Kandagatla static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w,
11432c4066e5SSrinivas Kandagatla 				struct snd_kcontrol *kcontrol, int event)
11442c4066e5SSrinivas Kandagatla {
11452c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
11462c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
11472c4066e5SSrinivas Kandagatla 
11482c4066e5SSrinivas Kandagatla 	wsa_macro_mclk_enable(wsa, event == SND_SOC_DAPM_PRE_PMU);
11492c4066e5SSrinivas Kandagatla 	return 0;
11502c4066e5SSrinivas Kandagatla }
11512c4066e5SSrinivas Kandagatla 
11522c4066e5SSrinivas Kandagatla static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
11532c4066e5SSrinivas Kandagatla 					struct snd_kcontrol *kcontrol,
11542c4066e5SSrinivas Kandagatla 					int event)
11552c4066e5SSrinivas Kandagatla {
11562c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
11572c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
11582c4066e5SSrinivas Kandagatla 	u32 tx_reg0, tx_reg1;
11592c4066e5SSrinivas Kandagatla 
11602c4066e5SSrinivas Kandagatla 	if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
11612c4066e5SSrinivas Kandagatla 		tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL;
11622c4066e5SSrinivas Kandagatla 		tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL;
11632c4066e5SSrinivas Kandagatla 	} else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
11642c4066e5SSrinivas Kandagatla 		tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL;
11652c4066e5SSrinivas Kandagatla 		tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL;
11662c4066e5SSrinivas Kandagatla 	}
11672c4066e5SSrinivas Kandagatla 
11682c4066e5SSrinivas Kandagatla 	switch (event) {
11692c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
11702c4066e5SSrinivas Kandagatla 			/* Enable V&I sensing */
11712c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg0,
11722c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
11732c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET);
11742c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg1,
11752c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
11762c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET);
11772c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg0,
11782c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
11792c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
11802c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg1,
11812c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
11822c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
11832c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg0,
11842c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
11852c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
11862c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg1,
11872c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
11882c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
11892c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg0,
11902c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
11912c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_NO_RESET);
11922c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg1,
11932c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
11942c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_NO_RESET);
11952c4066e5SSrinivas Kandagatla 		break;
11962c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
11972c4066e5SSrinivas Kandagatla 		/* Disable V&I sensing */
11982c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg0,
11992c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
12002c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET);
12012c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg1,
12022c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
12032c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_RESET);
12042c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg0,
12052c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
12062c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
12072c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, tx_reg1,
12082c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
12092c4066e5SSrinivas Kandagatla 					      CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
12102c4066e5SSrinivas Kandagatla 		break;
12112c4066e5SSrinivas Kandagatla 	}
12122c4066e5SSrinivas Kandagatla 
12132c4066e5SSrinivas Kandagatla 	return 0;
12142c4066e5SSrinivas Kandagatla }
12152c4066e5SSrinivas Kandagatla 
12162c4066e5SSrinivas Kandagatla static int wsa_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
12172c4066e5SSrinivas Kandagatla 				     struct snd_kcontrol *kcontrol, int event)
12182c4066e5SSrinivas Kandagatla {
12192c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1220e4b8b7c9SJonathan Marek 	u16 path_reg, gain_reg;
12212c4066e5SSrinivas Kandagatla 	int val;
12222c4066e5SSrinivas Kandagatla 
1223e4b8b7c9SJonathan Marek 	switch (w->shift) {
1224e4b8b7c9SJonathan Marek 	case WSA_MACRO_RX_MIX0:
1225e4b8b7c9SJonathan Marek 		path_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL;
12262c4066e5SSrinivas Kandagatla 		gain_reg = CDC_WSA_RX0_RX_VOL_MIX_CTL;
12272c4066e5SSrinivas Kandagatla 		break;
1228e4b8b7c9SJonathan Marek 	case WSA_MACRO_RX_MIX1:
1229e4b8b7c9SJonathan Marek 		path_reg = CDC_WSA_RX1_RX_PATH_MIX_CTL;
12302c4066e5SSrinivas Kandagatla 		gain_reg = CDC_WSA_RX1_RX_VOL_MIX_CTL;
12312c4066e5SSrinivas Kandagatla 		break;
12322c4066e5SSrinivas Kandagatla 	default:
12332c4066e5SSrinivas Kandagatla 		return 0;
12342c4066e5SSrinivas Kandagatla 	}
12352c4066e5SSrinivas Kandagatla 
12362c4066e5SSrinivas Kandagatla 	switch (event) {
12372c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
12382c4066e5SSrinivas Kandagatla 		val = snd_soc_component_read(component, gain_reg);
12392c4066e5SSrinivas Kandagatla 		snd_soc_component_write(component, gain_reg, val);
12402c4066e5SSrinivas Kandagatla 		break;
12412c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
1242e4b8b7c9SJonathan Marek 		snd_soc_component_update_bits(component, path_reg,
12432c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_MIX_CLK_EN_MASK,
12442c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_MIX_CLK_DISABLE);
12452c4066e5SSrinivas Kandagatla 		break;
12462c4066e5SSrinivas Kandagatla 	}
12472c4066e5SSrinivas Kandagatla 
12482c4066e5SSrinivas Kandagatla 	return 0;
12492c4066e5SSrinivas Kandagatla }
12502c4066e5SSrinivas Kandagatla 
12512c4066e5SSrinivas Kandagatla static void wsa_macro_hd2_control(struct snd_soc_component *component,
12522c4066e5SSrinivas Kandagatla 				  u16 reg, int event)
12532c4066e5SSrinivas Kandagatla {
12542c4066e5SSrinivas Kandagatla 	u16 hd2_scale_reg;
12552c4066e5SSrinivas Kandagatla 	u16 hd2_enable_reg;
12562c4066e5SSrinivas Kandagatla 
12572c4066e5SSrinivas Kandagatla 	if (reg == CDC_WSA_RX0_RX_PATH_CTL) {
12582c4066e5SSrinivas Kandagatla 		hd2_scale_reg = CDC_WSA_RX0_RX_PATH_SEC3;
12592c4066e5SSrinivas Kandagatla 		hd2_enable_reg = CDC_WSA_RX0_RX_PATH_CFG0;
12602c4066e5SSrinivas Kandagatla 	}
12612c4066e5SSrinivas Kandagatla 	if (reg == CDC_WSA_RX1_RX_PATH_CTL) {
12622c4066e5SSrinivas Kandagatla 		hd2_scale_reg = CDC_WSA_RX1_RX_PATH_SEC3;
12632c4066e5SSrinivas Kandagatla 		hd2_enable_reg = CDC_WSA_RX1_RX_PATH_CFG0;
12642c4066e5SSrinivas Kandagatla 	}
12652c4066e5SSrinivas Kandagatla 
12662c4066e5SSrinivas Kandagatla 	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
12672c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
12682c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_ALPHA_MASK,
12692c4066e5SSrinivas Kandagatla 					      0x10);
12702c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
12712c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_SCALE_MASK,
12722c4066e5SSrinivas Kandagatla 					      0x1);
12732c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_enable_reg,
12742c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_EN_MASK,
12752c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_ENABLE);
12762c4066e5SSrinivas Kandagatla 	}
12772c4066e5SSrinivas Kandagatla 
12782c4066e5SSrinivas Kandagatla 	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
12792c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_enable_reg,
12802c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_EN_MASK, 0);
12812c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
12822c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_SCALE_MASK,
12832c4066e5SSrinivas Kandagatla 					      0);
12842c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
12852c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_HD2_ALPHA_MASK,
12862c4066e5SSrinivas Kandagatla 					      0);
12872c4066e5SSrinivas Kandagatla 	}
12882c4066e5SSrinivas Kandagatla }
12892c4066e5SSrinivas Kandagatla 
12902c4066e5SSrinivas Kandagatla static int wsa_macro_config_compander(struct snd_soc_component *component,
12912c4066e5SSrinivas Kandagatla 				      int comp, int event)
12922c4066e5SSrinivas Kandagatla {
12932c4066e5SSrinivas Kandagatla 	u16 comp_ctl0_reg, rx_path_cfg0_reg;
12942c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
12952c4066e5SSrinivas Kandagatla 
12962c4066e5SSrinivas Kandagatla 	if (!wsa->comp_enabled[comp])
12972c4066e5SSrinivas Kandagatla 		return 0;
12982c4066e5SSrinivas Kandagatla 
12992c4066e5SSrinivas Kandagatla 	comp_ctl0_reg = CDC_WSA_COMPANDER0_CTL0 +
13002c4066e5SSrinivas Kandagatla 					(comp * WSA_MACRO_RX_COMP_OFFSET);
13012c4066e5SSrinivas Kandagatla 	rx_path_cfg0_reg = CDC_WSA_RX0_RX_PATH_CFG0 +
13022c4066e5SSrinivas Kandagatla 					(comp * WSA_MACRO_RX_PATH_OFFSET);
13032c4066e5SSrinivas Kandagatla 
13042c4066e5SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
13052c4066e5SSrinivas Kandagatla 		/* Enable Compander Clock */
13062c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13072c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_CLK_EN_MASK,
13082c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_CLK_ENABLE);
13092c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13102c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
13112c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_SOFT_RST_ENABLE);
13122c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13132c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
13142c4066e5SSrinivas Kandagatla 					      0);
13152c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
13162c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_COMP_EN_MASK,
13172c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_COMP_ENABLE);
13182c4066e5SSrinivas Kandagatla 	}
13192c4066e5SSrinivas Kandagatla 
13202c4066e5SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event)) {
13212c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13222c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_HALT_MASK,
13232c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_HALT);
13242c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
13252c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_COMP_EN_MASK, 0);
13262c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13272c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
13282c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_SOFT_RST_ENABLE);
13292c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13302c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
13312c4066e5SSrinivas Kandagatla 					      0);
13322c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13332c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_CLK_EN_MASK, 0);
13342c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
13352c4066e5SSrinivas Kandagatla 					      CDC_WSA_COMPANDER_HALT_MASK, 0);
13362c4066e5SSrinivas Kandagatla 	}
13372c4066e5SSrinivas Kandagatla 
13382c4066e5SSrinivas Kandagatla 	return 0;
13392c4066e5SSrinivas Kandagatla }
13402c4066e5SSrinivas Kandagatla 
13412c4066e5SSrinivas Kandagatla static void wsa_macro_enable_softclip_clk(struct snd_soc_component *component,
13422c4066e5SSrinivas Kandagatla 					 struct wsa_macro *wsa,
13432c4066e5SSrinivas Kandagatla 					 int path,
13442c4066e5SSrinivas Kandagatla 					 bool enable)
13452c4066e5SSrinivas Kandagatla {
13462c4066e5SSrinivas Kandagatla 	u16 softclip_clk_reg = CDC_WSA_SOFTCLIP0_CRC +
13472c4066e5SSrinivas Kandagatla 			(path * WSA_MACRO_RX_SOFTCLIP_OFFSET);
13482c4066e5SSrinivas Kandagatla 	u8 softclip_mux_mask = (1 << path);
13492c4066e5SSrinivas Kandagatla 	u8 softclip_mux_value = (1 << path);
13502c4066e5SSrinivas Kandagatla 
13512c4066e5SSrinivas Kandagatla 	if (enable) {
13522c4066e5SSrinivas Kandagatla 		if (wsa->softclip_clk_users[path] == 0) {
13532c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
13542c4066e5SSrinivas Kandagatla 						softclip_clk_reg,
13552c4066e5SSrinivas Kandagatla 						CDC_WSA_SOFTCLIP_CLK_EN_MASK,
13562c4066e5SSrinivas Kandagatla 						CDC_WSA_SOFTCLIP_CLK_ENABLE);
13572c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
13582c4066e5SSrinivas Kandagatla 				CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0,
13592c4066e5SSrinivas Kandagatla 				softclip_mux_mask, softclip_mux_value);
13602c4066e5SSrinivas Kandagatla 		}
13612c4066e5SSrinivas Kandagatla 		wsa->softclip_clk_users[path]++;
13622c4066e5SSrinivas Kandagatla 	} else {
13632c4066e5SSrinivas Kandagatla 		wsa->softclip_clk_users[path]--;
13642c4066e5SSrinivas Kandagatla 		if (wsa->softclip_clk_users[path] == 0) {
13652c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
13662c4066e5SSrinivas Kandagatla 						softclip_clk_reg,
13672c4066e5SSrinivas Kandagatla 						CDC_WSA_SOFTCLIP_CLK_EN_MASK,
13682c4066e5SSrinivas Kandagatla 						0);
13692c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
13702c4066e5SSrinivas Kandagatla 				CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0,
13712c4066e5SSrinivas Kandagatla 				softclip_mux_mask, 0x00);
13722c4066e5SSrinivas Kandagatla 		}
13732c4066e5SSrinivas Kandagatla 	}
13742c4066e5SSrinivas Kandagatla }
13752c4066e5SSrinivas Kandagatla 
13762c4066e5SSrinivas Kandagatla static int wsa_macro_config_softclip(struct snd_soc_component *component,
13772c4066e5SSrinivas Kandagatla 				     int path, int event)
13782c4066e5SSrinivas Kandagatla {
13792c4066e5SSrinivas Kandagatla 	u16 softclip_ctrl_reg;
13802c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
13812c4066e5SSrinivas Kandagatla 	int softclip_path = 0;
13822c4066e5SSrinivas Kandagatla 
13832c4066e5SSrinivas Kandagatla 	if (path == WSA_MACRO_COMP1)
13842c4066e5SSrinivas Kandagatla 		softclip_path = WSA_MACRO_SOFTCLIP0;
13852c4066e5SSrinivas Kandagatla 	else if (path == WSA_MACRO_COMP2)
13862c4066e5SSrinivas Kandagatla 		softclip_path = WSA_MACRO_SOFTCLIP1;
13872c4066e5SSrinivas Kandagatla 
13882c4066e5SSrinivas Kandagatla 	if (!wsa->is_softclip_on[softclip_path])
13892c4066e5SSrinivas Kandagatla 		return 0;
13902c4066e5SSrinivas Kandagatla 
13912c4066e5SSrinivas Kandagatla 	softclip_ctrl_reg = CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL +
13922c4066e5SSrinivas Kandagatla 				(softclip_path * WSA_MACRO_RX_SOFTCLIP_OFFSET);
13932c4066e5SSrinivas Kandagatla 
13942c4066e5SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
13952c4066e5SSrinivas Kandagatla 		/* Enable Softclip clock and mux */
13962c4066e5SSrinivas Kandagatla 		wsa_macro_enable_softclip_clk(component, wsa, softclip_path,
13972c4066e5SSrinivas Kandagatla 					      true);
13982c4066e5SSrinivas Kandagatla 		/* Enable Softclip control */
13992c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, softclip_ctrl_reg,
14002c4066e5SSrinivas Kandagatla 					      CDC_WSA_SOFTCLIP_EN_MASK,
14012c4066e5SSrinivas Kandagatla 					      CDC_WSA_SOFTCLIP_ENABLE);
14022c4066e5SSrinivas Kandagatla 	}
14032c4066e5SSrinivas Kandagatla 
14042c4066e5SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event)) {
14052c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, softclip_ctrl_reg,
14062c4066e5SSrinivas Kandagatla 					      CDC_WSA_SOFTCLIP_EN_MASK, 0);
14072c4066e5SSrinivas Kandagatla 		wsa_macro_enable_softclip_clk(component, wsa, softclip_path,
14082c4066e5SSrinivas Kandagatla 					      false);
14092c4066e5SSrinivas Kandagatla 	}
14102c4066e5SSrinivas Kandagatla 
14112c4066e5SSrinivas Kandagatla 	return 0;
14122c4066e5SSrinivas Kandagatla }
14132c4066e5SSrinivas Kandagatla 
14142c4066e5SSrinivas Kandagatla static bool wsa_macro_adie_lb(struct snd_soc_component *component,
14152c4066e5SSrinivas Kandagatla 			      int interp_idx)
14162c4066e5SSrinivas Kandagatla {
14172c4066e5SSrinivas Kandagatla 	u16 int_mux_cfg0,  int_mux_cfg1;
14182c4066e5SSrinivas Kandagatla 	u8 int_n_inp0, int_n_inp1, int_n_inp2;
14192c4066e5SSrinivas Kandagatla 
14202c4066e5SSrinivas Kandagatla 	int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8;
14212c4066e5SSrinivas Kandagatla 	int_mux_cfg1 = int_mux_cfg0 + 4;
14222c4066e5SSrinivas Kandagatla 
14237db4c4cdSSrinivas Kandagatla 	int_n_inp0 = snd_soc_component_read_field(component, int_mux_cfg0,
14247db4c4cdSSrinivas Kandagatla 						  CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK);
14252c4066e5SSrinivas Kandagatla 	if (int_n_inp0 == INTn_1_INP_SEL_DEC0 ||
14262c4066e5SSrinivas Kandagatla 		int_n_inp0 == INTn_1_INP_SEL_DEC1)
14272c4066e5SSrinivas Kandagatla 		return true;
14282c4066e5SSrinivas Kandagatla 
14297db4c4cdSSrinivas Kandagatla 	int_n_inp1 = snd_soc_component_read_field(component, int_mux_cfg0,
14307db4c4cdSSrinivas Kandagatla 						  CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK);
14312c4066e5SSrinivas Kandagatla 	if (int_n_inp1 == INTn_1_INP_SEL_DEC0 ||
14322c4066e5SSrinivas Kandagatla 		int_n_inp1 == INTn_1_INP_SEL_DEC1)
14332c4066e5SSrinivas Kandagatla 		return true;
14342c4066e5SSrinivas Kandagatla 
14357db4c4cdSSrinivas Kandagatla 	int_n_inp2 = snd_soc_component_read_field(component, int_mux_cfg1,
14367db4c4cdSSrinivas Kandagatla 						  CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK);
14372c4066e5SSrinivas Kandagatla 	if (int_n_inp2 == INTn_1_INP_SEL_DEC0 ||
14382c4066e5SSrinivas Kandagatla 		int_n_inp2 == INTn_1_INP_SEL_DEC1)
14392c4066e5SSrinivas Kandagatla 		return true;
14402c4066e5SSrinivas Kandagatla 
14412c4066e5SSrinivas Kandagatla 	return false;
14422c4066e5SSrinivas Kandagatla }
14432c4066e5SSrinivas Kandagatla 
14442c4066e5SSrinivas Kandagatla static int wsa_macro_enable_main_path(struct snd_soc_dapm_widget *w,
14452c4066e5SSrinivas Kandagatla 				      struct snd_kcontrol *kcontrol,
14462c4066e5SSrinivas Kandagatla 				      int event)
14472c4066e5SSrinivas Kandagatla {
14482c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
14492c4066e5SSrinivas Kandagatla 	u16 reg;
14502c4066e5SSrinivas Kandagatla 
14512c4066e5SSrinivas Kandagatla 	reg = CDC_WSA_RX0_RX_PATH_CTL + WSA_MACRO_RX_PATH_OFFSET * w->shift;
14522c4066e5SSrinivas Kandagatla 	switch (event) {
14532c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
14542c4066e5SSrinivas Kandagatla 		if (wsa_macro_adie_lb(component, w->shift)) {
14552c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component, reg,
14562c4066e5SSrinivas Kandagatla 					     CDC_WSA_RX_PATH_CLK_EN_MASK,
14572c4066e5SSrinivas Kandagatla 					     CDC_WSA_RX_PATH_CLK_ENABLE);
14582c4066e5SSrinivas Kandagatla 		}
14592c4066e5SSrinivas Kandagatla 		break;
14602c4066e5SSrinivas Kandagatla 	default:
14612c4066e5SSrinivas Kandagatla 		break;
14622c4066e5SSrinivas Kandagatla 	}
14632c4066e5SSrinivas Kandagatla 	return 0;
14642c4066e5SSrinivas Kandagatla }
14652c4066e5SSrinivas Kandagatla 
14662c4066e5SSrinivas Kandagatla static int wsa_macro_interp_get_primary_reg(u16 reg, u16 *ind)
14672c4066e5SSrinivas Kandagatla {
14682c4066e5SSrinivas Kandagatla 	u16 prim_int_reg = 0;
14692c4066e5SSrinivas Kandagatla 
14702c4066e5SSrinivas Kandagatla 	switch (reg) {
14712c4066e5SSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_CTL:
14722c4066e5SSrinivas Kandagatla 	case CDC_WSA_RX0_RX_PATH_MIX_CTL:
14732c4066e5SSrinivas Kandagatla 		prim_int_reg = CDC_WSA_RX0_RX_PATH_CTL;
14742c4066e5SSrinivas Kandagatla 		*ind = 0;
14752c4066e5SSrinivas Kandagatla 		break;
14762c4066e5SSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_CTL:
14772c4066e5SSrinivas Kandagatla 	case CDC_WSA_RX1_RX_PATH_MIX_CTL:
14782c4066e5SSrinivas Kandagatla 		prim_int_reg = CDC_WSA_RX1_RX_PATH_CTL;
14792c4066e5SSrinivas Kandagatla 		*ind = 1;
14802c4066e5SSrinivas Kandagatla 		break;
14812c4066e5SSrinivas Kandagatla 	}
14822c4066e5SSrinivas Kandagatla 
14832c4066e5SSrinivas Kandagatla 	return prim_int_reg;
14842c4066e5SSrinivas Kandagatla }
14852c4066e5SSrinivas Kandagatla 
14862c4066e5SSrinivas Kandagatla static int wsa_macro_enable_prim_interpolator(struct snd_soc_component *component,
14872c4066e5SSrinivas Kandagatla 					      u16 reg, int event)
14882c4066e5SSrinivas Kandagatla {
14892c4066e5SSrinivas Kandagatla 	u16 prim_int_reg;
14902c4066e5SSrinivas Kandagatla 	u16 ind = 0;
14912c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
14922c4066e5SSrinivas Kandagatla 
14932c4066e5SSrinivas Kandagatla 	prim_int_reg = wsa_macro_interp_get_primary_reg(reg, &ind);
14942c4066e5SSrinivas Kandagatla 
14952c4066e5SSrinivas Kandagatla 	switch (event) {
14962c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
14972c4066e5SSrinivas Kandagatla 		wsa->prim_int_users[ind]++;
14982c4066e5SSrinivas Kandagatla 		if (wsa->prim_int_users[ind] == 1) {
14992c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
15002c4066e5SSrinivas Kandagatla 						      prim_int_reg + WSA_MACRO_RX_PATH_CFG3_OFFSET,
15012c4066e5SSrinivas Kandagatla 						      CDC_WSA_RX_DC_DCOEFF_MASK,
15022c4066e5SSrinivas Kandagatla 						      0x3);
15032c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component, prim_int_reg,
15042c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK,
15052c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PATH_PGA_MUTE_ENABLE);
15062c4066e5SSrinivas Kandagatla 			wsa_macro_hd2_control(component, prim_int_reg, event);
15072c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
15082c4066e5SSrinivas Kandagatla 				prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET,
15092c4066e5SSrinivas Kandagatla 				CDC_WSA_RX_DSMDEM_CLK_EN_MASK,
15102c4066e5SSrinivas Kandagatla 				CDC_WSA_RX_DSMDEM_CLK_ENABLE);
15112c4066e5SSrinivas Kandagatla 		}
15122c4066e5SSrinivas Kandagatla 		if ((reg != prim_int_reg) &&
15132c4066e5SSrinivas Kandagatla 		    ((snd_soc_component_read(
15142c4066e5SSrinivas Kandagatla 				component, prim_int_reg)) & 0x10))
15152c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component, reg,
15162c4066e5SSrinivas Kandagatla 					0x10, 0x10);
15172c4066e5SSrinivas Kandagatla 		break;
15182c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
15192c4066e5SSrinivas Kandagatla 		wsa->prim_int_users[ind]--;
15202c4066e5SSrinivas Kandagatla 		if (wsa->prim_int_users[ind] == 0) {
15212c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
15222c4066e5SSrinivas Kandagatla 				prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET,
15232c4066e5SSrinivas Kandagatla 				CDC_WSA_RX_DSMDEM_CLK_EN_MASK, 0);
15242c4066e5SSrinivas Kandagatla 			wsa_macro_hd2_control(component, prim_int_reg, event);
15252c4066e5SSrinivas Kandagatla 		}
15262c4066e5SSrinivas Kandagatla 		break;
15272c4066e5SSrinivas Kandagatla 	}
15282c4066e5SSrinivas Kandagatla 
15292c4066e5SSrinivas Kandagatla 	return 0;
15302c4066e5SSrinivas Kandagatla }
15312c4066e5SSrinivas Kandagatla 
15322c4066e5SSrinivas Kandagatla static int wsa_macro_config_ear_spkr_gain(struct snd_soc_component *component,
15332c4066e5SSrinivas Kandagatla 					  struct wsa_macro *wsa,
15342c4066e5SSrinivas Kandagatla 					  int event, int gain_reg)
15352c4066e5SSrinivas Kandagatla {
15362c4066e5SSrinivas Kandagatla 	int comp_gain_offset, val;
15372c4066e5SSrinivas Kandagatla 
15382c4066e5SSrinivas Kandagatla 	switch (wsa->spkr_mode) {
15392c4066e5SSrinivas Kandagatla 	/* Compander gain in WSA_MACRO_SPKR_MODE1 case is 12 dB */
15402c4066e5SSrinivas Kandagatla 	case WSA_MACRO_SPKR_MODE_1:
15412c4066e5SSrinivas Kandagatla 		comp_gain_offset = -12;
15422c4066e5SSrinivas Kandagatla 		break;
15432c4066e5SSrinivas Kandagatla 	/* Default case compander gain is 15 dB */
15442c4066e5SSrinivas Kandagatla 	default:
15452c4066e5SSrinivas Kandagatla 		comp_gain_offset = -15;
15462c4066e5SSrinivas Kandagatla 		break;
15472c4066e5SSrinivas Kandagatla 	}
15482c4066e5SSrinivas Kandagatla 
15492c4066e5SSrinivas Kandagatla 	switch (event) {
15502c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
15512c4066e5SSrinivas Kandagatla 		/* Apply ear spkr gain only if compander is enabled */
15522c4066e5SSrinivas Kandagatla 		if (wsa->comp_enabled[WSA_MACRO_COMP1] &&
15532c4066e5SSrinivas Kandagatla 		    (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) &&
15542c4066e5SSrinivas Kandagatla 		    (wsa->ear_spkr_gain != 0)) {
15552c4066e5SSrinivas Kandagatla 			/* For example, val is -8(-12+5-1) for 4dB of gain */
15562c4066e5SSrinivas Kandagatla 			val = comp_gain_offset + wsa->ear_spkr_gain - 1;
15572c4066e5SSrinivas Kandagatla 			snd_soc_component_write(component, gain_reg, val);
15582c4066e5SSrinivas Kandagatla 		}
15592c4066e5SSrinivas Kandagatla 		break;
15602c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
15612c4066e5SSrinivas Kandagatla 		/*
15622c4066e5SSrinivas Kandagatla 		 * Reset RX0 volume to 0 dB if compander is enabled and
15632c4066e5SSrinivas Kandagatla 		 * ear_spkr_gain is non-zero.
15642c4066e5SSrinivas Kandagatla 		 */
15652c4066e5SSrinivas Kandagatla 		if (wsa->comp_enabled[WSA_MACRO_COMP1] &&
15662c4066e5SSrinivas Kandagatla 		    (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) &&
15672c4066e5SSrinivas Kandagatla 		    (wsa->ear_spkr_gain != 0)) {
15682c4066e5SSrinivas Kandagatla 			snd_soc_component_write(component, gain_reg, 0x0);
15692c4066e5SSrinivas Kandagatla 		}
15702c4066e5SSrinivas Kandagatla 		break;
15712c4066e5SSrinivas Kandagatla 	}
15722c4066e5SSrinivas Kandagatla 
15732c4066e5SSrinivas Kandagatla 	return 0;
15742c4066e5SSrinivas Kandagatla }
15752c4066e5SSrinivas Kandagatla 
15762c4066e5SSrinivas Kandagatla static int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
15772c4066e5SSrinivas Kandagatla 					 struct snd_kcontrol *kcontrol,
15782c4066e5SSrinivas Kandagatla 					 int event)
15792c4066e5SSrinivas Kandagatla {
15802c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
15812c4066e5SSrinivas Kandagatla 	u16 gain_reg;
15822c4066e5SSrinivas Kandagatla 	u16 reg;
15832c4066e5SSrinivas Kandagatla 	int val;
15842c4066e5SSrinivas Kandagatla 	int offset_val = 0;
15852c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
15862c4066e5SSrinivas Kandagatla 
15872c4066e5SSrinivas Kandagatla 	if (w->shift == WSA_MACRO_COMP1) {
15882c4066e5SSrinivas Kandagatla 		reg = CDC_WSA_RX0_RX_PATH_CTL;
15892c4066e5SSrinivas Kandagatla 		gain_reg = CDC_WSA_RX0_RX_VOL_CTL;
15902c4066e5SSrinivas Kandagatla 	} else if (w->shift == WSA_MACRO_COMP2) {
15912c4066e5SSrinivas Kandagatla 		reg = CDC_WSA_RX1_RX_PATH_CTL;
15922c4066e5SSrinivas Kandagatla 		gain_reg = CDC_WSA_RX1_RX_VOL_CTL;
15932c4066e5SSrinivas Kandagatla 	}
15942c4066e5SSrinivas Kandagatla 
15952c4066e5SSrinivas Kandagatla 	switch (event) {
15962c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
15972c4066e5SSrinivas Kandagatla 		/* Reset if needed */
15982c4066e5SSrinivas Kandagatla 		wsa_macro_enable_prim_interpolator(component, reg, event);
15992c4066e5SSrinivas Kandagatla 		break;
16002c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
16012c4066e5SSrinivas Kandagatla 		wsa_macro_config_compander(component, w->shift, event);
16022c4066e5SSrinivas Kandagatla 		wsa_macro_config_softclip(component, w->shift, event);
16032c4066e5SSrinivas Kandagatla 		/* apply gain after int clk is enabled */
16042c4066e5SSrinivas Kandagatla 		if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) &&
16052c4066e5SSrinivas Kandagatla 		    (wsa->comp_enabled[WSA_MACRO_COMP1] ||
16062c4066e5SSrinivas Kandagatla 		     wsa->comp_enabled[WSA_MACRO_COMP2])) {
16072c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16082c4066e5SSrinivas Kandagatla 					CDC_WSA_RX0_RX_PATH_SEC1,
16092c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16102c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
16112c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16122c4066e5SSrinivas Kandagatla 					CDC_WSA_RX0_RX_PATH_MIX_SEC0,
16132c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16142c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
16152c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16162c4066e5SSrinivas Kandagatla 					CDC_WSA_RX1_RX_PATH_SEC1,
16172c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16182c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
16192c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16202c4066e5SSrinivas Kandagatla 					CDC_WSA_RX1_RX_PATH_MIX_SEC0,
16212c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16222c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
16232c4066e5SSrinivas Kandagatla 			offset_val = -2;
16242c4066e5SSrinivas Kandagatla 		}
16252c4066e5SSrinivas Kandagatla 		val = snd_soc_component_read(component, gain_reg);
16262c4066e5SSrinivas Kandagatla 		val += offset_val;
16272c4066e5SSrinivas Kandagatla 		snd_soc_component_write(component, gain_reg, val);
16282c4066e5SSrinivas Kandagatla 		wsa_macro_config_ear_spkr_gain(component, wsa,
16292c4066e5SSrinivas Kandagatla 						event, gain_reg);
16302c4066e5SSrinivas Kandagatla 		break;
16312c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
16322c4066e5SSrinivas Kandagatla 		wsa_macro_config_compander(component, w->shift, event);
16332c4066e5SSrinivas Kandagatla 		wsa_macro_config_softclip(component, w->shift, event);
16342c4066e5SSrinivas Kandagatla 		wsa_macro_enable_prim_interpolator(component, reg, event);
16352c4066e5SSrinivas Kandagatla 		if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) &&
16362c4066e5SSrinivas Kandagatla 		    (wsa->comp_enabled[WSA_MACRO_COMP1] ||
16372c4066e5SSrinivas Kandagatla 		     wsa->comp_enabled[WSA_MACRO_COMP2])) {
16382c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16392c4066e5SSrinivas Kandagatla 					CDC_WSA_RX0_RX_PATH_SEC1,
16402c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16412c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
16422c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16432c4066e5SSrinivas Kandagatla 					CDC_WSA_RX0_RX_PATH_MIX_SEC0,
16442c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16452c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
16462c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16472c4066e5SSrinivas Kandagatla 					CDC_WSA_RX1_RX_PATH_SEC1,
16482c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16492c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
16502c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component,
16512c4066e5SSrinivas Kandagatla 					CDC_WSA_RX1_RX_PATH_MIX_SEC0,
16522c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_MASK,
16532c4066e5SSrinivas Kandagatla 					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
16542c4066e5SSrinivas Kandagatla 			offset_val = 2;
16552c4066e5SSrinivas Kandagatla 			val = snd_soc_component_read(component, gain_reg);
16562c4066e5SSrinivas Kandagatla 			val += offset_val;
16572c4066e5SSrinivas Kandagatla 			snd_soc_component_write(component, gain_reg, val);
16582c4066e5SSrinivas Kandagatla 		}
16592c4066e5SSrinivas Kandagatla 		wsa_macro_config_ear_spkr_gain(component, wsa,
16602c4066e5SSrinivas Kandagatla 						event, gain_reg);
16612c4066e5SSrinivas Kandagatla 		break;
16622c4066e5SSrinivas Kandagatla 	}
16632c4066e5SSrinivas Kandagatla 
16642c4066e5SSrinivas Kandagatla 	return 0;
16652c4066e5SSrinivas Kandagatla }
16662c4066e5SSrinivas Kandagatla 
16672c4066e5SSrinivas Kandagatla static int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w,
16682c4066e5SSrinivas Kandagatla 				     struct snd_kcontrol *kcontrol,
16692c4066e5SSrinivas Kandagatla 				     int event)
16702c4066e5SSrinivas Kandagatla {
16712c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
16722c4066e5SSrinivas Kandagatla 	u16 boost_path_ctl, boost_path_cfg1;
16732c4066e5SSrinivas Kandagatla 	u16 reg, reg_mix;
16742c4066e5SSrinivas Kandagatla 
16752c4066e5SSrinivas Kandagatla 	if (!strcmp(w->name, "WSA_RX INT0 CHAIN")) {
16762c4066e5SSrinivas Kandagatla 		boost_path_ctl = CDC_WSA_BOOST0_BOOST_PATH_CTL;
16772c4066e5SSrinivas Kandagatla 		boost_path_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1;
16782c4066e5SSrinivas Kandagatla 		reg = CDC_WSA_RX0_RX_PATH_CTL;
16792c4066e5SSrinivas Kandagatla 		reg_mix = CDC_WSA_RX0_RX_PATH_MIX_CTL;
16802c4066e5SSrinivas Kandagatla 	} else if (!strcmp(w->name, "WSA_RX INT1 CHAIN")) {
16812c4066e5SSrinivas Kandagatla 		boost_path_ctl = CDC_WSA_BOOST1_BOOST_PATH_CTL;
16822c4066e5SSrinivas Kandagatla 		boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1;
16832c4066e5SSrinivas Kandagatla 		reg = CDC_WSA_RX1_RX_PATH_CTL;
16842c4066e5SSrinivas Kandagatla 		reg_mix = CDC_WSA_RX1_RX_PATH_MIX_CTL;
16852c4066e5SSrinivas Kandagatla 	}
16862c4066e5SSrinivas Kandagatla 
16872c4066e5SSrinivas Kandagatla 	switch (event) {
16882c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
16892c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, boost_path_cfg1,
16902c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_SMART_BST_EN_MASK,
16912c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_SMART_BST_ENABLE);
16922c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, boost_path_ctl,
16932c4066e5SSrinivas Kandagatla 					      CDC_WSA_BOOST_PATH_CLK_EN_MASK,
16942c4066e5SSrinivas Kandagatla 					      CDC_WSA_BOOST_PATH_CLK_ENABLE);
16952c4066e5SSrinivas Kandagatla 		if ((snd_soc_component_read(component, reg_mix)) & 0x10)
16962c4066e5SSrinivas Kandagatla 			snd_soc_component_update_bits(component, reg_mix,
16972c4066e5SSrinivas Kandagatla 						0x10, 0x00);
16982c4066e5SSrinivas Kandagatla 		break;
16992c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
17002c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, reg, 0x10, 0x00);
17012c4066e5SSrinivas Kandagatla 		break;
17022c4066e5SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
17032c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, boost_path_ctl,
17042c4066e5SSrinivas Kandagatla 					      CDC_WSA_BOOST_PATH_CLK_EN_MASK,
17052c4066e5SSrinivas Kandagatla 					      CDC_WSA_BOOST_PATH_CLK_DISABLE);
17062c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, boost_path_cfg1,
17072c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_SMART_BST_EN_MASK,
17082c4066e5SSrinivas Kandagatla 					      CDC_WSA_RX_PATH_SMART_BST_DISABLE);
17092c4066e5SSrinivas Kandagatla 		break;
17102c4066e5SSrinivas Kandagatla 	}
17112c4066e5SSrinivas Kandagatla 
17122c4066e5SSrinivas Kandagatla 	return 0;
17132c4066e5SSrinivas Kandagatla }
17142c4066e5SSrinivas Kandagatla 
17152c4066e5SSrinivas Kandagatla static int wsa_macro_enable_echo(struct snd_soc_dapm_widget *w,
17162c4066e5SSrinivas Kandagatla 				 struct snd_kcontrol *kcontrol,
17172c4066e5SSrinivas Kandagatla 				 int event)
17182c4066e5SSrinivas Kandagatla {
17192c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
17202c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
17212c4066e5SSrinivas Kandagatla 	u16 val, ec_tx, ec_hq_reg;
17222c4066e5SSrinivas Kandagatla 
17232c4066e5SSrinivas Kandagatla 	val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0);
17242c4066e5SSrinivas Kandagatla 
17252c4066e5SSrinivas Kandagatla 	switch (w->shift) {
17262c4066e5SSrinivas Kandagatla 	case WSA_MACRO_EC0_MUX:
17272c4066e5SSrinivas Kandagatla 		val = val & CDC_WSA_RX_MIX_TX0_SEL_MASK;
17282c4066e5SSrinivas Kandagatla 		ec_tx = val - 1;
17292c4066e5SSrinivas Kandagatla 		break;
17302c4066e5SSrinivas Kandagatla 	case WSA_MACRO_EC1_MUX:
17312c4066e5SSrinivas Kandagatla 		val = val & CDC_WSA_RX_MIX_TX1_SEL_MASK;
17322c4066e5SSrinivas Kandagatla 		ec_tx = (val >> CDC_WSA_RX_MIX_TX1_SEL_SHFT) - 1;
17332c4066e5SSrinivas Kandagatla 		break;
173458f01c7fSTom Rix 	default:
173558f01c7fSTom Rix 		dev_err(component->dev,	"%s: Invalid shift %u\n",
173658f01c7fSTom Rix 			__func__, w->shift);
173758f01c7fSTom Rix 		return -EINVAL;
17382c4066e5SSrinivas Kandagatla 	}
17392c4066e5SSrinivas Kandagatla 
17402c4066e5SSrinivas Kandagatla 	if (wsa->ec_hq[ec_tx]) {
17412c4066e5SSrinivas Kandagatla 		ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL +	0x40 * ec_tx;
17422c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, ec_hq_reg,
17432c4066e5SSrinivas Kandagatla 					     CDC_WSA_EC_HQ_EC_CLK_EN_MASK,
17442c4066e5SSrinivas Kandagatla 					     CDC_WSA_EC_HQ_EC_CLK_ENABLE);
17452c4066e5SSrinivas Kandagatla 		ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 + 0x40 * ec_tx;
17462c4066e5SSrinivas Kandagatla 		/* default set to 48k */
17472c4066e5SSrinivas Kandagatla 		snd_soc_component_update_bits(component, ec_hq_reg,
17482c4066e5SSrinivas Kandagatla 				      CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK,
17492c4066e5SSrinivas Kandagatla 				      CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K);
17502c4066e5SSrinivas Kandagatla 	}
17512c4066e5SSrinivas Kandagatla 
17522c4066e5SSrinivas Kandagatla 	return 0;
17532c4066e5SSrinivas Kandagatla }
17542c4066e5SSrinivas Kandagatla 
1755809bcbceSSrinivas Kandagatla static int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol,
1756809bcbceSSrinivas Kandagatla 			       struct snd_ctl_elem_value *ucontrol)
1757809bcbceSSrinivas Kandagatla {
1758809bcbceSSrinivas Kandagatla 
1759809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1760809bcbceSSrinivas Kandagatla 	int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
1761809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1762809bcbceSSrinivas Kandagatla 
1763809bcbceSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = wsa->ec_hq[ec_tx];
1764809bcbceSSrinivas Kandagatla 
1765809bcbceSSrinivas Kandagatla 	return 0;
1766809bcbceSSrinivas Kandagatla }
1767809bcbceSSrinivas Kandagatla 
1768809bcbceSSrinivas Kandagatla static int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol,
1769809bcbceSSrinivas Kandagatla 			       struct snd_ctl_elem_value *ucontrol)
1770809bcbceSSrinivas Kandagatla {
1771809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1772809bcbceSSrinivas Kandagatla 	int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
1773809bcbceSSrinivas Kandagatla 	int value = ucontrol->value.integer.value[0];
1774809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1775809bcbceSSrinivas Kandagatla 
1776809bcbceSSrinivas Kandagatla 	wsa->ec_hq[ec_tx] = value;
1777809bcbceSSrinivas Kandagatla 
1778809bcbceSSrinivas Kandagatla 	return 0;
1779809bcbceSSrinivas Kandagatla }
1780809bcbceSSrinivas Kandagatla 
1781809bcbceSSrinivas Kandagatla static int wsa_macro_get_compander(struct snd_kcontrol *kcontrol,
1782809bcbceSSrinivas Kandagatla 				   struct snd_ctl_elem_value *ucontrol)
1783809bcbceSSrinivas Kandagatla {
1784809bcbceSSrinivas Kandagatla 
1785809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1786809bcbceSSrinivas Kandagatla 	int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
1787809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1788809bcbceSSrinivas Kandagatla 
1789809bcbceSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = wsa->comp_enabled[comp];
1790809bcbceSSrinivas Kandagatla 	return 0;
1791809bcbceSSrinivas Kandagatla }
1792809bcbceSSrinivas Kandagatla 
1793809bcbceSSrinivas Kandagatla static int wsa_macro_set_compander(struct snd_kcontrol *kcontrol,
1794809bcbceSSrinivas Kandagatla 				   struct snd_ctl_elem_value *ucontrol)
1795809bcbceSSrinivas Kandagatla {
1796809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1797809bcbceSSrinivas Kandagatla 	int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
1798809bcbceSSrinivas Kandagatla 	int value = ucontrol->value.integer.value[0];
1799809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1800809bcbceSSrinivas Kandagatla 
1801809bcbceSSrinivas Kandagatla 	wsa->comp_enabled[comp] = value;
1802809bcbceSSrinivas Kandagatla 
1803809bcbceSSrinivas Kandagatla 	return 0;
1804809bcbceSSrinivas Kandagatla }
1805809bcbceSSrinivas Kandagatla 
1806809bcbceSSrinivas Kandagatla static int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol,
1807809bcbceSSrinivas Kandagatla 					  struct snd_ctl_elem_value *ucontrol)
1808809bcbceSSrinivas Kandagatla {
1809809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1810809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1811809bcbceSSrinivas Kandagatla 
1812809bcbceSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = wsa->ear_spkr_gain;
1813809bcbceSSrinivas Kandagatla 
1814809bcbceSSrinivas Kandagatla 	return 0;
1815809bcbceSSrinivas Kandagatla }
1816809bcbceSSrinivas Kandagatla 
1817809bcbceSSrinivas Kandagatla static int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol,
1818809bcbceSSrinivas Kandagatla 					  struct snd_ctl_elem_value *ucontrol)
1819809bcbceSSrinivas Kandagatla {
1820809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1821809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1822809bcbceSSrinivas Kandagatla 
1823809bcbceSSrinivas Kandagatla 	wsa->ear_spkr_gain =  ucontrol->value.integer.value[0];
1824809bcbceSSrinivas Kandagatla 
1825809bcbceSSrinivas Kandagatla 	return 0;
1826809bcbceSSrinivas Kandagatla }
1827809bcbceSSrinivas Kandagatla 
18282c4066e5SSrinivas Kandagatla static int wsa_macro_rx_mux_get(struct snd_kcontrol *kcontrol,
18292c4066e5SSrinivas Kandagatla 				struct snd_ctl_elem_value *ucontrol)
18302c4066e5SSrinivas Kandagatla {
18312c4066e5SSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget =
18322c4066e5SSrinivas Kandagatla 		snd_soc_dapm_kcontrol_widget(kcontrol);
18332c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component =
18342c4066e5SSrinivas Kandagatla 				snd_soc_dapm_to_component(widget->dapm);
18352c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
18362c4066e5SSrinivas Kandagatla 
18372c4066e5SSrinivas Kandagatla 	ucontrol->value.integer.value[0] =
18382c4066e5SSrinivas Kandagatla 			wsa->rx_port_value[widget->shift];
18392c4066e5SSrinivas Kandagatla 	return 0;
18402c4066e5SSrinivas Kandagatla }
18412c4066e5SSrinivas Kandagatla 
18422c4066e5SSrinivas Kandagatla static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol,
18432c4066e5SSrinivas Kandagatla 				struct snd_ctl_elem_value *ucontrol)
18442c4066e5SSrinivas Kandagatla {
18452c4066e5SSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget =
18462c4066e5SSrinivas Kandagatla 		snd_soc_dapm_kcontrol_widget(kcontrol);
18472c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component =
18482c4066e5SSrinivas Kandagatla 				snd_soc_dapm_to_component(widget->dapm);
18492c4066e5SSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
18502c4066e5SSrinivas Kandagatla 	struct snd_soc_dapm_update *update = NULL;
18512c4066e5SSrinivas Kandagatla 	u32 rx_port_value = ucontrol->value.integer.value[0];
18522c4066e5SSrinivas Kandagatla 	u32 bit_input;
18532c4066e5SSrinivas Kandagatla 	u32 aif_rst;
18542c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
18552c4066e5SSrinivas Kandagatla 
18562c4066e5SSrinivas Kandagatla 	aif_rst = wsa->rx_port_value[widget->shift];
18572c4066e5SSrinivas Kandagatla 	if (!rx_port_value) {
18582c4066e5SSrinivas Kandagatla 		if (aif_rst == 0) {
18592c4066e5SSrinivas Kandagatla 			dev_err(component->dev, "%s: AIF reset already\n", __func__);
18602c4066e5SSrinivas Kandagatla 			return 0;
18612c4066e5SSrinivas Kandagatla 		}
18622c4066e5SSrinivas Kandagatla 		if (aif_rst >= WSA_MACRO_RX_MAX) {
18632c4066e5SSrinivas Kandagatla 			dev_err(component->dev, "%s: Invalid AIF reset\n", __func__);
18642c4066e5SSrinivas Kandagatla 			return 0;
18652c4066e5SSrinivas Kandagatla 		}
18662c4066e5SSrinivas Kandagatla 	}
18672c4066e5SSrinivas Kandagatla 	wsa->rx_port_value[widget->shift] = rx_port_value;
18682c4066e5SSrinivas Kandagatla 
18692c4066e5SSrinivas Kandagatla 	bit_input = widget->shift;
18702c4066e5SSrinivas Kandagatla 
18712c4066e5SSrinivas Kandagatla 	switch (rx_port_value) {
18722c4066e5SSrinivas Kandagatla 	case 0:
18732c4066e5SSrinivas Kandagatla 		if (wsa->active_ch_cnt[aif_rst]) {
18742c4066e5SSrinivas Kandagatla 			clear_bit(bit_input,
18752c4066e5SSrinivas Kandagatla 				  &wsa->active_ch_mask[aif_rst]);
18762c4066e5SSrinivas Kandagatla 			wsa->active_ch_cnt[aif_rst]--;
18772c4066e5SSrinivas Kandagatla 		}
18782c4066e5SSrinivas Kandagatla 		break;
18792c4066e5SSrinivas Kandagatla 	case 1:
18802c4066e5SSrinivas Kandagatla 	case 2:
18812c4066e5SSrinivas Kandagatla 		set_bit(bit_input,
18822c4066e5SSrinivas Kandagatla 			&wsa->active_ch_mask[rx_port_value]);
18832c4066e5SSrinivas Kandagatla 		wsa->active_ch_cnt[rx_port_value]++;
18842c4066e5SSrinivas Kandagatla 		break;
18852c4066e5SSrinivas Kandagatla 	default:
18862c4066e5SSrinivas Kandagatla 		dev_err(component->dev,
18872c4066e5SSrinivas Kandagatla 			"%s: Invalid AIF_ID for WSA RX MUX %d\n",
18882c4066e5SSrinivas Kandagatla 			__func__, rx_port_value);
18892c4066e5SSrinivas Kandagatla 		return -EINVAL;
18902c4066e5SSrinivas Kandagatla 	}
18912c4066e5SSrinivas Kandagatla 
18922c4066e5SSrinivas Kandagatla 	snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
18932c4066e5SSrinivas Kandagatla 					rx_port_value, e, update);
18942c4066e5SSrinivas Kandagatla 	return 0;
18952c4066e5SSrinivas Kandagatla }
18962c4066e5SSrinivas Kandagatla 
1897809bcbceSSrinivas Kandagatla static int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,
1898809bcbceSSrinivas Kandagatla 					  struct snd_ctl_elem_value *ucontrol)
1899809bcbceSSrinivas Kandagatla {
1900809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1901809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1902809bcbceSSrinivas Kandagatla 	int path = ((struct soc_mixer_control *)kcontrol->private_value)->shift;
1903809bcbceSSrinivas Kandagatla 
1904809bcbceSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = wsa->is_softclip_on[path];
1905809bcbceSSrinivas Kandagatla 
1906809bcbceSSrinivas Kandagatla 	return 0;
1907809bcbceSSrinivas Kandagatla }
1908809bcbceSSrinivas Kandagatla 
1909809bcbceSSrinivas Kandagatla static int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,
1910809bcbceSSrinivas Kandagatla 					  struct snd_ctl_elem_value *ucontrol)
1911809bcbceSSrinivas Kandagatla {
1912809bcbceSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1913809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
1914809bcbceSSrinivas Kandagatla 	int path = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
1915809bcbceSSrinivas Kandagatla 
1916809bcbceSSrinivas Kandagatla 	wsa->is_softclip_on[path] =  ucontrol->value.integer.value[0];
1917809bcbceSSrinivas Kandagatla 
1918809bcbceSSrinivas Kandagatla 	return 0;
1919809bcbceSSrinivas Kandagatla }
1920809bcbceSSrinivas Kandagatla 
1921809bcbceSSrinivas Kandagatla static const struct snd_kcontrol_new wsa_macro_snd_controls[] = {
1922809bcbceSSrinivas Kandagatla 	SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum,
1923809bcbceSSrinivas Kandagatla 		     wsa_macro_ear_spkr_pa_gain_get,
1924809bcbceSSrinivas Kandagatla 		     wsa_macro_ear_spkr_pa_gain_put),
1925809bcbceSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM,
1926809bcbceSSrinivas Kandagatla 			WSA_MACRO_SOFTCLIP0, 1, 0,
1927809bcbceSSrinivas Kandagatla 			wsa_macro_soft_clip_enable_get,
1928809bcbceSSrinivas Kandagatla 			wsa_macro_soft_clip_enable_put),
1929809bcbceSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM,
1930809bcbceSSrinivas Kandagatla 			WSA_MACRO_SOFTCLIP1, 1, 0,
1931809bcbceSSrinivas Kandagatla 			wsa_macro_soft_clip_enable_get,
1932809bcbceSSrinivas Kandagatla 			wsa_macro_soft_clip_enable_put),
1933809bcbceSSrinivas Kandagatla 
1934809bcbceSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("WSA_RX0 Digital Volume", CDC_WSA_RX0_RX_VOL_CTL,
1935809bcbceSSrinivas Kandagatla 			  -84, 40, digital_gain),
1936809bcbceSSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("WSA_RX1 Digital Volume", CDC_WSA_RX1_RX_VOL_CTL,
1937809bcbceSSrinivas Kandagatla 			  -84, 40, digital_gain),
1938809bcbceSSrinivas Kandagatla 
1939809bcbceSSrinivas Kandagatla 	SOC_SINGLE("WSA_RX0 Digital Mute", CDC_WSA_RX0_RX_PATH_CTL, 4, 1, 0),
1940809bcbceSSrinivas Kandagatla 	SOC_SINGLE("WSA_RX1 Digital Mute", CDC_WSA_RX1_RX_PATH_CTL, 4, 1, 0),
1941809bcbceSSrinivas Kandagatla 	SOC_SINGLE("WSA_RX0_MIX Digital Mute", CDC_WSA_RX0_RX_PATH_MIX_CTL, 4,
1942809bcbceSSrinivas Kandagatla 		   1, 0),
1943809bcbceSSrinivas Kandagatla 	SOC_SINGLE("WSA_RX1_MIX Digital Mute", CDC_WSA_RX1_RX_PATH_MIX_CTL, 4,
1944809bcbceSSrinivas Kandagatla 		   1, 0),
1945809bcbceSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0,
1946809bcbceSSrinivas Kandagatla 		       wsa_macro_get_compander, wsa_macro_set_compander),
1947809bcbceSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0,
1948809bcbceSSrinivas Kandagatla 		       wsa_macro_get_compander, wsa_macro_set_compander),
1949809bcbceSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, 1, 0,
1950809bcbceSSrinivas Kandagatla 		       wsa_macro_get_ec_hq, wsa_macro_set_ec_hq),
1951809bcbceSSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, 1, 0,
1952809bcbceSSrinivas Kandagatla 		       wsa_macro_get_ec_hq, wsa_macro_set_ec_hq),
1953809bcbceSSrinivas Kandagatla };
1954809bcbceSSrinivas Kandagatla 
19552c4066e5SSrinivas Kandagatla static const struct soc_enum rx_mux_enum =
19562c4066e5SSrinivas Kandagatla 	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_mux_text), rx_mux_text);
19572c4066e5SSrinivas Kandagatla 
19582c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new rx_mux[WSA_MACRO_RX_MAX] = {
19592c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("WSA RX0 Mux", rx_mux_enum,
19602c4066e5SSrinivas Kandagatla 			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
19612c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("WSA RX1 Mux", rx_mux_enum,
19622c4066e5SSrinivas Kandagatla 			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
19632c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("WSA RX_MIX0 Mux", rx_mux_enum,
19642c4066e5SSrinivas Kandagatla 			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
19652c4066e5SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("WSA RX_MIX1 Mux", rx_mux_enum,
19662c4066e5SSrinivas Kandagatla 			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
19672c4066e5SSrinivas Kandagatla };
19682c4066e5SSrinivas Kandagatla 
19692c4066e5SSrinivas Kandagatla static int wsa_macro_vi_feed_mixer_get(struct snd_kcontrol *kcontrol,
19702c4066e5SSrinivas Kandagatla 				       struct snd_ctl_elem_value *ucontrol)
19712c4066e5SSrinivas Kandagatla {
19722c4066e5SSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
19732c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
19742c4066e5SSrinivas Kandagatla 	struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
19752c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
19762c4066e5SSrinivas Kandagatla 	u32 spk_tx_id = mixer->shift;
19772c4066e5SSrinivas Kandagatla 	u32 dai_id = widget->shift;
19782c4066e5SSrinivas Kandagatla 
19792c4066e5SSrinivas Kandagatla 	if (test_bit(spk_tx_id, &wsa->active_ch_mask[dai_id]))
19802c4066e5SSrinivas Kandagatla 		ucontrol->value.integer.value[0] = 1;
19812c4066e5SSrinivas Kandagatla 	else
19822c4066e5SSrinivas Kandagatla 		ucontrol->value.integer.value[0] = 0;
19832c4066e5SSrinivas Kandagatla 
19842c4066e5SSrinivas Kandagatla 	return 0;
19852c4066e5SSrinivas Kandagatla }
19862c4066e5SSrinivas Kandagatla 
19872c4066e5SSrinivas Kandagatla static int wsa_macro_vi_feed_mixer_put(struct snd_kcontrol *kcontrol,
19882c4066e5SSrinivas Kandagatla 				       struct snd_ctl_elem_value *ucontrol)
19892c4066e5SSrinivas Kandagatla {
19902c4066e5SSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
19912c4066e5SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
19922c4066e5SSrinivas Kandagatla 	struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
19932c4066e5SSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
19942c4066e5SSrinivas Kandagatla 	u32 enable = ucontrol->value.integer.value[0];
19952c4066e5SSrinivas Kandagatla 	u32 spk_tx_id = mixer->shift;
19962c4066e5SSrinivas Kandagatla 
19972c4066e5SSrinivas Kandagatla 	if (enable) {
19982c4066e5SSrinivas Kandagatla 		if (spk_tx_id == WSA_MACRO_TX0 &&
19992c4066e5SSrinivas Kandagatla 			!test_bit(WSA_MACRO_TX0,
20002c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
20012c4066e5SSrinivas Kandagatla 			set_bit(WSA_MACRO_TX0,
20022c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
20032c4066e5SSrinivas Kandagatla 			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++;
20042c4066e5SSrinivas Kandagatla 		}
20052c4066e5SSrinivas Kandagatla 		if (spk_tx_id == WSA_MACRO_TX1 &&
20062c4066e5SSrinivas Kandagatla 			!test_bit(WSA_MACRO_TX1,
20072c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
20082c4066e5SSrinivas Kandagatla 			set_bit(WSA_MACRO_TX1,
20092c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
20102c4066e5SSrinivas Kandagatla 			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++;
20112c4066e5SSrinivas Kandagatla 		}
20122c4066e5SSrinivas Kandagatla 	} else {
20132c4066e5SSrinivas Kandagatla 		if (spk_tx_id == WSA_MACRO_TX0 &&
20142c4066e5SSrinivas Kandagatla 			test_bit(WSA_MACRO_TX0,
20152c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
20162c4066e5SSrinivas Kandagatla 			clear_bit(WSA_MACRO_TX0,
20172c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
20182c4066e5SSrinivas Kandagatla 			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--;
20192c4066e5SSrinivas Kandagatla 		}
20202c4066e5SSrinivas Kandagatla 		if (spk_tx_id == WSA_MACRO_TX1 &&
20212c4066e5SSrinivas Kandagatla 			test_bit(WSA_MACRO_TX1,
20222c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
20232c4066e5SSrinivas Kandagatla 			clear_bit(WSA_MACRO_TX1,
20242c4066e5SSrinivas Kandagatla 				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
20252c4066e5SSrinivas Kandagatla 			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--;
20262c4066e5SSrinivas Kandagatla 		}
20272c4066e5SSrinivas Kandagatla 	}
20282c4066e5SSrinivas Kandagatla 	snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL);
20292c4066e5SSrinivas Kandagatla 
20302c4066e5SSrinivas Kandagatla 	return 0;
20312c4066e5SSrinivas Kandagatla }
20322c4066e5SSrinivas Kandagatla 
20332c4066e5SSrinivas Kandagatla static const struct snd_kcontrol_new aif_vi_mixer[] = {
20342c4066e5SSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_SPKR_VI_1", SND_SOC_NOPM, WSA_MACRO_TX0, 1, 0,
20352c4066e5SSrinivas Kandagatla 			wsa_macro_vi_feed_mixer_get,
20362c4066e5SSrinivas Kandagatla 			wsa_macro_vi_feed_mixer_put),
20372c4066e5SSrinivas Kandagatla 	SOC_SINGLE_EXT("WSA_SPKR_VI_2", SND_SOC_NOPM, WSA_MACRO_TX1, 1, 0,
20382c4066e5SSrinivas Kandagatla 			wsa_macro_vi_feed_mixer_get,
20392c4066e5SSrinivas Kandagatla 			wsa_macro_vi_feed_mixer_put),
20402c4066e5SSrinivas Kandagatla };
20412c4066e5SSrinivas Kandagatla 
20422c4066e5SSrinivas Kandagatla static const struct snd_soc_dapm_widget wsa_macro_dapm_widgets[] = {
20432c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0,
20442c4066e5SSrinivas Kandagatla 			    SND_SOC_NOPM, 0, 0),
20452c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_IN("WSA AIF_MIX1 PB", "WSA_AIF_MIX1 Playback", 0,
20462c4066e5SSrinivas Kandagatla 			    SND_SOC_NOPM, 0, 0),
20472c4066e5SSrinivas Kandagatla 
20482c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0,
20492c4066e5SSrinivas Kandagatla 			       SND_SOC_NOPM, WSA_MACRO_AIF_VI, 0,
20502c4066e5SSrinivas Kandagatla 			       wsa_macro_enable_vi_feedback,
20512c4066e5SSrinivas Kandagatla 			       SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
20522c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0,
20532c4066e5SSrinivas Kandagatla 			     SND_SOC_NOPM, 0, 0),
20542c4066e5SSrinivas Kandagatla 
20552c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA_AIF_VI Mixer", SND_SOC_NOPM, WSA_MACRO_AIF_VI,
20562c4066e5SSrinivas Kandagatla 			   0, aif_vi_mixer, ARRAY_SIZE(aif_vi_mixer)),
20572c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("WSA RX_MIX EC0_MUX", SND_SOC_NOPM,
20582c4066e5SSrinivas Kandagatla 			   WSA_MACRO_EC0_MUX, 0,
20592c4066e5SSrinivas Kandagatla 			   &rx_mix_ec0_mux, wsa_macro_enable_echo,
20602c4066e5SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
20612c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("WSA RX_MIX EC1_MUX", SND_SOC_NOPM,
20622c4066e5SSrinivas Kandagatla 			   WSA_MACRO_EC1_MUX, 0,
20632c4066e5SSrinivas Kandagatla 			   &rx_mix_ec1_mux, wsa_macro_enable_echo,
20642c4066e5SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
20652c4066e5SSrinivas Kandagatla 
20662c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA RX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX0, 0,
20672c4066e5SSrinivas Kandagatla 			 &rx_mux[WSA_MACRO_RX0]),
20682c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA RX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX1, 0,
20692c4066e5SSrinivas Kandagatla 			 &rx_mux[WSA_MACRO_RX1]),
20702c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA RX_MIX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 0,
20712c4066e5SSrinivas Kandagatla 			 &rx_mux[WSA_MACRO_RX_MIX0]),
20722c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA RX_MIX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 0,
20732c4066e5SSrinivas Kandagatla 			 &rx_mux[WSA_MACRO_RX_MIX1]),
20742c4066e5SSrinivas Kandagatla 
20752c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
20762c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
20772c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA RX_MIX0", SND_SOC_NOPM, 0, 0, NULL, 0),
20782c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA RX_MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
20792c4066e5SSrinivas Kandagatla 
20802c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, &rx0_prim_inp0_mux),
20812c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, &rx0_prim_inp1_mux),
20822c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, &rx0_prim_inp2_mux),
2083e4b8b7c9SJonathan Marek 	SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX0,
2084e4b8b7c9SJonathan Marek 			   0, &rx0_mix_mux, wsa_macro_enable_mix_path,
20852c4066e5SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
20862c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, &rx1_prim_inp0_mux),
20872c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, &rx1_prim_inp1_mux),
20882c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, &rx1_prim_inp2_mux),
2089e4b8b7c9SJonathan Marek 	SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX1,
2090e4b8b7c9SJonathan Marek 			   0, &rx1_mix_mux, wsa_macro_enable_mix_path,
20912c4066e5SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
20922c4066e5SSrinivas Kandagatla 
20932c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER_E("WSA_RX INT0 MIX", SND_SOC_NOPM, 0, 0, NULL, 0,
20942c4066e5SSrinivas Kandagatla 			     wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU),
20952c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER_E("WSA_RX INT1 MIX", SND_SOC_NOPM, 1, 0, NULL, 0,
20962c4066e5SSrinivas Kandagatla 			     wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU),
20972c4066e5SSrinivas Kandagatla 
20982c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA_RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
20992c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("WSA_RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
21002c4066e5SSrinivas Kandagatla 
21012c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("WSA_RX0 INT0 SIDETONE MIX", CDC_WSA_RX0_RX_PATH_CFG1,
21022c4066e5SSrinivas Kandagatla 			 4, 0, &rx0_sidetone_mix_mux),
21032c4066e5SSrinivas Kandagatla 
21042c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("WSA SRC0_INP"),
21052c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("WSA_TX DEC0_INP"),
21062c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("WSA_TX DEC1_INP"),
21072c4066e5SSrinivas Kandagatla 
21082c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER_E("WSA_RX INT0 INTERP", SND_SOC_NOPM,
21092c4066e5SSrinivas Kandagatla 			     WSA_MACRO_COMP1, 0, NULL, 0,
21102c4066e5SSrinivas Kandagatla 			     wsa_macro_enable_interpolator,
21112c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
21122c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_POST_PMD),
21132c4066e5SSrinivas Kandagatla 
21142c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER_E("WSA_RX INT1 INTERP", SND_SOC_NOPM,
21152c4066e5SSrinivas Kandagatla 			     WSA_MACRO_COMP2, 0, NULL, 0,
21162c4066e5SSrinivas Kandagatla 			     wsa_macro_enable_interpolator,
21172c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
21182c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_POST_PMD),
21192c4066e5SSrinivas Kandagatla 
21202c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER_E("WSA_RX INT0 CHAIN", SND_SOC_NOPM, 0, 0,
21212c4066e5SSrinivas Kandagatla 			     NULL, 0, wsa_macro_spk_boost_event,
21222c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
21232c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_POST_PMD),
21242c4066e5SSrinivas Kandagatla 
21252c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER_E("WSA_RX INT1 CHAIN", SND_SOC_NOPM, 0, 0,
21262c4066e5SSrinivas Kandagatla 			     NULL, 0, wsa_macro_spk_boost_event,
21272c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
21282c4066e5SSrinivas Kandagatla 			     SND_SOC_DAPM_POST_PMD),
21292c4066e5SSrinivas Kandagatla 
21302c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("VIINPUT_WSA"),
21312c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("WSA_SPK1 OUT"),
21322c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("WSA_SPK2 OUT"),
21332c4066e5SSrinivas Kandagatla 
21342c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("WSA_RX0_CLK", CDC_WSA_RX0_RX_PATH_CTL, 5, 0, NULL, 0),
21352c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("WSA_RX1_CLK", CDC_WSA_RX1_RX_PATH_CTL, 5, 0, NULL, 0),
21362c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("WSA_RX_MIX0_CLK", CDC_WSA_RX0_RX_PATH_MIX_CTL, 5, 0, NULL, 0),
21372c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("WSA_RX_MIX1_CLK", CDC_WSA_RX1_RX_PATH_MIX_CTL, 5, 0, NULL, 0),
21382c4066e5SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY_S("WSA_MCLK", 0, SND_SOC_NOPM, 0, 0,
21392c4066e5SSrinivas Kandagatla 			      wsa_macro_mclk_event,
21402c4066e5SSrinivas Kandagatla 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
21412c4066e5SSrinivas Kandagatla };
21422c4066e5SSrinivas Kandagatla 
21432c4066e5SSrinivas Kandagatla static const struct snd_soc_dapm_route wsa_audio_map[] = {
21442c4066e5SSrinivas Kandagatla 	/* VI Feedback */
21452c4066e5SSrinivas Kandagatla 	{"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"},
21462c4066e5SSrinivas Kandagatla 	{"WSA_AIF_VI Mixer", "WSA_SPKR_VI_2", "VIINPUT_WSA"},
21472c4066e5SSrinivas Kandagatla 	{"WSA AIF_VI", NULL, "WSA_AIF_VI Mixer"},
21482c4066e5SSrinivas Kandagatla 	{"WSA AIF_VI", NULL, "WSA_MCLK"},
21492c4066e5SSrinivas Kandagatla 
21502c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX EC0_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"},
21512c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX EC1_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"},
21522c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX EC0_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"},
21532c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX EC1_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"},
21542c4066e5SSrinivas Kandagatla 	{"WSA AIF_ECHO", NULL, "WSA RX_MIX EC0_MUX"},
21552c4066e5SSrinivas Kandagatla 	{"WSA AIF_ECHO", NULL, "WSA RX_MIX EC1_MUX"},
21562c4066e5SSrinivas Kandagatla 	{"WSA AIF_ECHO", NULL, "WSA_MCLK"},
21572c4066e5SSrinivas Kandagatla 
21582c4066e5SSrinivas Kandagatla 	{"WSA AIF1 PB", NULL, "WSA_MCLK"},
21592c4066e5SSrinivas Kandagatla 	{"WSA AIF_MIX1 PB", NULL, "WSA_MCLK"},
21602c4066e5SSrinivas Kandagatla 
21612c4066e5SSrinivas Kandagatla 	{"WSA RX0 MUX", "AIF1_PB", "WSA AIF1 PB"},
21622c4066e5SSrinivas Kandagatla 	{"WSA RX1 MUX", "AIF1_PB", "WSA AIF1 PB"},
21632c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX0 MUX", "AIF1_PB", "WSA AIF1 PB"},
21642c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX1 MUX", "AIF1_PB", "WSA AIF1 PB"},
21652c4066e5SSrinivas Kandagatla 
21662c4066e5SSrinivas Kandagatla 	{"WSA RX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
21672c4066e5SSrinivas Kandagatla 	{"WSA RX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
21682c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
21692c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
21702c4066e5SSrinivas Kandagatla 
21712c4066e5SSrinivas Kandagatla 	{"WSA RX0", NULL, "WSA RX0 MUX"},
21722c4066e5SSrinivas Kandagatla 	{"WSA RX1", NULL, "WSA RX1 MUX"},
21732c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX0", NULL, "WSA RX_MIX0 MUX"},
21742c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX1", NULL, "WSA RX_MIX1 MUX"},
21752c4066e5SSrinivas Kandagatla 
21762c4066e5SSrinivas Kandagatla 	{"WSA RX0", NULL, "WSA_RX0_CLK"},
21772c4066e5SSrinivas Kandagatla 	{"WSA RX1", NULL, "WSA_RX1_CLK"},
21782c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX0", NULL, "WSA_RX_MIX0_CLK"},
21792c4066e5SSrinivas Kandagatla 	{"WSA RX_MIX1", NULL, "WSA_RX_MIX1_CLK"},
21802c4066e5SSrinivas Kandagatla 
21812c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP0", "RX0", "WSA RX0"},
21822c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP0", "RX1", "WSA RX1"},
21832c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP0", "RX_MIX0", "WSA RX_MIX0"},
21842c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP0", "RX_MIX1", "WSA RX_MIX1"},
21852c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP0", "DEC0", "WSA_TX DEC0_INP"},
21862c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP0", "DEC1", "WSA_TX DEC1_INP"},
21872c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP0"},
21882c4066e5SSrinivas Kandagatla 
21892c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP1", "RX0", "WSA RX0"},
21902c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP1", "RX1", "WSA RX1"},
21912c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP1", "RX_MIX0", "WSA RX_MIX0"},
21922c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP1", "RX_MIX1", "WSA RX_MIX1"},
21932c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP1", "DEC0", "WSA_TX DEC0_INP"},
21942c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP1", "DEC1", "WSA_TX DEC1_INP"},
21952c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP1"},
21962c4066e5SSrinivas Kandagatla 
21972c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP2", "RX0", "WSA RX0"},
21982c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP2", "RX1", "WSA RX1"},
21992c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP2", "RX_MIX0", "WSA RX_MIX0"},
22002c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP2", "RX_MIX1", "WSA RX_MIX1"},
22012c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP2", "DEC0", "WSA_TX DEC0_INP"},
22022c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INP2", "DEC1", "WSA_TX DEC1_INP"},
22032c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP2"},
22042c4066e5SSrinivas Kandagatla 
22052c4066e5SSrinivas Kandagatla 	{"WSA_RX0 MIX INP", "RX0", "WSA RX0"},
22062c4066e5SSrinivas Kandagatla 	{"WSA_RX0 MIX INP", "RX1", "WSA RX1"},
22072c4066e5SSrinivas Kandagatla 	{"WSA_RX0 MIX INP", "RX_MIX0", "WSA RX_MIX0"},
22082c4066e5SSrinivas Kandagatla 	{"WSA_RX0 MIX INP", "RX_MIX1", "WSA RX_MIX1"},
22092c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 SEC MIX", NULL, "WSA_RX0 MIX INP"},
22102c4066e5SSrinivas Kandagatla 
22112c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 SEC MIX", NULL, "WSA_RX INT0 MIX"},
22122c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 INTERP", NULL, "WSA_RX INT0 SEC MIX"},
22132c4066e5SSrinivas Kandagatla 	{"WSA_RX0 INT0 SIDETONE MIX", "SRC0", "WSA SRC0_INP"},
22142c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 INTERP", NULL, "WSA_RX0 INT0 SIDETONE MIX"},
22152c4066e5SSrinivas Kandagatla 	{"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 INTERP"},
22162c4066e5SSrinivas Kandagatla 
22172c4066e5SSrinivas Kandagatla 	{"WSA_SPK1 OUT", NULL, "WSA_RX INT0 CHAIN"},
22182c4066e5SSrinivas Kandagatla 	{"WSA_SPK1 OUT", NULL, "WSA_MCLK"},
22192c4066e5SSrinivas Kandagatla 
22202c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP0", "RX0", "WSA RX0"},
22212c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP0", "RX1", "WSA RX1"},
22222c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP0", "RX_MIX0", "WSA RX_MIX0"},
22232c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP0", "RX_MIX1", "WSA RX_MIX1"},
22242c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP0", "DEC0", "WSA_TX DEC0_INP"},
22252c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP0", "DEC1", "WSA_TX DEC1_INP"},
22262c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP0"},
22272c4066e5SSrinivas Kandagatla 
22282c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP1", "RX0", "WSA RX0"},
22292c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP1", "RX1", "WSA RX1"},
22302c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP1", "RX_MIX0", "WSA RX_MIX0"},
22312c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP1", "RX_MIX1", "WSA RX_MIX1"},
22322c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP1", "DEC0", "WSA_TX DEC0_INP"},
22332c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP1", "DEC1", "WSA_TX DEC1_INP"},
22342c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP1"},
22352c4066e5SSrinivas Kandagatla 
22362c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP2", "RX0", "WSA RX0"},
22372c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP2", "RX1", "WSA RX1"},
22382c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP2", "RX_MIX0", "WSA RX_MIX0"},
22392c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP2", "RX_MIX1", "WSA RX_MIX1"},
22402c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP2", "DEC0", "WSA_TX DEC0_INP"},
22412c4066e5SSrinivas Kandagatla 	{"WSA_RX1 INP2", "DEC1", "WSA_TX DEC1_INP"},
22422c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP2"},
22432c4066e5SSrinivas Kandagatla 
22442c4066e5SSrinivas Kandagatla 	{"WSA_RX1 MIX INP", "RX0", "WSA RX0"},
22452c4066e5SSrinivas Kandagatla 	{"WSA_RX1 MIX INP", "RX1", "WSA RX1"},
22462c4066e5SSrinivas Kandagatla 	{"WSA_RX1 MIX INP", "RX_MIX0", "WSA RX_MIX0"},
22472c4066e5SSrinivas Kandagatla 	{"WSA_RX1 MIX INP", "RX_MIX1", "WSA RX_MIX1"},
22482c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 SEC MIX", NULL, "WSA_RX1 MIX INP"},
22492c4066e5SSrinivas Kandagatla 
22502c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 SEC MIX", NULL, "WSA_RX INT1 MIX"},
22512c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 INTERP", NULL, "WSA_RX INT1 SEC MIX"},
22522c4066e5SSrinivas Kandagatla 
22532c4066e5SSrinivas Kandagatla 	{"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 INTERP"},
22542c4066e5SSrinivas Kandagatla 	{"WSA_SPK2 OUT", NULL, "WSA_RX INT1 CHAIN"},
22552c4066e5SSrinivas Kandagatla 	{"WSA_SPK2 OUT", NULL, "WSA_MCLK"},
22562c4066e5SSrinivas Kandagatla };
22572c4066e5SSrinivas Kandagatla 
2258809bcbceSSrinivas Kandagatla static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable)
2259809bcbceSSrinivas Kandagatla {
2260809bcbceSSrinivas Kandagatla 	struct regmap *regmap = wsa->regmap;
2261809bcbceSSrinivas Kandagatla 
2262809bcbceSSrinivas Kandagatla 	if (enable) {
2263*05a41340SSrinivas Kandagatla 		int ret;
2264*05a41340SSrinivas Kandagatla 
2265*05a41340SSrinivas Kandagatla 		ret = clk_prepare_enable(wsa->mclk);
2266*05a41340SSrinivas Kandagatla 		if (ret) {
2267*05a41340SSrinivas Kandagatla 			dev_err(wsa->dev, "failed to enable mclk\n");
2268*05a41340SSrinivas Kandagatla 			return ret;
2269*05a41340SSrinivas Kandagatla 		}
2270809bcbceSSrinivas Kandagatla 		wsa_macro_mclk_enable(wsa, true);
2271809bcbceSSrinivas Kandagatla 
2272809bcbceSSrinivas Kandagatla 		/* reset swr ip */
2273809bcbceSSrinivas Kandagatla 		if (wsa->reset_swr)
2274809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap,
2275809bcbceSSrinivas Kandagatla 					   CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
2276809bcbceSSrinivas Kandagatla 					   CDC_WSA_SWR_RST_EN_MASK,
2277809bcbceSSrinivas Kandagatla 					   CDC_WSA_SWR_RST_ENABLE);
2278809bcbceSSrinivas Kandagatla 
2279809bcbceSSrinivas Kandagatla 		regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
2280809bcbceSSrinivas Kandagatla 				   CDC_WSA_SWR_CLK_EN_MASK,
2281809bcbceSSrinivas Kandagatla 				   CDC_WSA_SWR_CLK_ENABLE);
2282809bcbceSSrinivas Kandagatla 
2283809bcbceSSrinivas Kandagatla 		/* Bring out of reset */
2284809bcbceSSrinivas Kandagatla 		if (wsa->reset_swr)
2285809bcbceSSrinivas Kandagatla 			regmap_update_bits(regmap,
2286809bcbceSSrinivas Kandagatla 					   CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
2287809bcbceSSrinivas Kandagatla 					   CDC_WSA_SWR_RST_EN_MASK,
2288809bcbceSSrinivas Kandagatla 					   CDC_WSA_SWR_RST_DISABLE);
2289809bcbceSSrinivas Kandagatla 		wsa->reset_swr = false;
2290809bcbceSSrinivas Kandagatla 	} else {
2291809bcbceSSrinivas Kandagatla 		regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
2292809bcbceSSrinivas Kandagatla 				   CDC_WSA_SWR_CLK_EN_MASK, 0);
2293809bcbceSSrinivas Kandagatla 		wsa_macro_mclk_enable(wsa, false);
2294*05a41340SSrinivas Kandagatla 		clk_disable_unprepare(wsa->mclk);
2295809bcbceSSrinivas Kandagatla 	}
2296809bcbceSSrinivas Kandagatla 
2297809bcbceSSrinivas Kandagatla 	return 0;
2298809bcbceSSrinivas Kandagatla }
2299809bcbceSSrinivas Kandagatla 
2300809bcbceSSrinivas Kandagatla static int wsa_macro_component_probe(struct snd_soc_component *comp)
2301809bcbceSSrinivas Kandagatla {
2302809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = snd_soc_component_get_drvdata(comp);
2303809bcbceSSrinivas Kandagatla 
2304809bcbceSSrinivas Kandagatla 	snd_soc_component_init_regmap(comp, wsa->regmap);
2305809bcbceSSrinivas Kandagatla 
2306809bcbceSSrinivas Kandagatla 	wsa->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_M1P5_DB;
2307809bcbceSSrinivas Kandagatla 
2308809bcbceSSrinivas Kandagatla 	/* set SPKR rate to FS_2P4_3P072 */
2309809bcbceSSrinivas Kandagatla 	snd_soc_component_update_bits(comp, CDC_WSA_RX0_RX_PATH_CFG1,
2310809bcbceSSrinivas Kandagatla 				CDC_WSA_RX_PATH_SPKR_RATE_MASK,
2311809bcbceSSrinivas Kandagatla 				CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072);
2312809bcbceSSrinivas Kandagatla 
2313809bcbceSSrinivas Kandagatla 	snd_soc_component_update_bits(comp, CDC_WSA_RX1_RX_PATH_CFG1,
2314809bcbceSSrinivas Kandagatla 				CDC_WSA_RX_PATH_SPKR_RATE_MASK,
2315809bcbceSSrinivas Kandagatla 				CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072);
2316809bcbceSSrinivas Kandagatla 
2317809bcbceSSrinivas Kandagatla 	wsa_macro_set_spkr_mode(comp, WSA_MACRO_SPKR_MODE_1);
2318809bcbceSSrinivas Kandagatla 
2319809bcbceSSrinivas Kandagatla 	return 0;
2320809bcbceSSrinivas Kandagatla }
2321809bcbceSSrinivas Kandagatla 
2322809bcbceSSrinivas Kandagatla static int swclk_gate_enable(struct clk_hw *hw)
2323809bcbceSSrinivas Kandagatla {
2324809bcbceSSrinivas Kandagatla 	return wsa_swrm_clock(to_wsa_macro(hw), true);
2325809bcbceSSrinivas Kandagatla }
2326809bcbceSSrinivas Kandagatla 
2327809bcbceSSrinivas Kandagatla static void swclk_gate_disable(struct clk_hw *hw)
2328809bcbceSSrinivas Kandagatla {
2329809bcbceSSrinivas Kandagatla 	wsa_swrm_clock(to_wsa_macro(hw), false);
2330809bcbceSSrinivas Kandagatla }
2331809bcbceSSrinivas Kandagatla 
2332809bcbceSSrinivas Kandagatla static int swclk_gate_is_enabled(struct clk_hw *hw)
2333809bcbceSSrinivas Kandagatla {
2334809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = to_wsa_macro(hw);
2335809bcbceSSrinivas Kandagatla 	int ret, val;
2336809bcbceSSrinivas Kandagatla 
2337809bcbceSSrinivas Kandagatla 	regmap_read(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, &val);
2338809bcbceSSrinivas Kandagatla 	ret = val & BIT(0);
2339809bcbceSSrinivas Kandagatla 
2340809bcbceSSrinivas Kandagatla 	return ret;
2341809bcbceSSrinivas Kandagatla }
2342809bcbceSSrinivas Kandagatla 
2343809bcbceSSrinivas Kandagatla static unsigned long swclk_recalc_rate(struct clk_hw *hw,
2344809bcbceSSrinivas Kandagatla 				       unsigned long parent_rate)
2345809bcbceSSrinivas Kandagatla {
2346809bcbceSSrinivas Kandagatla 	return parent_rate / 2;
2347809bcbceSSrinivas Kandagatla }
2348809bcbceSSrinivas Kandagatla 
2349809bcbceSSrinivas Kandagatla static const struct clk_ops swclk_gate_ops = {
2350809bcbceSSrinivas Kandagatla 	.prepare = swclk_gate_enable,
2351809bcbceSSrinivas Kandagatla 	.unprepare = swclk_gate_disable,
2352809bcbceSSrinivas Kandagatla 	.is_enabled = swclk_gate_is_enabled,
2353809bcbceSSrinivas Kandagatla 	.recalc_rate = swclk_recalc_rate,
2354809bcbceSSrinivas Kandagatla };
2355809bcbceSSrinivas Kandagatla 
235627dc72b4SJerome Brunet static int wsa_macro_register_mclk_output(struct wsa_macro *wsa)
2357809bcbceSSrinivas Kandagatla {
2358809bcbceSSrinivas Kandagatla 	struct device *dev = wsa->dev;
2359809bcbceSSrinivas Kandagatla 	const char *parent_clk_name;
2360809bcbceSSrinivas Kandagatla 	const char *clk_name = "mclk";
2361809bcbceSSrinivas Kandagatla 	struct clk_hw *hw;
2362809bcbceSSrinivas Kandagatla 	struct clk_init_data init;
2363809bcbceSSrinivas Kandagatla 	int ret;
2364809bcbceSSrinivas Kandagatla 
2365*05a41340SSrinivas Kandagatla 	parent_clk_name = __clk_get_name(wsa->npl);
2366809bcbceSSrinivas Kandagatla 
2367809bcbceSSrinivas Kandagatla 	init.name = clk_name;
2368809bcbceSSrinivas Kandagatla 	init.ops = &swclk_gate_ops;
2369809bcbceSSrinivas Kandagatla 	init.flags = 0;
2370809bcbceSSrinivas Kandagatla 	init.parent_names = &parent_clk_name;
2371809bcbceSSrinivas Kandagatla 	init.num_parents = 1;
2372809bcbceSSrinivas Kandagatla 	wsa->hw.init = &init;
2373809bcbceSSrinivas Kandagatla 	hw = &wsa->hw;
2374809bcbceSSrinivas Kandagatla 	ret = clk_hw_register(wsa->dev, hw);
2375809bcbceSSrinivas Kandagatla 	if (ret)
237627dc72b4SJerome Brunet 		return ret;
2377809bcbceSSrinivas Kandagatla 
237827dc72b4SJerome Brunet 	return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
2379809bcbceSSrinivas Kandagatla }
2380809bcbceSSrinivas Kandagatla 
2381809bcbceSSrinivas Kandagatla static const struct snd_soc_component_driver wsa_macro_component_drv = {
2382809bcbceSSrinivas Kandagatla 	.name = "WSA MACRO",
2383809bcbceSSrinivas Kandagatla 	.probe = wsa_macro_component_probe,
2384809bcbceSSrinivas Kandagatla 	.controls = wsa_macro_snd_controls,
2385809bcbceSSrinivas Kandagatla 	.num_controls = ARRAY_SIZE(wsa_macro_snd_controls),
23862c4066e5SSrinivas Kandagatla 	.dapm_widgets = wsa_macro_dapm_widgets,
23872c4066e5SSrinivas Kandagatla 	.num_dapm_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets),
23882c4066e5SSrinivas Kandagatla 	.dapm_routes = wsa_audio_map,
23892c4066e5SSrinivas Kandagatla 	.num_dapm_routes = ARRAY_SIZE(wsa_audio_map),
2390809bcbceSSrinivas Kandagatla };
2391809bcbceSSrinivas Kandagatla 
2392809bcbceSSrinivas Kandagatla static int wsa_macro_probe(struct platform_device *pdev)
2393809bcbceSSrinivas Kandagatla {
2394809bcbceSSrinivas Kandagatla 	struct device *dev = &pdev->dev;
2395809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa;
2396809bcbceSSrinivas Kandagatla 	void __iomem *base;
2397809bcbceSSrinivas Kandagatla 	int ret;
2398809bcbceSSrinivas Kandagatla 
2399809bcbceSSrinivas Kandagatla 	wsa = devm_kzalloc(dev, sizeof(*wsa), GFP_KERNEL);
2400809bcbceSSrinivas Kandagatla 	if (!wsa)
2401809bcbceSSrinivas Kandagatla 		return -ENOMEM;
2402809bcbceSSrinivas Kandagatla 
2403e252801dSSrinivas Kandagatla 	wsa->macro = devm_clk_get_optional(dev, "macro");
2404e252801dSSrinivas Kandagatla 	if (IS_ERR(wsa->macro))
2405e252801dSSrinivas Kandagatla 		return PTR_ERR(wsa->macro);
2406809bcbceSSrinivas Kandagatla 
2407e252801dSSrinivas Kandagatla 	wsa->dcodec = devm_clk_get_optional(dev, "dcodec");
2408e252801dSSrinivas Kandagatla 	if (IS_ERR(wsa->dcodec))
2409e252801dSSrinivas Kandagatla 		return PTR_ERR(wsa->dcodec);
2410e252801dSSrinivas Kandagatla 
2411e252801dSSrinivas Kandagatla 	wsa->mclk = devm_clk_get(dev, "mclk");
2412e252801dSSrinivas Kandagatla 	if (IS_ERR(wsa->mclk))
2413e252801dSSrinivas Kandagatla 		return PTR_ERR(wsa->mclk);
2414e252801dSSrinivas Kandagatla 
2415e252801dSSrinivas Kandagatla 	wsa->npl = devm_clk_get(dev, "npl");
2416e252801dSSrinivas Kandagatla 	if (IS_ERR(wsa->npl))
2417e252801dSSrinivas Kandagatla 		return PTR_ERR(wsa->npl);
2418e252801dSSrinivas Kandagatla 
2419e252801dSSrinivas Kandagatla 	wsa->fsgen = devm_clk_get(dev, "fsgen");
2420e252801dSSrinivas Kandagatla 	if (IS_ERR(wsa->fsgen))
2421e252801dSSrinivas Kandagatla 		return PTR_ERR(wsa->fsgen);
2422809bcbceSSrinivas Kandagatla 
2423809bcbceSSrinivas Kandagatla 	base = devm_platform_ioremap_resource(pdev, 0);
2424809bcbceSSrinivas Kandagatla 	if (IS_ERR(base))
2425809bcbceSSrinivas Kandagatla 		return PTR_ERR(base);
2426809bcbceSSrinivas Kandagatla 
2427809bcbceSSrinivas Kandagatla 	wsa->regmap = devm_regmap_init_mmio(dev, base, &wsa_regmap_config);
2428aa505eccSJiasheng Jiang 	if (IS_ERR(wsa->regmap))
2429aa505eccSJiasheng Jiang 		return PTR_ERR(wsa->regmap);
2430809bcbceSSrinivas Kandagatla 
2431809bcbceSSrinivas Kandagatla 	dev_set_drvdata(dev, wsa);
2432809bcbceSSrinivas Kandagatla 
2433809bcbceSSrinivas Kandagatla 	wsa->reset_swr = true;
2434809bcbceSSrinivas Kandagatla 	wsa->dev = dev;
2435809bcbceSSrinivas Kandagatla 
2436809bcbceSSrinivas Kandagatla 	/* set MCLK and NPL rates */
2437e252801dSSrinivas Kandagatla 	clk_set_rate(wsa->mclk, WSA_MACRO_MCLK_FREQ);
2438e252801dSSrinivas Kandagatla 	clk_set_rate(wsa->npl, WSA_MACRO_MCLK_FREQ);
2439809bcbceSSrinivas Kandagatla 
2440e252801dSSrinivas Kandagatla 	ret = clk_prepare_enable(wsa->macro);
2441809bcbceSSrinivas Kandagatla 	if (ret)
2442e252801dSSrinivas Kandagatla 		goto err;
2443809bcbceSSrinivas Kandagatla 
2444e252801dSSrinivas Kandagatla 	ret = clk_prepare_enable(wsa->dcodec);
2445e252801dSSrinivas Kandagatla 	if (ret)
2446e252801dSSrinivas Kandagatla 		goto err_dcodec;
2447e252801dSSrinivas Kandagatla 
2448e252801dSSrinivas Kandagatla 	ret = clk_prepare_enable(wsa->mclk);
2449e252801dSSrinivas Kandagatla 	if (ret)
2450e252801dSSrinivas Kandagatla 		goto err_mclk;
2451e252801dSSrinivas Kandagatla 
2452e252801dSSrinivas Kandagatla 	ret = clk_prepare_enable(wsa->npl);
2453e252801dSSrinivas Kandagatla 	if (ret)
2454e252801dSSrinivas Kandagatla 		goto err_npl;
2455e252801dSSrinivas Kandagatla 
2456e252801dSSrinivas Kandagatla 	ret = clk_prepare_enable(wsa->fsgen);
2457e252801dSSrinivas Kandagatla 	if (ret)
2458e252801dSSrinivas Kandagatla 		goto err_fsgen;
2459e252801dSSrinivas Kandagatla 
2460e252801dSSrinivas Kandagatla 	ret = wsa_macro_register_mclk_output(wsa);
2461e252801dSSrinivas Kandagatla 	if (ret)
2462e252801dSSrinivas Kandagatla 		goto err_clkout;
2463e252801dSSrinivas Kandagatla 
2464809bcbceSSrinivas Kandagatla 
2465809bcbceSSrinivas Kandagatla 	ret = devm_snd_soc_register_component(dev, &wsa_macro_component_drv,
2466809bcbceSSrinivas Kandagatla 					      wsa_macro_dai,
2467809bcbceSSrinivas Kandagatla 					      ARRAY_SIZE(wsa_macro_dai));
2468809bcbceSSrinivas Kandagatla 	if (ret)
2469e252801dSSrinivas Kandagatla 		goto err_clkout;
2470809bcbceSSrinivas Kandagatla 
2471e252801dSSrinivas Kandagatla 	return 0;
2472e252801dSSrinivas Kandagatla 
2473e252801dSSrinivas Kandagatla err_clkout:
2474e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->fsgen);
2475e252801dSSrinivas Kandagatla err_fsgen:
2476e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->npl);
2477e252801dSSrinivas Kandagatla err_npl:
2478e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->mclk);
2479e252801dSSrinivas Kandagatla err_mclk:
2480e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->dcodec);
2481e252801dSSrinivas Kandagatla err_dcodec:
2482e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->macro);
2483809bcbceSSrinivas Kandagatla err:
2484809bcbceSSrinivas Kandagatla 	return ret;
2485809bcbceSSrinivas Kandagatla 
2486809bcbceSSrinivas Kandagatla }
2487809bcbceSSrinivas Kandagatla 
2488809bcbceSSrinivas Kandagatla static int wsa_macro_remove(struct platform_device *pdev)
2489809bcbceSSrinivas Kandagatla {
2490809bcbceSSrinivas Kandagatla 	struct wsa_macro *wsa = dev_get_drvdata(&pdev->dev);
2491809bcbceSSrinivas Kandagatla 
2492e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->macro);
2493e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->dcodec);
2494e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->mclk);
2495e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->npl);
2496e252801dSSrinivas Kandagatla 	clk_disable_unprepare(wsa->fsgen);
2497809bcbceSSrinivas Kandagatla 
2498809bcbceSSrinivas Kandagatla 	return 0;
2499809bcbceSSrinivas Kandagatla }
2500809bcbceSSrinivas Kandagatla 
2501809bcbceSSrinivas Kandagatla static const struct of_device_id wsa_macro_dt_match[] = {
25029d8c6981SSrinivasa Rao Mandadapu 	{.compatible = "qcom,sc7280-lpass-wsa-macro"},
2503809bcbceSSrinivas Kandagatla 	{.compatible = "qcom,sm8250-lpass-wsa-macro"},
2504809bcbceSSrinivas Kandagatla 	{}
2505809bcbceSSrinivas Kandagatla };
2506809bcbceSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wsa_macro_dt_match);
2507809bcbceSSrinivas Kandagatla 
2508809bcbceSSrinivas Kandagatla static struct platform_driver wsa_macro_driver = {
2509809bcbceSSrinivas Kandagatla 	.driver = {
2510809bcbceSSrinivas Kandagatla 		.name = "wsa_macro",
2511809bcbceSSrinivas Kandagatla 		.of_match_table = wsa_macro_dt_match,
2512809bcbceSSrinivas Kandagatla 	},
2513809bcbceSSrinivas Kandagatla 	.probe = wsa_macro_probe,
2514809bcbceSSrinivas Kandagatla 	.remove = wsa_macro_remove,
2515809bcbceSSrinivas Kandagatla };
2516809bcbceSSrinivas Kandagatla 
2517809bcbceSSrinivas Kandagatla module_platform_driver(wsa_macro_driver);
2518809bcbceSSrinivas Kandagatla MODULE_DESCRIPTION("WSA macro driver");
2519809bcbceSSrinivas Kandagatla MODULE_LICENSE("GPL");
2520