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