162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci// Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
362306a36Sopenharmony_ci// Copyright (c) 2017-2018, Linaro Limited
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/module.h>
662306a36Sopenharmony_ci#include <linux/init.h>
762306a36Sopenharmony_ci#include <linux/platform_device.h>
862306a36Sopenharmony_ci#include <linux/device.h>
962306a36Sopenharmony_ci#include <linux/wait.h>
1062306a36Sopenharmony_ci#include <linux/bitops.h>
1162306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
1262306a36Sopenharmony_ci#include <linux/clk.h>
1362306a36Sopenharmony_ci#include <linux/delay.h>
1462306a36Sopenharmony_ci#include <linux/kernel.h>
1562306a36Sopenharmony_ci#include <linux/slimbus.h>
1662306a36Sopenharmony_ci#include <sound/soc.h>
1762306a36Sopenharmony_ci#include <sound/pcm_params.h>
1862306a36Sopenharmony_ci#include <sound/soc-dapm.h>
1962306a36Sopenharmony_ci#include <linux/of_gpio.h>
2062306a36Sopenharmony_ci#include <linux/of.h>
2162306a36Sopenharmony_ci#include <linux/of_irq.h>
2262306a36Sopenharmony_ci#include <sound/tlv.h>
2362306a36Sopenharmony_ci#include <sound/info.h>
2462306a36Sopenharmony_ci#include "wcd9335.h"
2562306a36Sopenharmony_ci#include "wcd-clsh-v2.h"
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include <dt-bindings/sound/qcom,wcd9335.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define WCD9335_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
3062306a36Sopenharmony_ci			    SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
3162306a36Sopenharmony_ci			    SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
3262306a36Sopenharmony_ci/* Fractional Rates */
3362306a36Sopenharmony_ci#define WCD9335_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100)
3462306a36Sopenharmony_ci#define WCD9335_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \
3562306a36Sopenharmony_ci				  SNDRV_PCM_FMTBIT_S24_LE)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* slave port water mark level
3862306a36Sopenharmony_ci *   (0: 6bytes, 1: 9bytes, 2: 12 bytes, 3: 15 bytes)
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci#define SLAVE_PORT_WATER_MARK_6BYTES  0
4162306a36Sopenharmony_ci#define SLAVE_PORT_WATER_MARK_9BYTES  1
4262306a36Sopenharmony_ci#define SLAVE_PORT_WATER_MARK_12BYTES 2
4362306a36Sopenharmony_ci#define SLAVE_PORT_WATER_MARK_15BYTES 3
4462306a36Sopenharmony_ci#define SLAVE_PORT_WATER_MARK_SHIFT 1
4562306a36Sopenharmony_ci#define SLAVE_PORT_ENABLE           1
4662306a36Sopenharmony_ci#define SLAVE_PORT_DISABLE          0
4762306a36Sopenharmony_ci#define WCD9335_SLIM_WATER_MARK_VAL \
4862306a36Sopenharmony_ci	((SLAVE_PORT_WATER_MARK_12BYTES << SLAVE_PORT_WATER_MARK_SHIFT) | \
4962306a36Sopenharmony_ci	 (SLAVE_PORT_ENABLE))
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define WCD9335_SLIM_NUM_PORT_REG 3
5262306a36Sopenharmony_ci#define WCD9335_SLIM_PGD_PORT_INT_TX_EN0 (WCD9335_SLIM_PGD_PORT_INT_EN0 + 2)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define WCD9335_MCLK_CLK_12P288MHZ	12288000
5562306a36Sopenharmony_ci#define WCD9335_MCLK_CLK_9P6MHZ		9600000
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define WCD9335_SLIM_CLOSE_TIMEOUT 1000
5862306a36Sopenharmony_ci#define WCD9335_SLIM_IRQ_OVERFLOW (1 << 0)
5962306a36Sopenharmony_ci#define WCD9335_SLIM_IRQ_UNDERFLOW (1 << 1)
6062306a36Sopenharmony_ci#define WCD9335_SLIM_IRQ_PORT_CLOSED (1 << 2)
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define WCD9335_NUM_INTERPOLATORS 9
6362306a36Sopenharmony_ci#define WCD9335_RX_START	16
6462306a36Sopenharmony_ci#define WCD9335_SLIM_CH_START 128
6562306a36Sopenharmony_ci#define WCD9335_MAX_MICBIAS 4
6662306a36Sopenharmony_ci#define WCD9335_MAX_VALID_ADC_MUX  13
6762306a36Sopenharmony_ci#define WCD9335_INVALID_ADC_MUX 9
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define  TX_HPF_CUT_OFF_FREQ_MASK	0x60
7062306a36Sopenharmony_ci#define  CF_MIN_3DB_4HZ			0x0
7162306a36Sopenharmony_ci#define  CF_MIN_3DB_75HZ		0x1
7262306a36Sopenharmony_ci#define  CF_MIN_3DB_150HZ		0x2
7362306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DIV_2  0x0
7462306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DIV_3  0x1
7562306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DIV_4  0x2
7662306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DIV_6  0x3
7762306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DIV_8  0x4
7862306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DIV_16  0x5
7962306a36Sopenharmony_ci#define WCD9335_DMIC_CLK_DRIVE_DEFAULT 0x02
8062306a36Sopenharmony_ci#define WCD9335_AMIC_PWR_LEVEL_LP 0
8162306a36Sopenharmony_ci#define WCD9335_AMIC_PWR_LEVEL_DEFAULT 1
8262306a36Sopenharmony_ci#define WCD9335_AMIC_PWR_LEVEL_HP 2
8362306a36Sopenharmony_ci#define WCD9335_AMIC_PWR_LVL_MASK 0x60
8462306a36Sopenharmony_ci#define WCD9335_AMIC_PWR_LVL_SHIFT 0x5
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#define WCD9335_DEC_PWR_LVL_MASK 0x06
8762306a36Sopenharmony_ci#define WCD9335_DEC_PWR_LVL_LP 0x02
8862306a36Sopenharmony_ci#define WCD9335_DEC_PWR_LVL_HP 0x04
8962306a36Sopenharmony_ci#define WCD9335_DEC_PWR_LVL_DF 0x00
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci#define WCD9335_SLIM_RX_CH(p) \
9262306a36Sopenharmony_ci	{.port = p + WCD9335_RX_START, .shift = p,}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci#define WCD9335_SLIM_TX_CH(p) \
9562306a36Sopenharmony_ci	{.port = p, .shift = p,}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* vout step value */
9862306a36Sopenharmony_ci#define WCD9335_CALCULATE_VOUT_D(req_mv) (((req_mv - 650) * 10) / 25)
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#define WCD9335_INTERPOLATOR_PATH(id)			\
10162306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX0", "SLIM RX0"},	\
10262306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX1", "SLIM RX1"},	\
10362306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX2", "SLIM RX2"},	\
10462306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX3", "SLIM RX3"},	\
10562306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX4", "SLIM RX4"},	\
10662306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX5", "SLIM RX5"},	\
10762306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX6", "SLIM RX6"},	\
10862306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP0", "RX7", "SLIM RX7"},	\
10962306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX0", "SLIM RX0"},	\
11062306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX1", "SLIM RX1"},	\
11162306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX2", "SLIM RX2"},	\
11262306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX3", "SLIM RX3"},	\
11362306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX4", "SLIM RX4"},	\
11462306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX5", "SLIM RX5"},	\
11562306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX6", "SLIM RX6"},	\
11662306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP1", "RX7", "SLIM RX7"},	\
11762306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX0", "SLIM RX0"},	\
11862306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX1", "SLIM RX1"},	\
11962306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX2", "SLIM RX2"},	\
12062306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX3", "SLIM RX3"},	\
12162306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX4", "SLIM RX4"},	\
12262306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX5", "SLIM RX5"},	\
12362306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX6", "SLIM RX6"},	\
12462306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1 INP2", "RX7", "SLIM RX7"},	\
12562306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX0", "SLIM RX0"},	\
12662306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX1", "SLIM RX1"},	\
12762306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX2", "SLIM RX2"},	\
12862306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX3", "SLIM RX3"},	\
12962306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX4", "SLIM RX4"},	\
13062306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX5", "SLIM RX5"},	\
13162306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX6", "SLIM RX6"},	\
13262306a36Sopenharmony_ci	{"RX INT" #id "_2 MUX", "RX7", "SLIM RX7"},	\
13362306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP0"},	\
13462306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP1"},	\
13562306a36Sopenharmony_ci	{"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP2"},	\
13662306a36Sopenharmony_ci	{"RX INT" #id " SEC MIX", NULL, "RX INT" #id "_2 MUX"},		\
13762306a36Sopenharmony_ci	{"RX INT" #id " SEC MIX", NULL, "RX INT" #id "_1 MIX1"},	\
13862306a36Sopenharmony_ci	{"RX INT" #id " MIX2", NULL, "RX INT" #id " SEC MIX"},		\
13962306a36Sopenharmony_ci	{"RX INT" #id " INTERP", NULL, "RX INT" #id " MIX2"}
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#define WCD9335_ADC_MUX_PATH(id)			\
14262306a36Sopenharmony_ci	{"AIF1_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id " MUX"}, \
14362306a36Sopenharmony_ci	{"AIF2_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id " MUX"}, \
14462306a36Sopenharmony_ci	{"AIF3_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id " MUX"}, \
14562306a36Sopenharmony_ci	{"SLIM TX" #id " MUX", "DEC" #id, "ADC MUX" #id}, \
14662306a36Sopenharmony_ci	{"ADC MUX" #id, "DMIC", "DMIC MUX" #id},	\
14762306a36Sopenharmony_ci	{"ADC MUX" #id, "AMIC", "AMIC MUX" #id},	\
14862306a36Sopenharmony_ci	{"DMIC MUX" #id, "DMIC0", "DMIC0"},		\
14962306a36Sopenharmony_ci	{"DMIC MUX" #id, "DMIC1", "DMIC1"},		\
15062306a36Sopenharmony_ci	{"DMIC MUX" #id, "DMIC2", "DMIC2"},		\
15162306a36Sopenharmony_ci	{"DMIC MUX" #id, "DMIC3", "DMIC3"},		\
15262306a36Sopenharmony_ci	{"DMIC MUX" #id, "DMIC4", "DMIC4"},		\
15362306a36Sopenharmony_ci	{"DMIC MUX" #id, "DMIC5", "DMIC5"},		\
15462306a36Sopenharmony_ci	{"AMIC MUX" #id, "ADC1", "ADC1"},		\
15562306a36Sopenharmony_ci	{"AMIC MUX" #id, "ADC2", "ADC2"},		\
15662306a36Sopenharmony_ci	{"AMIC MUX" #id, "ADC3", "ADC3"},		\
15762306a36Sopenharmony_ci	{"AMIC MUX" #id, "ADC4", "ADC4"},		\
15862306a36Sopenharmony_ci	{"AMIC MUX" #id, "ADC5", "ADC5"},		\
15962306a36Sopenharmony_ci	{"AMIC MUX" #id, "ADC6", "ADC6"}
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cienum {
16262306a36Sopenharmony_ci	WCD9335_RX0 = 0,
16362306a36Sopenharmony_ci	WCD9335_RX1,
16462306a36Sopenharmony_ci	WCD9335_RX2,
16562306a36Sopenharmony_ci	WCD9335_RX3,
16662306a36Sopenharmony_ci	WCD9335_RX4,
16762306a36Sopenharmony_ci	WCD9335_RX5,
16862306a36Sopenharmony_ci	WCD9335_RX6,
16962306a36Sopenharmony_ci	WCD9335_RX7,
17062306a36Sopenharmony_ci	WCD9335_RX8,
17162306a36Sopenharmony_ci	WCD9335_RX9,
17262306a36Sopenharmony_ci	WCD9335_RX10,
17362306a36Sopenharmony_ci	WCD9335_RX11,
17462306a36Sopenharmony_ci	WCD9335_RX12,
17562306a36Sopenharmony_ci	WCD9335_RX_MAX,
17662306a36Sopenharmony_ci};
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cienum {
17962306a36Sopenharmony_ci	WCD9335_TX0 = 0,
18062306a36Sopenharmony_ci	WCD9335_TX1,
18162306a36Sopenharmony_ci	WCD9335_TX2,
18262306a36Sopenharmony_ci	WCD9335_TX3,
18362306a36Sopenharmony_ci	WCD9335_TX4,
18462306a36Sopenharmony_ci	WCD9335_TX5,
18562306a36Sopenharmony_ci	WCD9335_TX6,
18662306a36Sopenharmony_ci	WCD9335_TX7,
18762306a36Sopenharmony_ci	WCD9335_TX8,
18862306a36Sopenharmony_ci	WCD9335_TX9,
18962306a36Sopenharmony_ci	WCD9335_TX10,
19062306a36Sopenharmony_ci	WCD9335_TX11,
19162306a36Sopenharmony_ci	WCD9335_TX12,
19262306a36Sopenharmony_ci	WCD9335_TX13,
19362306a36Sopenharmony_ci	WCD9335_TX14,
19462306a36Sopenharmony_ci	WCD9335_TX15,
19562306a36Sopenharmony_ci	WCD9335_TX_MAX,
19662306a36Sopenharmony_ci};
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cienum {
19962306a36Sopenharmony_ci	SIDO_SOURCE_INTERNAL = 0,
20062306a36Sopenharmony_ci	SIDO_SOURCE_RCO_BG,
20162306a36Sopenharmony_ci};
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cienum wcd9335_sido_voltage {
20462306a36Sopenharmony_ci	SIDO_VOLTAGE_SVS_MV = 950,
20562306a36Sopenharmony_ci	SIDO_VOLTAGE_NOMINAL_MV = 1100,
20662306a36Sopenharmony_ci};
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cienum {
20962306a36Sopenharmony_ci	COMPANDER_1, /* HPH_L */
21062306a36Sopenharmony_ci	COMPANDER_2, /* HPH_R */
21162306a36Sopenharmony_ci	COMPANDER_3, /* LO1_DIFF */
21262306a36Sopenharmony_ci	COMPANDER_4, /* LO2_DIFF */
21362306a36Sopenharmony_ci	COMPANDER_5, /* LO3_SE */
21462306a36Sopenharmony_ci	COMPANDER_6, /* LO4_SE */
21562306a36Sopenharmony_ci	COMPANDER_7, /* SWR SPK CH1 */
21662306a36Sopenharmony_ci	COMPANDER_8, /* SWR SPK CH2 */
21762306a36Sopenharmony_ci	COMPANDER_MAX,
21862306a36Sopenharmony_ci};
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cienum {
22162306a36Sopenharmony_ci	INTn_2_INP_SEL_ZERO = 0,
22262306a36Sopenharmony_ci	INTn_2_INP_SEL_RX0,
22362306a36Sopenharmony_ci	INTn_2_INP_SEL_RX1,
22462306a36Sopenharmony_ci	INTn_2_INP_SEL_RX2,
22562306a36Sopenharmony_ci	INTn_2_INP_SEL_RX3,
22662306a36Sopenharmony_ci	INTn_2_INP_SEL_RX4,
22762306a36Sopenharmony_ci	INTn_2_INP_SEL_RX5,
22862306a36Sopenharmony_ci	INTn_2_INP_SEL_RX6,
22962306a36Sopenharmony_ci	INTn_2_INP_SEL_RX7,
23062306a36Sopenharmony_ci	INTn_2_INP_SEL_PROXIMITY,
23162306a36Sopenharmony_ci};
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cienum {
23462306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_ZERO = 0,
23562306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_DEC0,
23662306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_DEC1,
23762306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_IIR0,
23862306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_IIR1,
23962306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX0,
24062306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX1,
24162306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX2,
24262306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX3,
24362306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX4,
24462306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX5,
24562306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX6,
24662306a36Sopenharmony_ci	INTn_1_MIX_INP_SEL_RX7,
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci};
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cienum {
25162306a36Sopenharmony_ci	INTERP_EAR = 0,
25262306a36Sopenharmony_ci	INTERP_HPHL,
25362306a36Sopenharmony_ci	INTERP_HPHR,
25462306a36Sopenharmony_ci	INTERP_LO1,
25562306a36Sopenharmony_ci	INTERP_LO2,
25662306a36Sopenharmony_ci	INTERP_LO3,
25762306a36Sopenharmony_ci	INTERP_LO4,
25862306a36Sopenharmony_ci	INTERP_SPKR1,
25962306a36Sopenharmony_ci	INTERP_SPKR2,
26062306a36Sopenharmony_ci};
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_cienum wcd_clock_type {
26362306a36Sopenharmony_ci	WCD_CLK_OFF,
26462306a36Sopenharmony_ci	WCD_CLK_RCO,
26562306a36Sopenharmony_ci	WCD_CLK_MCLK,
26662306a36Sopenharmony_ci};
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_cienum {
26962306a36Sopenharmony_ci	MIC_BIAS_1 = 1,
27062306a36Sopenharmony_ci	MIC_BIAS_2,
27162306a36Sopenharmony_ci	MIC_BIAS_3,
27262306a36Sopenharmony_ci	MIC_BIAS_4
27362306a36Sopenharmony_ci};
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_cienum {
27662306a36Sopenharmony_ci	MICB_PULLUP_ENABLE,
27762306a36Sopenharmony_ci	MICB_PULLUP_DISABLE,
27862306a36Sopenharmony_ci	MICB_ENABLE,
27962306a36Sopenharmony_ci	MICB_DISABLE,
28062306a36Sopenharmony_ci};
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistruct wcd9335_slim_ch {
28362306a36Sopenharmony_ci	u32 ch_num;
28462306a36Sopenharmony_ci	u16 port;
28562306a36Sopenharmony_ci	u16 shift;
28662306a36Sopenharmony_ci	struct list_head list;
28762306a36Sopenharmony_ci};
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_cistruct wcd_slim_codec_dai_data {
29062306a36Sopenharmony_ci	struct list_head slim_ch_list;
29162306a36Sopenharmony_ci	struct slim_stream_config sconfig;
29262306a36Sopenharmony_ci	struct slim_stream_runtime *sruntime;
29362306a36Sopenharmony_ci};
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_cistruct wcd9335_codec {
29662306a36Sopenharmony_ci	struct device *dev;
29762306a36Sopenharmony_ci	struct clk *mclk;
29862306a36Sopenharmony_ci	struct clk *native_clk;
29962306a36Sopenharmony_ci	u32 mclk_rate;
30062306a36Sopenharmony_ci	u8 version;
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	struct slim_device *slim;
30362306a36Sopenharmony_ci	struct slim_device *slim_ifc_dev;
30462306a36Sopenharmony_ci	struct regmap *regmap;
30562306a36Sopenharmony_ci	struct regmap *if_regmap;
30662306a36Sopenharmony_ci	struct regmap_irq_chip_data *irq_data;
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	struct wcd9335_slim_ch rx_chs[WCD9335_RX_MAX];
30962306a36Sopenharmony_ci	struct wcd9335_slim_ch tx_chs[WCD9335_TX_MAX];
31062306a36Sopenharmony_ci	u32 num_rx_port;
31162306a36Sopenharmony_ci	u32 num_tx_port;
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci	int sido_input_src;
31462306a36Sopenharmony_ci	enum wcd9335_sido_voltage sido_voltage;
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	struct wcd_slim_codec_dai_data dai[NUM_CODEC_DAIS];
31762306a36Sopenharmony_ci	struct snd_soc_component *component;
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	int master_bias_users;
32062306a36Sopenharmony_ci	int clk_mclk_users;
32162306a36Sopenharmony_ci	int clk_rco_users;
32262306a36Sopenharmony_ci	int sido_ccl_cnt;
32362306a36Sopenharmony_ci	enum wcd_clock_type clk_type;
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	struct wcd_clsh_ctrl *clsh_ctrl;
32662306a36Sopenharmony_ci	u32 hph_mode;
32762306a36Sopenharmony_ci	int prim_int_users[WCD9335_NUM_INTERPOLATORS];
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	int comp_enabled[COMPANDER_MAX];
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	int intr1;
33262306a36Sopenharmony_ci	int reset_gpio;
33362306a36Sopenharmony_ci	struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY];
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	unsigned int rx_port_value[WCD9335_RX_MAX];
33662306a36Sopenharmony_ci	unsigned int tx_port_value[WCD9335_TX_MAX];
33762306a36Sopenharmony_ci	int hph_l_gain;
33862306a36Sopenharmony_ci	int hph_r_gain;
33962306a36Sopenharmony_ci	u32 rx_bias_count;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	/*TX*/
34262306a36Sopenharmony_ci	int micb_ref[WCD9335_MAX_MICBIAS];
34362306a36Sopenharmony_ci	int pullup_ref[WCD9335_MAX_MICBIAS];
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	int dmic_0_1_clk_cnt;
34662306a36Sopenharmony_ci	int dmic_2_3_clk_cnt;
34762306a36Sopenharmony_ci	int dmic_4_5_clk_cnt;
34862306a36Sopenharmony_ci	int dmic_sample_rate;
34962306a36Sopenharmony_ci	int mad_dmic_sample_rate;
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	int native_clk_users;
35262306a36Sopenharmony_ci};
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_cistruct wcd9335_irq {
35562306a36Sopenharmony_ci	int irq;
35662306a36Sopenharmony_ci	irqreturn_t (*handler)(int irq, void *data);
35762306a36Sopenharmony_ci	char *name;
35862306a36Sopenharmony_ci};
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_cistatic const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = {
36162306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(0),
36262306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(1),
36362306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(2),
36462306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(3),
36562306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(4),
36662306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(5),
36762306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(6),
36862306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(7),
36962306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(8),
37062306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(9),
37162306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(10),
37262306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(11),
37362306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(12),
37462306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(13),
37562306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(14),
37662306a36Sopenharmony_ci	WCD9335_SLIM_TX_CH(15),
37762306a36Sopenharmony_ci};
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_cistatic const struct wcd9335_slim_ch wcd9335_rx_chs[WCD9335_RX_MAX] = {
38062306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(0),	 /* 16 */
38162306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(1),	 /* 17 */
38262306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(2),
38362306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(3),
38462306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(4),
38562306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(5),
38662306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(6),
38762306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(7),
38862306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(8),
38962306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(9),
39062306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(10),
39162306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(11),
39262306a36Sopenharmony_ci	WCD9335_SLIM_RX_CH(12),
39362306a36Sopenharmony_ci};
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_cistruct interp_sample_rate {
39662306a36Sopenharmony_ci	int rate;
39762306a36Sopenharmony_ci	int rate_val;
39862306a36Sopenharmony_ci};
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_cistatic struct interp_sample_rate int_mix_rate_val[] = {
40162306a36Sopenharmony_ci	{48000, 0x4},	/* 48K */
40262306a36Sopenharmony_ci	{96000, 0x5},	/* 96K */
40362306a36Sopenharmony_ci	{192000, 0x6},	/* 192K */
40462306a36Sopenharmony_ci};
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_cistatic struct interp_sample_rate int_prim_rate_val[] = {
40762306a36Sopenharmony_ci	{8000, 0x0},	/* 8K */
40862306a36Sopenharmony_ci	{16000, 0x1},	/* 16K */
40962306a36Sopenharmony_ci	{24000, -EINVAL},/* 24K */
41062306a36Sopenharmony_ci	{32000, 0x3},	/* 32K */
41162306a36Sopenharmony_ci	{48000, 0x4},	/* 48K */
41262306a36Sopenharmony_ci	{96000, 0x5},	/* 96K */
41362306a36Sopenharmony_ci	{192000, 0x6},	/* 192K */
41462306a36Sopenharmony_ci	{384000, 0x7},	/* 384K */
41562306a36Sopenharmony_ci	{44100, 0x8}, /* 44.1K */
41662306a36Sopenharmony_ci};
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cistruct wcd9335_reg_mask_val {
41962306a36Sopenharmony_ci	u16 reg;
42062306a36Sopenharmony_ci	u8 mask;
42162306a36Sopenharmony_ci	u8 val;
42262306a36Sopenharmony_ci};
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_cistatic const struct wcd9335_reg_mask_val wcd9335_codec_reg_init[] = {
42562306a36Sopenharmony_ci	/* Rbuckfly/R_EAR(32) */
42662306a36Sopenharmony_ci	{WCD9335_CDC_CLSH_K2_MSB, 0x0F, 0x00},
42762306a36Sopenharmony_ci	{WCD9335_CDC_CLSH_K2_LSB, 0xFF, 0x60},
42862306a36Sopenharmony_ci	{WCD9335_CPE_SS_DMIC_CFG, 0x80, 0x00},
42962306a36Sopenharmony_ci	{WCD9335_CDC_BOOST0_BOOST_CTL, 0x70, 0x50},
43062306a36Sopenharmony_ci	{WCD9335_CDC_BOOST1_BOOST_CTL, 0x70, 0x50},
43162306a36Sopenharmony_ci	{WCD9335_CDC_RX7_RX_PATH_CFG1, 0x08, 0x08},
43262306a36Sopenharmony_ci	{WCD9335_CDC_RX8_RX_PATH_CFG1, 0x08, 0x08},
43362306a36Sopenharmony_ci	{WCD9335_ANA_LO_1_2, 0x3C, 0X3C},
43462306a36Sopenharmony_ci	{WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ, 0x70, 0x00},
43562306a36Sopenharmony_ci	{WCD9335_DIFF_LO_COM_PA_FREQ, 0x70, 0x40},
43662306a36Sopenharmony_ci	{WCD9335_SOC_MAD_AUDIO_CTL_2, 0x03, 0x03},
43762306a36Sopenharmony_ci	{WCD9335_CDC_TOP_TOP_CFG1, 0x02, 0x02},
43862306a36Sopenharmony_ci	{WCD9335_CDC_TOP_TOP_CFG1, 0x01, 0x01},
43962306a36Sopenharmony_ci	{WCD9335_EAR_CMBUFF, 0x08, 0x00},
44062306a36Sopenharmony_ci	{WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44162306a36Sopenharmony_ci	{WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44262306a36Sopenharmony_ci	{WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44362306a36Sopenharmony_ci	{WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44462306a36Sopenharmony_ci	{WCD9335_CDC_COMPANDER7_CTL3, 0x80, 0x80},
44562306a36Sopenharmony_ci	{WCD9335_CDC_COMPANDER8_CTL3, 0x80, 0x80},
44662306a36Sopenharmony_ci	{WCD9335_CDC_COMPANDER7_CTL7, 0x01, 0x01},
44762306a36Sopenharmony_ci	{WCD9335_CDC_COMPANDER8_CTL7, 0x01, 0x01},
44862306a36Sopenharmony_ci	{WCD9335_CDC_RX0_RX_PATH_CFG0, 0x01, 0x01},
44962306a36Sopenharmony_ci	{WCD9335_CDC_RX1_RX_PATH_CFG0, 0x01, 0x01},
45062306a36Sopenharmony_ci	{WCD9335_CDC_RX2_RX_PATH_CFG0, 0x01, 0x01},
45162306a36Sopenharmony_ci	{WCD9335_CDC_RX3_RX_PATH_CFG0, 0x01, 0x01},
45262306a36Sopenharmony_ci	{WCD9335_CDC_RX4_RX_PATH_CFG0, 0x01, 0x01},
45362306a36Sopenharmony_ci	{WCD9335_CDC_RX5_RX_PATH_CFG0, 0x01, 0x01},
45462306a36Sopenharmony_ci	{WCD9335_CDC_RX6_RX_PATH_CFG0, 0x01, 0x01},
45562306a36Sopenharmony_ci	{WCD9335_CDC_RX7_RX_PATH_CFG0, 0x01, 0x01},
45662306a36Sopenharmony_ci	{WCD9335_CDC_RX8_RX_PATH_CFG0, 0x01, 0x01},
45762306a36Sopenharmony_ci	{WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 0x01, 0x01},
45862306a36Sopenharmony_ci	{WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 0x01, 0x01},
45962306a36Sopenharmony_ci	{WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 0x01, 0x01},
46062306a36Sopenharmony_ci	{WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 0x01, 0x01},
46162306a36Sopenharmony_ci	{WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 0x01, 0x01},
46262306a36Sopenharmony_ci	{WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 0x01, 0x01},
46362306a36Sopenharmony_ci	{WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 0x01, 0x01},
46462306a36Sopenharmony_ci	{WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 0x01, 0x01},
46562306a36Sopenharmony_ci	{WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 0x01, 0x01},
46662306a36Sopenharmony_ci	{WCD9335_VBADC_IBIAS_FE, 0x0C, 0x08},
46762306a36Sopenharmony_ci	{WCD9335_RCO_CTRL_2, 0x0F, 0x08},
46862306a36Sopenharmony_ci	{WCD9335_RX_BIAS_FLYB_MID_RST, 0xF0, 0x10},
46962306a36Sopenharmony_ci	{WCD9335_FLYBACK_CTRL_1, 0x20, 0x20},
47062306a36Sopenharmony_ci	{WCD9335_HPH_OCP_CTL, 0xFF, 0x5A},
47162306a36Sopenharmony_ci	{WCD9335_HPH_L_TEST, 0x01, 0x01},
47262306a36Sopenharmony_ci	{WCD9335_HPH_R_TEST, 0x01, 0x01},
47362306a36Sopenharmony_ci	{WCD9335_CDC_BOOST0_BOOST_CFG1, 0x3F, 0x12},
47462306a36Sopenharmony_ci	{WCD9335_CDC_BOOST0_BOOST_CFG2, 0x1C, 0x08},
47562306a36Sopenharmony_ci	{WCD9335_CDC_COMPANDER7_CTL7, 0x1E, 0x18},
47662306a36Sopenharmony_ci	{WCD9335_CDC_BOOST1_BOOST_CFG1, 0x3F, 0x12},
47762306a36Sopenharmony_ci	{WCD9335_CDC_BOOST1_BOOST_CFG2, 0x1C, 0x08},
47862306a36Sopenharmony_ci	{WCD9335_CDC_COMPANDER8_CTL7, 0x1E, 0x18},
47962306a36Sopenharmony_ci	{WCD9335_CDC_TX0_TX_PATH_SEC7, 0xFF, 0x45},
48062306a36Sopenharmony_ci	{WCD9335_CDC_RX0_RX_PATH_SEC0, 0xFC, 0xF4},
48162306a36Sopenharmony_ci	{WCD9335_HPH_REFBUFF_LP_CTL, 0x08, 0x08},
48262306a36Sopenharmony_ci	{WCD9335_HPH_REFBUFF_LP_CTL, 0x06, 0x02},
48362306a36Sopenharmony_ci};
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci/* Cutoff frequency for high pass filter */
48662306a36Sopenharmony_cistatic const char * const cf_text[] = {
48762306a36Sopenharmony_ci	"CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ"
48862306a36Sopenharmony_ci};
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_cistatic const char * const rx_cf_text[] = {
49162306a36Sopenharmony_ci	"CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ",
49262306a36Sopenharmony_ci	"CF_NEG_3DB_0P48HZ"
49362306a36Sopenharmony_ci};
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_cistatic const char * const rx_int0_7_mix_mux_text[] = {
49662306a36Sopenharmony_ci	"ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5",
49762306a36Sopenharmony_ci	"RX6", "RX7", "PROXIMITY"
49862306a36Sopenharmony_ci};
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_cistatic const char * const rx_int_mix_mux_text[] = {
50162306a36Sopenharmony_ci	"ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5",
50262306a36Sopenharmony_ci	"RX6", "RX7"
50362306a36Sopenharmony_ci};
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_cistatic const char * const rx_prim_mix_text[] = {
50662306a36Sopenharmony_ci	"ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",
50762306a36Sopenharmony_ci	"RX3", "RX4", "RX5", "RX6", "RX7"
50862306a36Sopenharmony_ci};
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_cistatic const char * const rx_int_dem_inp_mux_text[] = {
51162306a36Sopenharmony_ci	"NORMAL_DSM_OUT", "CLSH_DSM_OUT",
51262306a36Sopenharmony_ci};
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_cistatic const char * const rx_int0_interp_mux_text[] = {
51562306a36Sopenharmony_ci	"ZERO", "RX INT0 MIX2",
51662306a36Sopenharmony_ci};
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_cistatic const char * const rx_int1_interp_mux_text[] = {
51962306a36Sopenharmony_ci	"ZERO", "RX INT1 MIX2",
52062306a36Sopenharmony_ci};
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_cistatic const char * const rx_int2_interp_mux_text[] = {
52362306a36Sopenharmony_ci	"ZERO", "RX INT2 MIX2",
52462306a36Sopenharmony_ci};
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_cistatic const char * const rx_int3_interp_mux_text[] = {
52762306a36Sopenharmony_ci	"ZERO", "RX INT3 MIX2",
52862306a36Sopenharmony_ci};
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_cistatic const char * const rx_int4_interp_mux_text[] = {
53162306a36Sopenharmony_ci	"ZERO", "RX INT4 MIX2",
53262306a36Sopenharmony_ci};
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_cistatic const char * const rx_int5_interp_mux_text[] = {
53562306a36Sopenharmony_ci	"ZERO", "RX INT5 MIX2",
53662306a36Sopenharmony_ci};
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_cistatic const char * const rx_int6_interp_mux_text[] = {
53962306a36Sopenharmony_ci	"ZERO", "RX INT6 MIX2",
54062306a36Sopenharmony_ci};
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_cistatic const char * const rx_int7_interp_mux_text[] = {
54362306a36Sopenharmony_ci	"ZERO", "RX INT7 MIX2",
54462306a36Sopenharmony_ci};
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_cistatic const char * const rx_int8_interp_mux_text[] = {
54762306a36Sopenharmony_ci	"ZERO", "RX INT8 SEC MIX"
54862306a36Sopenharmony_ci};
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_cistatic const char * const rx_hph_mode_mux_text[] = {
55162306a36Sopenharmony_ci	"Class H Invalid", "Class-H Hi-Fi", "Class-H Low Power", "Class-AB",
55262306a36Sopenharmony_ci	"Class-H Hi-Fi Low Power"
55362306a36Sopenharmony_ci};
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cistatic const char *const slim_rx_mux_text[] = {
55662306a36Sopenharmony_ci	"ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB",
55762306a36Sopenharmony_ci};
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_cistatic const char * const adc_mux_text[] = {
56062306a36Sopenharmony_ci	"DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2"
56162306a36Sopenharmony_ci};
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_cistatic const char * const dmic_mux_text[] = {
56462306a36Sopenharmony_ci	"ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5",
56562306a36Sopenharmony_ci	"SMIC0", "SMIC1", "SMIC2", "SMIC3"
56662306a36Sopenharmony_ci};
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_cistatic const char * const dmic_mux_alt_text[] = {
56962306a36Sopenharmony_ci	"ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5",
57062306a36Sopenharmony_ci};
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_cistatic const char * const amic_mux_text[] = {
57362306a36Sopenharmony_ci	"ZERO", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6"
57462306a36Sopenharmony_ci};
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_cistatic const char * const sb_tx0_mux_text[] = {
57762306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192"
57862306a36Sopenharmony_ci};
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_cistatic const char * const sb_tx1_mux_text[] = {
58162306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192"
58262306a36Sopenharmony_ci};
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_cistatic const char * const sb_tx2_mux_text[] = {
58562306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192"
58662306a36Sopenharmony_ci};
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_cistatic const char * const sb_tx3_mux_text[] = {
58962306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192"
59062306a36Sopenharmony_ci};
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_cistatic const char * const sb_tx4_mux_text[] = {
59362306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192"
59462306a36Sopenharmony_ci};
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_cistatic const char * const sb_tx5_mux_text[] = {
59762306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192"
59862306a36Sopenharmony_ci};
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_cistatic const char * const sb_tx6_mux_text[] = {
60162306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192"
60262306a36Sopenharmony_ci};
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_cistatic const char * const sb_tx7_mux_text[] = {
60562306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192"
60662306a36Sopenharmony_ci};
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_cistatic const char * const sb_tx8_mux_text[] = {
60962306a36Sopenharmony_ci	"ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192"
61062306a36Sopenharmony_ci};
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
61362306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
61462306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
61562306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_cistatic const struct soc_enum cf_dec0_enum =
61862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX0_TX_PATH_CFG0, 5, 3, cf_text);
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_cistatic const struct soc_enum cf_dec1_enum =
62162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX1_TX_PATH_CFG0, 5, 3, cf_text);
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_cistatic const struct soc_enum cf_dec2_enum =
62462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX2_TX_PATH_CFG0, 5, 3, cf_text);
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_cistatic const struct soc_enum cf_dec3_enum =
62762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX3_TX_PATH_CFG0, 5, 3, cf_text);
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_cistatic const struct soc_enum cf_dec4_enum =
63062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX4_TX_PATH_CFG0, 5, 3, cf_text);
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_cistatic const struct soc_enum cf_dec5_enum =
63362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX5_TX_PATH_CFG0, 5, 3, cf_text);
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistatic const struct soc_enum cf_dec6_enum =
63662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX6_TX_PATH_CFG0, 5, 3, cf_text);
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_cistatic const struct soc_enum cf_dec7_enum =
63962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX7_TX_PATH_CFG0, 5, 3, cf_text);
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_cistatic const struct soc_enum cf_dec8_enum =
64262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX8_TX_PATH_CFG0, 5, 3, cf_text);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_cistatic const struct soc_enum cf_int0_1_enum =
64562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_CFG2, 0, 4, rx_cf_text);
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int0_2_enum, WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 2,
64862306a36Sopenharmony_ci		     rx_cf_text);
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_cistatic const struct soc_enum cf_int1_1_enum =
65162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_CFG2, 0, 4, rx_cf_text);
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int1_2_enum, WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 2,
65462306a36Sopenharmony_ci		     rx_cf_text);
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_cistatic const struct soc_enum cf_int2_1_enum =
65762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_CFG2, 0, 4, rx_cf_text);
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int2_2_enum, WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 2,
66062306a36Sopenharmony_ci		     rx_cf_text);
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_cistatic const struct soc_enum cf_int3_1_enum =
66362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX3_RX_PATH_CFG2, 0, 4, rx_cf_text);
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int3_2_enum, WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 2,
66662306a36Sopenharmony_ci		     rx_cf_text);
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_cistatic const struct soc_enum cf_int4_1_enum =
66962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX4_RX_PATH_CFG2, 0, 4, rx_cf_text);
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int4_2_enum, WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 2,
67262306a36Sopenharmony_ci		     rx_cf_text);
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_cistatic const struct soc_enum cf_int5_1_enum =
67562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX5_RX_PATH_CFG2, 0, 4, rx_cf_text);
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int5_2_enum, WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 2,
67862306a36Sopenharmony_ci		     rx_cf_text);
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_cistatic const struct soc_enum cf_int6_1_enum =
68162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX6_RX_PATH_CFG2, 0, 4, rx_cf_text);
68262306a36Sopenharmony_ci
68362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int6_2_enum, WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 2,
68462306a36Sopenharmony_ci		     rx_cf_text);
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_cistatic const struct soc_enum cf_int7_1_enum =
68762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX7_RX_PATH_CFG2, 0, 4, rx_cf_text);
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int7_2_enum, WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 2,
69062306a36Sopenharmony_ci		     rx_cf_text);
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_cistatic const struct soc_enum cf_int8_1_enum =
69362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CFG2, 0, 4, rx_cf_text);
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(cf_int8_2_enum, WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 2,
69662306a36Sopenharmony_ci		     rx_cf_text);
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_cistatic const struct soc_enum rx_hph_mode_mux_enum =
69962306a36Sopenharmony_ci	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text),
70062306a36Sopenharmony_ci			    rx_hph_mode_mux_text);
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_cistatic const struct soc_enum slim_rx_mux_enum =
70362306a36Sopenharmony_ci	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim_rx_mux_text), slim_rx_mux_text);
70462306a36Sopenharmony_ci
70562306a36Sopenharmony_cistatic const struct soc_enum rx_int0_2_mux_chain_enum =
70662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, 10,
70762306a36Sopenharmony_ci			rx_int0_7_mix_mux_text);
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_cistatic const struct soc_enum rx_int1_2_mux_chain_enum =
71062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, 9,
71162306a36Sopenharmony_ci			rx_int_mix_mux_text);
71262306a36Sopenharmony_ci
71362306a36Sopenharmony_cistatic const struct soc_enum rx_int2_2_mux_chain_enum =
71462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, 9,
71562306a36Sopenharmony_ci			rx_int_mix_mux_text);
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_cistatic const struct soc_enum rx_int3_2_mux_chain_enum =
71862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 0, 9,
71962306a36Sopenharmony_ci			rx_int_mix_mux_text);
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_cistatic const struct soc_enum rx_int4_2_mux_chain_enum =
72262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 0, 9,
72362306a36Sopenharmony_ci			rx_int_mix_mux_text);
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_cistatic const struct soc_enum rx_int5_2_mux_chain_enum =
72662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 0, 9,
72762306a36Sopenharmony_ci			rx_int_mix_mux_text);
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_cistatic const struct soc_enum rx_int6_2_mux_chain_enum =
73062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 0, 9,
73162306a36Sopenharmony_ci			rx_int_mix_mux_text);
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_cistatic const struct soc_enum rx_int7_2_mux_chain_enum =
73462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 0, 10,
73562306a36Sopenharmony_ci			rx_int0_7_mix_mux_text);
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_cistatic const struct soc_enum rx_int8_2_mux_chain_enum =
73862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 0, 9,
73962306a36Sopenharmony_ci			rx_int_mix_mux_text);
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_cistatic const struct soc_enum rx_int0_1_mix_inp0_chain_enum =
74262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, 13,
74362306a36Sopenharmony_ci			rx_prim_mix_text);
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_cistatic const struct soc_enum rx_int0_1_mix_inp1_chain_enum =
74662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, 13,
74762306a36Sopenharmony_ci			rx_prim_mix_text);
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_cistatic const struct soc_enum rx_int0_1_mix_inp2_chain_enum =
75062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, 13,
75162306a36Sopenharmony_ci			rx_prim_mix_text);
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_cistatic const struct soc_enum rx_int1_1_mix_inp0_chain_enum =
75462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, 13,
75562306a36Sopenharmony_ci			rx_prim_mix_text);
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_cistatic const struct soc_enum rx_int1_1_mix_inp1_chain_enum =
75862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, 13,
75962306a36Sopenharmony_ci			rx_prim_mix_text);
76062306a36Sopenharmony_ci
76162306a36Sopenharmony_cistatic const struct soc_enum rx_int1_1_mix_inp2_chain_enum =
76262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, 13,
76362306a36Sopenharmony_ci			rx_prim_mix_text);
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_cistatic const struct soc_enum rx_int2_1_mix_inp0_chain_enum =
76662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, 13,
76762306a36Sopenharmony_ci			rx_prim_mix_text);
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_cistatic const struct soc_enum rx_int2_1_mix_inp1_chain_enum =
77062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, 13,
77162306a36Sopenharmony_ci			rx_prim_mix_text);
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_cistatic const struct soc_enum rx_int2_1_mix_inp2_chain_enum =
77462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, 13,
77562306a36Sopenharmony_ci			rx_prim_mix_text);
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_cistatic const struct soc_enum rx_int3_1_mix_inp0_chain_enum =
77862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 0, 13,
77962306a36Sopenharmony_ci			rx_prim_mix_text);
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_cistatic const struct soc_enum rx_int3_1_mix_inp1_chain_enum =
78262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 4, 13,
78362306a36Sopenharmony_ci			rx_prim_mix_text);
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_cistatic const struct soc_enum rx_int3_1_mix_inp2_chain_enum =
78662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 4, 13,
78762306a36Sopenharmony_ci			rx_prim_mix_text);
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_cistatic const struct soc_enum rx_int4_1_mix_inp0_chain_enum =
79062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 0, 13,
79162306a36Sopenharmony_ci			rx_prim_mix_text);
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_cistatic const struct soc_enum rx_int4_1_mix_inp1_chain_enum =
79462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 4, 13,
79562306a36Sopenharmony_ci			rx_prim_mix_text);
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_cistatic const struct soc_enum rx_int4_1_mix_inp2_chain_enum =
79862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 4, 13,
79962306a36Sopenharmony_ci			rx_prim_mix_text);
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_cistatic const struct soc_enum rx_int5_1_mix_inp0_chain_enum =
80262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 0, 13,
80362306a36Sopenharmony_ci			rx_prim_mix_text);
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_cistatic const struct soc_enum rx_int5_1_mix_inp1_chain_enum =
80662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 4, 13,
80762306a36Sopenharmony_ci			rx_prim_mix_text);
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_cistatic const struct soc_enum rx_int5_1_mix_inp2_chain_enum =
81062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 4, 13,
81162306a36Sopenharmony_ci			rx_prim_mix_text);
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_cistatic const struct soc_enum rx_int6_1_mix_inp0_chain_enum =
81462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 0, 13,
81562306a36Sopenharmony_ci			rx_prim_mix_text);
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_cistatic const struct soc_enum rx_int6_1_mix_inp1_chain_enum =
81862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 4, 13,
81962306a36Sopenharmony_ci			rx_prim_mix_text);
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cistatic const struct soc_enum rx_int6_1_mix_inp2_chain_enum =
82262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 4, 13,
82362306a36Sopenharmony_ci			rx_prim_mix_text);
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_cistatic const struct soc_enum rx_int7_1_mix_inp0_chain_enum =
82662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 0, 13,
82762306a36Sopenharmony_ci			rx_prim_mix_text);
82862306a36Sopenharmony_ci
82962306a36Sopenharmony_cistatic const struct soc_enum rx_int7_1_mix_inp1_chain_enum =
83062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 4, 13,
83162306a36Sopenharmony_ci			rx_prim_mix_text);
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_cistatic const struct soc_enum rx_int7_1_mix_inp2_chain_enum =
83462306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 4, 13,
83562306a36Sopenharmony_ci			rx_prim_mix_text);
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_cistatic const struct soc_enum rx_int8_1_mix_inp0_chain_enum =
83862306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 0, 13,
83962306a36Sopenharmony_ci			rx_prim_mix_text);
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_cistatic const struct soc_enum rx_int8_1_mix_inp1_chain_enum =
84262306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 4, 13,
84362306a36Sopenharmony_ci			rx_prim_mix_text);
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_cistatic const struct soc_enum rx_int8_1_mix_inp2_chain_enum =
84662306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 4, 13,
84762306a36Sopenharmony_ci			rx_prim_mix_text);
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_cistatic const struct soc_enum rx_int0_dem_inp_mux_enum =
85062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_SEC0, 0,
85162306a36Sopenharmony_ci			ARRAY_SIZE(rx_int_dem_inp_mux_text),
85262306a36Sopenharmony_ci			rx_int_dem_inp_mux_text);
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_cistatic const struct soc_enum rx_int1_dem_inp_mux_enum =
85562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_SEC0, 0,
85662306a36Sopenharmony_ci			ARRAY_SIZE(rx_int_dem_inp_mux_text),
85762306a36Sopenharmony_ci			rx_int_dem_inp_mux_text);
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_cistatic const struct soc_enum rx_int2_dem_inp_mux_enum =
86062306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_SEC0, 0,
86162306a36Sopenharmony_ci			ARRAY_SIZE(rx_int_dem_inp_mux_text),
86262306a36Sopenharmony_ci			rx_int_dem_inp_mux_text);
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_cistatic const struct soc_enum rx_int0_interp_mux_enum =
86562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_CTL, 5, 2,
86662306a36Sopenharmony_ci			rx_int0_interp_mux_text);
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_cistatic const struct soc_enum rx_int1_interp_mux_enum =
86962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_CTL, 5, 2,
87062306a36Sopenharmony_ci			rx_int1_interp_mux_text);
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_cistatic const struct soc_enum rx_int2_interp_mux_enum =
87362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_CTL, 5, 2,
87462306a36Sopenharmony_ci			rx_int2_interp_mux_text);
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_cistatic const struct soc_enum rx_int3_interp_mux_enum =
87762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX3_RX_PATH_CTL, 5, 2,
87862306a36Sopenharmony_ci			rx_int3_interp_mux_text);
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_cistatic const struct soc_enum rx_int4_interp_mux_enum =
88162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX4_RX_PATH_CTL, 5, 2,
88262306a36Sopenharmony_ci			rx_int4_interp_mux_text);
88362306a36Sopenharmony_ci
88462306a36Sopenharmony_cistatic const struct soc_enum rx_int5_interp_mux_enum =
88562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX5_RX_PATH_CTL, 5, 2,
88662306a36Sopenharmony_ci			rx_int5_interp_mux_text);
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_cistatic const struct soc_enum rx_int6_interp_mux_enum =
88962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX6_RX_PATH_CTL, 5, 2,
89062306a36Sopenharmony_ci			rx_int6_interp_mux_text);
89162306a36Sopenharmony_ci
89262306a36Sopenharmony_cistatic const struct soc_enum rx_int7_interp_mux_enum =
89362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX7_RX_PATH_CTL, 5, 2,
89462306a36Sopenharmony_ci			rx_int7_interp_mux_text);
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_cistatic const struct soc_enum rx_int8_interp_mux_enum =
89762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CTL, 5, 2,
89862306a36Sopenharmony_ci			rx_int8_interp_mux_text);
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux0_chain_enum =
90162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, 4,
90262306a36Sopenharmony_ci			adc_mux_text);
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux1_chain_enum =
90562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, 4,
90662306a36Sopenharmony_ci			adc_mux_text);
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux2_chain_enum =
90962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, 4,
91062306a36Sopenharmony_ci			adc_mux_text);
91162306a36Sopenharmony_ci
91262306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux3_chain_enum =
91362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0, 4,
91462306a36Sopenharmony_ci			adc_mux_text);
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux4_chain_enum =
91762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 6, 4,
91862306a36Sopenharmony_ci			adc_mux_text);
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux5_chain_enum =
92162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 6, 4,
92262306a36Sopenharmony_ci			adc_mux_text);
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux6_chain_enum =
92562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 6, 4,
92662306a36Sopenharmony_ci			adc_mux_text);
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux7_chain_enum =
92962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 6, 4,
93062306a36Sopenharmony_ci			adc_mux_text);
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_cistatic const struct soc_enum tx_adc_mux8_chain_enum =
93362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 6, 4,
93462306a36Sopenharmony_ci			adc_mux_text);
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux0_enum =
93762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, 11,
93862306a36Sopenharmony_ci			dmic_mux_text);
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux1_enum =
94162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, 11,
94262306a36Sopenharmony_ci			dmic_mux_text);
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux2_enum =
94562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, 11,
94662306a36Sopenharmony_ci			dmic_mux_text);
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux3_enum =
94962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, 11,
95062306a36Sopenharmony_ci			dmic_mux_text);
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux4_enum =
95362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, 7,
95462306a36Sopenharmony_ci			dmic_mux_alt_text);
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux5_enum =
95762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, 7,
95862306a36Sopenharmony_ci			dmic_mux_alt_text);
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux6_enum =
96162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, 7,
96262306a36Sopenharmony_ci			dmic_mux_alt_text);
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux7_enum =
96562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, 7,
96662306a36Sopenharmony_ci			dmic_mux_alt_text);
96762306a36Sopenharmony_ci
96862306a36Sopenharmony_cistatic const struct soc_enum tx_dmic_mux8_enum =
96962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, 7,
97062306a36Sopenharmony_ci			dmic_mux_alt_text);
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux0_enum =
97362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, 7,
97462306a36Sopenharmony_ci			amic_mux_text);
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux1_enum =
97762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, 7,
97862306a36Sopenharmony_ci			amic_mux_text);
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux2_enum =
98162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, 7,
98262306a36Sopenharmony_ci			amic_mux_text);
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux3_enum =
98562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, 7,
98662306a36Sopenharmony_ci			amic_mux_text);
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux4_enum =
98962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, 7,
99062306a36Sopenharmony_ci			amic_mux_text);
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux5_enum =
99362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, 7,
99462306a36Sopenharmony_ci			amic_mux_text);
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux6_enum =
99762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, 7,
99862306a36Sopenharmony_ci			amic_mux_text);
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux7_enum =
100162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, 7,
100262306a36Sopenharmony_ci			amic_mux_text);
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_cistatic const struct soc_enum tx_amic_mux8_enum =
100562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, 7,
100662306a36Sopenharmony_ci			amic_mux_text);
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_cistatic const struct soc_enum sb_tx0_mux_enum =
100962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 0, 4,
101062306a36Sopenharmony_ci			sb_tx0_mux_text);
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_cistatic const struct soc_enum sb_tx1_mux_enum =
101362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 2, 4,
101462306a36Sopenharmony_ci			sb_tx1_mux_text);
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_cistatic const struct soc_enum sb_tx2_mux_enum =
101762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 4, 4,
101862306a36Sopenharmony_ci			sb_tx2_mux_text);
101962306a36Sopenharmony_ci
102062306a36Sopenharmony_cistatic const struct soc_enum sb_tx3_mux_enum =
102162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 6, 4,
102262306a36Sopenharmony_ci			sb_tx3_mux_text);
102362306a36Sopenharmony_ci
102462306a36Sopenharmony_cistatic const struct soc_enum sb_tx4_mux_enum =
102562306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 0, 4,
102662306a36Sopenharmony_ci			sb_tx4_mux_text);
102762306a36Sopenharmony_ci
102862306a36Sopenharmony_cistatic const struct soc_enum sb_tx5_mux_enum =
102962306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 2, 4,
103062306a36Sopenharmony_ci			sb_tx5_mux_text);
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_cistatic const struct soc_enum sb_tx6_mux_enum =
103362306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 4, 4,
103462306a36Sopenharmony_ci			sb_tx6_mux_text);
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_cistatic const struct soc_enum sb_tx7_mux_enum =
103762306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 6, 4,
103862306a36Sopenharmony_ci			sb_tx7_mux_text);
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_cistatic const struct soc_enum sb_tx8_mux_enum =
104162306a36Sopenharmony_ci	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 0, 4,
104262306a36Sopenharmony_ci			sb_tx8_mux_text);
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int0_2_mux =
104562306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT0_2 MUX Mux", rx_int0_2_mux_chain_enum);
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int1_2_mux =
104862306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT1_2 MUX Mux", rx_int1_2_mux_chain_enum);
104962306a36Sopenharmony_ci
105062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int2_2_mux =
105162306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT2_2 MUX Mux", rx_int2_2_mux_chain_enum);
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int3_2_mux =
105462306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT3_2 MUX Mux", rx_int3_2_mux_chain_enum);
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int4_2_mux =
105762306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT4_2 MUX Mux", rx_int4_2_mux_chain_enum);
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int5_2_mux =
106062306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT5_2 MUX Mux", rx_int5_2_mux_chain_enum);
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int6_2_mux =
106362306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT6_2 MUX Mux", rx_int6_2_mux_chain_enum);
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int7_2_mux =
106662306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT7_2 MUX Mux", rx_int7_2_mux_chain_enum);
106762306a36Sopenharmony_ci
106862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int8_2_mux =
106962306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT8_2 MUX Mux", rx_int8_2_mux_chain_enum);
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int0_1_mix_inp0_mux =
107262306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT0_1 MIX1 INP0 Mux", rx_int0_1_mix_inp0_chain_enum);
107362306a36Sopenharmony_ci
107462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int0_1_mix_inp1_mux =
107562306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT0_1 MIX1 INP1 Mux", rx_int0_1_mix_inp1_chain_enum);
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int0_1_mix_inp2_mux =
107862306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT0_1 MIX1 INP2 Mux", rx_int0_1_mix_inp2_chain_enum);
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int1_1_mix_inp0_mux =
108162306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT1_1 MIX1 INP0 Mux", rx_int1_1_mix_inp0_chain_enum);
108262306a36Sopenharmony_ci
108362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int1_1_mix_inp1_mux =
108462306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT1_1 MIX1 INP1 Mux", rx_int1_1_mix_inp1_chain_enum);
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int1_1_mix_inp2_mux =
108762306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT1_1 MIX1 INP2 Mux", rx_int1_1_mix_inp2_chain_enum);
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int2_1_mix_inp0_mux =
109062306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT2_1 MIX1 INP0 Mux", rx_int2_1_mix_inp0_chain_enum);
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int2_1_mix_inp1_mux =
109362306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT2_1 MIX1 INP1 Mux", rx_int2_1_mix_inp1_chain_enum);
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int2_1_mix_inp2_mux =
109662306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT2_1 MIX1 INP2 Mux", rx_int2_1_mix_inp2_chain_enum);
109762306a36Sopenharmony_ci
109862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int3_1_mix_inp0_mux =
109962306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT3_1 MIX1 INP0 Mux", rx_int3_1_mix_inp0_chain_enum);
110062306a36Sopenharmony_ci
110162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int3_1_mix_inp1_mux =
110262306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT3_1 MIX1 INP1 Mux", rx_int3_1_mix_inp1_chain_enum);
110362306a36Sopenharmony_ci
110462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int3_1_mix_inp2_mux =
110562306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT3_1 MIX1 INP2 Mux", rx_int3_1_mix_inp2_chain_enum);
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int4_1_mix_inp0_mux =
110862306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT4_1 MIX1 INP0 Mux", rx_int4_1_mix_inp0_chain_enum);
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int4_1_mix_inp1_mux =
111162306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT4_1 MIX1 INP1 Mux", rx_int4_1_mix_inp1_chain_enum);
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int4_1_mix_inp2_mux =
111462306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT4_1 MIX1 INP2 Mux", rx_int4_1_mix_inp2_chain_enum);
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int5_1_mix_inp0_mux =
111762306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT5_1 MIX1 INP0 Mux", rx_int5_1_mix_inp0_chain_enum);
111862306a36Sopenharmony_ci
111962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int5_1_mix_inp1_mux =
112062306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT5_1 MIX1 INP1 Mux", rx_int5_1_mix_inp1_chain_enum);
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int5_1_mix_inp2_mux =
112362306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT5_1 MIX1 INP2 Mux", rx_int5_1_mix_inp2_chain_enum);
112462306a36Sopenharmony_ci
112562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int6_1_mix_inp0_mux =
112662306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT6_1 MIX1 INP0 Mux", rx_int6_1_mix_inp0_chain_enum);
112762306a36Sopenharmony_ci
112862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int6_1_mix_inp1_mux =
112962306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT6_1 MIX1 INP1 Mux", rx_int6_1_mix_inp1_chain_enum);
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int6_1_mix_inp2_mux =
113262306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT6_1 MIX1 INP2 Mux", rx_int6_1_mix_inp2_chain_enum);
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int7_1_mix_inp0_mux =
113562306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT7_1 MIX1 INP0 Mux", rx_int7_1_mix_inp0_chain_enum);
113662306a36Sopenharmony_ci
113762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int7_1_mix_inp1_mux =
113862306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT7_1 MIX1 INP1 Mux", rx_int7_1_mix_inp1_chain_enum);
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int7_1_mix_inp2_mux =
114162306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT7_1 MIX1 INP2 Mux", rx_int7_1_mix_inp2_chain_enum);
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int8_1_mix_inp0_mux =
114462306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT8_1 MIX1 INP0 Mux", rx_int8_1_mix_inp0_chain_enum);
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int8_1_mix_inp1_mux =
114762306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT8_1 MIX1 INP1 Mux", rx_int8_1_mix_inp1_chain_enum);
114862306a36Sopenharmony_ci
114962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int8_1_mix_inp2_mux =
115062306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT8_1 MIX1 INP2 Mux", rx_int8_1_mix_inp2_chain_enum);
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int0_interp_mux =
115362306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT0 INTERP Mux", rx_int0_interp_mux_enum);
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int1_interp_mux =
115662306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT1 INTERP Mux", rx_int1_interp_mux_enum);
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int2_interp_mux =
115962306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT2 INTERP Mux", rx_int2_interp_mux_enum);
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int3_interp_mux =
116262306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT3 INTERP Mux", rx_int3_interp_mux_enum);
116362306a36Sopenharmony_ci
116462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int4_interp_mux =
116562306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT4 INTERP Mux", rx_int4_interp_mux_enum);
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int5_interp_mux =
116862306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT5 INTERP Mux", rx_int5_interp_mux_enum);
116962306a36Sopenharmony_ci
117062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int6_interp_mux =
117162306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT6 INTERP Mux", rx_int6_interp_mux_enum);
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int7_interp_mux =
117462306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT7 INTERP Mux", rx_int7_interp_mux_enum);
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int8_interp_mux =
117762306a36Sopenharmony_ci	SOC_DAPM_ENUM("RX INT8 INTERP Mux", rx_int8_interp_mux_enum);
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux0 =
118062306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX0 Mux", tx_dmic_mux0_enum);
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux1 =
118362306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX1 Mux", tx_dmic_mux1_enum);
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux2 =
118662306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX2 Mux", tx_dmic_mux2_enum);
118762306a36Sopenharmony_ci
118862306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux3 =
118962306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX3 Mux", tx_dmic_mux3_enum);
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux4 =
119262306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX4 Mux", tx_dmic_mux4_enum);
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux5 =
119562306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX5 Mux", tx_dmic_mux5_enum);
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux6 =
119862306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX6 Mux", tx_dmic_mux6_enum);
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux7 =
120162306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX7 Mux", tx_dmic_mux7_enum);
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_dmic_mux8 =
120462306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC MUX8 Mux", tx_dmic_mux8_enum);
120562306a36Sopenharmony_ci
120662306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux0 =
120762306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX0 Mux", tx_amic_mux0_enum);
120862306a36Sopenharmony_ci
120962306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux1 =
121062306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX1 Mux", tx_amic_mux1_enum);
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux2 =
121362306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX2 Mux", tx_amic_mux2_enum);
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux3 =
121662306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX3 Mux", tx_amic_mux3_enum);
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux4 =
121962306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX4 Mux", tx_amic_mux4_enum);
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux5 =
122262306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX5 Mux", tx_amic_mux5_enum);
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux6 =
122562306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX6 Mux", tx_amic_mux6_enum);
122662306a36Sopenharmony_ci
122762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux7 =
122862306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX7 Mux", tx_amic_mux7_enum);
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_amic_mux8 =
123162306a36Sopenharmony_ci	SOC_DAPM_ENUM("AMIC MUX8 Mux", tx_amic_mux8_enum);
123262306a36Sopenharmony_ci
123362306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx0_mux =
123462306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX0 MUX Mux", sb_tx0_mux_enum);
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx1_mux =
123762306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX1 MUX Mux", sb_tx1_mux_enum);
123862306a36Sopenharmony_ci
123962306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx2_mux =
124062306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX2 MUX Mux", sb_tx2_mux_enum);
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx3_mux =
124362306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX3 MUX Mux", sb_tx3_mux_enum);
124462306a36Sopenharmony_ci
124562306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx4_mux =
124662306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX4 MUX Mux", sb_tx4_mux_enum);
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx5_mux =
124962306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX5 MUX Mux", sb_tx5_mux_enum);
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx6_mux =
125262306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX6 MUX Mux", sb_tx6_mux_enum);
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx7_mux =
125562306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX7 MUX Mux", sb_tx7_mux_enum);
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_cistatic const struct snd_kcontrol_new sb_tx8_mux =
125862306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLIM TX8 MUX Mux", sb_tx8_mux_enum);
125962306a36Sopenharmony_ci
126062306a36Sopenharmony_cistatic int slim_rx_mux_get(struct snd_kcontrol *kc,
126162306a36Sopenharmony_ci			   struct snd_ctl_elem_value *ucontrol)
126262306a36Sopenharmony_ci{
126362306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kc);
126462306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(w->dapm->dev);
126562306a36Sopenharmony_ci	u32 port_id = w->shift;
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci	ucontrol->value.enumerated.item[0] = wcd->rx_port_value[port_id];
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	return 0;
127062306a36Sopenharmony_ci}
127162306a36Sopenharmony_ci
127262306a36Sopenharmony_cistatic int slim_rx_mux_put(struct snd_kcontrol *kc,
127362306a36Sopenharmony_ci			   struct snd_ctl_elem_value *ucontrol)
127462306a36Sopenharmony_ci{
127562306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kc);
127662306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(w->dapm->dev);
127762306a36Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kc->private_value;
127862306a36Sopenharmony_ci	struct snd_soc_dapm_update *update = NULL;
127962306a36Sopenharmony_ci	u32 port_id = w->shift;
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_ci	if (wcd->rx_port_value[port_id] == ucontrol->value.enumerated.item[0])
128262306a36Sopenharmony_ci		return 0;
128362306a36Sopenharmony_ci
128462306a36Sopenharmony_ci	wcd->rx_port_value[port_id] = ucontrol->value.enumerated.item[0];
128562306a36Sopenharmony_ci
128662306a36Sopenharmony_ci	/* Remove channel from any list it's in before adding it to a new one */
128762306a36Sopenharmony_ci	list_del_init(&wcd->rx_chs[port_id].list);
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci	switch (wcd->rx_port_value[port_id]) {
129062306a36Sopenharmony_ci	case 0:
129162306a36Sopenharmony_ci		/* Channel already removed from lists. Nothing to do here */
129262306a36Sopenharmony_ci		break;
129362306a36Sopenharmony_ci	case 1:
129462306a36Sopenharmony_ci		list_add_tail(&wcd->rx_chs[port_id].list,
129562306a36Sopenharmony_ci			      &wcd->dai[AIF1_PB].slim_ch_list);
129662306a36Sopenharmony_ci		break;
129762306a36Sopenharmony_ci	case 2:
129862306a36Sopenharmony_ci		list_add_tail(&wcd->rx_chs[port_id].list,
129962306a36Sopenharmony_ci			      &wcd->dai[AIF2_PB].slim_ch_list);
130062306a36Sopenharmony_ci		break;
130162306a36Sopenharmony_ci	case 3:
130262306a36Sopenharmony_ci		list_add_tail(&wcd->rx_chs[port_id].list,
130362306a36Sopenharmony_ci			      &wcd->dai[AIF3_PB].slim_ch_list);
130462306a36Sopenharmony_ci		break;
130562306a36Sopenharmony_ci	case 4:
130662306a36Sopenharmony_ci		list_add_tail(&wcd->rx_chs[port_id].list,
130762306a36Sopenharmony_ci			      &wcd->dai[AIF4_PB].slim_ch_list);
130862306a36Sopenharmony_ci		break;
130962306a36Sopenharmony_ci	default:
131062306a36Sopenharmony_ci		dev_err(wcd->dev, "Unknown AIF %d\n", wcd->rx_port_value[port_id]);
131162306a36Sopenharmony_ci		goto err;
131262306a36Sopenharmony_ci	}
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id],
131562306a36Sopenharmony_ci				      e, update);
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ci	return 0;
131862306a36Sopenharmony_cierr:
131962306a36Sopenharmony_ci	return -EINVAL;
132062306a36Sopenharmony_ci}
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_cistatic int slim_tx_mixer_get(struct snd_kcontrol *kc,
132362306a36Sopenharmony_ci			     struct snd_ctl_elem_value *ucontrol)
132462306a36Sopenharmony_ci{
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc);
132762306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(dapm->dev);
132862306a36Sopenharmony_ci	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kc);
132962306a36Sopenharmony_ci	struct soc_mixer_control *mixer =
133062306a36Sopenharmony_ci			(struct soc_mixer_control *)kc->private_value;
133162306a36Sopenharmony_ci	int dai_id = widget->shift;
133262306a36Sopenharmony_ci	int port_id = mixer->shift;
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id] == dai_id;
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_ci	return 0;
133762306a36Sopenharmony_ci}
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_cistatic int slim_tx_mixer_put(struct snd_kcontrol *kc,
134062306a36Sopenharmony_ci			     struct snd_ctl_elem_value *ucontrol)
134162306a36Sopenharmony_ci{
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_ci	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kc);
134462306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(widget->dapm->dev);
134562306a36Sopenharmony_ci	struct snd_soc_dapm_update *update = NULL;
134662306a36Sopenharmony_ci	struct soc_mixer_control *mixer =
134762306a36Sopenharmony_ci			(struct soc_mixer_control *)kc->private_value;
134862306a36Sopenharmony_ci	int enable = ucontrol->value.integer.value[0];
134962306a36Sopenharmony_ci	int dai_id = widget->shift;
135062306a36Sopenharmony_ci	int port_id = mixer->shift;
135162306a36Sopenharmony_ci
135262306a36Sopenharmony_ci	switch (dai_id) {
135362306a36Sopenharmony_ci	case AIF1_CAP:
135462306a36Sopenharmony_ci	case AIF2_CAP:
135562306a36Sopenharmony_ci	case AIF3_CAP:
135662306a36Sopenharmony_ci		/* only add to the list if value not set */
135762306a36Sopenharmony_ci		if (enable && wcd->tx_port_value[port_id] != dai_id) {
135862306a36Sopenharmony_ci			wcd->tx_port_value[port_id] = dai_id;
135962306a36Sopenharmony_ci			list_add_tail(&wcd->tx_chs[port_id].list,
136062306a36Sopenharmony_ci					&wcd->dai[dai_id].slim_ch_list);
136162306a36Sopenharmony_ci		} else if (!enable && wcd->tx_port_value[port_id] == dai_id) {
136262306a36Sopenharmony_ci			wcd->tx_port_value[port_id] = -1;
136362306a36Sopenharmony_ci			list_del_init(&wcd->tx_chs[port_id].list);
136462306a36Sopenharmony_ci		}
136562306a36Sopenharmony_ci		break;
136662306a36Sopenharmony_ci	default:
136762306a36Sopenharmony_ci		dev_err(wcd->dev, "Unknown AIF %d\n", dai_id);
136862306a36Sopenharmony_ci		return -EINVAL;
136962306a36Sopenharmony_ci	}
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci	snd_soc_dapm_mixer_update_power(widget->dapm, kc, enable, update);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	return 0;
137462306a36Sopenharmony_ci}
137562306a36Sopenharmony_ci
137662306a36Sopenharmony_cistatic const struct snd_kcontrol_new slim_rx_mux[WCD9335_RX_MAX] = {
137762306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX0 Mux", slim_rx_mux_enum,
137862306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
137962306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX1 Mux", slim_rx_mux_enum,
138062306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
138162306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX2 Mux", slim_rx_mux_enum,
138262306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
138362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX3 Mux", slim_rx_mux_enum,
138462306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
138562306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX4 Mux", slim_rx_mux_enum,
138662306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
138762306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX5 Mux", slim_rx_mux_enum,
138862306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
138962306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX6 Mux", slim_rx_mux_enum,
139062306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
139162306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SLIM RX7 Mux", slim_rx_mux_enum,
139262306a36Sopenharmony_ci			  slim_rx_mux_get, slim_rx_mux_put),
139362306a36Sopenharmony_ci};
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif1_cap_mixer[] = {
139662306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0,
139762306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
139862306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0,
139962306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
140062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0,
140162306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
140262306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0,
140362306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
140462306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0,
140562306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
140662306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0,
140762306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
140862306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0,
140962306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
141062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0,
141162306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
141262306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0,
141362306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
141462306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9335_TX9, 1, 0,
141562306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
141662306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9335_TX10, 1, 0,
141762306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
141862306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9335_TX11, 1, 0,
141962306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
142062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9335_TX13, 1, 0,
142162306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
142262306a36Sopenharmony_ci};
142362306a36Sopenharmony_ci
142462306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif2_cap_mixer[] = {
142562306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0,
142662306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
142762306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0,
142862306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
142962306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0,
143062306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
143162306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0,
143262306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
143362306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0,
143462306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
143562306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0,
143662306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
143762306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0,
143862306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
143962306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0,
144062306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
144162306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0,
144262306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
144362306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9335_TX9, 1, 0,
144462306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
144562306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9335_TX10, 1, 0,
144662306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
144762306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9335_TX11, 1, 0,
144862306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
144962306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9335_TX13, 1, 0,
145062306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
145162306a36Sopenharmony_ci};
145262306a36Sopenharmony_ci
145362306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif3_cap_mixer[] = {
145462306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0,
145562306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
145662306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0,
145762306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
145862306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0,
145962306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
146062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0,
146162306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
146262306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0,
146362306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
146462306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0,
146562306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
146662306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0,
146762306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
146862306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0,
146962306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
147062306a36Sopenharmony_ci	SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0,
147162306a36Sopenharmony_ci			slim_tx_mixer_get, slim_tx_mixer_put),
147262306a36Sopenharmony_ci};
147362306a36Sopenharmony_ci
147462306a36Sopenharmony_cistatic int wcd9335_put_dec_enum(struct snd_kcontrol *kc,
147562306a36Sopenharmony_ci				struct snd_ctl_elem_value *ucontrol)
147662306a36Sopenharmony_ci{
147762306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc);
147862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
147962306a36Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kc->private_value;
148062306a36Sopenharmony_ci	unsigned int val, reg, sel;
148162306a36Sopenharmony_ci
148262306a36Sopenharmony_ci	val = ucontrol->value.enumerated.item[0];
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci	switch (e->reg) {
148562306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1:
148662306a36Sopenharmony_ci		reg = WCD9335_CDC_TX0_TX_PATH_CFG0;
148762306a36Sopenharmony_ci		break;
148862306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1:
148962306a36Sopenharmony_ci		reg = WCD9335_CDC_TX1_TX_PATH_CFG0;
149062306a36Sopenharmony_ci		break;
149162306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1:
149262306a36Sopenharmony_ci		reg = WCD9335_CDC_TX2_TX_PATH_CFG0;
149362306a36Sopenharmony_ci		break;
149462306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1:
149562306a36Sopenharmony_ci		reg = WCD9335_CDC_TX3_TX_PATH_CFG0;
149662306a36Sopenharmony_ci		break;
149762306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
149862306a36Sopenharmony_ci		reg = WCD9335_CDC_TX4_TX_PATH_CFG0;
149962306a36Sopenharmony_ci		break;
150062306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
150162306a36Sopenharmony_ci		reg = WCD9335_CDC_TX5_TX_PATH_CFG0;
150262306a36Sopenharmony_ci		break;
150362306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
150462306a36Sopenharmony_ci		reg = WCD9335_CDC_TX6_TX_PATH_CFG0;
150562306a36Sopenharmony_ci		break;
150662306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
150762306a36Sopenharmony_ci		reg = WCD9335_CDC_TX7_TX_PATH_CFG0;
150862306a36Sopenharmony_ci		break;
150962306a36Sopenharmony_ci	case WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0:
151062306a36Sopenharmony_ci		reg = WCD9335_CDC_TX8_TX_PATH_CFG0;
151162306a36Sopenharmony_ci		break;
151262306a36Sopenharmony_ci	default:
151362306a36Sopenharmony_ci		return -EINVAL;
151462306a36Sopenharmony_ci	}
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci	/* AMIC: 0, DMIC: 1 */
151762306a36Sopenharmony_ci	sel = val ? WCD9335_CDC_TX_ADC_AMIC_SEL : WCD9335_CDC_TX_ADC_DMIC_SEL;
151862306a36Sopenharmony_ci	snd_soc_component_update_bits(component, reg,
151962306a36Sopenharmony_ci				      WCD9335_CDC_TX_ADC_AMIC_DMIC_SEL_MASK,
152062306a36Sopenharmony_ci				      sel);
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_ci	return snd_soc_dapm_put_enum_double(kc, ucontrol);
152362306a36Sopenharmony_ci}
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_cistatic int wcd9335_int_dem_inp_mux_put(struct snd_kcontrol *kc,
152662306a36Sopenharmony_ci				 struct snd_ctl_elem_value *ucontrol)
152762306a36Sopenharmony_ci{
152862306a36Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kc->private_value;
152962306a36Sopenharmony_ci	struct snd_soc_component *component;
153062306a36Sopenharmony_ci	int reg, val;
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	component = snd_soc_dapm_kcontrol_component(kc);
153362306a36Sopenharmony_ci	val = ucontrol->value.enumerated.item[0];
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_ci	if (e->reg == WCD9335_CDC_RX0_RX_PATH_SEC0)
153662306a36Sopenharmony_ci		reg = WCD9335_CDC_RX0_RX_PATH_CFG0;
153762306a36Sopenharmony_ci	else if (e->reg == WCD9335_CDC_RX1_RX_PATH_SEC0)
153862306a36Sopenharmony_ci		reg = WCD9335_CDC_RX1_RX_PATH_CFG0;
153962306a36Sopenharmony_ci	else if (e->reg == WCD9335_CDC_RX2_RX_PATH_SEC0)
154062306a36Sopenharmony_ci		reg = WCD9335_CDC_RX2_RX_PATH_CFG0;
154162306a36Sopenharmony_ci	else
154262306a36Sopenharmony_ci		return -EINVAL;
154362306a36Sopenharmony_ci
154462306a36Sopenharmony_ci	/* Set Look Ahead Delay */
154562306a36Sopenharmony_ci	snd_soc_component_update_bits(component, reg,
154662306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_CFG0_DLY_ZN_EN_MASK,
154762306a36Sopenharmony_ci				val ? WCD9335_CDC_RX_PATH_CFG0_DLY_ZN_EN : 0);
154862306a36Sopenharmony_ci	/* Set DEM INP Select */
154962306a36Sopenharmony_ci	return snd_soc_dapm_put_enum_double(kc, ucontrol);
155062306a36Sopenharmony_ci}
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int0_dem_inp_mux =
155362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("RX INT0 DEM MUX Mux", rx_int0_dem_inp_mux_enum,
155462306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
155562306a36Sopenharmony_ci			  wcd9335_int_dem_inp_mux_put);
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int1_dem_inp_mux =
155862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("RX INT1 DEM MUX Mux", rx_int1_dem_inp_mux_enum,
155962306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
156062306a36Sopenharmony_ci			  wcd9335_int_dem_inp_mux_put);
156162306a36Sopenharmony_ci
156262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rx_int2_dem_inp_mux =
156362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("RX INT2 DEM MUX Mux", rx_int2_dem_inp_mux_enum,
156462306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
156562306a36Sopenharmony_ci			  wcd9335_int_dem_inp_mux_put);
156662306a36Sopenharmony_ci
156762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux0 =
156862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX0 Mux", tx_adc_mux0_chain_enum,
156962306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
157062306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux1 =
157362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX1 Mux", tx_adc_mux1_chain_enum,
157462306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
157562306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux2 =
157862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX2 Mux", tx_adc_mux2_chain_enum,
157962306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
158062306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
158162306a36Sopenharmony_ci
158262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux3 =
158362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX3 Mux", tx_adc_mux3_chain_enum,
158462306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
158562306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux4 =
158862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX4 Mux", tx_adc_mux4_chain_enum,
158962306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
159062306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux5 =
159362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX5 Mux", tx_adc_mux5_chain_enum,
159462306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
159562306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux6 =
159862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX6 Mux", tx_adc_mux6_chain_enum,
159962306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
160062306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
160162306a36Sopenharmony_ci
160262306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux7 =
160362306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX7 Mux", tx_adc_mux7_chain_enum,
160462306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
160562306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
160662306a36Sopenharmony_ci
160762306a36Sopenharmony_cistatic const struct snd_kcontrol_new tx_adc_mux8 =
160862306a36Sopenharmony_ci	SOC_DAPM_ENUM_EXT("ADC MUX8 Mux", tx_adc_mux8_chain_enum,
160962306a36Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
161062306a36Sopenharmony_ci			  wcd9335_put_dec_enum);
161162306a36Sopenharmony_ci
161262306a36Sopenharmony_cistatic int wcd9335_set_mix_interpolator_rate(struct snd_soc_dai *dai,
161362306a36Sopenharmony_ci					     int rate_val,
161462306a36Sopenharmony_ci					     u32 rate)
161562306a36Sopenharmony_ci{
161662306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
161762306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
161862306a36Sopenharmony_ci	struct wcd9335_slim_ch *ch;
161962306a36Sopenharmony_ci	int val, j;
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_ci	list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
162262306a36Sopenharmony_ci		for (j = 0; j < WCD9335_NUM_INTERPOLATORS; j++) {
162362306a36Sopenharmony_ci			val = snd_soc_component_read(component,
162462306a36Sopenharmony_ci					WCD9335_CDC_RX_INP_MUX_RX_INT_CFG1(j)) &
162562306a36Sopenharmony_ci					WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
162662306a36Sopenharmony_ci
162762306a36Sopenharmony_ci			if (val == (ch->shift + INTn_2_INP_SEL_RX0))
162862306a36Sopenharmony_ci				snd_soc_component_update_bits(component,
162962306a36Sopenharmony_ci						WCD9335_CDC_RX_PATH_MIX_CTL(j),
163062306a36Sopenharmony_ci						WCD9335_CDC_MIX_PCM_RATE_MASK,
163162306a36Sopenharmony_ci						rate_val);
163262306a36Sopenharmony_ci		}
163362306a36Sopenharmony_ci	}
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci	return 0;
163662306a36Sopenharmony_ci}
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_cistatic int wcd9335_set_prim_interpolator_rate(struct snd_soc_dai *dai,
163962306a36Sopenharmony_ci					      u8 rate_val,
164062306a36Sopenharmony_ci					      u32 rate)
164162306a36Sopenharmony_ci{
164262306a36Sopenharmony_ci	struct snd_soc_component *comp = dai->component;
164362306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
164462306a36Sopenharmony_ci	struct wcd9335_slim_ch *ch;
164562306a36Sopenharmony_ci	u8 cfg0, cfg1, inp0_sel, inp1_sel, inp2_sel;
164662306a36Sopenharmony_ci	int inp, j;
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci	list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
164962306a36Sopenharmony_ci		inp = ch->shift + INTn_1_MIX_INP_SEL_RX0;
165062306a36Sopenharmony_ci		/*
165162306a36Sopenharmony_ci		 * Loop through all interpolator MUX inputs and find out
165262306a36Sopenharmony_ci		 * to which interpolator input, the slim rx port
165362306a36Sopenharmony_ci		 * is connected
165462306a36Sopenharmony_ci		 */
165562306a36Sopenharmony_ci		for (j = 0; j < WCD9335_NUM_INTERPOLATORS; j++) {
165662306a36Sopenharmony_ci			cfg0 = snd_soc_component_read(comp,
165762306a36Sopenharmony_ci					WCD9335_CDC_RX_INP_MUX_RX_INT_CFG0(j));
165862306a36Sopenharmony_ci			cfg1 = snd_soc_component_read(comp,
165962306a36Sopenharmony_ci					WCD9335_CDC_RX_INP_MUX_RX_INT_CFG1(j));
166062306a36Sopenharmony_ci
166162306a36Sopenharmony_ci			inp0_sel = cfg0 &
166262306a36Sopenharmony_ci				 WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
166362306a36Sopenharmony_ci			inp1_sel = (cfg0 >> 4) &
166462306a36Sopenharmony_ci				 WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
166562306a36Sopenharmony_ci			inp2_sel = (cfg1 >> 4) &
166662306a36Sopenharmony_ci				 WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_ci			if ((inp0_sel == inp) ||  (inp1_sel == inp) ||
166962306a36Sopenharmony_ci			    (inp2_sel == inp)) {
167062306a36Sopenharmony_ci				/* rate is in Hz */
167162306a36Sopenharmony_ci				if ((j == 0) && (rate == 44100))
167262306a36Sopenharmony_ci					dev_info(wcd->dev,
167362306a36Sopenharmony_ci						"Cannot set 44.1KHz on INT0\n");
167462306a36Sopenharmony_ci				else
167562306a36Sopenharmony_ci					snd_soc_component_update_bits(comp,
167662306a36Sopenharmony_ci						WCD9335_CDC_RX_PATH_CTL(j),
167762306a36Sopenharmony_ci						WCD9335_CDC_MIX_PCM_RATE_MASK,
167862306a36Sopenharmony_ci						rate_val);
167962306a36Sopenharmony_ci			}
168062306a36Sopenharmony_ci		}
168162306a36Sopenharmony_ci	}
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_ci	return 0;
168462306a36Sopenharmony_ci}
168562306a36Sopenharmony_ci
168662306a36Sopenharmony_cistatic int wcd9335_set_interpolator_rate(struct snd_soc_dai *dai, u32 rate)
168762306a36Sopenharmony_ci{
168862306a36Sopenharmony_ci	int i;
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	/* set mixing path rate */
169162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(int_mix_rate_val); i++) {
169262306a36Sopenharmony_ci		if (rate == int_mix_rate_val[i].rate) {
169362306a36Sopenharmony_ci			wcd9335_set_mix_interpolator_rate(dai,
169462306a36Sopenharmony_ci					int_mix_rate_val[i].rate_val, rate);
169562306a36Sopenharmony_ci			break;
169662306a36Sopenharmony_ci		}
169762306a36Sopenharmony_ci	}
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	/* set primary path sample rate */
170062306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(int_prim_rate_val); i++) {
170162306a36Sopenharmony_ci		if (rate == int_prim_rate_val[i].rate) {
170262306a36Sopenharmony_ci			wcd9335_set_prim_interpolator_rate(dai,
170362306a36Sopenharmony_ci					int_prim_rate_val[i].rate_val, rate);
170462306a36Sopenharmony_ci			break;
170562306a36Sopenharmony_ci		}
170662306a36Sopenharmony_ci	}
170762306a36Sopenharmony_ci
170862306a36Sopenharmony_ci	return 0;
170962306a36Sopenharmony_ci}
171062306a36Sopenharmony_ci
171162306a36Sopenharmony_cistatic int wcd9335_slim_set_hw_params(struct wcd9335_codec *wcd,
171262306a36Sopenharmony_ci				 struct wcd_slim_codec_dai_data *dai_data,
171362306a36Sopenharmony_ci				 int direction)
171462306a36Sopenharmony_ci{
171562306a36Sopenharmony_ci	struct list_head *slim_ch_list = &dai_data->slim_ch_list;
171662306a36Sopenharmony_ci	struct slim_stream_config *cfg = &dai_data->sconfig;
171762306a36Sopenharmony_ci	struct wcd9335_slim_ch *ch;
171862306a36Sopenharmony_ci	u16 payload = 0;
171962306a36Sopenharmony_ci	int ret, i;
172062306a36Sopenharmony_ci
172162306a36Sopenharmony_ci	cfg->ch_count = 0;
172262306a36Sopenharmony_ci	cfg->direction = direction;
172362306a36Sopenharmony_ci	cfg->port_mask = 0;
172462306a36Sopenharmony_ci
172562306a36Sopenharmony_ci	/* Configure slave interface device */
172662306a36Sopenharmony_ci	list_for_each_entry(ch, slim_ch_list, list) {
172762306a36Sopenharmony_ci		cfg->ch_count++;
172862306a36Sopenharmony_ci		payload |= 1 << ch->shift;
172962306a36Sopenharmony_ci		cfg->port_mask |= BIT(ch->port);
173062306a36Sopenharmony_ci	}
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci	cfg->chs = kcalloc(cfg->ch_count, sizeof(unsigned int), GFP_KERNEL);
173362306a36Sopenharmony_ci	if (!cfg->chs)
173462306a36Sopenharmony_ci		return -ENOMEM;
173562306a36Sopenharmony_ci
173662306a36Sopenharmony_ci	i = 0;
173762306a36Sopenharmony_ci	list_for_each_entry(ch, slim_ch_list, list) {
173862306a36Sopenharmony_ci		cfg->chs[i++] = ch->ch_num;
173962306a36Sopenharmony_ci		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
174062306a36Sopenharmony_ci			/* write to interface device */
174162306a36Sopenharmony_ci			ret = regmap_write(wcd->if_regmap,
174262306a36Sopenharmony_ci				WCD9335_SLIM_PGD_RX_PORT_MULTI_CHNL_0(ch->port),
174362306a36Sopenharmony_ci				payload);
174462306a36Sopenharmony_ci
174562306a36Sopenharmony_ci			if (ret < 0)
174662306a36Sopenharmony_ci				goto err;
174762306a36Sopenharmony_ci
174862306a36Sopenharmony_ci			/* configure the slave port for water mark and enable*/
174962306a36Sopenharmony_ci			ret = regmap_write(wcd->if_regmap,
175062306a36Sopenharmony_ci					WCD9335_SLIM_PGD_RX_PORT_CFG(ch->port),
175162306a36Sopenharmony_ci					WCD9335_SLIM_WATER_MARK_VAL);
175262306a36Sopenharmony_ci			if (ret < 0)
175362306a36Sopenharmony_ci				goto err;
175462306a36Sopenharmony_ci		} else {
175562306a36Sopenharmony_ci			ret = regmap_write(wcd->if_regmap,
175662306a36Sopenharmony_ci				WCD9335_SLIM_PGD_TX_PORT_MULTI_CHNL_0(ch->port),
175762306a36Sopenharmony_ci				payload & 0x00FF);
175862306a36Sopenharmony_ci			if (ret < 0)
175962306a36Sopenharmony_ci				goto err;
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_ci			/* ports 8,9 */
176262306a36Sopenharmony_ci			ret = regmap_write(wcd->if_regmap,
176362306a36Sopenharmony_ci				WCD9335_SLIM_PGD_TX_PORT_MULTI_CHNL_1(ch->port),
176462306a36Sopenharmony_ci				(payload & 0xFF00)>>8);
176562306a36Sopenharmony_ci			if (ret < 0)
176662306a36Sopenharmony_ci				goto err;
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_ci			/* configure the slave port for water mark and enable*/
176962306a36Sopenharmony_ci			ret = regmap_write(wcd->if_regmap,
177062306a36Sopenharmony_ci					WCD9335_SLIM_PGD_TX_PORT_CFG(ch->port),
177162306a36Sopenharmony_ci					WCD9335_SLIM_WATER_MARK_VAL);
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci			if (ret < 0)
177462306a36Sopenharmony_ci				goto err;
177562306a36Sopenharmony_ci		}
177662306a36Sopenharmony_ci	}
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_ci	dai_data->sruntime = slim_stream_allocate(wcd->slim, "WCD9335-SLIM");
177962306a36Sopenharmony_ci
178062306a36Sopenharmony_ci	return 0;
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_cierr:
178362306a36Sopenharmony_ci	dev_err(wcd->dev, "Error Setting slim hw params\n");
178462306a36Sopenharmony_ci	kfree(cfg->chs);
178562306a36Sopenharmony_ci	cfg->chs = NULL;
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci	return ret;
178862306a36Sopenharmony_ci}
178962306a36Sopenharmony_ci
179062306a36Sopenharmony_cistatic int wcd9335_set_decimator_rate(struct snd_soc_dai *dai,
179162306a36Sopenharmony_ci				      u8 rate_val, u32 rate)
179262306a36Sopenharmony_ci{
179362306a36Sopenharmony_ci	struct snd_soc_component *comp = dai->component;
179462306a36Sopenharmony_ci	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
179562306a36Sopenharmony_ci	u8 shift = 0, shift_val = 0, tx_mux_sel;
179662306a36Sopenharmony_ci	struct wcd9335_slim_ch *ch;
179762306a36Sopenharmony_ci	int tx_port, tx_port_reg;
179862306a36Sopenharmony_ci	int decimator = -1;
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_ci	list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
180162306a36Sopenharmony_ci		tx_port = ch->port;
180262306a36Sopenharmony_ci		if ((tx_port == 12) || (tx_port >= 14)) {
180362306a36Sopenharmony_ci			dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n",
180462306a36Sopenharmony_ci				tx_port, dai->id);
180562306a36Sopenharmony_ci			return -EINVAL;
180662306a36Sopenharmony_ci		}
180762306a36Sopenharmony_ci		/* Find the SB TX MUX input - which decimator is connected */
180862306a36Sopenharmony_ci		if (tx_port < 4) {
180962306a36Sopenharmony_ci			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0;
181062306a36Sopenharmony_ci			shift = (tx_port << 1);
181162306a36Sopenharmony_ci			shift_val = 0x03;
181262306a36Sopenharmony_ci		} else if (tx_port < 8) {
181362306a36Sopenharmony_ci			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1;
181462306a36Sopenharmony_ci			shift = ((tx_port - 4) << 1);
181562306a36Sopenharmony_ci			shift_val = 0x03;
181662306a36Sopenharmony_ci		} else if (tx_port < 11) {
181762306a36Sopenharmony_ci			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2;
181862306a36Sopenharmony_ci			shift = ((tx_port - 8) << 1);
181962306a36Sopenharmony_ci			shift_val = 0x03;
182062306a36Sopenharmony_ci		} else if (tx_port == 11) {
182162306a36Sopenharmony_ci			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3;
182262306a36Sopenharmony_ci			shift = 0;
182362306a36Sopenharmony_ci			shift_val = 0x0F;
182462306a36Sopenharmony_ci		} else /* (tx_port == 13) */ {
182562306a36Sopenharmony_ci			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3;
182662306a36Sopenharmony_ci			shift = 4;
182762306a36Sopenharmony_ci			shift_val = 0x03;
182862306a36Sopenharmony_ci		}
182962306a36Sopenharmony_ci
183062306a36Sopenharmony_ci		tx_mux_sel = snd_soc_component_read(comp, tx_port_reg) &
183162306a36Sopenharmony_ci						      (shift_val << shift);
183262306a36Sopenharmony_ci
183362306a36Sopenharmony_ci		tx_mux_sel = tx_mux_sel >> shift;
183462306a36Sopenharmony_ci		if (tx_port <= 8) {
183562306a36Sopenharmony_ci			if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3))
183662306a36Sopenharmony_ci				decimator = tx_port;
183762306a36Sopenharmony_ci		} else if (tx_port <= 10) {
183862306a36Sopenharmony_ci			if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2))
183962306a36Sopenharmony_ci				decimator = ((tx_port == 9) ? 7 : 6);
184062306a36Sopenharmony_ci		} else if (tx_port == 11) {
184162306a36Sopenharmony_ci			if ((tx_mux_sel >= 1) && (tx_mux_sel < 7))
184262306a36Sopenharmony_ci				decimator = tx_mux_sel - 1;
184362306a36Sopenharmony_ci		} else if (tx_port == 13) {
184462306a36Sopenharmony_ci			if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2))
184562306a36Sopenharmony_ci				decimator = 5;
184662306a36Sopenharmony_ci		}
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_ci		if (decimator >= 0) {
184962306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,
185062306a36Sopenharmony_ci					WCD9335_CDC_TX_PATH_CTL(decimator),
185162306a36Sopenharmony_ci					WCD9335_CDC_TX_PATH_CTL_PCM_RATE_MASK,
185262306a36Sopenharmony_ci					rate_val);
185362306a36Sopenharmony_ci		} else if ((tx_port <= 8) && (tx_mux_sel == 0x01)) {
185462306a36Sopenharmony_ci			/* Check if the TX Mux input is RX MIX TXn */
185562306a36Sopenharmony_ci			dev_err(wcd->dev, "RX_MIX_TX%u going to SLIM TX%u\n",
185662306a36Sopenharmony_ci				tx_port, tx_port);
185762306a36Sopenharmony_ci		} else {
185862306a36Sopenharmony_ci			dev_err(wcd->dev, "ERROR: Invalid decimator: %d\n",
185962306a36Sopenharmony_ci				decimator);
186062306a36Sopenharmony_ci			return -EINVAL;
186162306a36Sopenharmony_ci		}
186262306a36Sopenharmony_ci	}
186362306a36Sopenharmony_ci
186462306a36Sopenharmony_ci	return 0;
186562306a36Sopenharmony_ci}
186662306a36Sopenharmony_ci
186762306a36Sopenharmony_cistatic int wcd9335_hw_params(struct snd_pcm_substream *substream,
186862306a36Sopenharmony_ci			   struct snd_pcm_hw_params *params,
186962306a36Sopenharmony_ci			   struct snd_soc_dai *dai)
187062306a36Sopenharmony_ci{
187162306a36Sopenharmony_ci	struct wcd9335_codec *wcd;
187262306a36Sopenharmony_ci	int ret, tx_fs_rate = 0;
187362306a36Sopenharmony_ci
187462306a36Sopenharmony_ci	wcd = snd_soc_component_get_drvdata(dai->component);
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_ci	switch (substream->stream) {
187762306a36Sopenharmony_ci	case SNDRV_PCM_STREAM_PLAYBACK:
187862306a36Sopenharmony_ci		ret = wcd9335_set_interpolator_rate(dai, params_rate(params));
187962306a36Sopenharmony_ci		if (ret) {
188062306a36Sopenharmony_ci			dev_err(wcd->dev, "cannot set sample rate: %u\n",
188162306a36Sopenharmony_ci				params_rate(params));
188262306a36Sopenharmony_ci			return ret;
188362306a36Sopenharmony_ci		}
188462306a36Sopenharmony_ci		switch (params_width(params)) {
188562306a36Sopenharmony_ci		case 16 ... 24:
188662306a36Sopenharmony_ci			wcd->dai[dai->id].sconfig.bps = params_width(params);
188762306a36Sopenharmony_ci			break;
188862306a36Sopenharmony_ci		default:
188962306a36Sopenharmony_ci			dev_err(wcd->dev, "%s: Invalid format 0x%x\n",
189062306a36Sopenharmony_ci				__func__, params_width(params));
189162306a36Sopenharmony_ci			return -EINVAL;
189262306a36Sopenharmony_ci		}
189362306a36Sopenharmony_ci		break;
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_ci	case SNDRV_PCM_STREAM_CAPTURE:
189662306a36Sopenharmony_ci		switch (params_rate(params)) {
189762306a36Sopenharmony_ci		case 8000:
189862306a36Sopenharmony_ci			tx_fs_rate = 0;
189962306a36Sopenharmony_ci			break;
190062306a36Sopenharmony_ci		case 16000:
190162306a36Sopenharmony_ci			tx_fs_rate = 1;
190262306a36Sopenharmony_ci			break;
190362306a36Sopenharmony_ci		case 32000:
190462306a36Sopenharmony_ci			tx_fs_rate = 3;
190562306a36Sopenharmony_ci			break;
190662306a36Sopenharmony_ci		case 48000:
190762306a36Sopenharmony_ci			tx_fs_rate = 4;
190862306a36Sopenharmony_ci			break;
190962306a36Sopenharmony_ci		case 96000:
191062306a36Sopenharmony_ci			tx_fs_rate = 5;
191162306a36Sopenharmony_ci			break;
191262306a36Sopenharmony_ci		case 192000:
191362306a36Sopenharmony_ci			tx_fs_rate = 6;
191462306a36Sopenharmony_ci			break;
191562306a36Sopenharmony_ci		case 384000:
191662306a36Sopenharmony_ci			tx_fs_rate = 7;
191762306a36Sopenharmony_ci			break;
191862306a36Sopenharmony_ci		default:
191962306a36Sopenharmony_ci			dev_err(wcd->dev, "%s: Invalid TX sample rate: %d\n",
192062306a36Sopenharmony_ci				__func__, params_rate(params));
192162306a36Sopenharmony_ci			return -EINVAL;
192262306a36Sopenharmony_ci
192362306a36Sopenharmony_ci		}
192462306a36Sopenharmony_ci
192562306a36Sopenharmony_ci		ret = wcd9335_set_decimator_rate(dai, tx_fs_rate,
192662306a36Sopenharmony_ci						params_rate(params));
192762306a36Sopenharmony_ci		if (ret < 0) {
192862306a36Sopenharmony_ci			dev_err(wcd->dev, "Cannot set TX Decimator rate\n");
192962306a36Sopenharmony_ci			return ret;
193062306a36Sopenharmony_ci		}
193162306a36Sopenharmony_ci		switch (params_width(params)) {
193262306a36Sopenharmony_ci		case 16 ... 32:
193362306a36Sopenharmony_ci			wcd->dai[dai->id].sconfig.bps = params_width(params);
193462306a36Sopenharmony_ci			break;
193562306a36Sopenharmony_ci		default:
193662306a36Sopenharmony_ci			dev_err(wcd->dev, "%s: Invalid format 0x%x\n",
193762306a36Sopenharmony_ci				__func__, params_width(params));
193862306a36Sopenharmony_ci			return -EINVAL;
193962306a36Sopenharmony_ci		}
194062306a36Sopenharmony_ci		break;
194162306a36Sopenharmony_ci	default:
194262306a36Sopenharmony_ci		dev_err(wcd->dev, "Invalid stream type %d\n",
194362306a36Sopenharmony_ci			substream->stream);
194462306a36Sopenharmony_ci		return -EINVAL;
194562306a36Sopenharmony_ci	}
194662306a36Sopenharmony_ci
194762306a36Sopenharmony_ci	wcd->dai[dai->id].sconfig.rate = params_rate(params);
194862306a36Sopenharmony_ci	wcd9335_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream);
194962306a36Sopenharmony_ci
195062306a36Sopenharmony_ci	return 0;
195162306a36Sopenharmony_ci}
195262306a36Sopenharmony_ci
195362306a36Sopenharmony_cistatic int wcd9335_trigger(struct snd_pcm_substream *substream, int cmd,
195462306a36Sopenharmony_ci			   struct snd_soc_dai *dai)
195562306a36Sopenharmony_ci{
195662306a36Sopenharmony_ci	struct wcd_slim_codec_dai_data *dai_data;
195762306a36Sopenharmony_ci	struct wcd9335_codec *wcd;
195862306a36Sopenharmony_ci	struct slim_stream_config *cfg;
195962306a36Sopenharmony_ci
196062306a36Sopenharmony_ci	wcd = snd_soc_component_get_drvdata(dai->component);
196162306a36Sopenharmony_ci
196262306a36Sopenharmony_ci	dai_data = &wcd->dai[dai->id];
196362306a36Sopenharmony_ci
196462306a36Sopenharmony_ci	switch (cmd) {
196562306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_START:
196662306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_RESUME:
196762306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
196862306a36Sopenharmony_ci		cfg = &dai_data->sconfig;
196962306a36Sopenharmony_ci		slim_stream_prepare(dai_data->sruntime, cfg);
197062306a36Sopenharmony_ci		slim_stream_enable(dai_data->sruntime);
197162306a36Sopenharmony_ci		break;
197262306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_STOP:
197362306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_SUSPEND:
197462306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
197562306a36Sopenharmony_ci		slim_stream_disable(dai_data->sruntime);
197662306a36Sopenharmony_ci		slim_stream_unprepare(dai_data->sruntime);
197762306a36Sopenharmony_ci		break;
197862306a36Sopenharmony_ci	default:
197962306a36Sopenharmony_ci		break;
198062306a36Sopenharmony_ci	}
198162306a36Sopenharmony_ci
198262306a36Sopenharmony_ci	return 0;
198362306a36Sopenharmony_ci}
198462306a36Sopenharmony_ci
198562306a36Sopenharmony_cistatic int wcd9335_set_channel_map(struct snd_soc_dai *dai,
198662306a36Sopenharmony_ci				   unsigned int tx_num, unsigned int *tx_slot,
198762306a36Sopenharmony_ci				   unsigned int rx_num, unsigned int *rx_slot)
198862306a36Sopenharmony_ci{
198962306a36Sopenharmony_ci	struct wcd9335_codec *wcd;
199062306a36Sopenharmony_ci	int i;
199162306a36Sopenharmony_ci
199262306a36Sopenharmony_ci	wcd = snd_soc_component_get_drvdata(dai->component);
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_ci	if (!tx_slot || !rx_slot) {
199562306a36Sopenharmony_ci		dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n",
199662306a36Sopenharmony_ci			tx_slot, rx_slot);
199762306a36Sopenharmony_ci		return -EINVAL;
199862306a36Sopenharmony_ci	}
199962306a36Sopenharmony_ci
200062306a36Sopenharmony_ci	wcd->num_rx_port = rx_num;
200162306a36Sopenharmony_ci	for (i = 0; i < rx_num; i++) {
200262306a36Sopenharmony_ci		wcd->rx_chs[i].ch_num = rx_slot[i];
200362306a36Sopenharmony_ci		INIT_LIST_HEAD(&wcd->rx_chs[i].list);
200462306a36Sopenharmony_ci	}
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ci	wcd->num_tx_port = tx_num;
200762306a36Sopenharmony_ci	for (i = 0; i < tx_num; i++) {
200862306a36Sopenharmony_ci		wcd->tx_chs[i].ch_num = tx_slot[i];
200962306a36Sopenharmony_ci		INIT_LIST_HEAD(&wcd->tx_chs[i].list);
201062306a36Sopenharmony_ci	}
201162306a36Sopenharmony_ci
201262306a36Sopenharmony_ci	return 0;
201362306a36Sopenharmony_ci}
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_cistatic int wcd9335_get_channel_map(struct snd_soc_dai *dai,
201662306a36Sopenharmony_ci				   unsigned int *tx_num, unsigned int *tx_slot,
201762306a36Sopenharmony_ci				   unsigned int *rx_num, unsigned int *rx_slot)
201862306a36Sopenharmony_ci{
201962306a36Sopenharmony_ci	struct wcd9335_slim_ch *ch;
202062306a36Sopenharmony_ci	struct wcd9335_codec *wcd;
202162306a36Sopenharmony_ci	int i = 0;
202262306a36Sopenharmony_ci
202362306a36Sopenharmony_ci	wcd = snd_soc_component_get_drvdata(dai->component);
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_ci	switch (dai->id) {
202662306a36Sopenharmony_ci	case AIF1_PB:
202762306a36Sopenharmony_ci	case AIF2_PB:
202862306a36Sopenharmony_ci	case AIF3_PB:
202962306a36Sopenharmony_ci	case AIF4_PB:
203062306a36Sopenharmony_ci		if (!rx_slot || !rx_num) {
203162306a36Sopenharmony_ci			dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n",
203262306a36Sopenharmony_ci				rx_slot, rx_num);
203362306a36Sopenharmony_ci			return -EINVAL;
203462306a36Sopenharmony_ci		}
203562306a36Sopenharmony_ci
203662306a36Sopenharmony_ci		list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
203762306a36Sopenharmony_ci			rx_slot[i++] = ch->ch_num;
203862306a36Sopenharmony_ci
203962306a36Sopenharmony_ci		*rx_num = i;
204062306a36Sopenharmony_ci		break;
204162306a36Sopenharmony_ci	case AIF1_CAP:
204262306a36Sopenharmony_ci	case AIF2_CAP:
204362306a36Sopenharmony_ci	case AIF3_CAP:
204462306a36Sopenharmony_ci		if (!tx_slot || !tx_num) {
204562306a36Sopenharmony_ci			dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n",
204662306a36Sopenharmony_ci				tx_slot, tx_num);
204762306a36Sopenharmony_ci			return -EINVAL;
204862306a36Sopenharmony_ci		}
204962306a36Sopenharmony_ci		list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
205062306a36Sopenharmony_ci			tx_slot[i++] = ch->ch_num;
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_ci		*tx_num = i;
205362306a36Sopenharmony_ci		break;
205462306a36Sopenharmony_ci	default:
205562306a36Sopenharmony_ci		dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id);
205662306a36Sopenharmony_ci		break;
205762306a36Sopenharmony_ci	}
205862306a36Sopenharmony_ci
205962306a36Sopenharmony_ci	return 0;
206062306a36Sopenharmony_ci}
206162306a36Sopenharmony_ci
206262306a36Sopenharmony_cistatic const struct snd_soc_dai_ops wcd9335_dai_ops = {
206362306a36Sopenharmony_ci	.hw_params = wcd9335_hw_params,
206462306a36Sopenharmony_ci	.trigger = wcd9335_trigger,
206562306a36Sopenharmony_ci	.set_channel_map = wcd9335_set_channel_map,
206662306a36Sopenharmony_ci	.get_channel_map = wcd9335_get_channel_map,
206762306a36Sopenharmony_ci};
206862306a36Sopenharmony_ci
206962306a36Sopenharmony_cistatic struct snd_soc_dai_driver wcd9335_slim_dais[] = {
207062306a36Sopenharmony_ci	[0] = {
207162306a36Sopenharmony_ci		.name = "wcd9335_rx1",
207262306a36Sopenharmony_ci		.id = AIF1_PB,
207362306a36Sopenharmony_ci		.playback = {
207462306a36Sopenharmony_ci			.stream_name = "AIF1 Playback",
207562306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
207662306a36Sopenharmony_ci				 SNDRV_PCM_RATE_384000,
207762306a36Sopenharmony_ci			.formats = WCD9335_FORMATS_S16_S24_LE,
207862306a36Sopenharmony_ci			.rate_max = 384000,
207962306a36Sopenharmony_ci			.rate_min = 8000,
208062306a36Sopenharmony_ci			.channels_min = 1,
208162306a36Sopenharmony_ci			.channels_max = 2,
208262306a36Sopenharmony_ci		},
208362306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
208462306a36Sopenharmony_ci	},
208562306a36Sopenharmony_ci	[1] = {
208662306a36Sopenharmony_ci		.name = "wcd9335_tx1",
208762306a36Sopenharmony_ci		.id = AIF1_CAP,
208862306a36Sopenharmony_ci		.capture = {
208962306a36Sopenharmony_ci			.stream_name = "AIF1 Capture",
209062306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK,
209162306a36Sopenharmony_ci			.formats = SNDRV_PCM_FMTBIT_S16_LE,
209262306a36Sopenharmony_ci			.rate_min = 8000,
209362306a36Sopenharmony_ci			.rate_max = 192000,
209462306a36Sopenharmony_ci			.channels_min = 1,
209562306a36Sopenharmony_ci			.channels_max = 4,
209662306a36Sopenharmony_ci		},
209762306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
209862306a36Sopenharmony_ci	},
209962306a36Sopenharmony_ci	[2] = {
210062306a36Sopenharmony_ci		.name = "wcd9335_rx2",
210162306a36Sopenharmony_ci		.id = AIF2_PB,
210262306a36Sopenharmony_ci		.playback = {
210362306a36Sopenharmony_ci			.stream_name = "AIF2 Playback",
210462306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
210562306a36Sopenharmony_ci				 SNDRV_PCM_RATE_384000,
210662306a36Sopenharmony_ci			.formats = WCD9335_FORMATS_S16_S24_LE,
210762306a36Sopenharmony_ci			.rate_min = 8000,
210862306a36Sopenharmony_ci			.rate_max = 384000,
210962306a36Sopenharmony_ci			.channels_min = 1,
211062306a36Sopenharmony_ci			.channels_max = 2,
211162306a36Sopenharmony_ci		},
211262306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
211362306a36Sopenharmony_ci	},
211462306a36Sopenharmony_ci	[3] = {
211562306a36Sopenharmony_ci		.name = "wcd9335_tx2",
211662306a36Sopenharmony_ci		.id = AIF2_CAP,
211762306a36Sopenharmony_ci		.capture = {
211862306a36Sopenharmony_ci			.stream_name = "AIF2 Capture",
211962306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK,
212062306a36Sopenharmony_ci			.formats = SNDRV_PCM_FMTBIT_S16_LE,
212162306a36Sopenharmony_ci			.rate_min = 8000,
212262306a36Sopenharmony_ci			.rate_max = 192000,
212362306a36Sopenharmony_ci			.channels_min = 1,
212462306a36Sopenharmony_ci			.channels_max = 4,
212562306a36Sopenharmony_ci		},
212662306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
212762306a36Sopenharmony_ci	},
212862306a36Sopenharmony_ci	[4] = {
212962306a36Sopenharmony_ci		.name = "wcd9335_rx3",
213062306a36Sopenharmony_ci		.id = AIF3_PB,
213162306a36Sopenharmony_ci		.playback = {
213262306a36Sopenharmony_ci			.stream_name = "AIF3 Playback",
213362306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
213462306a36Sopenharmony_ci				 SNDRV_PCM_RATE_384000,
213562306a36Sopenharmony_ci			.formats = WCD9335_FORMATS_S16_S24_LE,
213662306a36Sopenharmony_ci			.rate_min = 8000,
213762306a36Sopenharmony_ci			.rate_max = 384000,
213862306a36Sopenharmony_ci			.channels_min = 1,
213962306a36Sopenharmony_ci			.channels_max = 2,
214062306a36Sopenharmony_ci		},
214162306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
214262306a36Sopenharmony_ci	},
214362306a36Sopenharmony_ci	[5] = {
214462306a36Sopenharmony_ci		.name = "wcd9335_tx3",
214562306a36Sopenharmony_ci		.id = AIF3_CAP,
214662306a36Sopenharmony_ci		.capture = {
214762306a36Sopenharmony_ci			.stream_name = "AIF3 Capture",
214862306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK,
214962306a36Sopenharmony_ci			.formats = SNDRV_PCM_FMTBIT_S16_LE,
215062306a36Sopenharmony_ci			.rate_min = 8000,
215162306a36Sopenharmony_ci			.rate_max = 192000,
215262306a36Sopenharmony_ci			.channels_min = 1,
215362306a36Sopenharmony_ci			.channels_max = 4,
215462306a36Sopenharmony_ci		},
215562306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
215662306a36Sopenharmony_ci	},
215762306a36Sopenharmony_ci	[6] = {
215862306a36Sopenharmony_ci		.name = "wcd9335_rx4",
215962306a36Sopenharmony_ci		.id = AIF4_PB,
216062306a36Sopenharmony_ci		.playback = {
216162306a36Sopenharmony_ci			.stream_name = "AIF4 Playback",
216262306a36Sopenharmony_ci			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
216362306a36Sopenharmony_ci				 SNDRV_PCM_RATE_384000,
216462306a36Sopenharmony_ci			.formats = WCD9335_FORMATS_S16_S24_LE,
216562306a36Sopenharmony_ci			.rate_min = 8000,
216662306a36Sopenharmony_ci			.rate_max = 384000,
216762306a36Sopenharmony_ci			.channels_min = 1,
216862306a36Sopenharmony_ci			.channels_max = 2,
216962306a36Sopenharmony_ci		},
217062306a36Sopenharmony_ci		.ops = &wcd9335_dai_ops,
217162306a36Sopenharmony_ci	},
217262306a36Sopenharmony_ci};
217362306a36Sopenharmony_ci
217462306a36Sopenharmony_cistatic int wcd9335_get_compander(struct snd_kcontrol *kc,
217562306a36Sopenharmony_ci			       struct snd_ctl_elem_value *ucontrol)
217662306a36Sopenharmony_ci{
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
217962306a36Sopenharmony_ci	int comp = ((struct soc_mixer_control *)kc->private_value)->shift;
218062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
218162306a36Sopenharmony_ci
218262306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = wcd->comp_enabled[comp];
218362306a36Sopenharmony_ci	return 0;
218462306a36Sopenharmony_ci}
218562306a36Sopenharmony_ci
218662306a36Sopenharmony_cistatic int wcd9335_set_compander(struct snd_kcontrol *kc,
218762306a36Sopenharmony_ci				 struct snd_ctl_elem_value *ucontrol)
218862306a36Sopenharmony_ci{
218962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
219062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
219162306a36Sopenharmony_ci	int comp = ((struct soc_mixer_control *) kc->private_value)->shift;
219262306a36Sopenharmony_ci	int value = ucontrol->value.integer.value[0];
219362306a36Sopenharmony_ci	int sel;
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_ci	wcd->comp_enabled[comp] = value;
219662306a36Sopenharmony_ci	sel = value ? WCD9335_HPH_GAIN_SRC_SEL_COMPANDER :
219762306a36Sopenharmony_ci		WCD9335_HPH_GAIN_SRC_SEL_REGISTER;
219862306a36Sopenharmony_ci
219962306a36Sopenharmony_ci	/* Any specific register configuration for compander */
220062306a36Sopenharmony_ci	switch (comp) {
220162306a36Sopenharmony_ci	case COMPANDER_1:
220262306a36Sopenharmony_ci		/* Set Gain Source Select based on compander enable/disable */
220362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WCD9335_HPH_L_EN,
220462306a36Sopenharmony_ci				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
220562306a36Sopenharmony_ci		break;
220662306a36Sopenharmony_ci	case COMPANDER_2:
220762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WCD9335_HPH_R_EN,
220862306a36Sopenharmony_ci				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
220962306a36Sopenharmony_ci		break;
221062306a36Sopenharmony_ci	case COMPANDER_5:
221162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WCD9335_SE_LO_LO3_GAIN,
221262306a36Sopenharmony_ci				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
221362306a36Sopenharmony_ci		break;
221462306a36Sopenharmony_ci	case COMPANDER_6:
221562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WCD9335_SE_LO_LO4_GAIN,
221662306a36Sopenharmony_ci				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
221762306a36Sopenharmony_ci		break;
221862306a36Sopenharmony_ci	default:
221962306a36Sopenharmony_ci		break;
222062306a36Sopenharmony_ci	}
222162306a36Sopenharmony_ci
222262306a36Sopenharmony_ci	return 0;
222362306a36Sopenharmony_ci}
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_cistatic int wcd9335_rx_hph_mode_get(struct snd_kcontrol *kc,
222662306a36Sopenharmony_ci				 struct snd_ctl_elem_value *ucontrol)
222762306a36Sopenharmony_ci{
222862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
222962306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
223062306a36Sopenharmony_ci
223162306a36Sopenharmony_ci	ucontrol->value.enumerated.item[0] = wcd->hph_mode;
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_ci	return 0;
223462306a36Sopenharmony_ci}
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_cistatic int wcd9335_rx_hph_mode_put(struct snd_kcontrol *kc,
223762306a36Sopenharmony_ci				 struct snd_ctl_elem_value *ucontrol)
223862306a36Sopenharmony_ci{
223962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
224062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
224162306a36Sopenharmony_ci	u32 mode_val;
224262306a36Sopenharmony_ci
224362306a36Sopenharmony_ci	mode_val = ucontrol->value.enumerated.item[0];
224462306a36Sopenharmony_ci
224562306a36Sopenharmony_ci	if (mode_val == 0) {
224662306a36Sopenharmony_ci		dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n");
224762306a36Sopenharmony_ci		mode_val = CLS_H_HIFI;
224862306a36Sopenharmony_ci	}
224962306a36Sopenharmony_ci	wcd->hph_mode = mode_val;
225062306a36Sopenharmony_ci
225162306a36Sopenharmony_ci	return 0;
225262306a36Sopenharmony_ci}
225362306a36Sopenharmony_ci
225462306a36Sopenharmony_cistatic const struct snd_kcontrol_new wcd9335_snd_controls[] = {
225562306a36Sopenharmony_ci	/* -84dB min - 40dB max */
225662306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX0 Digital Volume", WCD9335_CDC_RX0_RX_VOL_CTL,
225762306a36Sopenharmony_ci			-84, 40, digital_gain),
225862306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX1 Digital Volume", WCD9335_CDC_RX1_RX_VOL_CTL,
225962306a36Sopenharmony_ci			-84, 40, digital_gain),
226062306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX2 Digital Volume", WCD9335_CDC_RX2_RX_VOL_CTL,
226162306a36Sopenharmony_ci			-84, 40, digital_gain),
226262306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX3 Digital Volume", WCD9335_CDC_RX3_RX_VOL_CTL,
226362306a36Sopenharmony_ci			-84, 40, digital_gain),
226462306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX4 Digital Volume", WCD9335_CDC_RX4_RX_VOL_CTL,
226562306a36Sopenharmony_ci			-84, 40, digital_gain),
226662306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX5 Digital Volume", WCD9335_CDC_RX5_RX_VOL_CTL,
226762306a36Sopenharmony_ci			-84, 40, digital_gain),
226862306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX6 Digital Volume", WCD9335_CDC_RX6_RX_VOL_CTL,
226962306a36Sopenharmony_ci			-84, 40, digital_gain),
227062306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX7 Digital Volume", WCD9335_CDC_RX7_RX_VOL_CTL,
227162306a36Sopenharmony_ci			-84, 40, digital_gain),
227262306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX8 Digital Volume", WCD9335_CDC_RX8_RX_VOL_CTL,
227362306a36Sopenharmony_ci			-84, 40, digital_gain),
227462306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX0 Mix Digital Volume", WCD9335_CDC_RX0_RX_VOL_MIX_CTL,
227562306a36Sopenharmony_ci			-84, 40, digital_gain),
227662306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX1 Mix Digital Volume", WCD9335_CDC_RX1_RX_VOL_MIX_CTL,
227762306a36Sopenharmony_ci			-84, 40, digital_gain),
227862306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX2 Mix Digital Volume", WCD9335_CDC_RX2_RX_VOL_MIX_CTL,
227962306a36Sopenharmony_ci			-84, 40, digital_gain),
228062306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX3 Mix Digital Volume", WCD9335_CDC_RX3_RX_VOL_MIX_CTL,
228162306a36Sopenharmony_ci			-84, 40, digital_gain),
228262306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX4 Mix Digital Volume", WCD9335_CDC_RX4_RX_VOL_MIX_CTL,
228362306a36Sopenharmony_ci			-84, 40, digital_gain),
228462306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX5 Mix Digital Volume", WCD9335_CDC_RX5_RX_VOL_MIX_CTL,
228562306a36Sopenharmony_ci			-84, 40, digital_gain),
228662306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX6 Mix Digital Volume", WCD9335_CDC_RX6_RX_VOL_MIX_CTL,
228762306a36Sopenharmony_ci			-84, 40, digital_gain),
228862306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX7 Mix Digital Volume", WCD9335_CDC_RX7_RX_VOL_MIX_CTL,
228962306a36Sopenharmony_ci			-84, 40, digital_gain),
229062306a36Sopenharmony_ci	SOC_SINGLE_S8_TLV("RX8 Mix Digital Volume", WCD9335_CDC_RX8_RX_VOL_MIX_CTL,
229162306a36Sopenharmony_ci			-84, 40, digital_gain),
229262306a36Sopenharmony_ci	SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum),
229362306a36Sopenharmony_ci	SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum),
229462306a36Sopenharmony_ci	SOC_ENUM("RX INT1_1 HPF cut off", cf_int1_1_enum),
229562306a36Sopenharmony_ci	SOC_ENUM("RX INT1_2 HPF cut off", cf_int1_2_enum),
229662306a36Sopenharmony_ci	SOC_ENUM("RX INT2_1 HPF cut off", cf_int2_1_enum),
229762306a36Sopenharmony_ci	SOC_ENUM("RX INT2_2 HPF cut off", cf_int2_2_enum),
229862306a36Sopenharmony_ci	SOC_ENUM("RX INT3_1 HPF cut off", cf_int3_1_enum),
229962306a36Sopenharmony_ci	SOC_ENUM("RX INT3_2 HPF cut off", cf_int3_2_enum),
230062306a36Sopenharmony_ci	SOC_ENUM("RX INT4_1 HPF cut off", cf_int4_1_enum),
230162306a36Sopenharmony_ci	SOC_ENUM("RX INT4_2 HPF cut off", cf_int4_2_enum),
230262306a36Sopenharmony_ci	SOC_ENUM("RX INT5_1 HPF cut off", cf_int5_1_enum),
230362306a36Sopenharmony_ci	SOC_ENUM("RX INT5_2 HPF cut off", cf_int5_2_enum),
230462306a36Sopenharmony_ci	SOC_ENUM("RX INT6_1 HPF cut off", cf_int6_1_enum),
230562306a36Sopenharmony_ci	SOC_ENUM("RX INT6_2 HPF cut off", cf_int6_2_enum),
230662306a36Sopenharmony_ci	SOC_ENUM("RX INT7_1 HPF cut off", cf_int7_1_enum),
230762306a36Sopenharmony_ci	SOC_ENUM("RX INT7_2 HPF cut off", cf_int7_2_enum),
230862306a36Sopenharmony_ci	SOC_ENUM("RX INT8_1 HPF cut off", cf_int8_1_enum),
230962306a36Sopenharmony_ci	SOC_ENUM("RX INT8_2 HPF cut off", cf_int8_2_enum),
231062306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, COMPANDER_1, 1, 0,
231162306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
231262306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, COMPANDER_2, 1, 0,
231362306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
231462306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP3 Switch", SND_SOC_NOPM, COMPANDER_3, 1, 0,
231562306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
231662306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP4 Switch", SND_SOC_NOPM, COMPANDER_4, 1, 0,
231762306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
231862306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP5 Switch", SND_SOC_NOPM, COMPANDER_5, 1, 0,
231962306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
232062306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP6 Switch", SND_SOC_NOPM, COMPANDER_6, 1, 0,
232162306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
232262306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP7 Switch", SND_SOC_NOPM, COMPANDER_7, 1, 0,
232362306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
232462306a36Sopenharmony_ci	SOC_SINGLE_EXT("COMP8 Switch", SND_SOC_NOPM, COMPANDER_8, 1, 0,
232562306a36Sopenharmony_ci		       wcd9335_get_compander, wcd9335_set_compander),
232662306a36Sopenharmony_ci	SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum,
232762306a36Sopenharmony_ci		       wcd9335_rx_hph_mode_get, wcd9335_rx_hph_mode_put),
232862306a36Sopenharmony_ci
232962306a36Sopenharmony_ci	/* Gain Controls */
233062306a36Sopenharmony_ci	SOC_SINGLE_TLV("EAR PA Volume", WCD9335_ANA_EAR, 4, 4, 1,
233162306a36Sopenharmony_ci		ear_pa_gain),
233262306a36Sopenharmony_ci	SOC_SINGLE_TLV("HPHL Volume", WCD9335_HPH_L_EN, 0, 20, 1,
233362306a36Sopenharmony_ci		line_gain),
233462306a36Sopenharmony_ci	SOC_SINGLE_TLV("HPHR Volume", WCD9335_HPH_R_EN, 0, 20, 1,
233562306a36Sopenharmony_ci		line_gain),
233662306a36Sopenharmony_ci	SOC_SINGLE_TLV("LINEOUT1 Volume", WCD9335_DIFF_LO_LO1_COMPANDER,
233762306a36Sopenharmony_ci			3, 16, 1, line_gain),
233862306a36Sopenharmony_ci	SOC_SINGLE_TLV("LINEOUT2 Volume", WCD9335_DIFF_LO_LO2_COMPANDER,
233962306a36Sopenharmony_ci			3, 16, 1, line_gain),
234062306a36Sopenharmony_ci	SOC_SINGLE_TLV("LINEOUT3 Volume", WCD9335_SE_LO_LO3_GAIN, 0, 20, 1,
234162306a36Sopenharmony_ci			line_gain),
234262306a36Sopenharmony_ci	SOC_SINGLE_TLV("LINEOUT4 Volume", WCD9335_SE_LO_LO4_GAIN, 0, 20, 1,
234362306a36Sopenharmony_ci			line_gain),
234462306a36Sopenharmony_ci
234562306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC1 Volume", WCD9335_ANA_AMIC1, 0, 20, 0,
234662306a36Sopenharmony_ci			analog_gain),
234762306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC2 Volume", WCD9335_ANA_AMIC2, 0, 20, 0,
234862306a36Sopenharmony_ci			analog_gain),
234962306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC3 Volume", WCD9335_ANA_AMIC3, 0, 20, 0,
235062306a36Sopenharmony_ci			analog_gain),
235162306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC4 Volume", WCD9335_ANA_AMIC4, 0, 20, 0,
235262306a36Sopenharmony_ci			analog_gain),
235362306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC5 Volume", WCD9335_ANA_AMIC5, 0, 20, 0,
235462306a36Sopenharmony_ci			analog_gain),
235562306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC6 Volume", WCD9335_ANA_AMIC6, 0, 20, 0,
235662306a36Sopenharmony_ci			analog_gain),
235762306a36Sopenharmony_ci
235862306a36Sopenharmony_ci	SOC_ENUM("TX0 HPF cut off", cf_dec0_enum),
235962306a36Sopenharmony_ci	SOC_ENUM("TX1 HPF cut off", cf_dec1_enum),
236062306a36Sopenharmony_ci	SOC_ENUM("TX2 HPF cut off", cf_dec2_enum),
236162306a36Sopenharmony_ci	SOC_ENUM("TX3 HPF cut off", cf_dec3_enum),
236262306a36Sopenharmony_ci	SOC_ENUM("TX4 HPF cut off", cf_dec4_enum),
236362306a36Sopenharmony_ci	SOC_ENUM("TX5 HPF cut off", cf_dec5_enum),
236462306a36Sopenharmony_ci	SOC_ENUM("TX6 HPF cut off", cf_dec6_enum),
236562306a36Sopenharmony_ci	SOC_ENUM("TX7 HPF cut off", cf_dec7_enum),
236662306a36Sopenharmony_ci	SOC_ENUM("TX8 HPF cut off", cf_dec8_enum),
236762306a36Sopenharmony_ci};
236862306a36Sopenharmony_ci
236962306a36Sopenharmony_cistatic const struct snd_soc_dapm_route wcd9335_audio_map[] = {
237062306a36Sopenharmony_ci	{"SLIM RX0 MUX", "AIF1_PB", "AIF1 PB"},
237162306a36Sopenharmony_ci	{"SLIM RX1 MUX", "AIF1_PB", "AIF1 PB"},
237262306a36Sopenharmony_ci	{"SLIM RX2 MUX", "AIF1_PB", "AIF1 PB"},
237362306a36Sopenharmony_ci	{"SLIM RX3 MUX", "AIF1_PB", "AIF1 PB"},
237462306a36Sopenharmony_ci	{"SLIM RX4 MUX", "AIF1_PB", "AIF1 PB"},
237562306a36Sopenharmony_ci	{"SLIM RX5 MUX", "AIF1_PB", "AIF1 PB"},
237662306a36Sopenharmony_ci	{"SLIM RX6 MUX", "AIF1_PB", "AIF1 PB"},
237762306a36Sopenharmony_ci	{"SLIM RX7 MUX", "AIF1_PB", "AIF1 PB"},
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_ci	{"SLIM RX0 MUX", "AIF2_PB", "AIF2 PB"},
238062306a36Sopenharmony_ci	{"SLIM RX1 MUX", "AIF2_PB", "AIF2 PB"},
238162306a36Sopenharmony_ci	{"SLIM RX2 MUX", "AIF2_PB", "AIF2 PB"},
238262306a36Sopenharmony_ci	{"SLIM RX3 MUX", "AIF2_PB", "AIF2 PB"},
238362306a36Sopenharmony_ci	{"SLIM RX4 MUX", "AIF2_PB", "AIF2 PB"},
238462306a36Sopenharmony_ci	{"SLIM RX5 MUX", "AIF2_PB", "AIF2 PB"},
238562306a36Sopenharmony_ci	{"SLIM RX6 MUX", "AIF2_PB", "AIF2 PB"},
238662306a36Sopenharmony_ci	{"SLIM RX7 MUX", "AIF2_PB", "AIF2 PB"},
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_ci	{"SLIM RX0 MUX", "AIF3_PB", "AIF3 PB"},
238962306a36Sopenharmony_ci	{"SLIM RX1 MUX", "AIF3_PB", "AIF3 PB"},
239062306a36Sopenharmony_ci	{"SLIM RX2 MUX", "AIF3_PB", "AIF3 PB"},
239162306a36Sopenharmony_ci	{"SLIM RX3 MUX", "AIF3_PB", "AIF3 PB"},
239262306a36Sopenharmony_ci	{"SLIM RX4 MUX", "AIF3_PB", "AIF3 PB"},
239362306a36Sopenharmony_ci	{"SLIM RX5 MUX", "AIF3_PB", "AIF3 PB"},
239462306a36Sopenharmony_ci	{"SLIM RX6 MUX", "AIF3_PB", "AIF3 PB"},
239562306a36Sopenharmony_ci	{"SLIM RX7 MUX", "AIF3_PB", "AIF3 PB"},
239662306a36Sopenharmony_ci
239762306a36Sopenharmony_ci	{"SLIM RX0 MUX", "AIF4_PB", "AIF4 PB"},
239862306a36Sopenharmony_ci	{"SLIM RX1 MUX", "AIF4_PB", "AIF4 PB"},
239962306a36Sopenharmony_ci	{"SLIM RX2 MUX", "AIF4_PB", "AIF4 PB"},
240062306a36Sopenharmony_ci	{"SLIM RX3 MUX", "AIF4_PB", "AIF4 PB"},
240162306a36Sopenharmony_ci	{"SLIM RX4 MUX", "AIF4_PB", "AIF4 PB"},
240262306a36Sopenharmony_ci	{"SLIM RX5 MUX", "AIF4_PB", "AIF4 PB"},
240362306a36Sopenharmony_ci	{"SLIM RX6 MUX", "AIF4_PB", "AIF4 PB"},
240462306a36Sopenharmony_ci	{"SLIM RX7 MUX", "AIF4_PB", "AIF4 PB"},
240562306a36Sopenharmony_ci
240662306a36Sopenharmony_ci	{"SLIM RX0", NULL, "SLIM RX0 MUX"},
240762306a36Sopenharmony_ci	{"SLIM RX1", NULL, "SLIM RX1 MUX"},
240862306a36Sopenharmony_ci	{"SLIM RX2", NULL, "SLIM RX2 MUX"},
240962306a36Sopenharmony_ci	{"SLIM RX3", NULL, "SLIM RX3 MUX"},
241062306a36Sopenharmony_ci	{"SLIM RX4", NULL, "SLIM RX4 MUX"},
241162306a36Sopenharmony_ci	{"SLIM RX5", NULL, "SLIM RX5 MUX"},
241262306a36Sopenharmony_ci	{"SLIM RX6", NULL, "SLIM RX6 MUX"},
241362306a36Sopenharmony_ci	{"SLIM RX7", NULL, "SLIM RX7 MUX"},
241462306a36Sopenharmony_ci
241562306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(0),
241662306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(1),
241762306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(2),
241862306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(3),
241962306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(4),
242062306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(5),
242162306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(6),
242262306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(7),
242362306a36Sopenharmony_ci	WCD9335_INTERPOLATOR_PATH(8),
242462306a36Sopenharmony_ci
242562306a36Sopenharmony_ci	/* EAR PA */
242662306a36Sopenharmony_ci	{"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 INTERP"},
242762306a36Sopenharmony_ci	{"RX INT0 DAC", NULL, "RX INT0 DEM MUX"},
242862306a36Sopenharmony_ci	{"RX INT0 DAC", NULL, "RX_BIAS"},
242962306a36Sopenharmony_ci	{"EAR PA", NULL, "RX INT0 DAC"},
243062306a36Sopenharmony_ci	{"EAR", NULL, "EAR PA"},
243162306a36Sopenharmony_ci
243262306a36Sopenharmony_ci	/* HPHL */
243362306a36Sopenharmony_ci	{"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 INTERP"},
243462306a36Sopenharmony_ci	{"RX INT1 DAC", NULL, "RX INT1 DEM MUX"},
243562306a36Sopenharmony_ci	{"RX INT1 DAC", NULL, "RX_BIAS"},
243662306a36Sopenharmony_ci	{"HPHL PA", NULL, "RX INT1 DAC"},
243762306a36Sopenharmony_ci	{"HPHL", NULL, "HPHL PA"},
243862306a36Sopenharmony_ci
243962306a36Sopenharmony_ci	/* HPHR */
244062306a36Sopenharmony_ci	{"RX INT2 DEM MUX", "CLSH_DSM_OUT", "RX INT2 INTERP"},
244162306a36Sopenharmony_ci	{"RX INT2 DAC", NULL, "RX INT2 DEM MUX"},
244262306a36Sopenharmony_ci	{"RX INT2 DAC", NULL, "RX_BIAS"},
244362306a36Sopenharmony_ci	{"HPHR PA", NULL, "RX INT2 DAC"},
244462306a36Sopenharmony_ci	{"HPHR", NULL, "HPHR PA"},
244562306a36Sopenharmony_ci
244662306a36Sopenharmony_ci	/* LINEOUT1 */
244762306a36Sopenharmony_ci	{"RX INT3 DAC", NULL, "RX INT3 INTERP"},
244862306a36Sopenharmony_ci	{"RX INT3 DAC", NULL, "RX_BIAS"},
244962306a36Sopenharmony_ci	{"LINEOUT1 PA", NULL, "RX INT3 DAC"},
245062306a36Sopenharmony_ci	{"LINEOUT1", NULL, "LINEOUT1 PA"},
245162306a36Sopenharmony_ci
245262306a36Sopenharmony_ci	/* LINEOUT2 */
245362306a36Sopenharmony_ci	{"RX INT4 DAC", NULL, "RX INT4 INTERP"},
245462306a36Sopenharmony_ci	{"RX INT4 DAC", NULL, "RX_BIAS"},
245562306a36Sopenharmony_ci	{"LINEOUT2 PA", NULL, "RX INT4 DAC"},
245662306a36Sopenharmony_ci	{"LINEOUT2", NULL, "LINEOUT2 PA"},
245762306a36Sopenharmony_ci
245862306a36Sopenharmony_ci	/* LINEOUT3 */
245962306a36Sopenharmony_ci	{"RX INT5 DAC", NULL, "RX INT5 INTERP"},
246062306a36Sopenharmony_ci	{"RX INT5 DAC", NULL, "RX_BIAS"},
246162306a36Sopenharmony_ci	{"LINEOUT3 PA", NULL, "RX INT5 DAC"},
246262306a36Sopenharmony_ci	{"LINEOUT3", NULL, "LINEOUT3 PA"},
246362306a36Sopenharmony_ci
246462306a36Sopenharmony_ci	/* LINEOUT4 */
246562306a36Sopenharmony_ci	{"RX INT6 DAC", NULL, "RX INT6 INTERP"},
246662306a36Sopenharmony_ci	{"RX INT6 DAC", NULL, "RX_BIAS"},
246762306a36Sopenharmony_ci	{"LINEOUT4 PA", NULL, "RX INT6 DAC"},
246862306a36Sopenharmony_ci	{"LINEOUT4", NULL, "LINEOUT4 PA"},
246962306a36Sopenharmony_ci
247062306a36Sopenharmony_ci	/* SLIMBUS Connections */
247162306a36Sopenharmony_ci	{"AIF1 CAP", NULL, "AIF1_CAP Mixer"},
247262306a36Sopenharmony_ci	{"AIF2 CAP", NULL, "AIF2_CAP Mixer"},
247362306a36Sopenharmony_ci	{"AIF3 CAP", NULL, "AIF3_CAP Mixer"},
247462306a36Sopenharmony_ci
247562306a36Sopenharmony_ci	/* ADC Mux */
247662306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(0),
247762306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(1),
247862306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(2),
247962306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(3),
248062306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(4),
248162306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(5),
248262306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(6),
248362306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(7),
248462306a36Sopenharmony_ci	WCD9335_ADC_MUX_PATH(8),
248562306a36Sopenharmony_ci
248662306a36Sopenharmony_ci	/* ADC Connections */
248762306a36Sopenharmony_ci	{"ADC1", NULL, "AMIC1"},
248862306a36Sopenharmony_ci	{"ADC2", NULL, "AMIC2"},
248962306a36Sopenharmony_ci	{"ADC3", NULL, "AMIC3"},
249062306a36Sopenharmony_ci	{"ADC4", NULL, "AMIC4"},
249162306a36Sopenharmony_ci	{"ADC5", NULL, "AMIC5"},
249262306a36Sopenharmony_ci	{"ADC6", NULL, "AMIC6"},
249362306a36Sopenharmony_ci};
249462306a36Sopenharmony_ci
249562306a36Sopenharmony_cistatic int wcd9335_micbias_control(struct snd_soc_component *component,
249662306a36Sopenharmony_ci				   int micb_num, int req, bool is_dapm)
249762306a36Sopenharmony_ci{
249862306a36Sopenharmony_ci	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(component);
249962306a36Sopenharmony_ci	int micb_index = micb_num - 1;
250062306a36Sopenharmony_ci	u16 micb_reg;
250162306a36Sopenharmony_ci
250262306a36Sopenharmony_ci	if ((micb_index < 0) || (micb_index > WCD9335_MAX_MICBIAS - 1)) {
250362306a36Sopenharmony_ci		dev_err(wcd->dev, "Invalid micbias index, micb_ind:%d\n",
250462306a36Sopenharmony_ci			micb_index);
250562306a36Sopenharmony_ci		return -EINVAL;
250662306a36Sopenharmony_ci	}
250762306a36Sopenharmony_ci
250862306a36Sopenharmony_ci	switch (micb_num) {
250962306a36Sopenharmony_ci	case MIC_BIAS_1:
251062306a36Sopenharmony_ci		micb_reg = WCD9335_ANA_MICB1;
251162306a36Sopenharmony_ci		break;
251262306a36Sopenharmony_ci	case MIC_BIAS_2:
251362306a36Sopenharmony_ci		micb_reg = WCD9335_ANA_MICB2;
251462306a36Sopenharmony_ci		break;
251562306a36Sopenharmony_ci	case MIC_BIAS_3:
251662306a36Sopenharmony_ci		micb_reg = WCD9335_ANA_MICB3;
251762306a36Sopenharmony_ci		break;
251862306a36Sopenharmony_ci	case MIC_BIAS_4:
251962306a36Sopenharmony_ci		micb_reg = WCD9335_ANA_MICB4;
252062306a36Sopenharmony_ci		break;
252162306a36Sopenharmony_ci	default:
252262306a36Sopenharmony_ci		dev_err(component->dev, "%s: Invalid micbias number: %d\n",
252362306a36Sopenharmony_ci			__func__, micb_num);
252462306a36Sopenharmony_ci		return -EINVAL;
252562306a36Sopenharmony_ci	}
252662306a36Sopenharmony_ci
252762306a36Sopenharmony_ci	switch (req) {
252862306a36Sopenharmony_ci	case MICB_PULLUP_ENABLE:
252962306a36Sopenharmony_ci		wcd->pullup_ref[micb_index]++;
253062306a36Sopenharmony_ci		if ((wcd->pullup_ref[micb_index] == 1) &&
253162306a36Sopenharmony_ci		    (wcd->micb_ref[micb_index] == 0))
253262306a36Sopenharmony_ci			snd_soc_component_update_bits(component, micb_reg,
253362306a36Sopenharmony_ci							0xC0, 0x80);
253462306a36Sopenharmony_ci		break;
253562306a36Sopenharmony_ci	case MICB_PULLUP_DISABLE:
253662306a36Sopenharmony_ci		wcd->pullup_ref[micb_index]--;
253762306a36Sopenharmony_ci		if ((wcd->pullup_ref[micb_index] == 0) &&
253862306a36Sopenharmony_ci		    (wcd->micb_ref[micb_index] == 0))
253962306a36Sopenharmony_ci			snd_soc_component_update_bits(component, micb_reg,
254062306a36Sopenharmony_ci							0xC0, 0x00);
254162306a36Sopenharmony_ci		break;
254262306a36Sopenharmony_ci	case MICB_ENABLE:
254362306a36Sopenharmony_ci		wcd->micb_ref[micb_index]++;
254462306a36Sopenharmony_ci		if (wcd->micb_ref[micb_index] == 1)
254562306a36Sopenharmony_ci			snd_soc_component_update_bits(component, micb_reg,
254662306a36Sopenharmony_ci							0xC0, 0x40);
254762306a36Sopenharmony_ci		break;
254862306a36Sopenharmony_ci	case MICB_DISABLE:
254962306a36Sopenharmony_ci		wcd->micb_ref[micb_index]--;
255062306a36Sopenharmony_ci		if ((wcd->micb_ref[micb_index] == 0) &&
255162306a36Sopenharmony_ci		    (wcd->pullup_ref[micb_index] > 0))
255262306a36Sopenharmony_ci			snd_soc_component_update_bits(component, micb_reg,
255362306a36Sopenharmony_ci							0xC0, 0x80);
255462306a36Sopenharmony_ci		else if ((wcd->micb_ref[micb_index] == 0) &&
255562306a36Sopenharmony_ci			 (wcd->pullup_ref[micb_index] == 0)) {
255662306a36Sopenharmony_ci			snd_soc_component_update_bits(component, micb_reg,
255762306a36Sopenharmony_ci							0xC0, 0x00);
255862306a36Sopenharmony_ci		}
255962306a36Sopenharmony_ci		break;
256062306a36Sopenharmony_ci	}
256162306a36Sopenharmony_ci
256262306a36Sopenharmony_ci	return 0;
256362306a36Sopenharmony_ci}
256462306a36Sopenharmony_ci
256562306a36Sopenharmony_cistatic int __wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget *w,
256662306a36Sopenharmony_ci					int event)
256762306a36Sopenharmony_ci{
256862306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
256962306a36Sopenharmony_ci	int micb_num;
257062306a36Sopenharmony_ci
257162306a36Sopenharmony_ci	if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1")))
257262306a36Sopenharmony_ci		micb_num = MIC_BIAS_1;
257362306a36Sopenharmony_ci	else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2")))
257462306a36Sopenharmony_ci		micb_num = MIC_BIAS_2;
257562306a36Sopenharmony_ci	else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3")))
257662306a36Sopenharmony_ci		micb_num = MIC_BIAS_3;
257762306a36Sopenharmony_ci	else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4")))
257862306a36Sopenharmony_ci		micb_num = MIC_BIAS_4;
257962306a36Sopenharmony_ci	else
258062306a36Sopenharmony_ci		return -EINVAL;
258162306a36Sopenharmony_ci
258262306a36Sopenharmony_ci	switch (event) {
258362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
258462306a36Sopenharmony_ci		/*
258562306a36Sopenharmony_ci		 * MIC BIAS can also be requested by MBHC,
258662306a36Sopenharmony_ci		 * so use ref count to handle micbias pullup
258762306a36Sopenharmony_ci		 * and enable requests
258862306a36Sopenharmony_ci		 */
258962306a36Sopenharmony_ci		wcd9335_micbias_control(comp, micb_num, MICB_ENABLE, true);
259062306a36Sopenharmony_ci		break;
259162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
259262306a36Sopenharmony_ci		/* wait for cnp time */
259362306a36Sopenharmony_ci		usleep_range(1000, 1100);
259462306a36Sopenharmony_ci		break;
259562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
259662306a36Sopenharmony_ci		wcd9335_micbias_control(comp, micb_num, MICB_DISABLE, true);
259762306a36Sopenharmony_ci		break;
259862306a36Sopenharmony_ci	}
259962306a36Sopenharmony_ci
260062306a36Sopenharmony_ci	return 0;
260162306a36Sopenharmony_ci}
260262306a36Sopenharmony_ci
260362306a36Sopenharmony_cistatic int wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget *w,
260462306a36Sopenharmony_ci		struct snd_kcontrol *kc, int event)
260562306a36Sopenharmony_ci{
260662306a36Sopenharmony_ci	return __wcd9335_codec_enable_micbias(w, event);
260762306a36Sopenharmony_ci}
260862306a36Sopenharmony_ci
260962306a36Sopenharmony_cistatic void wcd9335_codec_set_tx_hold(struct snd_soc_component *comp,
261062306a36Sopenharmony_ci				      u16 amic_reg, bool set)
261162306a36Sopenharmony_ci{
261262306a36Sopenharmony_ci	u8 mask = 0x20;
261362306a36Sopenharmony_ci	u8 val;
261462306a36Sopenharmony_ci
261562306a36Sopenharmony_ci	if (amic_reg == WCD9335_ANA_AMIC1 || amic_reg == WCD9335_ANA_AMIC3 ||
261662306a36Sopenharmony_ci	    amic_reg == WCD9335_ANA_AMIC5)
261762306a36Sopenharmony_ci		mask = 0x40;
261862306a36Sopenharmony_ci
261962306a36Sopenharmony_ci	val = set ? mask : 0x00;
262062306a36Sopenharmony_ci
262162306a36Sopenharmony_ci	switch (amic_reg) {
262262306a36Sopenharmony_ci	case WCD9335_ANA_AMIC1:
262362306a36Sopenharmony_ci	case WCD9335_ANA_AMIC2:
262462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC2, mask,
262562306a36Sopenharmony_ci						val);
262662306a36Sopenharmony_ci		break;
262762306a36Sopenharmony_ci	case WCD9335_ANA_AMIC3:
262862306a36Sopenharmony_ci	case WCD9335_ANA_AMIC4:
262962306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC4, mask,
263062306a36Sopenharmony_ci						val);
263162306a36Sopenharmony_ci		break;
263262306a36Sopenharmony_ci	case WCD9335_ANA_AMIC5:
263362306a36Sopenharmony_ci	case WCD9335_ANA_AMIC6:
263462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC6, mask,
263562306a36Sopenharmony_ci						val);
263662306a36Sopenharmony_ci		break;
263762306a36Sopenharmony_ci	default:
263862306a36Sopenharmony_ci		dev_err(comp->dev, "%s: invalid amic: %d\n",
263962306a36Sopenharmony_ci			__func__, amic_reg);
264062306a36Sopenharmony_ci		break;
264162306a36Sopenharmony_ci	}
264262306a36Sopenharmony_ci}
264362306a36Sopenharmony_ci
264462306a36Sopenharmony_cistatic int wcd9335_codec_enable_adc(struct snd_soc_dapm_widget *w,
264562306a36Sopenharmony_ci		struct snd_kcontrol *kc, int event)
264662306a36Sopenharmony_ci{
264762306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
264862306a36Sopenharmony_ci
264962306a36Sopenharmony_ci	switch (event) {
265062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
265162306a36Sopenharmony_ci		wcd9335_codec_set_tx_hold(comp, w->reg, true);
265262306a36Sopenharmony_ci		break;
265362306a36Sopenharmony_ci	default:
265462306a36Sopenharmony_ci		break;
265562306a36Sopenharmony_ci	}
265662306a36Sopenharmony_ci
265762306a36Sopenharmony_ci	return 0;
265862306a36Sopenharmony_ci}
265962306a36Sopenharmony_ci
266062306a36Sopenharmony_cistatic int wcd9335_codec_find_amic_input(struct snd_soc_component *comp,
266162306a36Sopenharmony_ci					 int adc_mux_n)
266262306a36Sopenharmony_ci{
266362306a36Sopenharmony_ci	int mux_sel, reg, mreg;
266462306a36Sopenharmony_ci
266562306a36Sopenharmony_ci	if (adc_mux_n < 0 || adc_mux_n > WCD9335_MAX_VALID_ADC_MUX ||
266662306a36Sopenharmony_ci	    adc_mux_n == WCD9335_INVALID_ADC_MUX)
266762306a36Sopenharmony_ci		return 0;
266862306a36Sopenharmony_ci
266962306a36Sopenharmony_ci	/* Check whether adc mux input is AMIC or DMIC */
267062306a36Sopenharmony_ci	if (adc_mux_n < 4) {
267162306a36Sopenharmony_ci		reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + 2 * adc_mux_n;
267262306a36Sopenharmony_ci		mreg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + 2 * adc_mux_n;
267362306a36Sopenharmony_ci		mux_sel = snd_soc_component_read(comp, reg) & 0x3;
267462306a36Sopenharmony_ci	} else {
267562306a36Sopenharmony_ci		reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + adc_mux_n - 4;
267662306a36Sopenharmony_ci		mreg = reg;
267762306a36Sopenharmony_ci		mux_sel = snd_soc_component_read(comp, reg) >> 6;
267862306a36Sopenharmony_ci	}
267962306a36Sopenharmony_ci
268062306a36Sopenharmony_ci	if (mux_sel != WCD9335_CDC_TX_INP_MUX_SEL_AMIC)
268162306a36Sopenharmony_ci		return 0;
268262306a36Sopenharmony_ci
268362306a36Sopenharmony_ci	return snd_soc_component_read(comp, mreg) & 0x07;
268462306a36Sopenharmony_ci}
268562306a36Sopenharmony_ci
268662306a36Sopenharmony_cistatic u16 wcd9335_codec_get_amic_pwlvl_reg(struct snd_soc_component *comp,
268762306a36Sopenharmony_ci					    int amic)
268862306a36Sopenharmony_ci{
268962306a36Sopenharmony_ci	u16 pwr_level_reg = 0;
269062306a36Sopenharmony_ci
269162306a36Sopenharmony_ci	switch (amic) {
269262306a36Sopenharmony_ci	case 1:
269362306a36Sopenharmony_ci	case 2:
269462306a36Sopenharmony_ci		pwr_level_reg = WCD9335_ANA_AMIC1;
269562306a36Sopenharmony_ci		break;
269662306a36Sopenharmony_ci
269762306a36Sopenharmony_ci	case 3:
269862306a36Sopenharmony_ci	case 4:
269962306a36Sopenharmony_ci		pwr_level_reg = WCD9335_ANA_AMIC3;
270062306a36Sopenharmony_ci		break;
270162306a36Sopenharmony_ci
270262306a36Sopenharmony_ci	case 5:
270362306a36Sopenharmony_ci	case 6:
270462306a36Sopenharmony_ci		pwr_level_reg = WCD9335_ANA_AMIC5;
270562306a36Sopenharmony_ci		break;
270662306a36Sopenharmony_ci	default:
270762306a36Sopenharmony_ci		dev_err(comp->dev, "invalid amic: %d\n", amic);
270862306a36Sopenharmony_ci		break;
270962306a36Sopenharmony_ci	}
271062306a36Sopenharmony_ci
271162306a36Sopenharmony_ci	return pwr_level_reg;
271262306a36Sopenharmony_ci}
271362306a36Sopenharmony_ci
271462306a36Sopenharmony_cistatic int wcd9335_codec_enable_dec(struct snd_soc_dapm_widget *w,
271562306a36Sopenharmony_ci	struct snd_kcontrol *kc, int event)
271662306a36Sopenharmony_ci{
271762306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
271862306a36Sopenharmony_ci	unsigned int decimator;
271962306a36Sopenharmony_ci	char *dec_adc_mux_name = NULL;
272062306a36Sopenharmony_ci	char *widget_name = NULL;
272162306a36Sopenharmony_ci	char *wname;
272262306a36Sopenharmony_ci	int ret = 0, amic_n;
272362306a36Sopenharmony_ci	u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg;
272462306a36Sopenharmony_ci	u16 tx_gain_ctl_reg;
272562306a36Sopenharmony_ci	char *dec;
272662306a36Sopenharmony_ci	u8 hpf_coff_freq;
272762306a36Sopenharmony_ci
272862306a36Sopenharmony_ci	widget_name = kmemdup_nul(w->name, 15, GFP_KERNEL);
272962306a36Sopenharmony_ci	if (!widget_name)
273062306a36Sopenharmony_ci		return -ENOMEM;
273162306a36Sopenharmony_ci
273262306a36Sopenharmony_ci	wname = widget_name;
273362306a36Sopenharmony_ci	dec_adc_mux_name = strsep(&widget_name, " ");
273462306a36Sopenharmony_ci	if (!dec_adc_mux_name) {
273562306a36Sopenharmony_ci		dev_err(comp->dev, "%s: Invalid decimator = %s\n",
273662306a36Sopenharmony_ci			__func__, w->name);
273762306a36Sopenharmony_ci		ret =  -EINVAL;
273862306a36Sopenharmony_ci		goto out;
273962306a36Sopenharmony_ci	}
274062306a36Sopenharmony_ci	dec_adc_mux_name = widget_name;
274162306a36Sopenharmony_ci
274262306a36Sopenharmony_ci	dec = strpbrk(dec_adc_mux_name, "012345678");
274362306a36Sopenharmony_ci	if (!dec) {
274462306a36Sopenharmony_ci		dev_err(comp->dev, "%s: decimator index not found\n",
274562306a36Sopenharmony_ci			__func__);
274662306a36Sopenharmony_ci		ret =  -EINVAL;
274762306a36Sopenharmony_ci		goto out;
274862306a36Sopenharmony_ci	}
274962306a36Sopenharmony_ci
275062306a36Sopenharmony_ci	ret = kstrtouint(dec, 10, &decimator);
275162306a36Sopenharmony_ci	if (ret < 0) {
275262306a36Sopenharmony_ci		dev_err(comp->dev, "%s: Invalid decimator = %s\n",
275362306a36Sopenharmony_ci			__func__, wname);
275462306a36Sopenharmony_ci		ret =  -EINVAL;
275562306a36Sopenharmony_ci		goto out;
275662306a36Sopenharmony_ci	}
275762306a36Sopenharmony_ci
275862306a36Sopenharmony_ci	tx_vol_ctl_reg = WCD9335_CDC_TX0_TX_PATH_CTL + 16 * decimator;
275962306a36Sopenharmony_ci	hpf_gate_reg = WCD9335_CDC_TX0_TX_PATH_SEC2 + 16 * decimator;
276062306a36Sopenharmony_ci	dec_cfg_reg = WCD9335_CDC_TX0_TX_PATH_CFG0 + 16 * decimator;
276162306a36Sopenharmony_ci	tx_gain_ctl_reg = WCD9335_CDC_TX0_TX_VOL_CTL + 16 * decimator;
276262306a36Sopenharmony_ci
276362306a36Sopenharmony_ci	switch (event) {
276462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
276562306a36Sopenharmony_ci		amic_n = wcd9335_codec_find_amic_input(comp, decimator);
276662306a36Sopenharmony_ci		if (amic_n)
276762306a36Sopenharmony_ci			pwr_level_reg = wcd9335_codec_get_amic_pwlvl_reg(comp,
276862306a36Sopenharmony_ci								       amic_n);
276962306a36Sopenharmony_ci
277062306a36Sopenharmony_ci		if (pwr_level_reg) {
277162306a36Sopenharmony_ci			switch ((snd_soc_component_read(comp, pwr_level_reg) &
277262306a36Sopenharmony_ci					      WCD9335_AMIC_PWR_LVL_MASK) >>
277362306a36Sopenharmony_ci					      WCD9335_AMIC_PWR_LVL_SHIFT) {
277462306a36Sopenharmony_ci			case WCD9335_AMIC_PWR_LEVEL_LP:
277562306a36Sopenharmony_ci				snd_soc_component_update_bits(comp, dec_cfg_reg,
277662306a36Sopenharmony_ci						    WCD9335_DEC_PWR_LVL_MASK,
277762306a36Sopenharmony_ci						    WCD9335_DEC_PWR_LVL_LP);
277862306a36Sopenharmony_ci				break;
277962306a36Sopenharmony_ci
278062306a36Sopenharmony_ci			case WCD9335_AMIC_PWR_LEVEL_HP:
278162306a36Sopenharmony_ci				snd_soc_component_update_bits(comp, dec_cfg_reg,
278262306a36Sopenharmony_ci						    WCD9335_DEC_PWR_LVL_MASK,
278362306a36Sopenharmony_ci						    WCD9335_DEC_PWR_LVL_HP);
278462306a36Sopenharmony_ci				break;
278562306a36Sopenharmony_ci			case WCD9335_AMIC_PWR_LEVEL_DEFAULT:
278662306a36Sopenharmony_ci			default:
278762306a36Sopenharmony_ci				snd_soc_component_update_bits(comp, dec_cfg_reg,
278862306a36Sopenharmony_ci						    WCD9335_DEC_PWR_LVL_MASK,
278962306a36Sopenharmony_ci						    WCD9335_DEC_PWR_LVL_DF);
279062306a36Sopenharmony_ci				break;
279162306a36Sopenharmony_ci			}
279262306a36Sopenharmony_ci		}
279362306a36Sopenharmony_ci		hpf_coff_freq = (snd_soc_component_read(comp, dec_cfg_reg) &
279462306a36Sopenharmony_ci				   TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_ci		if (hpf_coff_freq != CF_MIN_3DB_150HZ)
279762306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, dec_cfg_reg,
279862306a36Sopenharmony_ci					    TX_HPF_CUT_OFF_FREQ_MASK,
279962306a36Sopenharmony_ci					    CF_MIN_3DB_150HZ << 5);
280062306a36Sopenharmony_ci		/* Enable TX PGA Mute */
280162306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
280262306a36Sopenharmony_ci						0x10, 0x10);
280362306a36Sopenharmony_ci		/* Enable APC */
280462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, dec_cfg_reg, 0x08, 0x08);
280562306a36Sopenharmony_ci		break;
280662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
280762306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, hpf_gate_reg, 0x01, 0x00);
280862306a36Sopenharmony_ci
280962306a36Sopenharmony_ci		if (decimator == 0) {
281062306a36Sopenharmony_ci			snd_soc_component_write(comp,
281162306a36Sopenharmony_ci					WCD9335_MBHC_ZDET_RAMP_CTL, 0x83);
281262306a36Sopenharmony_ci			snd_soc_component_write(comp,
281362306a36Sopenharmony_ci					WCD9335_MBHC_ZDET_RAMP_CTL, 0xA3);
281462306a36Sopenharmony_ci			snd_soc_component_write(comp,
281562306a36Sopenharmony_ci					WCD9335_MBHC_ZDET_RAMP_CTL, 0x83);
281662306a36Sopenharmony_ci			snd_soc_component_write(comp,
281762306a36Sopenharmony_ci					WCD9335_MBHC_ZDET_RAMP_CTL, 0x03);
281862306a36Sopenharmony_ci		}
281962306a36Sopenharmony_ci
282062306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, hpf_gate_reg,
282162306a36Sopenharmony_ci						0x01, 0x01);
282262306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
282362306a36Sopenharmony_ci						0x10, 0x00);
282462306a36Sopenharmony_ci		snd_soc_component_write(comp, tx_gain_ctl_reg,
282562306a36Sopenharmony_ci			      snd_soc_component_read(comp, tx_gain_ctl_reg));
282662306a36Sopenharmony_ci		break;
282762306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
282862306a36Sopenharmony_ci		hpf_coff_freq = (snd_soc_component_read(comp, dec_cfg_reg) &
282962306a36Sopenharmony_ci				   TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
283062306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 0x10, 0x10);
283162306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, dec_cfg_reg, 0x08, 0x00);
283262306a36Sopenharmony_ci		if (hpf_coff_freq != CF_MIN_3DB_150HZ) {
283362306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, dec_cfg_reg,
283462306a36Sopenharmony_ci						      TX_HPF_CUT_OFF_FREQ_MASK,
283562306a36Sopenharmony_ci						      hpf_coff_freq << 5);
283662306a36Sopenharmony_ci		}
283762306a36Sopenharmony_ci		break;
283862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
283962306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 0x10, 0x00);
284062306a36Sopenharmony_ci		break;
284162306a36Sopenharmony_ci	}
284262306a36Sopenharmony_ciout:
284362306a36Sopenharmony_ci	kfree(wname);
284462306a36Sopenharmony_ci	return ret;
284562306a36Sopenharmony_ci}
284662306a36Sopenharmony_ci
284762306a36Sopenharmony_cistatic u8 wcd9335_get_dmic_clk_val(struct snd_soc_component *component,
284862306a36Sopenharmony_ci				 u32 mclk_rate, u32 dmic_clk_rate)
284962306a36Sopenharmony_ci{
285062306a36Sopenharmony_ci	u32 div_factor;
285162306a36Sopenharmony_ci	u8 dmic_ctl_val;
285262306a36Sopenharmony_ci
285362306a36Sopenharmony_ci	dev_err(component->dev,
285462306a36Sopenharmony_ci		"%s: mclk_rate = %d, dmic_sample_rate = %d\n",
285562306a36Sopenharmony_ci		__func__, mclk_rate, dmic_clk_rate);
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_ci	/* Default value to return in case of error */
285862306a36Sopenharmony_ci	if (mclk_rate == WCD9335_MCLK_CLK_9P6MHZ)
285962306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2;
286062306a36Sopenharmony_ci	else
286162306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3;
286262306a36Sopenharmony_ci
286362306a36Sopenharmony_ci	if (dmic_clk_rate == 0) {
286462306a36Sopenharmony_ci		dev_err(component->dev,
286562306a36Sopenharmony_ci			"%s: dmic_sample_rate cannot be 0\n",
286662306a36Sopenharmony_ci			__func__);
286762306a36Sopenharmony_ci		goto done;
286862306a36Sopenharmony_ci	}
286962306a36Sopenharmony_ci
287062306a36Sopenharmony_ci	div_factor = mclk_rate / dmic_clk_rate;
287162306a36Sopenharmony_ci	switch (div_factor) {
287262306a36Sopenharmony_ci	case 2:
287362306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2;
287462306a36Sopenharmony_ci		break;
287562306a36Sopenharmony_ci	case 3:
287662306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3;
287762306a36Sopenharmony_ci		break;
287862306a36Sopenharmony_ci	case 4:
287962306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_4;
288062306a36Sopenharmony_ci		break;
288162306a36Sopenharmony_ci	case 6:
288262306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_6;
288362306a36Sopenharmony_ci		break;
288462306a36Sopenharmony_ci	case 8:
288562306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_8;
288662306a36Sopenharmony_ci		break;
288762306a36Sopenharmony_ci	case 16:
288862306a36Sopenharmony_ci		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_16;
288962306a36Sopenharmony_ci		break;
289062306a36Sopenharmony_ci	default:
289162306a36Sopenharmony_ci		dev_err(component->dev,
289262306a36Sopenharmony_ci			"%s: Invalid div_factor %u, clk_rate(%u), dmic_rate(%u)\n",
289362306a36Sopenharmony_ci			__func__, div_factor, mclk_rate, dmic_clk_rate);
289462306a36Sopenharmony_ci		break;
289562306a36Sopenharmony_ci	}
289662306a36Sopenharmony_ci
289762306a36Sopenharmony_cidone:
289862306a36Sopenharmony_ci	return dmic_ctl_val;
289962306a36Sopenharmony_ci}
290062306a36Sopenharmony_ci
290162306a36Sopenharmony_cistatic int wcd9335_codec_enable_dmic(struct snd_soc_dapm_widget *w,
290262306a36Sopenharmony_ci		struct snd_kcontrol *kc, int event)
290362306a36Sopenharmony_ci{
290462306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
290562306a36Sopenharmony_ci	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
290662306a36Sopenharmony_ci	u8  dmic_clk_en = 0x01;
290762306a36Sopenharmony_ci	u16 dmic_clk_reg;
290862306a36Sopenharmony_ci	s32 *dmic_clk_cnt;
290962306a36Sopenharmony_ci	u8 dmic_rate_val, dmic_rate_shift = 1;
291062306a36Sopenharmony_ci	unsigned int dmic;
291162306a36Sopenharmony_ci	int ret;
291262306a36Sopenharmony_ci	char *wname;
291362306a36Sopenharmony_ci
291462306a36Sopenharmony_ci	wname = strpbrk(w->name, "012345");
291562306a36Sopenharmony_ci	if (!wname) {
291662306a36Sopenharmony_ci		dev_err(comp->dev, "%s: widget not found\n", __func__);
291762306a36Sopenharmony_ci		return -EINVAL;
291862306a36Sopenharmony_ci	}
291962306a36Sopenharmony_ci
292062306a36Sopenharmony_ci	ret = kstrtouint(wname, 10, &dmic);
292162306a36Sopenharmony_ci	if (ret < 0) {
292262306a36Sopenharmony_ci		dev_err(comp->dev, "%s: Invalid DMIC line on the codec\n",
292362306a36Sopenharmony_ci			__func__);
292462306a36Sopenharmony_ci		return -EINVAL;
292562306a36Sopenharmony_ci	}
292662306a36Sopenharmony_ci
292762306a36Sopenharmony_ci	switch (dmic) {
292862306a36Sopenharmony_ci	case 0:
292962306a36Sopenharmony_ci	case 1:
293062306a36Sopenharmony_ci		dmic_clk_cnt = &(wcd->dmic_0_1_clk_cnt);
293162306a36Sopenharmony_ci		dmic_clk_reg = WCD9335_CPE_SS_DMIC0_CTL;
293262306a36Sopenharmony_ci		break;
293362306a36Sopenharmony_ci	case 2:
293462306a36Sopenharmony_ci	case 3:
293562306a36Sopenharmony_ci		dmic_clk_cnt = &(wcd->dmic_2_3_clk_cnt);
293662306a36Sopenharmony_ci		dmic_clk_reg = WCD9335_CPE_SS_DMIC1_CTL;
293762306a36Sopenharmony_ci		break;
293862306a36Sopenharmony_ci	case 4:
293962306a36Sopenharmony_ci	case 5:
294062306a36Sopenharmony_ci		dmic_clk_cnt = &(wcd->dmic_4_5_clk_cnt);
294162306a36Sopenharmony_ci		dmic_clk_reg = WCD9335_CPE_SS_DMIC2_CTL;
294262306a36Sopenharmony_ci		break;
294362306a36Sopenharmony_ci	default:
294462306a36Sopenharmony_ci		dev_err(comp->dev, "%s: Invalid DMIC Selection\n",
294562306a36Sopenharmony_ci			__func__);
294662306a36Sopenharmony_ci		return -EINVAL;
294762306a36Sopenharmony_ci	}
294862306a36Sopenharmony_ci
294962306a36Sopenharmony_ci	switch (event) {
295062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
295162306a36Sopenharmony_ci		dmic_rate_val =
295262306a36Sopenharmony_ci			wcd9335_get_dmic_clk_val(comp,
295362306a36Sopenharmony_ci					wcd->mclk_rate,
295462306a36Sopenharmony_ci					wcd->dmic_sample_rate);
295562306a36Sopenharmony_ci
295662306a36Sopenharmony_ci		(*dmic_clk_cnt)++;
295762306a36Sopenharmony_ci		if (*dmic_clk_cnt == 1) {
295862306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, dmic_clk_reg,
295962306a36Sopenharmony_ci				0x07 << dmic_rate_shift,
296062306a36Sopenharmony_ci				dmic_rate_val << dmic_rate_shift);
296162306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, dmic_clk_reg,
296262306a36Sopenharmony_ci					dmic_clk_en, dmic_clk_en);
296362306a36Sopenharmony_ci		}
296462306a36Sopenharmony_ci
296562306a36Sopenharmony_ci		break;
296662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
296762306a36Sopenharmony_ci		dmic_rate_val =
296862306a36Sopenharmony_ci			wcd9335_get_dmic_clk_val(comp,
296962306a36Sopenharmony_ci					wcd->mclk_rate,
297062306a36Sopenharmony_ci					wcd->mad_dmic_sample_rate);
297162306a36Sopenharmony_ci		(*dmic_clk_cnt)--;
297262306a36Sopenharmony_ci		if (*dmic_clk_cnt  == 0) {
297362306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, dmic_clk_reg,
297462306a36Sopenharmony_ci					dmic_clk_en, 0);
297562306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, dmic_clk_reg,
297662306a36Sopenharmony_ci				0x07 << dmic_rate_shift,
297762306a36Sopenharmony_ci				dmic_rate_val << dmic_rate_shift);
297862306a36Sopenharmony_ci		}
297962306a36Sopenharmony_ci		break;
298062306a36Sopenharmony_ci	}
298162306a36Sopenharmony_ci
298262306a36Sopenharmony_ci	return 0;
298362306a36Sopenharmony_ci}
298462306a36Sopenharmony_ci
298562306a36Sopenharmony_cistatic void wcd9335_codec_enable_int_port(struct wcd_slim_codec_dai_data *dai,
298662306a36Sopenharmony_ci					struct snd_soc_component *component)
298762306a36Sopenharmony_ci{
298862306a36Sopenharmony_ci	int port_num = 0;
298962306a36Sopenharmony_ci	unsigned short reg = 0;
299062306a36Sopenharmony_ci	unsigned int val = 0;
299162306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
299262306a36Sopenharmony_ci	struct wcd9335_slim_ch *ch;
299362306a36Sopenharmony_ci
299462306a36Sopenharmony_ci	list_for_each_entry(ch, &dai->slim_ch_list, list) {
299562306a36Sopenharmony_ci		if (ch->port >= WCD9335_RX_START) {
299662306a36Sopenharmony_ci			port_num = ch->port - WCD9335_RX_START;
299762306a36Sopenharmony_ci			reg = WCD9335_SLIM_PGD_PORT_INT_EN0 + (port_num / 8);
299862306a36Sopenharmony_ci		} else {
299962306a36Sopenharmony_ci			port_num = ch->port;
300062306a36Sopenharmony_ci			reg = WCD9335_SLIM_PGD_PORT_INT_TX_EN0 + (port_num / 8);
300162306a36Sopenharmony_ci		}
300262306a36Sopenharmony_ci
300362306a36Sopenharmony_ci		regmap_read(wcd->if_regmap, reg, &val);
300462306a36Sopenharmony_ci		if (!(val & BIT(port_num % 8)))
300562306a36Sopenharmony_ci			regmap_write(wcd->if_regmap, reg,
300662306a36Sopenharmony_ci					val | BIT(port_num % 8));
300762306a36Sopenharmony_ci	}
300862306a36Sopenharmony_ci}
300962306a36Sopenharmony_ci
301062306a36Sopenharmony_cistatic int wcd9335_codec_enable_slim(struct snd_soc_dapm_widget *w,
301162306a36Sopenharmony_ci				       struct snd_kcontrol *kc,
301262306a36Sopenharmony_ci				       int event)
301362306a36Sopenharmony_ci{
301462306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
301562306a36Sopenharmony_ci	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
301662306a36Sopenharmony_ci	struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift];
301762306a36Sopenharmony_ci
301862306a36Sopenharmony_ci	switch (event) {
301962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
302062306a36Sopenharmony_ci		wcd9335_codec_enable_int_port(dai, comp);
302162306a36Sopenharmony_ci		break;
302262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
302362306a36Sopenharmony_ci		kfree(dai->sconfig.chs);
302462306a36Sopenharmony_ci
302562306a36Sopenharmony_ci		break;
302662306a36Sopenharmony_ci	}
302762306a36Sopenharmony_ci
302862306a36Sopenharmony_ci	return 0;
302962306a36Sopenharmony_ci}
303062306a36Sopenharmony_ci
303162306a36Sopenharmony_cistatic int wcd9335_codec_enable_mix_path(struct snd_soc_dapm_widget *w,
303262306a36Sopenharmony_ci		struct snd_kcontrol *kc, int event)
303362306a36Sopenharmony_ci{
303462306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
303562306a36Sopenharmony_ci	u16 gain_reg;
303662306a36Sopenharmony_ci	int offset_val = 0;
303762306a36Sopenharmony_ci	int val = 0;
303862306a36Sopenharmony_ci
303962306a36Sopenharmony_ci	switch (w->reg) {
304062306a36Sopenharmony_ci	case WCD9335_CDC_RX0_RX_PATH_MIX_CTL:
304162306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX0_RX_VOL_MIX_CTL;
304262306a36Sopenharmony_ci		break;
304362306a36Sopenharmony_ci	case WCD9335_CDC_RX1_RX_PATH_MIX_CTL:
304462306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX1_RX_VOL_MIX_CTL;
304562306a36Sopenharmony_ci		break;
304662306a36Sopenharmony_ci	case WCD9335_CDC_RX2_RX_PATH_MIX_CTL:
304762306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX2_RX_VOL_MIX_CTL;
304862306a36Sopenharmony_ci		break;
304962306a36Sopenharmony_ci	case WCD9335_CDC_RX3_RX_PATH_MIX_CTL:
305062306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX3_RX_VOL_MIX_CTL;
305162306a36Sopenharmony_ci		break;
305262306a36Sopenharmony_ci	case WCD9335_CDC_RX4_RX_PATH_MIX_CTL:
305362306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX4_RX_VOL_MIX_CTL;
305462306a36Sopenharmony_ci		break;
305562306a36Sopenharmony_ci	case WCD9335_CDC_RX5_RX_PATH_MIX_CTL:
305662306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX5_RX_VOL_MIX_CTL;
305762306a36Sopenharmony_ci		break;
305862306a36Sopenharmony_ci	case WCD9335_CDC_RX6_RX_PATH_MIX_CTL:
305962306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX6_RX_VOL_MIX_CTL;
306062306a36Sopenharmony_ci		break;
306162306a36Sopenharmony_ci	case WCD9335_CDC_RX7_RX_PATH_MIX_CTL:
306262306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX7_RX_VOL_MIX_CTL;
306362306a36Sopenharmony_ci		break;
306462306a36Sopenharmony_ci	case WCD9335_CDC_RX8_RX_PATH_MIX_CTL:
306562306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX8_RX_VOL_MIX_CTL;
306662306a36Sopenharmony_ci		break;
306762306a36Sopenharmony_ci	default:
306862306a36Sopenharmony_ci		dev_err(comp->dev, "%s: No gain register avail for %s\n",
306962306a36Sopenharmony_ci			__func__, w->name);
307062306a36Sopenharmony_ci		return 0;
307162306a36Sopenharmony_ci	}
307262306a36Sopenharmony_ci
307362306a36Sopenharmony_ci	switch (event) {
307462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
307562306a36Sopenharmony_ci		val = snd_soc_component_read(comp, gain_reg);
307662306a36Sopenharmony_ci		val += offset_val;
307762306a36Sopenharmony_ci		snd_soc_component_write(comp, gain_reg, val);
307862306a36Sopenharmony_ci		break;
307962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
308062306a36Sopenharmony_ci		break;
308162306a36Sopenharmony_ci	}
308262306a36Sopenharmony_ci
308362306a36Sopenharmony_ci	return 0;
308462306a36Sopenharmony_ci}
308562306a36Sopenharmony_ci
308662306a36Sopenharmony_cistatic u16 wcd9335_interp_get_primary_reg(u16 reg, u16 *ind)
308762306a36Sopenharmony_ci{
308862306a36Sopenharmony_ci	u16 prim_int_reg = WCD9335_CDC_RX0_RX_PATH_CTL;
308962306a36Sopenharmony_ci
309062306a36Sopenharmony_ci	switch (reg) {
309162306a36Sopenharmony_ci	case WCD9335_CDC_RX0_RX_PATH_CTL:
309262306a36Sopenharmony_ci	case WCD9335_CDC_RX0_RX_PATH_MIX_CTL:
309362306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX0_RX_PATH_CTL;
309462306a36Sopenharmony_ci		*ind = 0;
309562306a36Sopenharmony_ci		break;
309662306a36Sopenharmony_ci	case WCD9335_CDC_RX1_RX_PATH_CTL:
309762306a36Sopenharmony_ci	case WCD9335_CDC_RX1_RX_PATH_MIX_CTL:
309862306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX1_RX_PATH_CTL;
309962306a36Sopenharmony_ci		*ind = 1;
310062306a36Sopenharmony_ci		break;
310162306a36Sopenharmony_ci	case WCD9335_CDC_RX2_RX_PATH_CTL:
310262306a36Sopenharmony_ci	case WCD9335_CDC_RX2_RX_PATH_MIX_CTL:
310362306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX2_RX_PATH_CTL;
310462306a36Sopenharmony_ci		*ind = 2;
310562306a36Sopenharmony_ci		break;
310662306a36Sopenharmony_ci	case WCD9335_CDC_RX3_RX_PATH_CTL:
310762306a36Sopenharmony_ci	case WCD9335_CDC_RX3_RX_PATH_MIX_CTL:
310862306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX3_RX_PATH_CTL;
310962306a36Sopenharmony_ci		*ind = 3;
311062306a36Sopenharmony_ci		break;
311162306a36Sopenharmony_ci	case WCD9335_CDC_RX4_RX_PATH_CTL:
311262306a36Sopenharmony_ci	case WCD9335_CDC_RX4_RX_PATH_MIX_CTL:
311362306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX4_RX_PATH_CTL;
311462306a36Sopenharmony_ci		*ind = 4;
311562306a36Sopenharmony_ci		break;
311662306a36Sopenharmony_ci	case WCD9335_CDC_RX5_RX_PATH_CTL:
311762306a36Sopenharmony_ci	case WCD9335_CDC_RX5_RX_PATH_MIX_CTL:
311862306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX5_RX_PATH_CTL;
311962306a36Sopenharmony_ci		*ind = 5;
312062306a36Sopenharmony_ci		break;
312162306a36Sopenharmony_ci	case WCD9335_CDC_RX6_RX_PATH_CTL:
312262306a36Sopenharmony_ci	case WCD9335_CDC_RX6_RX_PATH_MIX_CTL:
312362306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX6_RX_PATH_CTL;
312462306a36Sopenharmony_ci		*ind = 6;
312562306a36Sopenharmony_ci		break;
312662306a36Sopenharmony_ci	case WCD9335_CDC_RX7_RX_PATH_CTL:
312762306a36Sopenharmony_ci	case WCD9335_CDC_RX7_RX_PATH_MIX_CTL:
312862306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX7_RX_PATH_CTL;
312962306a36Sopenharmony_ci		*ind = 7;
313062306a36Sopenharmony_ci		break;
313162306a36Sopenharmony_ci	case WCD9335_CDC_RX8_RX_PATH_CTL:
313262306a36Sopenharmony_ci	case WCD9335_CDC_RX8_RX_PATH_MIX_CTL:
313362306a36Sopenharmony_ci		prim_int_reg = WCD9335_CDC_RX8_RX_PATH_CTL;
313462306a36Sopenharmony_ci		*ind = 8;
313562306a36Sopenharmony_ci		break;
313662306a36Sopenharmony_ci	}
313762306a36Sopenharmony_ci
313862306a36Sopenharmony_ci	return prim_int_reg;
313962306a36Sopenharmony_ci}
314062306a36Sopenharmony_ci
314162306a36Sopenharmony_cistatic void wcd9335_codec_hd2_control(struct snd_soc_component *component,
314262306a36Sopenharmony_ci				    u16 prim_int_reg, int event)
314362306a36Sopenharmony_ci{
314462306a36Sopenharmony_ci	u16 hd2_scale_reg;
314562306a36Sopenharmony_ci	u16 hd2_enable_reg = 0;
314662306a36Sopenharmony_ci
314762306a36Sopenharmony_ci	if (prim_int_reg == WCD9335_CDC_RX1_RX_PATH_CTL) {
314862306a36Sopenharmony_ci		hd2_scale_reg = WCD9335_CDC_RX1_RX_PATH_SEC3;
314962306a36Sopenharmony_ci		hd2_enable_reg = WCD9335_CDC_RX1_RX_PATH_CFG0;
315062306a36Sopenharmony_ci	}
315162306a36Sopenharmony_ci	if (prim_int_reg == WCD9335_CDC_RX2_RX_PATH_CTL) {
315262306a36Sopenharmony_ci		hd2_scale_reg = WCD9335_CDC_RX2_RX_PATH_SEC3;
315362306a36Sopenharmony_ci		hd2_enable_reg = WCD9335_CDC_RX2_RX_PATH_CFG0;
315462306a36Sopenharmony_ci	}
315562306a36Sopenharmony_ci
315662306a36Sopenharmony_ci	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
315762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
315862306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_MASK,
315962306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_0P2500);
316062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
316162306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_MASK,
316262306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_2);
316362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_enable_reg,
316462306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_CFG_HD2_EN_MASK,
316562306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_CFG_HD2_ENABLE);
316662306a36Sopenharmony_ci	}
316762306a36Sopenharmony_ci
316862306a36Sopenharmony_ci	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
316962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_enable_reg,
317062306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_CFG_HD2_EN_MASK,
317162306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_CFG_HD2_DISABLE);
317262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
317362306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_MASK,
317462306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_1);
317562306a36Sopenharmony_ci		snd_soc_component_update_bits(component, hd2_scale_reg,
317662306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_MASK,
317762306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_0P0000);
317862306a36Sopenharmony_ci	}
317962306a36Sopenharmony_ci}
318062306a36Sopenharmony_ci
318162306a36Sopenharmony_cistatic int wcd9335_codec_enable_prim_interpolator(
318262306a36Sopenharmony_ci						struct snd_soc_component *comp,
318362306a36Sopenharmony_ci						u16 reg, int event)
318462306a36Sopenharmony_ci{
318562306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
318662306a36Sopenharmony_ci	u16 ind = 0;
318762306a36Sopenharmony_ci	int prim_int_reg = wcd9335_interp_get_primary_reg(reg, &ind);
318862306a36Sopenharmony_ci
318962306a36Sopenharmony_ci	switch (event) {
319062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
319162306a36Sopenharmony_ci		wcd->prim_int_users[ind]++;
319262306a36Sopenharmony_ci		if (wcd->prim_int_users[ind] == 1) {
319362306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, prim_int_reg,
319462306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
319562306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_ENABLE);
319662306a36Sopenharmony_ci			wcd9335_codec_hd2_control(comp, prim_int_reg, event);
319762306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, prim_int_reg,
319862306a36Sopenharmony_ci					WCD9335_CDC_RX_CLK_EN_MASK,
319962306a36Sopenharmony_ci					WCD9335_CDC_RX_CLK_ENABLE);
320062306a36Sopenharmony_ci		}
320162306a36Sopenharmony_ci
320262306a36Sopenharmony_ci		if ((reg != prim_int_reg) &&
320362306a36Sopenharmony_ci			((snd_soc_component_read(comp, prim_int_reg)) &
320462306a36Sopenharmony_ci			 WCD9335_CDC_RX_PGA_MUTE_EN_MASK))
320562306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, reg,
320662306a36Sopenharmony_ci						WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
320762306a36Sopenharmony_ci						WCD9335_CDC_RX_PGA_MUTE_ENABLE);
320862306a36Sopenharmony_ci		break;
320962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
321062306a36Sopenharmony_ci		wcd->prim_int_users[ind]--;
321162306a36Sopenharmony_ci		if (wcd->prim_int_users[ind] == 0) {
321262306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, prim_int_reg,
321362306a36Sopenharmony_ci					WCD9335_CDC_RX_CLK_EN_MASK,
321462306a36Sopenharmony_ci					WCD9335_CDC_RX_CLK_DISABLE);
321562306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, prim_int_reg,
321662306a36Sopenharmony_ci					WCD9335_CDC_RX_RESET_MASK,
321762306a36Sopenharmony_ci					WCD9335_CDC_RX_RESET_ENABLE);
321862306a36Sopenharmony_ci			snd_soc_component_update_bits(comp, prim_int_reg,
321962306a36Sopenharmony_ci					WCD9335_CDC_RX_RESET_MASK,
322062306a36Sopenharmony_ci					WCD9335_CDC_RX_RESET_DISABLE);
322162306a36Sopenharmony_ci			wcd9335_codec_hd2_control(comp, prim_int_reg, event);
322262306a36Sopenharmony_ci		}
322362306a36Sopenharmony_ci		break;
322462306a36Sopenharmony_ci	}
322562306a36Sopenharmony_ci
322662306a36Sopenharmony_ci	return 0;
322762306a36Sopenharmony_ci}
322862306a36Sopenharmony_ci
322962306a36Sopenharmony_cistatic int wcd9335_config_compander(struct snd_soc_component *component,
323062306a36Sopenharmony_ci				    int interp_n, int event)
323162306a36Sopenharmony_ci{
323262306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
323362306a36Sopenharmony_ci	int comp;
323462306a36Sopenharmony_ci	u16 comp_ctl0_reg, rx_path_cfg0_reg;
323562306a36Sopenharmony_ci
323662306a36Sopenharmony_ci	/* EAR does not have compander */
323762306a36Sopenharmony_ci	if (!interp_n)
323862306a36Sopenharmony_ci		return 0;
323962306a36Sopenharmony_ci
324062306a36Sopenharmony_ci	comp = interp_n - 1;
324162306a36Sopenharmony_ci	if (!wcd->comp_enabled[comp])
324262306a36Sopenharmony_ci		return 0;
324362306a36Sopenharmony_ci
324462306a36Sopenharmony_ci	comp_ctl0_reg = WCD9335_CDC_COMPANDER1_CTL(comp);
324562306a36Sopenharmony_ci	rx_path_cfg0_reg = WCD9335_CDC_RX1_RX_PATH_CFG(comp);
324662306a36Sopenharmony_ci
324762306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
324862306a36Sopenharmony_ci		/* Enable Compander Clock */
324962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
325062306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_CLK_EN_MASK,
325162306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_CLK_ENABLE);
325262306a36Sopenharmony_ci		/* Reset comander */
325362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
325462306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
325562306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_SOFT_RST_ENABLE);
325662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
325762306a36Sopenharmony_ci				WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
325862306a36Sopenharmony_ci				WCD9335_CDC_COMPANDER_SOFT_RST_DISABLE);
325962306a36Sopenharmony_ci		/* Enables DRE in this path */
326062306a36Sopenharmony_ci		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
326162306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_CFG_CMP_EN_MASK,
326262306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_CFG_CMP_ENABLE);
326362306a36Sopenharmony_ci	}
326462306a36Sopenharmony_ci
326562306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event)) {
326662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
326762306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_HALT_MASK,
326862306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_HALT);
326962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
327062306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_CFG_CMP_EN_MASK,
327162306a36Sopenharmony_ci					WCD9335_CDC_RX_PATH_CFG_CMP_DISABLE);
327262306a36Sopenharmony_ci
327362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
327462306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
327562306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_SOFT_RST_ENABLE);
327662306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
327762306a36Sopenharmony_ci				WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
327862306a36Sopenharmony_ci				WCD9335_CDC_COMPANDER_SOFT_RST_DISABLE);
327962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
328062306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_CLK_EN_MASK,
328162306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_CLK_DISABLE);
328262306a36Sopenharmony_ci		snd_soc_component_update_bits(component, comp_ctl0_reg,
328362306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_HALT_MASK,
328462306a36Sopenharmony_ci					WCD9335_CDC_COMPANDER_NOHALT);
328562306a36Sopenharmony_ci	}
328662306a36Sopenharmony_ci
328762306a36Sopenharmony_ci	return 0;
328862306a36Sopenharmony_ci}
328962306a36Sopenharmony_ci
329062306a36Sopenharmony_cistatic int wcd9335_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
329162306a36Sopenharmony_ci		struct snd_kcontrol *kc, int event)
329262306a36Sopenharmony_ci{
329362306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
329462306a36Sopenharmony_ci	u16 gain_reg;
329562306a36Sopenharmony_ci	u16 reg;
329662306a36Sopenharmony_ci	int val;
329762306a36Sopenharmony_ci	int offset_val = 0;
329862306a36Sopenharmony_ci
329962306a36Sopenharmony_ci	if (!(strcmp(w->name, "RX INT0 INTERP"))) {
330062306a36Sopenharmony_ci		reg = WCD9335_CDC_RX0_RX_PATH_CTL;
330162306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX0_RX_VOL_CTL;
330262306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT1 INTERP"))) {
330362306a36Sopenharmony_ci		reg = WCD9335_CDC_RX1_RX_PATH_CTL;
330462306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX1_RX_VOL_CTL;
330562306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT2 INTERP"))) {
330662306a36Sopenharmony_ci		reg = WCD9335_CDC_RX2_RX_PATH_CTL;
330762306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX2_RX_VOL_CTL;
330862306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT3 INTERP"))) {
330962306a36Sopenharmony_ci		reg = WCD9335_CDC_RX3_RX_PATH_CTL;
331062306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX3_RX_VOL_CTL;
331162306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT4 INTERP"))) {
331262306a36Sopenharmony_ci		reg = WCD9335_CDC_RX4_RX_PATH_CTL;
331362306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX4_RX_VOL_CTL;
331462306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT5 INTERP"))) {
331562306a36Sopenharmony_ci		reg = WCD9335_CDC_RX5_RX_PATH_CTL;
331662306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX5_RX_VOL_CTL;
331762306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT6 INTERP"))) {
331862306a36Sopenharmony_ci		reg = WCD9335_CDC_RX6_RX_PATH_CTL;
331962306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX6_RX_VOL_CTL;
332062306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT7 INTERP"))) {
332162306a36Sopenharmony_ci		reg = WCD9335_CDC_RX7_RX_PATH_CTL;
332262306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX7_RX_VOL_CTL;
332362306a36Sopenharmony_ci	} else if (!(strcmp(w->name, "RX INT8 INTERP"))) {
332462306a36Sopenharmony_ci		reg = WCD9335_CDC_RX8_RX_PATH_CTL;
332562306a36Sopenharmony_ci		gain_reg = WCD9335_CDC_RX8_RX_VOL_CTL;
332662306a36Sopenharmony_ci	} else {
332762306a36Sopenharmony_ci		dev_err(comp->dev, "%s: Interpolator reg not found\n",
332862306a36Sopenharmony_ci			__func__);
332962306a36Sopenharmony_ci		return -EINVAL;
333062306a36Sopenharmony_ci	}
333162306a36Sopenharmony_ci
333262306a36Sopenharmony_ci	switch (event) {
333362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
333462306a36Sopenharmony_ci		/* Reset if needed */
333562306a36Sopenharmony_ci		wcd9335_codec_enable_prim_interpolator(comp, reg, event);
333662306a36Sopenharmony_ci		break;
333762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
333862306a36Sopenharmony_ci		wcd9335_config_compander(comp, w->shift, event);
333962306a36Sopenharmony_ci		val = snd_soc_component_read(comp, gain_reg);
334062306a36Sopenharmony_ci		val += offset_val;
334162306a36Sopenharmony_ci		snd_soc_component_write(comp, gain_reg, val);
334262306a36Sopenharmony_ci		break;
334362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
334462306a36Sopenharmony_ci		wcd9335_config_compander(comp, w->shift, event);
334562306a36Sopenharmony_ci		wcd9335_codec_enable_prim_interpolator(comp, reg, event);
334662306a36Sopenharmony_ci		break;
334762306a36Sopenharmony_ci	}
334862306a36Sopenharmony_ci
334962306a36Sopenharmony_ci	return 0;
335062306a36Sopenharmony_ci}
335162306a36Sopenharmony_ci
335262306a36Sopenharmony_cistatic void wcd9335_codec_hph_mode_gain_opt(struct snd_soc_component *component,
335362306a36Sopenharmony_ci					    u8 gain)
335462306a36Sopenharmony_ci{
335562306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
335662306a36Sopenharmony_ci	u8 hph_l_en, hph_r_en;
335762306a36Sopenharmony_ci	u8 l_val, r_val;
335862306a36Sopenharmony_ci	u8 hph_pa_status;
335962306a36Sopenharmony_ci	bool is_hphl_pa, is_hphr_pa;
336062306a36Sopenharmony_ci
336162306a36Sopenharmony_ci	hph_pa_status = snd_soc_component_read(component, WCD9335_ANA_HPH);
336262306a36Sopenharmony_ci	is_hphl_pa = hph_pa_status >> 7;
336362306a36Sopenharmony_ci	is_hphr_pa = (hph_pa_status & 0x40) >> 6;
336462306a36Sopenharmony_ci
336562306a36Sopenharmony_ci	hph_l_en = snd_soc_component_read(component, WCD9335_HPH_L_EN);
336662306a36Sopenharmony_ci	hph_r_en = snd_soc_component_read(component, WCD9335_HPH_R_EN);
336762306a36Sopenharmony_ci
336862306a36Sopenharmony_ci	l_val = (hph_l_en & 0xC0) | 0x20 | gain;
336962306a36Sopenharmony_ci	r_val = (hph_r_en & 0xC0) | 0x20 | gain;
337062306a36Sopenharmony_ci
337162306a36Sopenharmony_ci	/*
337262306a36Sopenharmony_ci	 * Set HPH_L & HPH_R gain source selection to REGISTER
337362306a36Sopenharmony_ci	 * for better click and pop only if corresponding PAs are
337462306a36Sopenharmony_ci	 * not enabled. Also cache the values of the HPHL/R
337562306a36Sopenharmony_ci	 * PA gains to be applied after PAs are enabled
337662306a36Sopenharmony_ci	 */
337762306a36Sopenharmony_ci	if ((l_val != hph_l_en) && !is_hphl_pa) {
337862306a36Sopenharmony_ci		snd_soc_component_write(component, WCD9335_HPH_L_EN, l_val);
337962306a36Sopenharmony_ci		wcd->hph_l_gain = hph_l_en & 0x1F;
338062306a36Sopenharmony_ci	}
338162306a36Sopenharmony_ci
338262306a36Sopenharmony_ci	if ((r_val != hph_r_en) && !is_hphr_pa) {
338362306a36Sopenharmony_ci		snd_soc_component_write(component, WCD9335_HPH_R_EN, r_val);
338462306a36Sopenharmony_ci		wcd->hph_r_gain = hph_r_en & 0x1F;
338562306a36Sopenharmony_ci	}
338662306a36Sopenharmony_ci}
338762306a36Sopenharmony_ci
338862306a36Sopenharmony_cistatic void wcd9335_codec_hph_lohifi_config(struct snd_soc_component *comp,
338962306a36Sopenharmony_ci					  int event)
339062306a36Sopenharmony_ci{
339162306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
339262306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_RX_BIAS_HPH_PA,
339362306a36Sopenharmony_ci					WCD9335_RX_BIAS_HPH_PA_AMP_5_UA_MASK,
339462306a36Sopenharmony_ci					0x06);
339562306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
339662306a36Sopenharmony_ci					WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2,
339762306a36Sopenharmony_ci					0xF0, 0x40);
339862306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
339962306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
340062306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_1000);
340162306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
340262306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
340362306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_ENABLE);
340462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL1,
340562306a36Sopenharmony_ci				WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
340662306a36Sopenharmony_ci				0x0C);
340762306a36Sopenharmony_ci		wcd9335_codec_hph_mode_gain_opt(comp, 0x11);
340862306a36Sopenharmony_ci	}
340962306a36Sopenharmony_ci
341062306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event)) {
341162306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
341262306a36Sopenharmony_ci			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
341362306a36Sopenharmony_ci			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_DISABLE);
341462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
341562306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
341662306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_500);
341762306a36Sopenharmony_ci		snd_soc_component_write(comp, WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2,
341862306a36Sopenharmony_ci					0x8A);
341962306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_RX_BIAS_HPH_PA,
342062306a36Sopenharmony_ci					WCD9335_RX_BIAS_HPH_PA_AMP_5_UA_MASK,
342162306a36Sopenharmony_ci					0x0A);
342262306a36Sopenharmony_ci	}
342362306a36Sopenharmony_ci}
342462306a36Sopenharmony_ci
342562306a36Sopenharmony_cistatic void wcd9335_codec_hph_lp_config(struct snd_soc_component *comp,
342662306a36Sopenharmony_ci				      int event)
342762306a36Sopenharmony_ci{
342862306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
342962306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL1,
343062306a36Sopenharmony_ci				WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
343162306a36Sopenharmony_ci				0x0C);
343262306a36Sopenharmony_ci		wcd9335_codec_hph_mode_gain_opt(comp, 0x10);
343362306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
343462306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
343562306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_1000);
343662306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
343762306a36Sopenharmony_ci			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
343862306a36Sopenharmony_ci			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_ENABLE);
343962306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
344062306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_MASK,
344162306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_ENABLE);
344262306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
344362306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_HPH_PSRR_ENH_MASK,
344462306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_HPH_PSRR_ENABLE);
344562306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_RDAC_LDO_CTL,
344662306a36Sopenharmony_ci				WCD9335_HPH_RDAC_N1P65_LD_OUTCTL_MASK,
344762306a36Sopenharmony_ci				WCD9335_HPH_RDAC_N1P65_LD_OUTCTL_V_N1P60);
344862306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_RDAC_LDO_CTL,
344962306a36Sopenharmony_ci				WCD9335_HPH_RDAC_1P65_LD_OUTCTL_MASK,
345062306a36Sopenharmony_ci				WCD9335_HPH_RDAC_1P65_LD_OUTCTL_V_N1P60);
345162306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
345262306a36Sopenharmony_ci				WCD9335_RX_BIAS_HPH_RDAC_LDO, 0x0F, 0x01);
345362306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
345462306a36Sopenharmony_ci				WCD9335_RX_BIAS_HPH_RDAC_LDO, 0xF0, 0x10);
345562306a36Sopenharmony_ci	}
345662306a36Sopenharmony_ci
345762306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event)) {
345862306a36Sopenharmony_ci		snd_soc_component_write(comp, WCD9335_RX_BIAS_HPH_RDAC_LDO,
345962306a36Sopenharmony_ci					0x88);
346062306a36Sopenharmony_ci		snd_soc_component_write(comp, WCD9335_HPH_RDAC_LDO_CTL,
346162306a36Sopenharmony_ci					0x33);
346262306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
346362306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_HPH_PSRR_ENH_MASK,
346462306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_HPH_PSRR_DISABLE);
346562306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
346662306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_MASK,
346762306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_DISABLE);
346862306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
346962306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
347062306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_DISABLE);
347162306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
347262306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
347362306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_500);
347462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_R_EN,
347562306a36Sopenharmony_ci				WCD9335_HPH_CONST_SEL_L_MASK,
347662306a36Sopenharmony_ci				WCD9335_HPH_CONST_SEL_L_HQ_PATH);
347762306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_L_EN,
347862306a36Sopenharmony_ci				WCD9335_HPH_CONST_SEL_L_MASK,
347962306a36Sopenharmony_ci				WCD9335_HPH_CONST_SEL_L_HQ_PATH);
348062306a36Sopenharmony_ci	}
348162306a36Sopenharmony_ci}
348262306a36Sopenharmony_ci
348362306a36Sopenharmony_cistatic void wcd9335_codec_hph_hifi_config(struct snd_soc_component *comp,
348462306a36Sopenharmony_ci					int event)
348562306a36Sopenharmony_ci{
348662306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
348762306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
348862306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
348962306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_1000);
349062306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
349162306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
349262306a36Sopenharmony_ci				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_ENABLE);
349362306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL1,
349462306a36Sopenharmony_ci				WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
349562306a36Sopenharmony_ci				0x0C);
349662306a36Sopenharmony_ci		wcd9335_codec_hph_mode_gain_opt(comp, 0x11);
349762306a36Sopenharmony_ci	}
349862306a36Sopenharmony_ci
349962306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event)) {
350062306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
350162306a36Sopenharmony_ci			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
350262306a36Sopenharmony_ci			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_DISABLE);
350362306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
350462306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
350562306a36Sopenharmony_ci				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_500);
350662306a36Sopenharmony_ci	}
350762306a36Sopenharmony_ci}
350862306a36Sopenharmony_ci
350962306a36Sopenharmony_cistatic void wcd9335_codec_hph_mode_config(struct snd_soc_component *component,
351062306a36Sopenharmony_ci					  int event, int mode)
351162306a36Sopenharmony_ci{
351262306a36Sopenharmony_ci	switch (mode) {
351362306a36Sopenharmony_ci	case CLS_H_LP:
351462306a36Sopenharmony_ci		wcd9335_codec_hph_lp_config(component, event);
351562306a36Sopenharmony_ci		break;
351662306a36Sopenharmony_ci	case CLS_H_LOHIFI:
351762306a36Sopenharmony_ci		wcd9335_codec_hph_lohifi_config(component, event);
351862306a36Sopenharmony_ci		break;
351962306a36Sopenharmony_ci	case CLS_H_HIFI:
352062306a36Sopenharmony_ci		wcd9335_codec_hph_hifi_config(component, event);
352162306a36Sopenharmony_ci		break;
352262306a36Sopenharmony_ci	}
352362306a36Sopenharmony_ci}
352462306a36Sopenharmony_ci
352562306a36Sopenharmony_cistatic int wcd9335_codec_hphl_dac_event(struct snd_soc_dapm_widget *w,
352662306a36Sopenharmony_ci					struct snd_kcontrol *kc,
352762306a36Sopenharmony_ci					int event)
352862306a36Sopenharmony_ci{
352962306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
353062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
353162306a36Sopenharmony_ci	int hph_mode = wcd->hph_mode;
353262306a36Sopenharmony_ci	u8 dem_inp;
353362306a36Sopenharmony_ci
353462306a36Sopenharmony_ci	switch (event) {
353562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
353662306a36Sopenharmony_ci		/* Read DEM INP Select */
353762306a36Sopenharmony_ci		dem_inp = snd_soc_component_read(comp,
353862306a36Sopenharmony_ci				WCD9335_CDC_RX1_RX_PATH_SEC0) & 0x03;
353962306a36Sopenharmony_ci		if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) ||
354062306a36Sopenharmony_ci				(hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) {
354162306a36Sopenharmony_ci			dev_err(comp->dev, "Incorrect DEM Input\n");
354262306a36Sopenharmony_ci			return -EINVAL;
354362306a36Sopenharmony_ci		}
354462306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
354562306a36Sopenharmony_ci					WCD_CLSH_STATE_HPHL,
354662306a36Sopenharmony_ci					((hph_mode == CLS_H_LOHIFI) ?
354762306a36Sopenharmony_ci					 CLS_H_HIFI : hph_mode));
354862306a36Sopenharmony_ci
354962306a36Sopenharmony_ci		wcd9335_codec_hph_mode_config(comp, event, hph_mode);
355062306a36Sopenharmony_ci
355162306a36Sopenharmony_ci		break;
355262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
355362306a36Sopenharmony_ci		usleep_range(1000, 1100);
355462306a36Sopenharmony_ci		break;
355562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
355662306a36Sopenharmony_ci		break;
355762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
355862306a36Sopenharmony_ci		/* 1000us required as per HW requirement */
355962306a36Sopenharmony_ci		usleep_range(1000, 1100);
356062306a36Sopenharmony_ci
356162306a36Sopenharmony_ci		if (!(wcd_clsh_ctrl_get_state(wcd->clsh_ctrl) &
356262306a36Sopenharmony_ci				WCD_CLSH_STATE_HPHR))
356362306a36Sopenharmony_ci			wcd9335_codec_hph_mode_config(comp, event, hph_mode);
356462306a36Sopenharmony_ci
356562306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
356662306a36Sopenharmony_ci				WCD_CLSH_STATE_HPHL,
356762306a36Sopenharmony_ci				((hph_mode == CLS_H_LOHIFI) ?
356862306a36Sopenharmony_ci				 CLS_H_HIFI : hph_mode));
356962306a36Sopenharmony_ci		break;
357062306a36Sopenharmony_ci	}
357162306a36Sopenharmony_ci
357262306a36Sopenharmony_ci	return 0;
357362306a36Sopenharmony_ci}
357462306a36Sopenharmony_ci
357562306a36Sopenharmony_cistatic int wcd9335_codec_lineout_dac_event(struct snd_soc_dapm_widget *w,
357662306a36Sopenharmony_ci					   struct snd_kcontrol *kc, int event)
357762306a36Sopenharmony_ci{
357862306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
357962306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
358062306a36Sopenharmony_ci
358162306a36Sopenharmony_ci	switch (event) {
358262306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
358362306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
358462306a36Sopenharmony_ci					WCD_CLSH_STATE_LO, CLS_AB);
358562306a36Sopenharmony_ci		break;
358662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
358762306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
358862306a36Sopenharmony_ci					WCD_CLSH_STATE_LO, CLS_AB);
358962306a36Sopenharmony_ci		break;
359062306a36Sopenharmony_ci	}
359162306a36Sopenharmony_ci
359262306a36Sopenharmony_ci	return 0;
359362306a36Sopenharmony_ci}
359462306a36Sopenharmony_ci
359562306a36Sopenharmony_cistatic int wcd9335_codec_ear_dac_event(struct snd_soc_dapm_widget *w,
359662306a36Sopenharmony_ci				       struct snd_kcontrol *kc, int event)
359762306a36Sopenharmony_ci{
359862306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
359962306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
360062306a36Sopenharmony_ci
360162306a36Sopenharmony_ci	switch (event) {
360262306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
360362306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
360462306a36Sopenharmony_ci					WCD_CLSH_STATE_EAR, CLS_H_NORMAL);
360562306a36Sopenharmony_ci
360662306a36Sopenharmony_ci		break;
360762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
360862306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
360962306a36Sopenharmony_ci					WCD_CLSH_STATE_EAR, CLS_H_NORMAL);
361062306a36Sopenharmony_ci		break;
361162306a36Sopenharmony_ci	}
361262306a36Sopenharmony_ci
361362306a36Sopenharmony_ci	return 0;
361462306a36Sopenharmony_ci}
361562306a36Sopenharmony_ci
361662306a36Sopenharmony_cistatic void wcd9335_codec_hph_post_pa_config(struct wcd9335_codec *wcd,
361762306a36Sopenharmony_ci					     int mode, int event)
361862306a36Sopenharmony_ci{
361962306a36Sopenharmony_ci	u8 scale_val = 0;
362062306a36Sopenharmony_ci
362162306a36Sopenharmony_ci	switch (event) {
362262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
362362306a36Sopenharmony_ci		switch (mode) {
362462306a36Sopenharmony_ci		case CLS_H_HIFI:
362562306a36Sopenharmony_ci			scale_val = 0x3;
362662306a36Sopenharmony_ci			break;
362762306a36Sopenharmony_ci		case CLS_H_LOHIFI:
362862306a36Sopenharmony_ci			scale_val = 0x1;
362962306a36Sopenharmony_ci			break;
363062306a36Sopenharmony_ci		}
363162306a36Sopenharmony_ci		break;
363262306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
363362306a36Sopenharmony_ci		scale_val = 0x6;
363462306a36Sopenharmony_ci		break;
363562306a36Sopenharmony_ci	}
363662306a36Sopenharmony_ci
363762306a36Sopenharmony_ci	if (scale_val)
363862306a36Sopenharmony_ci		snd_soc_component_update_bits(wcd->component,
363962306a36Sopenharmony_ci					WCD9335_HPH_PA_CTL1,
364062306a36Sopenharmony_ci					WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
364162306a36Sopenharmony_ci					scale_val << 1);
364262306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_ON(event)) {
364362306a36Sopenharmony_ci		if (wcd->comp_enabled[COMPANDER_1] ||
364462306a36Sopenharmony_ci		    wcd->comp_enabled[COMPANDER_2]) {
364562306a36Sopenharmony_ci			/* GAIN Source Selection */
364662306a36Sopenharmony_ci			snd_soc_component_update_bits(wcd->component,
364762306a36Sopenharmony_ci					WCD9335_HPH_L_EN,
364862306a36Sopenharmony_ci					WCD9335_HPH_GAIN_SRC_SEL_MASK,
364962306a36Sopenharmony_ci					WCD9335_HPH_GAIN_SRC_SEL_COMPANDER);
365062306a36Sopenharmony_ci			snd_soc_component_update_bits(wcd->component,
365162306a36Sopenharmony_ci					WCD9335_HPH_R_EN,
365262306a36Sopenharmony_ci					WCD9335_HPH_GAIN_SRC_SEL_MASK,
365362306a36Sopenharmony_ci					WCD9335_HPH_GAIN_SRC_SEL_COMPANDER);
365462306a36Sopenharmony_ci			snd_soc_component_update_bits(wcd->component,
365562306a36Sopenharmony_ci					WCD9335_HPH_AUTO_CHOP,
365662306a36Sopenharmony_ci					WCD9335_HPH_AUTO_CHOP_MASK,
365762306a36Sopenharmony_ci					WCD9335_HPH_AUTO_CHOP_FORCE_ENABLE);
365862306a36Sopenharmony_ci		}
365962306a36Sopenharmony_ci		snd_soc_component_update_bits(wcd->component,
366062306a36Sopenharmony_ci						WCD9335_HPH_L_EN,
366162306a36Sopenharmony_ci						WCD9335_HPH_PA_GAIN_MASK,
366262306a36Sopenharmony_ci						wcd->hph_l_gain);
366362306a36Sopenharmony_ci		snd_soc_component_update_bits(wcd->component,
366462306a36Sopenharmony_ci						WCD9335_HPH_R_EN,
366562306a36Sopenharmony_ci						WCD9335_HPH_PA_GAIN_MASK,
366662306a36Sopenharmony_ci						wcd->hph_r_gain);
366762306a36Sopenharmony_ci	}
366862306a36Sopenharmony_ci
366962306a36Sopenharmony_ci	if (SND_SOC_DAPM_EVENT_OFF(event))
367062306a36Sopenharmony_ci		snd_soc_component_update_bits(wcd->component,
367162306a36Sopenharmony_ci				WCD9335_HPH_AUTO_CHOP,
367262306a36Sopenharmony_ci				WCD9335_HPH_AUTO_CHOP_MASK,
367362306a36Sopenharmony_ci				WCD9335_HPH_AUTO_CHOP_ENABLE_BY_CMPDR_GAIN);
367462306a36Sopenharmony_ci}
367562306a36Sopenharmony_ci
367662306a36Sopenharmony_cistatic int wcd9335_codec_hphr_dac_event(struct snd_soc_dapm_widget *w,
367762306a36Sopenharmony_ci				      struct snd_kcontrol *kc,
367862306a36Sopenharmony_ci				      int event)
367962306a36Sopenharmony_ci{
368062306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
368162306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
368262306a36Sopenharmony_ci	int hph_mode = wcd->hph_mode;
368362306a36Sopenharmony_ci	u8 dem_inp;
368462306a36Sopenharmony_ci
368562306a36Sopenharmony_ci	switch (event) {
368662306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
368762306a36Sopenharmony_ci
368862306a36Sopenharmony_ci		/* Read DEM INP Select */
368962306a36Sopenharmony_ci		dem_inp = snd_soc_component_read(comp,
369062306a36Sopenharmony_ci				WCD9335_CDC_RX2_RX_PATH_SEC0) &
369162306a36Sopenharmony_ci				WCD9335_CDC_RX_PATH_DEM_INP_SEL_MASK;
369262306a36Sopenharmony_ci		if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) ||
369362306a36Sopenharmony_ci		     (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) {
369462306a36Sopenharmony_ci			dev_err(comp->dev, "DEM Input not set correctly, hph_mode: %d\n",
369562306a36Sopenharmony_ci				hph_mode);
369662306a36Sopenharmony_ci			return -EINVAL;
369762306a36Sopenharmony_ci		}
369862306a36Sopenharmony_ci
369962306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl,
370062306a36Sopenharmony_ci			     WCD_CLSH_EVENT_PRE_DAC,
370162306a36Sopenharmony_ci			     WCD_CLSH_STATE_HPHR,
370262306a36Sopenharmony_ci			     ((hph_mode == CLS_H_LOHIFI) ?
370362306a36Sopenharmony_ci			       CLS_H_HIFI : hph_mode));
370462306a36Sopenharmony_ci
370562306a36Sopenharmony_ci		wcd9335_codec_hph_mode_config(comp, event, hph_mode);
370662306a36Sopenharmony_ci
370762306a36Sopenharmony_ci		break;
370862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
370962306a36Sopenharmony_ci		/* 1000us required as per HW requirement */
371062306a36Sopenharmony_ci		usleep_range(1000, 1100);
371162306a36Sopenharmony_ci
371262306a36Sopenharmony_ci		if (!(wcd_clsh_ctrl_get_state(wcd->clsh_ctrl) &
371362306a36Sopenharmony_ci					WCD_CLSH_STATE_HPHL))
371462306a36Sopenharmony_ci			wcd9335_codec_hph_mode_config(comp, event, hph_mode);
371562306a36Sopenharmony_ci
371662306a36Sopenharmony_ci		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
371762306a36Sopenharmony_ci			     WCD_CLSH_STATE_HPHR, ((hph_mode == CLS_H_LOHIFI) ?
371862306a36Sopenharmony_ci						CLS_H_HIFI : hph_mode));
371962306a36Sopenharmony_ci		break;
372062306a36Sopenharmony_ci	}
372162306a36Sopenharmony_ci
372262306a36Sopenharmony_ci	return 0;
372362306a36Sopenharmony_ci}
372462306a36Sopenharmony_ci
372562306a36Sopenharmony_cistatic int wcd9335_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w,
372662306a36Sopenharmony_ci				      struct snd_kcontrol *kc,
372762306a36Sopenharmony_ci				      int event)
372862306a36Sopenharmony_ci{
372962306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
373062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
373162306a36Sopenharmony_ci	int hph_mode = wcd->hph_mode;
373262306a36Sopenharmony_ci
373362306a36Sopenharmony_ci	switch (event) {
373462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
373562306a36Sopenharmony_ci		break;
373662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
373762306a36Sopenharmony_ci		/*
373862306a36Sopenharmony_ci		 * 7ms sleep is required after PA is enabled as per
373962306a36Sopenharmony_ci		 * HW requirement
374062306a36Sopenharmony_ci		 */
374162306a36Sopenharmony_ci		usleep_range(7000, 7100);
374262306a36Sopenharmony_ci
374362306a36Sopenharmony_ci		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
374462306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
374562306a36Sopenharmony_ci					WCD9335_CDC_RX1_RX_PATH_CTL,
374662306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
374762306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
374862306a36Sopenharmony_ci
374962306a36Sopenharmony_ci		/* Remove mix path mute if it is enabled */
375062306a36Sopenharmony_ci		if ((snd_soc_component_read(comp,
375162306a36Sopenharmony_ci					WCD9335_CDC_RX1_RX_PATH_MIX_CTL)) &
375262306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
375362306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,
375462306a36Sopenharmony_ci					    WCD9335_CDC_RX1_RX_PATH_MIX_CTL,
375562306a36Sopenharmony_ci					    WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
375662306a36Sopenharmony_ci					    WCD9335_CDC_RX_PGA_MUTE_DISABLE);
375762306a36Sopenharmony_ci
375862306a36Sopenharmony_ci		break;
375962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
376062306a36Sopenharmony_ci		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
376162306a36Sopenharmony_ci		break;
376262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
376362306a36Sopenharmony_ci		/* 5ms sleep is required after PA is disabled as per
376462306a36Sopenharmony_ci		 * HW requirement
376562306a36Sopenharmony_ci		 */
376662306a36Sopenharmony_ci		usleep_range(5000, 5500);
376762306a36Sopenharmony_ci		break;
376862306a36Sopenharmony_ci	}
376962306a36Sopenharmony_ci
377062306a36Sopenharmony_ci	return 0;
377162306a36Sopenharmony_ci}
377262306a36Sopenharmony_ci
377362306a36Sopenharmony_cistatic int wcd9335_codec_enable_lineout_pa(struct snd_soc_dapm_widget *w,
377462306a36Sopenharmony_ci					 struct snd_kcontrol *kc,
377562306a36Sopenharmony_ci					 int event)
377662306a36Sopenharmony_ci{
377762306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
377862306a36Sopenharmony_ci	int vol_reg = 0, mix_vol_reg = 0;
377962306a36Sopenharmony_ci
378062306a36Sopenharmony_ci	if (w->reg == WCD9335_ANA_LO_1_2) {
378162306a36Sopenharmony_ci		if (w->shift == 7) {
378262306a36Sopenharmony_ci			vol_reg = WCD9335_CDC_RX3_RX_PATH_CTL;
378362306a36Sopenharmony_ci			mix_vol_reg = WCD9335_CDC_RX3_RX_PATH_MIX_CTL;
378462306a36Sopenharmony_ci		} else if (w->shift == 6) {
378562306a36Sopenharmony_ci			vol_reg = WCD9335_CDC_RX4_RX_PATH_CTL;
378662306a36Sopenharmony_ci			mix_vol_reg = WCD9335_CDC_RX4_RX_PATH_MIX_CTL;
378762306a36Sopenharmony_ci		}
378862306a36Sopenharmony_ci	} else if (w->reg == WCD9335_ANA_LO_3_4) {
378962306a36Sopenharmony_ci		if (w->shift == 7) {
379062306a36Sopenharmony_ci			vol_reg = WCD9335_CDC_RX5_RX_PATH_CTL;
379162306a36Sopenharmony_ci			mix_vol_reg = WCD9335_CDC_RX5_RX_PATH_MIX_CTL;
379262306a36Sopenharmony_ci		} else if (w->shift == 6) {
379362306a36Sopenharmony_ci			vol_reg = WCD9335_CDC_RX6_RX_PATH_CTL;
379462306a36Sopenharmony_ci			mix_vol_reg = WCD9335_CDC_RX6_RX_PATH_MIX_CTL;
379562306a36Sopenharmony_ci		}
379662306a36Sopenharmony_ci	} else {
379762306a36Sopenharmony_ci		dev_err(comp->dev, "Error enabling lineout PA\n");
379862306a36Sopenharmony_ci		return -EINVAL;
379962306a36Sopenharmony_ci	}
380062306a36Sopenharmony_ci
380162306a36Sopenharmony_ci	switch (event) {
380262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
380362306a36Sopenharmony_ci		/* 5ms sleep is required after PA is enabled as per
380462306a36Sopenharmony_ci		 * HW requirement
380562306a36Sopenharmony_ci		 */
380662306a36Sopenharmony_ci		usleep_range(5000, 5500);
380762306a36Sopenharmony_ci		snd_soc_component_update_bits(comp, vol_reg,
380862306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
380962306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
381062306a36Sopenharmony_ci
381162306a36Sopenharmony_ci		/* Remove mix path mute if it is enabled */
381262306a36Sopenharmony_ci		if ((snd_soc_component_read(comp, mix_vol_reg)) &
381362306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
381462306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,  mix_vol_reg,
381562306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
381662306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
381762306a36Sopenharmony_ci		break;
381862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
381962306a36Sopenharmony_ci		/* 5ms sleep is required after PA is disabled as per
382062306a36Sopenharmony_ci		 * HW requirement
382162306a36Sopenharmony_ci		 */
382262306a36Sopenharmony_ci		usleep_range(5000, 5500);
382362306a36Sopenharmony_ci		break;
382462306a36Sopenharmony_ci	}
382562306a36Sopenharmony_ci
382662306a36Sopenharmony_ci	return 0;
382762306a36Sopenharmony_ci}
382862306a36Sopenharmony_ci
382962306a36Sopenharmony_cistatic void wcd9335_codec_init_flyback(struct snd_soc_component *component)
383062306a36Sopenharmony_ci{
383162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_HPH_L_EN,
383262306a36Sopenharmony_ci					WCD9335_HPH_CONST_SEL_L_MASK,
383362306a36Sopenharmony_ci					WCD9335_HPH_CONST_SEL_L_BYPASS);
383462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_HPH_R_EN,
383562306a36Sopenharmony_ci					WCD9335_HPH_CONST_SEL_L_MASK,
383662306a36Sopenharmony_ci					WCD9335_HPH_CONST_SEL_L_BYPASS);
383762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_RX_BIAS_FLYB_BUFF,
383862306a36Sopenharmony_ci					WCD9335_RX_BIAS_FLYB_VPOS_5_UA_MASK,
383962306a36Sopenharmony_ci					WCD9335_RX_BIAS_FLYB_I_0P0_UA);
384062306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_RX_BIAS_FLYB_BUFF,
384162306a36Sopenharmony_ci					WCD9335_RX_BIAS_FLYB_VNEG_5_UA_MASK,
384262306a36Sopenharmony_ci					WCD9335_RX_BIAS_FLYB_I_0P0_UA);
384362306a36Sopenharmony_ci}
384462306a36Sopenharmony_ci
384562306a36Sopenharmony_cistatic int wcd9335_codec_enable_rx_bias(struct snd_soc_dapm_widget *w,
384662306a36Sopenharmony_ci		struct snd_kcontrol *kc, int event)
384762306a36Sopenharmony_ci{
384862306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
384962306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
385062306a36Sopenharmony_ci
385162306a36Sopenharmony_ci	switch (event) {
385262306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
385362306a36Sopenharmony_ci		wcd->rx_bias_count++;
385462306a36Sopenharmony_ci		if (wcd->rx_bias_count == 1) {
385562306a36Sopenharmony_ci			wcd9335_codec_init_flyback(comp);
385662306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,
385762306a36Sopenharmony_ci						WCD9335_ANA_RX_SUPPLIES,
385862306a36Sopenharmony_ci						WCD9335_ANA_RX_BIAS_ENABLE_MASK,
385962306a36Sopenharmony_ci						WCD9335_ANA_RX_BIAS_ENABLE);
386062306a36Sopenharmony_ci		}
386162306a36Sopenharmony_ci		break;
386262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
386362306a36Sopenharmony_ci		wcd->rx_bias_count--;
386462306a36Sopenharmony_ci		if (!wcd->rx_bias_count)
386562306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,
386662306a36Sopenharmony_ci					WCD9335_ANA_RX_SUPPLIES,
386762306a36Sopenharmony_ci					WCD9335_ANA_RX_BIAS_ENABLE_MASK,
386862306a36Sopenharmony_ci					WCD9335_ANA_RX_BIAS_DISABLE);
386962306a36Sopenharmony_ci		break;
387062306a36Sopenharmony_ci	}
387162306a36Sopenharmony_ci
387262306a36Sopenharmony_ci	return 0;
387362306a36Sopenharmony_ci}
387462306a36Sopenharmony_ci
387562306a36Sopenharmony_cistatic int wcd9335_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
387662306a36Sopenharmony_ci					struct snd_kcontrol *kc, int event)
387762306a36Sopenharmony_ci{
387862306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
387962306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
388062306a36Sopenharmony_ci	int hph_mode = wcd->hph_mode;
388162306a36Sopenharmony_ci
388262306a36Sopenharmony_ci	switch (event) {
388362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
388462306a36Sopenharmony_ci		break;
388562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
388662306a36Sopenharmony_ci		/*
388762306a36Sopenharmony_ci		 * 7ms sleep is required after PA is enabled as per
388862306a36Sopenharmony_ci		 * HW requirement
388962306a36Sopenharmony_ci		 */
389062306a36Sopenharmony_ci		usleep_range(7000, 7100);
389162306a36Sopenharmony_ci		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
389262306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
389362306a36Sopenharmony_ci					WCD9335_CDC_RX2_RX_PATH_CTL,
389462306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
389562306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
389662306a36Sopenharmony_ci		/* Remove mix path mute if it is enabled */
389762306a36Sopenharmony_ci		if ((snd_soc_component_read(comp,
389862306a36Sopenharmony_ci					WCD9335_CDC_RX2_RX_PATH_MIX_CTL)) &
389962306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
390062306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,
390162306a36Sopenharmony_ci					WCD9335_CDC_RX2_RX_PATH_MIX_CTL,
390262306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
390362306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
390462306a36Sopenharmony_ci
390562306a36Sopenharmony_ci		break;
390662306a36Sopenharmony_ci
390762306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
390862306a36Sopenharmony_ci		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
390962306a36Sopenharmony_ci		break;
391062306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
391162306a36Sopenharmony_ci		/* 5ms sleep is required after PA is disabled as per
391262306a36Sopenharmony_ci		 * HW requirement
391362306a36Sopenharmony_ci		 */
391462306a36Sopenharmony_ci		usleep_range(5000, 5500);
391562306a36Sopenharmony_ci		break;
391662306a36Sopenharmony_ci	}
391762306a36Sopenharmony_ci
391862306a36Sopenharmony_ci	return 0;
391962306a36Sopenharmony_ci}
392062306a36Sopenharmony_ci
392162306a36Sopenharmony_cistatic int wcd9335_codec_enable_ear_pa(struct snd_soc_dapm_widget *w,
392262306a36Sopenharmony_ci				       struct snd_kcontrol *kc, int event)
392362306a36Sopenharmony_ci{
392462306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
392562306a36Sopenharmony_ci
392662306a36Sopenharmony_ci	switch (event) {
392762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
392862306a36Sopenharmony_ci		/* 5ms sleep is required after PA is enabled as per
392962306a36Sopenharmony_ci		 * HW requirement
393062306a36Sopenharmony_ci		 */
393162306a36Sopenharmony_ci		usleep_range(5000, 5500);
393262306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
393362306a36Sopenharmony_ci					WCD9335_CDC_RX0_RX_PATH_CTL,
393462306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
393562306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
393662306a36Sopenharmony_ci		/* Remove mix path mute if it is enabled */
393762306a36Sopenharmony_ci		if ((snd_soc_component_read(comp,
393862306a36Sopenharmony_ci					WCD9335_CDC_RX0_RX_PATH_MIX_CTL)) &
393962306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
394062306a36Sopenharmony_ci			snd_soc_component_update_bits(comp,
394162306a36Sopenharmony_ci					WCD9335_CDC_RX0_RX_PATH_MIX_CTL,
394262306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
394362306a36Sopenharmony_ci					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
394462306a36Sopenharmony_ci		break;
394562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
394662306a36Sopenharmony_ci		/* 5ms sleep is required after PA is disabled as per
394762306a36Sopenharmony_ci		 * HW requirement
394862306a36Sopenharmony_ci		 */
394962306a36Sopenharmony_ci		usleep_range(5000, 5500);
395062306a36Sopenharmony_ci
395162306a36Sopenharmony_ci		break;
395262306a36Sopenharmony_ci	}
395362306a36Sopenharmony_ci
395462306a36Sopenharmony_ci	return 0;
395562306a36Sopenharmony_ci}
395662306a36Sopenharmony_ci
395762306a36Sopenharmony_cistatic irqreturn_t wcd9335_slimbus_irq(int irq, void *data)
395862306a36Sopenharmony_ci{
395962306a36Sopenharmony_ci	struct wcd9335_codec *wcd = data;
396062306a36Sopenharmony_ci	unsigned long status = 0;
396162306a36Sopenharmony_ci	int i, j, port_id;
396262306a36Sopenharmony_ci	unsigned int val, int_val = 0;
396362306a36Sopenharmony_ci	irqreturn_t ret = IRQ_NONE;
396462306a36Sopenharmony_ci	bool tx;
396562306a36Sopenharmony_ci	unsigned short reg = 0;
396662306a36Sopenharmony_ci
396762306a36Sopenharmony_ci	for (i = WCD9335_SLIM_PGD_PORT_INT_STATUS_RX_0, j = 0;
396862306a36Sopenharmony_ci	     i <= WCD9335_SLIM_PGD_PORT_INT_STATUS_TX_1; i++, j++) {
396962306a36Sopenharmony_ci		regmap_read(wcd->if_regmap, i, &val);
397062306a36Sopenharmony_ci		status |= ((u32)val << (8 * j));
397162306a36Sopenharmony_ci	}
397262306a36Sopenharmony_ci
397362306a36Sopenharmony_ci	for_each_set_bit(j, &status, 32) {
397462306a36Sopenharmony_ci		tx = (j >= 16);
397562306a36Sopenharmony_ci		port_id = (tx ? j - 16 : j);
397662306a36Sopenharmony_ci		regmap_read(wcd->if_regmap,
397762306a36Sopenharmony_ci				WCD9335_SLIM_PGD_PORT_INT_RX_SOURCE0 + j, &val);
397862306a36Sopenharmony_ci		if (val) {
397962306a36Sopenharmony_ci			if (!tx)
398062306a36Sopenharmony_ci				reg = WCD9335_SLIM_PGD_PORT_INT_EN0 +
398162306a36Sopenharmony_ci					(port_id / 8);
398262306a36Sopenharmony_ci			else
398362306a36Sopenharmony_ci				reg = WCD9335_SLIM_PGD_PORT_INT_TX_EN0 +
398462306a36Sopenharmony_ci					(port_id / 8);
398562306a36Sopenharmony_ci			regmap_read(
398662306a36Sopenharmony_ci				wcd->if_regmap, reg, &int_val);
398762306a36Sopenharmony_ci			/*
398862306a36Sopenharmony_ci			 * Ignore interrupts for ports for which the
398962306a36Sopenharmony_ci			 * interrupts are not specifically enabled.
399062306a36Sopenharmony_ci			 */
399162306a36Sopenharmony_ci			if (!(int_val & (1 << (port_id % 8))))
399262306a36Sopenharmony_ci				continue;
399362306a36Sopenharmony_ci		}
399462306a36Sopenharmony_ci
399562306a36Sopenharmony_ci		if (val & WCD9335_SLIM_IRQ_OVERFLOW)
399662306a36Sopenharmony_ci			dev_err_ratelimited(wcd->dev,
399762306a36Sopenharmony_ci			   "%s: overflow error on %s port %d, value %x\n",
399862306a36Sopenharmony_ci			   __func__, (tx ? "TX" : "RX"), port_id, val);
399962306a36Sopenharmony_ci
400062306a36Sopenharmony_ci		if (val & WCD9335_SLIM_IRQ_UNDERFLOW)
400162306a36Sopenharmony_ci			dev_err_ratelimited(wcd->dev,
400262306a36Sopenharmony_ci			   "%s: underflow error on %s port %d, value %x\n",
400362306a36Sopenharmony_ci			   __func__, (tx ? "TX" : "RX"), port_id, val);
400462306a36Sopenharmony_ci
400562306a36Sopenharmony_ci		if ((val & WCD9335_SLIM_IRQ_OVERFLOW) ||
400662306a36Sopenharmony_ci			(val & WCD9335_SLIM_IRQ_UNDERFLOW)) {
400762306a36Sopenharmony_ci			if (!tx)
400862306a36Sopenharmony_ci				reg = WCD9335_SLIM_PGD_PORT_INT_EN0 +
400962306a36Sopenharmony_ci					(port_id / 8);
401062306a36Sopenharmony_ci			else
401162306a36Sopenharmony_ci				reg = WCD9335_SLIM_PGD_PORT_INT_TX_EN0 +
401262306a36Sopenharmony_ci					(port_id / 8);
401362306a36Sopenharmony_ci			regmap_read(
401462306a36Sopenharmony_ci				wcd->if_regmap, reg, &int_val);
401562306a36Sopenharmony_ci			if (int_val & (1 << (port_id % 8))) {
401662306a36Sopenharmony_ci				int_val = int_val ^ (1 << (port_id % 8));
401762306a36Sopenharmony_ci				regmap_write(wcd->if_regmap,
401862306a36Sopenharmony_ci					reg, int_val);
401962306a36Sopenharmony_ci			}
402062306a36Sopenharmony_ci		}
402162306a36Sopenharmony_ci
402262306a36Sopenharmony_ci		regmap_write(wcd->if_regmap,
402362306a36Sopenharmony_ci				WCD9335_SLIM_PGD_PORT_INT_CLR_RX_0 + (j / 8),
402462306a36Sopenharmony_ci				BIT(j % 8));
402562306a36Sopenharmony_ci		ret = IRQ_HANDLED;
402662306a36Sopenharmony_ci	}
402762306a36Sopenharmony_ci
402862306a36Sopenharmony_ci	return ret;
402962306a36Sopenharmony_ci}
403062306a36Sopenharmony_ci
403162306a36Sopenharmony_cistatic struct wcd9335_irq wcd9335_irqs[] = {
403262306a36Sopenharmony_ci	{
403362306a36Sopenharmony_ci		.irq = WCD9335_IRQ_SLIMBUS,
403462306a36Sopenharmony_ci		.handler = wcd9335_slimbus_irq,
403562306a36Sopenharmony_ci		.name = "SLIM Slave",
403662306a36Sopenharmony_ci	},
403762306a36Sopenharmony_ci};
403862306a36Sopenharmony_ci
403962306a36Sopenharmony_cistatic int wcd9335_setup_irqs(struct wcd9335_codec *wcd)
404062306a36Sopenharmony_ci{
404162306a36Sopenharmony_ci	int irq, ret, i;
404262306a36Sopenharmony_ci
404362306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wcd9335_irqs); i++) {
404462306a36Sopenharmony_ci		irq = regmap_irq_get_virq(wcd->irq_data, wcd9335_irqs[i].irq);
404562306a36Sopenharmony_ci		if (irq < 0) {
404662306a36Sopenharmony_ci			dev_err(wcd->dev, "Failed to get %s\n",
404762306a36Sopenharmony_ci					wcd9335_irqs[i].name);
404862306a36Sopenharmony_ci			return irq;
404962306a36Sopenharmony_ci		}
405062306a36Sopenharmony_ci
405162306a36Sopenharmony_ci		ret = devm_request_threaded_irq(wcd->dev, irq, NULL,
405262306a36Sopenharmony_ci						wcd9335_irqs[i].handler,
405362306a36Sopenharmony_ci						IRQF_TRIGGER_RISING |
405462306a36Sopenharmony_ci						IRQF_ONESHOT,
405562306a36Sopenharmony_ci						wcd9335_irqs[i].name, wcd);
405662306a36Sopenharmony_ci		if (ret) {
405762306a36Sopenharmony_ci			dev_err(wcd->dev, "Failed to request %s\n",
405862306a36Sopenharmony_ci					wcd9335_irqs[i].name);
405962306a36Sopenharmony_ci			return ret;
406062306a36Sopenharmony_ci		}
406162306a36Sopenharmony_ci	}
406262306a36Sopenharmony_ci
406362306a36Sopenharmony_ci	/* enable interrupts on all slave ports */
406462306a36Sopenharmony_ci	for (i = 0; i < WCD9335_SLIM_NUM_PORT_REG; i++)
406562306a36Sopenharmony_ci		regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
406662306a36Sopenharmony_ci			     0xFF);
406762306a36Sopenharmony_ci
406862306a36Sopenharmony_ci	return ret;
406962306a36Sopenharmony_ci}
407062306a36Sopenharmony_ci
407162306a36Sopenharmony_cistatic void wcd9335_teardown_irqs(struct wcd9335_codec *wcd)
407262306a36Sopenharmony_ci{
407362306a36Sopenharmony_ci	int i;
407462306a36Sopenharmony_ci
407562306a36Sopenharmony_ci	/* disable interrupts on all slave ports */
407662306a36Sopenharmony_ci	for (i = 0; i < WCD9335_SLIM_NUM_PORT_REG; i++)
407762306a36Sopenharmony_ci		regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
407862306a36Sopenharmony_ci			     0x00);
407962306a36Sopenharmony_ci}
408062306a36Sopenharmony_ci
408162306a36Sopenharmony_cistatic void wcd9335_cdc_sido_ccl_enable(struct wcd9335_codec *wcd,
408262306a36Sopenharmony_ci					bool ccl_flag)
408362306a36Sopenharmony_ci{
408462306a36Sopenharmony_ci	struct snd_soc_component *comp = wcd->component;
408562306a36Sopenharmony_ci
408662306a36Sopenharmony_ci	if (ccl_flag) {
408762306a36Sopenharmony_ci		if (++wcd->sido_ccl_cnt == 1)
408862306a36Sopenharmony_ci			snd_soc_component_write(comp, WCD9335_SIDO_SIDO_CCL_10,
408962306a36Sopenharmony_ci					WCD9335_SIDO_SIDO_CCL_DEF_VALUE);
409062306a36Sopenharmony_ci	} else {
409162306a36Sopenharmony_ci		if (wcd->sido_ccl_cnt == 0) {
409262306a36Sopenharmony_ci			dev_err(wcd->dev, "sido_ccl already disabled\n");
409362306a36Sopenharmony_ci			return;
409462306a36Sopenharmony_ci		}
409562306a36Sopenharmony_ci		if (--wcd->sido_ccl_cnt == 0)
409662306a36Sopenharmony_ci			snd_soc_component_write(comp, WCD9335_SIDO_SIDO_CCL_10,
409762306a36Sopenharmony_ci				WCD9335_SIDO_SIDO_CCL_10_ICHARG_PWR_SEL_C320FF);
409862306a36Sopenharmony_ci	}
409962306a36Sopenharmony_ci}
410062306a36Sopenharmony_ci
410162306a36Sopenharmony_cistatic int wcd9335_enable_master_bias(struct wcd9335_codec *wcd)
410262306a36Sopenharmony_ci{
410362306a36Sopenharmony_ci	wcd->master_bias_users++;
410462306a36Sopenharmony_ci	if (wcd->master_bias_users == 1) {
410562306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
410662306a36Sopenharmony_ci					WCD9335_ANA_BIAS_EN_MASK,
410762306a36Sopenharmony_ci					WCD9335_ANA_BIAS_ENABLE);
410862306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
410962306a36Sopenharmony_ci					WCD9335_ANA_BIAS_PRECHRG_EN_MASK,
411062306a36Sopenharmony_ci					WCD9335_ANA_BIAS_PRECHRG_ENABLE);
411162306a36Sopenharmony_ci		/*
411262306a36Sopenharmony_ci		 * 1ms delay is required after pre-charge is enabled
411362306a36Sopenharmony_ci		 * as per HW requirement
411462306a36Sopenharmony_ci		 */
411562306a36Sopenharmony_ci		usleep_range(1000, 1100);
411662306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
411762306a36Sopenharmony_ci					WCD9335_ANA_BIAS_PRECHRG_EN_MASK,
411862306a36Sopenharmony_ci					WCD9335_ANA_BIAS_PRECHRG_DISABLE);
411962306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
412062306a36Sopenharmony_ci				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE,
412162306a36Sopenharmony_ci				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE_MANUAL);
412262306a36Sopenharmony_ci	}
412362306a36Sopenharmony_ci
412462306a36Sopenharmony_ci	return 0;
412562306a36Sopenharmony_ci}
412662306a36Sopenharmony_ci
412762306a36Sopenharmony_cistatic int wcd9335_enable_mclk(struct wcd9335_codec *wcd)
412862306a36Sopenharmony_ci{
412962306a36Sopenharmony_ci	/* Enable mclk requires master bias to be enabled first */
413062306a36Sopenharmony_ci	if (wcd->master_bias_users <= 0)
413162306a36Sopenharmony_ci		return -EINVAL;
413262306a36Sopenharmony_ci
413362306a36Sopenharmony_ci	if (((wcd->clk_mclk_users == 0) && (wcd->clk_type == WCD_CLK_MCLK)) ||
413462306a36Sopenharmony_ci	    ((wcd->clk_mclk_users > 0) && (wcd->clk_type != WCD_CLK_MCLK))) {
413562306a36Sopenharmony_ci		dev_err(wcd->dev, "Error enabling MCLK, clk_type: %d\n",
413662306a36Sopenharmony_ci			wcd->clk_type);
413762306a36Sopenharmony_ci		return -EINVAL;
413862306a36Sopenharmony_ci	}
413962306a36Sopenharmony_ci
414062306a36Sopenharmony_ci	if (++wcd->clk_mclk_users == 1) {
414162306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
414262306a36Sopenharmony_ci					WCD9335_ANA_CLK_EXT_CLKBUF_EN_MASK,
414362306a36Sopenharmony_ci					WCD9335_ANA_CLK_EXT_CLKBUF_ENABLE);
414462306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
414562306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_SRC_MASK,
414662306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_SRC_EXTERNAL);
414762306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
414862306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_EN_MASK,
414962306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_ENABLE);
415062306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap,
415162306a36Sopenharmony_ci				   WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL,
415262306a36Sopenharmony_ci				   WCD9335_CDC_CLK_RST_CTRL_FS_CNT_EN_MASK,
415362306a36Sopenharmony_ci				   WCD9335_CDC_CLK_RST_CTRL_FS_CNT_ENABLE);
415462306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap,
415562306a36Sopenharmony_ci				   WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL,
415662306a36Sopenharmony_ci				   WCD9335_CDC_CLK_RST_CTRL_MCLK_EN_MASK,
415762306a36Sopenharmony_ci				   WCD9335_CDC_CLK_RST_CTRL_MCLK_ENABLE);
415862306a36Sopenharmony_ci		/*
415962306a36Sopenharmony_ci		 * 10us sleep is required after clock is enabled
416062306a36Sopenharmony_ci		 * as per HW requirement
416162306a36Sopenharmony_ci		 */
416262306a36Sopenharmony_ci		usleep_range(10, 15);
416362306a36Sopenharmony_ci	}
416462306a36Sopenharmony_ci
416562306a36Sopenharmony_ci	wcd->clk_type = WCD_CLK_MCLK;
416662306a36Sopenharmony_ci
416762306a36Sopenharmony_ci	return 0;
416862306a36Sopenharmony_ci}
416962306a36Sopenharmony_ci
417062306a36Sopenharmony_cistatic int wcd9335_disable_mclk(struct wcd9335_codec *wcd)
417162306a36Sopenharmony_ci{
417262306a36Sopenharmony_ci	if (wcd->clk_mclk_users <= 0)
417362306a36Sopenharmony_ci		return -EINVAL;
417462306a36Sopenharmony_ci
417562306a36Sopenharmony_ci	if (--wcd->clk_mclk_users == 0) {
417662306a36Sopenharmony_ci		if (wcd->clk_rco_users > 0) {
417762306a36Sopenharmony_ci			/* MCLK to RCO switch */
417862306a36Sopenharmony_ci			regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
417962306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_SRC_MASK,
418062306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_SRC_RCO);
418162306a36Sopenharmony_ci			wcd->clk_type = WCD_CLK_RCO;
418262306a36Sopenharmony_ci		} else {
418362306a36Sopenharmony_ci			regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
418462306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_EN_MASK,
418562306a36Sopenharmony_ci					WCD9335_ANA_CLK_MCLK_DISABLE);
418662306a36Sopenharmony_ci			wcd->clk_type = WCD_CLK_OFF;
418762306a36Sopenharmony_ci		}
418862306a36Sopenharmony_ci
418962306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
419062306a36Sopenharmony_ci					WCD9335_ANA_CLK_EXT_CLKBUF_EN_MASK,
419162306a36Sopenharmony_ci					WCD9335_ANA_CLK_EXT_CLKBUF_DISABLE);
419262306a36Sopenharmony_ci	}
419362306a36Sopenharmony_ci
419462306a36Sopenharmony_ci	return 0;
419562306a36Sopenharmony_ci}
419662306a36Sopenharmony_ci
419762306a36Sopenharmony_cistatic int wcd9335_disable_master_bias(struct wcd9335_codec *wcd)
419862306a36Sopenharmony_ci{
419962306a36Sopenharmony_ci	if (wcd->master_bias_users <= 0)
420062306a36Sopenharmony_ci		return -EINVAL;
420162306a36Sopenharmony_ci
420262306a36Sopenharmony_ci	wcd->master_bias_users--;
420362306a36Sopenharmony_ci	if (wcd->master_bias_users == 0) {
420462306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
420562306a36Sopenharmony_ci				WCD9335_ANA_BIAS_EN_MASK,
420662306a36Sopenharmony_ci				WCD9335_ANA_BIAS_DISABLE);
420762306a36Sopenharmony_ci		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
420862306a36Sopenharmony_ci				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE,
420962306a36Sopenharmony_ci				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE_MANUAL);
421062306a36Sopenharmony_ci	}
421162306a36Sopenharmony_ci	return 0;
421262306a36Sopenharmony_ci}
421362306a36Sopenharmony_ci
421462306a36Sopenharmony_cistatic int wcd9335_cdc_req_mclk_enable(struct wcd9335_codec *wcd,
421562306a36Sopenharmony_ci				     bool enable)
421662306a36Sopenharmony_ci{
421762306a36Sopenharmony_ci	int ret = 0;
421862306a36Sopenharmony_ci
421962306a36Sopenharmony_ci	if (enable) {
422062306a36Sopenharmony_ci		wcd9335_cdc_sido_ccl_enable(wcd, true);
422162306a36Sopenharmony_ci		ret = clk_prepare_enable(wcd->mclk);
422262306a36Sopenharmony_ci		if (ret) {
422362306a36Sopenharmony_ci			dev_err(wcd->dev, "%s: ext clk enable failed\n",
422462306a36Sopenharmony_ci				__func__);
422562306a36Sopenharmony_ci			goto err;
422662306a36Sopenharmony_ci		}
422762306a36Sopenharmony_ci		/* get BG */
422862306a36Sopenharmony_ci		wcd9335_enable_master_bias(wcd);
422962306a36Sopenharmony_ci		/* get MCLK */
423062306a36Sopenharmony_ci		wcd9335_enable_mclk(wcd);
423162306a36Sopenharmony_ci
423262306a36Sopenharmony_ci	} else {
423362306a36Sopenharmony_ci		/* put MCLK */
423462306a36Sopenharmony_ci		wcd9335_disable_mclk(wcd);
423562306a36Sopenharmony_ci		/* put BG */
423662306a36Sopenharmony_ci		wcd9335_disable_master_bias(wcd);
423762306a36Sopenharmony_ci		clk_disable_unprepare(wcd->mclk);
423862306a36Sopenharmony_ci		wcd9335_cdc_sido_ccl_enable(wcd, false);
423962306a36Sopenharmony_ci	}
424062306a36Sopenharmony_cierr:
424162306a36Sopenharmony_ci	return ret;
424262306a36Sopenharmony_ci}
424362306a36Sopenharmony_ci
424462306a36Sopenharmony_cistatic void wcd9335_codec_apply_sido_voltage(struct wcd9335_codec *wcd,
424562306a36Sopenharmony_ci					     enum wcd9335_sido_voltage req_mv)
424662306a36Sopenharmony_ci{
424762306a36Sopenharmony_ci	struct snd_soc_component *comp = wcd->component;
424862306a36Sopenharmony_ci	int vout_d_val;
424962306a36Sopenharmony_ci
425062306a36Sopenharmony_ci	if (req_mv == wcd->sido_voltage)
425162306a36Sopenharmony_ci		return;
425262306a36Sopenharmony_ci
425362306a36Sopenharmony_ci	/* compute the vout_d step value */
425462306a36Sopenharmony_ci	vout_d_val = WCD9335_CALCULATE_VOUT_D(req_mv) &
425562306a36Sopenharmony_ci			WCD9335_ANA_BUCK_VOUT_MASK;
425662306a36Sopenharmony_ci	snd_soc_component_write(comp, WCD9335_ANA_BUCK_VOUT_D, vout_d_val);
425762306a36Sopenharmony_ci	snd_soc_component_update_bits(comp, WCD9335_ANA_BUCK_CTL,
425862306a36Sopenharmony_ci				WCD9335_ANA_BUCK_CTL_RAMP_START_MASK,
425962306a36Sopenharmony_ci				WCD9335_ANA_BUCK_CTL_RAMP_START_ENABLE);
426062306a36Sopenharmony_ci
426162306a36Sopenharmony_ci	/* 1 msec sleep required after SIDO Vout_D voltage change */
426262306a36Sopenharmony_ci	usleep_range(1000, 1100);
426362306a36Sopenharmony_ci	wcd->sido_voltage = req_mv;
426462306a36Sopenharmony_ci	snd_soc_component_update_bits(comp, WCD9335_ANA_BUCK_CTL,
426562306a36Sopenharmony_ci				WCD9335_ANA_BUCK_CTL_RAMP_START_MASK,
426662306a36Sopenharmony_ci				WCD9335_ANA_BUCK_CTL_RAMP_START_DISABLE);
426762306a36Sopenharmony_ci}
426862306a36Sopenharmony_ci
426962306a36Sopenharmony_cistatic int wcd9335_codec_update_sido_voltage(struct wcd9335_codec *wcd,
427062306a36Sopenharmony_ci					     enum wcd9335_sido_voltage req_mv)
427162306a36Sopenharmony_ci{
427262306a36Sopenharmony_ci	int ret = 0;
427362306a36Sopenharmony_ci
427462306a36Sopenharmony_ci	/* enable mclk before setting SIDO voltage */
427562306a36Sopenharmony_ci	ret = wcd9335_cdc_req_mclk_enable(wcd, true);
427662306a36Sopenharmony_ci	if (ret) {
427762306a36Sopenharmony_ci		dev_err(wcd->dev, "Ext clk enable failed\n");
427862306a36Sopenharmony_ci		goto err;
427962306a36Sopenharmony_ci	}
428062306a36Sopenharmony_ci
428162306a36Sopenharmony_ci	wcd9335_codec_apply_sido_voltage(wcd, req_mv);
428262306a36Sopenharmony_ci	wcd9335_cdc_req_mclk_enable(wcd, false);
428362306a36Sopenharmony_ci
428462306a36Sopenharmony_cierr:
428562306a36Sopenharmony_ci	return ret;
428662306a36Sopenharmony_ci}
428762306a36Sopenharmony_ci
428862306a36Sopenharmony_cistatic int _wcd9335_codec_enable_mclk(struct snd_soc_component *component,
428962306a36Sopenharmony_ci				      int enable)
429062306a36Sopenharmony_ci{
429162306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
429262306a36Sopenharmony_ci	int ret;
429362306a36Sopenharmony_ci
429462306a36Sopenharmony_ci	if (enable) {
429562306a36Sopenharmony_ci		ret = wcd9335_cdc_req_mclk_enable(wcd, true);
429662306a36Sopenharmony_ci		if (ret)
429762306a36Sopenharmony_ci			return ret;
429862306a36Sopenharmony_ci
429962306a36Sopenharmony_ci		wcd9335_codec_apply_sido_voltage(wcd,
430062306a36Sopenharmony_ci				SIDO_VOLTAGE_NOMINAL_MV);
430162306a36Sopenharmony_ci	} else {
430262306a36Sopenharmony_ci		wcd9335_codec_update_sido_voltage(wcd,
430362306a36Sopenharmony_ci					wcd->sido_voltage);
430462306a36Sopenharmony_ci		wcd9335_cdc_req_mclk_enable(wcd, false);
430562306a36Sopenharmony_ci	}
430662306a36Sopenharmony_ci
430762306a36Sopenharmony_ci	return 0;
430862306a36Sopenharmony_ci}
430962306a36Sopenharmony_ci
431062306a36Sopenharmony_cistatic int wcd9335_codec_enable_mclk(struct snd_soc_dapm_widget *w,
431162306a36Sopenharmony_ci				     struct snd_kcontrol *kc, int event)
431262306a36Sopenharmony_ci{
431362306a36Sopenharmony_ci	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
431462306a36Sopenharmony_ci
431562306a36Sopenharmony_ci	switch (event) {
431662306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
431762306a36Sopenharmony_ci		return _wcd9335_codec_enable_mclk(comp, true);
431862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
431962306a36Sopenharmony_ci		return _wcd9335_codec_enable_mclk(comp, false);
432062306a36Sopenharmony_ci	}
432162306a36Sopenharmony_ci
432262306a36Sopenharmony_ci	return 0;
432362306a36Sopenharmony_ci}
432462306a36Sopenharmony_ci
432562306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget wcd9335_dapm_widgets[] = {
432662306a36Sopenharmony_ci	/* TODO SPK1 & SPK2 OUT*/
432762306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("EAR"),
432862306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HPHL"),
432962306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HPHR"),
433062306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LINEOUT1"),
433162306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LINEOUT2"),
433262306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LINEOUT3"),
433362306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LINEOUT4"),
433462306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN_E("AIF1 PB", "AIF1 Playback", 0, SND_SOC_NOPM,
433562306a36Sopenharmony_ci				AIF1_PB, 0, wcd9335_codec_enable_slim,
433662306a36Sopenharmony_ci				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
433762306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN_E("AIF2 PB", "AIF2 Playback", 0, SND_SOC_NOPM,
433862306a36Sopenharmony_ci				AIF2_PB, 0, wcd9335_codec_enable_slim,
433962306a36Sopenharmony_ci				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
434062306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN_E("AIF3 PB", "AIF3 Playback", 0, SND_SOC_NOPM,
434162306a36Sopenharmony_ci				AIF3_PB, 0, wcd9335_codec_enable_slim,
434262306a36Sopenharmony_ci				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
434362306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN_E("AIF4 PB", "AIF4 Playback", 0, SND_SOC_NOPM,
434462306a36Sopenharmony_ci				AIF4_PB, 0, wcd9335_codec_enable_slim,
434562306a36Sopenharmony_ci				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
434662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX0 MUX", SND_SOC_NOPM, WCD9335_RX0, 0,
434762306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX0]),
434862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX1 MUX", SND_SOC_NOPM, WCD9335_RX1, 0,
434962306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX1]),
435062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX2 MUX", SND_SOC_NOPM, WCD9335_RX2, 0,
435162306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX2]),
435262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX3 MUX", SND_SOC_NOPM, WCD9335_RX3, 0,
435362306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX3]),
435462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX4 MUX", SND_SOC_NOPM, WCD9335_RX4, 0,
435562306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX4]),
435662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX5 MUX", SND_SOC_NOPM, WCD9335_RX5, 0,
435762306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX5]),
435862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX6 MUX", SND_SOC_NOPM, WCD9335_RX6, 0,
435962306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX6]),
436062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM RX7 MUX", SND_SOC_NOPM, WCD9335_RX7, 0,
436162306a36Sopenharmony_ci				&slim_rx_mux[WCD9335_RX7]),
436262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
436362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
436462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
436562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
436662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
436762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
436862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX6", SND_SOC_NOPM, 0, 0, NULL, 0),
436962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("SLIM RX7", SND_SOC_NOPM, 0, 0, NULL, 0),
437062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", WCD9335_CDC_RX0_RX_PATH_MIX_CTL,
437162306a36Sopenharmony_ci			5, 0, &rx_int0_2_mux, wcd9335_codec_enable_mix_path,
437262306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
437362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", WCD9335_CDC_RX1_RX_PATH_MIX_CTL,
437462306a36Sopenharmony_ci			5, 0, &rx_int1_2_mux, wcd9335_codec_enable_mix_path,
437562306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
437662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", WCD9335_CDC_RX2_RX_PATH_MIX_CTL,
437762306a36Sopenharmony_ci			5, 0, &rx_int2_2_mux, wcd9335_codec_enable_mix_path,
437862306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
437962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT3_2 MUX", WCD9335_CDC_RX3_RX_PATH_MIX_CTL,
438062306a36Sopenharmony_ci			5, 0, &rx_int3_2_mux, wcd9335_codec_enable_mix_path,
438162306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
438262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT4_2 MUX", WCD9335_CDC_RX4_RX_PATH_MIX_CTL,
438362306a36Sopenharmony_ci			5, 0, &rx_int4_2_mux, wcd9335_codec_enable_mix_path,
438462306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
438562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT5_2 MUX", WCD9335_CDC_RX5_RX_PATH_MIX_CTL,
438662306a36Sopenharmony_ci			5, 0, &rx_int5_2_mux, wcd9335_codec_enable_mix_path,
438762306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
438862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT6_2 MUX", WCD9335_CDC_RX6_RX_PATH_MIX_CTL,
438962306a36Sopenharmony_ci			5, 0, &rx_int6_2_mux, wcd9335_codec_enable_mix_path,
439062306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
439162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT7_2 MUX", WCD9335_CDC_RX7_RX_PATH_MIX_CTL,
439262306a36Sopenharmony_ci			5, 0, &rx_int7_2_mux, wcd9335_codec_enable_mix_path,
439362306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
439462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT8_2 MUX", WCD9335_CDC_RX8_RX_PATH_MIX_CTL,
439562306a36Sopenharmony_ci			5, 0, &rx_int8_2_mux, wcd9335_codec_enable_mix_path,
439662306a36Sopenharmony_ci			SND_SOC_DAPM_POST_PMU),
439762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
439862306a36Sopenharmony_ci		&rx_int0_1_mix_inp0_mux),
439962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
440062306a36Sopenharmony_ci		&rx_int0_1_mix_inp1_mux),
440162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
440262306a36Sopenharmony_ci		&rx_int0_1_mix_inp2_mux),
440362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
440462306a36Sopenharmony_ci		&rx_int1_1_mix_inp0_mux),
440562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
440662306a36Sopenharmony_ci		&rx_int1_1_mix_inp1_mux),
440762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
440862306a36Sopenharmony_ci		&rx_int1_1_mix_inp2_mux),
440962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
441062306a36Sopenharmony_ci		&rx_int2_1_mix_inp0_mux),
441162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
441262306a36Sopenharmony_ci		&rx_int2_1_mix_inp1_mux),
441362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
441462306a36Sopenharmony_ci		&rx_int2_1_mix_inp2_mux),
441562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
441662306a36Sopenharmony_ci		&rx_int3_1_mix_inp0_mux),
441762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
441862306a36Sopenharmony_ci		&rx_int3_1_mix_inp1_mux),
441962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
442062306a36Sopenharmony_ci		&rx_int3_1_mix_inp2_mux),
442162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
442262306a36Sopenharmony_ci		&rx_int4_1_mix_inp0_mux),
442362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
442462306a36Sopenharmony_ci		&rx_int4_1_mix_inp1_mux),
442562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
442662306a36Sopenharmony_ci		&rx_int4_1_mix_inp2_mux),
442762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
442862306a36Sopenharmony_ci		&rx_int5_1_mix_inp0_mux),
442962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
443062306a36Sopenharmony_ci		&rx_int5_1_mix_inp1_mux),
443162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
443262306a36Sopenharmony_ci		&rx_int5_1_mix_inp2_mux),
443362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
443462306a36Sopenharmony_ci		&rx_int6_1_mix_inp0_mux),
443562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
443662306a36Sopenharmony_ci		&rx_int6_1_mix_inp1_mux),
443762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
443862306a36Sopenharmony_ci		&rx_int6_1_mix_inp2_mux),
443962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
444062306a36Sopenharmony_ci		&rx_int7_1_mix_inp0_mux),
444162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
444262306a36Sopenharmony_ci		&rx_int7_1_mix_inp1_mux),
444362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
444462306a36Sopenharmony_ci		&rx_int7_1_mix_inp2_mux),
444562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
444662306a36Sopenharmony_ci		&rx_int8_1_mix_inp0_mux),
444762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
444862306a36Sopenharmony_ci		&rx_int8_1_mix_inp1_mux),
444962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
445062306a36Sopenharmony_ci		&rx_int8_1_mix_inp2_mux),
445162306a36Sopenharmony_ci
445262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
445462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
445662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
445862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT3_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT3 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT4_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT4 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT5_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT5 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT6_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT6 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT7_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT7 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT8_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT8 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
447062306a36Sopenharmony_ci
447162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT3 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT4 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT5 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT6 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT7 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("RX INT8 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
448062306a36Sopenharmony_ci
448162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT0 DEM MUX", SND_SOC_NOPM, 0, 0,
448262306a36Sopenharmony_ci		&rx_int0_dem_inp_mux),
448362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0,
448462306a36Sopenharmony_ci		&rx_int1_dem_inp_mux),
448562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("RX INT2 DEM MUX", SND_SOC_NOPM, 0, 0,
448662306a36Sopenharmony_ci		&rx_int2_dem_inp_mux),
448762306a36Sopenharmony_ci
448862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT0 INTERP", SND_SOC_NOPM,
448962306a36Sopenharmony_ci		INTERP_EAR, 0, &rx_int0_interp_mux,
449062306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
449162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
449262306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
449362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT1 INTERP", SND_SOC_NOPM,
449462306a36Sopenharmony_ci		INTERP_HPHL, 0, &rx_int1_interp_mux,
449562306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
449662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
449762306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
449862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT2 INTERP", SND_SOC_NOPM,
449962306a36Sopenharmony_ci		INTERP_HPHR, 0, &rx_int2_interp_mux,
450062306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
450162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
450262306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
450362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT3 INTERP", SND_SOC_NOPM,
450462306a36Sopenharmony_ci		INTERP_LO1, 0, &rx_int3_interp_mux,
450562306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
450662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
450762306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
450862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT4 INTERP", SND_SOC_NOPM,
450962306a36Sopenharmony_ci		INTERP_LO2, 0, &rx_int4_interp_mux,
451062306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
451162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
451262306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
451362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT5 INTERP", SND_SOC_NOPM,
451462306a36Sopenharmony_ci		INTERP_LO3, 0, &rx_int5_interp_mux,
451562306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
451662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
451762306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
451862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT6 INTERP", SND_SOC_NOPM,
451962306a36Sopenharmony_ci		INTERP_LO4, 0, &rx_int6_interp_mux,
452062306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
452162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
452262306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
452362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT7 INTERP", SND_SOC_NOPM,
452462306a36Sopenharmony_ci		INTERP_SPKR1, 0, &rx_int7_interp_mux,
452562306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
452662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
452762306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
452862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RX INT8 INTERP", SND_SOC_NOPM,
452962306a36Sopenharmony_ci		INTERP_SPKR2, 0, &rx_int8_interp_mux,
453062306a36Sopenharmony_ci		wcd9335_codec_enable_interpolator,
453162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
453262306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
453362306a36Sopenharmony_ci
453462306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT0 DAC", NULL, SND_SOC_NOPM,
453562306a36Sopenharmony_ci		0, 0, wcd9335_codec_ear_dac_event,
453662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
453762306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
453862306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT1 DAC", NULL, WCD9335_ANA_HPH,
453962306a36Sopenharmony_ci		5, 0, wcd9335_codec_hphl_dac_event,
454062306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
454162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
454262306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT2 DAC", NULL, WCD9335_ANA_HPH,
454362306a36Sopenharmony_ci		4, 0, wcd9335_codec_hphr_dac_event,
454462306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
454562306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
454662306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT3 DAC", NULL, SND_SOC_NOPM,
454762306a36Sopenharmony_ci		0, 0, wcd9335_codec_lineout_dac_event,
454862306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
454962306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT4 DAC", NULL, SND_SOC_NOPM,
455062306a36Sopenharmony_ci		0, 0, wcd9335_codec_lineout_dac_event,
455162306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
455262306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT5 DAC", NULL, SND_SOC_NOPM,
455362306a36Sopenharmony_ci		0, 0, wcd9335_codec_lineout_dac_event,
455462306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
455562306a36Sopenharmony_ci	SND_SOC_DAPM_DAC_E("RX INT6 DAC", NULL, SND_SOC_NOPM,
455662306a36Sopenharmony_ci		0, 0, wcd9335_codec_lineout_dac_event,
455762306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
455862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("HPHL PA", WCD9335_ANA_HPH, 7, 0, NULL, 0,
455962306a36Sopenharmony_ci			   wcd9335_codec_enable_hphl_pa,
456062306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
456162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
456262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("HPHR PA", WCD9335_ANA_HPH, 6, 0, NULL, 0,
456362306a36Sopenharmony_ci			   wcd9335_codec_enable_hphr_pa,
456462306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
456562306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
456662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("EAR PA", WCD9335_ANA_EAR, 7, 0, NULL, 0,
456762306a36Sopenharmony_ci			   wcd9335_codec_enable_ear_pa,
456862306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMU |
456962306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMD),
457062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("LINEOUT1 PA", WCD9335_ANA_LO_1_2, 7, 0, NULL, 0,
457162306a36Sopenharmony_ci			   wcd9335_codec_enable_lineout_pa,
457262306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMU |
457362306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMD),
457462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("LINEOUT2 PA", WCD9335_ANA_LO_1_2, 6, 0, NULL, 0,
457562306a36Sopenharmony_ci			   wcd9335_codec_enable_lineout_pa,
457662306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMU |
457762306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMD),
457862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("LINEOUT3 PA", WCD9335_ANA_LO_3_4, 7, 0, NULL, 0,
457962306a36Sopenharmony_ci			   wcd9335_codec_enable_lineout_pa,
458062306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMU |
458162306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMD),
458262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("LINEOUT4 PA", WCD9335_ANA_LO_3_4, 6, 0, NULL, 0,
458362306a36Sopenharmony_ci			   wcd9335_codec_enable_lineout_pa,
458462306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMU |
458562306a36Sopenharmony_ci			   SND_SOC_DAPM_POST_PMD),
458662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("RX_BIAS", SND_SOC_NOPM, 0, 0,
458762306a36Sopenharmony_ci		wcd9335_codec_enable_rx_bias, SND_SOC_DAPM_PRE_PMU |
458862306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
458962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MCLK",  SND_SOC_NOPM, 0, 0,
459062306a36Sopenharmony_ci		wcd9335_codec_enable_mclk, SND_SOC_DAPM_PRE_PMU |
459162306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
459262306a36Sopenharmony_ci
459362306a36Sopenharmony_ci	/* TX */
459462306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AMIC1"),
459562306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AMIC2"),
459662306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AMIC3"),
459762306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AMIC4"),
459862306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AMIC5"),
459962306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AMIC6"),
460062306a36Sopenharmony_ci
460162306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM,
460262306a36Sopenharmony_ci		AIF1_CAP, 0, wcd9335_codec_enable_slim,
460362306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
460462306a36Sopenharmony_ci
460562306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM,
460662306a36Sopenharmony_ci		AIF2_CAP, 0, wcd9335_codec_enable_slim,
460762306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
460862306a36Sopenharmony_ci
460962306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM,
461062306a36Sopenharmony_ci		AIF3_CAP, 0, wcd9335_codec_enable_slim,
461162306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
461262306a36Sopenharmony_ci
461362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, 0, 0,
461462306a36Sopenharmony_ci			       wcd9335_codec_enable_micbias,
461562306a36Sopenharmony_ci			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
461662306a36Sopenharmony_ci			       SND_SOC_DAPM_POST_PMD),
461762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, 0, 0,
461862306a36Sopenharmony_ci			       wcd9335_codec_enable_micbias,
461962306a36Sopenharmony_ci			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
462062306a36Sopenharmony_ci			       SND_SOC_DAPM_POST_PMD),
462162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, 0, 0,
462262306a36Sopenharmony_ci			       wcd9335_codec_enable_micbias,
462362306a36Sopenharmony_ci			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
462462306a36Sopenharmony_ci			       SND_SOC_DAPM_POST_PMD),
462562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MIC BIAS4", SND_SOC_NOPM, 0, 0,
462662306a36Sopenharmony_ci			       wcd9335_codec_enable_micbias,
462762306a36Sopenharmony_ci			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
462862306a36Sopenharmony_ci			       SND_SOC_DAPM_POST_PMD),
462962306a36Sopenharmony_ci
463062306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD9335_ANA_AMIC1, 7, 0,
463162306a36Sopenharmony_ci			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
463262306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD9335_ANA_AMIC2, 7, 0,
463362306a36Sopenharmony_ci			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
463462306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD9335_ANA_AMIC3, 7, 0,
463562306a36Sopenharmony_ci			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
463662306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD9335_ANA_AMIC4, 7, 0,
463762306a36Sopenharmony_ci			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
463862306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("ADC5", NULL, WCD9335_ANA_AMIC5, 7, 0,
463962306a36Sopenharmony_ci			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
464062306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("ADC6", NULL, WCD9335_ANA_AMIC6, 7, 0,
464162306a36Sopenharmony_ci			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
464262306a36Sopenharmony_ci
464362306a36Sopenharmony_ci	/* Digital Mic Inputs */
464462306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0,
464562306a36Sopenharmony_ci		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
464662306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
464762306a36Sopenharmony_ci
464862306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
464962306a36Sopenharmony_ci		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
465062306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
465162306a36Sopenharmony_ci
465262306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0,
465362306a36Sopenharmony_ci		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
465462306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
465562306a36Sopenharmony_ci
465662306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0,
465762306a36Sopenharmony_ci		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
465862306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
465962306a36Sopenharmony_ci
466062306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0,
466162306a36Sopenharmony_ci		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
466262306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
466362306a36Sopenharmony_ci
466462306a36Sopenharmony_ci	SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0,
466562306a36Sopenharmony_ci		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
466662306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMD),
466762306a36Sopenharmony_ci
466862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX0", SND_SOC_NOPM, 0, 0,
466962306a36Sopenharmony_ci		&tx_dmic_mux0),
467062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX1", SND_SOC_NOPM, 0, 0,
467162306a36Sopenharmony_ci		&tx_dmic_mux1),
467262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX2", SND_SOC_NOPM, 0, 0,
467362306a36Sopenharmony_ci		&tx_dmic_mux2),
467462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX3", SND_SOC_NOPM, 0, 0,
467562306a36Sopenharmony_ci		&tx_dmic_mux3),
467662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX4", SND_SOC_NOPM, 0, 0,
467762306a36Sopenharmony_ci		&tx_dmic_mux4),
467862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX5", SND_SOC_NOPM, 0, 0,
467962306a36Sopenharmony_ci		&tx_dmic_mux5),
468062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX6", SND_SOC_NOPM, 0, 0,
468162306a36Sopenharmony_ci		&tx_dmic_mux6),
468262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX7", SND_SOC_NOPM, 0, 0,
468362306a36Sopenharmony_ci		&tx_dmic_mux7),
468462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC MUX8", SND_SOC_NOPM, 0, 0,
468562306a36Sopenharmony_ci		&tx_dmic_mux8),
468662306a36Sopenharmony_ci
468762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX0", SND_SOC_NOPM, 0, 0,
468862306a36Sopenharmony_ci		&tx_amic_mux0),
468962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX1", SND_SOC_NOPM, 0, 0,
469062306a36Sopenharmony_ci		&tx_amic_mux1),
469162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX2", SND_SOC_NOPM, 0, 0,
469262306a36Sopenharmony_ci		&tx_amic_mux2),
469362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX3", SND_SOC_NOPM, 0, 0,
469462306a36Sopenharmony_ci		&tx_amic_mux3),
469562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX4", SND_SOC_NOPM, 0, 0,
469662306a36Sopenharmony_ci		&tx_amic_mux4),
469762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX5", SND_SOC_NOPM, 0, 0,
469862306a36Sopenharmony_ci		&tx_amic_mux5),
469962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX6", SND_SOC_NOPM, 0, 0,
470062306a36Sopenharmony_ci		&tx_amic_mux6),
470162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX7", SND_SOC_NOPM, 0, 0,
470262306a36Sopenharmony_ci		&tx_amic_mux7),
470362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AMIC MUX8", SND_SOC_NOPM, 0, 0,
470462306a36Sopenharmony_ci		&tx_amic_mux8),
470562306a36Sopenharmony_ci
470662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0,
470762306a36Sopenharmony_ci		aif1_cap_mixer, ARRAY_SIZE(aif1_cap_mixer)),
470862306a36Sopenharmony_ci
470962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0,
471062306a36Sopenharmony_ci		aif2_cap_mixer, ARRAY_SIZE(aif2_cap_mixer)),
471162306a36Sopenharmony_ci
471262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0,
471362306a36Sopenharmony_ci		aif3_cap_mixer, ARRAY_SIZE(aif3_cap_mixer)),
471462306a36Sopenharmony_ci
471562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX0 MUX", SND_SOC_NOPM, WCD9335_TX0, 0,
471662306a36Sopenharmony_ci		&sb_tx0_mux),
471762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX1 MUX", SND_SOC_NOPM, WCD9335_TX1, 0,
471862306a36Sopenharmony_ci		&sb_tx1_mux),
471962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX2 MUX", SND_SOC_NOPM, WCD9335_TX2, 0,
472062306a36Sopenharmony_ci		&sb_tx2_mux),
472162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX3 MUX", SND_SOC_NOPM, WCD9335_TX3, 0,
472262306a36Sopenharmony_ci		&sb_tx3_mux),
472362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX4 MUX", SND_SOC_NOPM, WCD9335_TX4, 0,
472462306a36Sopenharmony_ci		&sb_tx4_mux),
472562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX5 MUX", SND_SOC_NOPM, WCD9335_TX5, 0,
472662306a36Sopenharmony_ci		&sb_tx5_mux),
472762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX6 MUX", SND_SOC_NOPM, WCD9335_TX6, 0,
472862306a36Sopenharmony_ci		&sb_tx6_mux),
472962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX7 MUX", SND_SOC_NOPM, WCD9335_TX7, 0,
473062306a36Sopenharmony_ci		&sb_tx7_mux),
473162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLIM TX8 MUX", SND_SOC_NOPM, WCD9335_TX8, 0,
473262306a36Sopenharmony_ci		&sb_tx8_mux),
473362306a36Sopenharmony_ci
473462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX0", WCD9335_CDC_TX0_TX_PATH_CTL, 5, 0,
473562306a36Sopenharmony_ci			   &tx_adc_mux0, wcd9335_codec_enable_dec,
473662306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
473762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
473862306a36Sopenharmony_ci
473962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX1", WCD9335_CDC_TX1_TX_PATH_CTL, 5, 0,
474062306a36Sopenharmony_ci			   &tx_adc_mux1, wcd9335_codec_enable_dec,
474162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
474262306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
474362306a36Sopenharmony_ci
474462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX2", WCD9335_CDC_TX2_TX_PATH_CTL, 5, 0,
474562306a36Sopenharmony_ci			   &tx_adc_mux2, wcd9335_codec_enable_dec,
474662306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
474762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
474862306a36Sopenharmony_ci
474962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX3", WCD9335_CDC_TX3_TX_PATH_CTL, 5, 0,
475062306a36Sopenharmony_ci			   &tx_adc_mux3, wcd9335_codec_enable_dec,
475162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
475262306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
475362306a36Sopenharmony_ci
475462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX4", WCD9335_CDC_TX4_TX_PATH_CTL, 5, 0,
475562306a36Sopenharmony_ci			   &tx_adc_mux4, wcd9335_codec_enable_dec,
475662306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
475762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
475862306a36Sopenharmony_ci
475962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX5", WCD9335_CDC_TX5_TX_PATH_CTL, 5, 0,
476062306a36Sopenharmony_ci			   &tx_adc_mux5, wcd9335_codec_enable_dec,
476162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
476262306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
476362306a36Sopenharmony_ci
476462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX6", WCD9335_CDC_TX6_TX_PATH_CTL, 5, 0,
476562306a36Sopenharmony_ci			   &tx_adc_mux6, wcd9335_codec_enable_dec,
476662306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
476762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
476862306a36Sopenharmony_ci
476962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX7", WCD9335_CDC_TX7_TX_PATH_CTL, 5, 0,
477062306a36Sopenharmony_ci			   &tx_adc_mux7, wcd9335_codec_enable_dec,
477162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
477262306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
477362306a36Sopenharmony_ci
477462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC MUX8", WCD9335_CDC_TX8_TX_PATH_CTL, 5, 0,
477562306a36Sopenharmony_ci			   &tx_adc_mux8, wcd9335_codec_enable_dec,
477662306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
477762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
477862306a36Sopenharmony_ci};
477962306a36Sopenharmony_ci
478062306a36Sopenharmony_cistatic void wcd9335_enable_sido_buck(struct snd_soc_component *component)
478162306a36Sopenharmony_ci{
478262306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
478362306a36Sopenharmony_ci
478462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_ANA_RCO,
478562306a36Sopenharmony_ci					WCD9335_ANA_RCO_BG_EN_MASK,
478662306a36Sopenharmony_ci					WCD9335_ANA_RCO_BG_ENABLE);
478762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_ANA_BUCK_CTL,
478862306a36Sopenharmony_ci					WCD9335_ANA_BUCK_CTL_VOUT_D_IREF_MASK,
478962306a36Sopenharmony_ci					WCD9335_ANA_BUCK_CTL_VOUT_D_IREF_EXT);
479062306a36Sopenharmony_ci	/* 100us sleep needed after IREF settings */
479162306a36Sopenharmony_ci	usleep_range(100, 110);
479262306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WCD9335_ANA_BUCK_CTL,
479362306a36Sopenharmony_ci					WCD9335_ANA_BUCK_CTL_VOUT_D_VREF_MASK,
479462306a36Sopenharmony_ci					WCD9335_ANA_BUCK_CTL_VOUT_D_VREF_EXT);
479562306a36Sopenharmony_ci	/* 100us sleep needed after VREF settings */
479662306a36Sopenharmony_ci	usleep_range(100, 110);
479762306a36Sopenharmony_ci	wcd->sido_input_src = SIDO_SOURCE_RCO_BG;
479862306a36Sopenharmony_ci}
479962306a36Sopenharmony_ci
480062306a36Sopenharmony_cistatic int wcd9335_enable_efuse_sensing(struct snd_soc_component *comp)
480162306a36Sopenharmony_ci{
480262306a36Sopenharmony_ci	_wcd9335_codec_enable_mclk(comp, true);
480362306a36Sopenharmony_ci	snd_soc_component_update_bits(comp,
480462306a36Sopenharmony_ci				WCD9335_CHIP_TIER_CTRL_EFUSE_CTL,
480562306a36Sopenharmony_ci				WCD9335_CHIP_TIER_CTRL_EFUSE_EN_MASK,
480662306a36Sopenharmony_ci				WCD9335_CHIP_TIER_CTRL_EFUSE_ENABLE);
480762306a36Sopenharmony_ci	/*
480862306a36Sopenharmony_ci	 * 5ms sleep required after enabling efuse control
480962306a36Sopenharmony_ci	 * before checking the status.
481062306a36Sopenharmony_ci	 */
481162306a36Sopenharmony_ci	usleep_range(5000, 5500);
481262306a36Sopenharmony_ci
481362306a36Sopenharmony_ci	if (!(snd_soc_component_read(comp,
481462306a36Sopenharmony_ci					WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS) &
481562306a36Sopenharmony_ci					WCD9335_CHIP_TIER_CTRL_EFUSE_EN_MASK))
481662306a36Sopenharmony_ci		WARN(1, "%s: Efuse sense is not complete\n", __func__);
481762306a36Sopenharmony_ci
481862306a36Sopenharmony_ci	wcd9335_enable_sido_buck(comp);
481962306a36Sopenharmony_ci	_wcd9335_codec_enable_mclk(comp, false);
482062306a36Sopenharmony_ci
482162306a36Sopenharmony_ci	return 0;
482262306a36Sopenharmony_ci}
482362306a36Sopenharmony_ci
482462306a36Sopenharmony_cistatic void wcd9335_codec_init(struct snd_soc_component *component)
482562306a36Sopenharmony_ci{
482662306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
482762306a36Sopenharmony_ci	int i;
482862306a36Sopenharmony_ci
482962306a36Sopenharmony_ci	/* ungate MCLK and set clk rate */
483062306a36Sopenharmony_ci	regmap_update_bits(wcd->regmap, WCD9335_CODEC_RPM_CLK_GATE,
483162306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_GATE_MCLK_GATE_MASK, 0);
483262306a36Sopenharmony_ci
483362306a36Sopenharmony_ci	regmap_update_bits(wcd->regmap, WCD9335_CODEC_RPM_CLK_MCLK_CFG,
483462306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
483562306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG_9P6MHZ);
483662306a36Sopenharmony_ci
483762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wcd9335_codec_reg_init); i++)
483862306a36Sopenharmony_ci		snd_soc_component_update_bits(component,
483962306a36Sopenharmony_ci					wcd9335_codec_reg_init[i].reg,
484062306a36Sopenharmony_ci					wcd9335_codec_reg_init[i].mask,
484162306a36Sopenharmony_ci					wcd9335_codec_reg_init[i].val);
484262306a36Sopenharmony_ci
484362306a36Sopenharmony_ci	wcd9335_enable_efuse_sensing(component);
484462306a36Sopenharmony_ci}
484562306a36Sopenharmony_ci
484662306a36Sopenharmony_cistatic int wcd9335_codec_probe(struct snd_soc_component *component)
484762306a36Sopenharmony_ci{
484862306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
484962306a36Sopenharmony_ci	int ret;
485062306a36Sopenharmony_ci	int i;
485162306a36Sopenharmony_ci
485262306a36Sopenharmony_ci	snd_soc_component_init_regmap(component, wcd->regmap);
485362306a36Sopenharmony_ci	/* Class-H Init*/
485462306a36Sopenharmony_ci	wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, WCD9335);
485562306a36Sopenharmony_ci	if (IS_ERR(wcd->clsh_ctrl))
485662306a36Sopenharmony_ci		return PTR_ERR(wcd->clsh_ctrl);
485762306a36Sopenharmony_ci
485862306a36Sopenharmony_ci	/* Default HPH Mode to Class-H HiFi */
485962306a36Sopenharmony_ci	wcd->hph_mode = CLS_H_HIFI;
486062306a36Sopenharmony_ci	wcd->component = component;
486162306a36Sopenharmony_ci
486262306a36Sopenharmony_ci	wcd9335_codec_init(component);
486362306a36Sopenharmony_ci
486462306a36Sopenharmony_ci	for (i = 0; i < NUM_CODEC_DAIS; i++)
486562306a36Sopenharmony_ci		INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
486662306a36Sopenharmony_ci
486762306a36Sopenharmony_ci	ret = wcd9335_setup_irqs(wcd);
486862306a36Sopenharmony_ci	if (ret)
486962306a36Sopenharmony_ci		goto free_clsh_ctrl;
487062306a36Sopenharmony_ci
487162306a36Sopenharmony_ci	return 0;
487262306a36Sopenharmony_ci
487362306a36Sopenharmony_cifree_clsh_ctrl:
487462306a36Sopenharmony_ci	wcd_clsh_ctrl_free(wcd->clsh_ctrl);
487562306a36Sopenharmony_ci	return ret;
487662306a36Sopenharmony_ci}
487762306a36Sopenharmony_ci
487862306a36Sopenharmony_cistatic void wcd9335_codec_remove(struct snd_soc_component *comp)
487962306a36Sopenharmony_ci{
488062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
488162306a36Sopenharmony_ci
488262306a36Sopenharmony_ci	wcd_clsh_ctrl_free(wcd->clsh_ctrl);
488362306a36Sopenharmony_ci	wcd9335_teardown_irqs(wcd);
488462306a36Sopenharmony_ci}
488562306a36Sopenharmony_ci
488662306a36Sopenharmony_cistatic int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
488762306a36Sopenharmony_ci				    int clk_id, int source,
488862306a36Sopenharmony_ci				    unsigned int freq, int dir)
488962306a36Sopenharmony_ci{
489062306a36Sopenharmony_ci	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
489162306a36Sopenharmony_ci
489262306a36Sopenharmony_ci	wcd->mclk_rate = freq;
489362306a36Sopenharmony_ci
489462306a36Sopenharmony_ci	if (wcd->mclk_rate == WCD9335_MCLK_CLK_12P288MHZ)
489562306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
489662306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG,
489762306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
489862306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG_12P288MHZ);
489962306a36Sopenharmony_ci	else if (wcd->mclk_rate == WCD9335_MCLK_CLK_9P6MHZ)
490062306a36Sopenharmony_ci		snd_soc_component_update_bits(comp,
490162306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG,
490262306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
490362306a36Sopenharmony_ci				WCD9335_CODEC_RPM_CLK_MCLK_CFG_9P6MHZ);
490462306a36Sopenharmony_ci
490562306a36Sopenharmony_ci	return clk_set_rate(wcd->mclk, freq);
490662306a36Sopenharmony_ci}
490762306a36Sopenharmony_ci
490862306a36Sopenharmony_cistatic const struct snd_soc_component_driver wcd9335_component_drv = {
490962306a36Sopenharmony_ci	.probe = wcd9335_codec_probe,
491062306a36Sopenharmony_ci	.remove = wcd9335_codec_remove,
491162306a36Sopenharmony_ci	.set_sysclk = wcd9335_codec_set_sysclk,
491262306a36Sopenharmony_ci	.controls = wcd9335_snd_controls,
491362306a36Sopenharmony_ci	.num_controls = ARRAY_SIZE(wcd9335_snd_controls),
491462306a36Sopenharmony_ci	.dapm_widgets = wcd9335_dapm_widgets,
491562306a36Sopenharmony_ci	.num_dapm_widgets = ARRAY_SIZE(wcd9335_dapm_widgets),
491662306a36Sopenharmony_ci	.dapm_routes = wcd9335_audio_map,
491762306a36Sopenharmony_ci	.num_dapm_routes = ARRAY_SIZE(wcd9335_audio_map),
491862306a36Sopenharmony_ci	.endianness = 1,
491962306a36Sopenharmony_ci};
492062306a36Sopenharmony_ci
492162306a36Sopenharmony_cistatic int wcd9335_probe(struct wcd9335_codec *wcd)
492262306a36Sopenharmony_ci{
492362306a36Sopenharmony_ci	struct device *dev = wcd->dev;
492462306a36Sopenharmony_ci
492562306a36Sopenharmony_ci	memcpy(wcd->rx_chs, wcd9335_rx_chs, sizeof(wcd9335_rx_chs));
492662306a36Sopenharmony_ci	memcpy(wcd->tx_chs, wcd9335_tx_chs, sizeof(wcd9335_tx_chs));
492762306a36Sopenharmony_ci
492862306a36Sopenharmony_ci	wcd->sido_input_src = SIDO_SOURCE_INTERNAL;
492962306a36Sopenharmony_ci	wcd->sido_voltage = SIDO_VOLTAGE_NOMINAL_MV;
493062306a36Sopenharmony_ci
493162306a36Sopenharmony_ci	return devm_snd_soc_register_component(dev, &wcd9335_component_drv,
493262306a36Sopenharmony_ci					       wcd9335_slim_dais,
493362306a36Sopenharmony_ci					       ARRAY_SIZE(wcd9335_slim_dais));
493462306a36Sopenharmony_ci}
493562306a36Sopenharmony_ci
493662306a36Sopenharmony_cistatic const struct regmap_range_cfg wcd9335_ranges[] = {
493762306a36Sopenharmony_ci	{
493862306a36Sopenharmony_ci		.name = "WCD9335",
493962306a36Sopenharmony_ci		.range_min =  0x0,
494062306a36Sopenharmony_ci		.range_max =  WCD9335_MAX_REGISTER,
494162306a36Sopenharmony_ci		.selector_reg = WCD9335_SEL_REGISTER,
494262306a36Sopenharmony_ci		.selector_mask = 0xff,
494362306a36Sopenharmony_ci		.selector_shift = 0,
494462306a36Sopenharmony_ci		.window_start = 0x800,
494562306a36Sopenharmony_ci		.window_len = 0x100,
494662306a36Sopenharmony_ci	},
494762306a36Sopenharmony_ci};
494862306a36Sopenharmony_ci
494962306a36Sopenharmony_cistatic bool wcd9335_is_volatile_register(struct device *dev, unsigned int reg)
495062306a36Sopenharmony_ci{
495162306a36Sopenharmony_ci	switch (reg) {
495262306a36Sopenharmony_ci	case WCD9335_INTR_PIN1_STATUS0...WCD9335_INTR_PIN2_CLEAR3:
495362306a36Sopenharmony_ci	case WCD9335_ANA_MBHC_RESULT_3:
495462306a36Sopenharmony_ci	case WCD9335_ANA_MBHC_RESULT_2:
495562306a36Sopenharmony_ci	case WCD9335_ANA_MBHC_RESULT_1:
495662306a36Sopenharmony_ci	case WCD9335_ANA_MBHC_MECH:
495762306a36Sopenharmony_ci	case WCD9335_ANA_MBHC_ELECT:
495862306a36Sopenharmony_ci	case WCD9335_ANA_MBHC_ZDET:
495962306a36Sopenharmony_ci	case WCD9335_ANA_MICB2:
496062306a36Sopenharmony_ci	case WCD9335_ANA_RCO:
496162306a36Sopenharmony_ci	case WCD9335_ANA_BIAS:
496262306a36Sopenharmony_ci		return true;
496362306a36Sopenharmony_ci	default:
496462306a36Sopenharmony_ci		return false;
496562306a36Sopenharmony_ci	}
496662306a36Sopenharmony_ci}
496762306a36Sopenharmony_ci
496862306a36Sopenharmony_cistatic struct regmap_config wcd9335_regmap_config = {
496962306a36Sopenharmony_ci	.reg_bits = 16,
497062306a36Sopenharmony_ci	.val_bits = 8,
497162306a36Sopenharmony_ci	.cache_type = REGCACHE_MAPLE,
497262306a36Sopenharmony_ci	.max_register = WCD9335_MAX_REGISTER,
497362306a36Sopenharmony_ci	.can_multi_write = true,
497462306a36Sopenharmony_ci	.ranges = wcd9335_ranges,
497562306a36Sopenharmony_ci	.num_ranges = ARRAY_SIZE(wcd9335_ranges),
497662306a36Sopenharmony_ci	.volatile_reg = wcd9335_is_volatile_register,
497762306a36Sopenharmony_ci};
497862306a36Sopenharmony_ci
497962306a36Sopenharmony_cistatic const struct regmap_range_cfg wcd9335_ifc_ranges[] = {
498062306a36Sopenharmony_ci	{
498162306a36Sopenharmony_ci		.name = "WCD9335-IFC-DEV",
498262306a36Sopenharmony_ci		.range_min =  0x0,
498362306a36Sopenharmony_ci		.range_max = WCD9335_MAX_REGISTER,
498462306a36Sopenharmony_ci		.selector_reg = WCD9335_SEL_REGISTER,
498562306a36Sopenharmony_ci		.selector_mask = 0xfff,
498662306a36Sopenharmony_ci		.selector_shift = 0,
498762306a36Sopenharmony_ci		.window_start = 0x800,
498862306a36Sopenharmony_ci		.window_len = 0x400,
498962306a36Sopenharmony_ci	},
499062306a36Sopenharmony_ci};
499162306a36Sopenharmony_ci
499262306a36Sopenharmony_cistatic struct regmap_config wcd9335_ifc_regmap_config = {
499362306a36Sopenharmony_ci	.reg_bits = 16,
499462306a36Sopenharmony_ci	.val_bits = 8,
499562306a36Sopenharmony_ci	.can_multi_write = true,
499662306a36Sopenharmony_ci	.max_register = WCD9335_MAX_REGISTER,
499762306a36Sopenharmony_ci	.ranges = wcd9335_ifc_ranges,
499862306a36Sopenharmony_ci	.num_ranges = ARRAY_SIZE(wcd9335_ifc_ranges),
499962306a36Sopenharmony_ci};
500062306a36Sopenharmony_ci
500162306a36Sopenharmony_cistatic const struct regmap_irq wcd9335_codec_irqs[] = {
500262306a36Sopenharmony_ci	/* INTR_REG 0 */
500362306a36Sopenharmony_ci	[WCD9335_IRQ_SLIMBUS] = {
500462306a36Sopenharmony_ci		.reg_offset = 0,
500562306a36Sopenharmony_ci		.mask = BIT(0),
500662306a36Sopenharmony_ci		.type = {
500762306a36Sopenharmony_ci			.type_reg_offset = 0,
500862306a36Sopenharmony_ci			.types_supported = IRQ_TYPE_EDGE_BOTH,
500962306a36Sopenharmony_ci			.type_reg_mask	= BIT(0),
501062306a36Sopenharmony_ci		},
501162306a36Sopenharmony_ci	},
501262306a36Sopenharmony_ci};
501362306a36Sopenharmony_ci
501462306a36Sopenharmony_cistatic const unsigned int wcd9335_config_regs[] = {
501562306a36Sopenharmony_ci	WCD9335_INTR_LEVEL0,
501662306a36Sopenharmony_ci};
501762306a36Sopenharmony_ci
501862306a36Sopenharmony_cistatic const struct regmap_irq_chip wcd9335_regmap_irq1_chip = {
501962306a36Sopenharmony_ci	.name = "wcd9335_pin1_irq",
502062306a36Sopenharmony_ci	.status_base = WCD9335_INTR_PIN1_STATUS0,
502162306a36Sopenharmony_ci	.mask_base = WCD9335_INTR_PIN1_MASK0,
502262306a36Sopenharmony_ci	.ack_base = WCD9335_INTR_PIN1_CLEAR0,
502362306a36Sopenharmony_ci	.num_regs = 4,
502462306a36Sopenharmony_ci	.irqs = wcd9335_codec_irqs,
502562306a36Sopenharmony_ci	.num_irqs = ARRAY_SIZE(wcd9335_codec_irqs),
502662306a36Sopenharmony_ci	.config_base = wcd9335_config_regs,
502762306a36Sopenharmony_ci	.num_config_bases = ARRAY_SIZE(wcd9335_config_regs),
502862306a36Sopenharmony_ci	.num_config_regs = 4,
502962306a36Sopenharmony_ci	.set_type_config = regmap_irq_set_type_config_simple,
503062306a36Sopenharmony_ci};
503162306a36Sopenharmony_ci
503262306a36Sopenharmony_cistatic int wcd9335_parse_dt(struct wcd9335_codec *wcd)
503362306a36Sopenharmony_ci{
503462306a36Sopenharmony_ci	struct device *dev = wcd->dev;
503562306a36Sopenharmony_ci	struct device_node *np = dev->of_node;
503662306a36Sopenharmony_ci	int ret;
503762306a36Sopenharmony_ci
503862306a36Sopenharmony_ci	wcd->reset_gpio = of_get_named_gpio(np,	"reset-gpios", 0);
503962306a36Sopenharmony_ci	if (wcd->reset_gpio < 0) {
504062306a36Sopenharmony_ci		dev_err(dev, "Reset GPIO missing from DT\n");
504162306a36Sopenharmony_ci		return wcd->reset_gpio;
504262306a36Sopenharmony_ci	}
504362306a36Sopenharmony_ci
504462306a36Sopenharmony_ci	wcd->mclk = devm_clk_get(dev, "mclk");
504562306a36Sopenharmony_ci	if (IS_ERR(wcd->mclk)) {
504662306a36Sopenharmony_ci		dev_err(dev, "mclk not found\n");
504762306a36Sopenharmony_ci		return PTR_ERR(wcd->mclk);
504862306a36Sopenharmony_ci	}
504962306a36Sopenharmony_ci
505062306a36Sopenharmony_ci	wcd->native_clk = devm_clk_get(dev, "slimbus");
505162306a36Sopenharmony_ci	if (IS_ERR(wcd->native_clk)) {
505262306a36Sopenharmony_ci		dev_err(dev, "slimbus clock not found\n");
505362306a36Sopenharmony_ci		return PTR_ERR(wcd->native_clk);
505462306a36Sopenharmony_ci	}
505562306a36Sopenharmony_ci
505662306a36Sopenharmony_ci	wcd->supplies[0].supply = "vdd-buck";
505762306a36Sopenharmony_ci	wcd->supplies[1].supply = "vdd-buck-sido";
505862306a36Sopenharmony_ci	wcd->supplies[2].supply = "vdd-tx";
505962306a36Sopenharmony_ci	wcd->supplies[3].supply = "vdd-rx";
506062306a36Sopenharmony_ci	wcd->supplies[4].supply = "vdd-io";
506162306a36Sopenharmony_ci
506262306a36Sopenharmony_ci	ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies);
506362306a36Sopenharmony_ci	if (ret) {
506462306a36Sopenharmony_ci		dev_err(dev, "Failed to get supplies: err = %d\n", ret);
506562306a36Sopenharmony_ci		return ret;
506662306a36Sopenharmony_ci	}
506762306a36Sopenharmony_ci
506862306a36Sopenharmony_ci	return 0;
506962306a36Sopenharmony_ci}
507062306a36Sopenharmony_ci
507162306a36Sopenharmony_cistatic int wcd9335_power_on_reset(struct wcd9335_codec *wcd)
507262306a36Sopenharmony_ci{
507362306a36Sopenharmony_ci	struct device *dev = wcd->dev;
507462306a36Sopenharmony_ci	int ret;
507562306a36Sopenharmony_ci
507662306a36Sopenharmony_ci	ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies);
507762306a36Sopenharmony_ci	if (ret) {
507862306a36Sopenharmony_ci		dev_err(dev, "Failed to get supplies: err = %d\n", ret);
507962306a36Sopenharmony_ci		return ret;
508062306a36Sopenharmony_ci	}
508162306a36Sopenharmony_ci
508262306a36Sopenharmony_ci	/*
508362306a36Sopenharmony_ci	 * For WCD9335, it takes about 600us for the Vout_A and
508462306a36Sopenharmony_ci	 * Vout_D to be ready after BUCK_SIDO is powered up.
508562306a36Sopenharmony_ci	 * SYS_RST_N shouldn't be pulled high during this time
508662306a36Sopenharmony_ci	 * Toggle the reset line to make sure the reset pulse is
508762306a36Sopenharmony_ci	 * correctly applied
508862306a36Sopenharmony_ci	 */
508962306a36Sopenharmony_ci	usleep_range(600, 650);
509062306a36Sopenharmony_ci
509162306a36Sopenharmony_ci	gpio_direction_output(wcd->reset_gpio, 0);
509262306a36Sopenharmony_ci	msleep(20);
509362306a36Sopenharmony_ci	gpio_set_value(wcd->reset_gpio, 1);
509462306a36Sopenharmony_ci	msleep(20);
509562306a36Sopenharmony_ci
509662306a36Sopenharmony_ci	return 0;
509762306a36Sopenharmony_ci}
509862306a36Sopenharmony_ci
509962306a36Sopenharmony_cistatic int wcd9335_bring_up(struct wcd9335_codec *wcd)
510062306a36Sopenharmony_ci{
510162306a36Sopenharmony_ci	struct regmap *rm = wcd->regmap;
510262306a36Sopenharmony_ci	int val, byte0;
510362306a36Sopenharmony_ci
510462306a36Sopenharmony_ci	regmap_read(rm, WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, &val);
510562306a36Sopenharmony_ci	regmap_read(rm, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, &byte0);
510662306a36Sopenharmony_ci
510762306a36Sopenharmony_ci	if ((val < 0) || (byte0 < 0)) {
510862306a36Sopenharmony_ci		dev_err(wcd->dev, "WCD9335 CODEC version detection fail!\n");
510962306a36Sopenharmony_ci		return -EINVAL;
511062306a36Sopenharmony_ci	}
511162306a36Sopenharmony_ci
511262306a36Sopenharmony_ci	if (byte0 == 0x1) {
511362306a36Sopenharmony_ci		dev_info(wcd->dev, "WCD9335 CODEC version is v2.0\n");
511462306a36Sopenharmony_ci		wcd->version = WCD9335_VERSION_2_0;
511562306a36Sopenharmony_ci		regmap_write(rm, WCD9335_CODEC_RPM_RST_CTL, 0x01);
511662306a36Sopenharmony_ci		regmap_write(rm, WCD9335_SIDO_SIDO_TEST_2, 0x00);
511762306a36Sopenharmony_ci		regmap_write(rm, WCD9335_SIDO_SIDO_CCL_8, 0x6F);
511862306a36Sopenharmony_ci		regmap_write(rm, WCD9335_BIAS_VBG_FINE_ADJ, 0x65);
511962306a36Sopenharmony_ci		regmap_write(rm, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x5);
512062306a36Sopenharmony_ci		regmap_write(rm, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x7);
512162306a36Sopenharmony_ci		regmap_write(rm, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x3);
512262306a36Sopenharmony_ci		regmap_write(rm, WCD9335_CODEC_RPM_RST_CTL, 0x3);
512362306a36Sopenharmony_ci	} else {
512462306a36Sopenharmony_ci		dev_err(wcd->dev, "WCD9335 CODEC version not supported\n");
512562306a36Sopenharmony_ci		return -EINVAL;
512662306a36Sopenharmony_ci	}
512762306a36Sopenharmony_ci
512862306a36Sopenharmony_ci	return 0;
512962306a36Sopenharmony_ci}
513062306a36Sopenharmony_ci
513162306a36Sopenharmony_cistatic int wcd9335_irq_init(struct wcd9335_codec *wcd)
513262306a36Sopenharmony_ci{
513362306a36Sopenharmony_ci	int ret;
513462306a36Sopenharmony_ci
513562306a36Sopenharmony_ci	/*
513662306a36Sopenharmony_ci	 * INTR1 consists of all possible interrupt sources Ear OCP,
513762306a36Sopenharmony_ci	 * HPH OCP, MBHC, MAD, VBAT, and SVA
513862306a36Sopenharmony_ci	 * INTR2 is a subset of first interrupt sources MAD, VBAT, and SVA
513962306a36Sopenharmony_ci	 */
514062306a36Sopenharmony_ci	wcd->intr1 = of_irq_get_byname(wcd->dev->of_node, "intr1");
514162306a36Sopenharmony_ci	if (wcd->intr1 < 0)
514262306a36Sopenharmony_ci		return dev_err_probe(wcd->dev, wcd->intr1,
514362306a36Sopenharmony_ci				     "Unable to configure IRQ\n");
514462306a36Sopenharmony_ci
514562306a36Sopenharmony_ci	ret = devm_regmap_add_irq_chip(wcd->dev, wcd->regmap, wcd->intr1,
514662306a36Sopenharmony_ci				 IRQF_TRIGGER_HIGH, 0,
514762306a36Sopenharmony_ci				 &wcd9335_regmap_irq1_chip, &wcd->irq_data);
514862306a36Sopenharmony_ci	if (ret)
514962306a36Sopenharmony_ci		return dev_err_probe(wcd->dev, ret, "Failed to register IRQ chip\n");
515062306a36Sopenharmony_ci
515162306a36Sopenharmony_ci	return 0;
515262306a36Sopenharmony_ci}
515362306a36Sopenharmony_ci
515462306a36Sopenharmony_cistatic int wcd9335_slim_probe(struct slim_device *slim)
515562306a36Sopenharmony_ci{
515662306a36Sopenharmony_ci	struct device *dev = &slim->dev;
515762306a36Sopenharmony_ci	struct wcd9335_codec *wcd;
515862306a36Sopenharmony_ci	int ret;
515962306a36Sopenharmony_ci
516062306a36Sopenharmony_ci	wcd = devm_kzalloc(dev, sizeof(*wcd), GFP_KERNEL);
516162306a36Sopenharmony_ci	if (!wcd)
516262306a36Sopenharmony_ci		return	-ENOMEM;
516362306a36Sopenharmony_ci
516462306a36Sopenharmony_ci	wcd->dev = dev;
516562306a36Sopenharmony_ci	ret = wcd9335_parse_dt(wcd);
516662306a36Sopenharmony_ci	if (ret) {
516762306a36Sopenharmony_ci		dev_err(dev, "Error parsing DT: %d\n", ret);
516862306a36Sopenharmony_ci		return ret;
516962306a36Sopenharmony_ci	}
517062306a36Sopenharmony_ci
517162306a36Sopenharmony_ci	ret = wcd9335_power_on_reset(wcd);
517262306a36Sopenharmony_ci	if (ret)
517362306a36Sopenharmony_ci		return ret;
517462306a36Sopenharmony_ci
517562306a36Sopenharmony_ci	dev_set_drvdata(dev, wcd);
517662306a36Sopenharmony_ci
517762306a36Sopenharmony_ci	return 0;
517862306a36Sopenharmony_ci}
517962306a36Sopenharmony_ci
518062306a36Sopenharmony_cistatic int wcd9335_slim_status(struct slim_device *sdev,
518162306a36Sopenharmony_ci			       enum slim_device_status status)
518262306a36Sopenharmony_ci{
518362306a36Sopenharmony_ci	struct device *dev = &sdev->dev;
518462306a36Sopenharmony_ci	struct device_node *ifc_dev_np;
518562306a36Sopenharmony_ci	struct wcd9335_codec *wcd;
518662306a36Sopenharmony_ci	int ret;
518762306a36Sopenharmony_ci
518862306a36Sopenharmony_ci	wcd = dev_get_drvdata(dev);
518962306a36Sopenharmony_ci
519062306a36Sopenharmony_ci	ifc_dev_np = of_parse_phandle(dev->of_node, "slim-ifc-dev", 0);
519162306a36Sopenharmony_ci	if (!ifc_dev_np) {
519262306a36Sopenharmony_ci		dev_err(dev, "No Interface device found\n");
519362306a36Sopenharmony_ci		return -EINVAL;
519462306a36Sopenharmony_ci	}
519562306a36Sopenharmony_ci
519662306a36Sopenharmony_ci	wcd->slim = sdev;
519762306a36Sopenharmony_ci	wcd->slim_ifc_dev = of_slim_get_device(sdev->ctrl, ifc_dev_np);
519862306a36Sopenharmony_ci	of_node_put(ifc_dev_np);
519962306a36Sopenharmony_ci	if (!wcd->slim_ifc_dev) {
520062306a36Sopenharmony_ci		dev_err(dev, "Unable to get SLIM Interface device\n");
520162306a36Sopenharmony_ci		return -EINVAL;
520262306a36Sopenharmony_ci	}
520362306a36Sopenharmony_ci
520462306a36Sopenharmony_ci	slim_get_logical_addr(wcd->slim_ifc_dev);
520562306a36Sopenharmony_ci
520662306a36Sopenharmony_ci	wcd->regmap = regmap_init_slimbus(sdev, &wcd9335_regmap_config);
520762306a36Sopenharmony_ci	if (IS_ERR(wcd->regmap))
520862306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(wcd->regmap),
520962306a36Sopenharmony_ci				     "Failed to allocate slim register map\n");
521062306a36Sopenharmony_ci
521162306a36Sopenharmony_ci	wcd->if_regmap = regmap_init_slimbus(wcd->slim_ifc_dev,
521262306a36Sopenharmony_ci						  &wcd9335_ifc_regmap_config);
521362306a36Sopenharmony_ci	if (IS_ERR(wcd->if_regmap))
521462306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(wcd->if_regmap),
521562306a36Sopenharmony_ci				     "Failed to allocate ifc register map\n");
521662306a36Sopenharmony_ci
521762306a36Sopenharmony_ci	ret = wcd9335_bring_up(wcd);
521862306a36Sopenharmony_ci	if (ret) {
521962306a36Sopenharmony_ci		dev_err(dev, "Failed to bringup WCD9335\n");
522062306a36Sopenharmony_ci		return ret;
522162306a36Sopenharmony_ci	}
522262306a36Sopenharmony_ci
522362306a36Sopenharmony_ci	ret = wcd9335_irq_init(wcd);
522462306a36Sopenharmony_ci	if (ret)
522562306a36Sopenharmony_ci		return ret;
522662306a36Sopenharmony_ci
522762306a36Sopenharmony_ci	wcd9335_probe(wcd);
522862306a36Sopenharmony_ci
522962306a36Sopenharmony_ci	return 0;
523062306a36Sopenharmony_ci}
523162306a36Sopenharmony_ci
523262306a36Sopenharmony_cistatic const struct slim_device_id wcd9335_slim_id[] = {
523362306a36Sopenharmony_ci	{SLIM_MANF_ID_QCOM, SLIM_PROD_CODE_WCD9335, 0x1, 0x0},
523462306a36Sopenharmony_ci	{}
523562306a36Sopenharmony_ci};
523662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(slim, wcd9335_slim_id);
523762306a36Sopenharmony_ci
523862306a36Sopenharmony_cistatic struct slim_driver wcd9335_slim_driver = {
523962306a36Sopenharmony_ci	.driver = {
524062306a36Sopenharmony_ci		.name = "wcd9335-slim",
524162306a36Sopenharmony_ci	},
524262306a36Sopenharmony_ci	.probe = wcd9335_slim_probe,
524362306a36Sopenharmony_ci	.device_status = wcd9335_slim_status,
524462306a36Sopenharmony_ci	.id_table = wcd9335_slim_id,
524562306a36Sopenharmony_ci};
524662306a36Sopenharmony_ci
524762306a36Sopenharmony_cimodule_slim_driver(wcd9335_slim_driver);
524862306a36Sopenharmony_ciMODULE_DESCRIPTION("WCD9335 slim driver");
524962306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
525062306a36Sopenharmony_ciMODULE_ALIAS("slim:217:1a0:*");
5251