162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci// Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/module.h>
562306a36Sopenharmony_ci#include <linux/init.h>
662306a36Sopenharmony_ci#include <linux/io.h>
762306a36Sopenharmony_ci#include <linux/of.h>
862306a36Sopenharmony_ci#include <linux/platform_device.h>
962306a36Sopenharmony_ci#include <linux/clk.h>
1062306a36Sopenharmony_ci#include <linux/of_clk.h>
1162306a36Sopenharmony_ci#include <linux/clk-provider.h>
1262306a36Sopenharmony_ci#include <sound/soc.h>
1362306a36Sopenharmony_ci#include <sound/soc-dapm.h>
1462306a36Sopenharmony_ci#include <linux/pm_runtime.h>
1562306a36Sopenharmony_ci#include <linux/of_platform.h>
1662306a36Sopenharmony_ci#include <sound/tlv.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "lpass-macro-common.h"
1962306a36Sopenharmony_ci#include "lpass-wsa-macro.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL	(0x0000)
2262306a36Sopenharmony_ci#define CDC_WSA_MCLK_EN_MASK			BIT(0)
2362306a36Sopenharmony_ci#define CDC_WSA_MCLK_ENABLE			BIT(0)
2462306a36Sopenharmony_ci#define CDC_WSA_MCLK_DISABLE			0
2562306a36Sopenharmony_ci#define CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL	(0x0004)
2662306a36Sopenharmony_ci#define CDC_WSA_FS_CNT_EN_MASK			BIT(0)
2762306a36Sopenharmony_ci#define CDC_WSA_FS_CNT_ENABLE			BIT(0)
2862306a36Sopenharmony_ci#define CDC_WSA_FS_CNT_DISABLE			0
2962306a36Sopenharmony_ci#define CDC_WSA_CLK_RST_CTRL_SWR_CONTROL	(0x0008)
3062306a36Sopenharmony_ci#define CDC_WSA_SWR_CLK_EN_MASK			BIT(0)
3162306a36Sopenharmony_ci#define CDC_WSA_SWR_CLK_ENABLE			BIT(0)
3262306a36Sopenharmony_ci#define CDC_WSA_SWR_RST_EN_MASK			BIT(1)
3362306a36Sopenharmony_ci#define CDC_WSA_SWR_RST_ENABLE			BIT(1)
3462306a36Sopenharmony_ci#define CDC_WSA_SWR_RST_DISABLE			0
3562306a36Sopenharmony_ci#define CDC_WSA_TOP_TOP_CFG0			(0x0080)
3662306a36Sopenharmony_ci#define CDC_WSA_TOP_TOP_CFG1			(0x0084)
3762306a36Sopenharmony_ci#define CDC_WSA_TOP_FREQ_MCLK			(0x0088)
3862306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_BUS_SEL		(0x008C)
3962306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_EN0			(0x0090)
4062306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_EN1			(0x0094)
4162306a36Sopenharmony_ci#define CDC_WSA_TOP_DEBUG_DSM_LB		(0x0098)
4262306a36Sopenharmony_ci#define CDC_WSA_TOP_RX_I2S_CTL			(0x009C)
4362306a36Sopenharmony_ci#define CDC_WSA_TOP_TX_I2S_CTL			(0x00A0)
4462306a36Sopenharmony_ci#define CDC_WSA_TOP_I2S_CLK			(0x00A4)
4562306a36Sopenharmony_ci#define CDC_WSA_TOP_I2S_RESET			(0x00A8)
4662306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT0_CFG0		(0x0100)
4762306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK	GENMASK(2, 0)
4862306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK	GENMASK(5, 3)
4962306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT0_CFG1		(0x0104)
5062306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_2_SEL_MASK		GENMASK(2, 0)
5162306a36Sopenharmony_ci#define CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK	GENMASK(5, 3)
5262306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT1_CFG0		(0x0108)
5362306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_INT1_CFG1		(0x010C)
5462306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_MIX_CFG0		(0x0110)
5562306a36Sopenharmony_ci#define CDC_WSA_RX_MIX_TX1_SEL_MASK		GENMASK(5, 3)
5662306a36Sopenharmony_ci#define CDC_WSA_RX_MIX_TX1_SEL_SHFT		3
5762306a36Sopenharmony_ci#define CDC_WSA_RX_MIX_TX0_SEL_MASK		GENMASK(2, 0)
5862306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_RX_EC_CFG0		(0x0114)
5962306a36Sopenharmony_ci#define CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0	(0x0118)
6062306a36Sopenharmony_ci#define CDC_WSA_TX0_SPKR_PROT_PATH_CTL		(0x0244)
6162306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_RESET_MASK		BIT(5)
6262306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_RESET		BIT(5)
6362306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_NO_RESET		0
6462306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK	BIT(4)
6562306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_CLK_ENABLE		BIT(4)
6662306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE	0
6762306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK	GENMASK(3, 0)
6862306a36Sopenharmony_ci#define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K	0
6962306a36Sopenharmony_ci#define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0		(0x0248)
7062306a36Sopenharmony_ci#define CDC_WSA_TX1_SPKR_PROT_PATH_CTL		(0x0264)
7162306a36Sopenharmony_ci#define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0		(0x0268)
7262306a36Sopenharmony_ci#define CDC_WSA_TX2_SPKR_PROT_PATH_CTL		(0x0284)
7362306a36Sopenharmony_ci#define CDC_WSA_TX2_SPKR_PROT_PATH_CFG0		(0x0288)
7462306a36Sopenharmony_ci#define CDC_WSA_TX3_SPKR_PROT_PATH_CTL		(0x02A4)
7562306a36Sopenharmony_ci#define CDC_WSA_TX3_SPKR_PROT_PATH_CFG0		(0x02A8)
7662306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_CFG			(0x0340)
7762306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_CLR_COMMIT		(0x0344)
7862306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN1_MASK0		(0x0360)
7962306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN1_STATUS0		(0x0368)
8062306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN1_CLEAR0		(0x0370)
8162306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN2_MASK0		(0x0380)
8262306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN2_STATUS0		(0x0388)
8362306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_PIN2_CLEAR0		(0x0390)
8462306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_LEVEL0		(0x03C0)
8562306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_BYPASS0		(0x03C8)
8662306a36Sopenharmony_ci#define CDC_WSA_INTR_CTRL_SET0			(0x03D0)
8762306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CTL			(0x0400)
8862306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_CLK_EN_MASK		BIT(5)
8962306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_CLK_ENABLE		BIT(5)
9062306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_CLK_DISABLE		0
9162306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK	BIT(4)
9262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_PGA_MUTE_ENABLE		BIT(4)
9362306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_PGA_MUTE_DISABLE	0
9462306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG0		(0x0404)
9562306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_COMP_EN_MASK		BIT(1)
9662306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_COMP_ENABLE		BIT(1)
9762306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_EN_MASK		BIT(2)
9862306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_ENABLE		BIT(2)
9962306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SPKR_RATE_MASK		BIT(3)
10062306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072	BIT(3)
10162306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG1		(0x0408)
10262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SMART_BST_EN_MASK	BIT(0)
10362306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SMART_BST_ENABLE	BIT(0)
10462306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_SMART_BST_DISABLE	0
10562306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG2		(0x040C)
10662306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_CFG3		(0x0410)
10762306a36Sopenharmony_ci#define CDC_WSA_RX_DC_DCOEFF_MASK		GENMASK(1, 0)
10862306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_VOL_CTL			(0x0414)
10962306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_CTL		(0x0418)
11062306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_MIX_CLK_EN_MASK		BIT(5)
11162306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_MIX_CLK_ENABLE		BIT(5)
11262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_MIX_CLK_DISABLE		0
11362306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_CFG		(0x041C)
11462306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_VOL_MIX_CTL		(0x0420)
11562306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC0		(0x0424)
11662306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC1		(0x0428)
11762306a36Sopenharmony_ci#define CDC_WSA_RX_PGA_HALF_DB_MASK		BIT(0)
11862306a36Sopenharmony_ci#define CDC_WSA_RX_PGA_HALF_DB_ENABLE		BIT(0)
11962306a36Sopenharmony_ci#define CDC_WSA_RX_PGA_HALF_DB_DISABLE		0
12062306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC2		(0x042C)
12162306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC3		(0x0430)
12262306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_SCALE_MASK		GENMASK(1, 0)
12362306a36Sopenharmony_ci#define CDC_WSA_RX_PATH_HD2_ALPHA_MASK		GENMASK(5, 2)
12462306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC5		(0x0438)
12562306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC6		(0x043C)
12662306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_SEC7		(0x0440)
12762306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_SEC0		(0x0444)
12862306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_MIX_SEC1		(0x0448)
12962306a36Sopenharmony_ci#define CDC_WSA_RX0_RX_PATH_DSMDEM_CTL		(0x044C)
13062306a36Sopenharmony_ci#define CDC_WSA_RX_DSMDEM_CLK_EN_MASK		BIT(0)
13162306a36Sopenharmony_ci#define CDC_WSA_RX_DSMDEM_CLK_ENABLE		BIT(0)
13262306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CTL			(0x0480)
13362306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG0		(0x0484)
13462306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG1		(0x0488)
13562306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG2		(0x048C)
13662306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_CFG3		(0x0490)
13762306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_VOL_CTL			(0x0494)
13862306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_CTL		(0x0498)
13962306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_CFG		(0x049C)
14062306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_VOL_MIX_CTL		(0x04A0)
14162306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC0		(0x04A4)
14262306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC1		(0x04A8)
14362306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC2		(0x04AC)
14462306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC3		(0x04B0)
14562306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC5		(0x04B8)
14662306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC6		(0x04BC)
14762306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_SEC7		(0x04C0)
14862306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_SEC0		(0x04C4)
14962306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_MIX_SEC1		(0x04C8)
15062306a36Sopenharmony_ci#define CDC_WSA_RX1_RX_PATH_DSMDEM_CTL		(0x04CC)
15162306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_PATH_CTL		(0x0500)
15262306a36Sopenharmony_ci#define CDC_WSA_BOOST_PATH_CLK_EN_MASK		BIT(4)
15362306a36Sopenharmony_ci#define CDC_WSA_BOOST_PATH_CLK_ENABLE		BIT(4)
15462306a36Sopenharmony_ci#define CDC_WSA_BOOST_PATH_CLK_DISABLE		0
15562306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_CTL		(0x0504)
15662306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_CFG1		(0x0508)
15762306a36Sopenharmony_ci#define CDC_WSA_BOOST0_BOOST_CFG2		(0x050C)
15862306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_PATH_CTL		(0x0540)
15962306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_CTL		(0x0544)
16062306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_CFG1		(0x0548)
16162306a36Sopenharmony_ci#define CDC_WSA_BOOST1_BOOST_CFG2		(0x054C)
16262306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL0			(0x0580)
16362306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_CLK_EN_MASK		BIT(0)
16462306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_CLK_ENABLE		BIT(0)
16562306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_SOFT_RST_MASK		BIT(1)
16662306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_SOFT_RST_ENABLE	BIT(1)
16762306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_HALT_MASK		BIT(2)
16862306a36Sopenharmony_ci#define CDC_WSA_COMPANDER_HALT			BIT(2)
16962306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL1			(0x0584)
17062306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL2			(0x0588)
17162306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL3			(0x058C)
17262306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL4			(0x0590)
17362306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL5			(0x0594)
17462306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL6			(0x0598)
17562306a36Sopenharmony_ci#define CDC_WSA_COMPANDER0_CTL7			(0x059C)
17662306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL0			(0x05C0)
17762306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL1			(0x05C4)
17862306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL2			(0x05C8)
17962306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL3			(0x05CC)
18062306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL4			(0x05D0)
18162306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL5			(0x05D4)
18262306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL6			(0x05D8)
18362306a36Sopenharmony_ci#define CDC_WSA_COMPANDER1_CTL7			(0x05DC)
18462306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP0_CRC			(0x0600)
18562306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_CLK_EN_MASK		BIT(0)
18662306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_CLK_ENABLE		BIT(0)
18762306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL		(0x0604)
18862306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_EN_MASK		BIT(0)
18962306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP_ENABLE			BIT(0)
19062306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP1_CRC			(0x0640)
19162306a36Sopenharmony_ci#define CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL		(0x0644)
19262306a36Sopenharmony_ci#define CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL	(0x0680)
19362306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_CLK_EN_MASK		BIT(0)
19462306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_CLK_ENABLE		BIT(0)
19562306a36Sopenharmony_ci#define CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0		(0x0684)
19662306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK	GENMASK(4, 1)
19762306a36Sopenharmony_ci#define CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K	BIT(3)
19862306a36Sopenharmony_ci#define CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL	(0x06C0)
19962306a36Sopenharmony_ci#define CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0		(0x06C4)
20062306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL	(0x0700)
20162306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_CTL0		(0x0704)
20262306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_CTL1		(0x0708)
20362306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_FIFO_CTL		(0x070C)
20462306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB	(0x0710)
20562306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB	(0x0714)
20662306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB	(0x0718)
20762306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB	(0x071C)
20862306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC0_STATUS_FIFO		(0x0720)
20962306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL		(0x0740)
21062306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_CTL0		(0x0744)
21162306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_CTL1		(0x0748)
21262306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_FIFO_CTL		(0x074C)
21362306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB (0x0750)
21462306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB (0x0754)
21562306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB (0x0758)
21662306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB (0x075C)
21762306a36Sopenharmony_ci#define CDC_WSA_SPLINE_ASRC1_STATUS_FIFO	(0x0760)
21862306a36Sopenharmony_ci#define WSA_MAX_OFFSET				(0x0760)
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci#define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
22162306a36Sopenharmony_ci			SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
22262306a36Sopenharmony_ci			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
22362306a36Sopenharmony_ci#define WSA_MACRO_RX_MIX_RATES (SNDRV_PCM_RATE_48000 |\
22462306a36Sopenharmony_ci			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
22562306a36Sopenharmony_ci#define WSA_MACRO_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
22662306a36Sopenharmony_ci		SNDRV_PCM_FMTBIT_S24_LE |\
22762306a36Sopenharmony_ci		SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci#define WSA_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
23062306a36Sopenharmony_ci			SNDRV_PCM_RATE_48000)
23162306a36Sopenharmony_ci#define WSA_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
23262306a36Sopenharmony_ci		SNDRV_PCM_FMTBIT_S24_LE |\
23362306a36Sopenharmony_ci		SNDRV_PCM_FMTBIT_S24_3LE)
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci#define NUM_INTERPOLATORS 2
23662306a36Sopenharmony_ci#define WSA_NUM_CLKS_MAX	5
23762306a36Sopenharmony_ci#define WSA_MACRO_MCLK_FREQ 19200000
23862306a36Sopenharmony_ci#define WSA_MACRO_MUX_INP_MASK2 0x38
23962306a36Sopenharmony_ci#define WSA_MACRO_MUX_CFG_OFFSET 0x8
24062306a36Sopenharmony_ci#define WSA_MACRO_MUX_CFG1_OFFSET 0x4
24162306a36Sopenharmony_ci#define WSA_MACRO_RX_COMP_OFFSET 0x40
24262306a36Sopenharmony_ci#define WSA_MACRO_RX_SOFTCLIP_OFFSET 0x40
24362306a36Sopenharmony_ci#define WSA_MACRO_RX_PATH_OFFSET 0x80
24462306a36Sopenharmony_ci#define WSA_MACRO_RX_PATH_CFG3_OFFSET 0x10
24562306a36Sopenharmony_ci#define WSA_MACRO_RX_PATH_DSMDEM_OFFSET 0x4C
24662306a36Sopenharmony_ci#define WSA_MACRO_FS_RATE_MASK 0x0F
24762306a36Sopenharmony_ci#define WSA_MACRO_EC_MIX_TX0_MASK 0x03
24862306a36Sopenharmony_ci#define WSA_MACRO_EC_MIX_TX1_MASK 0x18
24962306a36Sopenharmony_ci#define WSA_MACRO_MAX_DMA_CH_PER_PORT 0x2
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cienum {
25262306a36Sopenharmony_ci	WSA_MACRO_GAIN_OFFSET_M1P5_DB,
25362306a36Sopenharmony_ci	WSA_MACRO_GAIN_OFFSET_0_DB,
25462306a36Sopenharmony_ci};
25562306a36Sopenharmony_cienum {
25662306a36Sopenharmony_ci	WSA_MACRO_RX0 = 0,
25762306a36Sopenharmony_ci	WSA_MACRO_RX1,
25862306a36Sopenharmony_ci	WSA_MACRO_RX_MIX,
25962306a36Sopenharmony_ci	WSA_MACRO_RX_MIX0 = WSA_MACRO_RX_MIX,
26062306a36Sopenharmony_ci	WSA_MACRO_RX_MIX1,
26162306a36Sopenharmony_ci	WSA_MACRO_RX_MAX,
26262306a36Sopenharmony_ci};
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cienum {
26562306a36Sopenharmony_ci	WSA_MACRO_TX0 = 0,
26662306a36Sopenharmony_ci	WSA_MACRO_TX1,
26762306a36Sopenharmony_ci	WSA_MACRO_TX_MAX,
26862306a36Sopenharmony_ci};
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cienum {
27162306a36Sopenharmony_ci	WSA_MACRO_EC0_MUX = 0,
27262306a36Sopenharmony_ci	WSA_MACRO_EC1_MUX,
27362306a36Sopenharmony_ci	WSA_MACRO_EC_MUX_MAX,
27462306a36Sopenharmony_ci};
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cienum {
27762306a36Sopenharmony_ci	WSA_MACRO_COMP1, /* SPK_L */
27862306a36Sopenharmony_ci	WSA_MACRO_COMP2, /* SPK_R */
27962306a36Sopenharmony_ci	WSA_MACRO_COMP_MAX
28062306a36Sopenharmony_ci};
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cienum {
28362306a36Sopenharmony_ci	WSA_MACRO_SOFTCLIP0, /* RX0 */
28462306a36Sopenharmony_ci	WSA_MACRO_SOFTCLIP1, /* RX1 */
28562306a36Sopenharmony_ci	WSA_MACRO_SOFTCLIP_MAX
28662306a36Sopenharmony_ci};
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_cienum {
28962306a36Sopenharmony_ci	INTn_1_INP_SEL_ZERO = 0,
29062306a36Sopenharmony_ci	INTn_1_INP_SEL_RX0,
29162306a36Sopenharmony_ci	INTn_1_INP_SEL_RX1,
29262306a36Sopenharmony_ci	INTn_1_INP_SEL_RX2,
29362306a36Sopenharmony_ci	INTn_1_INP_SEL_RX3,
29462306a36Sopenharmony_ci	INTn_1_INP_SEL_DEC0,
29562306a36Sopenharmony_ci	INTn_1_INP_SEL_DEC1,
29662306a36Sopenharmony_ci};
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cienum {
29962306a36Sopenharmony_ci	INTn_2_INP_SEL_ZERO = 0,
30062306a36Sopenharmony_ci	INTn_2_INP_SEL_RX0,
30162306a36Sopenharmony_ci	INTn_2_INP_SEL_RX1,
30262306a36Sopenharmony_ci	INTn_2_INP_SEL_RX2,
30362306a36Sopenharmony_ci	INTn_2_INP_SEL_RX3,
30462306a36Sopenharmony_ci};
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_cistruct interp_sample_rate {
30762306a36Sopenharmony_ci	int sample_rate;
30862306a36Sopenharmony_ci	int rate_val;
30962306a36Sopenharmony_ci};
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistatic struct interp_sample_rate int_prim_sample_rate_val[] = {
31262306a36Sopenharmony_ci	{8000, 0x0},	/* 8K */
31362306a36Sopenharmony_ci	{16000, 0x1},	/* 16K */
31462306a36Sopenharmony_ci	{24000, -EINVAL},/* 24K */
31562306a36Sopenharmony_ci	{32000, 0x3},	/* 32K */
31662306a36Sopenharmony_ci	{48000, 0x4},	/* 48K */
31762306a36Sopenharmony_ci	{96000, 0x5},	/* 96K */
31862306a36Sopenharmony_ci	{192000, 0x6},	/* 192K */
31962306a36Sopenharmony_ci	{384000, 0x7},	/* 384K */
32062306a36Sopenharmony_ci	{44100, 0x8}, /* 44.1K */
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic struct interp_sample_rate int_mix_sample_rate_val[] = {
32462306a36Sopenharmony_ci	{48000, 0x4},	/* 48K */
32562306a36Sopenharmony_ci	{96000, 0x5},	/* 96K */
32662306a36Sopenharmony_ci	{192000, 0x6},	/* 192K */
32762306a36Sopenharmony_ci};
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_cienum {
33062306a36Sopenharmony_ci	WSA_MACRO_AIF_INVALID = 0,
33162306a36Sopenharmony_ci	WSA_MACRO_AIF1_PB,
33262306a36Sopenharmony_ci	WSA_MACRO_AIF_MIX1_PB,
33362306a36Sopenharmony_ci	WSA_MACRO_AIF_VI,
33462306a36Sopenharmony_ci	WSA_MACRO_AIF_ECHO,
33562306a36Sopenharmony_ci	WSA_MACRO_MAX_DAIS,
33662306a36Sopenharmony_ci};
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_cistruct wsa_macro {
33962306a36Sopenharmony_ci	struct device *dev;
34062306a36Sopenharmony_ci	int comp_enabled[WSA_MACRO_COMP_MAX];
34162306a36Sopenharmony_ci	int ec_hq[WSA_MACRO_RX1 + 1];
34262306a36Sopenharmony_ci	u16 prim_int_users[WSA_MACRO_RX1 + 1];
34362306a36Sopenharmony_ci	u16 wsa_mclk_users;
34462306a36Sopenharmony_ci	unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS];
34562306a36Sopenharmony_ci	unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS];
34662306a36Sopenharmony_ci	int rx_port_value[WSA_MACRO_RX_MAX];
34762306a36Sopenharmony_ci	int ear_spkr_gain;
34862306a36Sopenharmony_ci	int spkr_gain_offset;
34962306a36Sopenharmony_ci	int spkr_mode;
35062306a36Sopenharmony_ci	int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX];
35162306a36Sopenharmony_ci	int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX];
35262306a36Sopenharmony_ci	struct regmap *regmap;
35362306a36Sopenharmony_ci	struct clk *mclk;
35462306a36Sopenharmony_ci	struct clk *npl;
35562306a36Sopenharmony_ci	struct clk *macro;
35662306a36Sopenharmony_ci	struct clk *dcodec;
35762306a36Sopenharmony_ci	struct clk *fsgen;
35862306a36Sopenharmony_ci	struct clk_hw hw;
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci#define to_wsa_macro(_hw) container_of(_hw, struct wsa_macro, hw)
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_cistatic const char *const rx_text[] = {
36562306a36Sopenharmony_ci	"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1"
36662306a36Sopenharmony_ci};
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_cistatic const char *const rx_mix_text[] = {
36962306a36Sopenharmony_ci	"ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1"
37062306a36Sopenharmony_ci};
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistatic const char *const rx_mix_ec_text[] = {
37362306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX0", "RX_MIX_TX1"
37462306a36Sopenharmony_ci};
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_cistatic const char *const rx_mux_text[] = {
37762306a36Sopenharmony_ci	"ZERO", "AIF1_PB", "AIF_MIX1_PB"
37862306a36Sopenharmony_ci};
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_cistatic const char *const rx_sidetone_mix_text[] = {
38162306a36Sopenharmony_ci	"ZERO", "SRC0"
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_cistatic const char * const wsa_macro_ear_spkr_pa_gain_text[] = {
38562306a36Sopenharmony_ci	"G_DEFAULT", "G_0_DB", "G_1_DB", "G_2_DB", "G_3_DB",
38662306a36Sopenharmony_ci	"G_4_DB", "G_5_DB", "G_6_DB"
38762306a36Sopenharmony_ci};
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(wsa_macro_ear_spkr_pa_gain_enum,
39062306a36Sopenharmony_ci				wsa_macro_ear_spkr_pa_gain_text);
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci/* RX INT0 */
39362306a36Sopenharmony_cistatic const struct soc_enum rx0_prim_inp0_chain_enum =
39462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
39562306a36Sopenharmony_ci		0, 7, rx_text);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_cistatic const struct soc_enum rx0_prim_inp1_chain_enum =
39862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0,
39962306a36Sopenharmony_ci		3, 7, rx_text);
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_cistatic const struct soc_enum rx0_prim_inp2_chain_enum =
40262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
40362306a36Sopenharmony_ci		3, 7, rx_text);
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_cistatic const struct soc_enum rx0_mix_chain_enum =
40662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1,
40762306a36Sopenharmony_ci		0, 5, rx_mix_text);
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_cistatic const struct soc_enum rx0_sidetone_mix_enum =
41062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text);
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_prim_inp0_mux =
41362306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum);
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_prim_inp1_mux =
41662306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum);
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_prim_inp2_mux =
41962306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum);
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_mix_mux =
42262306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum);
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx0_sidetone_mix_mux =
42562306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum);
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_ci/* RX INT1 */
42862306a36Sopenharmony_cistatic const struct soc_enum rx1_prim_inp0_chain_enum =
42962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
43062306a36Sopenharmony_ci		0, 7, rx_text);
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistatic const struct soc_enum rx1_prim_inp1_chain_enum =
43362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0,
43462306a36Sopenharmony_ci		3, 7, rx_text);
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_cistatic const struct soc_enum rx1_prim_inp2_chain_enum =
43762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
43862306a36Sopenharmony_ci		3, 7, rx_text);
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_cistatic const struct soc_enum rx1_mix_chain_enum =
44162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1,
44262306a36Sopenharmony_ci		0, 5, rx_mix_text);
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_prim_inp0_mux =
44562306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum);
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_prim_inp1_mux =
44862306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum);
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_prim_inp2_mux =
45162306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum);
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx1_mix_mux =
45462306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum);
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_cistatic const struct soc_enum rx_mix_ec0_enum =
45762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0,
45862306a36Sopenharmony_ci		0, 3, rx_mix_ec_text);
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_cistatic const struct soc_enum rx_mix_ec1_enum =
46162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0,
46262306a36Sopenharmony_ci		3, 3, rx_mix_ec_text);
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_mix_ec0_mux =
46562306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA RX_MIX EC0_Mux", rx_mix_ec0_enum);
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_mix_ec1_mux =
46862306a36Sopenharmony_ci	SOC_DAPM_ENUM("WSA RX_MIX EC1_Mux", rx_mix_ec1_enum);
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_cistatic const struct reg_default wsa_defaults[] = {
47162306a36Sopenharmony_ci	/* WSA Macro */
47262306a36Sopenharmony_ci	{ CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL, 0x00},
47362306a36Sopenharmony_ci	{ CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00},
47462306a36Sopenharmony_ci	{ CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 0x00},
47562306a36Sopenharmony_ci	{ CDC_WSA_TOP_TOP_CFG0, 0x00},
47662306a36Sopenharmony_ci	{ CDC_WSA_TOP_TOP_CFG1, 0x00},
47762306a36Sopenharmony_ci	{ CDC_WSA_TOP_FREQ_MCLK, 0x00},
47862306a36Sopenharmony_ci	{ CDC_WSA_TOP_DEBUG_BUS_SEL, 0x00},
47962306a36Sopenharmony_ci	{ CDC_WSA_TOP_DEBUG_EN0, 0x00},
48062306a36Sopenharmony_ci	{ CDC_WSA_TOP_DEBUG_EN1, 0x00},
48162306a36Sopenharmony_ci	{ CDC_WSA_TOP_DEBUG_DSM_LB, 0x88},
48262306a36Sopenharmony_ci	{ CDC_WSA_TOP_RX_I2S_CTL, 0x0C},
48362306a36Sopenharmony_ci	{ CDC_WSA_TOP_TX_I2S_CTL, 0x0C},
48462306a36Sopenharmony_ci	{ CDC_WSA_TOP_I2S_CLK, 0x02},
48562306a36Sopenharmony_ci	{ CDC_WSA_TOP_I2S_RESET, 0x00},
48662306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 0x00},
48762306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 0x00},
48862306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 0x00},
48962306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 0x00},
49062306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, 0x00},
49162306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_RX_EC_CFG0, 0x00},
49262306a36Sopenharmony_ci	{ CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0, 0x00},
49362306a36Sopenharmony_ci	{ CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x02},
49462306a36Sopenharmony_ci	{ CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x00},
49562306a36Sopenharmony_ci	{ CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x02},
49662306a36Sopenharmony_ci	{ CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x00},
49762306a36Sopenharmony_ci	{ CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x02},
49862306a36Sopenharmony_ci	{ CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x00},
49962306a36Sopenharmony_ci	{ CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x02},
50062306a36Sopenharmony_ci	{ CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x00},
50162306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_CFG, 0x00},
50262306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_CLR_COMMIT, 0x00},
50362306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_PIN1_MASK0, 0xFF},
50462306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_PIN1_STATUS0, 0x00},
50562306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_PIN1_CLEAR0, 0x00},
50662306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_PIN2_MASK0, 0xFF},
50762306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_PIN2_STATUS0, 0x00},
50862306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_PIN2_CLEAR0, 0x00},
50962306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_LEVEL0, 0x00},
51062306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_BYPASS0, 0x00},
51162306a36Sopenharmony_ci	{ CDC_WSA_INTR_CTRL_SET0, 0x00},
51262306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_CTL, 0x04},
51362306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_CFG0, 0x00},
51462306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_CFG1, 0x64},
51562306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_CFG2, 0x8F},
51662306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_CFG3, 0x00},
51762306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_VOL_CTL, 0x00},
51862306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_MIX_CTL, 0x04},
51962306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_MIX_CFG, 0x7E},
52062306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_VOL_MIX_CTL, 0x00},
52162306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC0, 0x04},
52262306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC1, 0x08},
52362306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC2, 0x00},
52462306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC3, 0x00},
52562306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC5, 0x00},
52662306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC6, 0x00},
52762306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_SEC7, 0x00},
52862306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_MIX_SEC0, 0x08},
52962306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_MIX_SEC1, 0x00},
53062306a36Sopenharmony_ci	{ CDC_WSA_RX0_RX_PATH_DSMDEM_CTL, 0x00},
53162306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_CFG0, 0x00},
53262306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_CFG1, 0x64},
53362306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_CFG2, 0x8F},
53462306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_CFG3, 0x00},
53562306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_VOL_CTL, 0x00},
53662306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_MIX_CTL, 0x04},
53762306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_MIX_CFG, 0x7E},
53862306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_VOL_MIX_CTL, 0x00},
53962306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC0, 0x04},
54062306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC1, 0x08},
54162306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC2, 0x00},
54262306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC3, 0x00},
54362306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC5, 0x00},
54462306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC6, 0x00},
54562306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_SEC7, 0x00},
54662306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_MIX_SEC0, 0x08},
54762306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_MIX_SEC1, 0x00},
54862306a36Sopenharmony_ci	{ CDC_WSA_RX1_RX_PATH_DSMDEM_CTL, 0x00},
54962306a36Sopenharmony_ci	{ CDC_WSA_BOOST0_BOOST_PATH_CTL, 0x00},
55062306a36Sopenharmony_ci	{ CDC_WSA_BOOST0_BOOST_CTL, 0xD0},
55162306a36Sopenharmony_ci	{ CDC_WSA_BOOST0_BOOST_CFG1, 0x89},
55262306a36Sopenharmony_ci	{ CDC_WSA_BOOST0_BOOST_CFG2, 0x04},
55362306a36Sopenharmony_ci	{ CDC_WSA_BOOST1_BOOST_PATH_CTL, 0x00},
55462306a36Sopenharmony_ci	{ CDC_WSA_BOOST1_BOOST_CTL, 0xD0},
55562306a36Sopenharmony_ci	{ CDC_WSA_BOOST1_BOOST_CFG1, 0x89},
55662306a36Sopenharmony_ci	{ CDC_WSA_BOOST1_BOOST_CFG2, 0x04},
55762306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL0, 0x60},
55862306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL1, 0xDB},
55962306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL2, 0xFF},
56062306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL3, 0x35},
56162306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL4, 0xFF},
56262306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL5, 0x00},
56362306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL6, 0x01},
56462306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER0_CTL7, 0x28},
56562306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL0, 0x60},
56662306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL1, 0xDB},
56762306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL2, 0xFF},
56862306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL3, 0x35},
56962306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL4, 0xFF},
57062306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL5, 0x00},
57162306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL6, 0x01},
57262306a36Sopenharmony_ci	{ CDC_WSA_COMPANDER1_CTL7, 0x28},
57362306a36Sopenharmony_ci	{ CDC_WSA_SOFTCLIP0_CRC, 0x00},
57462306a36Sopenharmony_ci	{ CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38},
57562306a36Sopenharmony_ci	{ CDC_WSA_SOFTCLIP1_CRC, 0x00},
57662306a36Sopenharmony_ci	{ CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38},
57762306a36Sopenharmony_ci	{ CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL, 0x00},
57862306a36Sopenharmony_ci	{ CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0, 0x01},
57962306a36Sopenharmony_ci	{ CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL, 0x00},
58062306a36Sopenharmony_ci	{ CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0, 0x01},
58162306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL, 0x00},
58262306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_CTL0, 0x00},
58362306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_CTL1, 0x00},
58462306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_FIFO_CTL, 0xA8},
58562306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00},
58662306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00},
58762306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00},
58862306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00},
58962306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC0_STATUS_FIFO, 0x00},
59062306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL, 0x00},
59162306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_CTL0, 0x00},
59262306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_CTL1, 0x00},
59362306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_FIFO_CTL, 0xA8},
59462306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00},
59562306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00},
59662306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00},
59762306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00},
59862306a36Sopenharmony_ci	{ CDC_WSA_SPLINE_ASRC1_STATUS_FIFO, 0x00},
59962306a36Sopenharmony_ci};
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_cistatic bool wsa_is_wronly_register(struct device *dev,
60262306a36Sopenharmony_ci					unsigned int reg)
60362306a36Sopenharmony_ci{
60462306a36Sopenharmony_ci	switch (reg) {
60562306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_CLR_COMMIT:
60662306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN1_CLEAR0:
60762306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN2_CLEAR0:
60862306a36Sopenharmony_ci		return true;
60962306a36Sopenharmony_ci	}
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	return false;
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_cistatic bool wsa_is_rw_register(struct device *dev, unsigned int reg)
61562306a36Sopenharmony_ci{
61662306a36Sopenharmony_ci	switch (reg) {
61762306a36Sopenharmony_ci	case CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL:
61862306a36Sopenharmony_ci	case CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL:
61962306a36Sopenharmony_ci	case CDC_WSA_CLK_RST_CTRL_SWR_CONTROL:
62062306a36Sopenharmony_ci	case CDC_WSA_TOP_TOP_CFG0:
62162306a36Sopenharmony_ci	case CDC_WSA_TOP_TOP_CFG1:
62262306a36Sopenharmony_ci	case CDC_WSA_TOP_FREQ_MCLK:
62362306a36Sopenharmony_ci	case CDC_WSA_TOP_DEBUG_BUS_SEL:
62462306a36Sopenharmony_ci	case CDC_WSA_TOP_DEBUG_EN0:
62562306a36Sopenharmony_ci	case CDC_WSA_TOP_DEBUG_EN1:
62662306a36Sopenharmony_ci	case CDC_WSA_TOP_DEBUG_DSM_LB:
62762306a36Sopenharmony_ci	case CDC_WSA_TOP_RX_I2S_CTL:
62862306a36Sopenharmony_ci	case CDC_WSA_TOP_TX_I2S_CTL:
62962306a36Sopenharmony_ci	case CDC_WSA_TOP_I2S_CLK:
63062306a36Sopenharmony_ci	case CDC_WSA_TOP_I2S_RESET:
63162306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_RX_INT0_CFG0:
63262306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_RX_INT0_CFG1:
63362306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_RX_INT1_CFG0:
63462306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_RX_INT1_CFG1:
63562306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_RX_MIX_CFG0:
63662306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_RX_EC_CFG0:
63762306a36Sopenharmony_ci	case CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0:
63862306a36Sopenharmony_ci	case CDC_WSA_TX0_SPKR_PROT_PATH_CTL:
63962306a36Sopenharmony_ci	case CDC_WSA_TX0_SPKR_PROT_PATH_CFG0:
64062306a36Sopenharmony_ci	case CDC_WSA_TX1_SPKR_PROT_PATH_CTL:
64162306a36Sopenharmony_ci	case CDC_WSA_TX1_SPKR_PROT_PATH_CFG0:
64262306a36Sopenharmony_ci	case CDC_WSA_TX2_SPKR_PROT_PATH_CTL:
64362306a36Sopenharmony_ci	case CDC_WSA_TX2_SPKR_PROT_PATH_CFG0:
64462306a36Sopenharmony_ci	case CDC_WSA_TX3_SPKR_PROT_PATH_CTL:
64562306a36Sopenharmony_ci	case CDC_WSA_TX3_SPKR_PROT_PATH_CFG0:
64662306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_CFG:
64762306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN1_MASK0:
64862306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN2_MASK0:
64962306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_LEVEL0:
65062306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_BYPASS0:
65162306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_SET0:
65262306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_CTL:
65362306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_CFG0:
65462306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_CFG1:
65562306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_CFG2:
65662306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_CFG3:
65762306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_VOL_CTL:
65862306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_MIX_CTL:
65962306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_MIX_CFG:
66062306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_VOL_MIX_CTL:
66162306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC0:
66262306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC1:
66362306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC2:
66462306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC3:
66562306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC5:
66662306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC6:
66762306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_SEC7:
66862306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_MIX_SEC0:
66962306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_MIX_SEC1:
67062306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_DSMDEM_CTL:
67162306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_CTL:
67262306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_CFG0:
67362306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_CFG1:
67462306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_CFG2:
67562306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_CFG3:
67662306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_VOL_CTL:
67762306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_MIX_CTL:
67862306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_MIX_CFG:
67962306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_VOL_MIX_CTL:
68062306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC0:
68162306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC1:
68262306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC2:
68362306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC3:
68462306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC5:
68562306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC6:
68662306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_SEC7:
68762306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_MIX_SEC0:
68862306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_MIX_SEC1:
68962306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_DSMDEM_CTL:
69062306a36Sopenharmony_ci	case CDC_WSA_BOOST0_BOOST_PATH_CTL:
69162306a36Sopenharmony_ci	case CDC_WSA_BOOST0_BOOST_CTL:
69262306a36Sopenharmony_ci	case CDC_WSA_BOOST0_BOOST_CFG1:
69362306a36Sopenharmony_ci	case CDC_WSA_BOOST0_BOOST_CFG2:
69462306a36Sopenharmony_ci	case CDC_WSA_BOOST1_BOOST_PATH_CTL:
69562306a36Sopenharmony_ci	case CDC_WSA_BOOST1_BOOST_CTL:
69662306a36Sopenharmony_ci	case CDC_WSA_BOOST1_BOOST_CFG1:
69762306a36Sopenharmony_ci	case CDC_WSA_BOOST1_BOOST_CFG2:
69862306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL0:
69962306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL1:
70062306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL2:
70162306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL3:
70262306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL4:
70362306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL5:
70462306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL7:
70562306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL0:
70662306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL1:
70762306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL2:
70862306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL3:
70962306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL4:
71062306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL5:
71162306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL7:
71262306a36Sopenharmony_ci	case CDC_WSA_SOFTCLIP0_CRC:
71362306a36Sopenharmony_ci	case CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL:
71462306a36Sopenharmony_ci	case CDC_WSA_SOFTCLIP1_CRC:
71562306a36Sopenharmony_ci	case CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL:
71662306a36Sopenharmony_ci	case CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL:
71762306a36Sopenharmony_ci	case CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0:
71862306a36Sopenharmony_ci	case CDC_WSA_EC_HQ1_EC_REF_HQ_PATH_CTL:
71962306a36Sopenharmony_ci	case CDC_WSA_EC_HQ1_EC_REF_HQ_CFG0:
72062306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_CLK_RST_CTL:
72162306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_CTL0:
72262306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_CTL1:
72362306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_FIFO_CTL:
72462306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_CLK_RST_CTL:
72562306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_CTL0:
72662306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_CTL1:
72762306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_FIFO_CTL:
72862306a36Sopenharmony_ci		return true;
72962306a36Sopenharmony_ci	}
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_ci	return false;
73262306a36Sopenharmony_ci}
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_cistatic bool wsa_is_writeable_register(struct device *dev, unsigned int reg)
73562306a36Sopenharmony_ci{
73662306a36Sopenharmony_ci	bool ret;
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ci	ret = wsa_is_rw_register(dev, reg);
73962306a36Sopenharmony_ci	if (!ret)
74062306a36Sopenharmony_ci		return wsa_is_wronly_register(dev, reg);
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	return ret;
74362306a36Sopenharmony_ci}
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_cistatic bool wsa_is_readable_register(struct device *dev, unsigned int reg)
74662306a36Sopenharmony_ci{
74762306a36Sopenharmony_ci	switch (reg) {
74862306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_CLR_COMMIT:
74962306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN1_CLEAR0:
75062306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN2_CLEAR0:
75162306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN1_STATUS0:
75262306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN2_STATUS0:
75362306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL6:
75462306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL6:
75562306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB:
75662306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB:
75762306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB:
75862306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB:
75962306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO:
76062306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB:
76162306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB:
76262306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB:
76362306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB:
76462306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO:
76562306a36Sopenharmony_ci		return true;
76662306a36Sopenharmony_ci	}
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci	return wsa_is_rw_register(dev, reg);
76962306a36Sopenharmony_ci}
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_cistatic bool wsa_is_volatile_register(struct device *dev, unsigned int reg)
77262306a36Sopenharmony_ci{
77362306a36Sopenharmony_ci	/* Update volatile list for rx/tx macros */
77462306a36Sopenharmony_ci	switch (reg) {
77562306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN1_STATUS0:
77662306a36Sopenharmony_ci	case CDC_WSA_INTR_CTRL_PIN2_STATUS0:
77762306a36Sopenharmony_ci	case CDC_WSA_COMPANDER0_CTL6:
77862306a36Sopenharmony_ci	case CDC_WSA_COMPANDER1_CTL6:
77962306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_LSB:
78062306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMIN_CNTR_MSB:
78162306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_LSB:
78262306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FMAX_CNTR_MSB:
78362306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC0_STATUS_FIFO:
78462306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_LSB:
78562306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMIN_CNTR_MSB:
78662306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_LSB:
78762306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FMAX_CNTR_MSB:
78862306a36Sopenharmony_ci	case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO:
78962306a36Sopenharmony_ci		return true;
79062306a36Sopenharmony_ci	}
79162306a36Sopenharmony_ci	return false;
79262306a36Sopenharmony_ci}
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_cistatic const struct regmap_config wsa_regmap_config = {
79562306a36Sopenharmony_ci	.name = "wsa_macro",
79662306a36Sopenharmony_ci	.reg_bits = 16,
79762306a36Sopenharmony_ci	.val_bits = 32, /* 8 but with 32 bit read/write */
79862306a36Sopenharmony_ci	.reg_stride = 4,
79962306a36Sopenharmony_ci	.cache_type = REGCACHE_FLAT,
80062306a36Sopenharmony_ci	.reg_defaults = wsa_defaults,
80162306a36Sopenharmony_ci	.num_reg_defaults = ARRAY_SIZE(wsa_defaults),
80262306a36Sopenharmony_ci	.max_register = WSA_MAX_OFFSET,
80362306a36Sopenharmony_ci	.writeable_reg = wsa_is_writeable_register,
80462306a36Sopenharmony_ci	.volatile_reg = wsa_is_volatile_register,
80562306a36Sopenharmony_ci	.readable_reg = wsa_is_readable_register,
80662306a36Sopenharmony_ci};
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci/**
80962306a36Sopenharmony_ci * wsa_macro_set_spkr_mode - Configures speaker compander and smartboost
81062306a36Sopenharmony_ci * settings based on speaker mode.
81162306a36Sopenharmony_ci *
81262306a36Sopenharmony_ci * @component: codec instance
81362306a36Sopenharmony_ci * @mode: Indicates speaker configuration mode.
81462306a36Sopenharmony_ci *
81562306a36Sopenharmony_ci * Returns 0 on success or -EINVAL on error.
81662306a36Sopenharmony_ci */
81762306a36Sopenharmony_ciint wsa_macro_set_spkr_mode(struct snd_soc_component *component, int mode)
81862306a36Sopenharmony_ci{
81962306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_ci	wsa->spkr_mode = mode;
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	switch (mode) {
82462306a36Sopenharmony_ci	case WSA_MACRO_SPKR_MODE_1:
82562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x00);
82662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x00);
82762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00);
82862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x00);
82962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x44);
83062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x44);
83162306a36Sopenharmony_ci		break;
83262306a36Sopenharmony_ci	default:
83362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80);
83462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL3, 0x80, 0x80);
83562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01);
83662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_COMPANDER1_CTL7, 0x01, 0x01);
83762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_BOOST0_BOOST_CTL, 0x7C, 0x58);
83862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, CDC_WSA_BOOST1_BOOST_CTL, 0x7C, 0x58);
83962306a36Sopenharmony_ci		break;
84062306a36Sopenharmony_ci	}
84162306a36Sopenharmony_ci	return 0;
84262306a36Sopenharmony_ci}
84362306a36Sopenharmony_ciEXPORT_SYMBOL(wsa_macro_set_spkr_mode);
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_cistatic int wsa_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai,
84662306a36Sopenharmony_ci						u8 int_prim_fs_rate_reg_val,
84762306a36Sopenharmony_ci						u32 sample_rate)
84862306a36Sopenharmony_ci{
84962306a36Sopenharmony_ci	u8 int_1_mix1_inp;
85062306a36Sopenharmony_ci	u32 j, port;
85162306a36Sopenharmony_ci	u16 int_mux_cfg0, int_mux_cfg1;
85262306a36Sopenharmony_ci	u16 int_fs_reg;
85362306a36Sopenharmony_ci	u8 inp0_sel, inp1_sel, inp2_sel;
85462306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
85562306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_ci	for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) {
85862306a36Sopenharmony_ci		int_1_mix1_inp = port;
85962306a36Sopenharmony_ci		if ((int_1_mix1_inp < WSA_MACRO_RX0) || (int_1_mix1_inp > WSA_MACRO_RX_MIX1)) {
86062306a36Sopenharmony_ci			dev_err(component->dev,	"%s: Invalid RX port, Dai ID is %d\n",
86162306a36Sopenharmony_ci				__func__, dai->id);
86262306a36Sopenharmony_ci			return -EINVAL;
86362306a36Sopenharmony_ci		}
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci		int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0;
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci		/*
86862306a36Sopenharmony_ci		 * Loop through all interpolator MUX inputs and find out
86962306a36Sopenharmony_ci		 * to which interpolator input, the cdc_dma rx port
87062306a36Sopenharmony_ci		 * is connected
87162306a36Sopenharmony_ci		 */
87262306a36Sopenharmony_ci		for (j = 0; j < NUM_INTERPOLATORS; j++) {
87362306a36Sopenharmony_ci			int_mux_cfg1 = int_mux_cfg0 + WSA_MACRO_MUX_CFG1_OFFSET;
87462306a36Sopenharmony_ci			inp0_sel = snd_soc_component_read_field(component, int_mux_cfg0,
87562306a36Sopenharmony_ci								CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK);
87662306a36Sopenharmony_ci			inp1_sel = snd_soc_component_read_field(component, int_mux_cfg0,
87762306a36Sopenharmony_ci								CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK);
87862306a36Sopenharmony_ci			inp2_sel = snd_soc_component_read_field(component, int_mux_cfg1,
87962306a36Sopenharmony_ci								CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK);
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci			if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||
88262306a36Sopenharmony_ci			    (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||
88362306a36Sopenharmony_ci			    (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) {
88462306a36Sopenharmony_ci				int_fs_reg = CDC_WSA_RX0_RX_PATH_CTL +
88562306a36Sopenharmony_ci					     WSA_MACRO_RX_PATH_OFFSET * j;
88662306a36Sopenharmony_ci				/* sample_rate is in Hz */
88762306a36Sopenharmony_ci				snd_soc_component_update_bits(component, int_fs_reg,
88862306a36Sopenharmony_ci							      WSA_MACRO_FS_RATE_MASK,
88962306a36Sopenharmony_ci							      int_prim_fs_rate_reg_val);
89062306a36Sopenharmony_ci			}
89162306a36Sopenharmony_ci			int_mux_cfg0 += WSA_MACRO_MUX_CFG_OFFSET;
89262306a36Sopenharmony_ci		}
89362306a36Sopenharmony_ci	}
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	return 0;
89662306a36Sopenharmony_ci}
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_cistatic int wsa_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai,
89962306a36Sopenharmony_ci					       u8 int_mix_fs_rate_reg_val,
90062306a36Sopenharmony_ci					       u32 sample_rate)
90162306a36Sopenharmony_ci{
90262306a36Sopenharmony_ci	u8 int_2_inp;
90362306a36Sopenharmony_ci	u32 j, port;
90462306a36Sopenharmony_ci	u16 int_mux_cfg1, int_fs_reg;
90562306a36Sopenharmony_ci	u8 int_mux_cfg1_val;
90662306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
90762306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci	for_each_set_bit(port, &wsa->active_ch_mask[dai->id], WSA_MACRO_RX_MAX) {
91062306a36Sopenharmony_ci		int_2_inp = port;
91162306a36Sopenharmony_ci		if ((int_2_inp < WSA_MACRO_RX0) || (int_2_inp > WSA_MACRO_RX_MIX1)) {
91262306a36Sopenharmony_ci			dev_err(component->dev,	"%s: Invalid RX port, Dai ID is %d\n",
91362306a36Sopenharmony_ci				__func__, dai->id);
91462306a36Sopenharmony_ci			return -EINVAL;
91562306a36Sopenharmony_ci		}
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_ci		int_mux_cfg1 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG1;
91862306a36Sopenharmony_ci		for (j = 0; j < NUM_INTERPOLATORS; j++) {
91962306a36Sopenharmony_ci			int_mux_cfg1_val = snd_soc_component_read_field(component, int_mux_cfg1,
92062306a36Sopenharmony_ci									CDC_WSA_RX_INTX_2_SEL_MASK);
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_ci			if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) {
92362306a36Sopenharmony_ci				int_fs_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL +
92462306a36Sopenharmony_ci					WSA_MACRO_RX_PATH_OFFSET * j;
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci				snd_soc_component_update_bits(component,
92762306a36Sopenharmony_ci						      int_fs_reg,
92862306a36Sopenharmony_ci						      WSA_MACRO_FS_RATE_MASK,
92962306a36Sopenharmony_ci						      int_mix_fs_rate_reg_val);
93062306a36Sopenharmony_ci			}
93162306a36Sopenharmony_ci			int_mux_cfg1 += WSA_MACRO_MUX_CFG_OFFSET;
93262306a36Sopenharmony_ci		}
93362306a36Sopenharmony_ci	}
93462306a36Sopenharmony_ci	return 0;
93562306a36Sopenharmony_ci}
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_cistatic int wsa_macro_set_interpolator_rate(struct snd_soc_dai *dai,
93862306a36Sopenharmony_ci					   u32 sample_rate)
93962306a36Sopenharmony_ci{
94062306a36Sopenharmony_ci	int rate_val = 0;
94162306a36Sopenharmony_ci	int i, ret;
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci	/* set mixing path rate */
94462306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(int_mix_sample_rate_val); i++) {
94562306a36Sopenharmony_ci		if (sample_rate == int_mix_sample_rate_val[i].sample_rate) {
94662306a36Sopenharmony_ci			rate_val = int_mix_sample_rate_val[i].rate_val;
94762306a36Sopenharmony_ci			break;
94862306a36Sopenharmony_ci		}
94962306a36Sopenharmony_ci	}
95062306a36Sopenharmony_ci	if ((i == ARRAY_SIZE(int_mix_sample_rate_val)) || (rate_val < 0))
95162306a36Sopenharmony_ci		goto prim_rate;
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci	ret = wsa_macro_set_mix_interpolator_rate(dai, (u8) rate_val, sample_rate);
95462306a36Sopenharmony_ci	if (ret < 0)
95562306a36Sopenharmony_ci		return ret;
95662306a36Sopenharmony_ciprim_rate:
95762306a36Sopenharmony_ci	/* set primary path sample rate */
95862306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(int_prim_sample_rate_val); i++) {
95962306a36Sopenharmony_ci		if (sample_rate == int_prim_sample_rate_val[i].sample_rate) {
96062306a36Sopenharmony_ci			rate_val = int_prim_sample_rate_val[i].rate_val;
96162306a36Sopenharmony_ci			break;
96262306a36Sopenharmony_ci		}
96362306a36Sopenharmony_ci	}
96462306a36Sopenharmony_ci	if ((i == ARRAY_SIZE(int_prim_sample_rate_val)) || (rate_val < 0))
96562306a36Sopenharmony_ci		return -EINVAL;
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci	ret = wsa_macro_set_prim_interpolator_rate(dai, (u8) rate_val, sample_rate);
96862306a36Sopenharmony_ci
96962306a36Sopenharmony_ci	return ret;
97062306a36Sopenharmony_ci}
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_cistatic int wsa_macro_hw_params(struct snd_pcm_substream *substream,
97362306a36Sopenharmony_ci			       struct snd_pcm_hw_params *params,
97462306a36Sopenharmony_ci			       struct snd_soc_dai *dai)
97562306a36Sopenharmony_ci{
97662306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
97762306a36Sopenharmony_ci	int ret;
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_ci	switch (substream->stream) {
98062306a36Sopenharmony_ci	case SNDRV_PCM_STREAM_PLAYBACK:
98162306a36Sopenharmony_ci		ret = wsa_macro_set_interpolator_rate(dai, params_rate(params));
98262306a36Sopenharmony_ci		if (ret) {
98362306a36Sopenharmony_ci			dev_err(component->dev,
98462306a36Sopenharmony_ci				"%s: cannot set sample rate: %u\n",
98562306a36Sopenharmony_ci				__func__, params_rate(params));
98662306a36Sopenharmony_ci			return ret;
98762306a36Sopenharmony_ci		}
98862306a36Sopenharmony_ci		break;
98962306a36Sopenharmony_ci	default:
99062306a36Sopenharmony_ci		break;
99162306a36Sopenharmony_ci	}
99262306a36Sopenharmony_ci	return 0;
99362306a36Sopenharmony_ci}
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_cistatic int wsa_macro_get_channel_map(struct snd_soc_dai *dai,
99662306a36Sopenharmony_ci				     unsigned int *tx_num, unsigned int *tx_slot,
99762306a36Sopenharmony_ci				     unsigned int *rx_num, unsigned int *rx_slot)
99862306a36Sopenharmony_ci{
99962306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
100062306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
100162306a36Sopenharmony_ci	u16 val, mask = 0, cnt = 0, temp;
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	switch (dai->id) {
100462306a36Sopenharmony_ci	case WSA_MACRO_AIF_VI:
100562306a36Sopenharmony_ci		*tx_slot = wsa->active_ch_mask[dai->id];
100662306a36Sopenharmony_ci		*tx_num = wsa->active_ch_cnt[dai->id];
100762306a36Sopenharmony_ci		break;
100862306a36Sopenharmony_ci	case WSA_MACRO_AIF1_PB:
100962306a36Sopenharmony_ci	case WSA_MACRO_AIF_MIX1_PB:
101062306a36Sopenharmony_ci		for_each_set_bit(temp, &wsa->active_ch_mask[dai->id],
101162306a36Sopenharmony_ci					WSA_MACRO_RX_MAX) {
101262306a36Sopenharmony_ci			mask |= (1 << temp);
101362306a36Sopenharmony_ci			if (++cnt == WSA_MACRO_MAX_DMA_CH_PER_PORT)
101462306a36Sopenharmony_ci				break;
101562306a36Sopenharmony_ci		}
101662306a36Sopenharmony_ci		if (mask & 0x0C)
101762306a36Sopenharmony_ci			mask = mask >> 0x2;
101862306a36Sopenharmony_ci		*rx_slot = mask;
101962306a36Sopenharmony_ci		*rx_num = cnt;
102062306a36Sopenharmony_ci		break;
102162306a36Sopenharmony_ci	case WSA_MACRO_AIF_ECHO:
102262306a36Sopenharmony_ci		val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0);
102362306a36Sopenharmony_ci		if (val & WSA_MACRO_EC_MIX_TX1_MASK) {
102462306a36Sopenharmony_ci			mask |= 0x2;
102562306a36Sopenharmony_ci			cnt++;
102662306a36Sopenharmony_ci		}
102762306a36Sopenharmony_ci		if (val & WSA_MACRO_EC_MIX_TX0_MASK) {
102862306a36Sopenharmony_ci			mask |= 0x1;
102962306a36Sopenharmony_ci			cnt++;
103062306a36Sopenharmony_ci		}
103162306a36Sopenharmony_ci		*tx_slot = mask;
103262306a36Sopenharmony_ci		*tx_num = cnt;
103362306a36Sopenharmony_ci		break;
103462306a36Sopenharmony_ci	default:
103562306a36Sopenharmony_ci		dev_err(component->dev, "%s: Invalid AIF\n", __func__);
103662306a36Sopenharmony_ci		break;
103762306a36Sopenharmony_ci	}
103862306a36Sopenharmony_ci	return 0;
103962306a36Sopenharmony_ci}
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_cistatic const struct snd_soc_dai_ops wsa_macro_dai_ops = {
104262306a36Sopenharmony_ci	.hw_params = wsa_macro_hw_params,
104362306a36Sopenharmony_ci	.get_channel_map = wsa_macro_get_channel_map,
104462306a36Sopenharmony_ci};
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_cistatic struct snd_soc_dai_driver wsa_macro_dai[] = {
104762306a36Sopenharmony_ci	{
104862306a36Sopenharmony_ci		.name = "wsa_macro_rx1",
104962306a36Sopenharmony_ci		.id = WSA_MACRO_AIF1_PB,
105062306a36Sopenharmony_ci		.playback = {
105162306a36Sopenharmony_ci			.stream_name = "WSA_AIF1 Playback",
105262306a36Sopenharmony_ci			.rates = WSA_MACRO_RX_RATES,
105362306a36Sopenharmony_ci			.formats = WSA_MACRO_RX_FORMATS,
105462306a36Sopenharmony_ci			.rate_max = 384000,
105562306a36Sopenharmony_ci			.rate_min = 8000,
105662306a36Sopenharmony_ci			.channels_min = 1,
105762306a36Sopenharmony_ci			.channels_max = 2,
105862306a36Sopenharmony_ci		},
105962306a36Sopenharmony_ci		.ops = &wsa_macro_dai_ops,
106062306a36Sopenharmony_ci	},
106162306a36Sopenharmony_ci	{
106262306a36Sopenharmony_ci		.name = "wsa_macro_rx_mix",
106362306a36Sopenharmony_ci		.id = WSA_MACRO_AIF_MIX1_PB,
106462306a36Sopenharmony_ci		.playback = {
106562306a36Sopenharmony_ci			.stream_name = "WSA_AIF_MIX1 Playback",
106662306a36Sopenharmony_ci			.rates = WSA_MACRO_RX_MIX_RATES,
106762306a36Sopenharmony_ci			.formats = WSA_MACRO_RX_FORMATS,
106862306a36Sopenharmony_ci			.rate_max = 192000,
106962306a36Sopenharmony_ci			.rate_min = 48000,
107062306a36Sopenharmony_ci			.channels_min = 1,
107162306a36Sopenharmony_ci			.channels_max = 2,
107262306a36Sopenharmony_ci		},
107362306a36Sopenharmony_ci		.ops = &wsa_macro_dai_ops,
107462306a36Sopenharmony_ci	},
107562306a36Sopenharmony_ci	{
107662306a36Sopenharmony_ci		.name = "wsa_macro_vifeedback",
107762306a36Sopenharmony_ci		.id = WSA_MACRO_AIF_VI,
107862306a36Sopenharmony_ci		.capture = {
107962306a36Sopenharmony_ci			.stream_name = "WSA_AIF_VI Capture",
108062306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
108162306a36Sopenharmony_ci			.formats = WSA_MACRO_RX_FORMATS,
108262306a36Sopenharmony_ci			.rate_max = 48000,
108362306a36Sopenharmony_ci			.rate_min = 8000,
108462306a36Sopenharmony_ci			.channels_min = 1,
108562306a36Sopenharmony_ci			.channels_max = 4,
108662306a36Sopenharmony_ci		},
108762306a36Sopenharmony_ci		.ops = &wsa_macro_dai_ops,
108862306a36Sopenharmony_ci	},
108962306a36Sopenharmony_ci	{
109062306a36Sopenharmony_ci		.name = "wsa_macro_echo",
109162306a36Sopenharmony_ci		.id = WSA_MACRO_AIF_ECHO,
109262306a36Sopenharmony_ci		.capture = {
109362306a36Sopenharmony_ci			.stream_name = "WSA_AIF_ECHO Capture",
109462306a36Sopenharmony_ci			.rates = WSA_MACRO_ECHO_RATES,
109562306a36Sopenharmony_ci			.formats = WSA_MACRO_ECHO_FORMATS,
109662306a36Sopenharmony_ci			.rate_max = 48000,
109762306a36Sopenharmony_ci			.rate_min = 8000,
109862306a36Sopenharmony_ci			.channels_min = 1,
109962306a36Sopenharmony_ci			.channels_max = 2,
110062306a36Sopenharmony_ci		},
110162306a36Sopenharmony_ci		.ops = &wsa_macro_dai_ops,
110262306a36Sopenharmony_ci	},
110362306a36Sopenharmony_ci};
110462306a36Sopenharmony_ci
110562306a36Sopenharmony_cistatic void wsa_macro_mclk_enable(struct wsa_macro *wsa, bool mclk_enable)
110662306a36Sopenharmony_ci{
110762306a36Sopenharmony_ci	struct regmap *regmap = wsa->regmap;
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci	if (mclk_enable) {
111062306a36Sopenharmony_ci		if (wsa->wsa_mclk_users == 0) {
111162306a36Sopenharmony_ci			regcache_mark_dirty(regmap);
111262306a36Sopenharmony_ci			regcache_sync(regmap);
111362306a36Sopenharmony_ci			/* 9.6MHz MCLK, set value 0x00 if other frequency */
111462306a36Sopenharmony_ci			regmap_update_bits(regmap, CDC_WSA_TOP_FREQ_MCLK, 0x01, 0x01);
111562306a36Sopenharmony_ci			regmap_update_bits(regmap,
111662306a36Sopenharmony_ci					   CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL,
111762306a36Sopenharmony_ci					   CDC_WSA_MCLK_EN_MASK,
111862306a36Sopenharmony_ci					   CDC_WSA_MCLK_ENABLE);
111962306a36Sopenharmony_ci			regmap_update_bits(regmap,
112062306a36Sopenharmony_ci					   CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
112162306a36Sopenharmony_ci					   CDC_WSA_FS_CNT_EN_MASK,
112262306a36Sopenharmony_ci					   CDC_WSA_FS_CNT_ENABLE);
112362306a36Sopenharmony_ci		}
112462306a36Sopenharmony_ci		wsa->wsa_mclk_users++;
112562306a36Sopenharmony_ci	} else {
112662306a36Sopenharmony_ci		if (wsa->wsa_mclk_users <= 0) {
112762306a36Sopenharmony_ci			dev_err(wsa->dev, "clock already disabled\n");
112862306a36Sopenharmony_ci			wsa->wsa_mclk_users = 0;
112962306a36Sopenharmony_ci			return;
113062306a36Sopenharmony_ci		}
113162306a36Sopenharmony_ci		wsa->wsa_mclk_users--;
113262306a36Sopenharmony_ci		if (wsa->wsa_mclk_users == 0) {
113362306a36Sopenharmony_ci			regmap_update_bits(regmap,
113462306a36Sopenharmony_ci					   CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
113562306a36Sopenharmony_ci					   CDC_WSA_FS_CNT_EN_MASK,
113662306a36Sopenharmony_ci					   CDC_WSA_FS_CNT_DISABLE);
113762306a36Sopenharmony_ci			regmap_update_bits(regmap,
113862306a36Sopenharmony_ci					   CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL,
113962306a36Sopenharmony_ci					   CDC_WSA_MCLK_EN_MASK,
114062306a36Sopenharmony_ci					   CDC_WSA_MCLK_DISABLE);
114162306a36Sopenharmony_ci		}
114262306a36Sopenharmony_ci	}
114362306a36Sopenharmony_ci}
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_cistatic int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w,
114662306a36Sopenharmony_ci				struct snd_kcontrol *kcontrol, int event)
114762306a36Sopenharmony_ci{
114862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
114962306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
115062306a36Sopenharmony_ci
115162306a36Sopenharmony_ci	wsa_macro_mclk_enable(wsa, event == SND_SOC_DAPM_PRE_PMU);
115262306a36Sopenharmony_ci	return 0;
115362306a36Sopenharmony_ci}
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_cistatic int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
115662306a36Sopenharmony_ci					struct snd_kcontrol *kcontrol,
115762306a36Sopenharmony_ci					int event)
115862306a36Sopenharmony_ci{
115962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
116062306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
116162306a36Sopenharmony_ci	u32 tx_reg0, tx_reg1;
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
116462306a36Sopenharmony_ci		tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL;
116562306a36Sopenharmony_ci		tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL;
116662306a36Sopenharmony_ci	} else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
116762306a36Sopenharmony_ci		tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL;
116862306a36Sopenharmony_ci		tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL;
116962306a36Sopenharmony_ci	}
117062306a36Sopenharmony_ci
117162306a36Sopenharmony_ci	switch (event) {
117262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
117362306a36Sopenharmony_ci			/* Enable V&I sensing */
117462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg0,
117562306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
117662306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET);
117762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg1,
117862306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
117962306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET);
118062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg0,
118162306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
118262306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
118362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg1,
118462306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK,
118562306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K);
118662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg0,
118762306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
118862306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
118962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg1,
119062306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
119162306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_ENABLE);
119262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg0,
119362306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
119462306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_NO_RESET);
119562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg1,
119662306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
119762306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_NO_RESET);
119862306a36Sopenharmony_ci		break;
119962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
120062306a36Sopenharmony_ci		/* Disable V&I sensing */
120162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg0,
120262306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
120362306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET);
120462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg1,
120562306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET_MASK,
120662306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_RESET);
120762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg0,
120862306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
120962306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
121062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, tx_reg1,
121162306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK,
121262306a36Sopenharmony_ci					      CDC_WSA_TX_SPKR_PROT_CLK_DISABLE);
121362306a36Sopenharmony_ci		break;
121462306a36Sopenharmony_ci	}
121562306a36Sopenharmony_ci
121662306a36Sopenharmony_ci	return 0;
121762306a36Sopenharmony_ci}
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_cistatic int wsa_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
122062306a36Sopenharmony_ci				     struct snd_kcontrol *kcontrol, int event)
122162306a36Sopenharmony_ci{
122262306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
122362306a36Sopenharmony_ci	u16 path_reg, gain_reg;
122462306a36Sopenharmony_ci	int val;
122562306a36Sopenharmony_ci
122662306a36Sopenharmony_ci	switch (w->shift) {
122762306a36Sopenharmony_ci	case WSA_MACRO_RX_MIX0:
122862306a36Sopenharmony_ci		path_reg = CDC_WSA_RX0_RX_PATH_MIX_CTL;
122962306a36Sopenharmony_ci		gain_reg = CDC_WSA_RX0_RX_VOL_MIX_CTL;
123062306a36Sopenharmony_ci		break;
123162306a36Sopenharmony_ci	case WSA_MACRO_RX_MIX1:
123262306a36Sopenharmony_ci		path_reg = CDC_WSA_RX1_RX_PATH_MIX_CTL;
123362306a36Sopenharmony_ci		gain_reg = CDC_WSA_RX1_RX_VOL_MIX_CTL;
123462306a36Sopenharmony_ci		break;
123562306a36Sopenharmony_ci	default:
123662306a36Sopenharmony_ci		return 0;
123762306a36Sopenharmony_ci	}
123862306a36Sopenharmony_ci
123962306a36Sopenharmony_ci	switch (event) {
124062306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
124162306a36Sopenharmony_ci		val = snd_soc_component_read(component, gain_reg);
124262306a36Sopenharmony_ci		snd_soc_component_write(component, gain_reg, val);
124362306a36Sopenharmony_ci		break;
124462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
124562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, path_reg,
124662306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_MIX_CLK_EN_MASK,
124762306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_MIX_CLK_DISABLE);
124862306a36Sopenharmony_ci		break;
124962306a36Sopenharmony_ci	}
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci	return 0;
125262306a36Sopenharmony_ci}
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_cistatic void wsa_macro_hd2_control(struct snd_soc_component *component,
125562306a36Sopenharmony_ci				  u16 reg, int event)
125662306a36Sopenharmony_ci{
125762306a36Sopenharmony_ci	u16 hd2_scale_reg;
125862306a36Sopenharmony_ci	u16 hd2_enable_reg;
125962306a36Sopenharmony_ci
126062306a36Sopenharmony_ci	if (reg == CDC_WSA_RX0_RX_PATH_CTL) {
126162306a36Sopenharmony_ci		hd2_scale_reg = CDC_WSA_RX0_RX_PATH_SEC3;
126262306a36Sopenharmony_ci		hd2_enable_reg = CDC_WSA_RX0_RX_PATH_CFG0;
126362306a36Sopenharmony_ci	}
126462306a36Sopenharmony_ci	if (reg == CDC_WSA_RX1_RX_PATH_CTL) {
126562306a36Sopenharmony_ci		hd2_scale_reg = CDC_WSA_RX1_RX_PATH_SEC3;
126662306a36Sopenharmony_ci		hd2_enable_reg = CDC_WSA_RX1_RX_PATH_CFG0;
126762306a36Sopenharmony_ci	}
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
127062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
127162306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_ALPHA_MASK,
127262306a36Sopenharmony_ci					      0x10);
127362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
127462306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_SCALE_MASK,
127562306a36Sopenharmony_ci					      0x1);
127662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_enable_reg,
127762306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_EN_MASK,
127862306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_ENABLE);
127962306a36Sopenharmony_ci	}
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_ci	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
128262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_enable_reg,
128362306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_EN_MASK, 0);
128462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
128562306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_SCALE_MASK,
128662306a36Sopenharmony_ci					      0);
128762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
128862306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_HD2_ALPHA_MASK,
128962306a36Sopenharmony_ci					      0);
129062306a36Sopenharmony_ci	}
129162306a36Sopenharmony_ci}
129262306a36Sopenharmony_ci
129362306a36Sopenharmony_cistatic int wsa_macro_config_compander(struct snd_soc_component *component,
129462306a36Sopenharmony_ci				      int comp, int event)
129562306a36Sopenharmony_ci{
129662306a36Sopenharmony_ci	u16 comp_ctl0_reg, rx_path_cfg0_reg;
129762306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
129862306a36Sopenharmony_ci
129962306a36Sopenharmony_ci	if (!wsa->comp_enabled[comp])
130062306a36Sopenharmony_ci		return 0;
130162306a36Sopenharmony_ci
130262306a36Sopenharmony_ci	comp_ctl0_reg = CDC_WSA_COMPANDER0_CTL0 +
130362306a36Sopenharmony_ci					(comp * WSA_MACRO_RX_COMP_OFFSET);
130462306a36Sopenharmony_ci	rx_path_cfg0_reg = CDC_WSA_RX0_RX_PATH_CFG0 +
130562306a36Sopenharmony_ci					(comp * WSA_MACRO_RX_PATH_OFFSET);
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
130862306a36Sopenharmony_ci		/* Enable Compander Clock */
130962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
131062306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_CLK_EN_MASK,
131162306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_CLK_ENABLE);
131262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
131362306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
131462306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_SOFT_RST_ENABLE);
131562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
131662306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
131762306a36Sopenharmony_ci					      0);
131862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
131962306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_COMP_EN_MASK,
132062306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_COMP_ENABLE);
132162306a36Sopenharmony_ci	}
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event)) {
132462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
132562306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_HALT_MASK,
132662306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_HALT);
132762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
132862306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_COMP_EN_MASK, 0);
132962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
133062306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
133162306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_SOFT_RST_ENABLE);
133262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
133362306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_SOFT_RST_MASK,
133462306a36Sopenharmony_ci					      0);
133562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
133662306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_CLK_EN_MASK, 0);
133762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
133862306a36Sopenharmony_ci					      CDC_WSA_COMPANDER_HALT_MASK, 0);
133962306a36Sopenharmony_ci	}
134062306a36Sopenharmony_ci
134162306a36Sopenharmony_ci	return 0;
134262306a36Sopenharmony_ci}
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_cistatic void wsa_macro_enable_softclip_clk(struct snd_soc_component *component,
134562306a36Sopenharmony_ci					 struct wsa_macro *wsa,
134662306a36Sopenharmony_ci					 int path,
134762306a36Sopenharmony_ci					 bool enable)
134862306a36Sopenharmony_ci{
134962306a36Sopenharmony_ci	u16 softclip_clk_reg = CDC_WSA_SOFTCLIP0_CRC +
135062306a36Sopenharmony_ci			(path * WSA_MACRO_RX_SOFTCLIP_OFFSET);
135162306a36Sopenharmony_ci	u8 softclip_mux_mask = (1 << path);
135262306a36Sopenharmony_ci	u8 softclip_mux_value = (1 << path);
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci	if (enable) {
135562306a36Sopenharmony_ci		if (wsa->softclip_clk_users[path] == 0) {
135662306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
135762306a36Sopenharmony_ci						softclip_clk_reg,
135862306a36Sopenharmony_ci						CDC_WSA_SOFTCLIP_CLK_EN_MASK,
135962306a36Sopenharmony_ci						CDC_WSA_SOFTCLIP_CLK_ENABLE);
136062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
136162306a36Sopenharmony_ci				CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0,
136262306a36Sopenharmony_ci				softclip_mux_mask, softclip_mux_value);
136362306a36Sopenharmony_ci		}
136462306a36Sopenharmony_ci		wsa->softclip_clk_users[path]++;
136562306a36Sopenharmony_ci	} else {
136662306a36Sopenharmony_ci		wsa->softclip_clk_users[path]--;
136762306a36Sopenharmony_ci		if (wsa->softclip_clk_users[path] == 0) {
136862306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
136962306a36Sopenharmony_ci						softclip_clk_reg,
137062306a36Sopenharmony_ci						CDC_WSA_SOFTCLIP_CLK_EN_MASK,
137162306a36Sopenharmony_ci						0);
137262306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
137362306a36Sopenharmony_ci				CDC_WSA_RX_INP_MUX_SOFTCLIP_CFG0,
137462306a36Sopenharmony_ci				softclip_mux_mask, 0x00);
137562306a36Sopenharmony_ci		}
137662306a36Sopenharmony_ci	}
137762306a36Sopenharmony_ci}
137862306a36Sopenharmony_ci
137962306a36Sopenharmony_cistatic int wsa_macro_config_softclip(struct snd_soc_component *component,
138062306a36Sopenharmony_ci				     int path, int event)
138162306a36Sopenharmony_ci{
138262306a36Sopenharmony_ci	u16 softclip_ctrl_reg;
138362306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
138462306a36Sopenharmony_ci	int softclip_path = 0;
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci	if (path == WSA_MACRO_COMP1)
138762306a36Sopenharmony_ci		softclip_path = WSA_MACRO_SOFTCLIP0;
138862306a36Sopenharmony_ci	else if (path == WSA_MACRO_COMP2)
138962306a36Sopenharmony_ci		softclip_path = WSA_MACRO_SOFTCLIP1;
139062306a36Sopenharmony_ci
139162306a36Sopenharmony_ci	if (!wsa->is_softclip_on[softclip_path])
139262306a36Sopenharmony_ci		return 0;
139362306a36Sopenharmony_ci
139462306a36Sopenharmony_ci	softclip_ctrl_reg = CDC_WSA_SOFTCLIP0_SOFTCLIP_CTRL +
139562306a36Sopenharmony_ci				(softclip_path * WSA_MACRO_RX_SOFTCLIP_OFFSET);
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
139862306a36Sopenharmony_ci		/* Enable Softclip clock and mux */
139962306a36Sopenharmony_ci		wsa_macro_enable_softclip_clk(component, wsa, softclip_path,
140062306a36Sopenharmony_ci					      true);
140162306a36Sopenharmony_ci		/* Enable Softclip control */
140262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, softclip_ctrl_reg,
140362306a36Sopenharmony_ci					      CDC_WSA_SOFTCLIP_EN_MASK,
140462306a36Sopenharmony_ci					      CDC_WSA_SOFTCLIP_ENABLE);
140562306a36Sopenharmony_ci	}
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event)) {
140862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, softclip_ctrl_reg,
140962306a36Sopenharmony_ci					      CDC_WSA_SOFTCLIP_EN_MASK, 0);
141062306a36Sopenharmony_ci		wsa_macro_enable_softclip_clk(component, wsa, softclip_path,
141162306a36Sopenharmony_ci					      false);
141262306a36Sopenharmony_ci	}
141362306a36Sopenharmony_ci
141462306a36Sopenharmony_ci	return 0;
141562306a36Sopenharmony_ci}
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_cistatic bool wsa_macro_adie_lb(struct snd_soc_component *component,
141862306a36Sopenharmony_ci			      int interp_idx)
141962306a36Sopenharmony_ci{
142062306a36Sopenharmony_ci	u16 int_mux_cfg0,  int_mux_cfg1;
142162306a36Sopenharmony_ci	u8 int_n_inp0, int_n_inp1, int_n_inp2;
142262306a36Sopenharmony_ci
142362306a36Sopenharmony_ci	int_mux_cfg0 = CDC_WSA_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8;
142462306a36Sopenharmony_ci	int_mux_cfg1 = int_mux_cfg0 + 4;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	int_n_inp0 = snd_soc_component_read_field(component, int_mux_cfg0,
142762306a36Sopenharmony_ci						  CDC_WSA_RX_INTX_1_MIX_INP0_SEL_MASK);
142862306a36Sopenharmony_ci	if (int_n_inp0 == INTn_1_INP_SEL_DEC0 ||
142962306a36Sopenharmony_ci		int_n_inp0 == INTn_1_INP_SEL_DEC1)
143062306a36Sopenharmony_ci		return true;
143162306a36Sopenharmony_ci
143262306a36Sopenharmony_ci	int_n_inp1 = snd_soc_component_read_field(component, int_mux_cfg0,
143362306a36Sopenharmony_ci						  CDC_WSA_RX_INTX_1_MIX_INP1_SEL_MASK);
143462306a36Sopenharmony_ci	if (int_n_inp1 == INTn_1_INP_SEL_DEC0 ||
143562306a36Sopenharmony_ci		int_n_inp1 == INTn_1_INP_SEL_DEC1)
143662306a36Sopenharmony_ci		return true;
143762306a36Sopenharmony_ci
143862306a36Sopenharmony_ci	int_n_inp2 = snd_soc_component_read_field(component, int_mux_cfg1,
143962306a36Sopenharmony_ci						  CDC_WSA_RX_INTX_1_MIX_INP2_SEL_MASK);
144062306a36Sopenharmony_ci	if (int_n_inp2 == INTn_1_INP_SEL_DEC0 ||
144162306a36Sopenharmony_ci		int_n_inp2 == INTn_1_INP_SEL_DEC1)
144262306a36Sopenharmony_ci		return true;
144362306a36Sopenharmony_ci
144462306a36Sopenharmony_ci	return false;
144562306a36Sopenharmony_ci}
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_cistatic int wsa_macro_enable_main_path(struct snd_soc_dapm_widget *w,
144862306a36Sopenharmony_ci				      struct snd_kcontrol *kcontrol,
144962306a36Sopenharmony_ci				      int event)
145062306a36Sopenharmony_ci{
145162306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
145262306a36Sopenharmony_ci	u16 reg;
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci	reg = CDC_WSA_RX0_RX_PATH_CTL + WSA_MACRO_RX_PATH_OFFSET * w->shift;
145562306a36Sopenharmony_ci	switch (event) {
145662306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
145762306a36Sopenharmony_ci		if (wsa_macro_adie_lb(component, w->shift)) {
145862306a36Sopenharmony_ci			snd_soc_component_update_bits(component, reg,
145962306a36Sopenharmony_ci					     CDC_WSA_RX_PATH_CLK_EN_MASK,
146062306a36Sopenharmony_ci					     CDC_WSA_RX_PATH_CLK_ENABLE);
146162306a36Sopenharmony_ci		}
146262306a36Sopenharmony_ci		break;
146362306a36Sopenharmony_ci	default:
146462306a36Sopenharmony_ci		break;
146562306a36Sopenharmony_ci	}
146662306a36Sopenharmony_ci	return 0;
146762306a36Sopenharmony_ci}
146862306a36Sopenharmony_ci
146962306a36Sopenharmony_cistatic int wsa_macro_interp_get_primary_reg(u16 reg, u16 *ind)
147062306a36Sopenharmony_ci{
147162306a36Sopenharmony_ci	u16 prim_int_reg = 0;
147262306a36Sopenharmony_ci
147362306a36Sopenharmony_ci	switch (reg) {
147462306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_CTL:
147562306a36Sopenharmony_ci	case CDC_WSA_RX0_RX_PATH_MIX_CTL:
147662306a36Sopenharmony_ci		prim_int_reg = CDC_WSA_RX0_RX_PATH_CTL;
147762306a36Sopenharmony_ci		*ind = 0;
147862306a36Sopenharmony_ci		break;
147962306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_CTL:
148062306a36Sopenharmony_ci	case CDC_WSA_RX1_RX_PATH_MIX_CTL:
148162306a36Sopenharmony_ci		prim_int_reg = CDC_WSA_RX1_RX_PATH_CTL;
148262306a36Sopenharmony_ci		*ind = 1;
148362306a36Sopenharmony_ci		break;
148462306a36Sopenharmony_ci	}
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_ci	return prim_int_reg;
148762306a36Sopenharmony_ci}
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_cistatic int wsa_macro_enable_prim_interpolator(struct snd_soc_component *component,
149062306a36Sopenharmony_ci					      u16 reg, int event)
149162306a36Sopenharmony_ci{
149262306a36Sopenharmony_ci	u16 prim_int_reg;
149362306a36Sopenharmony_ci	u16 ind = 0;
149462306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
149562306a36Sopenharmony_ci
149662306a36Sopenharmony_ci	prim_int_reg = wsa_macro_interp_get_primary_reg(reg, &ind);
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_ci	switch (event) {
149962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
150062306a36Sopenharmony_ci		wsa->prim_int_users[ind]++;
150162306a36Sopenharmony_ci		if (wsa->prim_int_users[ind] == 1) {
150262306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
150362306a36Sopenharmony_ci						      prim_int_reg + WSA_MACRO_RX_PATH_CFG3_OFFSET,
150462306a36Sopenharmony_ci						      CDC_WSA_RX_DC_DCOEFF_MASK,
150562306a36Sopenharmony_ci						      0x3);
150662306a36Sopenharmony_ci			snd_soc_component_update_bits(component, prim_int_reg,
150762306a36Sopenharmony_ci					CDC_WSA_RX_PATH_PGA_MUTE_EN_MASK,
150862306a36Sopenharmony_ci					CDC_WSA_RX_PATH_PGA_MUTE_ENABLE);
150962306a36Sopenharmony_ci			wsa_macro_hd2_control(component, prim_int_reg, event);
151062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
151162306a36Sopenharmony_ci				prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET,
151262306a36Sopenharmony_ci				CDC_WSA_RX_DSMDEM_CLK_EN_MASK,
151362306a36Sopenharmony_ci				CDC_WSA_RX_DSMDEM_CLK_ENABLE);
151462306a36Sopenharmony_ci		}
151562306a36Sopenharmony_ci		if ((reg != prim_int_reg) &&
151662306a36Sopenharmony_ci		    ((snd_soc_component_read(
151762306a36Sopenharmony_ci				component, prim_int_reg)) & 0x10))
151862306a36Sopenharmony_ci			snd_soc_component_update_bits(component, reg,
151962306a36Sopenharmony_ci					0x10, 0x10);
152062306a36Sopenharmony_ci		break;
152162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
152262306a36Sopenharmony_ci		wsa->prim_int_users[ind]--;
152362306a36Sopenharmony_ci		if (wsa->prim_int_users[ind] == 0) {
152462306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
152562306a36Sopenharmony_ci				prim_int_reg + WSA_MACRO_RX_PATH_DSMDEM_OFFSET,
152662306a36Sopenharmony_ci				CDC_WSA_RX_DSMDEM_CLK_EN_MASK, 0);
152762306a36Sopenharmony_ci			wsa_macro_hd2_control(component, prim_int_reg, event);
152862306a36Sopenharmony_ci		}
152962306a36Sopenharmony_ci		break;
153062306a36Sopenharmony_ci	}
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	return 0;
153362306a36Sopenharmony_ci}
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_cistatic int wsa_macro_config_ear_spkr_gain(struct snd_soc_component *component,
153662306a36Sopenharmony_ci					  struct wsa_macro *wsa,
153762306a36Sopenharmony_ci					  int event, int gain_reg)
153862306a36Sopenharmony_ci{
153962306a36Sopenharmony_ci	int comp_gain_offset, val;
154062306a36Sopenharmony_ci
154162306a36Sopenharmony_ci	switch (wsa->spkr_mode) {
154262306a36Sopenharmony_ci	/* Compander gain in WSA_MACRO_SPKR_MODE1 case is 12 dB */
154362306a36Sopenharmony_ci	case WSA_MACRO_SPKR_MODE_1:
154462306a36Sopenharmony_ci		comp_gain_offset = -12;
154562306a36Sopenharmony_ci		break;
154662306a36Sopenharmony_ci	/* Default case compander gain is 15 dB */
154762306a36Sopenharmony_ci	default:
154862306a36Sopenharmony_ci		comp_gain_offset = -15;
154962306a36Sopenharmony_ci		break;
155062306a36Sopenharmony_ci	}
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	switch (event) {
155362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
155462306a36Sopenharmony_ci		/* Apply ear spkr gain only if compander is enabled */
155562306a36Sopenharmony_ci		if (wsa->comp_enabled[WSA_MACRO_COMP1] &&
155662306a36Sopenharmony_ci		    (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) &&
155762306a36Sopenharmony_ci		    (wsa->ear_spkr_gain != 0)) {
155862306a36Sopenharmony_ci			/* For example, val is -8(-12+5-1) for 4dB of gain */
155962306a36Sopenharmony_ci			val = comp_gain_offset + wsa->ear_spkr_gain - 1;
156062306a36Sopenharmony_ci			snd_soc_component_write(component, gain_reg, val);
156162306a36Sopenharmony_ci		}
156262306a36Sopenharmony_ci		break;
156362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
156462306a36Sopenharmony_ci		/*
156562306a36Sopenharmony_ci		 * Reset RX0 volume to 0 dB if compander is enabled and
156662306a36Sopenharmony_ci		 * ear_spkr_gain is non-zero.
156762306a36Sopenharmony_ci		 */
156862306a36Sopenharmony_ci		if (wsa->comp_enabled[WSA_MACRO_COMP1] &&
156962306a36Sopenharmony_ci		    (gain_reg == CDC_WSA_RX0_RX_VOL_CTL) &&
157062306a36Sopenharmony_ci		    (wsa->ear_spkr_gain != 0)) {
157162306a36Sopenharmony_ci			snd_soc_component_write(component, gain_reg, 0x0);
157262306a36Sopenharmony_ci		}
157362306a36Sopenharmony_ci		break;
157462306a36Sopenharmony_ci	}
157562306a36Sopenharmony_ci
157662306a36Sopenharmony_ci	return 0;
157762306a36Sopenharmony_ci}
157862306a36Sopenharmony_ci
157962306a36Sopenharmony_cistatic int wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w,
158062306a36Sopenharmony_ci					 struct snd_kcontrol *kcontrol,
158162306a36Sopenharmony_ci					 int event)
158262306a36Sopenharmony_ci{
158362306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
158462306a36Sopenharmony_ci	u16 gain_reg;
158562306a36Sopenharmony_ci	u16 reg;
158662306a36Sopenharmony_ci	int val;
158762306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
158862306a36Sopenharmony_ci
158962306a36Sopenharmony_ci	if (w->shift == WSA_MACRO_COMP1) {
159062306a36Sopenharmony_ci		reg = CDC_WSA_RX0_RX_PATH_CTL;
159162306a36Sopenharmony_ci		gain_reg = CDC_WSA_RX0_RX_VOL_CTL;
159262306a36Sopenharmony_ci	} else if (w->shift == WSA_MACRO_COMP2) {
159362306a36Sopenharmony_ci		reg = CDC_WSA_RX1_RX_PATH_CTL;
159462306a36Sopenharmony_ci		gain_reg = CDC_WSA_RX1_RX_VOL_CTL;
159562306a36Sopenharmony_ci	}
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ci	switch (event) {
159862306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
159962306a36Sopenharmony_ci		/* Reset if needed */
160062306a36Sopenharmony_ci		wsa_macro_enable_prim_interpolator(component, reg, event);
160162306a36Sopenharmony_ci		break;
160262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
160362306a36Sopenharmony_ci		wsa_macro_config_compander(component, w->shift, event);
160462306a36Sopenharmony_ci		wsa_macro_config_softclip(component, w->shift, event);
160562306a36Sopenharmony_ci		/* apply gain after int clk is enabled */
160662306a36Sopenharmony_ci		if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) &&
160762306a36Sopenharmony_ci		    (wsa->comp_enabled[WSA_MACRO_COMP1] ||
160862306a36Sopenharmony_ci		     wsa->comp_enabled[WSA_MACRO_COMP2])) {
160962306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
161062306a36Sopenharmony_ci					CDC_WSA_RX0_RX_PATH_SEC1,
161162306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
161262306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
161362306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
161462306a36Sopenharmony_ci					CDC_WSA_RX0_RX_PATH_MIX_SEC0,
161562306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
161662306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
161762306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
161862306a36Sopenharmony_ci					CDC_WSA_RX1_RX_PATH_SEC1,
161962306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
162062306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
162162306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
162262306a36Sopenharmony_ci					CDC_WSA_RX1_RX_PATH_MIX_SEC0,
162362306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
162462306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_ENABLE);
162562306a36Sopenharmony_ci		}
162662306a36Sopenharmony_ci		val = snd_soc_component_read(component, gain_reg);
162762306a36Sopenharmony_ci		snd_soc_component_write(component, gain_reg, val);
162862306a36Sopenharmony_ci		wsa_macro_config_ear_spkr_gain(component, wsa,
162962306a36Sopenharmony_ci						event, gain_reg);
163062306a36Sopenharmony_ci		break;
163162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
163262306a36Sopenharmony_ci		wsa_macro_config_compander(component, w->shift, event);
163362306a36Sopenharmony_ci		wsa_macro_config_softclip(component, w->shift, event);
163462306a36Sopenharmony_ci		wsa_macro_enable_prim_interpolator(component, reg, event);
163562306a36Sopenharmony_ci		if ((wsa->spkr_gain_offset == WSA_MACRO_GAIN_OFFSET_M1P5_DB) &&
163662306a36Sopenharmony_ci		    (wsa->comp_enabled[WSA_MACRO_COMP1] ||
163762306a36Sopenharmony_ci		     wsa->comp_enabled[WSA_MACRO_COMP2])) {
163862306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
163962306a36Sopenharmony_ci					CDC_WSA_RX0_RX_PATH_SEC1,
164062306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
164162306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
164262306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
164362306a36Sopenharmony_ci					CDC_WSA_RX0_RX_PATH_MIX_SEC0,
164462306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
164562306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
164662306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
164762306a36Sopenharmony_ci					CDC_WSA_RX1_RX_PATH_SEC1,
164862306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
164962306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
165062306a36Sopenharmony_ci			snd_soc_component_update_bits(component,
165162306a36Sopenharmony_ci					CDC_WSA_RX1_RX_PATH_MIX_SEC0,
165262306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_MASK,
165362306a36Sopenharmony_ci					CDC_WSA_RX_PGA_HALF_DB_DISABLE);
165462306a36Sopenharmony_ci		}
165562306a36Sopenharmony_ci		wsa_macro_config_ear_spkr_gain(component, wsa,
165662306a36Sopenharmony_ci						event, gain_reg);
165762306a36Sopenharmony_ci		break;
165862306a36Sopenharmony_ci	}
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_ci	return 0;
166162306a36Sopenharmony_ci}
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_cistatic int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w,
166462306a36Sopenharmony_ci				     struct snd_kcontrol *kcontrol,
166562306a36Sopenharmony_ci				     int event)
166662306a36Sopenharmony_ci{
166762306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
166862306a36Sopenharmony_ci	u16 boost_path_ctl, boost_path_cfg1;
166962306a36Sopenharmony_ci	u16 reg, reg_mix;
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_ci	if (!snd_soc_dapm_widget_name_cmp(w, "WSA_RX INT0 CHAIN")) {
167262306a36Sopenharmony_ci		boost_path_ctl = CDC_WSA_BOOST0_BOOST_PATH_CTL;
167362306a36Sopenharmony_ci		boost_path_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1;
167462306a36Sopenharmony_ci		reg = CDC_WSA_RX0_RX_PATH_CTL;
167562306a36Sopenharmony_ci		reg_mix = CDC_WSA_RX0_RX_PATH_MIX_CTL;
167662306a36Sopenharmony_ci	} else if (!snd_soc_dapm_widget_name_cmp(w, "WSA_RX INT1 CHAIN")) {
167762306a36Sopenharmony_ci		boost_path_ctl = CDC_WSA_BOOST1_BOOST_PATH_CTL;
167862306a36Sopenharmony_ci		boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1;
167962306a36Sopenharmony_ci		reg = CDC_WSA_RX1_RX_PATH_CTL;
168062306a36Sopenharmony_ci		reg_mix = CDC_WSA_RX1_RX_PATH_MIX_CTL;
168162306a36Sopenharmony_ci	} else {
168262306a36Sopenharmony_ci		dev_warn(component->dev, "Incorrect widget name in the driver\n");
168362306a36Sopenharmony_ci		return -EINVAL;
168462306a36Sopenharmony_ci	}
168562306a36Sopenharmony_ci
168662306a36Sopenharmony_ci	switch (event) {
168762306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
168862306a36Sopenharmony_ci		snd_soc_component_update_bits(component, boost_path_cfg1,
168962306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_SMART_BST_EN_MASK,
169062306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_SMART_BST_ENABLE);
169162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, boost_path_ctl,
169262306a36Sopenharmony_ci					      CDC_WSA_BOOST_PATH_CLK_EN_MASK,
169362306a36Sopenharmony_ci					      CDC_WSA_BOOST_PATH_CLK_ENABLE);
169462306a36Sopenharmony_ci		if ((snd_soc_component_read(component, reg_mix)) & 0x10)
169562306a36Sopenharmony_ci			snd_soc_component_update_bits(component, reg_mix,
169662306a36Sopenharmony_ci						0x10, 0x00);
169762306a36Sopenharmony_ci		break;
169862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
169962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, reg, 0x10, 0x00);
170062306a36Sopenharmony_ci		break;
170162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
170262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, boost_path_ctl,
170362306a36Sopenharmony_ci					      CDC_WSA_BOOST_PATH_CLK_EN_MASK,
170462306a36Sopenharmony_ci					      CDC_WSA_BOOST_PATH_CLK_DISABLE);
170562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, boost_path_cfg1,
170662306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_SMART_BST_EN_MASK,
170762306a36Sopenharmony_ci					      CDC_WSA_RX_PATH_SMART_BST_DISABLE);
170862306a36Sopenharmony_ci		break;
170962306a36Sopenharmony_ci	}
171062306a36Sopenharmony_ci
171162306a36Sopenharmony_ci	return 0;
171262306a36Sopenharmony_ci}
171362306a36Sopenharmony_ci
171462306a36Sopenharmony_cistatic int wsa_macro_enable_echo(struct snd_soc_dapm_widget *w,
171562306a36Sopenharmony_ci				 struct snd_kcontrol *kcontrol,
171662306a36Sopenharmony_ci				 int event)
171762306a36Sopenharmony_ci{
171862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
171962306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
172062306a36Sopenharmony_ci	u16 val, ec_tx, ec_hq_reg;
172162306a36Sopenharmony_ci
172262306a36Sopenharmony_ci	val = snd_soc_component_read(component, CDC_WSA_RX_INP_MUX_RX_MIX_CFG0);
172362306a36Sopenharmony_ci
172462306a36Sopenharmony_ci	switch (w->shift) {
172562306a36Sopenharmony_ci	case WSA_MACRO_EC0_MUX:
172662306a36Sopenharmony_ci		val = val & CDC_WSA_RX_MIX_TX0_SEL_MASK;
172762306a36Sopenharmony_ci		ec_tx = val - 1;
172862306a36Sopenharmony_ci		break;
172962306a36Sopenharmony_ci	case WSA_MACRO_EC1_MUX:
173062306a36Sopenharmony_ci		val = val & CDC_WSA_RX_MIX_TX1_SEL_MASK;
173162306a36Sopenharmony_ci		ec_tx = (val >> CDC_WSA_RX_MIX_TX1_SEL_SHFT) - 1;
173262306a36Sopenharmony_ci		break;
173362306a36Sopenharmony_ci	default:
173462306a36Sopenharmony_ci		dev_err(component->dev,	"%s: Invalid shift %u\n",
173562306a36Sopenharmony_ci			__func__, w->shift);
173662306a36Sopenharmony_ci		return -EINVAL;
173762306a36Sopenharmony_ci	}
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci	if (wsa->ec_hq[ec_tx]) {
174062306a36Sopenharmony_ci		ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_PATH_CTL +	0x40 * ec_tx;
174162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, ec_hq_reg,
174262306a36Sopenharmony_ci					     CDC_WSA_EC_HQ_EC_CLK_EN_MASK,
174362306a36Sopenharmony_ci					     CDC_WSA_EC_HQ_EC_CLK_ENABLE);
174462306a36Sopenharmony_ci		ec_hq_reg = CDC_WSA_EC_HQ0_EC_REF_HQ_CFG0 + 0x40 * ec_tx;
174562306a36Sopenharmony_ci		/* default set to 48k */
174662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, ec_hq_reg,
174762306a36Sopenharmony_ci				      CDC_WSA_EC_HQ_EC_REF_PCM_RATE_MASK,
174862306a36Sopenharmony_ci				      CDC_WSA_EC_HQ_EC_REF_PCM_RATE_48K);
174962306a36Sopenharmony_ci	}
175062306a36Sopenharmony_ci
175162306a36Sopenharmony_ci	return 0;
175262306a36Sopenharmony_ci}
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_cistatic int wsa_macro_get_ec_hq(struct snd_kcontrol *kcontrol,
175562306a36Sopenharmony_ci			       struct snd_ctl_elem_value *ucontrol)
175662306a36Sopenharmony_ci{
175762306a36Sopenharmony_ci
175862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
175962306a36Sopenharmony_ci	int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
176062306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
176162306a36Sopenharmony_ci
176262306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = wsa->ec_hq[ec_tx];
176362306a36Sopenharmony_ci
176462306a36Sopenharmony_ci	return 0;
176562306a36Sopenharmony_ci}
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_cistatic int wsa_macro_set_ec_hq(struct snd_kcontrol *kcontrol,
176862306a36Sopenharmony_ci			       struct snd_ctl_elem_value *ucontrol)
176962306a36Sopenharmony_ci{
177062306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
177162306a36Sopenharmony_ci	int ec_tx = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
177262306a36Sopenharmony_ci	int value = ucontrol->value.integer.value[0];
177362306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci	wsa->ec_hq[ec_tx] = value;
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_ci	return 0;
177862306a36Sopenharmony_ci}
177962306a36Sopenharmony_ci
178062306a36Sopenharmony_cistatic int wsa_macro_get_compander(struct snd_kcontrol *kcontrol,
178162306a36Sopenharmony_ci				   struct snd_ctl_elem_value *ucontrol)
178262306a36Sopenharmony_ci{
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
178562306a36Sopenharmony_ci	int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
178662306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
178762306a36Sopenharmony_ci
178862306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = wsa->comp_enabled[comp];
178962306a36Sopenharmony_ci	return 0;
179062306a36Sopenharmony_ci}
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_cistatic int wsa_macro_set_compander(struct snd_kcontrol *kcontrol,
179362306a36Sopenharmony_ci				   struct snd_ctl_elem_value *ucontrol)
179462306a36Sopenharmony_ci{
179562306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
179662306a36Sopenharmony_ci	int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
179762306a36Sopenharmony_ci	int value = ucontrol->value.integer.value[0];
179862306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_ci	wsa->comp_enabled[comp] = value;
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_ci	return 0;
180362306a36Sopenharmony_ci}
180462306a36Sopenharmony_ci
180562306a36Sopenharmony_cistatic int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol,
180662306a36Sopenharmony_ci					  struct snd_ctl_elem_value *ucontrol)
180762306a36Sopenharmony_ci{
180862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
180962306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = wsa->ear_spkr_gain;
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	return 0;
181462306a36Sopenharmony_ci}
181562306a36Sopenharmony_ci
181662306a36Sopenharmony_cistatic int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol,
181762306a36Sopenharmony_ci					  struct snd_ctl_elem_value *ucontrol)
181862306a36Sopenharmony_ci{
181962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
182062306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	wsa->ear_spkr_gain =  ucontrol->value.integer.value[0];
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci	return 0;
182562306a36Sopenharmony_ci}
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_cistatic int wsa_macro_rx_mux_get(struct snd_kcontrol *kcontrol,
182862306a36Sopenharmony_ci				struct snd_ctl_elem_value *ucontrol)
182962306a36Sopenharmony_ci{
183062306a36Sopenharmony_ci	struct snd_soc_dapm_widget *widget =
183162306a36Sopenharmony_ci		snd_soc_dapm_kcontrol_widget(kcontrol);
183262306a36Sopenharmony_ci	struct snd_soc_component *component =
183362306a36Sopenharmony_ci				snd_soc_dapm_to_component(widget->dapm);
183462306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
183562306a36Sopenharmony_ci
183662306a36Sopenharmony_ci	ucontrol->value.integer.value[0] =
183762306a36Sopenharmony_ci			wsa->rx_port_value[widget->shift];
183862306a36Sopenharmony_ci	return 0;
183962306a36Sopenharmony_ci}
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_cistatic int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol,
184262306a36Sopenharmony_ci				struct snd_ctl_elem_value *ucontrol)
184362306a36Sopenharmony_ci{
184462306a36Sopenharmony_ci	struct snd_soc_dapm_widget *widget =
184562306a36Sopenharmony_ci		snd_soc_dapm_kcontrol_widget(kcontrol);
184662306a36Sopenharmony_ci	struct snd_soc_component *component =
184762306a36Sopenharmony_ci				snd_soc_dapm_to_component(widget->dapm);
184862306a36Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
184962306a36Sopenharmony_ci	struct snd_soc_dapm_update *update = NULL;
185062306a36Sopenharmony_ci	u32 rx_port_value = ucontrol->value.integer.value[0];
185162306a36Sopenharmony_ci	u32 bit_input;
185262306a36Sopenharmony_ci	u32 aif_rst;
185362306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
185462306a36Sopenharmony_ci
185562306a36Sopenharmony_ci	aif_rst = wsa->rx_port_value[widget->shift];
185662306a36Sopenharmony_ci	if (!rx_port_value) {
185762306a36Sopenharmony_ci		if (aif_rst == 0)
185862306a36Sopenharmony_ci			return 0;
185962306a36Sopenharmony_ci		if (aif_rst >= WSA_MACRO_RX_MAX) {
186062306a36Sopenharmony_ci			dev_err(component->dev, "%s: Invalid AIF reset\n", __func__);
186162306a36Sopenharmony_ci			return 0;
186262306a36Sopenharmony_ci		}
186362306a36Sopenharmony_ci	}
186462306a36Sopenharmony_ci	wsa->rx_port_value[widget->shift] = rx_port_value;
186562306a36Sopenharmony_ci
186662306a36Sopenharmony_ci	bit_input = widget->shift;
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ci	switch (rx_port_value) {
186962306a36Sopenharmony_ci	case 0:
187062306a36Sopenharmony_ci		if (wsa->active_ch_cnt[aif_rst]) {
187162306a36Sopenharmony_ci			clear_bit(bit_input,
187262306a36Sopenharmony_ci				  &wsa->active_ch_mask[aif_rst]);
187362306a36Sopenharmony_ci			wsa->active_ch_cnt[aif_rst]--;
187462306a36Sopenharmony_ci		}
187562306a36Sopenharmony_ci		break;
187662306a36Sopenharmony_ci	case 1:
187762306a36Sopenharmony_ci	case 2:
187862306a36Sopenharmony_ci		set_bit(bit_input,
187962306a36Sopenharmony_ci			&wsa->active_ch_mask[rx_port_value]);
188062306a36Sopenharmony_ci		wsa->active_ch_cnt[rx_port_value]++;
188162306a36Sopenharmony_ci		break;
188262306a36Sopenharmony_ci	default:
188362306a36Sopenharmony_ci		dev_err(component->dev,
188462306a36Sopenharmony_ci			"%s: Invalid AIF_ID for WSA RX MUX %d\n",
188562306a36Sopenharmony_ci			__func__, rx_port_value);
188662306a36Sopenharmony_ci		return -EINVAL;
188762306a36Sopenharmony_ci	}
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_ci	snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
189062306a36Sopenharmony_ci					rx_port_value, e, update);
189162306a36Sopenharmony_ci	return 0;
189262306a36Sopenharmony_ci}
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_cistatic int wsa_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,
189562306a36Sopenharmony_ci					  struct snd_ctl_elem_value *ucontrol)
189662306a36Sopenharmony_ci{
189762306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
189862306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
189962306a36Sopenharmony_ci	int path = ((struct soc_mixer_control *)kcontrol->private_value)->shift;
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = wsa->is_softclip_on[path];
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	return 0;
190462306a36Sopenharmony_ci}
190562306a36Sopenharmony_ci
190662306a36Sopenharmony_cistatic int wsa_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,
190762306a36Sopenharmony_ci					  struct snd_ctl_elem_value *ucontrol)
190862306a36Sopenharmony_ci{
190962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
191062306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
191162306a36Sopenharmony_ci	int path = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	wsa->is_softclip_on[path] =  ucontrol->value.integer.value[0];
191462306a36Sopenharmony_ci
191562306a36Sopenharmony_ci	return 0;
191662306a36Sopenharmony_ci}
191762306a36Sopenharmony_ci
191862306a36Sopenharmony_cistatic const struct snd_kcontrol_new wsa_macro_snd_controls[] = {
191962306a36Sopenharmony_ci	SOC_ENUM_EXT("EAR SPKR PA Gain", wsa_macro_ear_spkr_pa_gain_enum,
192062306a36Sopenharmony_ci		     wsa_macro_ear_spkr_pa_gain_get,
192162306a36Sopenharmony_ci		     wsa_macro_ear_spkr_pa_gain_put),
192262306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_Softclip0 Enable", SND_SOC_NOPM,
192362306a36Sopenharmony_ci			WSA_MACRO_SOFTCLIP0, 1, 0,
192462306a36Sopenharmony_ci			wsa_macro_soft_clip_enable_get,
192562306a36Sopenharmony_ci			wsa_macro_soft_clip_enable_put),
192662306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_Softclip1 Enable", SND_SOC_NOPM,
192762306a36Sopenharmony_ci			WSA_MACRO_SOFTCLIP1, 1, 0,
192862306a36Sopenharmony_ci			wsa_macro_soft_clip_enable_get,
192962306a36Sopenharmony_ci			wsa_macro_soft_clip_enable_put),
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("WSA_RX0 Digital Volume", CDC_WSA_RX0_RX_VOL_CTL,
193262306a36Sopenharmony_ci			  -84, 40, digital_gain),
193362306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("WSA_RX1 Digital Volume", CDC_WSA_RX1_RX_VOL_CTL,
193462306a36Sopenharmony_ci			  -84, 40, digital_gain),
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci	SOC_SINGLE("WSA_RX0 Digital Mute", CDC_WSA_RX0_RX_PATH_CTL, 4, 1, 0),
193762306a36Sopenharmony_ci	SOC_SINGLE("WSA_RX1 Digital Mute", CDC_WSA_RX1_RX_PATH_CTL, 4, 1, 0),
193862306a36Sopenharmony_ci	SOC_SINGLE("WSA_RX0_MIX Digital Mute", CDC_WSA_RX0_RX_PATH_MIX_CTL, 4,
193962306a36Sopenharmony_ci		   1, 0),
194062306a36Sopenharmony_ci	SOC_SINGLE("WSA_RX1_MIX Digital Mute", CDC_WSA_RX1_RX_PATH_MIX_CTL, 4,
194162306a36Sopenharmony_ci		   1, 0),
194262306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_COMP1 Switch", SND_SOC_NOPM, WSA_MACRO_COMP1, 1, 0,
194362306a36Sopenharmony_ci		       wsa_macro_get_compander, wsa_macro_set_compander),
194462306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_COMP2 Switch", SND_SOC_NOPM, WSA_MACRO_COMP2, 1, 0,
194562306a36Sopenharmony_ci		       wsa_macro_get_compander, wsa_macro_set_compander),
194662306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_RX0 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX0, 1, 0,
194762306a36Sopenharmony_ci		       wsa_macro_get_ec_hq, wsa_macro_set_ec_hq),
194862306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_RX1 EC_HQ Switch", SND_SOC_NOPM, WSA_MACRO_RX1, 1, 0,
194962306a36Sopenharmony_ci		       wsa_macro_get_ec_hq, wsa_macro_set_ec_hq),
195062306a36Sopenharmony_ci};
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_cistatic const struct soc_enum rx_mux_enum =
195362306a36Sopenharmony_ci	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_mux_text), rx_mux_text);
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_mux[WSA_MACRO_RX_MAX] = {
195662306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("WSA RX0 Mux", rx_mux_enum,
195762306a36Sopenharmony_ci			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
195862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("WSA RX1 Mux", rx_mux_enum,
195962306a36Sopenharmony_ci			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
196062306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("WSA RX_MIX0 Mux", rx_mux_enum,
196162306a36Sopenharmony_ci			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
196262306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("WSA RX_MIX1 Mux", rx_mux_enum,
196362306a36Sopenharmony_ci			  wsa_macro_rx_mux_get, wsa_macro_rx_mux_put),
196462306a36Sopenharmony_ci};
196562306a36Sopenharmony_ci
196662306a36Sopenharmony_cistatic int wsa_macro_vi_feed_mixer_get(struct snd_kcontrol *kcontrol,
196762306a36Sopenharmony_ci				       struct snd_ctl_elem_value *ucontrol)
196862306a36Sopenharmony_ci{
196962306a36Sopenharmony_ci	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
197062306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
197162306a36Sopenharmony_ci	struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
197262306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
197362306a36Sopenharmony_ci	u32 spk_tx_id = mixer->shift;
197462306a36Sopenharmony_ci	u32 dai_id = widget->shift;
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	if (test_bit(spk_tx_id, &wsa->active_ch_mask[dai_id]))
197762306a36Sopenharmony_ci		ucontrol->value.integer.value[0] = 1;
197862306a36Sopenharmony_ci	else
197962306a36Sopenharmony_ci		ucontrol->value.integer.value[0] = 0;
198062306a36Sopenharmony_ci
198162306a36Sopenharmony_ci	return 0;
198262306a36Sopenharmony_ci}
198362306a36Sopenharmony_ci
198462306a36Sopenharmony_cistatic int wsa_macro_vi_feed_mixer_put(struct snd_kcontrol *kcontrol,
198562306a36Sopenharmony_ci				       struct snd_ctl_elem_value *ucontrol)
198662306a36Sopenharmony_ci{
198762306a36Sopenharmony_ci	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
198862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
198962306a36Sopenharmony_ci	struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
199062306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
199162306a36Sopenharmony_ci	u32 enable = ucontrol->value.integer.value[0];
199262306a36Sopenharmony_ci	u32 spk_tx_id = mixer->shift;
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_ci	if (enable) {
199562306a36Sopenharmony_ci		if (spk_tx_id == WSA_MACRO_TX0 &&
199662306a36Sopenharmony_ci			!test_bit(WSA_MACRO_TX0,
199762306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
199862306a36Sopenharmony_ci			set_bit(WSA_MACRO_TX0,
199962306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
200062306a36Sopenharmony_ci			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++;
200162306a36Sopenharmony_ci		}
200262306a36Sopenharmony_ci		if (spk_tx_id == WSA_MACRO_TX1 &&
200362306a36Sopenharmony_ci			!test_bit(WSA_MACRO_TX1,
200462306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
200562306a36Sopenharmony_ci			set_bit(WSA_MACRO_TX1,
200662306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
200762306a36Sopenharmony_ci			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]++;
200862306a36Sopenharmony_ci		}
200962306a36Sopenharmony_ci	} else {
201062306a36Sopenharmony_ci		if (spk_tx_id == WSA_MACRO_TX0 &&
201162306a36Sopenharmony_ci			test_bit(WSA_MACRO_TX0,
201262306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
201362306a36Sopenharmony_ci			clear_bit(WSA_MACRO_TX0,
201462306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
201562306a36Sopenharmony_ci			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--;
201662306a36Sopenharmony_ci		}
201762306a36Sopenharmony_ci		if (spk_tx_id == WSA_MACRO_TX1 &&
201862306a36Sopenharmony_ci			test_bit(WSA_MACRO_TX1,
201962306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI])) {
202062306a36Sopenharmony_ci			clear_bit(WSA_MACRO_TX1,
202162306a36Sopenharmony_ci				&wsa->active_ch_mask[WSA_MACRO_AIF_VI]);
202262306a36Sopenharmony_ci			wsa->active_ch_cnt[WSA_MACRO_AIF_VI]--;
202362306a36Sopenharmony_ci		}
202462306a36Sopenharmony_ci	}
202562306a36Sopenharmony_ci	snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, NULL);
202662306a36Sopenharmony_ci
202762306a36Sopenharmony_ci	return 0;
202862306a36Sopenharmony_ci}
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif_vi_mixer[] = {
203162306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_SPKR_VI_1", SND_SOC_NOPM, WSA_MACRO_TX0, 1, 0,
203262306a36Sopenharmony_ci			wsa_macro_vi_feed_mixer_get,
203362306a36Sopenharmony_ci			wsa_macro_vi_feed_mixer_put),
203462306a36Sopenharmony_ci	SOC_SINGLE_EXT("WSA_SPKR_VI_2", SND_SOC_NOPM, WSA_MACRO_TX1, 1, 0,
203562306a36Sopenharmony_ci			wsa_macro_vi_feed_mixer_get,
203662306a36Sopenharmony_ci			wsa_macro_vi_feed_mixer_put),
203762306a36Sopenharmony_ci};
203862306a36Sopenharmony_ci
203962306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget wsa_macro_dapm_widgets[] = {
204062306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("WSA AIF1 PB", "WSA_AIF1 Playback", 0,
204162306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0),
204262306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("WSA AIF_MIX1 PB", "WSA_AIF_MIX1 Playback", 0,
204362306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0),
204462306a36Sopenharmony_ci
204562306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT_E("WSA AIF_VI", "WSA_AIF_VI Capture", 0,
204662306a36Sopenharmony_ci			       SND_SOC_NOPM, WSA_MACRO_AIF_VI, 0,
204762306a36Sopenharmony_ci			       wsa_macro_enable_vi_feedback,
204862306a36Sopenharmony_ci			       SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
204962306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("WSA AIF_ECHO", "WSA_AIF_ECHO Capture", 0,
205062306a36Sopenharmony_ci			     SND_SOC_NOPM, 0, 0),
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA_AIF_VI Mixer", SND_SOC_NOPM, WSA_MACRO_AIF_VI,
205362306a36Sopenharmony_ci			   0, aif_vi_mixer, ARRAY_SIZE(aif_vi_mixer)),
205462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("WSA RX_MIX EC0_MUX", SND_SOC_NOPM,
205562306a36Sopenharmony_ci			   WSA_MACRO_EC0_MUX, 0,
205662306a36Sopenharmony_ci			   &rx_mix_ec0_mux, wsa_macro_enable_echo,
205762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
205862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("WSA RX_MIX EC1_MUX", SND_SOC_NOPM,
205962306a36Sopenharmony_ci			   WSA_MACRO_EC1_MUX, 0,
206062306a36Sopenharmony_ci			   &rx_mix_ec1_mux, wsa_macro_enable_echo,
206162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
206262306a36Sopenharmony_ci
206362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA RX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX0, 0,
206462306a36Sopenharmony_ci			 &rx_mux[WSA_MACRO_RX0]),
206562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA RX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX1, 0,
206662306a36Sopenharmony_ci			 &rx_mux[WSA_MACRO_RX1]),
206762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA RX_MIX0 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 0,
206862306a36Sopenharmony_ci			 &rx_mux[WSA_MACRO_RX_MIX0]),
206962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA RX_MIX1 MUX", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 0,
207062306a36Sopenharmony_ci			 &rx_mux[WSA_MACRO_RX_MIX1]),
207162306a36Sopenharmony_ci
207262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
207362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
207462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA RX_MIX0", SND_SOC_NOPM, 0, 0, NULL, 0),
207562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA RX_MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
207662306a36Sopenharmony_ci
207762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, &rx0_prim_inp0_mux),
207862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, &rx0_prim_inp1_mux),
207962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, &rx0_prim_inp2_mux),
208062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX0,
208162306a36Sopenharmony_ci			   0, &rx0_mix_mux, wsa_macro_enable_mix_path,
208262306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
208362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, &rx1_prim_inp0_mux),
208462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, &rx1_prim_inp1_mux),
208562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, &rx1_prim_inp2_mux),
208662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX1,
208762306a36Sopenharmony_ci			   0, &rx1_mix_mux, wsa_macro_enable_mix_path,
208862306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
208962306a36Sopenharmony_ci
209062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("WSA_RX INT0 MIX", SND_SOC_NOPM, 0, 0, NULL, 0,
209162306a36Sopenharmony_ci			     wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU),
209262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("WSA_RX INT1 MIX", SND_SOC_NOPM, 1, 0, NULL, 0,
209362306a36Sopenharmony_ci			     wsa_macro_enable_main_path, SND_SOC_DAPM_PRE_PMU),
209462306a36Sopenharmony_ci
209562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA_RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
209662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("WSA_RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
209762306a36Sopenharmony_ci
209862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("WSA_RX0 INT0 SIDETONE MIX", CDC_WSA_RX0_RX_PATH_CFG1,
209962306a36Sopenharmony_ci			 4, 0, &rx0_sidetone_mix_mux),
210062306a36Sopenharmony_ci
210162306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("WSA SRC0_INP"),
210262306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("WSA_TX DEC0_INP"),
210362306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("WSA_TX DEC1_INP"),
210462306a36Sopenharmony_ci
210562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("WSA_RX INT0 INTERP", SND_SOC_NOPM,
210662306a36Sopenharmony_ci			     WSA_MACRO_COMP1, 0, NULL, 0,
210762306a36Sopenharmony_ci			     wsa_macro_enable_interpolator,
210862306a36Sopenharmony_ci			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
210962306a36Sopenharmony_ci			     SND_SOC_DAPM_POST_PMD),
211062306a36Sopenharmony_ci
211162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("WSA_RX INT1 INTERP", SND_SOC_NOPM,
211262306a36Sopenharmony_ci			     WSA_MACRO_COMP2, 0, NULL, 0,
211362306a36Sopenharmony_ci			     wsa_macro_enable_interpolator,
211462306a36Sopenharmony_ci			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
211562306a36Sopenharmony_ci			     SND_SOC_DAPM_POST_PMD),
211662306a36Sopenharmony_ci
211762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("WSA_RX INT0 CHAIN", SND_SOC_NOPM, 0, 0,
211862306a36Sopenharmony_ci			     NULL, 0, wsa_macro_spk_boost_event,
211962306a36Sopenharmony_ci			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
212062306a36Sopenharmony_ci			     SND_SOC_DAPM_POST_PMD),
212162306a36Sopenharmony_ci
212262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER_E("WSA_RX INT1 CHAIN", SND_SOC_NOPM, 0, 0,
212362306a36Sopenharmony_ci			     NULL, 0, wsa_macro_spk_boost_event,
212462306a36Sopenharmony_ci			     SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
212562306a36Sopenharmony_ci			     SND_SOC_DAPM_POST_PMD),
212662306a36Sopenharmony_ci
212762306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("VIINPUT_WSA"),
212862306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("WSA_SPK1 OUT"),
212962306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("WSA_SPK2 OUT"),
213062306a36Sopenharmony_ci
213162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("WSA_RX0_CLK", CDC_WSA_RX0_RX_PATH_CTL, 5, 0, NULL, 0),
213262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("WSA_RX1_CLK", CDC_WSA_RX1_RX_PATH_CTL, 5, 0, NULL, 0),
213362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("WSA_RX_MIX0_CLK", CDC_WSA_RX0_RX_PATH_MIX_CTL, 5, 0, NULL, 0),
213462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("WSA_RX_MIX1_CLK", CDC_WSA_RX1_RX_PATH_MIX_CTL, 5, 0, NULL, 0),
213562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("WSA_MCLK", 0, SND_SOC_NOPM, 0, 0,
213662306a36Sopenharmony_ci			      wsa_macro_mclk_event,
213762306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
213862306a36Sopenharmony_ci};
213962306a36Sopenharmony_ci
214062306a36Sopenharmony_cistatic const struct snd_soc_dapm_route wsa_audio_map[] = {
214162306a36Sopenharmony_ci	/* VI Feedback */
214262306a36Sopenharmony_ci	{"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"},
214362306a36Sopenharmony_ci	{"WSA_AIF_VI Mixer", "WSA_SPKR_VI_2", "VIINPUT_WSA"},
214462306a36Sopenharmony_ci	{"WSA AIF_VI", NULL, "WSA_AIF_VI Mixer"},
214562306a36Sopenharmony_ci	{"WSA AIF_VI", NULL, "WSA_MCLK"},
214662306a36Sopenharmony_ci
214762306a36Sopenharmony_ci	{"WSA RX_MIX EC0_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"},
214862306a36Sopenharmony_ci	{"WSA RX_MIX EC1_MUX", "RX_MIX_TX0", "WSA_RX INT0 SEC MIX"},
214962306a36Sopenharmony_ci	{"WSA RX_MIX EC0_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"},
215062306a36Sopenharmony_ci	{"WSA RX_MIX EC1_MUX", "RX_MIX_TX1", "WSA_RX INT1 SEC MIX"},
215162306a36Sopenharmony_ci	{"WSA AIF_ECHO", NULL, "WSA RX_MIX EC0_MUX"},
215262306a36Sopenharmony_ci	{"WSA AIF_ECHO", NULL, "WSA RX_MIX EC1_MUX"},
215362306a36Sopenharmony_ci	{"WSA AIF_ECHO", NULL, "WSA_MCLK"},
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci	{"WSA AIF1 PB", NULL, "WSA_MCLK"},
215662306a36Sopenharmony_ci	{"WSA AIF_MIX1 PB", NULL, "WSA_MCLK"},
215762306a36Sopenharmony_ci
215862306a36Sopenharmony_ci	{"WSA RX0 MUX", "AIF1_PB", "WSA AIF1 PB"},
215962306a36Sopenharmony_ci	{"WSA RX1 MUX", "AIF1_PB", "WSA AIF1 PB"},
216062306a36Sopenharmony_ci	{"WSA RX_MIX0 MUX", "AIF1_PB", "WSA AIF1 PB"},
216162306a36Sopenharmony_ci	{"WSA RX_MIX1 MUX", "AIF1_PB", "WSA AIF1 PB"},
216262306a36Sopenharmony_ci
216362306a36Sopenharmony_ci	{"WSA RX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
216462306a36Sopenharmony_ci	{"WSA RX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
216562306a36Sopenharmony_ci	{"WSA RX_MIX0 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
216662306a36Sopenharmony_ci	{"WSA RX_MIX1 MUX", "AIF_MIX1_PB", "WSA AIF_MIX1 PB"},
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_ci	{"WSA RX0", NULL, "WSA RX0 MUX"},
216962306a36Sopenharmony_ci	{"WSA RX1", NULL, "WSA RX1 MUX"},
217062306a36Sopenharmony_ci	{"WSA RX_MIX0", NULL, "WSA RX_MIX0 MUX"},
217162306a36Sopenharmony_ci	{"WSA RX_MIX1", NULL, "WSA RX_MIX1 MUX"},
217262306a36Sopenharmony_ci
217362306a36Sopenharmony_ci	{"WSA RX0", NULL, "WSA_RX0_CLK"},
217462306a36Sopenharmony_ci	{"WSA RX1", NULL, "WSA_RX1_CLK"},
217562306a36Sopenharmony_ci	{"WSA RX_MIX0", NULL, "WSA_RX_MIX0_CLK"},
217662306a36Sopenharmony_ci	{"WSA RX_MIX1", NULL, "WSA_RX_MIX1_CLK"},
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_ci	{"WSA_RX0 INP0", "RX0", "WSA RX0"},
217962306a36Sopenharmony_ci	{"WSA_RX0 INP0", "RX1", "WSA RX1"},
218062306a36Sopenharmony_ci	{"WSA_RX0 INP0", "RX_MIX0", "WSA RX_MIX0"},
218162306a36Sopenharmony_ci	{"WSA_RX0 INP0", "RX_MIX1", "WSA RX_MIX1"},
218262306a36Sopenharmony_ci	{"WSA_RX0 INP0", "DEC0", "WSA_TX DEC0_INP"},
218362306a36Sopenharmony_ci	{"WSA_RX0 INP0", "DEC1", "WSA_TX DEC1_INP"},
218462306a36Sopenharmony_ci	{"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP0"},
218562306a36Sopenharmony_ci
218662306a36Sopenharmony_ci	{"WSA_RX0 INP1", "RX0", "WSA RX0"},
218762306a36Sopenharmony_ci	{"WSA_RX0 INP1", "RX1", "WSA RX1"},
218862306a36Sopenharmony_ci	{"WSA_RX0 INP1", "RX_MIX0", "WSA RX_MIX0"},
218962306a36Sopenharmony_ci	{"WSA_RX0 INP1", "RX_MIX1", "WSA RX_MIX1"},
219062306a36Sopenharmony_ci	{"WSA_RX0 INP1", "DEC0", "WSA_TX DEC0_INP"},
219162306a36Sopenharmony_ci	{"WSA_RX0 INP1", "DEC1", "WSA_TX DEC1_INP"},
219262306a36Sopenharmony_ci	{"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP1"},
219362306a36Sopenharmony_ci
219462306a36Sopenharmony_ci	{"WSA_RX0 INP2", "RX0", "WSA RX0"},
219562306a36Sopenharmony_ci	{"WSA_RX0 INP2", "RX1", "WSA RX1"},
219662306a36Sopenharmony_ci	{"WSA_RX0 INP2", "RX_MIX0", "WSA RX_MIX0"},
219762306a36Sopenharmony_ci	{"WSA_RX0 INP2", "RX_MIX1", "WSA RX_MIX1"},
219862306a36Sopenharmony_ci	{"WSA_RX0 INP2", "DEC0", "WSA_TX DEC0_INP"},
219962306a36Sopenharmony_ci	{"WSA_RX0 INP2", "DEC1", "WSA_TX DEC1_INP"},
220062306a36Sopenharmony_ci	{"WSA_RX INT0 MIX", NULL, "WSA_RX0 INP2"},
220162306a36Sopenharmony_ci
220262306a36Sopenharmony_ci	{"WSA_RX0 MIX INP", "RX0", "WSA RX0"},
220362306a36Sopenharmony_ci	{"WSA_RX0 MIX INP", "RX1", "WSA RX1"},
220462306a36Sopenharmony_ci	{"WSA_RX0 MIX INP", "RX_MIX0", "WSA RX_MIX0"},
220562306a36Sopenharmony_ci	{"WSA_RX0 MIX INP", "RX_MIX1", "WSA RX_MIX1"},
220662306a36Sopenharmony_ci	{"WSA_RX INT0 SEC MIX", NULL, "WSA_RX0 MIX INP"},
220762306a36Sopenharmony_ci
220862306a36Sopenharmony_ci	{"WSA_RX INT0 SEC MIX", NULL, "WSA_RX INT0 MIX"},
220962306a36Sopenharmony_ci	{"WSA_RX INT0 INTERP", NULL, "WSA_RX INT0 SEC MIX"},
221062306a36Sopenharmony_ci	{"WSA_RX0 INT0 SIDETONE MIX", "SRC0", "WSA SRC0_INP"},
221162306a36Sopenharmony_ci	{"WSA_RX INT0 INTERP", NULL, "WSA_RX0 INT0 SIDETONE MIX"},
221262306a36Sopenharmony_ci	{"WSA_RX INT0 CHAIN", NULL, "WSA_RX INT0 INTERP"},
221362306a36Sopenharmony_ci
221462306a36Sopenharmony_ci	{"WSA_SPK1 OUT", NULL, "WSA_RX INT0 CHAIN"},
221562306a36Sopenharmony_ci	{"WSA_SPK1 OUT", NULL, "WSA_MCLK"},
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_ci	{"WSA_RX1 INP0", "RX0", "WSA RX0"},
221862306a36Sopenharmony_ci	{"WSA_RX1 INP0", "RX1", "WSA RX1"},
221962306a36Sopenharmony_ci	{"WSA_RX1 INP0", "RX_MIX0", "WSA RX_MIX0"},
222062306a36Sopenharmony_ci	{"WSA_RX1 INP0", "RX_MIX1", "WSA RX_MIX1"},
222162306a36Sopenharmony_ci	{"WSA_RX1 INP0", "DEC0", "WSA_TX DEC0_INP"},
222262306a36Sopenharmony_ci	{"WSA_RX1 INP0", "DEC1", "WSA_TX DEC1_INP"},
222362306a36Sopenharmony_ci	{"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP0"},
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	{"WSA_RX1 INP1", "RX0", "WSA RX0"},
222662306a36Sopenharmony_ci	{"WSA_RX1 INP1", "RX1", "WSA RX1"},
222762306a36Sopenharmony_ci	{"WSA_RX1 INP1", "RX_MIX0", "WSA RX_MIX0"},
222862306a36Sopenharmony_ci	{"WSA_RX1 INP1", "RX_MIX1", "WSA RX_MIX1"},
222962306a36Sopenharmony_ci	{"WSA_RX1 INP1", "DEC0", "WSA_TX DEC0_INP"},
223062306a36Sopenharmony_ci	{"WSA_RX1 INP1", "DEC1", "WSA_TX DEC1_INP"},
223162306a36Sopenharmony_ci	{"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP1"},
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_ci	{"WSA_RX1 INP2", "RX0", "WSA RX0"},
223462306a36Sopenharmony_ci	{"WSA_RX1 INP2", "RX1", "WSA RX1"},
223562306a36Sopenharmony_ci	{"WSA_RX1 INP2", "RX_MIX0", "WSA RX_MIX0"},
223662306a36Sopenharmony_ci	{"WSA_RX1 INP2", "RX_MIX1", "WSA RX_MIX1"},
223762306a36Sopenharmony_ci	{"WSA_RX1 INP2", "DEC0", "WSA_TX DEC0_INP"},
223862306a36Sopenharmony_ci	{"WSA_RX1 INP2", "DEC1", "WSA_TX DEC1_INP"},
223962306a36Sopenharmony_ci	{"WSA_RX INT1 MIX", NULL, "WSA_RX1 INP2"},
224062306a36Sopenharmony_ci
224162306a36Sopenharmony_ci	{"WSA_RX1 MIX INP", "RX0", "WSA RX0"},
224262306a36Sopenharmony_ci	{"WSA_RX1 MIX INP", "RX1", "WSA RX1"},
224362306a36Sopenharmony_ci	{"WSA_RX1 MIX INP", "RX_MIX0", "WSA RX_MIX0"},
224462306a36Sopenharmony_ci	{"WSA_RX1 MIX INP", "RX_MIX1", "WSA RX_MIX1"},
224562306a36Sopenharmony_ci	{"WSA_RX INT1 SEC MIX", NULL, "WSA_RX1 MIX INP"},
224662306a36Sopenharmony_ci
224762306a36Sopenharmony_ci	{"WSA_RX INT1 SEC MIX", NULL, "WSA_RX INT1 MIX"},
224862306a36Sopenharmony_ci	{"WSA_RX INT1 INTERP", NULL, "WSA_RX INT1 SEC MIX"},
224962306a36Sopenharmony_ci
225062306a36Sopenharmony_ci	{"WSA_RX INT1 CHAIN", NULL, "WSA_RX INT1 INTERP"},
225162306a36Sopenharmony_ci	{"WSA_SPK2 OUT", NULL, "WSA_RX INT1 CHAIN"},
225262306a36Sopenharmony_ci	{"WSA_SPK2 OUT", NULL, "WSA_MCLK"},
225362306a36Sopenharmony_ci};
225462306a36Sopenharmony_ci
225562306a36Sopenharmony_cistatic int wsa_swrm_clock(struct wsa_macro *wsa, bool enable)
225662306a36Sopenharmony_ci{
225762306a36Sopenharmony_ci	struct regmap *regmap = wsa->regmap;
225862306a36Sopenharmony_ci
225962306a36Sopenharmony_ci	if (enable) {
226062306a36Sopenharmony_ci		int ret;
226162306a36Sopenharmony_ci
226262306a36Sopenharmony_ci		ret = clk_prepare_enable(wsa->mclk);
226362306a36Sopenharmony_ci		if (ret) {
226462306a36Sopenharmony_ci			dev_err(wsa->dev, "failed to enable mclk\n");
226562306a36Sopenharmony_ci			return ret;
226662306a36Sopenharmony_ci		}
226762306a36Sopenharmony_ci		wsa_macro_mclk_enable(wsa, true);
226862306a36Sopenharmony_ci
226962306a36Sopenharmony_ci		regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
227062306a36Sopenharmony_ci				   CDC_WSA_SWR_CLK_EN_MASK,
227162306a36Sopenharmony_ci				   CDC_WSA_SWR_CLK_ENABLE);
227262306a36Sopenharmony_ci
227362306a36Sopenharmony_ci	} else {
227462306a36Sopenharmony_ci		regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
227562306a36Sopenharmony_ci				   CDC_WSA_SWR_CLK_EN_MASK, 0);
227662306a36Sopenharmony_ci		wsa_macro_mclk_enable(wsa, false);
227762306a36Sopenharmony_ci		clk_disable_unprepare(wsa->mclk);
227862306a36Sopenharmony_ci	}
227962306a36Sopenharmony_ci
228062306a36Sopenharmony_ci	return 0;
228162306a36Sopenharmony_ci}
228262306a36Sopenharmony_ci
228362306a36Sopenharmony_cistatic int wsa_macro_component_probe(struct snd_soc_component *comp)
228462306a36Sopenharmony_ci{
228562306a36Sopenharmony_ci	struct wsa_macro *wsa = snd_soc_component_get_drvdata(comp);
228662306a36Sopenharmony_ci
228762306a36Sopenharmony_ci	snd_soc_component_init_regmap(comp, wsa->regmap);
228862306a36Sopenharmony_ci
228962306a36Sopenharmony_ci	wsa->spkr_gain_offset = WSA_MACRO_GAIN_OFFSET_M1P5_DB;
229062306a36Sopenharmony_ci
229162306a36Sopenharmony_ci	/* set SPKR rate to FS_2P4_3P072 */
229262306a36Sopenharmony_ci	snd_soc_component_update_bits(comp, CDC_WSA_RX0_RX_PATH_CFG1,
229362306a36Sopenharmony_ci				CDC_WSA_RX_PATH_SPKR_RATE_MASK,
229462306a36Sopenharmony_ci				CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072);
229562306a36Sopenharmony_ci
229662306a36Sopenharmony_ci	snd_soc_component_update_bits(comp, CDC_WSA_RX1_RX_PATH_CFG1,
229762306a36Sopenharmony_ci				CDC_WSA_RX_PATH_SPKR_RATE_MASK,
229862306a36Sopenharmony_ci				CDC_WSA_RX_PATH_SPKR_RATE_FS_2P4_3P072);
229962306a36Sopenharmony_ci
230062306a36Sopenharmony_ci	wsa_macro_set_spkr_mode(comp, WSA_MACRO_SPKR_MODE_1);
230162306a36Sopenharmony_ci
230262306a36Sopenharmony_ci	return 0;
230362306a36Sopenharmony_ci}
230462306a36Sopenharmony_ci
230562306a36Sopenharmony_cistatic int swclk_gate_enable(struct clk_hw *hw)
230662306a36Sopenharmony_ci{
230762306a36Sopenharmony_ci	return wsa_swrm_clock(to_wsa_macro(hw), true);
230862306a36Sopenharmony_ci}
230962306a36Sopenharmony_ci
231062306a36Sopenharmony_cistatic void swclk_gate_disable(struct clk_hw *hw)
231162306a36Sopenharmony_ci{
231262306a36Sopenharmony_ci	wsa_swrm_clock(to_wsa_macro(hw), false);
231362306a36Sopenharmony_ci}
231462306a36Sopenharmony_ci
231562306a36Sopenharmony_cistatic int swclk_gate_is_enabled(struct clk_hw *hw)
231662306a36Sopenharmony_ci{
231762306a36Sopenharmony_ci	struct wsa_macro *wsa = to_wsa_macro(hw);
231862306a36Sopenharmony_ci	int ret, val;
231962306a36Sopenharmony_ci
232062306a36Sopenharmony_ci	regmap_read(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, &val);
232162306a36Sopenharmony_ci	ret = val & BIT(0);
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_ci	return ret;
232462306a36Sopenharmony_ci}
232562306a36Sopenharmony_ci
232662306a36Sopenharmony_cistatic unsigned long swclk_recalc_rate(struct clk_hw *hw,
232762306a36Sopenharmony_ci				       unsigned long parent_rate)
232862306a36Sopenharmony_ci{
232962306a36Sopenharmony_ci	return parent_rate / 2;
233062306a36Sopenharmony_ci}
233162306a36Sopenharmony_ci
233262306a36Sopenharmony_cistatic const struct clk_ops swclk_gate_ops = {
233362306a36Sopenharmony_ci	.prepare = swclk_gate_enable,
233462306a36Sopenharmony_ci	.unprepare = swclk_gate_disable,
233562306a36Sopenharmony_ci	.is_enabled = swclk_gate_is_enabled,
233662306a36Sopenharmony_ci	.recalc_rate = swclk_recalc_rate,
233762306a36Sopenharmony_ci};
233862306a36Sopenharmony_ci
233962306a36Sopenharmony_cistatic int wsa_macro_register_mclk_output(struct wsa_macro *wsa)
234062306a36Sopenharmony_ci{
234162306a36Sopenharmony_ci	struct device *dev = wsa->dev;
234262306a36Sopenharmony_ci	const char *parent_clk_name;
234362306a36Sopenharmony_ci	struct clk_hw *hw;
234462306a36Sopenharmony_ci	struct clk_init_data init;
234562306a36Sopenharmony_ci	int ret;
234662306a36Sopenharmony_ci
234762306a36Sopenharmony_ci	if (wsa->npl)
234862306a36Sopenharmony_ci		parent_clk_name = __clk_get_name(wsa->npl);
234962306a36Sopenharmony_ci	else
235062306a36Sopenharmony_ci		parent_clk_name = __clk_get_name(wsa->mclk);
235162306a36Sopenharmony_ci
235262306a36Sopenharmony_ci	init.name = "mclk";
235362306a36Sopenharmony_ci	of_property_read_string(dev_of_node(dev), "clock-output-names",
235462306a36Sopenharmony_ci				&init.name);
235562306a36Sopenharmony_ci	init.ops = &swclk_gate_ops;
235662306a36Sopenharmony_ci	init.flags = 0;
235762306a36Sopenharmony_ci	init.parent_names = &parent_clk_name;
235862306a36Sopenharmony_ci	init.num_parents = 1;
235962306a36Sopenharmony_ci	wsa->hw.init = &init;
236062306a36Sopenharmony_ci	hw = &wsa->hw;
236162306a36Sopenharmony_ci	ret = clk_hw_register(wsa->dev, hw);
236262306a36Sopenharmony_ci	if (ret)
236362306a36Sopenharmony_ci		return ret;
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
236662306a36Sopenharmony_ci}
236762306a36Sopenharmony_ci
236862306a36Sopenharmony_cistatic const struct snd_soc_component_driver wsa_macro_component_drv = {
236962306a36Sopenharmony_ci	.name = "WSA MACRO",
237062306a36Sopenharmony_ci	.probe = wsa_macro_component_probe,
237162306a36Sopenharmony_ci	.controls = wsa_macro_snd_controls,
237262306a36Sopenharmony_ci	.num_controls = ARRAY_SIZE(wsa_macro_snd_controls),
237362306a36Sopenharmony_ci	.dapm_widgets = wsa_macro_dapm_widgets,
237462306a36Sopenharmony_ci	.num_dapm_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets),
237562306a36Sopenharmony_ci	.dapm_routes = wsa_audio_map,
237662306a36Sopenharmony_ci	.num_dapm_routes = ARRAY_SIZE(wsa_audio_map),
237762306a36Sopenharmony_ci};
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_cistatic int wsa_macro_probe(struct platform_device *pdev)
238062306a36Sopenharmony_ci{
238162306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
238262306a36Sopenharmony_ci	struct wsa_macro *wsa;
238362306a36Sopenharmony_ci	kernel_ulong_t flags;
238462306a36Sopenharmony_ci	void __iomem *base;
238562306a36Sopenharmony_ci	int ret;
238662306a36Sopenharmony_ci
238762306a36Sopenharmony_ci	flags = (kernel_ulong_t)device_get_match_data(dev);
238862306a36Sopenharmony_ci
238962306a36Sopenharmony_ci	wsa = devm_kzalloc(dev, sizeof(*wsa), GFP_KERNEL);
239062306a36Sopenharmony_ci	if (!wsa)
239162306a36Sopenharmony_ci		return -ENOMEM;
239262306a36Sopenharmony_ci
239362306a36Sopenharmony_ci	wsa->macro = devm_clk_get_optional(dev, "macro");
239462306a36Sopenharmony_ci	if (IS_ERR(wsa->macro))
239562306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(wsa->macro), "unable to get macro clock\n");
239662306a36Sopenharmony_ci
239762306a36Sopenharmony_ci	wsa->dcodec = devm_clk_get_optional(dev, "dcodec");
239862306a36Sopenharmony_ci	if (IS_ERR(wsa->dcodec))
239962306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(wsa->dcodec), "unable to get dcodec clock\n");
240062306a36Sopenharmony_ci
240162306a36Sopenharmony_ci	wsa->mclk = devm_clk_get(dev, "mclk");
240262306a36Sopenharmony_ci	if (IS_ERR(wsa->mclk))
240362306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(wsa->mclk), "unable to get mclk clock\n");
240462306a36Sopenharmony_ci
240562306a36Sopenharmony_ci	if (flags & LPASS_MACRO_FLAG_HAS_NPL_CLOCK) {
240662306a36Sopenharmony_ci		wsa->npl = devm_clk_get(dev, "npl");
240762306a36Sopenharmony_ci		if (IS_ERR(wsa->npl))
240862306a36Sopenharmony_ci			return dev_err_probe(dev, PTR_ERR(wsa->npl), "unable to get npl clock\n");
240962306a36Sopenharmony_ci	}
241062306a36Sopenharmony_ci
241162306a36Sopenharmony_ci	wsa->fsgen = devm_clk_get(dev, "fsgen");
241262306a36Sopenharmony_ci	if (IS_ERR(wsa->fsgen))
241362306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(wsa->fsgen), "unable to get fsgen clock\n");
241462306a36Sopenharmony_ci
241562306a36Sopenharmony_ci	base = devm_platform_ioremap_resource(pdev, 0);
241662306a36Sopenharmony_ci	if (IS_ERR(base))
241762306a36Sopenharmony_ci		return PTR_ERR(base);
241862306a36Sopenharmony_ci
241962306a36Sopenharmony_ci	wsa->regmap = devm_regmap_init_mmio(dev, base, &wsa_regmap_config);
242062306a36Sopenharmony_ci	if (IS_ERR(wsa->regmap))
242162306a36Sopenharmony_ci		return PTR_ERR(wsa->regmap);
242262306a36Sopenharmony_ci
242362306a36Sopenharmony_ci	dev_set_drvdata(dev, wsa);
242462306a36Sopenharmony_ci
242562306a36Sopenharmony_ci	wsa->dev = dev;
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci	/* set MCLK and NPL rates */
242862306a36Sopenharmony_ci	clk_set_rate(wsa->mclk, WSA_MACRO_MCLK_FREQ);
242962306a36Sopenharmony_ci	clk_set_rate(wsa->npl, WSA_MACRO_MCLK_FREQ);
243062306a36Sopenharmony_ci
243162306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->macro);
243262306a36Sopenharmony_ci	if (ret)
243362306a36Sopenharmony_ci		goto err;
243462306a36Sopenharmony_ci
243562306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->dcodec);
243662306a36Sopenharmony_ci	if (ret)
243762306a36Sopenharmony_ci		goto err_dcodec;
243862306a36Sopenharmony_ci
243962306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->mclk);
244062306a36Sopenharmony_ci	if (ret)
244162306a36Sopenharmony_ci		goto err_mclk;
244262306a36Sopenharmony_ci
244362306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->npl);
244462306a36Sopenharmony_ci	if (ret)
244562306a36Sopenharmony_ci		goto err_npl;
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->fsgen);
244862306a36Sopenharmony_ci	if (ret)
244962306a36Sopenharmony_ci		goto err_fsgen;
245062306a36Sopenharmony_ci
245162306a36Sopenharmony_ci	/* reset swr ip */
245262306a36Sopenharmony_ci	regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
245362306a36Sopenharmony_ci			   CDC_WSA_SWR_RST_EN_MASK, CDC_WSA_SWR_RST_ENABLE);
245462306a36Sopenharmony_ci
245562306a36Sopenharmony_ci	regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
245662306a36Sopenharmony_ci			   CDC_WSA_SWR_CLK_EN_MASK, CDC_WSA_SWR_CLK_ENABLE);
245762306a36Sopenharmony_ci
245862306a36Sopenharmony_ci	/* Bring out of reset */
245962306a36Sopenharmony_ci	regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
246062306a36Sopenharmony_ci			   CDC_WSA_SWR_RST_EN_MASK, CDC_WSA_SWR_RST_DISABLE);
246162306a36Sopenharmony_ci
246262306a36Sopenharmony_ci	ret = devm_snd_soc_register_component(dev, &wsa_macro_component_drv,
246362306a36Sopenharmony_ci					      wsa_macro_dai,
246462306a36Sopenharmony_ci					      ARRAY_SIZE(wsa_macro_dai));
246562306a36Sopenharmony_ci	if (ret)
246662306a36Sopenharmony_ci		goto err_clkout;
246762306a36Sopenharmony_ci
246862306a36Sopenharmony_ci	pm_runtime_set_autosuspend_delay(dev, 3000);
246962306a36Sopenharmony_ci	pm_runtime_use_autosuspend(dev);
247062306a36Sopenharmony_ci	pm_runtime_mark_last_busy(dev);
247162306a36Sopenharmony_ci	pm_runtime_set_active(dev);
247262306a36Sopenharmony_ci	pm_runtime_enable(dev);
247362306a36Sopenharmony_ci
247462306a36Sopenharmony_ci	ret = wsa_macro_register_mclk_output(wsa);
247562306a36Sopenharmony_ci	if (ret)
247662306a36Sopenharmony_ci		goto err_clkout;
247762306a36Sopenharmony_ci
247862306a36Sopenharmony_ci	return 0;
247962306a36Sopenharmony_ci
248062306a36Sopenharmony_cierr_clkout:
248162306a36Sopenharmony_ci	clk_disable_unprepare(wsa->fsgen);
248262306a36Sopenharmony_cierr_fsgen:
248362306a36Sopenharmony_ci	clk_disable_unprepare(wsa->npl);
248462306a36Sopenharmony_cierr_npl:
248562306a36Sopenharmony_ci	clk_disable_unprepare(wsa->mclk);
248662306a36Sopenharmony_cierr_mclk:
248762306a36Sopenharmony_ci	clk_disable_unprepare(wsa->dcodec);
248862306a36Sopenharmony_cierr_dcodec:
248962306a36Sopenharmony_ci	clk_disable_unprepare(wsa->macro);
249062306a36Sopenharmony_cierr:
249162306a36Sopenharmony_ci	return ret;
249262306a36Sopenharmony_ci
249362306a36Sopenharmony_ci}
249462306a36Sopenharmony_ci
249562306a36Sopenharmony_cistatic void wsa_macro_remove(struct platform_device *pdev)
249662306a36Sopenharmony_ci{
249762306a36Sopenharmony_ci	struct wsa_macro *wsa = dev_get_drvdata(&pdev->dev);
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	clk_disable_unprepare(wsa->macro);
250062306a36Sopenharmony_ci	clk_disable_unprepare(wsa->dcodec);
250162306a36Sopenharmony_ci	clk_disable_unprepare(wsa->mclk);
250262306a36Sopenharmony_ci	clk_disable_unprepare(wsa->npl);
250362306a36Sopenharmony_ci	clk_disable_unprepare(wsa->fsgen);
250462306a36Sopenharmony_ci}
250562306a36Sopenharmony_ci
250662306a36Sopenharmony_cistatic int __maybe_unused wsa_macro_runtime_suspend(struct device *dev)
250762306a36Sopenharmony_ci{
250862306a36Sopenharmony_ci	struct wsa_macro *wsa = dev_get_drvdata(dev);
250962306a36Sopenharmony_ci
251062306a36Sopenharmony_ci	regcache_cache_only(wsa->regmap, true);
251162306a36Sopenharmony_ci	regcache_mark_dirty(wsa->regmap);
251262306a36Sopenharmony_ci
251362306a36Sopenharmony_ci	clk_disable_unprepare(wsa->fsgen);
251462306a36Sopenharmony_ci	clk_disable_unprepare(wsa->npl);
251562306a36Sopenharmony_ci	clk_disable_unprepare(wsa->mclk);
251662306a36Sopenharmony_ci
251762306a36Sopenharmony_ci	return 0;
251862306a36Sopenharmony_ci}
251962306a36Sopenharmony_ci
252062306a36Sopenharmony_cistatic int __maybe_unused wsa_macro_runtime_resume(struct device *dev)
252162306a36Sopenharmony_ci{
252262306a36Sopenharmony_ci	struct wsa_macro *wsa = dev_get_drvdata(dev);
252362306a36Sopenharmony_ci	int ret;
252462306a36Sopenharmony_ci
252562306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->mclk);
252662306a36Sopenharmony_ci	if (ret) {
252762306a36Sopenharmony_ci		dev_err(dev, "unable to prepare mclk\n");
252862306a36Sopenharmony_ci		return ret;
252962306a36Sopenharmony_ci	}
253062306a36Sopenharmony_ci
253162306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->npl);
253262306a36Sopenharmony_ci	if (ret) {
253362306a36Sopenharmony_ci		dev_err(dev, "unable to prepare mclkx2\n");
253462306a36Sopenharmony_ci		goto err_npl;
253562306a36Sopenharmony_ci	}
253662306a36Sopenharmony_ci
253762306a36Sopenharmony_ci	ret = clk_prepare_enable(wsa->fsgen);
253862306a36Sopenharmony_ci	if (ret) {
253962306a36Sopenharmony_ci		dev_err(dev, "unable to prepare fsgen\n");
254062306a36Sopenharmony_ci		goto err_fsgen;
254162306a36Sopenharmony_ci	}
254262306a36Sopenharmony_ci
254362306a36Sopenharmony_ci	regcache_cache_only(wsa->regmap, false);
254462306a36Sopenharmony_ci	regcache_sync(wsa->regmap);
254562306a36Sopenharmony_ci
254662306a36Sopenharmony_ci	return 0;
254762306a36Sopenharmony_cierr_fsgen:
254862306a36Sopenharmony_ci	clk_disable_unprepare(wsa->npl);
254962306a36Sopenharmony_cierr_npl:
255062306a36Sopenharmony_ci	clk_disable_unprepare(wsa->mclk);
255162306a36Sopenharmony_ci
255262306a36Sopenharmony_ci	return ret;
255362306a36Sopenharmony_ci}
255462306a36Sopenharmony_ci
255562306a36Sopenharmony_cistatic const struct dev_pm_ops wsa_macro_pm_ops = {
255662306a36Sopenharmony_ci	SET_RUNTIME_PM_OPS(wsa_macro_runtime_suspend, wsa_macro_runtime_resume, NULL)
255762306a36Sopenharmony_ci};
255862306a36Sopenharmony_ci
255962306a36Sopenharmony_cistatic const struct of_device_id wsa_macro_dt_match[] = {
256062306a36Sopenharmony_ci	{
256162306a36Sopenharmony_ci		.compatible = "qcom,sc7280-lpass-wsa-macro",
256262306a36Sopenharmony_ci		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
256362306a36Sopenharmony_ci	}, {
256462306a36Sopenharmony_ci		.compatible = "qcom,sm8250-lpass-wsa-macro",
256562306a36Sopenharmony_ci		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
256662306a36Sopenharmony_ci	}, {
256762306a36Sopenharmony_ci		.compatible = "qcom,sm8450-lpass-wsa-macro",
256862306a36Sopenharmony_ci		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
256962306a36Sopenharmony_ci	}, {
257062306a36Sopenharmony_ci		.compatible = "qcom,sm8550-lpass-wsa-macro",
257162306a36Sopenharmony_ci	}, {
257262306a36Sopenharmony_ci		.compatible = "qcom,sc8280xp-lpass-wsa-macro",
257362306a36Sopenharmony_ci		.data = (void *)LPASS_MACRO_FLAG_HAS_NPL_CLOCK,
257462306a36Sopenharmony_ci	},
257562306a36Sopenharmony_ci	{}
257662306a36Sopenharmony_ci};
257762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, wsa_macro_dt_match);
257862306a36Sopenharmony_ci
257962306a36Sopenharmony_cistatic struct platform_driver wsa_macro_driver = {
258062306a36Sopenharmony_ci	.driver = {
258162306a36Sopenharmony_ci		.name = "wsa_macro",
258262306a36Sopenharmony_ci		.of_match_table = wsa_macro_dt_match,
258362306a36Sopenharmony_ci		.pm = &wsa_macro_pm_ops,
258462306a36Sopenharmony_ci	},
258562306a36Sopenharmony_ci	.probe = wsa_macro_probe,
258662306a36Sopenharmony_ci	.remove_new = wsa_macro_remove,
258762306a36Sopenharmony_ci};
258862306a36Sopenharmony_ci
258962306a36Sopenharmony_cimodule_platform_driver(wsa_macro_driver);
259062306a36Sopenharmony_ciMODULE_DESCRIPTION("WSA macro driver");
259162306a36Sopenharmony_ciMODULE_LICENSE("GPL");
2592