xref: /openbmc/linux/sound/soc/codecs/wcd9335.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
120aedafdSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0
220aedafdSSrinivas Kandagatla // Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
320aedafdSSrinivas Kandagatla // Copyright (c) 2017-2018, Linaro Limited
420aedafdSSrinivas Kandagatla 
520aedafdSSrinivas Kandagatla #include <linux/module.h>
620aedafdSSrinivas Kandagatla #include <linux/init.h>
720aedafdSSrinivas Kandagatla #include <linux/platform_device.h>
820aedafdSSrinivas Kandagatla #include <linux/device.h>
920aedafdSSrinivas Kandagatla #include <linux/wait.h>
1020aedafdSSrinivas Kandagatla #include <linux/bitops.h>
1120aedafdSSrinivas Kandagatla #include <linux/regulator/consumer.h>
1220aedafdSSrinivas Kandagatla #include <linux/clk.h>
1320aedafdSSrinivas Kandagatla #include <linux/delay.h>
1420aedafdSSrinivas Kandagatla #include <linux/kernel.h>
1520aedafdSSrinivas Kandagatla #include <linux/slimbus.h>
1620aedafdSSrinivas Kandagatla #include <sound/soc.h>
1720aedafdSSrinivas Kandagatla #include <sound/pcm_params.h>
1820aedafdSSrinivas Kandagatla #include <sound/soc-dapm.h>
1920aedafdSSrinivas Kandagatla #include <linux/of_gpio.h>
2020aedafdSSrinivas Kandagatla #include <linux/of.h>
2120aedafdSSrinivas Kandagatla #include <linux/of_irq.h>
2220aedafdSSrinivas Kandagatla #include <sound/tlv.h>
2320aedafdSSrinivas Kandagatla #include <sound/info.h>
2420aedafdSSrinivas Kandagatla #include "wcd9335.h"
25cc2e324dSSrinivas Kandagatla #include "wcd-clsh-v2.h"
2620aedafdSSrinivas Kandagatla 
2766348f17SYassine Oudjana #include <dt-bindings/sound/qcom,wcd9335.h>
2866348f17SYassine Oudjana 
2920aedafdSSrinivas Kandagatla #define WCD9335_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
3020aedafdSSrinivas Kandagatla 			    SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
3120aedafdSSrinivas Kandagatla 			    SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
3220aedafdSSrinivas Kandagatla /* Fractional Rates */
3320aedafdSSrinivas Kandagatla #define WCD9335_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100)
3420aedafdSSrinivas Kandagatla #define WCD9335_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \
3520aedafdSSrinivas Kandagatla 				  SNDRV_PCM_FMTBIT_S24_LE)
3620aedafdSSrinivas Kandagatla 
3720aedafdSSrinivas Kandagatla /* slave port water mark level
3820aedafdSSrinivas Kandagatla  *   (0: 6bytes, 1: 9bytes, 2: 12 bytes, 3: 15 bytes)
3920aedafdSSrinivas Kandagatla  */
4020aedafdSSrinivas Kandagatla #define SLAVE_PORT_WATER_MARK_6BYTES  0
4120aedafdSSrinivas Kandagatla #define SLAVE_PORT_WATER_MARK_9BYTES  1
4220aedafdSSrinivas Kandagatla #define SLAVE_PORT_WATER_MARK_12BYTES 2
4320aedafdSSrinivas Kandagatla #define SLAVE_PORT_WATER_MARK_15BYTES 3
4420aedafdSSrinivas Kandagatla #define SLAVE_PORT_WATER_MARK_SHIFT 1
4520aedafdSSrinivas Kandagatla #define SLAVE_PORT_ENABLE           1
4620aedafdSSrinivas Kandagatla #define SLAVE_PORT_DISABLE          0
4720aedafdSSrinivas Kandagatla #define WCD9335_SLIM_WATER_MARK_VAL \
4820aedafdSSrinivas Kandagatla 	((SLAVE_PORT_WATER_MARK_12BYTES << SLAVE_PORT_WATER_MARK_SHIFT) | \
4920aedafdSSrinivas Kandagatla 	 (SLAVE_PORT_ENABLE))
5020aedafdSSrinivas Kandagatla 
5120aedafdSSrinivas Kandagatla #define WCD9335_SLIM_NUM_PORT_REG 3
5220aedafdSSrinivas Kandagatla #define WCD9335_SLIM_PGD_PORT_INT_TX_EN0 (WCD9335_SLIM_PGD_PORT_INT_EN0 + 2)
5320aedafdSSrinivas Kandagatla 
5420aedafdSSrinivas Kandagatla #define WCD9335_MCLK_CLK_12P288MHZ	12288000
5520aedafdSSrinivas Kandagatla #define WCD9335_MCLK_CLK_9P6MHZ		9600000
5620aedafdSSrinivas Kandagatla 
5720aedafdSSrinivas Kandagatla #define WCD9335_SLIM_CLOSE_TIMEOUT 1000
5820aedafdSSrinivas Kandagatla #define WCD9335_SLIM_IRQ_OVERFLOW (1 << 0)
5920aedafdSSrinivas Kandagatla #define WCD9335_SLIM_IRQ_UNDERFLOW (1 << 1)
6020aedafdSSrinivas Kandagatla #define WCD9335_SLIM_IRQ_PORT_CLOSED (1 << 2)
6120aedafdSSrinivas Kandagatla 
6220aedafdSSrinivas Kandagatla #define WCD9335_NUM_INTERPOLATORS 9
6320aedafdSSrinivas Kandagatla #define WCD9335_RX_START	16
6420aedafdSSrinivas Kandagatla #define WCD9335_SLIM_CH_START 128
656ccc25f6SSrinivas Kandagatla #define WCD9335_MAX_MICBIAS 4
666ccc25f6SSrinivas Kandagatla #define WCD9335_MAX_VALID_ADC_MUX  13
676ccc25f6SSrinivas Kandagatla #define WCD9335_INVALID_ADC_MUX 9
686ccc25f6SSrinivas Kandagatla 
696ccc25f6SSrinivas Kandagatla #define  TX_HPF_CUT_OFF_FREQ_MASK	0x60
706ccc25f6SSrinivas Kandagatla #define  CF_MIN_3DB_4HZ			0x0
716ccc25f6SSrinivas Kandagatla #define  CF_MIN_3DB_75HZ		0x1
726ccc25f6SSrinivas Kandagatla #define  CF_MIN_3DB_150HZ		0x2
736ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DIV_2  0x0
746ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DIV_3  0x1
756ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DIV_4  0x2
766ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DIV_6  0x3
776ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DIV_8  0x4
786ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DIV_16  0x5
796ccc25f6SSrinivas Kandagatla #define WCD9335_DMIC_CLK_DRIVE_DEFAULT 0x02
806ccc25f6SSrinivas Kandagatla #define WCD9335_AMIC_PWR_LEVEL_LP 0
816ccc25f6SSrinivas Kandagatla #define WCD9335_AMIC_PWR_LEVEL_DEFAULT 1
826ccc25f6SSrinivas Kandagatla #define WCD9335_AMIC_PWR_LEVEL_HP 2
836ccc25f6SSrinivas Kandagatla #define WCD9335_AMIC_PWR_LVL_MASK 0x60
846ccc25f6SSrinivas Kandagatla #define WCD9335_AMIC_PWR_LVL_SHIFT 0x5
856ccc25f6SSrinivas Kandagatla 
866ccc25f6SSrinivas Kandagatla #define WCD9335_DEC_PWR_LVL_MASK 0x06
876ccc25f6SSrinivas Kandagatla #define WCD9335_DEC_PWR_LVL_LP 0x02
886ccc25f6SSrinivas Kandagatla #define WCD9335_DEC_PWR_LVL_HP 0x04
896ccc25f6SSrinivas Kandagatla #define WCD9335_DEC_PWR_LVL_DF 0x00
906ccc25f6SSrinivas Kandagatla 
9120aedafdSSrinivas Kandagatla #define WCD9335_SLIM_RX_CH(p) \
9220aedafdSSrinivas Kandagatla 	{.port = p + WCD9335_RX_START, .shift = p,}
9320aedafdSSrinivas Kandagatla 
946ccc25f6SSrinivas Kandagatla #define WCD9335_SLIM_TX_CH(p) \
956ccc25f6SSrinivas Kandagatla 	{.port = p, .shift = p,}
966ccc25f6SSrinivas Kandagatla 
9720aedafdSSrinivas Kandagatla /* vout step value */
9820aedafdSSrinivas Kandagatla #define WCD9335_CALCULATE_VOUT_D(req_mv) (((req_mv - 650) * 10) / 25)
9920aedafdSSrinivas Kandagatla 
10093f97ff1SSrinivas Kandagatla #define WCD9335_INTERPOLATOR_PATH(id)			\
10193f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX0", "SLIM RX0"},	\
10293f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX1", "SLIM RX1"},	\
10393f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX2", "SLIM RX2"},	\
10493f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX3", "SLIM RX3"},	\
10593f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX4", "SLIM RX4"},	\
10693f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX5", "SLIM RX5"},	\
10793f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX6", "SLIM RX6"},	\
10893f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP0", "RX7", "SLIM RX7"},	\
10993f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX0", "SLIM RX0"},	\
11093f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX1", "SLIM RX1"},	\
11193f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX2", "SLIM RX2"},	\
11293f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX3", "SLIM RX3"},	\
11393f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX4", "SLIM RX4"},	\
11493f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX5", "SLIM RX5"},	\
11593f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX6", "SLIM RX6"},	\
11693f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP1", "RX7", "SLIM RX7"},	\
11793f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX0", "SLIM RX0"},	\
11893f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX1", "SLIM RX1"},	\
11993f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX2", "SLIM RX2"},	\
12093f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX3", "SLIM RX3"},	\
12193f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX4", "SLIM RX4"},	\
12293f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX5", "SLIM RX5"},	\
12393f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX6", "SLIM RX6"},	\
12493f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1 INP2", "RX7", "SLIM RX7"},	\
12593f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX0", "SLIM RX0"},	\
12693f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX1", "SLIM RX1"},	\
12793f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX2", "SLIM RX2"},	\
12893f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX3", "SLIM RX3"},	\
12993f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX4", "SLIM RX4"},	\
13093f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX5", "SLIM RX5"},	\
13193f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX6", "SLIM RX6"},	\
13293f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_2 MUX", "RX7", "SLIM RX7"},	\
13393f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP0"},	\
13493f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP1"},	\
13593f97ff1SSrinivas Kandagatla 	{"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP2"},	\
13693f97ff1SSrinivas Kandagatla 	{"RX INT" #id " SEC MIX", NULL, "RX INT" #id "_2 MUX"},		\
13793f97ff1SSrinivas Kandagatla 	{"RX INT" #id " SEC MIX", NULL, "RX INT" #id "_1 MIX1"},	\
13893f97ff1SSrinivas Kandagatla 	{"RX INT" #id " MIX2", NULL, "RX INT" #id " SEC MIX"},		\
13993f97ff1SSrinivas Kandagatla 	{"RX INT" #id " INTERP", NULL, "RX INT" #id " MIX2"}
14093f97ff1SSrinivas Kandagatla 
14193f97ff1SSrinivas Kandagatla #define WCD9335_ADC_MUX_PATH(id)			\
14293f97ff1SSrinivas Kandagatla 	{"AIF1_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id " MUX"}, \
14393f97ff1SSrinivas Kandagatla 	{"AIF2_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id " MUX"}, \
14493f97ff1SSrinivas Kandagatla 	{"AIF3_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id " MUX"}, \
14593f97ff1SSrinivas Kandagatla 	{"SLIM TX" #id " MUX", "DEC" #id, "ADC MUX" #id}, \
14693f97ff1SSrinivas Kandagatla 	{"ADC MUX" #id, "DMIC", "DMIC MUX" #id},	\
14793f97ff1SSrinivas Kandagatla 	{"ADC MUX" #id, "AMIC", "AMIC MUX" #id},	\
14893f97ff1SSrinivas Kandagatla 	{"DMIC MUX" #id, "DMIC0", "DMIC0"},		\
14993f97ff1SSrinivas Kandagatla 	{"DMIC MUX" #id, "DMIC1", "DMIC1"},		\
15093f97ff1SSrinivas Kandagatla 	{"DMIC MUX" #id, "DMIC2", "DMIC2"},		\
15193f97ff1SSrinivas Kandagatla 	{"DMIC MUX" #id, "DMIC3", "DMIC3"},		\
15293f97ff1SSrinivas Kandagatla 	{"DMIC MUX" #id, "DMIC4", "DMIC4"},		\
15393f97ff1SSrinivas Kandagatla 	{"DMIC MUX" #id, "DMIC5", "DMIC5"},		\
15493f97ff1SSrinivas Kandagatla 	{"AMIC MUX" #id, "ADC1", "ADC1"},		\
15593f97ff1SSrinivas Kandagatla 	{"AMIC MUX" #id, "ADC2", "ADC2"},		\
15693f97ff1SSrinivas Kandagatla 	{"AMIC MUX" #id, "ADC3", "ADC3"},		\
15793f97ff1SSrinivas Kandagatla 	{"AMIC MUX" #id, "ADC4", "ADC4"},		\
15893f97ff1SSrinivas Kandagatla 	{"AMIC MUX" #id, "ADC5", "ADC5"},		\
15993f97ff1SSrinivas Kandagatla 	{"AMIC MUX" #id, "ADC6", "ADC6"}
16093f97ff1SSrinivas Kandagatla 
16120aedafdSSrinivas Kandagatla enum {
16220aedafdSSrinivas Kandagatla 	WCD9335_RX0 = 0,
16320aedafdSSrinivas Kandagatla 	WCD9335_RX1,
16420aedafdSSrinivas Kandagatla 	WCD9335_RX2,
16520aedafdSSrinivas Kandagatla 	WCD9335_RX3,
16620aedafdSSrinivas Kandagatla 	WCD9335_RX4,
16720aedafdSSrinivas Kandagatla 	WCD9335_RX5,
16820aedafdSSrinivas Kandagatla 	WCD9335_RX6,
16920aedafdSSrinivas Kandagatla 	WCD9335_RX7,
17020aedafdSSrinivas Kandagatla 	WCD9335_RX8,
17120aedafdSSrinivas Kandagatla 	WCD9335_RX9,
17220aedafdSSrinivas Kandagatla 	WCD9335_RX10,
17320aedafdSSrinivas Kandagatla 	WCD9335_RX11,
17420aedafdSSrinivas Kandagatla 	WCD9335_RX12,
17520aedafdSSrinivas Kandagatla 	WCD9335_RX_MAX,
17620aedafdSSrinivas Kandagatla };
17720aedafdSSrinivas Kandagatla 
17820aedafdSSrinivas Kandagatla enum {
1796ccc25f6SSrinivas Kandagatla 	WCD9335_TX0 = 0,
1806ccc25f6SSrinivas Kandagatla 	WCD9335_TX1,
1816ccc25f6SSrinivas Kandagatla 	WCD9335_TX2,
1826ccc25f6SSrinivas Kandagatla 	WCD9335_TX3,
1836ccc25f6SSrinivas Kandagatla 	WCD9335_TX4,
1846ccc25f6SSrinivas Kandagatla 	WCD9335_TX5,
1856ccc25f6SSrinivas Kandagatla 	WCD9335_TX6,
1866ccc25f6SSrinivas Kandagatla 	WCD9335_TX7,
1876ccc25f6SSrinivas Kandagatla 	WCD9335_TX8,
1886ccc25f6SSrinivas Kandagatla 	WCD9335_TX9,
1896ccc25f6SSrinivas Kandagatla 	WCD9335_TX10,
1906ccc25f6SSrinivas Kandagatla 	WCD9335_TX11,
1916ccc25f6SSrinivas Kandagatla 	WCD9335_TX12,
1926ccc25f6SSrinivas Kandagatla 	WCD9335_TX13,
1936ccc25f6SSrinivas Kandagatla 	WCD9335_TX14,
1946ccc25f6SSrinivas Kandagatla 	WCD9335_TX15,
1956ccc25f6SSrinivas Kandagatla 	WCD9335_TX_MAX,
1966ccc25f6SSrinivas Kandagatla };
1976ccc25f6SSrinivas Kandagatla 
1986ccc25f6SSrinivas Kandagatla enum {
19920aedafdSSrinivas Kandagatla 	SIDO_SOURCE_INTERNAL = 0,
20020aedafdSSrinivas Kandagatla 	SIDO_SOURCE_RCO_BG,
20120aedafdSSrinivas Kandagatla };
20220aedafdSSrinivas Kandagatla 
20320aedafdSSrinivas Kandagatla enum wcd9335_sido_voltage {
20420aedafdSSrinivas Kandagatla 	SIDO_VOLTAGE_SVS_MV = 950,
20520aedafdSSrinivas Kandagatla 	SIDO_VOLTAGE_NOMINAL_MV = 1100,
20620aedafdSSrinivas Kandagatla };
20720aedafdSSrinivas Kandagatla 
20820aedafdSSrinivas Kandagatla enum {
2098c4f021dSSrinivas Kandagatla 	COMPANDER_1, /* HPH_L */
2108c4f021dSSrinivas Kandagatla 	COMPANDER_2, /* HPH_R */
2118c4f021dSSrinivas Kandagatla 	COMPANDER_3, /* LO1_DIFF */
2128c4f021dSSrinivas Kandagatla 	COMPANDER_4, /* LO2_DIFF */
2138c4f021dSSrinivas Kandagatla 	COMPANDER_5, /* LO3_SE */
2148c4f021dSSrinivas Kandagatla 	COMPANDER_6, /* LO4_SE */
2158c4f021dSSrinivas Kandagatla 	COMPANDER_7, /* SWR SPK CH1 */
2168c4f021dSSrinivas Kandagatla 	COMPANDER_8, /* SWR SPK CH2 */
2178c4f021dSSrinivas Kandagatla 	COMPANDER_MAX,
2188c4f021dSSrinivas Kandagatla };
2198c4f021dSSrinivas Kandagatla 
2208c4f021dSSrinivas Kandagatla enum {
22120aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_ZERO = 0,
22220aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX0,
22320aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX1,
22420aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX2,
22520aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX3,
22620aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX4,
22720aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX5,
22820aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX6,
22920aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_RX7,
23020aedafdSSrinivas Kandagatla 	INTn_2_INP_SEL_PROXIMITY,
23120aedafdSSrinivas Kandagatla };
23220aedafdSSrinivas Kandagatla 
23320aedafdSSrinivas Kandagatla enum {
23420aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_ZERO = 0,
23520aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_DEC0,
23620aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_DEC1,
23720aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_IIR0,
23820aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_IIR1,
23920aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX0,
24020aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX1,
24120aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX2,
24220aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX3,
24320aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX4,
24420aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX5,
24520aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX6,
24620aedafdSSrinivas Kandagatla 	INTn_1_MIX_INP_SEL_RX7,
24720aedafdSSrinivas Kandagatla 
24820aedafdSSrinivas Kandagatla };
24920aedafdSSrinivas Kandagatla 
25035446148SSrinivas Kandagatla enum {
25135446148SSrinivas Kandagatla 	INTERP_EAR = 0,
25235446148SSrinivas Kandagatla 	INTERP_HPHL,
25335446148SSrinivas Kandagatla 	INTERP_HPHR,
25435446148SSrinivas Kandagatla 	INTERP_LO1,
25535446148SSrinivas Kandagatla 	INTERP_LO2,
25635446148SSrinivas Kandagatla 	INTERP_LO3,
25735446148SSrinivas Kandagatla 	INTERP_LO4,
25835446148SSrinivas Kandagatla 	INTERP_SPKR1,
25935446148SSrinivas Kandagatla 	INTERP_SPKR2,
26035446148SSrinivas Kandagatla };
26135446148SSrinivas Kandagatla 
26220aedafdSSrinivas Kandagatla enum wcd_clock_type {
26320aedafdSSrinivas Kandagatla 	WCD_CLK_OFF,
26420aedafdSSrinivas Kandagatla 	WCD_CLK_RCO,
26520aedafdSSrinivas Kandagatla 	WCD_CLK_MCLK,
26620aedafdSSrinivas Kandagatla };
26720aedafdSSrinivas Kandagatla 
2686ccc25f6SSrinivas Kandagatla enum {
2696ccc25f6SSrinivas Kandagatla 	MIC_BIAS_1 = 1,
2706ccc25f6SSrinivas Kandagatla 	MIC_BIAS_2,
2716ccc25f6SSrinivas Kandagatla 	MIC_BIAS_3,
2726ccc25f6SSrinivas Kandagatla 	MIC_BIAS_4
2736ccc25f6SSrinivas Kandagatla };
2746ccc25f6SSrinivas Kandagatla 
2756ccc25f6SSrinivas Kandagatla enum {
2766ccc25f6SSrinivas Kandagatla 	MICB_PULLUP_ENABLE,
2776ccc25f6SSrinivas Kandagatla 	MICB_PULLUP_DISABLE,
2786ccc25f6SSrinivas Kandagatla 	MICB_ENABLE,
2796ccc25f6SSrinivas Kandagatla 	MICB_DISABLE,
2806ccc25f6SSrinivas Kandagatla };
2816ccc25f6SSrinivas Kandagatla 
28220aedafdSSrinivas Kandagatla struct wcd9335_slim_ch {
28320aedafdSSrinivas Kandagatla 	u32 ch_num;
28420aedafdSSrinivas Kandagatla 	u16 port;
28520aedafdSSrinivas Kandagatla 	u16 shift;
28620aedafdSSrinivas Kandagatla 	struct list_head list;
28720aedafdSSrinivas Kandagatla };
28820aedafdSSrinivas Kandagatla 
28920aedafdSSrinivas Kandagatla struct wcd_slim_codec_dai_data {
29020aedafdSSrinivas Kandagatla 	struct list_head slim_ch_list;
29120aedafdSSrinivas Kandagatla 	struct slim_stream_config sconfig;
29220aedafdSSrinivas Kandagatla 	struct slim_stream_runtime *sruntime;
29320aedafdSSrinivas Kandagatla };
29420aedafdSSrinivas Kandagatla 
29520aedafdSSrinivas Kandagatla struct wcd9335_codec {
29620aedafdSSrinivas Kandagatla 	struct device *dev;
29720aedafdSSrinivas Kandagatla 	struct clk *mclk;
29820aedafdSSrinivas Kandagatla 	struct clk *native_clk;
29920aedafdSSrinivas Kandagatla 	u32 mclk_rate;
30020aedafdSSrinivas Kandagatla 	u8 version;
30120aedafdSSrinivas Kandagatla 
30220aedafdSSrinivas Kandagatla 	struct slim_device *slim;
30320aedafdSSrinivas Kandagatla 	struct slim_device *slim_ifc_dev;
30420aedafdSSrinivas Kandagatla 	struct regmap *regmap;
30520aedafdSSrinivas Kandagatla 	struct regmap *if_regmap;
30620aedafdSSrinivas Kandagatla 	struct regmap_irq_chip_data *irq_data;
30720aedafdSSrinivas Kandagatla 
30820aedafdSSrinivas Kandagatla 	struct wcd9335_slim_ch rx_chs[WCD9335_RX_MAX];
3096ccc25f6SSrinivas Kandagatla 	struct wcd9335_slim_ch tx_chs[WCD9335_TX_MAX];
31020aedafdSSrinivas Kandagatla 	u32 num_rx_port;
3116ccc25f6SSrinivas Kandagatla 	u32 num_tx_port;
31220aedafdSSrinivas Kandagatla 
31320aedafdSSrinivas Kandagatla 	int sido_input_src;
31420aedafdSSrinivas Kandagatla 	enum wcd9335_sido_voltage sido_voltage;
31520aedafdSSrinivas Kandagatla 
31620aedafdSSrinivas Kandagatla 	struct wcd_slim_codec_dai_data dai[NUM_CODEC_DAIS];
31720aedafdSSrinivas Kandagatla 	struct snd_soc_component *component;
31820aedafdSSrinivas Kandagatla 
31920aedafdSSrinivas Kandagatla 	int master_bias_users;
32020aedafdSSrinivas Kandagatla 	int clk_mclk_users;
32120aedafdSSrinivas Kandagatla 	int clk_rco_users;
32220aedafdSSrinivas Kandagatla 	int sido_ccl_cnt;
32320aedafdSSrinivas Kandagatla 	enum wcd_clock_type clk_type;
32420aedafdSSrinivas Kandagatla 
325cc2e324dSSrinivas Kandagatla 	struct wcd_clsh_ctrl *clsh_ctrl;
32620aedafdSSrinivas Kandagatla 	u32 hph_mode;
32735446148SSrinivas Kandagatla 	int prim_int_users[WCD9335_NUM_INTERPOLATORS];
32835446148SSrinivas Kandagatla 
3298c4f021dSSrinivas Kandagatla 	int comp_enabled[COMPANDER_MAX];
3308c4f021dSSrinivas Kandagatla 
33120aedafdSSrinivas Kandagatla 	int intr1;
33220aedafdSSrinivas Kandagatla 	int reset_gpio;
33320aedafdSSrinivas Kandagatla 	struct regulator_bulk_data supplies[WCD9335_MAX_SUPPLY];
33435446148SSrinivas Kandagatla 
3353b247eeaSYassine Oudjana 	unsigned int rx_port_value[WCD9335_RX_MAX];
336a5d6d28eSYassine Oudjana 	unsigned int tx_port_value[WCD9335_TX_MAX];
33735446148SSrinivas Kandagatla 	int hph_l_gain;
33835446148SSrinivas Kandagatla 	int hph_r_gain;
33935446148SSrinivas Kandagatla 	u32 rx_bias_count;
34035446148SSrinivas Kandagatla 
3416ccc25f6SSrinivas Kandagatla 	/*TX*/
3426ccc25f6SSrinivas Kandagatla 	int micb_ref[WCD9335_MAX_MICBIAS];
3436ccc25f6SSrinivas Kandagatla 	int pullup_ref[WCD9335_MAX_MICBIAS];
3446ccc25f6SSrinivas Kandagatla 
3456ccc25f6SSrinivas Kandagatla 	int dmic_0_1_clk_cnt;
3466ccc25f6SSrinivas Kandagatla 	int dmic_2_3_clk_cnt;
3476ccc25f6SSrinivas Kandagatla 	int dmic_4_5_clk_cnt;
3486ccc25f6SSrinivas Kandagatla 	int dmic_sample_rate;
3496ccc25f6SSrinivas Kandagatla 	int mad_dmic_sample_rate;
3506ccc25f6SSrinivas Kandagatla 
3516ccc25f6SSrinivas Kandagatla 	int native_clk_users;
35220aedafdSSrinivas Kandagatla };
35320aedafdSSrinivas Kandagatla 
35420aedafdSSrinivas Kandagatla struct wcd9335_irq {
35520aedafdSSrinivas Kandagatla 	int irq;
35620aedafdSSrinivas Kandagatla 	irqreturn_t (*handler)(int irq, void *data);
35720aedafdSSrinivas Kandagatla 	char *name;
35820aedafdSSrinivas Kandagatla };
35920aedafdSSrinivas Kandagatla 
3606ccc25f6SSrinivas Kandagatla static const struct wcd9335_slim_ch wcd9335_tx_chs[WCD9335_TX_MAX] = {
3616ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(0),
3626ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(1),
3636ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(2),
3646ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(3),
3656ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(4),
3666ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(5),
3676ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(6),
3686ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(7),
3696ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(8),
3706ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(9),
3716ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(10),
3726ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(11),
3736ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(12),
3746ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(13),
3756ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(14),
3766ccc25f6SSrinivas Kandagatla 	WCD9335_SLIM_TX_CH(15),
3776ccc25f6SSrinivas Kandagatla };
3786ccc25f6SSrinivas Kandagatla 
37920aedafdSSrinivas Kandagatla static const struct wcd9335_slim_ch wcd9335_rx_chs[WCD9335_RX_MAX] = {
38020aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(0),	 /* 16 */
38120aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(1),	 /* 17 */
38220aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(2),
38320aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(3),
38420aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(4),
38520aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(5),
38620aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(6),
38720aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(7),
38820aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(8),
38920aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(9),
39020aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(10),
39120aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(11),
39220aedafdSSrinivas Kandagatla 	WCD9335_SLIM_RX_CH(12),
39320aedafdSSrinivas Kandagatla };
39420aedafdSSrinivas Kandagatla 
39520aedafdSSrinivas Kandagatla struct interp_sample_rate {
39620aedafdSSrinivas Kandagatla 	int rate;
39720aedafdSSrinivas Kandagatla 	int rate_val;
39820aedafdSSrinivas Kandagatla };
39920aedafdSSrinivas Kandagatla 
40020aedafdSSrinivas Kandagatla static struct interp_sample_rate int_mix_rate_val[] = {
40120aedafdSSrinivas Kandagatla 	{48000, 0x4},	/* 48K */
40220aedafdSSrinivas Kandagatla 	{96000, 0x5},	/* 96K */
40320aedafdSSrinivas Kandagatla 	{192000, 0x6},	/* 192K */
40420aedafdSSrinivas Kandagatla };
40520aedafdSSrinivas Kandagatla 
40620aedafdSSrinivas Kandagatla static struct interp_sample_rate int_prim_rate_val[] = {
40720aedafdSSrinivas Kandagatla 	{8000, 0x0},	/* 8K */
40820aedafdSSrinivas Kandagatla 	{16000, 0x1},	/* 16K */
40920aedafdSSrinivas Kandagatla 	{24000, -EINVAL},/* 24K */
41020aedafdSSrinivas Kandagatla 	{32000, 0x3},	/* 32K */
41120aedafdSSrinivas Kandagatla 	{48000, 0x4},	/* 48K */
41220aedafdSSrinivas Kandagatla 	{96000, 0x5},	/* 96K */
41320aedafdSSrinivas Kandagatla 	{192000, 0x6},	/* 192K */
41420aedafdSSrinivas Kandagatla 	{384000, 0x7},	/* 384K */
41520aedafdSSrinivas Kandagatla 	{44100, 0x8}, /* 44.1K */
41620aedafdSSrinivas Kandagatla };
41720aedafdSSrinivas Kandagatla 
41820aedafdSSrinivas Kandagatla struct wcd9335_reg_mask_val {
41920aedafdSSrinivas Kandagatla 	u16 reg;
42020aedafdSSrinivas Kandagatla 	u8 mask;
42120aedafdSSrinivas Kandagatla 	u8 val;
42220aedafdSSrinivas Kandagatla };
42320aedafdSSrinivas Kandagatla 
42420aedafdSSrinivas Kandagatla static const struct wcd9335_reg_mask_val wcd9335_codec_reg_init[] = {
42520aedafdSSrinivas Kandagatla 	/* Rbuckfly/R_EAR(32) */
42620aedafdSSrinivas Kandagatla 	{WCD9335_CDC_CLSH_K2_MSB, 0x0F, 0x00},
42720aedafdSSrinivas Kandagatla 	{WCD9335_CDC_CLSH_K2_LSB, 0xFF, 0x60},
42820aedafdSSrinivas Kandagatla 	{WCD9335_CPE_SS_DMIC_CFG, 0x80, 0x00},
42920aedafdSSrinivas Kandagatla 	{WCD9335_CDC_BOOST0_BOOST_CTL, 0x70, 0x50},
43020aedafdSSrinivas Kandagatla 	{WCD9335_CDC_BOOST1_BOOST_CTL, 0x70, 0x50},
43120aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX7_RX_PATH_CFG1, 0x08, 0x08},
43220aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX8_RX_PATH_CFG1, 0x08, 0x08},
43320aedafdSSrinivas Kandagatla 	{WCD9335_ANA_LO_1_2, 0x3C, 0X3C},
43420aedafdSSrinivas Kandagatla 	{WCD9335_DIFF_LO_COM_SWCAP_REFBUF_FREQ, 0x70, 0x00},
43520aedafdSSrinivas Kandagatla 	{WCD9335_DIFF_LO_COM_PA_FREQ, 0x70, 0x40},
43620aedafdSSrinivas Kandagatla 	{WCD9335_SOC_MAD_AUDIO_CTL_2, 0x03, 0x03},
43720aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TOP_TOP_CFG1, 0x02, 0x02},
43820aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TOP_TOP_CFG1, 0x01, 0x01},
43920aedafdSSrinivas Kandagatla 	{WCD9335_EAR_CMBUFF, 0x08, 0x00},
44020aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TX9_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44120aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TX10_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44220aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TX11_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44320aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TX12_SPKR_PROT_PATH_CFG0, 0x01, 0x01},
44420aedafdSSrinivas Kandagatla 	{WCD9335_CDC_COMPANDER7_CTL3, 0x80, 0x80},
44520aedafdSSrinivas Kandagatla 	{WCD9335_CDC_COMPANDER8_CTL3, 0x80, 0x80},
44620aedafdSSrinivas Kandagatla 	{WCD9335_CDC_COMPANDER7_CTL7, 0x01, 0x01},
44720aedafdSSrinivas Kandagatla 	{WCD9335_CDC_COMPANDER8_CTL7, 0x01, 0x01},
44820aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX0_RX_PATH_CFG0, 0x01, 0x01},
44920aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX1_RX_PATH_CFG0, 0x01, 0x01},
45020aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX2_RX_PATH_CFG0, 0x01, 0x01},
45120aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX3_RX_PATH_CFG0, 0x01, 0x01},
45220aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX4_RX_PATH_CFG0, 0x01, 0x01},
45320aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX5_RX_PATH_CFG0, 0x01, 0x01},
45420aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX6_RX_PATH_CFG0, 0x01, 0x01},
45520aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX7_RX_PATH_CFG0, 0x01, 0x01},
45620aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX8_RX_PATH_CFG0, 0x01, 0x01},
45720aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 0x01, 0x01},
45820aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 0x01, 0x01},
45920aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 0x01, 0x01},
46020aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 0x01, 0x01},
46120aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 0x01, 0x01},
46220aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 0x01, 0x01},
46320aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 0x01, 0x01},
46420aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 0x01, 0x01},
46520aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 0x01, 0x01},
46620aedafdSSrinivas Kandagatla 	{WCD9335_VBADC_IBIAS_FE, 0x0C, 0x08},
46720aedafdSSrinivas Kandagatla 	{WCD9335_RCO_CTRL_2, 0x0F, 0x08},
46820aedafdSSrinivas Kandagatla 	{WCD9335_RX_BIAS_FLYB_MID_RST, 0xF0, 0x10},
46920aedafdSSrinivas Kandagatla 	{WCD9335_FLYBACK_CTRL_1, 0x20, 0x20},
47020aedafdSSrinivas Kandagatla 	{WCD9335_HPH_OCP_CTL, 0xFF, 0x5A},
47120aedafdSSrinivas Kandagatla 	{WCD9335_HPH_L_TEST, 0x01, 0x01},
47220aedafdSSrinivas Kandagatla 	{WCD9335_HPH_R_TEST, 0x01, 0x01},
47320aedafdSSrinivas Kandagatla 	{WCD9335_CDC_BOOST0_BOOST_CFG1, 0x3F, 0x12},
47420aedafdSSrinivas Kandagatla 	{WCD9335_CDC_BOOST0_BOOST_CFG2, 0x1C, 0x08},
47520aedafdSSrinivas Kandagatla 	{WCD9335_CDC_COMPANDER7_CTL7, 0x1E, 0x18},
47620aedafdSSrinivas Kandagatla 	{WCD9335_CDC_BOOST1_BOOST_CFG1, 0x3F, 0x12},
47720aedafdSSrinivas Kandagatla 	{WCD9335_CDC_BOOST1_BOOST_CFG2, 0x1C, 0x08},
47820aedafdSSrinivas Kandagatla 	{WCD9335_CDC_COMPANDER8_CTL7, 0x1E, 0x18},
47920aedafdSSrinivas Kandagatla 	{WCD9335_CDC_TX0_TX_PATH_SEC7, 0xFF, 0x45},
48020aedafdSSrinivas Kandagatla 	{WCD9335_CDC_RX0_RX_PATH_SEC0, 0xFC, 0xF4},
48120aedafdSSrinivas Kandagatla 	{WCD9335_HPH_REFBUFF_LP_CTL, 0x08, 0x08},
48220aedafdSSrinivas Kandagatla 	{WCD9335_HPH_REFBUFF_LP_CTL, 0x06, 0x02},
48320aedafdSSrinivas Kandagatla };
48420aedafdSSrinivas Kandagatla 
4858c4f021dSSrinivas Kandagatla /* Cutoff frequency for high pass filter */
4868c4f021dSSrinivas Kandagatla static const char * const cf_text[] = {
4878c4f021dSSrinivas Kandagatla 	"CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ"
4888c4f021dSSrinivas Kandagatla };
4898c4f021dSSrinivas Kandagatla 
4908c4f021dSSrinivas Kandagatla static const char * const rx_cf_text[] = {
4918c4f021dSSrinivas Kandagatla 	"CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ",
4928c4f021dSSrinivas Kandagatla 	"CF_NEG_3DB_0P48HZ"
4938c4f021dSSrinivas Kandagatla };
4948c4f021dSSrinivas Kandagatla 
49535446148SSrinivas Kandagatla static const char * const rx_int0_7_mix_mux_text[] = {
49635446148SSrinivas Kandagatla 	"ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5",
49735446148SSrinivas Kandagatla 	"RX6", "RX7", "PROXIMITY"
49835446148SSrinivas Kandagatla };
49935446148SSrinivas Kandagatla 
50035446148SSrinivas Kandagatla static const char * const rx_int_mix_mux_text[] = {
50135446148SSrinivas Kandagatla 	"ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5",
50235446148SSrinivas Kandagatla 	"RX6", "RX7"
50335446148SSrinivas Kandagatla };
50435446148SSrinivas Kandagatla 
50535446148SSrinivas Kandagatla static const char * const rx_prim_mix_text[] = {
50635446148SSrinivas Kandagatla 	"ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",
50735446148SSrinivas Kandagatla 	"RX3", "RX4", "RX5", "RX6", "RX7"
50835446148SSrinivas Kandagatla };
50935446148SSrinivas Kandagatla 
51035446148SSrinivas Kandagatla static const char * const rx_int_dem_inp_mux_text[] = {
51135446148SSrinivas Kandagatla 	"NORMAL_DSM_OUT", "CLSH_DSM_OUT",
51235446148SSrinivas Kandagatla };
51335446148SSrinivas Kandagatla 
51435446148SSrinivas Kandagatla static const char * const rx_int0_interp_mux_text[] = {
51535446148SSrinivas Kandagatla 	"ZERO", "RX INT0 MIX2",
51635446148SSrinivas Kandagatla };
51735446148SSrinivas Kandagatla 
51835446148SSrinivas Kandagatla static const char * const rx_int1_interp_mux_text[] = {
51935446148SSrinivas Kandagatla 	"ZERO", "RX INT1 MIX2",
52035446148SSrinivas Kandagatla };
52135446148SSrinivas Kandagatla 
52235446148SSrinivas Kandagatla static const char * const rx_int2_interp_mux_text[] = {
52335446148SSrinivas Kandagatla 	"ZERO", "RX INT2 MIX2",
52435446148SSrinivas Kandagatla };
52535446148SSrinivas Kandagatla 
52635446148SSrinivas Kandagatla static const char * const rx_int3_interp_mux_text[] = {
52735446148SSrinivas Kandagatla 	"ZERO", "RX INT3 MIX2",
52835446148SSrinivas Kandagatla };
52935446148SSrinivas Kandagatla 
53035446148SSrinivas Kandagatla static const char * const rx_int4_interp_mux_text[] = {
53135446148SSrinivas Kandagatla 	"ZERO", "RX INT4 MIX2",
53235446148SSrinivas Kandagatla };
53335446148SSrinivas Kandagatla 
53435446148SSrinivas Kandagatla static const char * const rx_int5_interp_mux_text[] = {
53535446148SSrinivas Kandagatla 	"ZERO", "RX INT5 MIX2",
53635446148SSrinivas Kandagatla };
53735446148SSrinivas Kandagatla 
53835446148SSrinivas Kandagatla static const char * const rx_int6_interp_mux_text[] = {
53935446148SSrinivas Kandagatla 	"ZERO", "RX INT6 MIX2",
54035446148SSrinivas Kandagatla };
54135446148SSrinivas Kandagatla 
54235446148SSrinivas Kandagatla static const char * const rx_int7_interp_mux_text[] = {
54335446148SSrinivas Kandagatla 	"ZERO", "RX INT7 MIX2",
54435446148SSrinivas Kandagatla };
54535446148SSrinivas Kandagatla 
54635446148SSrinivas Kandagatla static const char * const rx_int8_interp_mux_text[] = {
54735446148SSrinivas Kandagatla 	"ZERO", "RX INT8 SEC MIX"
54835446148SSrinivas Kandagatla };
54935446148SSrinivas Kandagatla 
5508c4f021dSSrinivas Kandagatla static const char * const rx_hph_mode_mux_text[] = {
5518c4f021dSSrinivas Kandagatla 	"Class H Invalid", "Class-H Hi-Fi", "Class-H Low Power", "Class-AB",
5528c4f021dSSrinivas Kandagatla 	"Class-H Hi-Fi Low Power"
5538c4f021dSSrinivas Kandagatla };
5548c4f021dSSrinivas Kandagatla 
55535446148SSrinivas Kandagatla static const char *const slim_rx_mux_text[] = {
55635446148SSrinivas Kandagatla 	"ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB",
55735446148SSrinivas Kandagatla };
55835446148SSrinivas Kandagatla 
5596ccc25f6SSrinivas Kandagatla static const char * const adc_mux_text[] = {
5606ccc25f6SSrinivas Kandagatla 	"DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2"
5616ccc25f6SSrinivas Kandagatla };
5626ccc25f6SSrinivas Kandagatla 
5636ccc25f6SSrinivas Kandagatla static const char * const dmic_mux_text[] = {
5646ccc25f6SSrinivas Kandagatla 	"ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5",
5656ccc25f6SSrinivas Kandagatla 	"SMIC0", "SMIC1", "SMIC2", "SMIC3"
5666ccc25f6SSrinivas Kandagatla };
5676ccc25f6SSrinivas Kandagatla 
5686ccc25f6SSrinivas Kandagatla static const char * const dmic_mux_alt_text[] = {
5696ccc25f6SSrinivas Kandagatla 	"ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5",
5706ccc25f6SSrinivas Kandagatla };
5716ccc25f6SSrinivas Kandagatla 
5726ccc25f6SSrinivas Kandagatla static const char * const amic_mux_text[] = {
5736ccc25f6SSrinivas Kandagatla 	"ZERO", "ADC1", "ADC2", "ADC3", "ADC4", "ADC5", "ADC6"
5746ccc25f6SSrinivas Kandagatla };
5756ccc25f6SSrinivas Kandagatla 
5766ccc25f6SSrinivas Kandagatla static const char * const sb_tx0_mux_text[] = {
5776ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192"
5786ccc25f6SSrinivas Kandagatla };
5796ccc25f6SSrinivas Kandagatla 
5806ccc25f6SSrinivas Kandagatla static const char * const sb_tx1_mux_text[] = {
5816ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192"
5826ccc25f6SSrinivas Kandagatla };
5836ccc25f6SSrinivas Kandagatla 
5846ccc25f6SSrinivas Kandagatla static const char * const sb_tx2_mux_text[] = {
5856ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192"
5866ccc25f6SSrinivas Kandagatla };
5876ccc25f6SSrinivas Kandagatla 
5886ccc25f6SSrinivas Kandagatla static const char * const sb_tx3_mux_text[] = {
5896ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192"
5906ccc25f6SSrinivas Kandagatla };
5916ccc25f6SSrinivas Kandagatla 
5926ccc25f6SSrinivas Kandagatla static const char * const sb_tx4_mux_text[] = {
5936ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192"
5946ccc25f6SSrinivas Kandagatla };
5956ccc25f6SSrinivas Kandagatla 
5966ccc25f6SSrinivas Kandagatla static const char * const sb_tx5_mux_text[] = {
5976ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192"
5986ccc25f6SSrinivas Kandagatla };
5996ccc25f6SSrinivas Kandagatla 
6006ccc25f6SSrinivas Kandagatla static const char * const sb_tx6_mux_text[] = {
6016ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192"
6026ccc25f6SSrinivas Kandagatla };
6036ccc25f6SSrinivas Kandagatla 
6046ccc25f6SSrinivas Kandagatla static const char * const sb_tx7_mux_text[] = {
6056ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192"
6066ccc25f6SSrinivas Kandagatla };
6076ccc25f6SSrinivas Kandagatla 
6086ccc25f6SSrinivas Kandagatla static const char * const sb_tx8_mux_text[] = {
6096ccc25f6SSrinivas Kandagatla 	"ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192"
6106ccc25f6SSrinivas Kandagatla };
6116ccc25f6SSrinivas Kandagatla 
6126d6bc54aSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
6138c4f021dSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
6148c4f021dSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
6158c4f021dSSrinivas Kandagatla static const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
6168c4f021dSSrinivas Kandagatla 
6178c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec0_enum =
6188c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX0_TX_PATH_CFG0, 5, 3, cf_text);
6198c4f021dSSrinivas Kandagatla 
6208c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec1_enum =
6218c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX1_TX_PATH_CFG0, 5, 3, cf_text);
6228c4f021dSSrinivas Kandagatla 
6238c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec2_enum =
6248c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX2_TX_PATH_CFG0, 5, 3, cf_text);
6258c4f021dSSrinivas Kandagatla 
6268c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec3_enum =
6278c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX3_TX_PATH_CFG0, 5, 3, cf_text);
6288c4f021dSSrinivas Kandagatla 
6298c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec4_enum =
6308c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX4_TX_PATH_CFG0, 5, 3, cf_text);
6318c4f021dSSrinivas Kandagatla 
6328c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec5_enum =
6338c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX5_TX_PATH_CFG0, 5, 3, cf_text);
6348c4f021dSSrinivas Kandagatla 
6358c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec6_enum =
6368c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX6_TX_PATH_CFG0, 5, 3, cf_text);
6378c4f021dSSrinivas Kandagatla 
6388c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec7_enum =
6398c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX7_TX_PATH_CFG0, 5, 3, cf_text);
6408c4f021dSSrinivas Kandagatla 
6418c4f021dSSrinivas Kandagatla static const struct soc_enum cf_dec8_enum =
6428c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX8_TX_PATH_CFG0, 5, 3, cf_text);
6438c4f021dSSrinivas Kandagatla 
6448c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int0_1_enum =
6458c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_CFG2, 0, 4, rx_cf_text);
6468c4f021dSSrinivas Kandagatla 
6478c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int0_2_enum, WCD9335_CDC_RX0_RX_PATH_MIX_CFG, 2,
6488c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6498c4f021dSSrinivas Kandagatla 
6508c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int1_1_enum =
6518c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_CFG2, 0, 4, rx_cf_text);
6528c4f021dSSrinivas Kandagatla 
6538c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int1_2_enum, WCD9335_CDC_RX1_RX_PATH_MIX_CFG, 2,
6548c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6558c4f021dSSrinivas Kandagatla 
6568c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int2_1_enum =
6578c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_CFG2, 0, 4, rx_cf_text);
6588c4f021dSSrinivas Kandagatla 
6598c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int2_2_enum, WCD9335_CDC_RX2_RX_PATH_MIX_CFG, 2,
6608c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6618c4f021dSSrinivas Kandagatla 
6628c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int3_1_enum =
6638c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX3_RX_PATH_CFG2, 0, 4, rx_cf_text);
6648c4f021dSSrinivas Kandagatla 
6658c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int3_2_enum, WCD9335_CDC_RX3_RX_PATH_MIX_CFG, 2,
6668c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6678c4f021dSSrinivas Kandagatla 
6688c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int4_1_enum =
6698c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX4_RX_PATH_CFG2, 0, 4, rx_cf_text);
6708c4f021dSSrinivas Kandagatla 
6718c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int4_2_enum, WCD9335_CDC_RX4_RX_PATH_MIX_CFG, 2,
6728c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6738c4f021dSSrinivas Kandagatla 
6748c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int5_1_enum =
6758c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX5_RX_PATH_CFG2, 0, 4, rx_cf_text);
6768c4f021dSSrinivas Kandagatla 
6778c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int5_2_enum, WCD9335_CDC_RX5_RX_PATH_MIX_CFG, 2,
6788c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6798c4f021dSSrinivas Kandagatla 
6808c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int6_1_enum =
6818c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX6_RX_PATH_CFG2, 0, 4, rx_cf_text);
6828c4f021dSSrinivas Kandagatla 
6838c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int6_2_enum, WCD9335_CDC_RX6_RX_PATH_MIX_CFG, 2,
6848c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6858c4f021dSSrinivas Kandagatla 
6868c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int7_1_enum =
6878c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX7_RX_PATH_CFG2, 0, 4, rx_cf_text);
6888c4f021dSSrinivas Kandagatla 
6898c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int7_2_enum, WCD9335_CDC_RX7_RX_PATH_MIX_CFG, 2,
6908c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6918c4f021dSSrinivas Kandagatla 
6928c4f021dSSrinivas Kandagatla static const struct soc_enum cf_int8_1_enum =
6938c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CFG2, 0, 4, rx_cf_text);
6948c4f021dSSrinivas Kandagatla 
6958c4f021dSSrinivas Kandagatla static SOC_ENUM_SINGLE_DECL(cf_int8_2_enum, WCD9335_CDC_RX8_RX_PATH_MIX_CFG, 2,
6968c4f021dSSrinivas Kandagatla 		     rx_cf_text);
6978c4f021dSSrinivas Kandagatla 
6988c4f021dSSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum =
6998c4f021dSSrinivas Kandagatla 	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text),
7008c4f021dSSrinivas Kandagatla 			    rx_hph_mode_mux_text);
7018c4f021dSSrinivas Kandagatla 
70235446148SSrinivas Kandagatla static const struct soc_enum slim_rx_mux_enum =
70335446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim_rx_mux_text), slim_rx_mux_text);
70435446148SSrinivas Kandagatla 
70535446148SSrinivas Kandagatla static const struct soc_enum rx_int0_2_mux_chain_enum =
70635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, 10,
70735446148SSrinivas Kandagatla 			rx_int0_7_mix_mux_text);
70835446148SSrinivas Kandagatla 
70935446148SSrinivas Kandagatla static const struct soc_enum rx_int1_2_mux_chain_enum =
71035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, 9,
71135446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
71235446148SSrinivas Kandagatla 
71335446148SSrinivas Kandagatla static const struct soc_enum rx_int2_2_mux_chain_enum =
71435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, 9,
71535446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
71635446148SSrinivas Kandagatla 
71735446148SSrinivas Kandagatla static const struct soc_enum rx_int3_2_mux_chain_enum =
71835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 0, 9,
71935446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
72035446148SSrinivas Kandagatla 
72135446148SSrinivas Kandagatla static const struct soc_enum rx_int4_2_mux_chain_enum =
72235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 0, 9,
72335446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
72435446148SSrinivas Kandagatla 
72535446148SSrinivas Kandagatla static const struct soc_enum rx_int5_2_mux_chain_enum =
72635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 0, 9,
72735446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
72835446148SSrinivas Kandagatla 
72935446148SSrinivas Kandagatla static const struct soc_enum rx_int6_2_mux_chain_enum =
73035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 0, 9,
73135446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
73235446148SSrinivas Kandagatla 
73335446148SSrinivas Kandagatla static const struct soc_enum rx_int7_2_mux_chain_enum =
73435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 0, 10,
73535446148SSrinivas Kandagatla 			rx_int0_7_mix_mux_text);
73635446148SSrinivas Kandagatla 
73735446148SSrinivas Kandagatla static const struct soc_enum rx_int8_2_mux_chain_enum =
73835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 0, 9,
73935446148SSrinivas Kandagatla 			rx_int_mix_mux_text);
74035446148SSrinivas Kandagatla 
74135446148SSrinivas Kandagatla static const struct soc_enum rx_int0_1_mix_inp0_chain_enum =
74235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, 13,
74335446148SSrinivas Kandagatla 			rx_prim_mix_text);
74435446148SSrinivas Kandagatla 
74535446148SSrinivas Kandagatla static const struct soc_enum rx_int0_1_mix_inp1_chain_enum =
74635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, 13,
74735446148SSrinivas Kandagatla 			rx_prim_mix_text);
74835446148SSrinivas Kandagatla 
74935446148SSrinivas Kandagatla static const struct soc_enum rx_int0_1_mix_inp2_chain_enum =
75035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, 13,
75135446148SSrinivas Kandagatla 			rx_prim_mix_text);
75235446148SSrinivas Kandagatla 
75335446148SSrinivas Kandagatla static const struct soc_enum rx_int1_1_mix_inp0_chain_enum =
75435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, 13,
75535446148SSrinivas Kandagatla 			rx_prim_mix_text);
75635446148SSrinivas Kandagatla 
75735446148SSrinivas Kandagatla static const struct soc_enum rx_int1_1_mix_inp1_chain_enum =
75835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, 13,
75935446148SSrinivas Kandagatla 			rx_prim_mix_text);
76035446148SSrinivas Kandagatla 
76135446148SSrinivas Kandagatla static const struct soc_enum rx_int1_1_mix_inp2_chain_enum =
76235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, 13,
76335446148SSrinivas Kandagatla 			rx_prim_mix_text);
76435446148SSrinivas Kandagatla 
76535446148SSrinivas Kandagatla static const struct soc_enum rx_int2_1_mix_inp0_chain_enum =
76635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, 13,
76735446148SSrinivas Kandagatla 			rx_prim_mix_text);
76835446148SSrinivas Kandagatla 
76935446148SSrinivas Kandagatla static const struct soc_enum rx_int2_1_mix_inp1_chain_enum =
77035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, 13,
77135446148SSrinivas Kandagatla 			rx_prim_mix_text);
77235446148SSrinivas Kandagatla 
77335446148SSrinivas Kandagatla static const struct soc_enum rx_int2_1_mix_inp2_chain_enum =
77435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, 13,
77535446148SSrinivas Kandagatla 			rx_prim_mix_text);
77635446148SSrinivas Kandagatla 
77735446148SSrinivas Kandagatla static const struct soc_enum rx_int3_1_mix_inp0_chain_enum =
77835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 0, 13,
77935446148SSrinivas Kandagatla 			rx_prim_mix_text);
78035446148SSrinivas Kandagatla 
78135446148SSrinivas Kandagatla static const struct soc_enum rx_int3_1_mix_inp1_chain_enum =
78235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG0, 4, 13,
78335446148SSrinivas Kandagatla 			rx_prim_mix_text);
78435446148SSrinivas Kandagatla 
78535446148SSrinivas Kandagatla static const struct soc_enum rx_int3_1_mix_inp2_chain_enum =
78635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT3_CFG1, 4, 13,
78735446148SSrinivas Kandagatla 			rx_prim_mix_text);
78835446148SSrinivas Kandagatla 
78935446148SSrinivas Kandagatla static const struct soc_enum rx_int4_1_mix_inp0_chain_enum =
79035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 0, 13,
79135446148SSrinivas Kandagatla 			rx_prim_mix_text);
79235446148SSrinivas Kandagatla 
79335446148SSrinivas Kandagatla static const struct soc_enum rx_int4_1_mix_inp1_chain_enum =
79435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG0, 4, 13,
79535446148SSrinivas Kandagatla 			rx_prim_mix_text);
79635446148SSrinivas Kandagatla 
79735446148SSrinivas Kandagatla static const struct soc_enum rx_int4_1_mix_inp2_chain_enum =
79835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT4_CFG1, 4, 13,
79935446148SSrinivas Kandagatla 			rx_prim_mix_text);
80035446148SSrinivas Kandagatla 
80135446148SSrinivas Kandagatla static const struct soc_enum rx_int5_1_mix_inp0_chain_enum =
80235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 0, 13,
80335446148SSrinivas Kandagatla 			rx_prim_mix_text);
80435446148SSrinivas Kandagatla 
80535446148SSrinivas Kandagatla static const struct soc_enum rx_int5_1_mix_inp1_chain_enum =
80635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG0, 4, 13,
80735446148SSrinivas Kandagatla 			rx_prim_mix_text);
80835446148SSrinivas Kandagatla 
80935446148SSrinivas Kandagatla static const struct soc_enum rx_int5_1_mix_inp2_chain_enum =
81035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT5_CFG1, 4, 13,
81135446148SSrinivas Kandagatla 			rx_prim_mix_text);
81235446148SSrinivas Kandagatla 
81335446148SSrinivas Kandagatla static const struct soc_enum rx_int6_1_mix_inp0_chain_enum =
81435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 0, 13,
81535446148SSrinivas Kandagatla 			rx_prim_mix_text);
81635446148SSrinivas Kandagatla 
81735446148SSrinivas Kandagatla static const struct soc_enum rx_int6_1_mix_inp1_chain_enum =
81835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG0, 4, 13,
81935446148SSrinivas Kandagatla 			rx_prim_mix_text);
82035446148SSrinivas Kandagatla 
82135446148SSrinivas Kandagatla static const struct soc_enum rx_int6_1_mix_inp2_chain_enum =
82235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT6_CFG1, 4, 13,
82335446148SSrinivas Kandagatla 			rx_prim_mix_text);
82435446148SSrinivas Kandagatla 
82535446148SSrinivas Kandagatla static const struct soc_enum rx_int7_1_mix_inp0_chain_enum =
82635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 0, 13,
82735446148SSrinivas Kandagatla 			rx_prim_mix_text);
82835446148SSrinivas Kandagatla 
82935446148SSrinivas Kandagatla static const struct soc_enum rx_int7_1_mix_inp1_chain_enum =
83035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG0, 4, 13,
83135446148SSrinivas Kandagatla 			rx_prim_mix_text);
83235446148SSrinivas Kandagatla 
83335446148SSrinivas Kandagatla static const struct soc_enum rx_int7_1_mix_inp2_chain_enum =
83435446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT7_CFG1, 4, 13,
83535446148SSrinivas Kandagatla 			rx_prim_mix_text);
83635446148SSrinivas Kandagatla 
83735446148SSrinivas Kandagatla static const struct soc_enum rx_int8_1_mix_inp0_chain_enum =
83835446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 0, 13,
83935446148SSrinivas Kandagatla 			rx_prim_mix_text);
84035446148SSrinivas Kandagatla 
84135446148SSrinivas Kandagatla static const struct soc_enum rx_int8_1_mix_inp1_chain_enum =
84235446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG0, 4, 13,
84335446148SSrinivas Kandagatla 			rx_prim_mix_text);
84435446148SSrinivas Kandagatla 
84535446148SSrinivas Kandagatla static const struct soc_enum rx_int8_1_mix_inp2_chain_enum =
84635446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX_INP_MUX_RX_INT8_CFG1, 4, 13,
84735446148SSrinivas Kandagatla 			rx_prim_mix_text);
84835446148SSrinivas Kandagatla 
84935446148SSrinivas Kandagatla static const struct soc_enum rx_int0_dem_inp_mux_enum =
85035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_SEC0, 0,
85135446148SSrinivas Kandagatla 			ARRAY_SIZE(rx_int_dem_inp_mux_text),
85235446148SSrinivas Kandagatla 			rx_int_dem_inp_mux_text);
85335446148SSrinivas Kandagatla 
85435446148SSrinivas Kandagatla static const struct soc_enum rx_int1_dem_inp_mux_enum =
85535446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_SEC0, 0,
85635446148SSrinivas Kandagatla 			ARRAY_SIZE(rx_int_dem_inp_mux_text),
85735446148SSrinivas Kandagatla 			rx_int_dem_inp_mux_text);
85835446148SSrinivas Kandagatla 
85935446148SSrinivas Kandagatla static const struct soc_enum rx_int2_dem_inp_mux_enum =
86035446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_SEC0, 0,
86135446148SSrinivas Kandagatla 			ARRAY_SIZE(rx_int_dem_inp_mux_text),
86235446148SSrinivas Kandagatla 			rx_int_dem_inp_mux_text);
86335446148SSrinivas Kandagatla 
86435446148SSrinivas Kandagatla static const struct soc_enum rx_int0_interp_mux_enum =
86535446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX0_RX_PATH_CTL, 5, 2,
86635446148SSrinivas Kandagatla 			rx_int0_interp_mux_text);
86735446148SSrinivas Kandagatla 
86835446148SSrinivas Kandagatla static const struct soc_enum rx_int1_interp_mux_enum =
86935446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX1_RX_PATH_CTL, 5, 2,
87035446148SSrinivas Kandagatla 			rx_int1_interp_mux_text);
87135446148SSrinivas Kandagatla 
87235446148SSrinivas Kandagatla static const struct soc_enum rx_int2_interp_mux_enum =
87335446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX2_RX_PATH_CTL, 5, 2,
87435446148SSrinivas Kandagatla 			rx_int2_interp_mux_text);
87535446148SSrinivas Kandagatla 
87635446148SSrinivas Kandagatla static const struct soc_enum rx_int3_interp_mux_enum =
87735446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX3_RX_PATH_CTL, 5, 2,
87835446148SSrinivas Kandagatla 			rx_int3_interp_mux_text);
87935446148SSrinivas Kandagatla 
88035446148SSrinivas Kandagatla static const struct soc_enum rx_int4_interp_mux_enum =
88135446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX4_RX_PATH_CTL, 5, 2,
88235446148SSrinivas Kandagatla 			rx_int4_interp_mux_text);
88335446148SSrinivas Kandagatla 
88435446148SSrinivas Kandagatla static const struct soc_enum rx_int5_interp_mux_enum =
88535446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX5_RX_PATH_CTL, 5, 2,
88635446148SSrinivas Kandagatla 			rx_int5_interp_mux_text);
88735446148SSrinivas Kandagatla 
88835446148SSrinivas Kandagatla static const struct soc_enum rx_int6_interp_mux_enum =
88935446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX6_RX_PATH_CTL, 5, 2,
89035446148SSrinivas Kandagatla 			rx_int6_interp_mux_text);
89135446148SSrinivas Kandagatla 
89235446148SSrinivas Kandagatla static const struct soc_enum rx_int7_interp_mux_enum =
89335446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX7_RX_PATH_CTL, 5, 2,
89435446148SSrinivas Kandagatla 			rx_int7_interp_mux_text);
89535446148SSrinivas Kandagatla 
89635446148SSrinivas Kandagatla static const struct soc_enum rx_int8_interp_mux_enum =
89735446148SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_RX8_RX_PATH_CTL, 5, 2,
89835446148SSrinivas Kandagatla 			rx_int8_interp_mux_text);
89935446148SSrinivas Kandagatla 
9006ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux0_chain_enum =
9016ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0, 4,
9026ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9036ccc25f6SSrinivas Kandagatla 
9046ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux1_chain_enum =
9056ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0, 4,
9066ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9076ccc25f6SSrinivas Kandagatla 
9086ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux2_chain_enum =
9096ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0, 4,
9106ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9116ccc25f6SSrinivas Kandagatla 
9126ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux3_chain_enum =
9136ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0, 4,
9146ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9156ccc25f6SSrinivas Kandagatla 
9166ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux4_chain_enum =
9176ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 6, 4,
9186ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9196ccc25f6SSrinivas Kandagatla 
9206ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux5_chain_enum =
9216ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 6, 4,
9226ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9236ccc25f6SSrinivas Kandagatla 
9246ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux6_chain_enum =
9256ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 6, 4,
9266ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9276ccc25f6SSrinivas Kandagatla 
9286ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux7_chain_enum =
9296ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 6, 4,
9306ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9316ccc25f6SSrinivas Kandagatla 
9326ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_adc_mux8_chain_enum =
9336ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 6, 4,
9346ccc25f6SSrinivas Kandagatla 			adc_mux_text);
9356ccc25f6SSrinivas Kandagatla 
9366ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux0_enum =
9376ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, 11,
9386ccc25f6SSrinivas Kandagatla 			dmic_mux_text);
9396ccc25f6SSrinivas Kandagatla 
9406ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux1_enum =
9416ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, 11,
9426ccc25f6SSrinivas Kandagatla 			dmic_mux_text);
9436ccc25f6SSrinivas Kandagatla 
9446ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux2_enum =
9456ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, 11,
9466ccc25f6SSrinivas Kandagatla 			dmic_mux_text);
9476ccc25f6SSrinivas Kandagatla 
9486ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux3_enum =
9496ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, 11,
9506ccc25f6SSrinivas Kandagatla 			dmic_mux_text);
9516ccc25f6SSrinivas Kandagatla 
9526ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux4_enum =
9536ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, 7,
9546ccc25f6SSrinivas Kandagatla 			dmic_mux_alt_text);
9556ccc25f6SSrinivas Kandagatla 
9566ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux5_enum =
9576ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, 7,
9586ccc25f6SSrinivas Kandagatla 			dmic_mux_alt_text);
9596ccc25f6SSrinivas Kandagatla 
9606ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux6_enum =
9616ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, 7,
9626ccc25f6SSrinivas Kandagatla 			dmic_mux_alt_text);
9636ccc25f6SSrinivas Kandagatla 
9646ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux7_enum =
9656ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, 7,
9666ccc25f6SSrinivas Kandagatla 			dmic_mux_alt_text);
9676ccc25f6SSrinivas Kandagatla 
9686ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_dmic_mux8_enum =
9696ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, 7,
9706ccc25f6SSrinivas Kandagatla 			dmic_mux_alt_text);
9716ccc25f6SSrinivas Kandagatla 
9726ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux0_enum =
9736ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, 7,
9746ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9756ccc25f6SSrinivas Kandagatla 
9766ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux1_enum =
9776ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, 7,
9786ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9796ccc25f6SSrinivas Kandagatla 
9806ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux2_enum =
9816ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, 7,
9826ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9836ccc25f6SSrinivas Kandagatla 
9846ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux3_enum =
9856ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, 7,
9866ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9876ccc25f6SSrinivas Kandagatla 
9886ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux4_enum =
9896ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, 7,
9906ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9916ccc25f6SSrinivas Kandagatla 
9926ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux5_enum =
9936ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, 7,
9946ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9956ccc25f6SSrinivas Kandagatla 
9966ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux6_enum =
9976ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, 7,
9986ccc25f6SSrinivas Kandagatla 			amic_mux_text);
9996ccc25f6SSrinivas Kandagatla 
10006ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux7_enum =
10016ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, 7,
10026ccc25f6SSrinivas Kandagatla 			amic_mux_text);
10036ccc25f6SSrinivas Kandagatla 
10046ccc25f6SSrinivas Kandagatla static const struct soc_enum tx_amic_mux8_enum =
10056ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, 7,
10066ccc25f6SSrinivas Kandagatla 			amic_mux_text);
10076ccc25f6SSrinivas Kandagatla 
10086ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx0_mux_enum =
10096ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 0, 4,
10106ccc25f6SSrinivas Kandagatla 			sb_tx0_mux_text);
10116ccc25f6SSrinivas Kandagatla 
10126ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx1_mux_enum =
10136ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 2, 4,
10146ccc25f6SSrinivas Kandagatla 			sb_tx1_mux_text);
10156ccc25f6SSrinivas Kandagatla 
10166ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx2_mux_enum =
10176ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 4, 4,
10186ccc25f6SSrinivas Kandagatla 			sb_tx2_mux_text);
10196ccc25f6SSrinivas Kandagatla 
10206ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx3_mux_enum =
10216ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0, 6, 4,
10226ccc25f6SSrinivas Kandagatla 			sb_tx3_mux_text);
10236ccc25f6SSrinivas Kandagatla 
10246ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx4_mux_enum =
10256ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 0, 4,
10266ccc25f6SSrinivas Kandagatla 			sb_tx4_mux_text);
10276ccc25f6SSrinivas Kandagatla 
10286ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx5_mux_enum =
10296ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 2, 4,
10306ccc25f6SSrinivas Kandagatla 			sb_tx5_mux_text);
10316ccc25f6SSrinivas Kandagatla 
10326ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx6_mux_enum =
10336ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 4, 4,
10346ccc25f6SSrinivas Kandagatla 			sb_tx6_mux_text);
10356ccc25f6SSrinivas Kandagatla 
10366ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx7_mux_enum =
10376ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1, 6, 4,
10386ccc25f6SSrinivas Kandagatla 			sb_tx7_mux_text);
10396ccc25f6SSrinivas Kandagatla 
10406ccc25f6SSrinivas Kandagatla static const struct soc_enum sb_tx8_mux_enum =
10416ccc25f6SSrinivas Kandagatla 	SOC_ENUM_SINGLE(WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2, 0, 4,
10426ccc25f6SSrinivas Kandagatla 			sb_tx8_mux_text);
10436ccc25f6SSrinivas Kandagatla 
104435446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int0_2_mux =
104535446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT0_2 MUX Mux", rx_int0_2_mux_chain_enum);
104635446148SSrinivas Kandagatla 
104735446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int1_2_mux =
104835446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT1_2 MUX Mux", rx_int1_2_mux_chain_enum);
104935446148SSrinivas Kandagatla 
105035446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int2_2_mux =
105135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT2_2 MUX Mux", rx_int2_2_mux_chain_enum);
105235446148SSrinivas Kandagatla 
105335446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int3_2_mux =
105435446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT3_2 MUX Mux", rx_int3_2_mux_chain_enum);
105535446148SSrinivas Kandagatla 
105635446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int4_2_mux =
105735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT4_2 MUX Mux", rx_int4_2_mux_chain_enum);
105835446148SSrinivas Kandagatla 
105935446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int5_2_mux =
106035446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT5_2 MUX Mux", rx_int5_2_mux_chain_enum);
106135446148SSrinivas Kandagatla 
106235446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int6_2_mux =
106335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT6_2 MUX Mux", rx_int6_2_mux_chain_enum);
106435446148SSrinivas Kandagatla 
106535446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int7_2_mux =
106635446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT7_2 MUX Mux", rx_int7_2_mux_chain_enum);
106735446148SSrinivas Kandagatla 
106835446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int8_2_mux =
106935446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT8_2 MUX Mux", rx_int8_2_mux_chain_enum);
107035446148SSrinivas Kandagatla 
107135446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int0_1_mix_inp0_mux =
107235446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT0_1 MIX1 INP0 Mux", rx_int0_1_mix_inp0_chain_enum);
107335446148SSrinivas Kandagatla 
107435446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int0_1_mix_inp1_mux =
107535446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT0_1 MIX1 INP1 Mux", rx_int0_1_mix_inp1_chain_enum);
107635446148SSrinivas Kandagatla 
107735446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int0_1_mix_inp2_mux =
107835446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT0_1 MIX1 INP2 Mux", rx_int0_1_mix_inp2_chain_enum);
107935446148SSrinivas Kandagatla 
108035446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int1_1_mix_inp0_mux =
108135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT1_1 MIX1 INP0 Mux", rx_int1_1_mix_inp0_chain_enum);
108235446148SSrinivas Kandagatla 
108335446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int1_1_mix_inp1_mux =
108435446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT1_1 MIX1 INP1 Mux", rx_int1_1_mix_inp1_chain_enum);
108535446148SSrinivas Kandagatla 
108635446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int1_1_mix_inp2_mux =
108735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT1_1 MIX1 INP2 Mux", rx_int1_1_mix_inp2_chain_enum);
108835446148SSrinivas Kandagatla 
108935446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int2_1_mix_inp0_mux =
109035446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT2_1 MIX1 INP0 Mux", rx_int2_1_mix_inp0_chain_enum);
109135446148SSrinivas Kandagatla 
109235446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int2_1_mix_inp1_mux =
109335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT2_1 MIX1 INP1 Mux", rx_int2_1_mix_inp1_chain_enum);
109435446148SSrinivas Kandagatla 
109535446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int2_1_mix_inp2_mux =
109635446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT2_1 MIX1 INP2 Mux", rx_int2_1_mix_inp2_chain_enum);
109735446148SSrinivas Kandagatla 
109835446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int3_1_mix_inp0_mux =
109935446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT3_1 MIX1 INP0 Mux", rx_int3_1_mix_inp0_chain_enum);
110035446148SSrinivas Kandagatla 
110135446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int3_1_mix_inp1_mux =
110235446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT3_1 MIX1 INP1 Mux", rx_int3_1_mix_inp1_chain_enum);
110335446148SSrinivas Kandagatla 
110435446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int3_1_mix_inp2_mux =
110535446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT3_1 MIX1 INP2 Mux", rx_int3_1_mix_inp2_chain_enum);
110635446148SSrinivas Kandagatla 
110735446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int4_1_mix_inp0_mux =
110835446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT4_1 MIX1 INP0 Mux", rx_int4_1_mix_inp0_chain_enum);
110935446148SSrinivas Kandagatla 
111035446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int4_1_mix_inp1_mux =
111135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT4_1 MIX1 INP1 Mux", rx_int4_1_mix_inp1_chain_enum);
111235446148SSrinivas Kandagatla 
111335446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int4_1_mix_inp2_mux =
111435446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT4_1 MIX1 INP2 Mux", rx_int4_1_mix_inp2_chain_enum);
111535446148SSrinivas Kandagatla 
111635446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int5_1_mix_inp0_mux =
111735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT5_1 MIX1 INP0 Mux", rx_int5_1_mix_inp0_chain_enum);
111835446148SSrinivas Kandagatla 
111935446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int5_1_mix_inp1_mux =
112035446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT5_1 MIX1 INP1 Mux", rx_int5_1_mix_inp1_chain_enum);
112135446148SSrinivas Kandagatla 
112235446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int5_1_mix_inp2_mux =
112335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT5_1 MIX1 INP2 Mux", rx_int5_1_mix_inp2_chain_enum);
112435446148SSrinivas Kandagatla 
112535446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int6_1_mix_inp0_mux =
112635446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT6_1 MIX1 INP0 Mux", rx_int6_1_mix_inp0_chain_enum);
112735446148SSrinivas Kandagatla 
112835446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int6_1_mix_inp1_mux =
112935446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT6_1 MIX1 INP1 Mux", rx_int6_1_mix_inp1_chain_enum);
113035446148SSrinivas Kandagatla 
113135446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int6_1_mix_inp2_mux =
113235446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT6_1 MIX1 INP2 Mux", rx_int6_1_mix_inp2_chain_enum);
113335446148SSrinivas Kandagatla 
113435446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int7_1_mix_inp0_mux =
113535446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT7_1 MIX1 INP0 Mux", rx_int7_1_mix_inp0_chain_enum);
113635446148SSrinivas Kandagatla 
113735446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int7_1_mix_inp1_mux =
113835446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT7_1 MIX1 INP1 Mux", rx_int7_1_mix_inp1_chain_enum);
113935446148SSrinivas Kandagatla 
114035446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int7_1_mix_inp2_mux =
114135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT7_1 MIX1 INP2 Mux", rx_int7_1_mix_inp2_chain_enum);
114235446148SSrinivas Kandagatla 
114335446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int8_1_mix_inp0_mux =
114435446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT8_1 MIX1 INP0 Mux", rx_int8_1_mix_inp0_chain_enum);
114535446148SSrinivas Kandagatla 
114635446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int8_1_mix_inp1_mux =
114735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT8_1 MIX1 INP1 Mux", rx_int8_1_mix_inp1_chain_enum);
114835446148SSrinivas Kandagatla 
114935446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int8_1_mix_inp2_mux =
115035446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT8_1 MIX1 INP2 Mux", rx_int8_1_mix_inp2_chain_enum);
115135446148SSrinivas Kandagatla 
115235446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int0_interp_mux =
115335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT0 INTERP Mux", rx_int0_interp_mux_enum);
115435446148SSrinivas Kandagatla 
115535446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int1_interp_mux =
115635446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT1 INTERP Mux", rx_int1_interp_mux_enum);
115735446148SSrinivas Kandagatla 
115835446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int2_interp_mux =
115935446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT2 INTERP Mux", rx_int2_interp_mux_enum);
116035446148SSrinivas Kandagatla 
116135446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int3_interp_mux =
116235446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT3 INTERP Mux", rx_int3_interp_mux_enum);
116335446148SSrinivas Kandagatla 
116435446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int4_interp_mux =
116535446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT4 INTERP Mux", rx_int4_interp_mux_enum);
116635446148SSrinivas Kandagatla 
116735446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int5_interp_mux =
116835446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT5 INTERP Mux", rx_int5_interp_mux_enum);
116935446148SSrinivas Kandagatla 
117035446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int6_interp_mux =
117135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT6 INTERP Mux", rx_int6_interp_mux_enum);
117235446148SSrinivas Kandagatla 
117335446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int7_interp_mux =
117435446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT7 INTERP Mux", rx_int7_interp_mux_enum);
117535446148SSrinivas Kandagatla 
117635446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int8_interp_mux =
117735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM("RX INT8 INTERP Mux", rx_int8_interp_mux_enum);
117835446148SSrinivas Kandagatla 
11796ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux0 =
11806ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX0 Mux", tx_dmic_mux0_enum);
11816ccc25f6SSrinivas Kandagatla 
11826ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux1 =
11836ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX1 Mux", tx_dmic_mux1_enum);
11846ccc25f6SSrinivas Kandagatla 
11856ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux2 =
11866ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX2 Mux", tx_dmic_mux2_enum);
11876ccc25f6SSrinivas Kandagatla 
11886ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux3 =
11896ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX3 Mux", tx_dmic_mux3_enum);
11906ccc25f6SSrinivas Kandagatla 
11916ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux4 =
11926ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX4 Mux", tx_dmic_mux4_enum);
11936ccc25f6SSrinivas Kandagatla 
11946ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux5 =
11956ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX5 Mux", tx_dmic_mux5_enum);
11966ccc25f6SSrinivas Kandagatla 
11976ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux6 =
11986ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX6 Mux", tx_dmic_mux6_enum);
11996ccc25f6SSrinivas Kandagatla 
12006ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux7 =
12016ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX7 Mux", tx_dmic_mux7_enum);
12026ccc25f6SSrinivas Kandagatla 
12036ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_dmic_mux8 =
12046ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("DMIC MUX8 Mux", tx_dmic_mux8_enum);
12056ccc25f6SSrinivas Kandagatla 
12066ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux0 =
12076ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX0 Mux", tx_amic_mux0_enum);
12086ccc25f6SSrinivas Kandagatla 
12096ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux1 =
12106ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX1 Mux", tx_amic_mux1_enum);
12116ccc25f6SSrinivas Kandagatla 
12126ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux2 =
12136ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX2 Mux", tx_amic_mux2_enum);
12146ccc25f6SSrinivas Kandagatla 
12156ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux3 =
12166ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX3 Mux", tx_amic_mux3_enum);
12176ccc25f6SSrinivas Kandagatla 
12186ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux4 =
12196ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX4 Mux", tx_amic_mux4_enum);
12206ccc25f6SSrinivas Kandagatla 
12216ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux5 =
12226ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX5 Mux", tx_amic_mux5_enum);
12236ccc25f6SSrinivas Kandagatla 
12246ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux6 =
12256ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX6 Mux", tx_amic_mux6_enum);
12266ccc25f6SSrinivas Kandagatla 
12276ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux7 =
12286ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX7 Mux", tx_amic_mux7_enum);
12296ccc25f6SSrinivas Kandagatla 
12306ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_amic_mux8 =
12316ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("AMIC MUX8 Mux", tx_amic_mux8_enum);
12326ccc25f6SSrinivas Kandagatla 
12336ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx0_mux =
12346ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX0 MUX Mux", sb_tx0_mux_enum);
12356ccc25f6SSrinivas Kandagatla 
12366ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx1_mux =
12376ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX1 MUX Mux", sb_tx1_mux_enum);
12386ccc25f6SSrinivas Kandagatla 
12396ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx2_mux =
12406ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX2 MUX Mux", sb_tx2_mux_enum);
12416ccc25f6SSrinivas Kandagatla 
12426ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx3_mux =
12436ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX3 MUX Mux", sb_tx3_mux_enum);
12446ccc25f6SSrinivas Kandagatla 
12456ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx4_mux =
12466ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX4 MUX Mux", sb_tx4_mux_enum);
12476ccc25f6SSrinivas Kandagatla 
12486ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx5_mux =
12496ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX5 MUX Mux", sb_tx5_mux_enum);
12506ccc25f6SSrinivas Kandagatla 
12516ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx6_mux =
12526ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX6 MUX Mux", sb_tx6_mux_enum);
12536ccc25f6SSrinivas Kandagatla 
12546ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx7_mux =
12556ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX7 MUX Mux", sb_tx7_mux_enum);
12566ccc25f6SSrinivas Kandagatla 
12576ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new sb_tx8_mux =
12586ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM("SLIM TX8 MUX Mux", sb_tx8_mux_enum);
12596ccc25f6SSrinivas Kandagatla 
slim_rx_mux_get(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)126035446148SSrinivas Kandagatla static int slim_rx_mux_get(struct snd_kcontrol *kc,
126135446148SSrinivas Kandagatla 			   struct snd_ctl_elem_value *ucontrol)
126235446148SSrinivas Kandagatla {
12633b247eeaSYassine Oudjana 	struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kc);
12643b247eeaSYassine Oudjana 	struct wcd9335_codec *wcd = dev_get_drvdata(w->dapm->dev);
12653b247eeaSYassine Oudjana 	u32 port_id = w->shift;
126635446148SSrinivas Kandagatla 
12673b247eeaSYassine Oudjana 	ucontrol->value.enumerated.item[0] = wcd->rx_port_value[port_id];
126835446148SSrinivas Kandagatla 
126935446148SSrinivas Kandagatla 	return 0;
127035446148SSrinivas Kandagatla }
127135446148SSrinivas Kandagatla 
slim_rx_mux_put(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)127235446148SSrinivas Kandagatla static int slim_rx_mux_put(struct snd_kcontrol *kc,
127335446148SSrinivas Kandagatla 			   struct snd_ctl_elem_value *ucontrol)
127435446148SSrinivas Kandagatla {
127535446148SSrinivas Kandagatla 	struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kc);
127635446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(w->dapm->dev);
127735446148SSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kc->private_value;
127835446148SSrinivas Kandagatla 	struct snd_soc_dapm_update *update = NULL;
127935446148SSrinivas Kandagatla 	u32 port_id = w->shift;
128035446148SSrinivas Kandagatla 
12816bda28a2SMark Brown 	if (wcd->rx_port_value[port_id] == ucontrol->value.enumerated.item[0])
12826bda28a2SMark Brown 		return 0;
12836bda28a2SMark Brown 
12843b247eeaSYassine Oudjana 	wcd->rx_port_value[port_id] = ucontrol->value.enumerated.item[0];
128535446148SSrinivas Kandagatla 
12867263fc6cSYassine Oudjana 	/* Remove channel from any list it's in before adding it to a new one */
12877263fc6cSYassine Oudjana 	list_del_init(&wcd->rx_chs[port_id].list);
12887263fc6cSYassine Oudjana 
12893b247eeaSYassine Oudjana 	switch (wcd->rx_port_value[port_id]) {
129035446148SSrinivas Kandagatla 	case 0:
12917263fc6cSYassine Oudjana 		/* Channel already removed from lists. Nothing to do here */
129235446148SSrinivas Kandagatla 		break;
129335446148SSrinivas Kandagatla 	case 1:
129435446148SSrinivas Kandagatla 		list_add_tail(&wcd->rx_chs[port_id].list,
129535446148SSrinivas Kandagatla 			      &wcd->dai[AIF1_PB].slim_ch_list);
129635446148SSrinivas Kandagatla 		break;
129735446148SSrinivas Kandagatla 	case 2:
129835446148SSrinivas Kandagatla 		list_add_tail(&wcd->rx_chs[port_id].list,
129935446148SSrinivas Kandagatla 			      &wcd->dai[AIF2_PB].slim_ch_list);
130035446148SSrinivas Kandagatla 		break;
130135446148SSrinivas Kandagatla 	case 3:
130235446148SSrinivas Kandagatla 		list_add_tail(&wcd->rx_chs[port_id].list,
130335446148SSrinivas Kandagatla 			      &wcd->dai[AIF3_PB].slim_ch_list);
130435446148SSrinivas Kandagatla 		break;
130535446148SSrinivas Kandagatla 	case 4:
130635446148SSrinivas Kandagatla 		list_add_tail(&wcd->rx_chs[port_id].list,
130735446148SSrinivas Kandagatla 			      &wcd->dai[AIF4_PB].slim_ch_list);
130835446148SSrinivas Kandagatla 		break;
130935446148SSrinivas Kandagatla 	default:
13103b247eeaSYassine Oudjana 		dev_err(wcd->dev, "Unknown AIF %d\n", wcd->rx_port_value[port_id]);
131135446148SSrinivas Kandagatla 		goto err;
131235446148SSrinivas Kandagatla 	}
131335446148SSrinivas Kandagatla 
13143b247eeaSYassine Oudjana 	snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id],
131535446148SSrinivas Kandagatla 				      e, update);
131635446148SSrinivas Kandagatla 
131735446148SSrinivas Kandagatla 	return 0;
131835446148SSrinivas Kandagatla err:
131935446148SSrinivas Kandagatla 	return -EINVAL;
132035446148SSrinivas Kandagatla }
132135446148SSrinivas Kandagatla 
slim_tx_mixer_get(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)13226ccc25f6SSrinivas Kandagatla static int slim_tx_mixer_get(struct snd_kcontrol *kc,
13236ccc25f6SSrinivas Kandagatla 			     struct snd_ctl_elem_value *ucontrol)
13246ccc25f6SSrinivas Kandagatla {
13256ccc25f6SSrinivas Kandagatla 
13266ccc25f6SSrinivas Kandagatla 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc);
13276ccc25f6SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(dapm->dev);
1328a5d6d28eSYassine Oudjana 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kc);
1329a5d6d28eSYassine Oudjana 	struct soc_mixer_control *mixer =
1330a5d6d28eSYassine Oudjana 			(struct soc_mixer_control *)kc->private_value;
1331a5d6d28eSYassine Oudjana 	int dai_id = widget->shift;
1332a5d6d28eSYassine Oudjana 	int port_id = mixer->shift;
13336ccc25f6SSrinivas Kandagatla 
1334a5d6d28eSYassine Oudjana 	ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id] == dai_id;
13356ccc25f6SSrinivas Kandagatla 
13366ccc25f6SSrinivas Kandagatla 	return 0;
13376ccc25f6SSrinivas Kandagatla }
13386ccc25f6SSrinivas Kandagatla 
slim_tx_mixer_put(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)13396ccc25f6SSrinivas Kandagatla static int slim_tx_mixer_put(struct snd_kcontrol *kc,
13406ccc25f6SSrinivas Kandagatla 			     struct snd_ctl_elem_value *ucontrol)
13416ccc25f6SSrinivas Kandagatla {
13426ccc25f6SSrinivas Kandagatla 
13436ccc25f6SSrinivas Kandagatla 	struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kc);
13446ccc25f6SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(widget->dapm->dev);
13456ccc25f6SSrinivas Kandagatla 	struct snd_soc_dapm_update *update = NULL;
13466ccc25f6SSrinivas Kandagatla 	struct soc_mixer_control *mixer =
13476ccc25f6SSrinivas Kandagatla 			(struct soc_mixer_control *)kc->private_value;
13486ccc25f6SSrinivas Kandagatla 	int enable = ucontrol->value.integer.value[0];
13496ccc25f6SSrinivas Kandagatla 	int dai_id = widget->shift;
13506ccc25f6SSrinivas Kandagatla 	int port_id = mixer->shift;
13516ccc25f6SSrinivas Kandagatla 
13526ccc25f6SSrinivas Kandagatla 	switch (dai_id) {
13536ccc25f6SSrinivas Kandagatla 	case AIF1_CAP:
13546ccc25f6SSrinivas Kandagatla 	case AIF2_CAP:
13556ccc25f6SSrinivas Kandagatla 	case AIF3_CAP:
13566ccc25f6SSrinivas Kandagatla 		/* only add to the list if value not set */
1357a5d6d28eSYassine Oudjana 		if (enable && wcd->tx_port_value[port_id] != dai_id) {
1358a5d6d28eSYassine Oudjana 			wcd->tx_port_value[port_id] = dai_id;
13596ccc25f6SSrinivas Kandagatla 			list_add_tail(&wcd->tx_chs[port_id].list,
13606ccc25f6SSrinivas Kandagatla 					&wcd->dai[dai_id].slim_ch_list);
1361a5d6d28eSYassine Oudjana 		} else if (!enable && wcd->tx_port_value[port_id] == dai_id) {
1362a5d6d28eSYassine Oudjana 			wcd->tx_port_value[port_id] = -1;
13636ccc25f6SSrinivas Kandagatla 			list_del_init(&wcd->tx_chs[port_id].list);
13646ccc25f6SSrinivas Kandagatla 		}
13656ccc25f6SSrinivas Kandagatla 		break;
13666ccc25f6SSrinivas Kandagatla 	default:
13676ccc25f6SSrinivas Kandagatla 		dev_err(wcd->dev, "Unknown AIF %d\n", dai_id);
13686ccc25f6SSrinivas Kandagatla 		return -EINVAL;
13696ccc25f6SSrinivas Kandagatla 	}
13706ccc25f6SSrinivas Kandagatla 
13716ccc25f6SSrinivas Kandagatla 	snd_soc_dapm_mixer_update_power(widget->dapm, kc, enable, update);
13726ccc25f6SSrinivas Kandagatla 
13736ccc25f6SSrinivas Kandagatla 	return 0;
13746ccc25f6SSrinivas Kandagatla }
13756ccc25f6SSrinivas Kandagatla 
137635446148SSrinivas Kandagatla static const struct snd_kcontrol_new slim_rx_mux[WCD9335_RX_MAX] = {
137735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX0 Mux", slim_rx_mux_enum,
137835446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
137935446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX1 Mux", slim_rx_mux_enum,
138035446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
138135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX2 Mux", slim_rx_mux_enum,
138235446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
138335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX3 Mux", slim_rx_mux_enum,
138435446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
138535446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX4 Mux", slim_rx_mux_enum,
138635446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
138735446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX5 Mux", slim_rx_mux_enum,
138835446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
138935446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX6 Mux", slim_rx_mux_enum,
139035446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
139135446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("SLIM RX7 Mux", slim_rx_mux_enum,
139235446148SSrinivas Kandagatla 			  slim_rx_mux_get, slim_rx_mux_put),
139335446148SSrinivas Kandagatla };
139435446148SSrinivas Kandagatla 
13956ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new aif1_cap_mixer[] = {
13966ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0,
13976ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
13986ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0,
13996ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14006ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0,
14016ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14026ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0,
14036ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14046ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0,
14056ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14066ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0,
14076ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14086ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0,
14096ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14106ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0,
14116ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14126ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0,
14136ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14146ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9335_TX9, 1, 0,
14156ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14166ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9335_TX10, 1, 0,
14176ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14186ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9335_TX11, 1, 0,
14196ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14206ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9335_TX13, 1, 0,
14216ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14226ccc25f6SSrinivas Kandagatla };
14236ccc25f6SSrinivas Kandagatla 
14246ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new aif2_cap_mixer[] = {
14256ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0,
14266ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14276ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0,
14286ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14296ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0,
14306ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14316ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0,
14326ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14336ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0,
14346ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14356ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0,
14366ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14376ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0,
14386ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14396ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0,
14406ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14416ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0,
14426ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14436ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD9335_TX9, 1, 0,
14446ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14456ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD9335_TX10, 1, 0,
14466ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14476ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD9335_TX11, 1, 0,
14486ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14496ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD9335_TX13, 1, 0,
14506ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14516ccc25f6SSrinivas Kandagatla };
14526ccc25f6SSrinivas Kandagatla 
14536ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new aif3_cap_mixer[] = {
14546ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD9335_TX0, 1, 0,
14556ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14566ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD9335_TX1, 1, 0,
14576ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14586ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD9335_TX2, 1, 0,
14596ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14606ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD9335_TX3, 1, 0,
14616ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14626ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD9335_TX4, 1, 0,
14636ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14646ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD9335_TX5, 1, 0,
14656ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14666ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD9335_TX6, 1, 0,
14676ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14686ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD9335_TX7, 1, 0,
14696ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14706ccc25f6SSrinivas Kandagatla 	SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD9335_TX8, 1, 0,
14716ccc25f6SSrinivas Kandagatla 			slim_tx_mixer_get, slim_tx_mixer_put),
14726ccc25f6SSrinivas Kandagatla };
14736ccc25f6SSrinivas Kandagatla 
wcd9335_put_dec_enum(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)14746ccc25f6SSrinivas Kandagatla static int wcd9335_put_dec_enum(struct snd_kcontrol *kc,
14756ccc25f6SSrinivas Kandagatla 				struct snd_ctl_elem_value *ucontrol)
14766ccc25f6SSrinivas Kandagatla {
14776ccc25f6SSrinivas Kandagatla 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc);
14786ccc25f6SSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
14796ccc25f6SSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kc->private_value;
14806ccc25f6SSrinivas Kandagatla 	unsigned int val, reg, sel;
14816ccc25f6SSrinivas Kandagatla 
14826ccc25f6SSrinivas Kandagatla 	val = ucontrol->value.enumerated.item[0];
14836ccc25f6SSrinivas Kandagatla 
14846ccc25f6SSrinivas Kandagatla 	switch (e->reg) {
14856ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1:
14866ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX0_TX_PATH_CFG0;
14876ccc25f6SSrinivas Kandagatla 		break;
14886ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX1_CFG1:
14896ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX1_TX_PATH_CFG0;
14906ccc25f6SSrinivas Kandagatla 		break;
14916ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX2_CFG1:
14926ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX2_TX_PATH_CFG0;
14936ccc25f6SSrinivas Kandagatla 		break;
14946ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX3_CFG1:
14956ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX3_TX_PATH_CFG0;
14966ccc25f6SSrinivas Kandagatla 		break;
14976ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
14986ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX4_TX_PATH_CFG0;
14996ccc25f6SSrinivas Kandagatla 		break;
15006ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
15016ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX5_TX_PATH_CFG0;
15026ccc25f6SSrinivas Kandagatla 		break;
15036ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
15046ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX6_TX_PATH_CFG0;
15056ccc25f6SSrinivas Kandagatla 		break;
15066ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
15076ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX7_TX_PATH_CFG0;
15086ccc25f6SSrinivas Kandagatla 		break;
15096ccc25f6SSrinivas Kandagatla 	case WCD9335_CDC_TX_INP_MUX_ADC_MUX8_CFG0:
15106ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX8_TX_PATH_CFG0;
15116ccc25f6SSrinivas Kandagatla 		break;
15126ccc25f6SSrinivas Kandagatla 	default:
15136ccc25f6SSrinivas Kandagatla 		return -EINVAL;
15146ccc25f6SSrinivas Kandagatla 	}
15156ccc25f6SSrinivas Kandagatla 
15166ccc25f6SSrinivas Kandagatla 	/* AMIC: 0, DMIC: 1 */
15176ccc25f6SSrinivas Kandagatla 	sel = val ? WCD9335_CDC_TX_ADC_AMIC_SEL : WCD9335_CDC_TX_ADC_DMIC_SEL;
15186ccc25f6SSrinivas Kandagatla 	snd_soc_component_update_bits(component, reg,
15196ccc25f6SSrinivas Kandagatla 				      WCD9335_CDC_TX_ADC_AMIC_DMIC_SEL_MASK,
15206ccc25f6SSrinivas Kandagatla 				      sel);
15216ccc25f6SSrinivas Kandagatla 
15226ccc25f6SSrinivas Kandagatla 	return snd_soc_dapm_put_enum_double(kc, ucontrol);
15236ccc25f6SSrinivas Kandagatla }
15246ccc25f6SSrinivas Kandagatla 
wcd9335_int_dem_inp_mux_put(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)152535446148SSrinivas Kandagatla static int wcd9335_int_dem_inp_mux_put(struct snd_kcontrol *kc,
152635446148SSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
152735446148SSrinivas Kandagatla {
152835446148SSrinivas Kandagatla 	struct soc_enum *e = (struct soc_enum *)kc->private_value;
152935446148SSrinivas Kandagatla 	struct snd_soc_component *component;
153035446148SSrinivas Kandagatla 	int reg, val;
153135446148SSrinivas Kandagatla 
153235446148SSrinivas Kandagatla 	component = snd_soc_dapm_kcontrol_component(kc);
153335446148SSrinivas Kandagatla 	val = ucontrol->value.enumerated.item[0];
153435446148SSrinivas Kandagatla 
153535446148SSrinivas Kandagatla 	if (e->reg == WCD9335_CDC_RX0_RX_PATH_SEC0)
153635446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX0_RX_PATH_CFG0;
153735446148SSrinivas Kandagatla 	else if (e->reg == WCD9335_CDC_RX1_RX_PATH_SEC0)
153835446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX1_RX_PATH_CFG0;
153935446148SSrinivas Kandagatla 	else if (e->reg == WCD9335_CDC_RX2_RX_PATH_SEC0)
154035446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX2_RX_PATH_CFG0;
154135446148SSrinivas Kandagatla 	else
154235446148SSrinivas Kandagatla 		return -EINVAL;
154335446148SSrinivas Kandagatla 
154435446148SSrinivas Kandagatla 	/* Set Look Ahead Delay */
154535446148SSrinivas Kandagatla 	snd_soc_component_update_bits(component, reg,
154635446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_CFG0_DLY_ZN_EN_MASK,
154735446148SSrinivas Kandagatla 				val ? WCD9335_CDC_RX_PATH_CFG0_DLY_ZN_EN : 0);
154835446148SSrinivas Kandagatla 	/* Set DEM INP Select */
154935446148SSrinivas Kandagatla 	return snd_soc_dapm_put_enum_double(kc, ucontrol);
155035446148SSrinivas Kandagatla }
155135446148SSrinivas Kandagatla 
155235446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int0_dem_inp_mux =
155335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("RX INT0 DEM MUX Mux", rx_int0_dem_inp_mux_enum,
155435446148SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
155535446148SSrinivas Kandagatla 			  wcd9335_int_dem_inp_mux_put);
155635446148SSrinivas Kandagatla 
155735446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int1_dem_inp_mux =
155835446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("RX INT1 DEM MUX Mux", rx_int1_dem_inp_mux_enum,
155935446148SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
156035446148SSrinivas Kandagatla 			  wcd9335_int_dem_inp_mux_put);
156135446148SSrinivas Kandagatla 
156235446148SSrinivas Kandagatla static const struct snd_kcontrol_new rx_int2_dem_inp_mux =
156335446148SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("RX INT2 DEM MUX Mux", rx_int2_dem_inp_mux_enum,
156435446148SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
156535446148SSrinivas Kandagatla 			  wcd9335_int_dem_inp_mux_put);
156635446148SSrinivas Kandagatla 
15676ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux0 =
15686ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX0 Mux", tx_adc_mux0_chain_enum,
15696ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
15706ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
15716ccc25f6SSrinivas Kandagatla 
15726ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux1 =
15736ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX1 Mux", tx_adc_mux1_chain_enum,
15746ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
15756ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
15766ccc25f6SSrinivas Kandagatla 
15776ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux2 =
15786ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX2 Mux", tx_adc_mux2_chain_enum,
15796ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
15806ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
15816ccc25f6SSrinivas Kandagatla 
15826ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux3 =
15836ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX3 Mux", tx_adc_mux3_chain_enum,
15846ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
15856ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
15866ccc25f6SSrinivas Kandagatla 
15876ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux4 =
15886ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX4 Mux", tx_adc_mux4_chain_enum,
15896ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
15906ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
15916ccc25f6SSrinivas Kandagatla 
15926ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux5 =
15936ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX5 Mux", tx_adc_mux5_chain_enum,
15946ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
15956ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
15966ccc25f6SSrinivas Kandagatla 
15976ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux6 =
15986ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX6 Mux", tx_adc_mux6_chain_enum,
15996ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
16006ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
16016ccc25f6SSrinivas Kandagatla 
16026ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux7 =
16036ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX7 Mux", tx_adc_mux7_chain_enum,
16046ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
16056ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
16066ccc25f6SSrinivas Kandagatla 
16076ccc25f6SSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc_mux8 =
16086ccc25f6SSrinivas Kandagatla 	SOC_DAPM_ENUM_EXT("ADC MUX8 Mux", tx_adc_mux8_chain_enum,
16096ccc25f6SSrinivas Kandagatla 			  snd_soc_dapm_get_enum_double,
16106ccc25f6SSrinivas Kandagatla 			  wcd9335_put_dec_enum);
16116ccc25f6SSrinivas Kandagatla 
wcd9335_set_mix_interpolator_rate(struct snd_soc_dai * dai,int rate_val,u32 rate)161220aedafdSSrinivas Kandagatla static int wcd9335_set_mix_interpolator_rate(struct snd_soc_dai *dai,
161320aedafdSSrinivas Kandagatla 					     int rate_val,
161420aedafdSSrinivas Kandagatla 					     u32 rate)
161520aedafdSSrinivas Kandagatla {
161620aedafdSSrinivas Kandagatla 	struct snd_soc_component *component = dai->component;
161720aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
161820aedafdSSrinivas Kandagatla 	struct wcd9335_slim_ch *ch;
161920aedafdSSrinivas Kandagatla 	int val, j;
162020aedafdSSrinivas Kandagatla 
162120aedafdSSrinivas Kandagatla 	list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
162220aedafdSSrinivas Kandagatla 		for (j = 0; j < WCD9335_NUM_INTERPOLATORS; j++) {
1623eaf2767cSKuninori Morimoto 			val = snd_soc_component_read(component,
162420aedafdSSrinivas Kandagatla 					WCD9335_CDC_RX_INP_MUX_RX_INT_CFG1(j)) &
162520aedafdSSrinivas Kandagatla 					WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
162620aedafdSSrinivas Kandagatla 
162720aedafdSSrinivas Kandagatla 			if (val == (ch->shift + INTn_2_INP_SEL_RX0))
162820aedafdSSrinivas Kandagatla 				snd_soc_component_update_bits(component,
162920aedafdSSrinivas Kandagatla 						WCD9335_CDC_RX_PATH_MIX_CTL(j),
163020aedafdSSrinivas Kandagatla 						WCD9335_CDC_MIX_PCM_RATE_MASK,
163120aedafdSSrinivas Kandagatla 						rate_val);
163220aedafdSSrinivas Kandagatla 		}
163320aedafdSSrinivas Kandagatla 	}
163420aedafdSSrinivas Kandagatla 
163520aedafdSSrinivas Kandagatla 	return 0;
163620aedafdSSrinivas Kandagatla }
163720aedafdSSrinivas Kandagatla 
wcd9335_set_prim_interpolator_rate(struct snd_soc_dai * dai,u8 rate_val,u32 rate)163820aedafdSSrinivas Kandagatla static int wcd9335_set_prim_interpolator_rate(struct snd_soc_dai *dai,
163920aedafdSSrinivas Kandagatla 					      u8 rate_val,
164020aedafdSSrinivas Kandagatla 					      u32 rate)
164120aedafdSSrinivas Kandagatla {
164220aedafdSSrinivas Kandagatla 	struct snd_soc_component *comp = dai->component;
164320aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
164420aedafdSSrinivas Kandagatla 	struct wcd9335_slim_ch *ch;
164520aedafdSSrinivas Kandagatla 	u8 cfg0, cfg1, inp0_sel, inp1_sel, inp2_sel;
164620aedafdSSrinivas Kandagatla 	int inp, j;
164720aedafdSSrinivas Kandagatla 
164820aedafdSSrinivas Kandagatla 	list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
164920aedafdSSrinivas Kandagatla 		inp = ch->shift + INTn_1_MIX_INP_SEL_RX0;
165020aedafdSSrinivas Kandagatla 		/*
165120aedafdSSrinivas Kandagatla 		 * Loop through all interpolator MUX inputs and find out
165220aedafdSSrinivas Kandagatla 		 * to which interpolator input, the slim rx port
165320aedafdSSrinivas Kandagatla 		 * is connected
165420aedafdSSrinivas Kandagatla 		 */
165520aedafdSSrinivas Kandagatla 		for (j = 0; j < WCD9335_NUM_INTERPOLATORS; j++) {
1656eaf2767cSKuninori Morimoto 			cfg0 = snd_soc_component_read(comp,
165720aedafdSSrinivas Kandagatla 					WCD9335_CDC_RX_INP_MUX_RX_INT_CFG0(j));
1658eaf2767cSKuninori Morimoto 			cfg1 = snd_soc_component_read(comp,
165920aedafdSSrinivas Kandagatla 					WCD9335_CDC_RX_INP_MUX_RX_INT_CFG1(j));
166020aedafdSSrinivas Kandagatla 
166120aedafdSSrinivas Kandagatla 			inp0_sel = cfg0 &
166220aedafdSSrinivas Kandagatla 				 WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
166320aedafdSSrinivas Kandagatla 			inp1_sel = (cfg0 >> 4) &
166420aedafdSSrinivas Kandagatla 				 WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
166520aedafdSSrinivas Kandagatla 			inp2_sel = (cfg1 >> 4) &
166620aedafdSSrinivas Kandagatla 				 WCD9335_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
166720aedafdSSrinivas Kandagatla 
166820aedafdSSrinivas Kandagatla 			if ((inp0_sel == inp) ||  (inp1_sel == inp) ||
166920aedafdSSrinivas Kandagatla 			    (inp2_sel == inp)) {
167020aedafdSSrinivas Kandagatla 				/* rate is in Hz */
167120aedafdSSrinivas Kandagatla 				if ((j == 0) && (rate == 44100))
167220aedafdSSrinivas Kandagatla 					dev_info(wcd->dev,
167320aedafdSSrinivas Kandagatla 						"Cannot set 44.1KHz on INT0\n");
167420aedafdSSrinivas Kandagatla 				else
167520aedafdSSrinivas Kandagatla 					snd_soc_component_update_bits(comp,
167620aedafdSSrinivas Kandagatla 						WCD9335_CDC_RX_PATH_CTL(j),
167720aedafdSSrinivas Kandagatla 						WCD9335_CDC_MIX_PCM_RATE_MASK,
167820aedafdSSrinivas Kandagatla 						rate_val);
167920aedafdSSrinivas Kandagatla 			}
168020aedafdSSrinivas Kandagatla 		}
168120aedafdSSrinivas Kandagatla 	}
168220aedafdSSrinivas Kandagatla 
168320aedafdSSrinivas Kandagatla 	return 0;
168420aedafdSSrinivas Kandagatla }
168520aedafdSSrinivas Kandagatla 
wcd9335_set_interpolator_rate(struct snd_soc_dai * dai,u32 rate)168620aedafdSSrinivas Kandagatla static int wcd9335_set_interpolator_rate(struct snd_soc_dai *dai, u32 rate)
168720aedafdSSrinivas Kandagatla {
168820aedafdSSrinivas Kandagatla 	int i;
168920aedafdSSrinivas Kandagatla 
169020aedafdSSrinivas Kandagatla 	/* set mixing path rate */
169120aedafdSSrinivas Kandagatla 	for (i = 0; i < ARRAY_SIZE(int_mix_rate_val); i++) {
169220aedafdSSrinivas Kandagatla 		if (rate == int_mix_rate_val[i].rate) {
169320aedafdSSrinivas Kandagatla 			wcd9335_set_mix_interpolator_rate(dai,
169420aedafdSSrinivas Kandagatla 					int_mix_rate_val[i].rate_val, rate);
169520aedafdSSrinivas Kandagatla 			break;
169620aedafdSSrinivas Kandagatla 		}
169720aedafdSSrinivas Kandagatla 	}
169820aedafdSSrinivas Kandagatla 
169920aedafdSSrinivas Kandagatla 	/* set primary path sample rate */
170020aedafdSSrinivas Kandagatla 	for (i = 0; i < ARRAY_SIZE(int_prim_rate_val); i++) {
170120aedafdSSrinivas Kandagatla 		if (rate == int_prim_rate_val[i].rate) {
170220aedafdSSrinivas Kandagatla 			wcd9335_set_prim_interpolator_rate(dai,
170320aedafdSSrinivas Kandagatla 					int_prim_rate_val[i].rate_val, rate);
170420aedafdSSrinivas Kandagatla 			break;
170520aedafdSSrinivas Kandagatla 		}
170620aedafdSSrinivas Kandagatla 	}
170720aedafdSSrinivas Kandagatla 
170820aedafdSSrinivas Kandagatla 	return 0;
170920aedafdSSrinivas Kandagatla }
171020aedafdSSrinivas Kandagatla 
wcd9335_slim_set_hw_params(struct wcd9335_codec * wcd,struct wcd_slim_codec_dai_data * dai_data,int direction)171120aedafdSSrinivas Kandagatla static int wcd9335_slim_set_hw_params(struct wcd9335_codec *wcd,
171220aedafdSSrinivas Kandagatla 				 struct wcd_slim_codec_dai_data *dai_data,
171320aedafdSSrinivas Kandagatla 				 int direction)
171420aedafdSSrinivas Kandagatla {
171520aedafdSSrinivas Kandagatla 	struct list_head *slim_ch_list = &dai_data->slim_ch_list;
171620aedafdSSrinivas Kandagatla 	struct slim_stream_config *cfg = &dai_data->sconfig;
171720aedafdSSrinivas Kandagatla 	struct wcd9335_slim_ch *ch;
171820aedafdSSrinivas Kandagatla 	u16 payload = 0;
171920aedafdSSrinivas Kandagatla 	int ret, i;
172020aedafdSSrinivas Kandagatla 
172120aedafdSSrinivas Kandagatla 	cfg->ch_count = 0;
172220aedafdSSrinivas Kandagatla 	cfg->direction = direction;
172320aedafdSSrinivas Kandagatla 	cfg->port_mask = 0;
172420aedafdSSrinivas Kandagatla 
172520aedafdSSrinivas Kandagatla 	/* Configure slave interface device */
172620aedafdSSrinivas Kandagatla 	list_for_each_entry(ch, slim_ch_list, list) {
172720aedafdSSrinivas Kandagatla 		cfg->ch_count++;
172820aedafdSSrinivas Kandagatla 		payload |= 1 << ch->shift;
172920aedafdSSrinivas Kandagatla 		cfg->port_mask |= BIT(ch->port);
173020aedafdSSrinivas Kandagatla 	}
173120aedafdSSrinivas Kandagatla 
173220aedafdSSrinivas Kandagatla 	cfg->chs = kcalloc(cfg->ch_count, sizeof(unsigned int), GFP_KERNEL);
173320aedafdSSrinivas Kandagatla 	if (!cfg->chs)
173420aedafdSSrinivas Kandagatla 		return -ENOMEM;
173520aedafdSSrinivas Kandagatla 
173620aedafdSSrinivas Kandagatla 	i = 0;
173720aedafdSSrinivas Kandagatla 	list_for_each_entry(ch, slim_ch_list, list) {
173820aedafdSSrinivas Kandagatla 		cfg->chs[i++] = ch->ch_num;
173920aedafdSSrinivas Kandagatla 		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
174020aedafdSSrinivas Kandagatla 			/* write to interface device */
174120aedafdSSrinivas Kandagatla 			ret = regmap_write(wcd->if_regmap,
174220aedafdSSrinivas Kandagatla 				WCD9335_SLIM_PGD_RX_PORT_MULTI_CHNL_0(ch->port),
174320aedafdSSrinivas Kandagatla 				payload);
174420aedafdSSrinivas Kandagatla 
174520aedafdSSrinivas Kandagatla 			if (ret < 0)
174620aedafdSSrinivas Kandagatla 				goto err;
174720aedafdSSrinivas Kandagatla 
174820aedafdSSrinivas Kandagatla 			/* configure the slave port for water mark and enable*/
174920aedafdSSrinivas Kandagatla 			ret = regmap_write(wcd->if_regmap,
175020aedafdSSrinivas Kandagatla 					WCD9335_SLIM_PGD_RX_PORT_CFG(ch->port),
175120aedafdSSrinivas Kandagatla 					WCD9335_SLIM_WATER_MARK_VAL);
175220aedafdSSrinivas Kandagatla 			if (ret < 0)
175320aedafdSSrinivas Kandagatla 				goto err;
17546ccc25f6SSrinivas Kandagatla 		} else {
17556ccc25f6SSrinivas Kandagatla 			ret = regmap_write(wcd->if_regmap,
17566ccc25f6SSrinivas Kandagatla 				WCD9335_SLIM_PGD_TX_PORT_MULTI_CHNL_0(ch->port),
17576ccc25f6SSrinivas Kandagatla 				payload & 0x00FF);
17586ccc25f6SSrinivas Kandagatla 			if (ret < 0)
17596ccc25f6SSrinivas Kandagatla 				goto err;
17606ccc25f6SSrinivas Kandagatla 
17616ccc25f6SSrinivas Kandagatla 			/* ports 8,9 */
17626ccc25f6SSrinivas Kandagatla 			ret = regmap_write(wcd->if_regmap,
17636ccc25f6SSrinivas Kandagatla 				WCD9335_SLIM_PGD_TX_PORT_MULTI_CHNL_1(ch->port),
17646ccc25f6SSrinivas Kandagatla 				(payload & 0xFF00)>>8);
17656ccc25f6SSrinivas Kandagatla 			if (ret < 0)
17666ccc25f6SSrinivas Kandagatla 				goto err;
17676ccc25f6SSrinivas Kandagatla 
17686ccc25f6SSrinivas Kandagatla 			/* configure the slave port for water mark and enable*/
17696ccc25f6SSrinivas Kandagatla 			ret = regmap_write(wcd->if_regmap,
17706ccc25f6SSrinivas Kandagatla 					WCD9335_SLIM_PGD_TX_PORT_CFG(ch->port),
17716ccc25f6SSrinivas Kandagatla 					WCD9335_SLIM_WATER_MARK_VAL);
17726ccc25f6SSrinivas Kandagatla 
17736ccc25f6SSrinivas Kandagatla 			if (ret < 0)
17746ccc25f6SSrinivas Kandagatla 				goto err;
177520aedafdSSrinivas Kandagatla 		}
177620aedafdSSrinivas Kandagatla 	}
177720aedafdSSrinivas Kandagatla 
177820aedafdSSrinivas Kandagatla 	dai_data->sruntime = slim_stream_allocate(wcd->slim, "WCD9335-SLIM");
177920aedafdSSrinivas Kandagatla 
178020aedafdSSrinivas Kandagatla 	return 0;
178120aedafdSSrinivas Kandagatla 
178220aedafdSSrinivas Kandagatla err:
178320aedafdSSrinivas Kandagatla 	dev_err(wcd->dev, "Error Setting slim hw params\n");
178420aedafdSSrinivas Kandagatla 	kfree(cfg->chs);
178520aedafdSSrinivas Kandagatla 	cfg->chs = NULL;
178620aedafdSSrinivas Kandagatla 
178720aedafdSSrinivas Kandagatla 	return ret;
178820aedafdSSrinivas Kandagatla }
178920aedafdSSrinivas Kandagatla 
wcd9335_set_decimator_rate(struct snd_soc_dai * dai,u8 rate_val,u32 rate)17906ccc25f6SSrinivas Kandagatla static int wcd9335_set_decimator_rate(struct snd_soc_dai *dai,
17916ccc25f6SSrinivas Kandagatla 				      u8 rate_val, u32 rate)
17926ccc25f6SSrinivas Kandagatla {
17936ccc25f6SSrinivas Kandagatla 	struct snd_soc_component *comp = dai->component;
17946ccc25f6SSrinivas Kandagatla 	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
17956ccc25f6SSrinivas Kandagatla 	u8 shift = 0, shift_val = 0, tx_mux_sel;
17966ccc25f6SSrinivas Kandagatla 	struct wcd9335_slim_ch *ch;
17976ccc25f6SSrinivas Kandagatla 	int tx_port, tx_port_reg;
17986ccc25f6SSrinivas Kandagatla 	int decimator = -1;
17996ccc25f6SSrinivas Kandagatla 
18006ccc25f6SSrinivas Kandagatla 	list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
18016ccc25f6SSrinivas Kandagatla 		tx_port = ch->port;
18026ccc25f6SSrinivas Kandagatla 		if ((tx_port == 12) || (tx_port >= 14)) {
18036ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n",
18046ccc25f6SSrinivas Kandagatla 				tx_port, dai->id);
18056ccc25f6SSrinivas Kandagatla 			return -EINVAL;
18066ccc25f6SSrinivas Kandagatla 		}
18076ccc25f6SSrinivas Kandagatla 		/* Find the SB TX MUX input - which decimator is connected */
18086ccc25f6SSrinivas Kandagatla 		if (tx_port < 4) {
18096ccc25f6SSrinivas Kandagatla 			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG0;
18106ccc25f6SSrinivas Kandagatla 			shift = (tx_port << 1);
18116ccc25f6SSrinivas Kandagatla 			shift_val = 0x03;
18120016361dSPierre-Louis Bossart 		} else if (tx_port < 8) {
18136ccc25f6SSrinivas Kandagatla 			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG1;
18146ccc25f6SSrinivas Kandagatla 			shift = ((tx_port - 4) << 1);
18156ccc25f6SSrinivas Kandagatla 			shift_val = 0x03;
18160016361dSPierre-Louis Bossart 		} else if (tx_port < 11) {
18176ccc25f6SSrinivas Kandagatla 			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG2;
18186ccc25f6SSrinivas Kandagatla 			shift = ((tx_port - 8) << 1);
18196ccc25f6SSrinivas Kandagatla 			shift_val = 0x03;
18206ccc25f6SSrinivas Kandagatla 		} else if (tx_port == 11) {
18216ccc25f6SSrinivas Kandagatla 			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3;
18226ccc25f6SSrinivas Kandagatla 			shift = 0;
18236ccc25f6SSrinivas Kandagatla 			shift_val = 0x0F;
1824c9a9b4dbSPierre-Louis Bossart 		} else /* (tx_port == 13) */ {
18256ccc25f6SSrinivas Kandagatla 			tx_port_reg = WCD9335_CDC_IF_ROUTER_TX_MUX_CFG3;
18266ccc25f6SSrinivas Kandagatla 			shift = 4;
18276ccc25f6SSrinivas Kandagatla 			shift_val = 0x03;
18286ccc25f6SSrinivas Kandagatla 		}
18296ccc25f6SSrinivas Kandagatla 
1830eaf2767cSKuninori Morimoto 		tx_mux_sel = snd_soc_component_read(comp, tx_port_reg) &
18316ccc25f6SSrinivas Kandagatla 						      (shift_val << shift);
18326ccc25f6SSrinivas Kandagatla 
18336ccc25f6SSrinivas Kandagatla 		tx_mux_sel = tx_mux_sel >> shift;
18346ccc25f6SSrinivas Kandagatla 		if (tx_port <= 8) {
18356ccc25f6SSrinivas Kandagatla 			if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3))
18366ccc25f6SSrinivas Kandagatla 				decimator = tx_port;
18376ccc25f6SSrinivas Kandagatla 		} else if (tx_port <= 10) {
18386ccc25f6SSrinivas Kandagatla 			if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2))
18396ccc25f6SSrinivas Kandagatla 				decimator = ((tx_port == 9) ? 7 : 6);
18406ccc25f6SSrinivas Kandagatla 		} else if (tx_port == 11) {
18416ccc25f6SSrinivas Kandagatla 			if ((tx_mux_sel >= 1) && (tx_mux_sel < 7))
18426ccc25f6SSrinivas Kandagatla 				decimator = tx_mux_sel - 1;
18436ccc25f6SSrinivas Kandagatla 		} else if (tx_port == 13) {
18446ccc25f6SSrinivas Kandagatla 			if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2))
18456ccc25f6SSrinivas Kandagatla 				decimator = 5;
18466ccc25f6SSrinivas Kandagatla 		}
18476ccc25f6SSrinivas Kandagatla 
18486ccc25f6SSrinivas Kandagatla 		if (decimator >= 0) {
18496ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,
18506ccc25f6SSrinivas Kandagatla 					WCD9335_CDC_TX_PATH_CTL(decimator),
18516ccc25f6SSrinivas Kandagatla 					WCD9335_CDC_TX_PATH_CTL_PCM_RATE_MASK,
18526ccc25f6SSrinivas Kandagatla 					rate_val);
18536ccc25f6SSrinivas Kandagatla 		} else if ((tx_port <= 8) && (tx_mux_sel == 0x01)) {
18546ccc25f6SSrinivas Kandagatla 			/* Check if the TX Mux input is RX MIX TXn */
18556ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "RX_MIX_TX%u going to SLIM TX%u\n",
18566ccc25f6SSrinivas Kandagatla 				tx_port, tx_port);
18576ccc25f6SSrinivas Kandagatla 		} else {
18586ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "ERROR: Invalid decimator: %d\n",
18596ccc25f6SSrinivas Kandagatla 				decimator);
18606ccc25f6SSrinivas Kandagatla 			return -EINVAL;
18616ccc25f6SSrinivas Kandagatla 		}
18626ccc25f6SSrinivas Kandagatla 	}
18636ccc25f6SSrinivas Kandagatla 
18646ccc25f6SSrinivas Kandagatla 	return 0;
18656ccc25f6SSrinivas Kandagatla }
18666ccc25f6SSrinivas Kandagatla 
wcd9335_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)186720aedafdSSrinivas Kandagatla static int wcd9335_hw_params(struct snd_pcm_substream *substream,
186820aedafdSSrinivas Kandagatla 			   struct snd_pcm_hw_params *params,
186920aedafdSSrinivas Kandagatla 			   struct snd_soc_dai *dai)
187020aedafdSSrinivas Kandagatla {
187120aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd;
18726ccc25f6SSrinivas Kandagatla 	int ret, tx_fs_rate = 0;
187320aedafdSSrinivas Kandagatla 
187420aedafdSSrinivas Kandagatla 	wcd = snd_soc_component_get_drvdata(dai->component);
187520aedafdSSrinivas Kandagatla 
187620aedafdSSrinivas Kandagatla 	switch (substream->stream) {
187720aedafdSSrinivas Kandagatla 	case SNDRV_PCM_STREAM_PLAYBACK:
187820aedafdSSrinivas Kandagatla 		ret = wcd9335_set_interpolator_rate(dai, params_rate(params));
187920aedafdSSrinivas Kandagatla 		if (ret) {
188020aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "cannot set sample rate: %u\n",
188120aedafdSSrinivas Kandagatla 				params_rate(params));
188220aedafdSSrinivas Kandagatla 			return ret;
188320aedafdSSrinivas Kandagatla 		}
188420aedafdSSrinivas Kandagatla 		switch (params_width(params)) {
188520aedafdSSrinivas Kandagatla 		case 16 ... 24:
188620aedafdSSrinivas Kandagatla 			wcd->dai[dai->id].sconfig.bps = params_width(params);
188720aedafdSSrinivas Kandagatla 			break;
188820aedafdSSrinivas Kandagatla 		default:
188920aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "%s: Invalid format 0x%x\n",
189020aedafdSSrinivas Kandagatla 				__func__, params_width(params));
189120aedafdSSrinivas Kandagatla 			return -EINVAL;
189220aedafdSSrinivas Kandagatla 		}
189320aedafdSSrinivas Kandagatla 		break;
18946ccc25f6SSrinivas Kandagatla 
18956ccc25f6SSrinivas Kandagatla 	case SNDRV_PCM_STREAM_CAPTURE:
18966ccc25f6SSrinivas Kandagatla 		switch (params_rate(params)) {
18976ccc25f6SSrinivas Kandagatla 		case 8000:
18986ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 0;
18996ccc25f6SSrinivas Kandagatla 			break;
19006ccc25f6SSrinivas Kandagatla 		case 16000:
19016ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 1;
19026ccc25f6SSrinivas Kandagatla 			break;
19036ccc25f6SSrinivas Kandagatla 		case 32000:
19046ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 3;
19056ccc25f6SSrinivas Kandagatla 			break;
19066ccc25f6SSrinivas Kandagatla 		case 48000:
19076ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 4;
19086ccc25f6SSrinivas Kandagatla 			break;
19096ccc25f6SSrinivas Kandagatla 		case 96000:
19106ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 5;
19116ccc25f6SSrinivas Kandagatla 			break;
19126ccc25f6SSrinivas Kandagatla 		case 192000:
19136ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 6;
19146ccc25f6SSrinivas Kandagatla 			break;
19156ccc25f6SSrinivas Kandagatla 		case 384000:
19166ccc25f6SSrinivas Kandagatla 			tx_fs_rate = 7;
19176ccc25f6SSrinivas Kandagatla 			break;
19186ccc25f6SSrinivas Kandagatla 		default:
19196ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "%s: Invalid TX sample rate: %d\n",
19206ccc25f6SSrinivas Kandagatla 				__func__, params_rate(params));
19216ccc25f6SSrinivas Kandagatla 			return -EINVAL;
19226ccc25f6SSrinivas Kandagatla 
19230eb06746SJason Yan 		}
19246ccc25f6SSrinivas Kandagatla 
19256ccc25f6SSrinivas Kandagatla 		ret = wcd9335_set_decimator_rate(dai, tx_fs_rate,
19266ccc25f6SSrinivas Kandagatla 						params_rate(params));
19276ccc25f6SSrinivas Kandagatla 		if (ret < 0) {
19286ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "Cannot set TX Decimator rate\n");
19296ccc25f6SSrinivas Kandagatla 			return ret;
19306ccc25f6SSrinivas Kandagatla 		}
19316ccc25f6SSrinivas Kandagatla 		switch (params_width(params)) {
19326ccc25f6SSrinivas Kandagatla 		case 16 ... 32:
19336ccc25f6SSrinivas Kandagatla 			wcd->dai[dai->id].sconfig.bps = params_width(params);
19346ccc25f6SSrinivas Kandagatla 			break;
19356ccc25f6SSrinivas Kandagatla 		default:
19366ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "%s: Invalid format 0x%x\n",
19376ccc25f6SSrinivas Kandagatla 				__func__, params_width(params));
19386ccc25f6SSrinivas Kandagatla 			return -EINVAL;
19390eb06746SJason Yan 		}
19406ccc25f6SSrinivas Kandagatla 		break;
194120aedafdSSrinivas Kandagatla 	default:
194220aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "Invalid stream type %d\n",
194320aedafdSSrinivas Kandagatla 			substream->stream);
194420aedafdSSrinivas Kandagatla 		return -EINVAL;
19450eb06746SJason Yan 	}
194620aedafdSSrinivas Kandagatla 
194720aedafdSSrinivas Kandagatla 	wcd->dai[dai->id].sconfig.rate = params_rate(params);
194820aedafdSSrinivas Kandagatla 	wcd9335_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream);
194920aedafdSSrinivas Kandagatla 
195020aedafdSSrinivas Kandagatla 	return 0;
195120aedafdSSrinivas Kandagatla }
195220aedafdSSrinivas Kandagatla 
wcd9335_trigger(struct snd_pcm_substream * substream,int cmd,struct snd_soc_dai * dai)195320aedafdSSrinivas Kandagatla static int wcd9335_trigger(struct snd_pcm_substream *substream, int cmd,
195420aedafdSSrinivas Kandagatla 			   struct snd_soc_dai *dai)
195520aedafdSSrinivas Kandagatla {
195620aedafdSSrinivas Kandagatla 	struct wcd_slim_codec_dai_data *dai_data;
195720aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd;
195820aedafdSSrinivas Kandagatla 	struct slim_stream_config *cfg;
195920aedafdSSrinivas Kandagatla 
196020aedafdSSrinivas Kandagatla 	wcd = snd_soc_component_get_drvdata(dai->component);
196120aedafdSSrinivas Kandagatla 
196220aedafdSSrinivas Kandagatla 	dai_data = &wcd->dai[dai->id];
196320aedafdSSrinivas Kandagatla 
196420aedafdSSrinivas Kandagatla 	switch (cmd) {
196520aedafdSSrinivas Kandagatla 	case SNDRV_PCM_TRIGGER_START:
196620aedafdSSrinivas Kandagatla 	case SNDRV_PCM_TRIGGER_RESUME:
196720aedafdSSrinivas Kandagatla 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
196820aedafdSSrinivas Kandagatla 		cfg = &dai_data->sconfig;
196920aedafdSSrinivas Kandagatla 		slim_stream_prepare(dai_data->sruntime, cfg);
197020aedafdSSrinivas Kandagatla 		slim_stream_enable(dai_data->sruntime);
197120aedafdSSrinivas Kandagatla 		break;
197220aedafdSSrinivas Kandagatla 	case SNDRV_PCM_TRIGGER_STOP:
197320aedafdSSrinivas Kandagatla 	case SNDRV_PCM_TRIGGER_SUSPEND:
197420aedafdSSrinivas Kandagatla 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
197520aedafdSSrinivas Kandagatla 		slim_stream_disable(dai_data->sruntime);
1976ea8ef003SKrzysztof Kozlowski 		slim_stream_unprepare(dai_data->sruntime);
197720aedafdSSrinivas Kandagatla 		break;
197820aedafdSSrinivas Kandagatla 	default:
197920aedafdSSrinivas Kandagatla 		break;
198020aedafdSSrinivas Kandagatla 	}
198120aedafdSSrinivas Kandagatla 
198220aedafdSSrinivas Kandagatla 	return 0;
198320aedafdSSrinivas Kandagatla }
198420aedafdSSrinivas Kandagatla 
wcd9335_set_channel_map(struct snd_soc_dai * dai,unsigned int tx_num,unsigned int * tx_slot,unsigned int rx_num,unsigned int * rx_slot)198520aedafdSSrinivas Kandagatla static int wcd9335_set_channel_map(struct snd_soc_dai *dai,
198620aedafdSSrinivas Kandagatla 				   unsigned int tx_num, unsigned int *tx_slot,
198720aedafdSSrinivas Kandagatla 				   unsigned int rx_num, unsigned int *rx_slot)
198820aedafdSSrinivas Kandagatla {
198920aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd;
199020aedafdSSrinivas Kandagatla 	int i;
199120aedafdSSrinivas Kandagatla 
199220aedafdSSrinivas Kandagatla 	wcd = snd_soc_component_get_drvdata(dai->component);
199320aedafdSSrinivas Kandagatla 
199420aedafdSSrinivas Kandagatla 	if (!tx_slot || !rx_slot) {
199520aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n",
199620aedafdSSrinivas Kandagatla 			tx_slot, rx_slot);
199720aedafdSSrinivas Kandagatla 		return -EINVAL;
199820aedafdSSrinivas Kandagatla 	}
199920aedafdSSrinivas Kandagatla 
200020aedafdSSrinivas Kandagatla 	wcd->num_rx_port = rx_num;
200120aedafdSSrinivas Kandagatla 	for (i = 0; i < rx_num; i++) {
200220aedafdSSrinivas Kandagatla 		wcd->rx_chs[i].ch_num = rx_slot[i];
200320aedafdSSrinivas Kandagatla 		INIT_LIST_HEAD(&wcd->rx_chs[i].list);
200420aedafdSSrinivas Kandagatla 	}
200520aedafdSSrinivas Kandagatla 
20066ccc25f6SSrinivas Kandagatla 	wcd->num_tx_port = tx_num;
20076ccc25f6SSrinivas Kandagatla 	for (i = 0; i < tx_num; i++) {
20086ccc25f6SSrinivas Kandagatla 		wcd->tx_chs[i].ch_num = tx_slot[i];
20096ccc25f6SSrinivas Kandagatla 		INIT_LIST_HEAD(&wcd->tx_chs[i].list);
20106ccc25f6SSrinivas Kandagatla 	}
20116ccc25f6SSrinivas Kandagatla 
201220aedafdSSrinivas Kandagatla 	return 0;
201320aedafdSSrinivas Kandagatla }
201420aedafdSSrinivas Kandagatla 
wcd9335_get_channel_map(struct snd_soc_dai * dai,unsigned int * tx_num,unsigned int * tx_slot,unsigned int * rx_num,unsigned int * rx_slot)201520aedafdSSrinivas Kandagatla static int wcd9335_get_channel_map(struct snd_soc_dai *dai,
201620aedafdSSrinivas Kandagatla 				   unsigned int *tx_num, unsigned int *tx_slot,
201720aedafdSSrinivas Kandagatla 				   unsigned int *rx_num, unsigned int *rx_slot)
201820aedafdSSrinivas Kandagatla {
201920aedafdSSrinivas Kandagatla 	struct wcd9335_slim_ch *ch;
202020aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd;
202120aedafdSSrinivas Kandagatla 	int i = 0;
202220aedafdSSrinivas Kandagatla 
202320aedafdSSrinivas Kandagatla 	wcd = snd_soc_component_get_drvdata(dai->component);
202420aedafdSSrinivas Kandagatla 
202520aedafdSSrinivas Kandagatla 	switch (dai->id) {
202620aedafdSSrinivas Kandagatla 	case AIF1_PB:
202720aedafdSSrinivas Kandagatla 	case AIF2_PB:
202820aedafdSSrinivas Kandagatla 	case AIF3_PB:
202920aedafdSSrinivas Kandagatla 	case AIF4_PB:
203020aedafdSSrinivas Kandagatla 		if (!rx_slot || !rx_num) {
203120aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n",
203220aedafdSSrinivas Kandagatla 				rx_slot, rx_num);
203320aedafdSSrinivas Kandagatla 			return -EINVAL;
203420aedafdSSrinivas Kandagatla 		}
203520aedafdSSrinivas Kandagatla 
203620aedafdSSrinivas Kandagatla 		list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
203720aedafdSSrinivas Kandagatla 			rx_slot[i++] = ch->ch_num;
203820aedafdSSrinivas Kandagatla 
203920aedafdSSrinivas Kandagatla 		*rx_num = i;
204020aedafdSSrinivas Kandagatla 		break;
20416ccc25f6SSrinivas Kandagatla 	case AIF1_CAP:
20426ccc25f6SSrinivas Kandagatla 	case AIF2_CAP:
20436ccc25f6SSrinivas Kandagatla 	case AIF3_CAP:
20446ccc25f6SSrinivas Kandagatla 		if (!tx_slot || !tx_num) {
20456ccc25f6SSrinivas Kandagatla 			dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n",
20466ccc25f6SSrinivas Kandagatla 				tx_slot, tx_num);
20476ccc25f6SSrinivas Kandagatla 			return -EINVAL;
20486ccc25f6SSrinivas Kandagatla 		}
20496ccc25f6SSrinivas Kandagatla 		list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
20506ccc25f6SSrinivas Kandagatla 			tx_slot[i++] = ch->ch_num;
20516ccc25f6SSrinivas Kandagatla 
20526ccc25f6SSrinivas Kandagatla 		*tx_num = i;
20536ccc25f6SSrinivas Kandagatla 		break;
205420aedafdSSrinivas Kandagatla 	default:
205520aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id);
205620aedafdSSrinivas Kandagatla 		break;
205720aedafdSSrinivas Kandagatla 	}
205820aedafdSSrinivas Kandagatla 
205920aedafdSSrinivas Kandagatla 	return 0;
206020aedafdSSrinivas Kandagatla }
206120aedafdSSrinivas Kandagatla 
206233e12deaSYe Bin static const struct snd_soc_dai_ops wcd9335_dai_ops = {
206320aedafdSSrinivas Kandagatla 	.hw_params = wcd9335_hw_params,
206420aedafdSSrinivas Kandagatla 	.trigger = wcd9335_trigger,
206520aedafdSSrinivas Kandagatla 	.set_channel_map = wcd9335_set_channel_map,
206620aedafdSSrinivas Kandagatla 	.get_channel_map = wcd9335_get_channel_map,
206720aedafdSSrinivas Kandagatla };
206820aedafdSSrinivas Kandagatla 
206920aedafdSSrinivas Kandagatla static struct snd_soc_dai_driver wcd9335_slim_dais[] = {
207020aedafdSSrinivas Kandagatla 	[0] = {
207120aedafdSSrinivas Kandagatla 		.name = "wcd9335_rx1",
207220aedafdSSrinivas Kandagatla 		.id = AIF1_PB,
207320aedafdSSrinivas Kandagatla 		.playback = {
207420aedafdSSrinivas Kandagatla 			.stream_name = "AIF1 Playback",
2075a8a652bfSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
2076a8a652bfSSrinivas Kandagatla 				 SNDRV_PCM_RATE_384000,
207720aedafdSSrinivas Kandagatla 			.formats = WCD9335_FORMATS_S16_S24_LE,
2078a8a652bfSSrinivas Kandagatla 			.rate_max = 384000,
207920aedafdSSrinivas Kandagatla 			.rate_min = 8000,
208020aedafdSSrinivas Kandagatla 			.channels_min = 1,
208120aedafdSSrinivas Kandagatla 			.channels_max = 2,
208220aedafdSSrinivas Kandagatla 		},
208320aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
208420aedafdSSrinivas Kandagatla 	},
208520aedafdSSrinivas Kandagatla 	[1] = {
208620aedafdSSrinivas Kandagatla 		.name = "wcd9335_tx1",
208720aedafdSSrinivas Kandagatla 		.id = AIF1_CAP,
208820aedafdSSrinivas Kandagatla 		.capture = {
208920aedafdSSrinivas Kandagatla 			.stream_name = "AIF1 Capture",
209020aedafdSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK,
209120aedafdSSrinivas Kandagatla 			.formats = SNDRV_PCM_FMTBIT_S16_LE,
209220aedafdSSrinivas Kandagatla 			.rate_min = 8000,
209320aedafdSSrinivas Kandagatla 			.rate_max = 192000,
209420aedafdSSrinivas Kandagatla 			.channels_min = 1,
209520aedafdSSrinivas Kandagatla 			.channels_max = 4,
209620aedafdSSrinivas Kandagatla 		},
209720aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
209820aedafdSSrinivas Kandagatla 	},
209920aedafdSSrinivas Kandagatla 	[2] = {
210020aedafdSSrinivas Kandagatla 		.name = "wcd9335_rx2",
210120aedafdSSrinivas Kandagatla 		.id = AIF2_PB,
210220aedafdSSrinivas Kandagatla 		.playback = {
210320aedafdSSrinivas Kandagatla 			.stream_name = "AIF2 Playback",
2104a8a652bfSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
2105a8a652bfSSrinivas Kandagatla 				 SNDRV_PCM_RATE_384000,
210620aedafdSSrinivas Kandagatla 			.formats = WCD9335_FORMATS_S16_S24_LE,
210720aedafdSSrinivas Kandagatla 			.rate_min = 8000,
2108a8a652bfSSrinivas Kandagatla 			.rate_max = 384000,
210920aedafdSSrinivas Kandagatla 			.channels_min = 1,
211020aedafdSSrinivas Kandagatla 			.channels_max = 2,
211120aedafdSSrinivas Kandagatla 		},
211220aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
211320aedafdSSrinivas Kandagatla 	},
211420aedafdSSrinivas Kandagatla 	[3] = {
211520aedafdSSrinivas Kandagatla 		.name = "wcd9335_tx2",
211620aedafdSSrinivas Kandagatla 		.id = AIF2_CAP,
211720aedafdSSrinivas Kandagatla 		.capture = {
211820aedafdSSrinivas Kandagatla 			.stream_name = "AIF2 Capture",
211920aedafdSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK,
212020aedafdSSrinivas Kandagatla 			.formats = SNDRV_PCM_FMTBIT_S16_LE,
212120aedafdSSrinivas Kandagatla 			.rate_min = 8000,
212220aedafdSSrinivas Kandagatla 			.rate_max = 192000,
212320aedafdSSrinivas Kandagatla 			.channels_min = 1,
212420aedafdSSrinivas Kandagatla 			.channels_max = 4,
212520aedafdSSrinivas Kandagatla 		},
212620aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
212720aedafdSSrinivas Kandagatla 	},
212820aedafdSSrinivas Kandagatla 	[4] = {
212920aedafdSSrinivas Kandagatla 		.name = "wcd9335_rx3",
213020aedafdSSrinivas Kandagatla 		.id = AIF3_PB,
213120aedafdSSrinivas Kandagatla 		.playback = {
213220aedafdSSrinivas Kandagatla 			.stream_name = "AIF3 Playback",
2133a8a652bfSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
2134a8a652bfSSrinivas Kandagatla 				 SNDRV_PCM_RATE_384000,
213520aedafdSSrinivas Kandagatla 			.formats = WCD9335_FORMATS_S16_S24_LE,
213620aedafdSSrinivas Kandagatla 			.rate_min = 8000,
2137a8a652bfSSrinivas Kandagatla 			.rate_max = 384000,
213820aedafdSSrinivas Kandagatla 			.channels_min = 1,
213920aedafdSSrinivas Kandagatla 			.channels_max = 2,
214020aedafdSSrinivas Kandagatla 		},
214120aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
214220aedafdSSrinivas Kandagatla 	},
214320aedafdSSrinivas Kandagatla 	[5] = {
214420aedafdSSrinivas Kandagatla 		.name = "wcd9335_tx3",
214520aedafdSSrinivas Kandagatla 		.id = AIF3_CAP,
214620aedafdSSrinivas Kandagatla 		.capture = {
214720aedafdSSrinivas Kandagatla 			.stream_name = "AIF3 Capture",
214820aedafdSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK,
214920aedafdSSrinivas Kandagatla 			.formats = SNDRV_PCM_FMTBIT_S16_LE,
215020aedafdSSrinivas Kandagatla 			.rate_min = 8000,
215120aedafdSSrinivas Kandagatla 			.rate_max = 192000,
215220aedafdSSrinivas Kandagatla 			.channels_min = 1,
215320aedafdSSrinivas Kandagatla 			.channels_max = 4,
215420aedafdSSrinivas Kandagatla 		},
215520aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
215620aedafdSSrinivas Kandagatla 	},
215720aedafdSSrinivas Kandagatla 	[6] = {
215820aedafdSSrinivas Kandagatla 		.name = "wcd9335_rx4",
215920aedafdSSrinivas Kandagatla 		.id = AIF4_PB,
216020aedafdSSrinivas Kandagatla 		.playback = {
216120aedafdSSrinivas Kandagatla 			.stream_name = "AIF4 Playback",
2162a8a652bfSSrinivas Kandagatla 			.rates = WCD9335_RATES_MASK | WCD9335_FRAC_RATES_MASK |
2163a8a652bfSSrinivas Kandagatla 				 SNDRV_PCM_RATE_384000,
216420aedafdSSrinivas Kandagatla 			.formats = WCD9335_FORMATS_S16_S24_LE,
216520aedafdSSrinivas Kandagatla 			.rate_min = 8000,
2166a8a652bfSSrinivas Kandagatla 			.rate_max = 384000,
216720aedafdSSrinivas Kandagatla 			.channels_min = 1,
216820aedafdSSrinivas Kandagatla 			.channels_max = 2,
216920aedafdSSrinivas Kandagatla 		},
217020aedafdSSrinivas Kandagatla 		.ops = &wcd9335_dai_ops,
217120aedafdSSrinivas Kandagatla 	},
217220aedafdSSrinivas Kandagatla };
217320aedafdSSrinivas Kandagatla 
wcd9335_get_compander(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)21748c4f021dSSrinivas Kandagatla static int wcd9335_get_compander(struct snd_kcontrol *kc,
21758c4f021dSSrinivas Kandagatla 			       struct snd_ctl_elem_value *ucontrol)
21768c4f021dSSrinivas Kandagatla {
21778c4f021dSSrinivas Kandagatla 
21788c4f021dSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
21798c4f021dSSrinivas Kandagatla 	int comp = ((struct soc_mixer_control *)kc->private_value)->shift;
21808c4f021dSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
21818c4f021dSSrinivas Kandagatla 
21828c4f021dSSrinivas Kandagatla 	ucontrol->value.integer.value[0] = wcd->comp_enabled[comp];
21838c4f021dSSrinivas Kandagatla 	return 0;
21848c4f021dSSrinivas Kandagatla }
21858c4f021dSSrinivas Kandagatla 
wcd9335_set_compander(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)21868c4f021dSSrinivas Kandagatla static int wcd9335_set_compander(struct snd_kcontrol *kc,
21878c4f021dSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
21888c4f021dSSrinivas Kandagatla {
21898c4f021dSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
21908c4f021dSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
21918c4f021dSSrinivas Kandagatla 	int comp = ((struct soc_mixer_control *) kc->private_value)->shift;
21928c4f021dSSrinivas Kandagatla 	int value = ucontrol->value.integer.value[0];
21938c4f021dSSrinivas Kandagatla 	int sel;
21948c4f021dSSrinivas Kandagatla 
21958c4f021dSSrinivas Kandagatla 	wcd->comp_enabled[comp] = value;
21968c4f021dSSrinivas Kandagatla 	sel = value ? WCD9335_HPH_GAIN_SRC_SEL_COMPANDER :
21978c4f021dSSrinivas Kandagatla 		WCD9335_HPH_GAIN_SRC_SEL_REGISTER;
21988c4f021dSSrinivas Kandagatla 
21998c4f021dSSrinivas Kandagatla 	/* Any specific register configuration for compander */
22008c4f021dSSrinivas Kandagatla 	switch (comp) {
22018c4f021dSSrinivas Kandagatla 	case COMPANDER_1:
22028c4f021dSSrinivas Kandagatla 		/* Set Gain Source Select based on compander enable/disable */
22038c4f021dSSrinivas Kandagatla 		snd_soc_component_update_bits(component, WCD9335_HPH_L_EN,
22048c4f021dSSrinivas Kandagatla 				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
22058c4f021dSSrinivas Kandagatla 		break;
22068c4f021dSSrinivas Kandagatla 	case COMPANDER_2:
22078c4f021dSSrinivas Kandagatla 		snd_soc_component_update_bits(component, WCD9335_HPH_R_EN,
22088c4f021dSSrinivas Kandagatla 				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
22098c4f021dSSrinivas Kandagatla 		break;
22108c4f021dSSrinivas Kandagatla 	case COMPANDER_5:
22118c4f021dSSrinivas Kandagatla 		snd_soc_component_update_bits(component, WCD9335_SE_LO_LO3_GAIN,
22128c4f021dSSrinivas Kandagatla 				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
22138c4f021dSSrinivas Kandagatla 		break;
22148c4f021dSSrinivas Kandagatla 	case COMPANDER_6:
22158c4f021dSSrinivas Kandagatla 		snd_soc_component_update_bits(component, WCD9335_SE_LO_LO4_GAIN,
22168c4f021dSSrinivas Kandagatla 				      WCD9335_HPH_GAIN_SRC_SEL_MASK, sel);
22178c4f021dSSrinivas Kandagatla 		break;
22188c4f021dSSrinivas Kandagatla 	default:
22198c4f021dSSrinivas Kandagatla 		break;
22200eb06746SJason Yan 	}
22218c4f021dSSrinivas Kandagatla 
22228c4f021dSSrinivas Kandagatla 	return 0;
22238c4f021dSSrinivas Kandagatla }
22248c4f021dSSrinivas Kandagatla 
wcd9335_rx_hph_mode_get(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)22258c4f021dSSrinivas Kandagatla static int wcd9335_rx_hph_mode_get(struct snd_kcontrol *kc,
22268c4f021dSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
22278c4f021dSSrinivas Kandagatla {
22288c4f021dSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
22298c4f021dSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
22308c4f021dSSrinivas Kandagatla 
22318c4f021dSSrinivas Kandagatla 	ucontrol->value.enumerated.item[0] = wcd->hph_mode;
22328c4f021dSSrinivas Kandagatla 
22338c4f021dSSrinivas Kandagatla 	return 0;
22348c4f021dSSrinivas Kandagatla }
22358c4f021dSSrinivas Kandagatla 
wcd9335_rx_hph_mode_put(struct snd_kcontrol * kc,struct snd_ctl_elem_value * ucontrol)22368c4f021dSSrinivas Kandagatla static int wcd9335_rx_hph_mode_put(struct snd_kcontrol *kc,
22378c4f021dSSrinivas Kandagatla 				 struct snd_ctl_elem_value *ucontrol)
22388c4f021dSSrinivas Kandagatla {
22398c4f021dSSrinivas Kandagatla 	struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
22408c4f021dSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
22418c4f021dSSrinivas Kandagatla 	u32 mode_val;
22428c4f021dSSrinivas Kandagatla 
22438c4f021dSSrinivas Kandagatla 	mode_val = ucontrol->value.enumerated.item[0];
22448c4f021dSSrinivas Kandagatla 
22458c4f021dSSrinivas Kandagatla 	if (mode_val == 0) {
22468c4f021dSSrinivas Kandagatla 		dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n");
22478c4f021dSSrinivas Kandagatla 		mode_val = CLS_H_HIFI;
22488c4f021dSSrinivas Kandagatla 	}
22498c4f021dSSrinivas Kandagatla 	wcd->hph_mode = mode_val;
22508c4f021dSSrinivas Kandagatla 
22518c4f021dSSrinivas Kandagatla 	return 0;
22528c4f021dSSrinivas Kandagatla }
22538c4f021dSSrinivas Kandagatla 
22548c4f021dSSrinivas Kandagatla static const struct snd_kcontrol_new wcd9335_snd_controls[] = {
22558c4f021dSSrinivas Kandagatla 	/* -84dB min - 40dB max */
22562fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX0 Digital Volume", WCD9335_CDC_RX0_RX_VOL_CTL,
22572fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22582fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX1 Digital Volume", WCD9335_CDC_RX1_RX_VOL_CTL,
22592fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22602fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX2 Digital Volume", WCD9335_CDC_RX2_RX_VOL_CTL,
22612fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22622fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX3 Digital Volume", WCD9335_CDC_RX3_RX_VOL_CTL,
22632fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22642fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX4 Digital Volume", WCD9335_CDC_RX4_RX_VOL_CTL,
22652fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22662fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX5 Digital Volume", WCD9335_CDC_RX5_RX_VOL_CTL,
22672fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22682fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX6 Digital Volume", WCD9335_CDC_RX6_RX_VOL_CTL,
22692fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22702fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX7 Digital Volume", WCD9335_CDC_RX7_RX_VOL_CTL,
22712fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22722fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX8 Digital Volume", WCD9335_CDC_RX8_RX_VOL_CTL,
22732fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22742fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX0 Mix Digital Volume", WCD9335_CDC_RX0_RX_VOL_MIX_CTL,
22752fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22762fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX1 Mix Digital Volume", WCD9335_CDC_RX1_RX_VOL_MIX_CTL,
22772fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22782fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX2 Mix Digital Volume", WCD9335_CDC_RX2_RX_VOL_MIX_CTL,
22792fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22802fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX3 Mix Digital Volume", WCD9335_CDC_RX3_RX_VOL_MIX_CTL,
22812fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22822fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX4 Mix Digital Volume", WCD9335_CDC_RX4_RX_VOL_MIX_CTL,
22832fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22842fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX5 Mix Digital Volume", WCD9335_CDC_RX5_RX_VOL_MIX_CTL,
22852fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22862fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX6 Mix Digital Volume", WCD9335_CDC_RX6_RX_VOL_MIX_CTL,
22872fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22882fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX7 Mix Digital Volume", WCD9335_CDC_RX7_RX_VOL_MIX_CTL,
22892fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22902fbe0953SSrinivas Kandagatla 	SOC_SINGLE_S8_TLV("RX8 Mix Digital Volume", WCD9335_CDC_RX8_RX_VOL_MIX_CTL,
22912fbe0953SSrinivas Kandagatla 			-84, 40, digital_gain),
22928c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum),
22938c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum),
22948c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT1_1 HPF cut off", cf_int1_1_enum),
22958c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT1_2 HPF cut off", cf_int1_2_enum),
22968c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT2_1 HPF cut off", cf_int2_1_enum),
22978c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT2_2 HPF cut off", cf_int2_2_enum),
22988c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT3_1 HPF cut off", cf_int3_1_enum),
22998c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT3_2 HPF cut off", cf_int3_2_enum),
23008c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT4_1 HPF cut off", cf_int4_1_enum),
23018c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT4_2 HPF cut off", cf_int4_2_enum),
23028c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT5_1 HPF cut off", cf_int5_1_enum),
23038c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT5_2 HPF cut off", cf_int5_2_enum),
23048c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT6_1 HPF cut off", cf_int6_1_enum),
23058c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT6_2 HPF cut off", cf_int6_2_enum),
23068c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT7_1 HPF cut off", cf_int7_1_enum),
23078c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT7_2 HPF cut off", cf_int7_2_enum),
23088c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT8_1 HPF cut off", cf_int8_1_enum),
23098c4f021dSSrinivas Kandagatla 	SOC_ENUM("RX INT8_2 HPF cut off", cf_int8_2_enum),
23108c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, COMPANDER_1, 1, 0,
23118c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23128c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, COMPANDER_2, 1, 0,
23138c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23148c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP3 Switch", SND_SOC_NOPM, COMPANDER_3, 1, 0,
23158c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23168c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP4 Switch", SND_SOC_NOPM, COMPANDER_4, 1, 0,
23178c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23188c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP5 Switch", SND_SOC_NOPM, COMPANDER_5, 1, 0,
23198c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23208c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP6 Switch", SND_SOC_NOPM, COMPANDER_6, 1, 0,
23218c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23228c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP7 Switch", SND_SOC_NOPM, COMPANDER_7, 1, 0,
23238c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23248c4f021dSSrinivas Kandagatla 	SOC_SINGLE_EXT("COMP8 Switch", SND_SOC_NOPM, COMPANDER_8, 1, 0,
23258c4f021dSSrinivas Kandagatla 		       wcd9335_get_compander, wcd9335_set_compander),
23268c4f021dSSrinivas Kandagatla 	SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum,
23278c4f021dSSrinivas Kandagatla 		       wcd9335_rx_hph_mode_get, wcd9335_rx_hph_mode_put),
23288c4f021dSSrinivas Kandagatla 
23298c4f021dSSrinivas Kandagatla 	/* Gain Controls */
23308c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("EAR PA Volume", WCD9335_ANA_EAR, 4, 4, 1,
23318c4f021dSSrinivas Kandagatla 		ear_pa_gain),
23328c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("HPHL Volume", WCD9335_HPH_L_EN, 0, 20, 1,
23338c4f021dSSrinivas Kandagatla 		line_gain),
23348c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("HPHR Volume", WCD9335_HPH_R_EN, 0, 20, 1,
23358c4f021dSSrinivas Kandagatla 		line_gain),
23368c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("LINEOUT1 Volume", WCD9335_DIFF_LO_LO1_COMPANDER,
23378c4f021dSSrinivas Kandagatla 			3, 16, 1, line_gain),
23388c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("LINEOUT2 Volume", WCD9335_DIFF_LO_LO2_COMPANDER,
23398c4f021dSSrinivas Kandagatla 			3, 16, 1, line_gain),
23408c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("LINEOUT3 Volume", WCD9335_SE_LO_LO3_GAIN, 0, 20, 1,
23418c4f021dSSrinivas Kandagatla 			line_gain),
23428c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("LINEOUT4 Volume", WCD9335_SE_LO_LO4_GAIN, 0, 20, 1,
23438c4f021dSSrinivas Kandagatla 			line_gain),
23448c4f021dSSrinivas Kandagatla 
23458c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("ADC1 Volume", WCD9335_ANA_AMIC1, 0, 20, 0,
23468c4f021dSSrinivas Kandagatla 			analog_gain),
23478c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("ADC2 Volume", WCD9335_ANA_AMIC2, 0, 20, 0,
23488c4f021dSSrinivas Kandagatla 			analog_gain),
23498c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("ADC3 Volume", WCD9335_ANA_AMIC3, 0, 20, 0,
23508c4f021dSSrinivas Kandagatla 			analog_gain),
23518c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("ADC4 Volume", WCD9335_ANA_AMIC4, 0, 20, 0,
23528c4f021dSSrinivas Kandagatla 			analog_gain),
23538c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("ADC5 Volume", WCD9335_ANA_AMIC5, 0, 20, 0,
23548c4f021dSSrinivas Kandagatla 			analog_gain),
23558c4f021dSSrinivas Kandagatla 	SOC_SINGLE_TLV("ADC6 Volume", WCD9335_ANA_AMIC6, 0, 20, 0,
23568c4f021dSSrinivas Kandagatla 			analog_gain),
23578c4f021dSSrinivas Kandagatla 
23588c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX0 HPF cut off", cf_dec0_enum),
23598c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX1 HPF cut off", cf_dec1_enum),
23608c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX2 HPF cut off", cf_dec2_enum),
23618c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX3 HPF cut off", cf_dec3_enum),
23628c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX4 HPF cut off", cf_dec4_enum),
23638c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX5 HPF cut off", cf_dec5_enum),
23648c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX6 HPF cut off", cf_dec6_enum),
23658c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX7 HPF cut off", cf_dec7_enum),
23668c4f021dSSrinivas Kandagatla 	SOC_ENUM("TX8 HPF cut off", cf_dec8_enum),
23678c4f021dSSrinivas Kandagatla };
23688c4f021dSSrinivas Kandagatla 
236993f97ff1SSrinivas Kandagatla static const struct snd_soc_dapm_route wcd9335_audio_map[] = {
237093f97ff1SSrinivas Kandagatla 	{"SLIM RX0 MUX", "AIF1_PB", "AIF1 PB"},
237193f97ff1SSrinivas Kandagatla 	{"SLIM RX1 MUX", "AIF1_PB", "AIF1 PB"},
237293f97ff1SSrinivas Kandagatla 	{"SLIM RX2 MUX", "AIF1_PB", "AIF1 PB"},
237393f97ff1SSrinivas Kandagatla 	{"SLIM RX3 MUX", "AIF1_PB", "AIF1 PB"},
237493f97ff1SSrinivas Kandagatla 	{"SLIM RX4 MUX", "AIF1_PB", "AIF1 PB"},
237593f97ff1SSrinivas Kandagatla 	{"SLIM RX5 MUX", "AIF1_PB", "AIF1 PB"},
237693f97ff1SSrinivas Kandagatla 	{"SLIM RX6 MUX", "AIF1_PB", "AIF1 PB"},
237793f97ff1SSrinivas Kandagatla 	{"SLIM RX7 MUX", "AIF1_PB", "AIF1 PB"},
237893f97ff1SSrinivas Kandagatla 
237993f97ff1SSrinivas Kandagatla 	{"SLIM RX0 MUX", "AIF2_PB", "AIF2 PB"},
238093f97ff1SSrinivas Kandagatla 	{"SLIM RX1 MUX", "AIF2_PB", "AIF2 PB"},
238193f97ff1SSrinivas Kandagatla 	{"SLIM RX2 MUX", "AIF2_PB", "AIF2 PB"},
238293f97ff1SSrinivas Kandagatla 	{"SLIM RX3 MUX", "AIF2_PB", "AIF2 PB"},
238393f97ff1SSrinivas Kandagatla 	{"SLIM RX4 MUX", "AIF2_PB", "AIF2 PB"},
238493f97ff1SSrinivas Kandagatla 	{"SLIM RX5 MUX", "AIF2_PB", "AIF2 PB"},
238593f97ff1SSrinivas Kandagatla 	{"SLIM RX6 MUX", "AIF2_PB", "AIF2 PB"},
238693f97ff1SSrinivas Kandagatla 	{"SLIM RX7 MUX", "AIF2_PB", "AIF2 PB"},
238793f97ff1SSrinivas Kandagatla 
238893f97ff1SSrinivas Kandagatla 	{"SLIM RX0 MUX", "AIF3_PB", "AIF3 PB"},
238993f97ff1SSrinivas Kandagatla 	{"SLIM RX1 MUX", "AIF3_PB", "AIF3 PB"},
239093f97ff1SSrinivas Kandagatla 	{"SLIM RX2 MUX", "AIF3_PB", "AIF3 PB"},
239193f97ff1SSrinivas Kandagatla 	{"SLIM RX3 MUX", "AIF3_PB", "AIF3 PB"},
239293f97ff1SSrinivas Kandagatla 	{"SLIM RX4 MUX", "AIF3_PB", "AIF3 PB"},
239393f97ff1SSrinivas Kandagatla 	{"SLIM RX5 MUX", "AIF3_PB", "AIF3 PB"},
239493f97ff1SSrinivas Kandagatla 	{"SLIM RX6 MUX", "AIF3_PB", "AIF3 PB"},
239593f97ff1SSrinivas Kandagatla 	{"SLIM RX7 MUX", "AIF3_PB", "AIF3 PB"},
239693f97ff1SSrinivas Kandagatla 
239793f97ff1SSrinivas Kandagatla 	{"SLIM RX0 MUX", "AIF4_PB", "AIF4 PB"},
239893f97ff1SSrinivas Kandagatla 	{"SLIM RX1 MUX", "AIF4_PB", "AIF4 PB"},
239993f97ff1SSrinivas Kandagatla 	{"SLIM RX2 MUX", "AIF4_PB", "AIF4 PB"},
240093f97ff1SSrinivas Kandagatla 	{"SLIM RX3 MUX", "AIF4_PB", "AIF4 PB"},
240193f97ff1SSrinivas Kandagatla 	{"SLIM RX4 MUX", "AIF4_PB", "AIF4 PB"},
240293f97ff1SSrinivas Kandagatla 	{"SLIM RX5 MUX", "AIF4_PB", "AIF4 PB"},
240393f97ff1SSrinivas Kandagatla 	{"SLIM RX6 MUX", "AIF4_PB", "AIF4 PB"},
240493f97ff1SSrinivas Kandagatla 	{"SLIM RX7 MUX", "AIF4_PB", "AIF4 PB"},
240593f97ff1SSrinivas Kandagatla 
240693f97ff1SSrinivas Kandagatla 	{"SLIM RX0", NULL, "SLIM RX0 MUX"},
240793f97ff1SSrinivas Kandagatla 	{"SLIM RX1", NULL, "SLIM RX1 MUX"},
240893f97ff1SSrinivas Kandagatla 	{"SLIM RX2", NULL, "SLIM RX2 MUX"},
240993f97ff1SSrinivas Kandagatla 	{"SLIM RX3", NULL, "SLIM RX3 MUX"},
241093f97ff1SSrinivas Kandagatla 	{"SLIM RX4", NULL, "SLIM RX4 MUX"},
241193f97ff1SSrinivas Kandagatla 	{"SLIM RX5", NULL, "SLIM RX5 MUX"},
241293f97ff1SSrinivas Kandagatla 	{"SLIM RX6", NULL, "SLIM RX6 MUX"},
241393f97ff1SSrinivas Kandagatla 	{"SLIM RX7", NULL, "SLIM RX7 MUX"},
241493f97ff1SSrinivas Kandagatla 
241593f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(0),
241693f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(1),
241793f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(2),
241893f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(3),
241993f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(4),
242093f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(5),
242193f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(6),
242293f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(7),
242393f97ff1SSrinivas Kandagatla 	WCD9335_INTERPOLATOR_PATH(8),
242493f97ff1SSrinivas Kandagatla 
242593f97ff1SSrinivas Kandagatla 	/* EAR PA */
242693f97ff1SSrinivas Kandagatla 	{"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 INTERP"},
242793f97ff1SSrinivas Kandagatla 	{"RX INT0 DAC", NULL, "RX INT0 DEM MUX"},
242893f97ff1SSrinivas Kandagatla 	{"RX INT0 DAC", NULL, "RX_BIAS"},
242993f97ff1SSrinivas Kandagatla 	{"EAR PA", NULL, "RX INT0 DAC"},
243093f97ff1SSrinivas Kandagatla 	{"EAR", NULL, "EAR PA"},
243193f97ff1SSrinivas Kandagatla 
243293f97ff1SSrinivas Kandagatla 	/* HPHL */
243393f97ff1SSrinivas Kandagatla 	{"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 INTERP"},
243493f97ff1SSrinivas Kandagatla 	{"RX INT1 DAC", NULL, "RX INT1 DEM MUX"},
243593f97ff1SSrinivas Kandagatla 	{"RX INT1 DAC", NULL, "RX_BIAS"},
243693f97ff1SSrinivas Kandagatla 	{"HPHL PA", NULL, "RX INT1 DAC"},
243793f97ff1SSrinivas Kandagatla 	{"HPHL", NULL, "HPHL PA"},
243893f97ff1SSrinivas Kandagatla 
243993f97ff1SSrinivas Kandagatla 	/* HPHR */
244093f97ff1SSrinivas Kandagatla 	{"RX INT2 DEM MUX", "CLSH_DSM_OUT", "RX INT2 INTERP"},
244193f97ff1SSrinivas Kandagatla 	{"RX INT2 DAC", NULL, "RX INT2 DEM MUX"},
244293f97ff1SSrinivas Kandagatla 	{"RX INT2 DAC", NULL, "RX_BIAS"},
244393f97ff1SSrinivas Kandagatla 	{"HPHR PA", NULL, "RX INT2 DAC"},
244493f97ff1SSrinivas Kandagatla 	{"HPHR", NULL, "HPHR PA"},
244593f97ff1SSrinivas Kandagatla 
244693f97ff1SSrinivas Kandagatla 	/* LINEOUT1 */
244793f97ff1SSrinivas Kandagatla 	{"RX INT3 DAC", NULL, "RX INT3 INTERP"},
244893f97ff1SSrinivas Kandagatla 	{"RX INT3 DAC", NULL, "RX_BIAS"},
244993f97ff1SSrinivas Kandagatla 	{"LINEOUT1 PA", NULL, "RX INT3 DAC"},
245093f97ff1SSrinivas Kandagatla 	{"LINEOUT1", NULL, "LINEOUT1 PA"},
245193f97ff1SSrinivas Kandagatla 
245293f97ff1SSrinivas Kandagatla 	/* LINEOUT2 */
245393f97ff1SSrinivas Kandagatla 	{"RX INT4 DAC", NULL, "RX INT4 INTERP"},
245493f97ff1SSrinivas Kandagatla 	{"RX INT4 DAC", NULL, "RX_BIAS"},
245593f97ff1SSrinivas Kandagatla 	{"LINEOUT2 PA", NULL, "RX INT4 DAC"},
245693f97ff1SSrinivas Kandagatla 	{"LINEOUT2", NULL, "LINEOUT2 PA"},
245793f97ff1SSrinivas Kandagatla 
245893f97ff1SSrinivas Kandagatla 	/* LINEOUT3 */
245993f97ff1SSrinivas Kandagatla 	{"RX INT5 DAC", NULL, "RX INT5 INTERP"},
246093f97ff1SSrinivas Kandagatla 	{"RX INT5 DAC", NULL, "RX_BIAS"},
246193f97ff1SSrinivas Kandagatla 	{"LINEOUT3 PA", NULL, "RX INT5 DAC"},
246293f97ff1SSrinivas Kandagatla 	{"LINEOUT3", NULL, "LINEOUT3 PA"},
246393f97ff1SSrinivas Kandagatla 
246493f97ff1SSrinivas Kandagatla 	/* LINEOUT4 */
246593f97ff1SSrinivas Kandagatla 	{"RX INT6 DAC", NULL, "RX INT6 INTERP"},
246693f97ff1SSrinivas Kandagatla 	{"RX INT6 DAC", NULL, "RX_BIAS"},
246793f97ff1SSrinivas Kandagatla 	{"LINEOUT4 PA", NULL, "RX INT6 DAC"},
246893f97ff1SSrinivas Kandagatla 	{"LINEOUT4", NULL, "LINEOUT4 PA"},
246993f97ff1SSrinivas Kandagatla 
247093f97ff1SSrinivas Kandagatla 	/* SLIMBUS Connections */
247193f97ff1SSrinivas Kandagatla 	{"AIF1 CAP", NULL, "AIF1_CAP Mixer"},
247293f97ff1SSrinivas Kandagatla 	{"AIF2 CAP", NULL, "AIF2_CAP Mixer"},
247393f97ff1SSrinivas Kandagatla 	{"AIF3 CAP", NULL, "AIF3_CAP Mixer"},
247493f97ff1SSrinivas Kandagatla 
247593f97ff1SSrinivas Kandagatla 	/* ADC Mux */
247693f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(0),
247793f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(1),
247893f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(2),
247993f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(3),
248093f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(4),
248193f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(5),
248293f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(6),
248393f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(7),
248493f97ff1SSrinivas Kandagatla 	WCD9335_ADC_MUX_PATH(8),
248593f97ff1SSrinivas Kandagatla 
248693f97ff1SSrinivas Kandagatla 	/* ADC Connections */
248793f97ff1SSrinivas Kandagatla 	{"ADC1", NULL, "AMIC1"},
248893f97ff1SSrinivas Kandagatla 	{"ADC2", NULL, "AMIC2"},
248993f97ff1SSrinivas Kandagatla 	{"ADC3", NULL, "AMIC3"},
249093f97ff1SSrinivas Kandagatla 	{"ADC4", NULL, "AMIC4"},
249193f97ff1SSrinivas Kandagatla 	{"ADC5", NULL, "AMIC5"},
249293f97ff1SSrinivas Kandagatla 	{"ADC6", NULL, "AMIC6"},
249393f97ff1SSrinivas Kandagatla };
249493f97ff1SSrinivas Kandagatla 
wcd9335_micbias_control(struct snd_soc_component * component,int micb_num,int req,bool is_dapm)24956ccc25f6SSrinivas Kandagatla static int wcd9335_micbias_control(struct snd_soc_component *component,
24966ccc25f6SSrinivas Kandagatla 				   int micb_num, int req, bool is_dapm)
24976ccc25f6SSrinivas Kandagatla {
24986ccc25f6SSrinivas Kandagatla 	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(component);
24996ccc25f6SSrinivas Kandagatla 	int micb_index = micb_num - 1;
25006ccc25f6SSrinivas Kandagatla 	u16 micb_reg;
25016ccc25f6SSrinivas Kandagatla 
25026ccc25f6SSrinivas Kandagatla 	if ((micb_index < 0) || (micb_index > WCD9335_MAX_MICBIAS - 1)) {
25036ccc25f6SSrinivas Kandagatla 		dev_err(wcd->dev, "Invalid micbias index, micb_ind:%d\n",
25046ccc25f6SSrinivas Kandagatla 			micb_index);
25056ccc25f6SSrinivas Kandagatla 		return -EINVAL;
25066ccc25f6SSrinivas Kandagatla 	}
25076ccc25f6SSrinivas Kandagatla 
25086ccc25f6SSrinivas Kandagatla 	switch (micb_num) {
25096ccc25f6SSrinivas Kandagatla 	case MIC_BIAS_1:
25106ccc25f6SSrinivas Kandagatla 		micb_reg = WCD9335_ANA_MICB1;
25116ccc25f6SSrinivas Kandagatla 		break;
25126ccc25f6SSrinivas Kandagatla 	case MIC_BIAS_2:
25136ccc25f6SSrinivas Kandagatla 		micb_reg = WCD9335_ANA_MICB2;
25146ccc25f6SSrinivas Kandagatla 		break;
25156ccc25f6SSrinivas Kandagatla 	case MIC_BIAS_3:
25166ccc25f6SSrinivas Kandagatla 		micb_reg = WCD9335_ANA_MICB3;
25176ccc25f6SSrinivas Kandagatla 		break;
25186ccc25f6SSrinivas Kandagatla 	case MIC_BIAS_4:
25196ccc25f6SSrinivas Kandagatla 		micb_reg = WCD9335_ANA_MICB4;
25206ccc25f6SSrinivas Kandagatla 		break;
25216ccc25f6SSrinivas Kandagatla 	default:
25226ccc25f6SSrinivas Kandagatla 		dev_err(component->dev, "%s: Invalid micbias number: %d\n",
25236ccc25f6SSrinivas Kandagatla 			__func__, micb_num);
25246ccc25f6SSrinivas Kandagatla 		return -EINVAL;
25256ccc25f6SSrinivas Kandagatla 	}
25266ccc25f6SSrinivas Kandagatla 
25276ccc25f6SSrinivas Kandagatla 	switch (req) {
25286ccc25f6SSrinivas Kandagatla 	case MICB_PULLUP_ENABLE:
25296ccc25f6SSrinivas Kandagatla 		wcd->pullup_ref[micb_index]++;
25306ccc25f6SSrinivas Kandagatla 		if ((wcd->pullup_ref[micb_index] == 1) &&
25316ccc25f6SSrinivas Kandagatla 		    (wcd->micb_ref[micb_index] == 0))
25326ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(component, micb_reg,
25336ccc25f6SSrinivas Kandagatla 							0xC0, 0x80);
25346ccc25f6SSrinivas Kandagatla 		break;
25356ccc25f6SSrinivas Kandagatla 	case MICB_PULLUP_DISABLE:
25366ccc25f6SSrinivas Kandagatla 		wcd->pullup_ref[micb_index]--;
25376ccc25f6SSrinivas Kandagatla 		if ((wcd->pullup_ref[micb_index] == 0) &&
25386ccc25f6SSrinivas Kandagatla 		    (wcd->micb_ref[micb_index] == 0))
25396ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(component, micb_reg,
25406ccc25f6SSrinivas Kandagatla 							0xC0, 0x00);
25416ccc25f6SSrinivas Kandagatla 		break;
25426ccc25f6SSrinivas Kandagatla 	case MICB_ENABLE:
25436ccc25f6SSrinivas Kandagatla 		wcd->micb_ref[micb_index]++;
25446ccc25f6SSrinivas Kandagatla 		if (wcd->micb_ref[micb_index] == 1)
25456ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(component, micb_reg,
25466ccc25f6SSrinivas Kandagatla 							0xC0, 0x40);
25476ccc25f6SSrinivas Kandagatla 		break;
25486ccc25f6SSrinivas Kandagatla 	case MICB_DISABLE:
25496ccc25f6SSrinivas Kandagatla 		wcd->micb_ref[micb_index]--;
25506ccc25f6SSrinivas Kandagatla 		if ((wcd->micb_ref[micb_index] == 0) &&
25516ccc25f6SSrinivas Kandagatla 		    (wcd->pullup_ref[micb_index] > 0))
25526ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(component, micb_reg,
25536ccc25f6SSrinivas Kandagatla 							0xC0, 0x80);
25546ccc25f6SSrinivas Kandagatla 		else if ((wcd->micb_ref[micb_index] == 0) &&
25556ccc25f6SSrinivas Kandagatla 			 (wcd->pullup_ref[micb_index] == 0)) {
25566ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(component, micb_reg,
25576ccc25f6SSrinivas Kandagatla 							0xC0, 0x00);
25586ccc25f6SSrinivas Kandagatla 		}
25596ccc25f6SSrinivas Kandagatla 		break;
25600eb06746SJason Yan 	}
25616ccc25f6SSrinivas Kandagatla 
25626ccc25f6SSrinivas Kandagatla 	return 0;
25636ccc25f6SSrinivas Kandagatla }
25646ccc25f6SSrinivas Kandagatla 
__wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget * w,int event)25656ccc25f6SSrinivas Kandagatla static int __wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget *w,
25666ccc25f6SSrinivas Kandagatla 					int event)
25676ccc25f6SSrinivas Kandagatla {
25686ccc25f6SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
25696ccc25f6SSrinivas Kandagatla 	int micb_num;
25706ccc25f6SSrinivas Kandagatla 
25716ccc25f6SSrinivas Kandagatla 	if (strnstr(w->name, "MIC BIAS1", sizeof("MIC BIAS1")))
25726ccc25f6SSrinivas Kandagatla 		micb_num = MIC_BIAS_1;
25736ccc25f6SSrinivas Kandagatla 	else if (strnstr(w->name, "MIC BIAS2", sizeof("MIC BIAS2")))
25746ccc25f6SSrinivas Kandagatla 		micb_num = MIC_BIAS_2;
25756ccc25f6SSrinivas Kandagatla 	else if (strnstr(w->name, "MIC BIAS3", sizeof("MIC BIAS3")))
25766ccc25f6SSrinivas Kandagatla 		micb_num = MIC_BIAS_3;
25776ccc25f6SSrinivas Kandagatla 	else if (strnstr(w->name, "MIC BIAS4", sizeof("MIC BIAS4")))
25786ccc25f6SSrinivas Kandagatla 		micb_num = MIC_BIAS_4;
25796ccc25f6SSrinivas Kandagatla 	else
25806ccc25f6SSrinivas Kandagatla 		return -EINVAL;
25816ccc25f6SSrinivas Kandagatla 
25826ccc25f6SSrinivas Kandagatla 	switch (event) {
25836ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
25846ccc25f6SSrinivas Kandagatla 		/*
25856ccc25f6SSrinivas Kandagatla 		 * MIC BIAS can also be requested by MBHC,
25866ccc25f6SSrinivas Kandagatla 		 * so use ref count to handle micbias pullup
25876ccc25f6SSrinivas Kandagatla 		 * and enable requests
25886ccc25f6SSrinivas Kandagatla 		 */
25896ccc25f6SSrinivas Kandagatla 		wcd9335_micbias_control(comp, micb_num, MICB_ENABLE, true);
25906ccc25f6SSrinivas Kandagatla 		break;
25916ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
25926ccc25f6SSrinivas Kandagatla 		/* wait for cnp time */
25936ccc25f6SSrinivas Kandagatla 		usleep_range(1000, 1100);
25946ccc25f6SSrinivas Kandagatla 		break;
25956ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
25966ccc25f6SSrinivas Kandagatla 		wcd9335_micbias_control(comp, micb_num, MICB_DISABLE, true);
25976ccc25f6SSrinivas Kandagatla 		break;
25980eb06746SJason Yan 	}
25996ccc25f6SSrinivas Kandagatla 
26006ccc25f6SSrinivas Kandagatla 	return 0;
26016ccc25f6SSrinivas Kandagatla }
26026ccc25f6SSrinivas Kandagatla 
wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)26036ccc25f6SSrinivas Kandagatla static int wcd9335_codec_enable_micbias(struct snd_soc_dapm_widget *w,
26046ccc25f6SSrinivas Kandagatla 		struct snd_kcontrol *kc, int event)
26056ccc25f6SSrinivas Kandagatla {
26066ccc25f6SSrinivas Kandagatla 	return __wcd9335_codec_enable_micbias(w, event);
26076ccc25f6SSrinivas Kandagatla }
26086ccc25f6SSrinivas Kandagatla 
wcd9335_codec_set_tx_hold(struct snd_soc_component * comp,u16 amic_reg,bool set)26096ccc25f6SSrinivas Kandagatla static void wcd9335_codec_set_tx_hold(struct snd_soc_component *comp,
26106ccc25f6SSrinivas Kandagatla 				      u16 amic_reg, bool set)
26116ccc25f6SSrinivas Kandagatla {
26126ccc25f6SSrinivas Kandagatla 	u8 mask = 0x20;
26136ccc25f6SSrinivas Kandagatla 	u8 val;
26146ccc25f6SSrinivas Kandagatla 
26156ccc25f6SSrinivas Kandagatla 	if (amic_reg == WCD9335_ANA_AMIC1 || amic_reg == WCD9335_ANA_AMIC3 ||
26166ccc25f6SSrinivas Kandagatla 	    amic_reg == WCD9335_ANA_AMIC5)
26176ccc25f6SSrinivas Kandagatla 		mask = 0x40;
26186ccc25f6SSrinivas Kandagatla 
26196ccc25f6SSrinivas Kandagatla 	val = set ? mask : 0x00;
26206ccc25f6SSrinivas Kandagatla 
26216ccc25f6SSrinivas Kandagatla 	switch (amic_reg) {
26226ccc25f6SSrinivas Kandagatla 	case WCD9335_ANA_AMIC1:
26236ccc25f6SSrinivas Kandagatla 	case WCD9335_ANA_AMIC2:
26246ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC2, mask,
26256ccc25f6SSrinivas Kandagatla 						val);
26266ccc25f6SSrinivas Kandagatla 		break;
26276ccc25f6SSrinivas Kandagatla 	case WCD9335_ANA_AMIC3:
26286ccc25f6SSrinivas Kandagatla 	case WCD9335_ANA_AMIC4:
26296ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC4, mask,
26306ccc25f6SSrinivas Kandagatla 						val);
26316ccc25f6SSrinivas Kandagatla 		break;
26326ccc25f6SSrinivas Kandagatla 	case WCD9335_ANA_AMIC5:
26336ccc25f6SSrinivas Kandagatla 	case WCD9335_ANA_AMIC6:
26346ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_ANA_AMIC6, mask,
26356ccc25f6SSrinivas Kandagatla 						val);
26366ccc25f6SSrinivas Kandagatla 		break;
26376ccc25f6SSrinivas Kandagatla 	default:
26386ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: invalid amic: %d\n",
26396ccc25f6SSrinivas Kandagatla 			__func__, amic_reg);
26406ccc25f6SSrinivas Kandagatla 		break;
26416ccc25f6SSrinivas Kandagatla 	}
26426ccc25f6SSrinivas Kandagatla }
26436ccc25f6SSrinivas Kandagatla 
wcd9335_codec_enable_adc(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)26446ccc25f6SSrinivas Kandagatla static int wcd9335_codec_enable_adc(struct snd_soc_dapm_widget *w,
26456ccc25f6SSrinivas Kandagatla 		struct snd_kcontrol *kc, int event)
26466ccc25f6SSrinivas Kandagatla {
26476ccc25f6SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
26486ccc25f6SSrinivas Kandagatla 
26496ccc25f6SSrinivas Kandagatla 	switch (event) {
26506ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
26516ccc25f6SSrinivas Kandagatla 		wcd9335_codec_set_tx_hold(comp, w->reg, true);
26526ccc25f6SSrinivas Kandagatla 		break;
26536ccc25f6SSrinivas Kandagatla 	default:
26546ccc25f6SSrinivas Kandagatla 		break;
26556ccc25f6SSrinivas Kandagatla 	}
26566ccc25f6SSrinivas Kandagatla 
26576ccc25f6SSrinivas Kandagatla 	return 0;
26586ccc25f6SSrinivas Kandagatla }
26596ccc25f6SSrinivas Kandagatla 
wcd9335_codec_find_amic_input(struct snd_soc_component * comp,int adc_mux_n)26606ccc25f6SSrinivas Kandagatla static int wcd9335_codec_find_amic_input(struct snd_soc_component *comp,
26616ccc25f6SSrinivas Kandagatla 					 int adc_mux_n)
26626ccc25f6SSrinivas Kandagatla {
26636ccc25f6SSrinivas Kandagatla 	int mux_sel, reg, mreg;
26646ccc25f6SSrinivas Kandagatla 
26656ccc25f6SSrinivas Kandagatla 	if (adc_mux_n < 0 || adc_mux_n > WCD9335_MAX_VALID_ADC_MUX ||
26666ccc25f6SSrinivas Kandagatla 	    adc_mux_n == WCD9335_INVALID_ADC_MUX)
26676ccc25f6SSrinivas Kandagatla 		return 0;
26686ccc25f6SSrinivas Kandagatla 
26696ccc25f6SSrinivas Kandagatla 	/* Check whether adc mux input is AMIC or DMIC */
26706ccc25f6SSrinivas Kandagatla 	if (adc_mux_n < 4) {
26716ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG1 + 2 * adc_mux_n;
26726ccc25f6SSrinivas Kandagatla 		mreg = WCD9335_CDC_TX_INP_MUX_ADC_MUX0_CFG0 + 2 * adc_mux_n;
2673eaf2767cSKuninori Morimoto 		mux_sel = snd_soc_component_read(comp, reg) & 0x3;
26746ccc25f6SSrinivas Kandagatla 	} else {
26756ccc25f6SSrinivas Kandagatla 		reg = WCD9335_CDC_TX_INP_MUX_ADC_MUX4_CFG0 + adc_mux_n - 4;
26766ccc25f6SSrinivas Kandagatla 		mreg = reg;
2677eaf2767cSKuninori Morimoto 		mux_sel = snd_soc_component_read(comp, reg) >> 6;
26786ccc25f6SSrinivas Kandagatla 	}
26796ccc25f6SSrinivas Kandagatla 
26806ccc25f6SSrinivas Kandagatla 	if (mux_sel != WCD9335_CDC_TX_INP_MUX_SEL_AMIC)
26816ccc25f6SSrinivas Kandagatla 		return 0;
26826ccc25f6SSrinivas Kandagatla 
2683eaf2767cSKuninori Morimoto 	return snd_soc_component_read(comp, mreg) & 0x07;
26846ccc25f6SSrinivas Kandagatla }
26856ccc25f6SSrinivas Kandagatla 
wcd9335_codec_get_amic_pwlvl_reg(struct snd_soc_component * comp,int amic)26866ccc25f6SSrinivas Kandagatla static u16 wcd9335_codec_get_amic_pwlvl_reg(struct snd_soc_component *comp,
26876ccc25f6SSrinivas Kandagatla 					    int amic)
26886ccc25f6SSrinivas Kandagatla {
26896ccc25f6SSrinivas Kandagatla 	u16 pwr_level_reg = 0;
26906ccc25f6SSrinivas Kandagatla 
26916ccc25f6SSrinivas Kandagatla 	switch (amic) {
26926ccc25f6SSrinivas Kandagatla 	case 1:
26936ccc25f6SSrinivas Kandagatla 	case 2:
26946ccc25f6SSrinivas Kandagatla 		pwr_level_reg = WCD9335_ANA_AMIC1;
26956ccc25f6SSrinivas Kandagatla 		break;
26966ccc25f6SSrinivas Kandagatla 
26976ccc25f6SSrinivas Kandagatla 	case 3:
26986ccc25f6SSrinivas Kandagatla 	case 4:
26996ccc25f6SSrinivas Kandagatla 		pwr_level_reg = WCD9335_ANA_AMIC3;
27006ccc25f6SSrinivas Kandagatla 		break;
27016ccc25f6SSrinivas Kandagatla 
27026ccc25f6SSrinivas Kandagatla 	case 5:
27036ccc25f6SSrinivas Kandagatla 	case 6:
27046ccc25f6SSrinivas Kandagatla 		pwr_level_reg = WCD9335_ANA_AMIC5;
27056ccc25f6SSrinivas Kandagatla 		break;
27066ccc25f6SSrinivas Kandagatla 	default:
27076ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "invalid amic: %d\n", amic);
27086ccc25f6SSrinivas Kandagatla 		break;
27096ccc25f6SSrinivas Kandagatla 	}
27106ccc25f6SSrinivas Kandagatla 
27116ccc25f6SSrinivas Kandagatla 	return pwr_level_reg;
27126ccc25f6SSrinivas Kandagatla }
27136ccc25f6SSrinivas Kandagatla 
wcd9335_codec_enable_dec(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)27146ccc25f6SSrinivas Kandagatla static int wcd9335_codec_enable_dec(struct snd_soc_dapm_widget *w,
27156ccc25f6SSrinivas Kandagatla 	struct snd_kcontrol *kc, int event)
27166ccc25f6SSrinivas Kandagatla {
27176ccc25f6SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
27186ccc25f6SSrinivas Kandagatla 	unsigned int decimator;
27196ccc25f6SSrinivas Kandagatla 	char *dec_adc_mux_name = NULL;
27206ccc25f6SSrinivas Kandagatla 	char *widget_name = NULL;
27216ccc25f6SSrinivas Kandagatla 	char *wname;
27226ccc25f6SSrinivas Kandagatla 	int ret = 0, amic_n;
27236ccc25f6SSrinivas Kandagatla 	u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg;
27246ccc25f6SSrinivas Kandagatla 	u16 tx_gain_ctl_reg;
27256ccc25f6SSrinivas Kandagatla 	char *dec;
27266ccc25f6SSrinivas Kandagatla 	u8 hpf_coff_freq;
27276ccc25f6SSrinivas Kandagatla 
2728a5498811SGen Zhang 	widget_name = kmemdup_nul(w->name, 15, GFP_KERNEL);
27296ccc25f6SSrinivas Kandagatla 	if (!widget_name)
27306ccc25f6SSrinivas Kandagatla 		return -ENOMEM;
27316ccc25f6SSrinivas Kandagatla 
27326ccc25f6SSrinivas Kandagatla 	wname = widget_name;
27336ccc25f6SSrinivas Kandagatla 	dec_adc_mux_name = strsep(&widget_name, " ");
27346ccc25f6SSrinivas Kandagatla 	if (!dec_adc_mux_name) {
27356ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: Invalid decimator = %s\n",
27366ccc25f6SSrinivas Kandagatla 			__func__, w->name);
27376ccc25f6SSrinivas Kandagatla 		ret =  -EINVAL;
27386ccc25f6SSrinivas Kandagatla 		goto out;
27396ccc25f6SSrinivas Kandagatla 	}
27406ccc25f6SSrinivas Kandagatla 	dec_adc_mux_name = widget_name;
27416ccc25f6SSrinivas Kandagatla 
27426ccc25f6SSrinivas Kandagatla 	dec = strpbrk(dec_adc_mux_name, "012345678");
27436ccc25f6SSrinivas Kandagatla 	if (!dec) {
27446ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: decimator index not found\n",
27456ccc25f6SSrinivas Kandagatla 			__func__);
27466ccc25f6SSrinivas Kandagatla 		ret =  -EINVAL;
27476ccc25f6SSrinivas Kandagatla 		goto out;
27486ccc25f6SSrinivas Kandagatla 	}
27496ccc25f6SSrinivas Kandagatla 
27506ccc25f6SSrinivas Kandagatla 	ret = kstrtouint(dec, 10, &decimator);
27516ccc25f6SSrinivas Kandagatla 	if (ret < 0) {
27526ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: Invalid decimator = %s\n",
27536ccc25f6SSrinivas Kandagatla 			__func__, wname);
27546ccc25f6SSrinivas Kandagatla 		ret =  -EINVAL;
27556ccc25f6SSrinivas Kandagatla 		goto out;
27566ccc25f6SSrinivas Kandagatla 	}
27576ccc25f6SSrinivas Kandagatla 
27586ccc25f6SSrinivas Kandagatla 	tx_vol_ctl_reg = WCD9335_CDC_TX0_TX_PATH_CTL + 16 * decimator;
27596ccc25f6SSrinivas Kandagatla 	hpf_gate_reg = WCD9335_CDC_TX0_TX_PATH_SEC2 + 16 * decimator;
27606ccc25f6SSrinivas Kandagatla 	dec_cfg_reg = WCD9335_CDC_TX0_TX_PATH_CFG0 + 16 * decimator;
27616ccc25f6SSrinivas Kandagatla 	tx_gain_ctl_reg = WCD9335_CDC_TX0_TX_VOL_CTL + 16 * decimator;
27626ccc25f6SSrinivas Kandagatla 
27636ccc25f6SSrinivas Kandagatla 	switch (event) {
27646ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
27656ccc25f6SSrinivas Kandagatla 		amic_n = wcd9335_codec_find_amic_input(comp, decimator);
27666ccc25f6SSrinivas Kandagatla 		if (amic_n)
27676ccc25f6SSrinivas Kandagatla 			pwr_level_reg = wcd9335_codec_get_amic_pwlvl_reg(comp,
27686ccc25f6SSrinivas Kandagatla 								       amic_n);
27696ccc25f6SSrinivas Kandagatla 
27706ccc25f6SSrinivas Kandagatla 		if (pwr_level_reg) {
2771eaf2767cSKuninori Morimoto 			switch ((snd_soc_component_read(comp, pwr_level_reg) &
27726ccc25f6SSrinivas Kandagatla 					      WCD9335_AMIC_PWR_LVL_MASK) >>
27736ccc25f6SSrinivas Kandagatla 					      WCD9335_AMIC_PWR_LVL_SHIFT) {
27746ccc25f6SSrinivas Kandagatla 			case WCD9335_AMIC_PWR_LEVEL_LP:
27756ccc25f6SSrinivas Kandagatla 				snd_soc_component_update_bits(comp, dec_cfg_reg,
27766ccc25f6SSrinivas Kandagatla 						    WCD9335_DEC_PWR_LVL_MASK,
27776ccc25f6SSrinivas Kandagatla 						    WCD9335_DEC_PWR_LVL_LP);
27786ccc25f6SSrinivas Kandagatla 				break;
27796ccc25f6SSrinivas Kandagatla 
27806ccc25f6SSrinivas Kandagatla 			case WCD9335_AMIC_PWR_LEVEL_HP:
27816ccc25f6SSrinivas Kandagatla 				snd_soc_component_update_bits(comp, dec_cfg_reg,
27826ccc25f6SSrinivas Kandagatla 						    WCD9335_DEC_PWR_LVL_MASK,
27836ccc25f6SSrinivas Kandagatla 						    WCD9335_DEC_PWR_LVL_HP);
27846ccc25f6SSrinivas Kandagatla 				break;
27856ccc25f6SSrinivas Kandagatla 			case WCD9335_AMIC_PWR_LEVEL_DEFAULT:
27866ccc25f6SSrinivas Kandagatla 			default:
27876ccc25f6SSrinivas Kandagatla 				snd_soc_component_update_bits(comp, dec_cfg_reg,
27886ccc25f6SSrinivas Kandagatla 						    WCD9335_DEC_PWR_LVL_MASK,
27896ccc25f6SSrinivas Kandagatla 						    WCD9335_DEC_PWR_LVL_DF);
27906ccc25f6SSrinivas Kandagatla 				break;
27916ccc25f6SSrinivas Kandagatla 			}
27926ccc25f6SSrinivas Kandagatla 		}
2793eaf2767cSKuninori Morimoto 		hpf_coff_freq = (snd_soc_component_read(comp, dec_cfg_reg) &
27946ccc25f6SSrinivas Kandagatla 				   TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
27956ccc25f6SSrinivas Kandagatla 
27966ccc25f6SSrinivas Kandagatla 		if (hpf_coff_freq != CF_MIN_3DB_150HZ)
27976ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, dec_cfg_reg,
27986ccc25f6SSrinivas Kandagatla 					    TX_HPF_CUT_OFF_FREQ_MASK,
27996ccc25f6SSrinivas Kandagatla 					    CF_MIN_3DB_150HZ << 5);
28006ccc25f6SSrinivas Kandagatla 		/* Enable TX PGA Mute */
28016ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
28026ccc25f6SSrinivas Kandagatla 						0x10, 0x10);
28036ccc25f6SSrinivas Kandagatla 		/* Enable APC */
28046ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, dec_cfg_reg, 0x08, 0x08);
28056ccc25f6SSrinivas Kandagatla 		break;
28066ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
28076ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, hpf_gate_reg, 0x01, 0x00);
28086ccc25f6SSrinivas Kandagatla 
28096ccc25f6SSrinivas Kandagatla 		if (decimator == 0) {
28106ccc25f6SSrinivas Kandagatla 			snd_soc_component_write(comp,
28116ccc25f6SSrinivas Kandagatla 					WCD9335_MBHC_ZDET_RAMP_CTL, 0x83);
28126ccc25f6SSrinivas Kandagatla 			snd_soc_component_write(comp,
28136ccc25f6SSrinivas Kandagatla 					WCD9335_MBHC_ZDET_RAMP_CTL, 0xA3);
28146ccc25f6SSrinivas Kandagatla 			snd_soc_component_write(comp,
28156ccc25f6SSrinivas Kandagatla 					WCD9335_MBHC_ZDET_RAMP_CTL, 0x83);
28166ccc25f6SSrinivas Kandagatla 			snd_soc_component_write(comp,
28176ccc25f6SSrinivas Kandagatla 					WCD9335_MBHC_ZDET_RAMP_CTL, 0x03);
28186ccc25f6SSrinivas Kandagatla 		}
28196ccc25f6SSrinivas Kandagatla 
28206ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, hpf_gate_reg,
28216ccc25f6SSrinivas Kandagatla 						0x01, 0x01);
28226ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
28236ccc25f6SSrinivas Kandagatla 						0x10, 0x00);
28246ccc25f6SSrinivas Kandagatla 		snd_soc_component_write(comp, tx_gain_ctl_reg,
2825eaf2767cSKuninori Morimoto 			      snd_soc_component_read(comp, tx_gain_ctl_reg));
28266ccc25f6SSrinivas Kandagatla 		break;
28276ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMD:
2828eaf2767cSKuninori Morimoto 		hpf_coff_freq = (snd_soc_component_read(comp, dec_cfg_reg) &
28296ccc25f6SSrinivas Kandagatla 				   TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
28306ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 0x10, 0x10);
28316ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, dec_cfg_reg, 0x08, 0x00);
28326ccc25f6SSrinivas Kandagatla 		if (hpf_coff_freq != CF_MIN_3DB_150HZ) {
28336ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, dec_cfg_reg,
28346ccc25f6SSrinivas Kandagatla 						      TX_HPF_CUT_OFF_FREQ_MASK,
28356ccc25f6SSrinivas Kandagatla 						      hpf_coff_freq << 5);
28366ccc25f6SSrinivas Kandagatla 		}
28376ccc25f6SSrinivas Kandagatla 		break;
28386ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
28396ccc25f6SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, tx_vol_ctl_reg, 0x10, 0x00);
28406ccc25f6SSrinivas Kandagatla 		break;
28410eb06746SJason Yan 	}
28426ccc25f6SSrinivas Kandagatla out:
28436ccc25f6SSrinivas Kandagatla 	kfree(wname);
28446ccc25f6SSrinivas Kandagatla 	return ret;
28456ccc25f6SSrinivas Kandagatla }
28466ccc25f6SSrinivas Kandagatla 
wcd9335_get_dmic_clk_val(struct snd_soc_component * component,u32 mclk_rate,u32 dmic_clk_rate)28476ccc25f6SSrinivas Kandagatla static u8 wcd9335_get_dmic_clk_val(struct snd_soc_component *component,
28486ccc25f6SSrinivas Kandagatla 				 u32 mclk_rate, u32 dmic_clk_rate)
28496ccc25f6SSrinivas Kandagatla {
28506ccc25f6SSrinivas Kandagatla 	u32 div_factor;
28516ccc25f6SSrinivas Kandagatla 	u8 dmic_ctl_val;
28526ccc25f6SSrinivas Kandagatla 
28536ccc25f6SSrinivas Kandagatla 	dev_err(component->dev,
28546ccc25f6SSrinivas Kandagatla 		"%s: mclk_rate = %d, dmic_sample_rate = %d\n",
28556ccc25f6SSrinivas Kandagatla 		__func__, mclk_rate, dmic_clk_rate);
28566ccc25f6SSrinivas Kandagatla 
28576ccc25f6SSrinivas Kandagatla 	/* Default value to return in case of error */
28586ccc25f6SSrinivas Kandagatla 	if (mclk_rate == WCD9335_MCLK_CLK_9P6MHZ)
28596ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2;
28606ccc25f6SSrinivas Kandagatla 	else
28616ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3;
28626ccc25f6SSrinivas Kandagatla 
28636ccc25f6SSrinivas Kandagatla 	if (dmic_clk_rate == 0) {
28646ccc25f6SSrinivas Kandagatla 		dev_err(component->dev,
28656ccc25f6SSrinivas Kandagatla 			"%s: dmic_sample_rate cannot be 0\n",
28666ccc25f6SSrinivas Kandagatla 			__func__);
28676ccc25f6SSrinivas Kandagatla 		goto done;
28686ccc25f6SSrinivas Kandagatla 	}
28696ccc25f6SSrinivas Kandagatla 
28706ccc25f6SSrinivas Kandagatla 	div_factor = mclk_rate / dmic_clk_rate;
28716ccc25f6SSrinivas Kandagatla 	switch (div_factor) {
28726ccc25f6SSrinivas Kandagatla 	case 2:
28736ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_2;
28746ccc25f6SSrinivas Kandagatla 		break;
28756ccc25f6SSrinivas Kandagatla 	case 3:
28766ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_3;
28776ccc25f6SSrinivas Kandagatla 		break;
28786ccc25f6SSrinivas Kandagatla 	case 4:
28796ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_4;
28806ccc25f6SSrinivas Kandagatla 		break;
28816ccc25f6SSrinivas Kandagatla 	case 6:
28826ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_6;
28836ccc25f6SSrinivas Kandagatla 		break;
28846ccc25f6SSrinivas Kandagatla 	case 8:
28856ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_8;
28866ccc25f6SSrinivas Kandagatla 		break;
28876ccc25f6SSrinivas Kandagatla 	case 16:
28886ccc25f6SSrinivas Kandagatla 		dmic_ctl_val = WCD9335_DMIC_CLK_DIV_16;
28896ccc25f6SSrinivas Kandagatla 		break;
28906ccc25f6SSrinivas Kandagatla 	default:
28916ccc25f6SSrinivas Kandagatla 		dev_err(component->dev,
28926ccc25f6SSrinivas Kandagatla 			"%s: Invalid div_factor %u, clk_rate(%u), dmic_rate(%u)\n",
28936ccc25f6SSrinivas Kandagatla 			__func__, div_factor, mclk_rate, dmic_clk_rate);
28946ccc25f6SSrinivas Kandagatla 		break;
28956ccc25f6SSrinivas Kandagatla 	}
28966ccc25f6SSrinivas Kandagatla 
28976ccc25f6SSrinivas Kandagatla done:
28986ccc25f6SSrinivas Kandagatla 	return dmic_ctl_val;
28996ccc25f6SSrinivas Kandagatla }
29006ccc25f6SSrinivas Kandagatla 
wcd9335_codec_enable_dmic(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)29016ccc25f6SSrinivas Kandagatla static int wcd9335_codec_enable_dmic(struct snd_soc_dapm_widget *w,
29026ccc25f6SSrinivas Kandagatla 		struct snd_kcontrol *kc, int event)
29036ccc25f6SSrinivas Kandagatla {
29046ccc25f6SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
29056ccc25f6SSrinivas Kandagatla 	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
29066ccc25f6SSrinivas Kandagatla 	u8  dmic_clk_en = 0x01;
29076ccc25f6SSrinivas Kandagatla 	u16 dmic_clk_reg;
29086ccc25f6SSrinivas Kandagatla 	s32 *dmic_clk_cnt;
29096ccc25f6SSrinivas Kandagatla 	u8 dmic_rate_val, dmic_rate_shift = 1;
29106ccc25f6SSrinivas Kandagatla 	unsigned int dmic;
29116ccc25f6SSrinivas Kandagatla 	int ret;
29126ccc25f6SSrinivas Kandagatla 	char *wname;
29136ccc25f6SSrinivas Kandagatla 
29146ccc25f6SSrinivas Kandagatla 	wname = strpbrk(w->name, "012345");
29156ccc25f6SSrinivas Kandagatla 	if (!wname) {
29166ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: widget not found\n", __func__);
29176ccc25f6SSrinivas Kandagatla 		return -EINVAL;
29186ccc25f6SSrinivas Kandagatla 	}
29196ccc25f6SSrinivas Kandagatla 
29206ccc25f6SSrinivas Kandagatla 	ret = kstrtouint(wname, 10, &dmic);
29216ccc25f6SSrinivas Kandagatla 	if (ret < 0) {
29226ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: Invalid DMIC line on the codec\n",
29236ccc25f6SSrinivas Kandagatla 			__func__);
29246ccc25f6SSrinivas Kandagatla 		return -EINVAL;
29256ccc25f6SSrinivas Kandagatla 	}
29266ccc25f6SSrinivas Kandagatla 
29276ccc25f6SSrinivas Kandagatla 	switch (dmic) {
29286ccc25f6SSrinivas Kandagatla 	case 0:
29296ccc25f6SSrinivas Kandagatla 	case 1:
29306ccc25f6SSrinivas Kandagatla 		dmic_clk_cnt = &(wcd->dmic_0_1_clk_cnt);
29316ccc25f6SSrinivas Kandagatla 		dmic_clk_reg = WCD9335_CPE_SS_DMIC0_CTL;
29326ccc25f6SSrinivas Kandagatla 		break;
29336ccc25f6SSrinivas Kandagatla 	case 2:
29346ccc25f6SSrinivas Kandagatla 	case 3:
29356ccc25f6SSrinivas Kandagatla 		dmic_clk_cnt = &(wcd->dmic_2_3_clk_cnt);
29366ccc25f6SSrinivas Kandagatla 		dmic_clk_reg = WCD9335_CPE_SS_DMIC1_CTL;
29376ccc25f6SSrinivas Kandagatla 		break;
29386ccc25f6SSrinivas Kandagatla 	case 4:
29396ccc25f6SSrinivas Kandagatla 	case 5:
29406ccc25f6SSrinivas Kandagatla 		dmic_clk_cnt = &(wcd->dmic_4_5_clk_cnt);
29416ccc25f6SSrinivas Kandagatla 		dmic_clk_reg = WCD9335_CPE_SS_DMIC2_CTL;
29426ccc25f6SSrinivas Kandagatla 		break;
29436ccc25f6SSrinivas Kandagatla 	default:
29446ccc25f6SSrinivas Kandagatla 		dev_err(comp->dev, "%s: Invalid DMIC Selection\n",
29456ccc25f6SSrinivas Kandagatla 			__func__);
29466ccc25f6SSrinivas Kandagatla 		return -EINVAL;
29470eb06746SJason Yan 	}
29486ccc25f6SSrinivas Kandagatla 
29496ccc25f6SSrinivas Kandagatla 	switch (event) {
29506ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
29516ccc25f6SSrinivas Kandagatla 		dmic_rate_val =
29526ccc25f6SSrinivas Kandagatla 			wcd9335_get_dmic_clk_val(comp,
29536ccc25f6SSrinivas Kandagatla 					wcd->mclk_rate,
29546ccc25f6SSrinivas Kandagatla 					wcd->dmic_sample_rate);
29556ccc25f6SSrinivas Kandagatla 
29566ccc25f6SSrinivas Kandagatla 		(*dmic_clk_cnt)++;
29576ccc25f6SSrinivas Kandagatla 		if (*dmic_clk_cnt == 1) {
29586ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, dmic_clk_reg,
29596ccc25f6SSrinivas Kandagatla 				0x07 << dmic_rate_shift,
29606ccc25f6SSrinivas Kandagatla 				dmic_rate_val << dmic_rate_shift);
29616ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, dmic_clk_reg,
29626ccc25f6SSrinivas Kandagatla 					dmic_clk_en, dmic_clk_en);
29636ccc25f6SSrinivas Kandagatla 		}
29646ccc25f6SSrinivas Kandagatla 
29656ccc25f6SSrinivas Kandagatla 		break;
29666ccc25f6SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
29676ccc25f6SSrinivas Kandagatla 		dmic_rate_val =
29686ccc25f6SSrinivas Kandagatla 			wcd9335_get_dmic_clk_val(comp,
29696ccc25f6SSrinivas Kandagatla 					wcd->mclk_rate,
29706ccc25f6SSrinivas Kandagatla 					wcd->mad_dmic_sample_rate);
29716ccc25f6SSrinivas Kandagatla 		(*dmic_clk_cnt)--;
29726ccc25f6SSrinivas Kandagatla 		if (*dmic_clk_cnt  == 0) {
29736ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, dmic_clk_reg,
29746ccc25f6SSrinivas Kandagatla 					dmic_clk_en, 0);
29756ccc25f6SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, dmic_clk_reg,
29766ccc25f6SSrinivas Kandagatla 				0x07 << dmic_rate_shift,
29776ccc25f6SSrinivas Kandagatla 				dmic_rate_val << dmic_rate_shift);
29786ccc25f6SSrinivas Kandagatla 		}
29796ccc25f6SSrinivas Kandagatla 		break;
29800eb06746SJason Yan 	}
29816ccc25f6SSrinivas Kandagatla 
29826ccc25f6SSrinivas Kandagatla 	return 0;
29836ccc25f6SSrinivas Kandagatla }
29846ccc25f6SSrinivas Kandagatla 
wcd9335_codec_enable_int_port(struct wcd_slim_codec_dai_data * dai,struct snd_soc_component * component)298535446148SSrinivas Kandagatla static void wcd9335_codec_enable_int_port(struct wcd_slim_codec_dai_data *dai,
298635446148SSrinivas Kandagatla 					struct snd_soc_component *component)
298735446148SSrinivas Kandagatla {
298835446148SSrinivas Kandagatla 	int port_num = 0;
298935446148SSrinivas Kandagatla 	unsigned short reg = 0;
299035446148SSrinivas Kandagatla 	unsigned int val = 0;
299135446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
299235446148SSrinivas Kandagatla 	struct wcd9335_slim_ch *ch;
299335446148SSrinivas Kandagatla 
299435446148SSrinivas Kandagatla 	list_for_each_entry(ch, &dai->slim_ch_list, list) {
299535446148SSrinivas Kandagatla 		if (ch->port >= WCD9335_RX_START) {
299635446148SSrinivas Kandagatla 			port_num = ch->port - WCD9335_RX_START;
299735446148SSrinivas Kandagatla 			reg = WCD9335_SLIM_PGD_PORT_INT_EN0 + (port_num / 8);
299835446148SSrinivas Kandagatla 		} else {
299935446148SSrinivas Kandagatla 			port_num = ch->port;
300035446148SSrinivas Kandagatla 			reg = WCD9335_SLIM_PGD_PORT_INT_TX_EN0 + (port_num / 8);
300135446148SSrinivas Kandagatla 		}
300235446148SSrinivas Kandagatla 
300335446148SSrinivas Kandagatla 		regmap_read(wcd->if_regmap, reg, &val);
300435446148SSrinivas Kandagatla 		if (!(val & BIT(port_num % 8)))
300535446148SSrinivas Kandagatla 			regmap_write(wcd->if_regmap, reg,
300635446148SSrinivas Kandagatla 					val | BIT(port_num % 8));
300735446148SSrinivas Kandagatla 	}
300835446148SSrinivas Kandagatla }
300935446148SSrinivas Kandagatla 
wcd9335_codec_enable_slim(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)301035446148SSrinivas Kandagatla static int wcd9335_codec_enable_slim(struct snd_soc_dapm_widget *w,
301135446148SSrinivas Kandagatla 				       struct snd_kcontrol *kc,
301235446148SSrinivas Kandagatla 				       int event)
301335446148SSrinivas Kandagatla {
301435446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
301535446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
301635446148SSrinivas Kandagatla 	struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift];
301735446148SSrinivas Kandagatla 
301835446148SSrinivas Kandagatla 	switch (event) {
301935446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
302035446148SSrinivas Kandagatla 		wcd9335_codec_enable_int_port(dai, comp);
302135446148SSrinivas Kandagatla 		break;
302235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
302335446148SSrinivas Kandagatla 		kfree(dai->sconfig.chs);
302435446148SSrinivas Kandagatla 
302535446148SSrinivas Kandagatla 		break;
302635446148SSrinivas Kandagatla 	}
302735446148SSrinivas Kandagatla 
3028d1c9e44aSSaiyam Doshi 	return 0;
302935446148SSrinivas Kandagatla }
303035446148SSrinivas Kandagatla 
wcd9335_codec_enable_mix_path(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)303135446148SSrinivas Kandagatla static int wcd9335_codec_enable_mix_path(struct snd_soc_dapm_widget *w,
303235446148SSrinivas Kandagatla 		struct snd_kcontrol *kc, int event)
303335446148SSrinivas Kandagatla {
303435446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
303535446148SSrinivas Kandagatla 	u16 gain_reg;
303635446148SSrinivas Kandagatla 	int offset_val = 0;
303735446148SSrinivas Kandagatla 	int val = 0;
303835446148SSrinivas Kandagatla 
303935446148SSrinivas Kandagatla 	switch (w->reg) {
304035446148SSrinivas Kandagatla 	case WCD9335_CDC_RX0_RX_PATH_MIX_CTL:
304135446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX0_RX_VOL_MIX_CTL;
304235446148SSrinivas Kandagatla 		break;
304335446148SSrinivas Kandagatla 	case WCD9335_CDC_RX1_RX_PATH_MIX_CTL:
304435446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX1_RX_VOL_MIX_CTL;
304535446148SSrinivas Kandagatla 		break;
304635446148SSrinivas Kandagatla 	case WCD9335_CDC_RX2_RX_PATH_MIX_CTL:
304735446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX2_RX_VOL_MIX_CTL;
304835446148SSrinivas Kandagatla 		break;
304935446148SSrinivas Kandagatla 	case WCD9335_CDC_RX3_RX_PATH_MIX_CTL:
305035446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX3_RX_VOL_MIX_CTL;
305135446148SSrinivas Kandagatla 		break;
305235446148SSrinivas Kandagatla 	case WCD9335_CDC_RX4_RX_PATH_MIX_CTL:
305335446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX4_RX_VOL_MIX_CTL;
305435446148SSrinivas Kandagatla 		break;
305535446148SSrinivas Kandagatla 	case WCD9335_CDC_RX5_RX_PATH_MIX_CTL:
305635446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX5_RX_VOL_MIX_CTL;
305735446148SSrinivas Kandagatla 		break;
305835446148SSrinivas Kandagatla 	case WCD9335_CDC_RX6_RX_PATH_MIX_CTL:
305935446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX6_RX_VOL_MIX_CTL;
306035446148SSrinivas Kandagatla 		break;
306135446148SSrinivas Kandagatla 	case WCD9335_CDC_RX7_RX_PATH_MIX_CTL:
306235446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX7_RX_VOL_MIX_CTL;
306335446148SSrinivas Kandagatla 		break;
306435446148SSrinivas Kandagatla 	case WCD9335_CDC_RX8_RX_PATH_MIX_CTL:
306535446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX8_RX_VOL_MIX_CTL;
306635446148SSrinivas Kandagatla 		break;
306735446148SSrinivas Kandagatla 	default:
306835446148SSrinivas Kandagatla 		dev_err(comp->dev, "%s: No gain register avail for %s\n",
306935446148SSrinivas Kandagatla 			__func__, w->name);
307035446148SSrinivas Kandagatla 		return 0;
30710eb06746SJason Yan 	}
307235446148SSrinivas Kandagatla 
307335446148SSrinivas Kandagatla 	switch (event) {
307435446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
3075eaf2767cSKuninori Morimoto 		val = snd_soc_component_read(comp, gain_reg);
307635446148SSrinivas Kandagatla 		val += offset_val;
307735446148SSrinivas Kandagatla 		snd_soc_component_write(comp, gain_reg, val);
307835446148SSrinivas Kandagatla 		break;
307935446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
308035446148SSrinivas Kandagatla 		break;
30810eb06746SJason Yan 	}
308235446148SSrinivas Kandagatla 
308335446148SSrinivas Kandagatla 	return 0;
308435446148SSrinivas Kandagatla }
308535446148SSrinivas Kandagatla 
wcd9335_interp_get_primary_reg(u16 reg,u16 * ind)308635446148SSrinivas Kandagatla static u16 wcd9335_interp_get_primary_reg(u16 reg, u16 *ind)
308735446148SSrinivas Kandagatla {
308835446148SSrinivas Kandagatla 	u16 prim_int_reg = WCD9335_CDC_RX0_RX_PATH_CTL;
308935446148SSrinivas Kandagatla 
309035446148SSrinivas Kandagatla 	switch (reg) {
309135446148SSrinivas Kandagatla 	case WCD9335_CDC_RX0_RX_PATH_CTL:
309235446148SSrinivas Kandagatla 	case WCD9335_CDC_RX0_RX_PATH_MIX_CTL:
309335446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX0_RX_PATH_CTL;
309435446148SSrinivas Kandagatla 		*ind = 0;
309535446148SSrinivas Kandagatla 		break;
309635446148SSrinivas Kandagatla 	case WCD9335_CDC_RX1_RX_PATH_CTL:
309735446148SSrinivas Kandagatla 	case WCD9335_CDC_RX1_RX_PATH_MIX_CTL:
309835446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX1_RX_PATH_CTL;
309935446148SSrinivas Kandagatla 		*ind = 1;
310035446148SSrinivas Kandagatla 		break;
310135446148SSrinivas Kandagatla 	case WCD9335_CDC_RX2_RX_PATH_CTL:
310235446148SSrinivas Kandagatla 	case WCD9335_CDC_RX2_RX_PATH_MIX_CTL:
310335446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX2_RX_PATH_CTL;
310435446148SSrinivas Kandagatla 		*ind = 2;
310535446148SSrinivas Kandagatla 		break;
310635446148SSrinivas Kandagatla 	case WCD9335_CDC_RX3_RX_PATH_CTL:
310735446148SSrinivas Kandagatla 	case WCD9335_CDC_RX3_RX_PATH_MIX_CTL:
310835446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX3_RX_PATH_CTL;
310935446148SSrinivas Kandagatla 		*ind = 3;
311035446148SSrinivas Kandagatla 		break;
311135446148SSrinivas Kandagatla 	case WCD9335_CDC_RX4_RX_PATH_CTL:
311235446148SSrinivas Kandagatla 	case WCD9335_CDC_RX4_RX_PATH_MIX_CTL:
311335446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX4_RX_PATH_CTL;
311435446148SSrinivas Kandagatla 		*ind = 4;
311535446148SSrinivas Kandagatla 		break;
311635446148SSrinivas Kandagatla 	case WCD9335_CDC_RX5_RX_PATH_CTL:
311735446148SSrinivas Kandagatla 	case WCD9335_CDC_RX5_RX_PATH_MIX_CTL:
311835446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX5_RX_PATH_CTL;
311935446148SSrinivas Kandagatla 		*ind = 5;
312035446148SSrinivas Kandagatla 		break;
312135446148SSrinivas Kandagatla 	case WCD9335_CDC_RX6_RX_PATH_CTL:
312235446148SSrinivas Kandagatla 	case WCD9335_CDC_RX6_RX_PATH_MIX_CTL:
312335446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX6_RX_PATH_CTL;
312435446148SSrinivas Kandagatla 		*ind = 6;
312535446148SSrinivas Kandagatla 		break;
312635446148SSrinivas Kandagatla 	case WCD9335_CDC_RX7_RX_PATH_CTL:
312735446148SSrinivas Kandagatla 	case WCD9335_CDC_RX7_RX_PATH_MIX_CTL:
312835446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX7_RX_PATH_CTL;
312935446148SSrinivas Kandagatla 		*ind = 7;
313035446148SSrinivas Kandagatla 		break;
313135446148SSrinivas Kandagatla 	case WCD9335_CDC_RX8_RX_PATH_CTL:
313235446148SSrinivas Kandagatla 	case WCD9335_CDC_RX8_RX_PATH_MIX_CTL:
313335446148SSrinivas Kandagatla 		prim_int_reg = WCD9335_CDC_RX8_RX_PATH_CTL;
313435446148SSrinivas Kandagatla 		*ind = 8;
313535446148SSrinivas Kandagatla 		break;
31360eb06746SJason Yan 	}
313735446148SSrinivas Kandagatla 
313835446148SSrinivas Kandagatla 	return prim_int_reg;
313935446148SSrinivas Kandagatla }
314035446148SSrinivas Kandagatla 
wcd9335_codec_hd2_control(struct snd_soc_component * component,u16 prim_int_reg,int event)314135446148SSrinivas Kandagatla static void wcd9335_codec_hd2_control(struct snd_soc_component *component,
314235446148SSrinivas Kandagatla 				    u16 prim_int_reg, int event)
314335446148SSrinivas Kandagatla {
314435446148SSrinivas Kandagatla 	u16 hd2_scale_reg;
314535446148SSrinivas Kandagatla 	u16 hd2_enable_reg = 0;
314635446148SSrinivas Kandagatla 
314735446148SSrinivas Kandagatla 	if (prim_int_reg == WCD9335_CDC_RX1_RX_PATH_CTL) {
314835446148SSrinivas Kandagatla 		hd2_scale_reg = WCD9335_CDC_RX1_RX_PATH_SEC3;
314935446148SSrinivas Kandagatla 		hd2_enable_reg = WCD9335_CDC_RX1_RX_PATH_CFG0;
315035446148SSrinivas Kandagatla 	}
315135446148SSrinivas Kandagatla 	if (prim_int_reg == WCD9335_CDC_RX2_RX_PATH_CTL) {
315235446148SSrinivas Kandagatla 		hd2_scale_reg = WCD9335_CDC_RX2_RX_PATH_SEC3;
315335446148SSrinivas Kandagatla 		hd2_enable_reg = WCD9335_CDC_RX2_RX_PATH_CFG0;
315435446148SSrinivas Kandagatla 	}
315535446148SSrinivas Kandagatla 
315635446148SSrinivas Kandagatla 	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
315735446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
315835446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_MASK,
315935446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_0P2500);
316035446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
316135446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_MASK,
316235446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_2);
316335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_enable_reg,
316435446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_CFG_HD2_EN_MASK,
316535446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_CFG_HD2_ENABLE);
316635446148SSrinivas Kandagatla 	}
316735446148SSrinivas Kandagatla 
316835446148SSrinivas Kandagatla 	if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
316935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_enable_reg,
317035446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_CFG_HD2_EN_MASK,
317135446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_CFG_HD2_DISABLE);
317235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
317335446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_MASK,
317435446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_SEC_HD2_SCALE_1);
317535446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, hd2_scale_reg,
317635446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_MASK,
317735446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_SEC_HD2_ALPHA_0P0000);
317835446148SSrinivas Kandagatla 	}
317935446148SSrinivas Kandagatla }
318035446148SSrinivas Kandagatla 
wcd9335_codec_enable_prim_interpolator(struct snd_soc_component * comp,u16 reg,int event)318135446148SSrinivas Kandagatla static int wcd9335_codec_enable_prim_interpolator(
318235446148SSrinivas Kandagatla 						struct snd_soc_component *comp,
318335446148SSrinivas Kandagatla 						u16 reg, int event)
318435446148SSrinivas Kandagatla {
318535446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
318635446148SSrinivas Kandagatla 	u16 ind = 0;
318735446148SSrinivas Kandagatla 	int prim_int_reg = wcd9335_interp_get_primary_reg(reg, &ind);
318835446148SSrinivas Kandagatla 
318935446148SSrinivas Kandagatla 	switch (event) {
319035446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
319135446148SSrinivas Kandagatla 		wcd->prim_int_users[ind]++;
319235446148SSrinivas Kandagatla 		if (wcd->prim_int_users[ind] == 1) {
319335446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, prim_int_reg,
319435446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
319535446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_ENABLE);
319635446148SSrinivas Kandagatla 			wcd9335_codec_hd2_control(comp, prim_int_reg, event);
319735446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, prim_int_reg,
319835446148SSrinivas Kandagatla 					WCD9335_CDC_RX_CLK_EN_MASK,
319935446148SSrinivas Kandagatla 					WCD9335_CDC_RX_CLK_ENABLE);
320035446148SSrinivas Kandagatla 		}
320135446148SSrinivas Kandagatla 
320235446148SSrinivas Kandagatla 		if ((reg != prim_int_reg) &&
3203eaf2767cSKuninori Morimoto 			((snd_soc_component_read(comp, prim_int_reg)) &
320435446148SSrinivas Kandagatla 			 WCD9335_CDC_RX_PGA_MUTE_EN_MASK))
320535446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, reg,
320635446148SSrinivas Kandagatla 						WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
320735446148SSrinivas Kandagatla 						WCD9335_CDC_RX_PGA_MUTE_ENABLE);
320835446148SSrinivas Kandagatla 		break;
320935446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
321035446148SSrinivas Kandagatla 		wcd->prim_int_users[ind]--;
321135446148SSrinivas Kandagatla 		if (wcd->prim_int_users[ind] == 0) {
321235446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, prim_int_reg,
321335446148SSrinivas Kandagatla 					WCD9335_CDC_RX_CLK_EN_MASK,
321435446148SSrinivas Kandagatla 					WCD9335_CDC_RX_CLK_DISABLE);
321535446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, prim_int_reg,
321635446148SSrinivas Kandagatla 					WCD9335_CDC_RX_RESET_MASK,
321735446148SSrinivas Kandagatla 					WCD9335_CDC_RX_RESET_ENABLE);
321835446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp, prim_int_reg,
321935446148SSrinivas Kandagatla 					WCD9335_CDC_RX_RESET_MASK,
322035446148SSrinivas Kandagatla 					WCD9335_CDC_RX_RESET_DISABLE);
322135446148SSrinivas Kandagatla 			wcd9335_codec_hd2_control(comp, prim_int_reg, event);
322235446148SSrinivas Kandagatla 		}
322335446148SSrinivas Kandagatla 		break;
32240eb06746SJason Yan 	}
322535446148SSrinivas Kandagatla 
322635446148SSrinivas Kandagatla 	return 0;
322735446148SSrinivas Kandagatla }
322835446148SSrinivas Kandagatla 
wcd9335_config_compander(struct snd_soc_component * component,int interp_n,int event)322935446148SSrinivas Kandagatla static int wcd9335_config_compander(struct snd_soc_component *component,
323035446148SSrinivas Kandagatla 				    int interp_n, int event)
323135446148SSrinivas Kandagatla {
323235446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
323335446148SSrinivas Kandagatla 	int comp;
323435446148SSrinivas Kandagatla 	u16 comp_ctl0_reg, rx_path_cfg0_reg;
323535446148SSrinivas Kandagatla 
323635446148SSrinivas Kandagatla 	/* EAR does not have compander */
323735446148SSrinivas Kandagatla 	if (!interp_n)
323835446148SSrinivas Kandagatla 		return 0;
323935446148SSrinivas Kandagatla 
324035446148SSrinivas Kandagatla 	comp = interp_n - 1;
324135446148SSrinivas Kandagatla 	if (!wcd->comp_enabled[comp])
324235446148SSrinivas Kandagatla 		return 0;
324335446148SSrinivas Kandagatla 
324435446148SSrinivas Kandagatla 	comp_ctl0_reg = WCD9335_CDC_COMPANDER1_CTL(comp);
324535446148SSrinivas Kandagatla 	rx_path_cfg0_reg = WCD9335_CDC_RX1_RX_PATH_CFG(comp);
324635446148SSrinivas Kandagatla 
324735446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
324835446148SSrinivas Kandagatla 		/* Enable Compander Clock */
324935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
325035446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_CLK_EN_MASK,
325135446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_CLK_ENABLE);
325235446148SSrinivas Kandagatla 		/* Reset comander */
325335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
325435446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
325535446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_SOFT_RST_ENABLE);
325635446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
325735446148SSrinivas Kandagatla 				WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
325835446148SSrinivas Kandagatla 				WCD9335_CDC_COMPANDER_SOFT_RST_DISABLE);
325935446148SSrinivas Kandagatla 		/* Enables DRE in this path */
326035446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
326135446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_CFG_CMP_EN_MASK,
326235446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_CFG_CMP_ENABLE);
326335446148SSrinivas Kandagatla 	}
326435446148SSrinivas Kandagatla 
326535446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event)) {
326635446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
326735446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_HALT_MASK,
326835446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_HALT);
326935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
327035446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_CFG_CMP_EN_MASK,
327135446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PATH_CFG_CMP_DISABLE);
327235446148SSrinivas Kandagatla 
327335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
327435446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
327535446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_SOFT_RST_ENABLE);
327635446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
327735446148SSrinivas Kandagatla 				WCD9335_CDC_COMPANDER_SOFT_RST_MASK,
327835446148SSrinivas Kandagatla 				WCD9335_CDC_COMPANDER_SOFT_RST_DISABLE);
327935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
328035446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_CLK_EN_MASK,
328135446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_CLK_DISABLE);
328235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(component, comp_ctl0_reg,
328335446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_HALT_MASK,
328435446148SSrinivas Kandagatla 					WCD9335_CDC_COMPANDER_NOHALT);
328535446148SSrinivas Kandagatla 	}
328635446148SSrinivas Kandagatla 
328735446148SSrinivas Kandagatla 	return 0;
328835446148SSrinivas Kandagatla }
328935446148SSrinivas Kandagatla 
wcd9335_codec_enable_interpolator(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)329035446148SSrinivas Kandagatla static int wcd9335_codec_enable_interpolator(struct snd_soc_dapm_widget *w,
329135446148SSrinivas Kandagatla 		struct snd_kcontrol *kc, int event)
329235446148SSrinivas Kandagatla {
329335446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
329435446148SSrinivas Kandagatla 	u16 gain_reg;
329535446148SSrinivas Kandagatla 	u16 reg;
329635446148SSrinivas Kandagatla 	int val;
329735446148SSrinivas Kandagatla 	int offset_val = 0;
329835446148SSrinivas Kandagatla 
329935446148SSrinivas Kandagatla 	if (!(strcmp(w->name, "RX INT0 INTERP"))) {
330035446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX0_RX_PATH_CTL;
330135446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX0_RX_VOL_CTL;
330235446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT1 INTERP"))) {
330335446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX1_RX_PATH_CTL;
330435446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX1_RX_VOL_CTL;
330535446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT2 INTERP"))) {
330635446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX2_RX_PATH_CTL;
330735446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX2_RX_VOL_CTL;
330835446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT3 INTERP"))) {
330935446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX3_RX_PATH_CTL;
331035446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX3_RX_VOL_CTL;
331135446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT4 INTERP"))) {
331235446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX4_RX_PATH_CTL;
331335446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX4_RX_VOL_CTL;
331435446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT5 INTERP"))) {
331535446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX5_RX_PATH_CTL;
331635446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX5_RX_VOL_CTL;
331735446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT6 INTERP"))) {
331835446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX6_RX_PATH_CTL;
331935446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX6_RX_VOL_CTL;
332035446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT7 INTERP"))) {
332135446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX7_RX_PATH_CTL;
332235446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX7_RX_VOL_CTL;
332335446148SSrinivas Kandagatla 	} else if (!(strcmp(w->name, "RX INT8 INTERP"))) {
332435446148SSrinivas Kandagatla 		reg = WCD9335_CDC_RX8_RX_PATH_CTL;
332535446148SSrinivas Kandagatla 		gain_reg = WCD9335_CDC_RX8_RX_VOL_CTL;
332635446148SSrinivas Kandagatla 	} else {
332735446148SSrinivas Kandagatla 		dev_err(comp->dev, "%s: Interpolator reg not found\n",
332835446148SSrinivas Kandagatla 			__func__);
332935446148SSrinivas Kandagatla 		return -EINVAL;
333035446148SSrinivas Kandagatla 	}
333135446148SSrinivas Kandagatla 
333235446148SSrinivas Kandagatla 	switch (event) {
333335446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
333435446148SSrinivas Kandagatla 		/* Reset if needed */
333535446148SSrinivas Kandagatla 		wcd9335_codec_enable_prim_interpolator(comp, reg, event);
333635446148SSrinivas Kandagatla 		break;
333735446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
333835446148SSrinivas Kandagatla 		wcd9335_config_compander(comp, w->shift, event);
3339eaf2767cSKuninori Morimoto 		val = snd_soc_component_read(comp, gain_reg);
334035446148SSrinivas Kandagatla 		val += offset_val;
334135446148SSrinivas Kandagatla 		snd_soc_component_write(comp, gain_reg, val);
334235446148SSrinivas Kandagatla 		break;
334335446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
334435446148SSrinivas Kandagatla 		wcd9335_config_compander(comp, w->shift, event);
334535446148SSrinivas Kandagatla 		wcd9335_codec_enable_prim_interpolator(comp, reg, event);
334635446148SSrinivas Kandagatla 		break;
33470eb06746SJason Yan 	}
334835446148SSrinivas Kandagatla 
334935446148SSrinivas Kandagatla 	return 0;
335035446148SSrinivas Kandagatla }
335135446148SSrinivas Kandagatla 
wcd9335_codec_hph_mode_gain_opt(struct snd_soc_component * component,u8 gain)335235446148SSrinivas Kandagatla static void wcd9335_codec_hph_mode_gain_opt(struct snd_soc_component *component,
335335446148SSrinivas Kandagatla 					    u8 gain)
335435446148SSrinivas Kandagatla {
335535446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
335635446148SSrinivas Kandagatla 	u8 hph_l_en, hph_r_en;
335735446148SSrinivas Kandagatla 	u8 l_val, r_val;
335835446148SSrinivas Kandagatla 	u8 hph_pa_status;
335935446148SSrinivas Kandagatla 	bool is_hphl_pa, is_hphr_pa;
336035446148SSrinivas Kandagatla 
3361eaf2767cSKuninori Morimoto 	hph_pa_status = snd_soc_component_read(component, WCD9335_ANA_HPH);
336235446148SSrinivas Kandagatla 	is_hphl_pa = hph_pa_status >> 7;
336335446148SSrinivas Kandagatla 	is_hphr_pa = (hph_pa_status & 0x40) >> 6;
336435446148SSrinivas Kandagatla 
3365eaf2767cSKuninori Morimoto 	hph_l_en = snd_soc_component_read(component, WCD9335_HPH_L_EN);
3366eaf2767cSKuninori Morimoto 	hph_r_en = snd_soc_component_read(component, WCD9335_HPH_R_EN);
336735446148SSrinivas Kandagatla 
336835446148SSrinivas Kandagatla 	l_val = (hph_l_en & 0xC0) | 0x20 | gain;
336935446148SSrinivas Kandagatla 	r_val = (hph_r_en & 0xC0) | 0x20 | gain;
337035446148SSrinivas Kandagatla 
337135446148SSrinivas Kandagatla 	/*
337235446148SSrinivas Kandagatla 	 * Set HPH_L & HPH_R gain source selection to REGISTER
337335446148SSrinivas Kandagatla 	 * for better click and pop only if corresponding PAs are
337435446148SSrinivas Kandagatla 	 * not enabled. Also cache the values of the HPHL/R
337535446148SSrinivas Kandagatla 	 * PA gains to be applied after PAs are enabled
337635446148SSrinivas Kandagatla 	 */
337735446148SSrinivas Kandagatla 	if ((l_val != hph_l_en) && !is_hphl_pa) {
337835446148SSrinivas Kandagatla 		snd_soc_component_write(component, WCD9335_HPH_L_EN, l_val);
337935446148SSrinivas Kandagatla 		wcd->hph_l_gain = hph_l_en & 0x1F;
338035446148SSrinivas Kandagatla 	}
338135446148SSrinivas Kandagatla 
338235446148SSrinivas Kandagatla 	if ((r_val != hph_r_en) && !is_hphr_pa) {
338335446148SSrinivas Kandagatla 		snd_soc_component_write(component, WCD9335_HPH_R_EN, r_val);
338435446148SSrinivas Kandagatla 		wcd->hph_r_gain = hph_r_en & 0x1F;
338535446148SSrinivas Kandagatla 	}
338635446148SSrinivas Kandagatla }
338735446148SSrinivas Kandagatla 
wcd9335_codec_hph_lohifi_config(struct snd_soc_component * comp,int event)338835446148SSrinivas Kandagatla static void wcd9335_codec_hph_lohifi_config(struct snd_soc_component *comp,
338935446148SSrinivas Kandagatla 					  int event)
339035446148SSrinivas Kandagatla {
339135446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
339235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_RX_BIAS_HPH_PA,
339335446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_HPH_PA_AMP_5_UA_MASK,
339435446148SSrinivas Kandagatla 					0x06);
339535446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
339635446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2,
339735446148SSrinivas Kandagatla 					0xF0, 0x40);
339835446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
339935446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
340035446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_1000);
340135446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
340235446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
340335446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_ENABLE);
340435446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL1,
340535446148SSrinivas Kandagatla 				WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
340635446148SSrinivas Kandagatla 				0x0C);
340735446148SSrinivas Kandagatla 		wcd9335_codec_hph_mode_gain_opt(comp, 0x11);
340835446148SSrinivas Kandagatla 	}
340935446148SSrinivas Kandagatla 
341035446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event)) {
341135446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
341235446148SSrinivas Kandagatla 			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
341335446148SSrinivas Kandagatla 			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_DISABLE);
341435446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
341535446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
341635446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_500);
341735446148SSrinivas Kandagatla 		snd_soc_component_write(comp, WCD9335_RX_BIAS_HPH_RDACBUFF_CNP2,
341835446148SSrinivas Kandagatla 					0x8A);
341935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_RX_BIAS_HPH_PA,
342035446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_HPH_PA_AMP_5_UA_MASK,
342135446148SSrinivas Kandagatla 					0x0A);
342235446148SSrinivas Kandagatla 	}
342335446148SSrinivas Kandagatla }
342435446148SSrinivas Kandagatla 
wcd9335_codec_hph_lp_config(struct snd_soc_component * comp,int event)342535446148SSrinivas Kandagatla static void wcd9335_codec_hph_lp_config(struct snd_soc_component *comp,
342635446148SSrinivas Kandagatla 				      int event)
342735446148SSrinivas Kandagatla {
342835446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
342935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL1,
343035446148SSrinivas Kandagatla 				WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
343135446148SSrinivas Kandagatla 				0x0C);
343235446148SSrinivas Kandagatla 		wcd9335_codec_hph_mode_gain_opt(comp, 0x10);
343335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
343435446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
343535446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_1000);
343635446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
343735446148SSrinivas Kandagatla 			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
343835446148SSrinivas Kandagatla 			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_ENABLE);
343935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
344035446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_MASK,
344135446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_ENABLE);
344235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
344335446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_HPH_PSRR_ENH_MASK,
344435446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_HPH_PSRR_ENABLE);
344535446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_RDAC_LDO_CTL,
344635446148SSrinivas Kandagatla 				WCD9335_HPH_RDAC_N1P65_LD_OUTCTL_MASK,
344735446148SSrinivas Kandagatla 				WCD9335_HPH_RDAC_N1P65_LD_OUTCTL_V_N1P60);
344835446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_RDAC_LDO_CTL,
344935446148SSrinivas Kandagatla 				WCD9335_HPH_RDAC_1P65_LD_OUTCTL_MASK,
345035446148SSrinivas Kandagatla 				WCD9335_HPH_RDAC_1P65_LD_OUTCTL_V_N1P60);
345135446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
345235446148SSrinivas Kandagatla 				WCD9335_RX_BIAS_HPH_RDAC_LDO, 0x0F, 0x01);
345335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
345435446148SSrinivas Kandagatla 				WCD9335_RX_BIAS_HPH_RDAC_LDO, 0xF0, 0x10);
345535446148SSrinivas Kandagatla 	}
345635446148SSrinivas Kandagatla 
345735446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event)) {
345835446148SSrinivas Kandagatla 		snd_soc_component_write(comp, WCD9335_RX_BIAS_HPH_RDAC_LDO,
345935446148SSrinivas Kandagatla 					0x88);
346035446148SSrinivas Kandagatla 		snd_soc_component_write(comp, WCD9335_HPH_RDAC_LDO_CTL,
346135446148SSrinivas Kandagatla 					0x33);
346235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
346335446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_HPH_PSRR_ENH_MASK,
346435446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_HPH_PSRR_DISABLE);
346535446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
346635446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_MASK,
346735446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_PSRREH_DISABLE);
346835446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
346935446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
347035446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_DISABLE);
347135446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
347235446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
347335446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_500);
347435446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_R_EN,
347535446148SSrinivas Kandagatla 				WCD9335_HPH_CONST_SEL_L_MASK,
347635446148SSrinivas Kandagatla 				WCD9335_HPH_CONST_SEL_L_HQ_PATH);
347735446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_L_EN,
347835446148SSrinivas Kandagatla 				WCD9335_HPH_CONST_SEL_L_MASK,
347935446148SSrinivas Kandagatla 				WCD9335_HPH_CONST_SEL_L_HQ_PATH);
348035446148SSrinivas Kandagatla 	}
348135446148SSrinivas Kandagatla }
348235446148SSrinivas Kandagatla 
wcd9335_codec_hph_hifi_config(struct snd_soc_component * comp,int event)348335446148SSrinivas Kandagatla static void wcd9335_codec_hph_hifi_config(struct snd_soc_component *comp,
348435446148SSrinivas Kandagatla 					int event)
348535446148SSrinivas Kandagatla {
348635446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
348735446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
348835446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
348935446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_1000);
349035446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
349135446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
349235446148SSrinivas Kandagatla 				WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_ENABLE);
349335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL1,
349435446148SSrinivas Kandagatla 				WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
349535446148SSrinivas Kandagatla 				0x0C);
349635446148SSrinivas Kandagatla 		wcd9335_codec_hph_mode_gain_opt(comp, 0x11);
349735446148SSrinivas Kandagatla 	}
349835446148SSrinivas Kandagatla 
349935446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event)) {
350035446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_PA_CTL2,
350135446148SSrinivas Kandagatla 			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_MASK,
350235446148SSrinivas Kandagatla 			WCD9335_HPH_PA_CTL2_FORCE_IQCTRL_DISABLE);
350335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, WCD9335_HPH_CNP_WG_CTL,
350435446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_MASK,
350535446148SSrinivas Kandagatla 				WCD9335_HPH_CNP_WG_CTL_CURR_LDIV_RATIO_500);
350635446148SSrinivas Kandagatla 	}
350735446148SSrinivas Kandagatla }
350835446148SSrinivas Kandagatla 
wcd9335_codec_hph_mode_config(struct snd_soc_component * component,int event,int mode)350935446148SSrinivas Kandagatla static void wcd9335_codec_hph_mode_config(struct snd_soc_component *component,
351035446148SSrinivas Kandagatla 					  int event, int mode)
351135446148SSrinivas Kandagatla {
351235446148SSrinivas Kandagatla 	switch (mode) {
351335446148SSrinivas Kandagatla 	case CLS_H_LP:
351435446148SSrinivas Kandagatla 		wcd9335_codec_hph_lp_config(component, event);
351535446148SSrinivas Kandagatla 		break;
351635446148SSrinivas Kandagatla 	case CLS_H_LOHIFI:
351735446148SSrinivas Kandagatla 		wcd9335_codec_hph_lohifi_config(component, event);
351835446148SSrinivas Kandagatla 		break;
351935446148SSrinivas Kandagatla 	case CLS_H_HIFI:
352035446148SSrinivas Kandagatla 		wcd9335_codec_hph_hifi_config(component, event);
352135446148SSrinivas Kandagatla 		break;
352235446148SSrinivas Kandagatla 	}
352335446148SSrinivas Kandagatla }
352435446148SSrinivas Kandagatla 
wcd9335_codec_hphl_dac_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)352535446148SSrinivas Kandagatla static int wcd9335_codec_hphl_dac_event(struct snd_soc_dapm_widget *w,
352635446148SSrinivas Kandagatla 					struct snd_kcontrol *kc,
352735446148SSrinivas Kandagatla 					int event)
352835446148SSrinivas Kandagatla {
352935446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
353035446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
353135446148SSrinivas Kandagatla 	int hph_mode = wcd->hph_mode;
353235446148SSrinivas Kandagatla 	u8 dem_inp;
353335446148SSrinivas Kandagatla 
353435446148SSrinivas Kandagatla 	switch (event) {
353535446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
353635446148SSrinivas Kandagatla 		/* Read DEM INP Select */
3537eaf2767cSKuninori Morimoto 		dem_inp = snd_soc_component_read(comp,
353835446148SSrinivas Kandagatla 				WCD9335_CDC_RX1_RX_PATH_SEC0) & 0x03;
353935446148SSrinivas Kandagatla 		if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) ||
354035446148SSrinivas Kandagatla 				(hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) {
354135446148SSrinivas Kandagatla 			dev_err(comp->dev, "Incorrect DEM Input\n");
354235446148SSrinivas Kandagatla 			return -EINVAL;
354335446148SSrinivas Kandagatla 		}
354435446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
354535446148SSrinivas Kandagatla 					WCD_CLSH_STATE_HPHL,
354635446148SSrinivas Kandagatla 					((hph_mode == CLS_H_LOHIFI) ?
354735446148SSrinivas Kandagatla 					 CLS_H_HIFI : hph_mode));
354835446148SSrinivas Kandagatla 
354935446148SSrinivas Kandagatla 		wcd9335_codec_hph_mode_config(comp, event, hph_mode);
355035446148SSrinivas Kandagatla 
355135446148SSrinivas Kandagatla 		break;
355235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
355335446148SSrinivas Kandagatla 		usleep_range(1000, 1100);
355435446148SSrinivas Kandagatla 		break;
355535446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMD:
355635446148SSrinivas Kandagatla 		break;
355735446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
355835446148SSrinivas Kandagatla 		/* 1000us required as per HW requirement */
355935446148SSrinivas Kandagatla 		usleep_range(1000, 1100);
356035446148SSrinivas Kandagatla 
356135446148SSrinivas Kandagatla 		if (!(wcd_clsh_ctrl_get_state(wcd->clsh_ctrl) &
356235446148SSrinivas Kandagatla 				WCD_CLSH_STATE_HPHR))
356335446148SSrinivas Kandagatla 			wcd9335_codec_hph_mode_config(comp, event, hph_mode);
356435446148SSrinivas Kandagatla 
356535446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
356635446148SSrinivas Kandagatla 				WCD_CLSH_STATE_HPHL,
356735446148SSrinivas Kandagatla 				((hph_mode == CLS_H_LOHIFI) ?
356835446148SSrinivas Kandagatla 				 CLS_H_HIFI : hph_mode));
356935446148SSrinivas Kandagatla 		break;
35700eb06746SJason Yan 	}
357135446148SSrinivas Kandagatla 
3572d1c9e44aSSaiyam Doshi 	return 0;
357335446148SSrinivas Kandagatla }
357435446148SSrinivas Kandagatla 
wcd9335_codec_lineout_dac_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)357535446148SSrinivas Kandagatla static int wcd9335_codec_lineout_dac_event(struct snd_soc_dapm_widget *w,
357635446148SSrinivas Kandagatla 					   struct snd_kcontrol *kc, int event)
357735446148SSrinivas Kandagatla {
357835446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
357935446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
358035446148SSrinivas Kandagatla 
358135446148SSrinivas Kandagatla 	switch (event) {
358235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
358335446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
358435446148SSrinivas Kandagatla 					WCD_CLSH_STATE_LO, CLS_AB);
358535446148SSrinivas Kandagatla 		break;
358635446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
358735446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
358835446148SSrinivas Kandagatla 					WCD_CLSH_STATE_LO, CLS_AB);
358935446148SSrinivas Kandagatla 		break;
359035446148SSrinivas Kandagatla 	}
359135446148SSrinivas Kandagatla 
359235446148SSrinivas Kandagatla 	return 0;
359335446148SSrinivas Kandagatla }
359435446148SSrinivas Kandagatla 
wcd9335_codec_ear_dac_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)359535446148SSrinivas Kandagatla static int wcd9335_codec_ear_dac_event(struct snd_soc_dapm_widget *w,
359635446148SSrinivas Kandagatla 				       struct snd_kcontrol *kc, int event)
359735446148SSrinivas Kandagatla {
359835446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
359935446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
360035446148SSrinivas Kandagatla 
360135446148SSrinivas Kandagatla 	switch (event) {
360235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
360335446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
360435446148SSrinivas Kandagatla 					WCD_CLSH_STATE_EAR, CLS_H_NORMAL);
360535446148SSrinivas Kandagatla 
360635446148SSrinivas Kandagatla 		break;
360735446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
360835446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
360935446148SSrinivas Kandagatla 					WCD_CLSH_STATE_EAR, CLS_H_NORMAL);
361035446148SSrinivas Kandagatla 		break;
36110eb06746SJason Yan 	}
361235446148SSrinivas Kandagatla 
3613d1c9e44aSSaiyam Doshi 	return 0;
361435446148SSrinivas Kandagatla }
361535446148SSrinivas Kandagatla 
wcd9335_codec_hph_post_pa_config(struct wcd9335_codec * wcd,int mode,int event)361635446148SSrinivas Kandagatla static void wcd9335_codec_hph_post_pa_config(struct wcd9335_codec *wcd,
361735446148SSrinivas Kandagatla 					     int mode, int event)
361835446148SSrinivas Kandagatla {
361935446148SSrinivas Kandagatla 	u8 scale_val = 0;
362035446148SSrinivas Kandagatla 
362135446148SSrinivas Kandagatla 	switch (event) {
362235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
362335446148SSrinivas Kandagatla 		switch (mode) {
362435446148SSrinivas Kandagatla 		case CLS_H_HIFI:
362535446148SSrinivas Kandagatla 			scale_val = 0x3;
362635446148SSrinivas Kandagatla 			break;
362735446148SSrinivas Kandagatla 		case CLS_H_LOHIFI:
362835446148SSrinivas Kandagatla 			scale_val = 0x1;
362935446148SSrinivas Kandagatla 			break;
363035446148SSrinivas Kandagatla 		}
363135446148SSrinivas Kandagatla 		break;
363235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMD:
363335446148SSrinivas Kandagatla 		scale_val = 0x6;
363435446148SSrinivas Kandagatla 		break;
363535446148SSrinivas Kandagatla 	}
363635446148SSrinivas Kandagatla 
363735446148SSrinivas Kandagatla 	if (scale_val)
363835446148SSrinivas Kandagatla 		snd_soc_component_update_bits(wcd->component,
363935446148SSrinivas Kandagatla 					WCD9335_HPH_PA_CTL1,
364035446148SSrinivas Kandagatla 					WCD9335_HPH_PA_GM3_IB_SCALE_MASK,
364135446148SSrinivas Kandagatla 					scale_val << 1);
364235446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_ON(event)) {
364335446148SSrinivas Kandagatla 		if (wcd->comp_enabled[COMPANDER_1] ||
364435446148SSrinivas Kandagatla 		    wcd->comp_enabled[COMPANDER_2]) {
364535446148SSrinivas Kandagatla 			/* GAIN Source Selection */
364635446148SSrinivas Kandagatla 			snd_soc_component_update_bits(wcd->component,
364735446148SSrinivas Kandagatla 					WCD9335_HPH_L_EN,
364835446148SSrinivas Kandagatla 					WCD9335_HPH_GAIN_SRC_SEL_MASK,
364935446148SSrinivas Kandagatla 					WCD9335_HPH_GAIN_SRC_SEL_COMPANDER);
365035446148SSrinivas Kandagatla 			snd_soc_component_update_bits(wcd->component,
365135446148SSrinivas Kandagatla 					WCD9335_HPH_R_EN,
365235446148SSrinivas Kandagatla 					WCD9335_HPH_GAIN_SRC_SEL_MASK,
365335446148SSrinivas Kandagatla 					WCD9335_HPH_GAIN_SRC_SEL_COMPANDER);
365435446148SSrinivas Kandagatla 			snd_soc_component_update_bits(wcd->component,
365535446148SSrinivas Kandagatla 					WCD9335_HPH_AUTO_CHOP,
365635446148SSrinivas Kandagatla 					WCD9335_HPH_AUTO_CHOP_MASK,
365735446148SSrinivas Kandagatla 					WCD9335_HPH_AUTO_CHOP_FORCE_ENABLE);
365835446148SSrinivas Kandagatla 		}
365935446148SSrinivas Kandagatla 		snd_soc_component_update_bits(wcd->component,
366035446148SSrinivas Kandagatla 						WCD9335_HPH_L_EN,
366135446148SSrinivas Kandagatla 						WCD9335_HPH_PA_GAIN_MASK,
366235446148SSrinivas Kandagatla 						wcd->hph_l_gain);
366335446148SSrinivas Kandagatla 		snd_soc_component_update_bits(wcd->component,
366435446148SSrinivas Kandagatla 						WCD9335_HPH_R_EN,
366535446148SSrinivas Kandagatla 						WCD9335_HPH_PA_GAIN_MASK,
366635446148SSrinivas Kandagatla 						wcd->hph_r_gain);
366735446148SSrinivas Kandagatla 	}
366835446148SSrinivas Kandagatla 
366935446148SSrinivas Kandagatla 	if (SND_SOC_DAPM_EVENT_OFF(event))
367035446148SSrinivas Kandagatla 		snd_soc_component_update_bits(wcd->component,
367135446148SSrinivas Kandagatla 				WCD9335_HPH_AUTO_CHOP,
367235446148SSrinivas Kandagatla 				WCD9335_HPH_AUTO_CHOP_MASK,
367335446148SSrinivas Kandagatla 				WCD9335_HPH_AUTO_CHOP_ENABLE_BY_CMPDR_GAIN);
367435446148SSrinivas Kandagatla }
367535446148SSrinivas Kandagatla 
wcd9335_codec_hphr_dac_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)367635446148SSrinivas Kandagatla static int wcd9335_codec_hphr_dac_event(struct snd_soc_dapm_widget *w,
367735446148SSrinivas Kandagatla 				      struct snd_kcontrol *kc,
367835446148SSrinivas Kandagatla 				      int event)
367935446148SSrinivas Kandagatla {
368035446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
368135446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
368235446148SSrinivas Kandagatla 	int hph_mode = wcd->hph_mode;
368335446148SSrinivas Kandagatla 	u8 dem_inp;
368435446148SSrinivas Kandagatla 
368535446148SSrinivas Kandagatla 	switch (event) {
368635446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
368735446148SSrinivas Kandagatla 
368835446148SSrinivas Kandagatla 		/* Read DEM INP Select */
3689eaf2767cSKuninori Morimoto 		dem_inp = snd_soc_component_read(comp,
369035446148SSrinivas Kandagatla 				WCD9335_CDC_RX2_RX_PATH_SEC0) &
369135446148SSrinivas Kandagatla 				WCD9335_CDC_RX_PATH_DEM_INP_SEL_MASK;
369235446148SSrinivas Kandagatla 		if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) ||
369335446148SSrinivas Kandagatla 		     (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) {
369435446148SSrinivas Kandagatla 			dev_err(comp->dev, "DEM Input not set correctly, hph_mode: %d\n",
369535446148SSrinivas Kandagatla 				hph_mode);
369635446148SSrinivas Kandagatla 			return -EINVAL;
369735446148SSrinivas Kandagatla 		}
369835446148SSrinivas Kandagatla 
369935446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl,
370035446148SSrinivas Kandagatla 			     WCD_CLSH_EVENT_PRE_DAC,
370135446148SSrinivas Kandagatla 			     WCD_CLSH_STATE_HPHR,
370235446148SSrinivas Kandagatla 			     ((hph_mode == CLS_H_LOHIFI) ?
370335446148SSrinivas Kandagatla 			       CLS_H_HIFI : hph_mode));
370435446148SSrinivas Kandagatla 
370535446148SSrinivas Kandagatla 		wcd9335_codec_hph_mode_config(comp, event, hph_mode);
370635446148SSrinivas Kandagatla 
370735446148SSrinivas Kandagatla 		break;
370835446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
370935446148SSrinivas Kandagatla 		/* 1000us required as per HW requirement */
371035446148SSrinivas Kandagatla 		usleep_range(1000, 1100);
371135446148SSrinivas Kandagatla 
371235446148SSrinivas Kandagatla 		if (!(wcd_clsh_ctrl_get_state(wcd->clsh_ctrl) &
371335446148SSrinivas Kandagatla 					WCD_CLSH_STATE_HPHL))
371435446148SSrinivas Kandagatla 			wcd9335_codec_hph_mode_config(comp, event, hph_mode);
371535446148SSrinivas Kandagatla 
371635446148SSrinivas Kandagatla 		wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
371735446148SSrinivas Kandagatla 			     WCD_CLSH_STATE_HPHR, ((hph_mode == CLS_H_LOHIFI) ?
371835446148SSrinivas Kandagatla 						CLS_H_HIFI : hph_mode));
371935446148SSrinivas Kandagatla 		break;
37200eb06746SJason Yan 	}
372135446148SSrinivas Kandagatla 
3722d1c9e44aSSaiyam Doshi 	return 0;
372335446148SSrinivas Kandagatla }
372435446148SSrinivas Kandagatla 
wcd9335_codec_enable_hphl_pa(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)372535446148SSrinivas Kandagatla static int wcd9335_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w,
372635446148SSrinivas Kandagatla 				      struct snd_kcontrol *kc,
372735446148SSrinivas Kandagatla 				      int event)
372835446148SSrinivas Kandagatla {
372935446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
373035446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
373135446148SSrinivas Kandagatla 	int hph_mode = wcd->hph_mode;
373235446148SSrinivas Kandagatla 
373335446148SSrinivas Kandagatla 	switch (event) {
373435446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
373535446148SSrinivas Kandagatla 		break;
373635446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
373735446148SSrinivas Kandagatla 		/*
373835446148SSrinivas Kandagatla 		 * 7ms sleep is required after PA is enabled as per
373935446148SSrinivas Kandagatla 		 * HW requirement
374035446148SSrinivas Kandagatla 		 */
374135446148SSrinivas Kandagatla 		usleep_range(7000, 7100);
374235446148SSrinivas Kandagatla 
374335446148SSrinivas Kandagatla 		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
374435446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
374535446148SSrinivas Kandagatla 					WCD9335_CDC_RX1_RX_PATH_CTL,
374635446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
374735446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
374835446148SSrinivas Kandagatla 
374935446148SSrinivas Kandagatla 		/* Remove mix path mute if it is enabled */
3750eaf2767cSKuninori Morimoto 		if ((snd_soc_component_read(comp,
375135446148SSrinivas Kandagatla 					WCD9335_CDC_RX1_RX_PATH_MIX_CTL)) &
375235446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
375335446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,
375435446148SSrinivas Kandagatla 					    WCD9335_CDC_RX1_RX_PATH_MIX_CTL,
375535446148SSrinivas Kandagatla 					    WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
375635446148SSrinivas Kandagatla 					    WCD9335_CDC_RX_PGA_MUTE_DISABLE);
375735446148SSrinivas Kandagatla 
375835446148SSrinivas Kandagatla 		break;
375935446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMD:
376035446148SSrinivas Kandagatla 		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
376135446148SSrinivas Kandagatla 		break;
376235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
376335446148SSrinivas Kandagatla 		/* 5ms sleep is required after PA is disabled as per
376435446148SSrinivas Kandagatla 		 * HW requirement
376535446148SSrinivas Kandagatla 		 */
376635446148SSrinivas Kandagatla 		usleep_range(5000, 5500);
376735446148SSrinivas Kandagatla 		break;
37680eb06746SJason Yan 	}
376935446148SSrinivas Kandagatla 
3770d1c9e44aSSaiyam Doshi 	return 0;
377135446148SSrinivas Kandagatla }
377235446148SSrinivas Kandagatla 
wcd9335_codec_enable_lineout_pa(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)377335446148SSrinivas Kandagatla static int wcd9335_codec_enable_lineout_pa(struct snd_soc_dapm_widget *w,
377435446148SSrinivas Kandagatla 					 struct snd_kcontrol *kc,
377535446148SSrinivas Kandagatla 					 int event)
377635446148SSrinivas Kandagatla {
377735446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
377835446148SSrinivas Kandagatla 	int vol_reg = 0, mix_vol_reg = 0;
377935446148SSrinivas Kandagatla 
378035446148SSrinivas Kandagatla 	if (w->reg == WCD9335_ANA_LO_1_2) {
378135446148SSrinivas Kandagatla 		if (w->shift == 7) {
378235446148SSrinivas Kandagatla 			vol_reg = WCD9335_CDC_RX3_RX_PATH_CTL;
378335446148SSrinivas Kandagatla 			mix_vol_reg = WCD9335_CDC_RX3_RX_PATH_MIX_CTL;
378435446148SSrinivas Kandagatla 		} else if (w->shift == 6) {
378535446148SSrinivas Kandagatla 			vol_reg = WCD9335_CDC_RX4_RX_PATH_CTL;
378635446148SSrinivas Kandagatla 			mix_vol_reg = WCD9335_CDC_RX4_RX_PATH_MIX_CTL;
378735446148SSrinivas Kandagatla 		}
378835446148SSrinivas Kandagatla 	} else if (w->reg == WCD9335_ANA_LO_3_4) {
378935446148SSrinivas Kandagatla 		if (w->shift == 7) {
379035446148SSrinivas Kandagatla 			vol_reg = WCD9335_CDC_RX5_RX_PATH_CTL;
379135446148SSrinivas Kandagatla 			mix_vol_reg = WCD9335_CDC_RX5_RX_PATH_MIX_CTL;
379235446148SSrinivas Kandagatla 		} else if (w->shift == 6) {
379335446148SSrinivas Kandagatla 			vol_reg = WCD9335_CDC_RX6_RX_PATH_CTL;
379435446148SSrinivas Kandagatla 			mix_vol_reg = WCD9335_CDC_RX6_RX_PATH_MIX_CTL;
379535446148SSrinivas Kandagatla 		}
379635446148SSrinivas Kandagatla 	} else {
379735446148SSrinivas Kandagatla 		dev_err(comp->dev, "Error enabling lineout PA\n");
379835446148SSrinivas Kandagatla 		return -EINVAL;
379935446148SSrinivas Kandagatla 	}
380035446148SSrinivas Kandagatla 
380135446148SSrinivas Kandagatla 	switch (event) {
380235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
380335446148SSrinivas Kandagatla 		/* 5ms sleep is required after PA is enabled as per
380435446148SSrinivas Kandagatla 		 * HW requirement
380535446148SSrinivas Kandagatla 		 */
380635446148SSrinivas Kandagatla 		usleep_range(5000, 5500);
380735446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp, vol_reg,
380835446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
380935446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
381035446148SSrinivas Kandagatla 
381135446148SSrinivas Kandagatla 		/* Remove mix path mute if it is enabled */
3812eaf2767cSKuninori Morimoto 		if ((snd_soc_component_read(comp, mix_vol_reg)) &
381335446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
381435446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,  mix_vol_reg,
381535446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
381635446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
381735446148SSrinivas Kandagatla 		break;
381835446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
381935446148SSrinivas Kandagatla 		/* 5ms sleep is required after PA is disabled as per
382035446148SSrinivas Kandagatla 		 * HW requirement
382135446148SSrinivas Kandagatla 		 */
382235446148SSrinivas Kandagatla 		usleep_range(5000, 5500);
382335446148SSrinivas Kandagatla 		break;
38240eb06746SJason Yan 	}
382535446148SSrinivas Kandagatla 
3826d1c9e44aSSaiyam Doshi 	return 0;
382735446148SSrinivas Kandagatla }
382835446148SSrinivas Kandagatla 
wcd9335_codec_init_flyback(struct snd_soc_component * component)382935446148SSrinivas Kandagatla static void wcd9335_codec_init_flyback(struct snd_soc_component *component)
383035446148SSrinivas Kandagatla {
383135446148SSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_HPH_L_EN,
383235446148SSrinivas Kandagatla 					WCD9335_HPH_CONST_SEL_L_MASK,
383335446148SSrinivas Kandagatla 					WCD9335_HPH_CONST_SEL_L_BYPASS);
383435446148SSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_HPH_R_EN,
383535446148SSrinivas Kandagatla 					WCD9335_HPH_CONST_SEL_L_MASK,
383635446148SSrinivas Kandagatla 					WCD9335_HPH_CONST_SEL_L_BYPASS);
383735446148SSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_RX_BIAS_FLYB_BUFF,
383835446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_FLYB_VPOS_5_UA_MASK,
383935446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_FLYB_I_0P0_UA);
384035446148SSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_RX_BIAS_FLYB_BUFF,
384135446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_FLYB_VNEG_5_UA_MASK,
384235446148SSrinivas Kandagatla 					WCD9335_RX_BIAS_FLYB_I_0P0_UA);
384335446148SSrinivas Kandagatla }
384435446148SSrinivas Kandagatla 
wcd9335_codec_enable_rx_bias(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)384535446148SSrinivas Kandagatla static int wcd9335_codec_enable_rx_bias(struct snd_soc_dapm_widget *w,
384635446148SSrinivas Kandagatla 		struct snd_kcontrol *kc, int event)
384735446148SSrinivas Kandagatla {
384835446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
384935446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
385035446148SSrinivas Kandagatla 
385135446148SSrinivas Kandagatla 	switch (event) {
385235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
385335446148SSrinivas Kandagatla 		wcd->rx_bias_count++;
385435446148SSrinivas Kandagatla 		if (wcd->rx_bias_count == 1) {
385535446148SSrinivas Kandagatla 			wcd9335_codec_init_flyback(comp);
385635446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,
385735446148SSrinivas Kandagatla 						WCD9335_ANA_RX_SUPPLIES,
385835446148SSrinivas Kandagatla 						WCD9335_ANA_RX_BIAS_ENABLE_MASK,
385935446148SSrinivas Kandagatla 						WCD9335_ANA_RX_BIAS_ENABLE);
386035446148SSrinivas Kandagatla 		}
386135446148SSrinivas Kandagatla 		break;
386235446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
386335446148SSrinivas Kandagatla 		wcd->rx_bias_count--;
386435446148SSrinivas Kandagatla 		if (!wcd->rx_bias_count)
386535446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,
386635446148SSrinivas Kandagatla 					WCD9335_ANA_RX_SUPPLIES,
386735446148SSrinivas Kandagatla 					WCD9335_ANA_RX_BIAS_ENABLE_MASK,
386835446148SSrinivas Kandagatla 					WCD9335_ANA_RX_BIAS_DISABLE);
386935446148SSrinivas Kandagatla 		break;
38700eb06746SJason Yan 	}
387135446148SSrinivas Kandagatla 
387235446148SSrinivas Kandagatla 	return 0;
387335446148SSrinivas Kandagatla }
387435446148SSrinivas Kandagatla 
wcd9335_codec_enable_hphr_pa(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)387535446148SSrinivas Kandagatla static int wcd9335_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
387635446148SSrinivas Kandagatla 					struct snd_kcontrol *kc, int event)
387735446148SSrinivas Kandagatla {
387835446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
387935446148SSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
388035446148SSrinivas Kandagatla 	int hph_mode = wcd->hph_mode;
388135446148SSrinivas Kandagatla 
388235446148SSrinivas Kandagatla 	switch (event) {
388335446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
388435446148SSrinivas Kandagatla 		break;
388535446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
388635446148SSrinivas Kandagatla 		/*
388735446148SSrinivas Kandagatla 		 * 7ms sleep is required after PA is enabled as per
388835446148SSrinivas Kandagatla 		 * HW requirement
388935446148SSrinivas Kandagatla 		 */
389035446148SSrinivas Kandagatla 		usleep_range(7000, 7100);
389135446148SSrinivas Kandagatla 		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
389235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
389335446148SSrinivas Kandagatla 					WCD9335_CDC_RX2_RX_PATH_CTL,
389435446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
389535446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
389635446148SSrinivas Kandagatla 		/* Remove mix path mute if it is enabled */
3897eaf2767cSKuninori Morimoto 		if ((snd_soc_component_read(comp,
389835446148SSrinivas Kandagatla 					WCD9335_CDC_RX2_RX_PATH_MIX_CTL)) &
389935446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
390035446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,
390135446148SSrinivas Kandagatla 					WCD9335_CDC_RX2_RX_PATH_MIX_CTL,
390235446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
390335446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
390435446148SSrinivas Kandagatla 
390535446148SSrinivas Kandagatla 		break;
390635446148SSrinivas Kandagatla 
390735446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMD:
390835446148SSrinivas Kandagatla 		wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
390935446148SSrinivas Kandagatla 		break;
391035446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
391135446148SSrinivas Kandagatla 		/* 5ms sleep is required after PA is disabled as per
391235446148SSrinivas Kandagatla 		 * HW requirement
391335446148SSrinivas Kandagatla 		 */
391435446148SSrinivas Kandagatla 		usleep_range(5000, 5500);
391535446148SSrinivas Kandagatla 		break;
39160eb06746SJason Yan 	}
391735446148SSrinivas Kandagatla 
3918d1c9e44aSSaiyam Doshi 	return 0;
391935446148SSrinivas Kandagatla }
392035446148SSrinivas Kandagatla 
wcd9335_codec_enable_ear_pa(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)392135446148SSrinivas Kandagatla static int wcd9335_codec_enable_ear_pa(struct snd_soc_dapm_widget *w,
392235446148SSrinivas Kandagatla 				       struct snd_kcontrol *kc, int event)
392335446148SSrinivas Kandagatla {
392435446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
392535446148SSrinivas Kandagatla 
392635446148SSrinivas Kandagatla 	switch (event) {
392735446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMU:
392835446148SSrinivas Kandagatla 		/* 5ms sleep is required after PA is enabled as per
392935446148SSrinivas Kandagatla 		 * HW requirement
393035446148SSrinivas Kandagatla 		 */
393135446148SSrinivas Kandagatla 		usleep_range(5000, 5500);
393235446148SSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
393335446148SSrinivas Kandagatla 					WCD9335_CDC_RX0_RX_PATH_CTL,
393435446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
393535446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
393635446148SSrinivas Kandagatla 		/* Remove mix path mute if it is enabled */
3937eaf2767cSKuninori Morimoto 		if ((snd_soc_component_read(comp,
393835446148SSrinivas Kandagatla 					WCD9335_CDC_RX0_RX_PATH_MIX_CTL)) &
393935446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK)
394035446148SSrinivas Kandagatla 			snd_soc_component_update_bits(comp,
394135446148SSrinivas Kandagatla 					WCD9335_CDC_RX0_RX_PATH_MIX_CTL,
394235446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_EN_MASK,
394335446148SSrinivas Kandagatla 					WCD9335_CDC_RX_PGA_MUTE_DISABLE);
394435446148SSrinivas Kandagatla 		break;
394535446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
394635446148SSrinivas Kandagatla 		/* 5ms sleep is required after PA is disabled as per
394735446148SSrinivas Kandagatla 		 * HW requirement
394835446148SSrinivas Kandagatla 		 */
394935446148SSrinivas Kandagatla 		usleep_range(5000, 5500);
395035446148SSrinivas Kandagatla 
395135446148SSrinivas Kandagatla 		break;
39520eb06746SJason Yan 	}
395335446148SSrinivas Kandagatla 
3954d1c9e44aSSaiyam Doshi 	return 0;
395535446148SSrinivas Kandagatla }
395635446148SSrinivas Kandagatla 
wcd9335_slimbus_irq(int irq,void * data)395720aedafdSSrinivas Kandagatla static irqreturn_t wcd9335_slimbus_irq(int irq, void *data)
395820aedafdSSrinivas Kandagatla {
395920aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = data;
396020aedafdSSrinivas Kandagatla 	unsigned long status = 0;
396120aedafdSSrinivas Kandagatla 	int i, j, port_id;
396220aedafdSSrinivas Kandagatla 	unsigned int val, int_val = 0;
396320aedafdSSrinivas Kandagatla 	irqreturn_t ret = IRQ_NONE;
396420aedafdSSrinivas Kandagatla 	bool tx;
396520aedafdSSrinivas Kandagatla 	unsigned short reg = 0;
396620aedafdSSrinivas Kandagatla 
396720aedafdSSrinivas Kandagatla 	for (i = WCD9335_SLIM_PGD_PORT_INT_STATUS_RX_0, j = 0;
396820aedafdSSrinivas Kandagatla 	     i <= WCD9335_SLIM_PGD_PORT_INT_STATUS_TX_1; i++, j++) {
396920aedafdSSrinivas Kandagatla 		regmap_read(wcd->if_regmap, i, &val);
397020aedafdSSrinivas Kandagatla 		status |= ((u32)val << (8 * j));
397120aedafdSSrinivas Kandagatla 	}
397220aedafdSSrinivas Kandagatla 
397320aedafdSSrinivas Kandagatla 	for_each_set_bit(j, &status, 32) {
3974a5ec7c9eSKaixu Xia 		tx = (j >= 16);
397520aedafdSSrinivas Kandagatla 		port_id = (tx ? j - 16 : j);
397620aedafdSSrinivas Kandagatla 		regmap_read(wcd->if_regmap,
397720aedafdSSrinivas Kandagatla 				WCD9335_SLIM_PGD_PORT_INT_RX_SOURCE0 + j, &val);
397820aedafdSSrinivas Kandagatla 		if (val) {
397920aedafdSSrinivas Kandagatla 			if (!tx)
398020aedafdSSrinivas Kandagatla 				reg = WCD9335_SLIM_PGD_PORT_INT_EN0 +
398120aedafdSSrinivas Kandagatla 					(port_id / 8);
398220aedafdSSrinivas Kandagatla 			else
398320aedafdSSrinivas Kandagatla 				reg = WCD9335_SLIM_PGD_PORT_INT_TX_EN0 +
398420aedafdSSrinivas Kandagatla 					(port_id / 8);
398520aedafdSSrinivas Kandagatla 			regmap_read(
398620aedafdSSrinivas Kandagatla 				wcd->if_regmap, reg, &int_val);
398720aedafdSSrinivas Kandagatla 			/*
398820aedafdSSrinivas Kandagatla 			 * Ignore interrupts for ports for which the
398920aedafdSSrinivas Kandagatla 			 * interrupts are not specifically enabled.
399020aedafdSSrinivas Kandagatla 			 */
399120aedafdSSrinivas Kandagatla 			if (!(int_val & (1 << (port_id % 8))))
399220aedafdSSrinivas Kandagatla 				continue;
399320aedafdSSrinivas Kandagatla 		}
399420aedafdSSrinivas Kandagatla 
399520aedafdSSrinivas Kandagatla 		if (val & WCD9335_SLIM_IRQ_OVERFLOW)
399620aedafdSSrinivas Kandagatla 			dev_err_ratelimited(wcd->dev,
399720aedafdSSrinivas Kandagatla 			   "%s: overflow error on %s port %d, value %x\n",
399820aedafdSSrinivas Kandagatla 			   __func__, (tx ? "TX" : "RX"), port_id, val);
399920aedafdSSrinivas Kandagatla 
400020aedafdSSrinivas Kandagatla 		if (val & WCD9335_SLIM_IRQ_UNDERFLOW)
400120aedafdSSrinivas Kandagatla 			dev_err_ratelimited(wcd->dev,
400220aedafdSSrinivas Kandagatla 			   "%s: underflow error on %s port %d, value %x\n",
400320aedafdSSrinivas Kandagatla 			   __func__, (tx ? "TX" : "RX"), port_id, val);
400420aedafdSSrinivas Kandagatla 
400520aedafdSSrinivas Kandagatla 		if ((val & WCD9335_SLIM_IRQ_OVERFLOW) ||
400620aedafdSSrinivas Kandagatla 			(val & WCD9335_SLIM_IRQ_UNDERFLOW)) {
400720aedafdSSrinivas Kandagatla 			if (!tx)
400820aedafdSSrinivas Kandagatla 				reg = WCD9335_SLIM_PGD_PORT_INT_EN0 +
400920aedafdSSrinivas Kandagatla 					(port_id / 8);
401020aedafdSSrinivas Kandagatla 			else
401120aedafdSSrinivas Kandagatla 				reg = WCD9335_SLIM_PGD_PORT_INT_TX_EN0 +
401220aedafdSSrinivas Kandagatla 					(port_id / 8);
401320aedafdSSrinivas Kandagatla 			regmap_read(
401420aedafdSSrinivas Kandagatla 				wcd->if_regmap, reg, &int_val);
401520aedafdSSrinivas Kandagatla 			if (int_val & (1 << (port_id % 8))) {
401620aedafdSSrinivas Kandagatla 				int_val = int_val ^ (1 << (port_id % 8));
401720aedafdSSrinivas Kandagatla 				regmap_write(wcd->if_regmap,
401820aedafdSSrinivas Kandagatla 					reg, int_val);
401920aedafdSSrinivas Kandagatla 			}
402020aedafdSSrinivas Kandagatla 		}
402120aedafdSSrinivas Kandagatla 
402220aedafdSSrinivas Kandagatla 		regmap_write(wcd->if_regmap,
402320aedafdSSrinivas Kandagatla 				WCD9335_SLIM_PGD_PORT_INT_CLR_RX_0 + (j / 8),
402420aedafdSSrinivas Kandagatla 				BIT(j % 8));
402520aedafdSSrinivas Kandagatla 		ret = IRQ_HANDLED;
402620aedafdSSrinivas Kandagatla 	}
402720aedafdSSrinivas Kandagatla 
402820aedafdSSrinivas Kandagatla 	return ret;
402920aedafdSSrinivas Kandagatla }
403020aedafdSSrinivas Kandagatla 
403120aedafdSSrinivas Kandagatla static struct wcd9335_irq wcd9335_irqs[] = {
403220aedafdSSrinivas Kandagatla 	{
403320aedafdSSrinivas Kandagatla 		.irq = WCD9335_IRQ_SLIMBUS,
403420aedafdSSrinivas Kandagatla 		.handler = wcd9335_slimbus_irq,
403520aedafdSSrinivas Kandagatla 		.name = "SLIM Slave",
403620aedafdSSrinivas Kandagatla 	},
403720aedafdSSrinivas Kandagatla };
403820aedafdSSrinivas Kandagatla 
wcd9335_setup_irqs(struct wcd9335_codec * wcd)403920aedafdSSrinivas Kandagatla static int wcd9335_setup_irqs(struct wcd9335_codec *wcd)
404020aedafdSSrinivas Kandagatla {
404120aedafdSSrinivas Kandagatla 	int irq, ret, i;
404220aedafdSSrinivas Kandagatla 
404320aedafdSSrinivas Kandagatla 	for (i = 0; i < ARRAY_SIZE(wcd9335_irqs); i++) {
404420aedafdSSrinivas Kandagatla 		irq = regmap_irq_get_virq(wcd->irq_data, wcd9335_irqs[i].irq);
404520aedafdSSrinivas Kandagatla 		if (irq < 0) {
404620aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "Failed to get %s\n",
404720aedafdSSrinivas Kandagatla 					wcd9335_irqs[i].name);
404820aedafdSSrinivas Kandagatla 			return irq;
404920aedafdSSrinivas Kandagatla 		}
405020aedafdSSrinivas Kandagatla 
405120aedafdSSrinivas Kandagatla 		ret = devm_request_threaded_irq(wcd->dev, irq, NULL,
405220aedafdSSrinivas Kandagatla 						wcd9335_irqs[i].handler,
4053af62a3c8SHariprasad Kelam 						IRQF_TRIGGER_RISING |
4054af62a3c8SHariprasad Kelam 						IRQF_ONESHOT,
405520aedafdSSrinivas Kandagatla 						wcd9335_irqs[i].name, wcd);
405620aedafdSSrinivas Kandagatla 		if (ret) {
405720aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "Failed to request %s\n",
405820aedafdSSrinivas Kandagatla 					wcd9335_irqs[i].name);
405920aedafdSSrinivas Kandagatla 			return ret;
406020aedafdSSrinivas Kandagatla 		}
406120aedafdSSrinivas Kandagatla 	}
406220aedafdSSrinivas Kandagatla 
406320aedafdSSrinivas Kandagatla 	/* enable interrupts on all slave ports */
406420aedafdSSrinivas Kandagatla 	for (i = 0; i < WCD9335_SLIM_NUM_PORT_REG; i++)
406520aedafdSSrinivas Kandagatla 		regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
406620aedafdSSrinivas Kandagatla 			     0xFF);
406720aedafdSSrinivas Kandagatla 
406820aedafdSSrinivas Kandagatla 	return ret;
406920aedafdSSrinivas Kandagatla }
407020aedafdSSrinivas Kandagatla 
wcd9335_teardown_irqs(struct wcd9335_codec * wcd)4071d3efd26aSChristophe JAILLET static void wcd9335_teardown_irqs(struct wcd9335_codec *wcd)
4072d3efd26aSChristophe JAILLET {
4073d3efd26aSChristophe JAILLET 	int i;
4074d3efd26aSChristophe JAILLET 
4075d3efd26aSChristophe JAILLET 	/* disable interrupts on all slave ports */
4076d3efd26aSChristophe JAILLET 	for (i = 0; i < WCD9335_SLIM_NUM_PORT_REG; i++)
4077d3efd26aSChristophe JAILLET 		regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
4078d3efd26aSChristophe JAILLET 			     0x00);
4079d3efd26aSChristophe JAILLET }
4080d3efd26aSChristophe JAILLET 
wcd9335_cdc_sido_ccl_enable(struct wcd9335_codec * wcd,bool ccl_flag)408120aedafdSSrinivas Kandagatla static void wcd9335_cdc_sido_ccl_enable(struct wcd9335_codec *wcd,
408220aedafdSSrinivas Kandagatla 					bool ccl_flag)
408320aedafdSSrinivas Kandagatla {
408420aedafdSSrinivas Kandagatla 	struct snd_soc_component *comp = wcd->component;
408520aedafdSSrinivas Kandagatla 
408620aedafdSSrinivas Kandagatla 	if (ccl_flag) {
408720aedafdSSrinivas Kandagatla 		if (++wcd->sido_ccl_cnt == 1)
408820aedafdSSrinivas Kandagatla 			snd_soc_component_write(comp, WCD9335_SIDO_SIDO_CCL_10,
408920aedafdSSrinivas Kandagatla 					WCD9335_SIDO_SIDO_CCL_DEF_VALUE);
409020aedafdSSrinivas Kandagatla 	} else {
409120aedafdSSrinivas Kandagatla 		if (wcd->sido_ccl_cnt == 0) {
409220aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "sido_ccl already disabled\n");
409320aedafdSSrinivas Kandagatla 			return;
409420aedafdSSrinivas Kandagatla 		}
409520aedafdSSrinivas Kandagatla 		if (--wcd->sido_ccl_cnt == 0)
409620aedafdSSrinivas Kandagatla 			snd_soc_component_write(comp, WCD9335_SIDO_SIDO_CCL_10,
409720aedafdSSrinivas Kandagatla 				WCD9335_SIDO_SIDO_CCL_10_ICHARG_PWR_SEL_C320FF);
409820aedafdSSrinivas Kandagatla 	}
409920aedafdSSrinivas Kandagatla }
410020aedafdSSrinivas Kandagatla 
wcd9335_enable_master_bias(struct wcd9335_codec * wcd)410120aedafdSSrinivas Kandagatla static int wcd9335_enable_master_bias(struct wcd9335_codec *wcd)
410220aedafdSSrinivas Kandagatla {
410320aedafdSSrinivas Kandagatla 	wcd->master_bias_users++;
410420aedafdSSrinivas Kandagatla 	if (wcd->master_bias_users == 1) {
410520aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
410620aedafdSSrinivas Kandagatla 					WCD9335_ANA_BIAS_EN_MASK,
410720aedafdSSrinivas Kandagatla 					WCD9335_ANA_BIAS_ENABLE);
410820aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
410920aedafdSSrinivas Kandagatla 					WCD9335_ANA_BIAS_PRECHRG_EN_MASK,
411020aedafdSSrinivas Kandagatla 					WCD9335_ANA_BIAS_PRECHRG_ENABLE);
411120aedafdSSrinivas Kandagatla 		/*
411220aedafdSSrinivas Kandagatla 		 * 1ms delay is required after pre-charge is enabled
411320aedafdSSrinivas Kandagatla 		 * as per HW requirement
411420aedafdSSrinivas Kandagatla 		 */
411520aedafdSSrinivas Kandagatla 		usleep_range(1000, 1100);
411620aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
411720aedafdSSrinivas Kandagatla 					WCD9335_ANA_BIAS_PRECHRG_EN_MASK,
411820aedafdSSrinivas Kandagatla 					WCD9335_ANA_BIAS_PRECHRG_DISABLE);
411920aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
412020aedafdSSrinivas Kandagatla 				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE,
412120aedafdSSrinivas Kandagatla 				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE_MANUAL);
412220aedafdSSrinivas Kandagatla 	}
412320aedafdSSrinivas Kandagatla 
412420aedafdSSrinivas Kandagatla 	return 0;
412520aedafdSSrinivas Kandagatla }
412620aedafdSSrinivas Kandagatla 
wcd9335_enable_mclk(struct wcd9335_codec * wcd)412720aedafdSSrinivas Kandagatla static int wcd9335_enable_mclk(struct wcd9335_codec *wcd)
412820aedafdSSrinivas Kandagatla {
412920aedafdSSrinivas Kandagatla 	/* Enable mclk requires master bias to be enabled first */
413020aedafdSSrinivas Kandagatla 	if (wcd->master_bias_users <= 0)
413120aedafdSSrinivas Kandagatla 		return -EINVAL;
413220aedafdSSrinivas Kandagatla 
413320aedafdSSrinivas Kandagatla 	if (((wcd->clk_mclk_users == 0) && (wcd->clk_type == WCD_CLK_MCLK)) ||
413420aedafdSSrinivas Kandagatla 	    ((wcd->clk_mclk_users > 0) && (wcd->clk_type != WCD_CLK_MCLK))) {
413520aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "Error enabling MCLK, clk_type: %d\n",
413620aedafdSSrinivas Kandagatla 			wcd->clk_type);
413720aedafdSSrinivas Kandagatla 		return -EINVAL;
413820aedafdSSrinivas Kandagatla 	}
413920aedafdSSrinivas Kandagatla 
414020aedafdSSrinivas Kandagatla 	if (++wcd->clk_mclk_users == 1) {
414120aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
414220aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_EXT_CLKBUF_EN_MASK,
414320aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_EXT_CLKBUF_ENABLE);
414420aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
414520aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_SRC_MASK,
414620aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_SRC_EXTERNAL);
414720aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
414820aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_EN_MASK,
414920aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_ENABLE);
415020aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap,
415120aedafdSSrinivas Kandagatla 				   WCD9335_CDC_CLK_RST_CTRL_FS_CNT_CONTROL,
415220aedafdSSrinivas Kandagatla 				   WCD9335_CDC_CLK_RST_CTRL_FS_CNT_EN_MASK,
415320aedafdSSrinivas Kandagatla 				   WCD9335_CDC_CLK_RST_CTRL_FS_CNT_ENABLE);
415420aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap,
415520aedafdSSrinivas Kandagatla 				   WCD9335_CDC_CLK_RST_CTRL_MCLK_CONTROL,
415620aedafdSSrinivas Kandagatla 				   WCD9335_CDC_CLK_RST_CTRL_MCLK_EN_MASK,
415720aedafdSSrinivas Kandagatla 				   WCD9335_CDC_CLK_RST_CTRL_MCLK_ENABLE);
415820aedafdSSrinivas Kandagatla 		/*
415920aedafdSSrinivas Kandagatla 		 * 10us sleep is required after clock is enabled
416020aedafdSSrinivas Kandagatla 		 * as per HW requirement
416120aedafdSSrinivas Kandagatla 		 */
416220aedafdSSrinivas Kandagatla 		usleep_range(10, 15);
416320aedafdSSrinivas Kandagatla 	}
416420aedafdSSrinivas Kandagatla 
416520aedafdSSrinivas Kandagatla 	wcd->clk_type = WCD_CLK_MCLK;
416620aedafdSSrinivas Kandagatla 
416720aedafdSSrinivas Kandagatla 	return 0;
416820aedafdSSrinivas Kandagatla }
416920aedafdSSrinivas Kandagatla 
wcd9335_disable_mclk(struct wcd9335_codec * wcd)417020aedafdSSrinivas Kandagatla static int wcd9335_disable_mclk(struct wcd9335_codec *wcd)
417120aedafdSSrinivas Kandagatla {
417220aedafdSSrinivas Kandagatla 	if (wcd->clk_mclk_users <= 0)
417320aedafdSSrinivas Kandagatla 		return -EINVAL;
417420aedafdSSrinivas Kandagatla 
417520aedafdSSrinivas Kandagatla 	if (--wcd->clk_mclk_users == 0) {
417620aedafdSSrinivas Kandagatla 		if (wcd->clk_rco_users > 0) {
417720aedafdSSrinivas Kandagatla 			/* MCLK to RCO switch */
417820aedafdSSrinivas Kandagatla 			regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
417920aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_SRC_MASK,
418020aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_SRC_RCO);
418120aedafdSSrinivas Kandagatla 			wcd->clk_type = WCD_CLK_RCO;
418220aedafdSSrinivas Kandagatla 		} else {
418320aedafdSSrinivas Kandagatla 			regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
418420aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_EN_MASK,
418520aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_MCLK_DISABLE);
418620aedafdSSrinivas Kandagatla 			wcd->clk_type = WCD_CLK_OFF;
418720aedafdSSrinivas Kandagatla 		}
418820aedafdSSrinivas Kandagatla 
418920aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
419020aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_EXT_CLKBUF_EN_MASK,
419120aedafdSSrinivas Kandagatla 					WCD9335_ANA_CLK_EXT_CLKBUF_DISABLE);
419220aedafdSSrinivas Kandagatla 	}
419320aedafdSSrinivas Kandagatla 
419420aedafdSSrinivas Kandagatla 	return 0;
419520aedafdSSrinivas Kandagatla }
419620aedafdSSrinivas Kandagatla 
wcd9335_disable_master_bias(struct wcd9335_codec * wcd)419720aedafdSSrinivas Kandagatla static int wcd9335_disable_master_bias(struct wcd9335_codec *wcd)
419820aedafdSSrinivas Kandagatla {
419920aedafdSSrinivas Kandagatla 	if (wcd->master_bias_users <= 0)
420020aedafdSSrinivas Kandagatla 		return -EINVAL;
420120aedafdSSrinivas Kandagatla 
420220aedafdSSrinivas Kandagatla 	wcd->master_bias_users--;
420320aedafdSSrinivas Kandagatla 	if (wcd->master_bias_users == 0) {
420420aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
420520aedafdSSrinivas Kandagatla 				WCD9335_ANA_BIAS_EN_MASK,
420620aedafdSSrinivas Kandagatla 				WCD9335_ANA_BIAS_DISABLE);
420720aedafdSSrinivas Kandagatla 		regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
420820aedafdSSrinivas Kandagatla 				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE,
420920aedafdSSrinivas Kandagatla 				WCD9335_ANA_BIAS_PRECHRG_CTL_MODE_MANUAL);
421020aedafdSSrinivas Kandagatla 	}
421120aedafdSSrinivas Kandagatla 	return 0;
421220aedafdSSrinivas Kandagatla }
421320aedafdSSrinivas Kandagatla 
wcd9335_cdc_req_mclk_enable(struct wcd9335_codec * wcd,bool enable)421420aedafdSSrinivas Kandagatla static int wcd9335_cdc_req_mclk_enable(struct wcd9335_codec *wcd,
421520aedafdSSrinivas Kandagatla 				     bool enable)
421620aedafdSSrinivas Kandagatla {
421720aedafdSSrinivas Kandagatla 	int ret = 0;
421820aedafdSSrinivas Kandagatla 
421920aedafdSSrinivas Kandagatla 	if (enable) {
422020aedafdSSrinivas Kandagatla 		wcd9335_cdc_sido_ccl_enable(wcd, true);
422120aedafdSSrinivas Kandagatla 		ret = clk_prepare_enable(wcd->mclk);
422220aedafdSSrinivas Kandagatla 		if (ret) {
422320aedafdSSrinivas Kandagatla 			dev_err(wcd->dev, "%s: ext clk enable failed\n",
422420aedafdSSrinivas Kandagatla 				__func__);
422520aedafdSSrinivas Kandagatla 			goto err;
422620aedafdSSrinivas Kandagatla 		}
422720aedafdSSrinivas Kandagatla 		/* get BG */
422820aedafdSSrinivas Kandagatla 		wcd9335_enable_master_bias(wcd);
422920aedafdSSrinivas Kandagatla 		/* get MCLK */
423020aedafdSSrinivas Kandagatla 		wcd9335_enable_mclk(wcd);
423120aedafdSSrinivas Kandagatla 
423220aedafdSSrinivas Kandagatla 	} else {
423320aedafdSSrinivas Kandagatla 		/* put MCLK */
423420aedafdSSrinivas Kandagatla 		wcd9335_disable_mclk(wcd);
423520aedafdSSrinivas Kandagatla 		/* put BG */
423620aedafdSSrinivas Kandagatla 		wcd9335_disable_master_bias(wcd);
423720aedafdSSrinivas Kandagatla 		clk_disable_unprepare(wcd->mclk);
423820aedafdSSrinivas Kandagatla 		wcd9335_cdc_sido_ccl_enable(wcd, false);
423920aedafdSSrinivas Kandagatla 	}
424020aedafdSSrinivas Kandagatla err:
424120aedafdSSrinivas Kandagatla 	return ret;
424220aedafdSSrinivas Kandagatla }
424320aedafdSSrinivas Kandagatla 
wcd9335_codec_apply_sido_voltage(struct wcd9335_codec * wcd,enum wcd9335_sido_voltage req_mv)424420aedafdSSrinivas Kandagatla static void wcd9335_codec_apply_sido_voltage(struct wcd9335_codec *wcd,
424520aedafdSSrinivas Kandagatla 					     enum wcd9335_sido_voltage req_mv)
424620aedafdSSrinivas Kandagatla {
424720aedafdSSrinivas Kandagatla 	struct snd_soc_component *comp = wcd->component;
424820aedafdSSrinivas Kandagatla 	int vout_d_val;
424920aedafdSSrinivas Kandagatla 
425020aedafdSSrinivas Kandagatla 	if (req_mv == wcd->sido_voltage)
425120aedafdSSrinivas Kandagatla 		return;
425220aedafdSSrinivas Kandagatla 
425320aedafdSSrinivas Kandagatla 	/* compute the vout_d step value */
425420aedafdSSrinivas Kandagatla 	vout_d_val = WCD9335_CALCULATE_VOUT_D(req_mv) &
425520aedafdSSrinivas Kandagatla 			WCD9335_ANA_BUCK_VOUT_MASK;
425620aedafdSSrinivas Kandagatla 	snd_soc_component_write(comp, WCD9335_ANA_BUCK_VOUT_D, vout_d_val);
425720aedafdSSrinivas Kandagatla 	snd_soc_component_update_bits(comp, WCD9335_ANA_BUCK_CTL,
425820aedafdSSrinivas Kandagatla 				WCD9335_ANA_BUCK_CTL_RAMP_START_MASK,
425920aedafdSSrinivas Kandagatla 				WCD9335_ANA_BUCK_CTL_RAMP_START_ENABLE);
426020aedafdSSrinivas Kandagatla 
426120aedafdSSrinivas Kandagatla 	/* 1 msec sleep required after SIDO Vout_D voltage change */
426220aedafdSSrinivas Kandagatla 	usleep_range(1000, 1100);
426320aedafdSSrinivas Kandagatla 	wcd->sido_voltage = req_mv;
426420aedafdSSrinivas Kandagatla 	snd_soc_component_update_bits(comp, WCD9335_ANA_BUCK_CTL,
426520aedafdSSrinivas Kandagatla 				WCD9335_ANA_BUCK_CTL_RAMP_START_MASK,
426620aedafdSSrinivas Kandagatla 				WCD9335_ANA_BUCK_CTL_RAMP_START_DISABLE);
426720aedafdSSrinivas Kandagatla }
426820aedafdSSrinivas Kandagatla 
wcd9335_codec_update_sido_voltage(struct wcd9335_codec * wcd,enum wcd9335_sido_voltage req_mv)426920aedafdSSrinivas Kandagatla static int wcd9335_codec_update_sido_voltage(struct wcd9335_codec *wcd,
427020aedafdSSrinivas Kandagatla 					     enum wcd9335_sido_voltage req_mv)
427120aedafdSSrinivas Kandagatla {
427220aedafdSSrinivas Kandagatla 	int ret = 0;
427320aedafdSSrinivas Kandagatla 
427420aedafdSSrinivas Kandagatla 	/* enable mclk before setting SIDO voltage */
427520aedafdSSrinivas Kandagatla 	ret = wcd9335_cdc_req_mclk_enable(wcd, true);
427620aedafdSSrinivas Kandagatla 	if (ret) {
427720aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "Ext clk enable failed\n");
427820aedafdSSrinivas Kandagatla 		goto err;
427920aedafdSSrinivas Kandagatla 	}
428020aedafdSSrinivas Kandagatla 
428120aedafdSSrinivas Kandagatla 	wcd9335_codec_apply_sido_voltage(wcd, req_mv);
428220aedafdSSrinivas Kandagatla 	wcd9335_cdc_req_mclk_enable(wcd, false);
428320aedafdSSrinivas Kandagatla 
428420aedafdSSrinivas Kandagatla err:
428520aedafdSSrinivas Kandagatla 	return ret;
428620aedafdSSrinivas Kandagatla }
428720aedafdSSrinivas Kandagatla 
_wcd9335_codec_enable_mclk(struct snd_soc_component * component,int enable)428820aedafdSSrinivas Kandagatla static int _wcd9335_codec_enable_mclk(struct snd_soc_component *component,
428920aedafdSSrinivas Kandagatla 				      int enable)
429020aedafdSSrinivas Kandagatla {
429120aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
429220aedafdSSrinivas Kandagatla 	int ret;
429320aedafdSSrinivas Kandagatla 
429420aedafdSSrinivas Kandagatla 	if (enable) {
429520aedafdSSrinivas Kandagatla 		ret = wcd9335_cdc_req_mclk_enable(wcd, true);
429620aedafdSSrinivas Kandagatla 		if (ret)
429720aedafdSSrinivas Kandagatla 			return ret;
429820aedafdSSrinivas Kandagatla 
429920aedafdSSrinivas Kandagatla 		wcd9335_codec_apply_sido_voltage(wcd,
430020aedafdSSrinivas Kandagatla 				SIDO_VOLTAGE_NOMINAL_MV);
430120aedafdSSrinivas Kandagatla 	} else {
430220aedafdSSrinivas Kandagatla 		wcd9335_codec_update_sido_voltage(wcd,
430320aedafdSSrinivas Kandagatla 					wcd->sido_voltage);
430420aedafdSSrinivas Kandagatla 		wcd9335_cdc_req_mclk_enable(wcd, false);
430520aedafdSSrinivas Kandagatla 	}
430620aedafdSSrinivas Kandagatla 
430720aedafdSSrinivas Kandagatla 	return 0;
430820aedafdSSrinivas Kandagatla }
430920aedafdSSrinivas Kandagatla 
wcd9335_codec_enable_mclk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kc,int event)431035446148SSrinivas Kandagatla static int wcd9335_codec_enable_mclk(struct snd_soc_dapm_widget *w,
431135446148SSrinivas Kandagatla 				     struct snd_kcontrol *kc, int event)
431235446148SSrinivas Kandagatla {
431335446148SSrinivas Kandagatla 	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
431435446148SSrinivas Kandagatla 
431535446148SSrinivas Kandagatla 	switch (event) {
431635446148SSrinivas Kandagatla 	case SND_SOC_DAPM_PRE_PMU:
431735446148SSrinivas Kandagatla 		return _wcd9335_codec_enable_mclk(comp, true);
431835446148SSrinivas Kandagatla 	case SND_SOC_DAPM_POST_PMD:
431935446148SSrinivas Kandagatla 		return _wcd9335_codec_enable_mclk(comp, false);
432035446148SSrinivas Kandagatla 	}
432135446148SSrinivas Kandagatla 
432235446148SSrinivas Kandagatla 	return 0;
432335446148SSrinivas Kandagatla }
432435446148SSrinivas Kandagatla 
432535446148SSrinivas Kandagatla static const struct snd_soc_dapm_widget wcd9335_dapm_widgets[] = {
432635446148SSrinivas Kandagatla 	/* TODO SPK1 & SPK2 OUT*/
432735446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("EAR"),
432835446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("HPHL"),
432935446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("HPHR"),
433035446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("LINEOUT1"),
433135446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("LINEOUT2"),
433235446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("LINEOUT3"),
433335446148SSrinivas Kandagatla 	SND_SOC_DAPM_OUTPUT("LINEOUT4"),
433435446148SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_IN_E("AIF1 PB", "AIF1 Playback", 0, SND_SOC_NOPM,
433535446148SSrinivas Kandagatla 				AIF1_PB, 0, wcd9335_codec_enable_slim,
433635446148SSrinivas Kandagatla 				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
433735446148SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_IN_E("AIF2 PB", "AIF2 Playback", 0, SND_SOC_NOPM,
433835446148SSrinivas Kandagatla 				AIF2_PB, 0, wcd9335_codec_enable_slim,
433935446148SSrinivas Kandagatla 				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
434035446148SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_IN_E("AIF3 PB", "AIF3 Playback", 0, SND_SOC_NOPM,
434135446148SSrinivas Kandagatla 				AIF3_PB, 0, wcd9335_codec_enable_slim,
434235446148SSrinivas Kandagatla 				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
434335446148SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_IN_E("AIF4 PB", "AIF4 Playback", 0, SND_SOC_NOPM,
434435446148SSrinivas Kandagatla 				AIF4_PB, 0, wcd9335_codec_enable_slim,
434535446148SSrinivas Kandagatla 				SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
434635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX0 MUX", SND_SOC_NOPM, WCD9335_RX0, 0,
434735446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX0]),
434835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX1 MUX", SND_SOC_NOPM, WCD9335_RX1, 0,
434935446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX1]),
435035446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX2 MUX", SND_SOC_NOPM, WCD9335_RX2, 0,
435135446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX2]),
435235446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX3 MUX", SND_SOC_NOPM, WCD9335_RX3, 0,
435335446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX3]),
435435446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX4 MUX", SND_SOC_NOPM, WCD9335_RX4, 0,
435535446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX4]),
435635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX5 MUX", SND_SOC_NOPM, WCD9335_RX5, 0,
435735446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX5]),
435835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX6 MUX", SND_SOC_NOPM, WCD9335_RX6, 0,
435935446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX6]),
436035446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM RX7 MUX", SND_SOC_NOPM, WCD9335_RX7, 0,
436135446148SSrinivas Kandagatla 				&slim_rx_mux[WCD9335_RX7]),
436235446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
436335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
436435446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
436535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
436635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
436735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
436835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX6", SND_SOC_NOPM, 0, 0, NULL, 0),
436935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("SLIM RX7", SND_SOC_NOPM, 0, 0, NULL, 0),
437035446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", WCD9335_CDC_RX0_RX_PATH_MIX_CTL,
437135446148SSrinivas Kandagatla 			5, 0, &rx_int0_2_mux, wcd9335_codec_enable_mix_path,
437235446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
437335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", WCD9335_CDC_RX1_RX_PATH_MIX_CTL,
437435446148SSrinivas Kandagatla 			5, 0, &rx_int1_2_mux, wcd9335_codec_enable_mix_path,
437535446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
437635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", WCD9335_CDC_RX2_RX_PATH_MIX_CTL,
437735446148SSrinivas Kandagatla 			5, 0, &rx_int2_2_mux, wcd9335_codec_enable_mix_path,
437835446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
437935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT3_2 MUX", WCD9335_CDC_RX3_RX_PATH_MIX_CTL,
438035446148SSrinivas Kandagatla 			5, 0, &rx_int3_2_mux, wcd9335_codec_enable_mix_path,
438135446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
438235446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT4_2 MUX", WCD9335_CDC_RX4_RX_PATH_MIX_CTL,
438335446148SSrinivas Kandagatla 			5, 0, &rx_int4_2_mux, wcd9335_codec_enable_mix_path,
438435446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
438535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT5_2 MUX", WCD9335_CDC_RX5_RX_PATH_MIX_CTL,
438635446148SSrinivas Kandagatla 			5, 0, &rx_int5_2_mux, wcd9335_codec_enable_mix_path,
438735446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
438835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT6_2 MUX", WCD9335_CDC_RX6_RX_PATH_MIX_CTL,
438935446148SSrinivas Kandagatla 			5, 0, &rx_int6_2_mux, wcd9335_codec_enable_mix_path,
439035446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
439135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT7_2 MUX", WCD9335_CDC_RX7_RX_PATH_MIX_CTL,
439235446148SSrinivas Kandagatla 			5, 0, &rx_int7_2_mux, wcd9335_codec_enable_mix_path,
439335446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
439435446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT8_2 MUX", WCD9335_CDC_RX8_RX_PATH_MIX_CTL,
439535446148SSrinivas Kandagatla 			5, 0, &rx_int8_2_mux, wcd9335_codec_enable_mix_path,
439635446148SSrinivas Kandagatla 			SND_SOC_DAPM_POST_PMU),
439735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
439835446148SSrinivas Kandagatla 		&rx_int0_1_mix_inp0_mux),
439935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
440035446148SSrinivas Kandagatla 		&rx_int0_1_mix_inp1_mux),
440135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
440235446148SSrinivas Kandagatla 		&rx_int0_1_mix_inp2_mux),
440335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
440435446148SSrinivas Kandagatla 		&rx_int1_1_mix_inp0_mux),
440535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
440635446148SSrinivas Kandagatla 		&rx_int1_1_mix_inp1_mux),
440735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
440835446148SSrinivas Kandagatla 		&rx_int1_1_mix_inp2_mux),
440935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
441035446148SSrinivas Kandagatla 		&rx_int2_1_mix_inp0_mux),
441135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
441235446148SSrinivas Kandagatla 		&rx_int2_1_mix_inp1_mux),
441335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
441435446148SSrinivas Kandagatla 		&rx_int2_1_mix_inp2_mux),
441535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
441635446148SSrinivas Kandagatla 		&rx_int3_1_mix_inp0_mux),
441735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
441835446148SSrinivas Kandagatla 		&rx_int3_1_mix_inp1_mux),
441935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
442035446148SSrinivas Kandagatla 		&rx_int3_1_mix_inp2_mux),
442135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
442235446148SSrinivas Kandagatla 		&rx_int4_1_mix_inp0_mux),
442335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
442435446148SSrinivas Kandagatla 		&rx_int4_1_mix_inp1_mux),
442535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
442635446148SSrinivas Kandagatla 		&rx_int4_1_mix_inp2_mux),
442735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
442835446148SSrinivas Kandagatla 		&rx_int5_1_mix_inp0_mux),
442935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
443035446148SSrinivas Kandagatla 		&rx_int5_1_mix_inp1_mux),
443135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT5_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
443235446148SSrinivas Kandagatla 		&rx_int5_1_mix_inp2_mux),
443335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
443435446148SSrinivas Kandagatla 		&rx_int6_1_mix_inp0_mux),
443535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
443635446148SSrinivas Kandagatla 		&rx_int6_1_mix_inp1_mux),
443735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT6_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
443835446148SSrinivas Kandagatla 		&rx_int6_1_mix_inp2_mux),
443935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
444035446148SSrinivas Kandagatla 		&rx_int7_1_mix_inp0_mux),
444135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
444235446148SSrinivas Kandagatla 		&rx_int7_1_mix_inp1_mux),
444335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
444435446148SSrinivas Kandagatla 		&rx_int7_1_mix_inp2_mux),
444535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
444635446148SSrinivas Kandagatla 		&rx_int8_1_mix_inp0_mux),
444735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
444835446148SSrinivas Kandagatla 		&rx_int8_1_mix_inp1_mux),
444935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
445035446148SSrinivas Kandagatla 		&rx_int8_1_mix_inp2_mux),
445135446148SSrinivas Kandagatla 
445235446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
445435446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
445635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
445835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT3_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
445935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT3 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446035446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT4_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT4 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446235446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT5_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT5 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446435446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT6_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT6 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT7_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT7 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
446835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT8_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
446935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT8 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
447035446148SSrinivas Kandagatla 
447135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447235446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447435446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT3 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT4 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447635446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT5 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447735446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT6 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT7 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
447935446148SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("RX INT8 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
448035446148SSrinivas Kandagatla 
448135446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT0 DEM MUX", SND_SOC_NOPM, 0, 0,
448235446148SSrinivas Kandagatla 		&rx_int0_dem_inp_mux),
448335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0,
448435446148SSrinivas Kandagatla 		&rx_int1_dem_inp_mux),
448535446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("RX INT2 DEM MUX", SND_SOC_NOPM, 0, 0,
448635446148SSrinivas Kandagatla 		&rx_int2_dem_inp_mux),
448735446148SSrinivas Kandagatla 
448835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT0 INTERP", SND_SOC_NOPM,
448935446148SSrinivas Kandagatla 		INTERP_EAR, 0, &rx_int0_interp_mux,
449035446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
449135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
449235446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
449335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT1 INTERP", SND_SOC_NOPM,
449435446148SSrinivas Kandagatla 		INTERP_HPHL, 0, &rx_int1_interp_mux,
449535446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
449635446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
449735446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
449835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT2 INTERP", SND_SOC_NOPM,
449935446148SSrinivas Kandagatla 		INTERP_HPHR, 0, &rx_int2_interp_mux,
450035446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
450135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
450235446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
450335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT3 INTERP", SND_SOC_NOPM,
450435446148SSrinivas Kandagatla 		INTERP_LO1, 0, &rx_int3_interp_mux,
450535446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
450635446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
450735446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
450835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT4 INTERP", SND_SOC_NOPM,
450935446148SSrinivas Kandagatla 		INTERP_LO2, 0, &rx_int4_interp_mux,
451035446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
451135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
451235446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
451335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT5 INTERP", SND_SOC_NOPM,
451435446148SSrinivas Kandagatla 		INTERP_LO3, 0, &rx_int5_interp_mux,
451535446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
451635446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
451735446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
451835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT6 INTERP", SND_SOC_NOPM,
451935446148SSrinivas Kandagatla 		INTERP_LO4, 0, &rx_int6_interp_mux,
452035446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
452135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
452235446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
452335446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT7 INTERP", SND_SOC_NOPM,
452435446148SSrinivas Kandagatla 		INTERP_SPKR1, 0, &rx_int7_interp_mux,
452535446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
452635446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
452735446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
452835446148SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("RX INT8 INTERP", SND_SOC_NOPM,
452935446148SSrinivas Kandagatla 		INTERP_SPKR2, 0, &rx_int8_interp_mux,
453035446148SSrinivas Kandagatla 		wcd9335_codec_enable_interpolator,
453135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
453235446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
453335446148SSrinivas Kandagatla 
453435446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT0 DAC", NULL, SND_SOC_NOPM,
453535446148SSrinivas Kandagatla 		0, 0, wcd9335_codec_ear_dac_event,
453635446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
453735446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
453835446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT1 DAC", NULL, WCD9335_ANA_HPH,
453935446148SSrinivas Kandagatla 		5, 0, wcd9335_codec_hphl_dac_event,
454035446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
454135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
454235446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT2 DAC", NULL, WCD9335_ANA_HPH,
454335446148SSrinivas Kandagatla 		4, 0, wcd9335_codec_hphr_dac_event,
454435446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
454535446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
454635446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT3 DAC", NULL, SND_SOC_NOPM,
454735446148SSrinivas Kandagatla 		0, 0, wcd9335_codec_lineout_dac_event,
454835446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
454935446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT4 DAC", NULL, SND_SOC_NOPM,
455035446148SSrinivas Kandagatla 		0, 0, wcd9335_codec_lineout_dac_event,
455135446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
455235446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT5 DAC", NULL, SND_SOC_NOPM,
455335446148SSrinivas Kandagatla 		0, 0, wcd9335_codec_lineout_dac_event,
455435446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
455535446148SSrinivas Kandagatla 	SND_SOC_DAPM_DAC_E("RX INT6 DAC", NULL, SND_SOC_NOPM,
455635446148SSrinivas Kandagatla 		0, 0, wcd9335_codec_lineout_dac_event,
455735446148SSrinivas Kandagatla 		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
455835446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("HPHL PA", WCD9335_ANA_HPH, 7, 0, NULL, 0,
455935446148SSrinivas Kandagatla 			   wcd9335_codec_enable_hphl_pa,
456035446148SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
456135446148SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
456235446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("HPHR PA", WCD9335_ANA_HPH, 6, 0, NULL, 0,
456335446148SSrinivas Kandagatla 			   wcd9335_codec_enable_hphr_pa,
456435446148SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
456535446148SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
456635446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("EAR PA", WCD9335_ANA_EAR, 7, 0, NULL, 0,
456735446148SSrinivas Kandagatla 			   wcd9335_codec_enable_ear_pa,
456835446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMU |
456935446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMD),
457035446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("LINEOUT1 PA", WCD9335_ANA_LO_1_2, 7, 0, NULL, 0,
457135446148SSrinivas Kandagatla 			   wcd9335_codec_enable_lineout_pa,
457235446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMU |
457335446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMD),
457435446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("LINEOUT2 PA", WCD9335_ANA_LO_1_2, 6, 0, NULL, 0,
457535446148SSrinivas Kandagatla 			   wcd9335_codec_enable_lineout_pa,
457635446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMU |
457735446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMD),
457835446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("LINEOUT3 PA", WCD9335_ANA_LO_3_4, 7, 0, NULL, 0,
457935446148SSrinivas Kandagatla 			   wcd9335_codec_enable_lineout_pa,
458035446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMU |
458135446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMD),
458235446148SSrinivas Kandagatla 	SND_SOC_DAPM_PGA_E("LINEOUT4 PA", WCD9335_ANA_LO_3_4, 6, 0, NULL, 0,
458335446148SSrinivas Kandagatla 			   wcd9335_codec_enable_lineout_pa,
458435446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMU |
458535446148SSrinivas Kandagatla 			   SND_SOC_DAPM_POST_PMD),
458635446148SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("RX_BIAS", SND_SOC_NOPM, 0, 0,
458735446148SSrinivas Kandagatla 		wcd9335_codec_enable_rx_bias, SND_SOC_DAPM_PRE_PMU |
458835446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
458935446148SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("MCLK",  SND_SOC_NOPM, 0, 0,
459035446148SSrinivas Kandagatla 		wcd9335_codec_enable_mclk, SND_SOC_DAPM_PRE_PMU |
459135446148SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
459235446148SSrinivas Kandagatla 
45936ccc25f6SSrinivas Kandagatla 	/* TX */
45946ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("AMIC1"),
45956ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("AMIC2"),
45966ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("AMIC3"),
45976ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("AMIC4"),
45986ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("AMIC5"),
45996ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_INPUT("AMIC6"),
46006ccc25f6SSrinivas Kandagatla 
46016ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM,
46026ccc25f6SSrinivas Kandagatla 		AIF1_CAP, 0, wcd9335_codec_enable_slim,
46036ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
46046ccc25f6SSrinivas Kandagatla 
46056ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM,
46066ccc25f6SSrinivas Kandagatla 		AIF2_CAP, 0, wcd9335_codec_enable_slim,
46076ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
46086ccc25f6SSrinivas Kandagatla 
46096ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM,
46106ccc25f6SSrinivas Kandagatla 		AIF3_CAP, 0, wcd9335_codec_enable_slim,
46116ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
46126ccc25f6SSrinivas Kandagatla 
46136ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, 0, 0,
46146ccc25f6SSrinivas Kandagatla 			       wcd9335_codec_enable_micbias,
46156ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
46166ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_POST_PMD),
46176ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, 0, 0,
46186ccc25f6SSrinivas Kandagatla 			       wcd9335_codec_enable_micbias,
46196ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
46206ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_POST_PMD),
46216ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, 0, 0,
46226ccc25f6SSrinivas Kandagatla 			       wcd9335_codec_enable_micbias,
46236ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
46246ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_POST_PMD),
46256ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_SUPPLY("MIC BIAS4", SND_SOC_NOPM, 0, 0,
46266ccc25f6SSrinivas Kandagatla 			       wcd9335_codec_enable_micbias,
46276ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
46286ccc25f6SSrinivas Kandagatla 			       SND_SOC_DAPM_POST_PMD),
46296ccc25f6SSrinivas Kandagatla 
46306ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD9335_ANA_AMIC1, 7, 0,
46316ccc25f6SSrinivas Kandagatla 			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
46326ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD9335_ANA_AMIC2, 7, 0,
46336ccc25f6SSrinivas Kandagatla 			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
46346ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD9335_ANA_AMIC3, 7, 0,
46356ccc25f6SSrinivas Kandagatla 			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
46366ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD9335_ANA_AMIC4, 7, 0,
46376ccc25f6SSrinivas Kandagatla 			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
46386ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("ADC5", NULL, WCD9335_ANA_AMIC5, 7, 0,
46396ccc25f6SSrinivas Kandagatla 			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
46406ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("ADC6", NULL, WCD9335_ANA_AMIC6, 7, 0,
46416ccc25f6SSrinivas Kandagatla 			   wcd9335_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
46426ccc25f6SSrinivas Kandagatla 
46436ccc25f6SSrinivas Kandagatla 	/* Digital Mic Inputs */
46446ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0,
46456ccc25f6SSrinivas Kandagatla 		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
46466ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
46476ccc25f6SSrinivas Kandagatla 
46486ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
46496ccc25f6SSrinivas Kandagatla 		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
46506ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
46516ccc25f6SSrinivas Kandagatla 
46526ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0,
46536ccc25f6SSrinivas Kandagatla 		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
46546ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
46556ccc25f6SSrinivas Kandagatla 
46566ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0,
46576ccc25f6SSrinivas Kandagatla 		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
46586ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
46596ccc25f6SSrinivas Kandagatla 
46606ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0,
46616ccc25f6SSrinivas Kandagatla 		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
46626ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
46636ccc25f6SSrinivas Kandagatla 
46646ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0,
46656ccc25f6SSrinivas Kandagatla 		wcd9335_codec_enable_dmic, SND_SOC_DAPM_PRE_PMU |
46666ccc25f6SSrinivas Kandagatla 		SND_SOC_DAPM_POST_PMD),
46676ccc25f6SSrinivas Kandagatla 
46686ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX0", SND_SOC_NOPM, 0, 0,
46696ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux0),
46706ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX1", SND_SOC_NOPM, 0, 0,
46716ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux1),
46726ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX2", SND_SOC_NOPM, 0, 0,
46736ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux2),
46746ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX3", SND_SOC_NOPM, 0, 0,
46756ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux3),
46766ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX4", SND_SOC_NOPM, 0, 0,
46776ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux4),
46786ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX5", SND_SOC_NOPM, 0, 0,
46796ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux5),
46806ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX6", SND_SOC_NOPM, 0, 0,
46816ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux6),
46826ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX7", SND_SOC_NOPM, 0, 0,
46836ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux7),
46846ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("DMIC MUX8", SND_SOC_NOPM, 0, 0,
46856ccc25f6SSrinivas Kandagatla 		&tx_dmic_mux8),
46866ccc25f6SSrinivas Kandagatla 
46876ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX0", SND_SOC_NOPM, 0, 0,
46886ccc25f6SSrinivas Kandagatla 		&tx_amic_mux0),
46896ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX1", SND_SOC_NOPM, 0, 0,
46906ccc25f6SSrinivas Kandagatla 		&tx_amic_mux1),
46916ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX2", SND_SOC_NOPM, 0, 0,
46926ccc25f6SSrinivas Kandagatla 		&tx_amic_mux2),
46936ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX3", SND_SOC_NOPM, 0, 0,
46946ccc25f6SSrinivas Kandagatla 		&tx_amic_mux3),
46956ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX4", SND_SOC_NOPM, 0, 0,
46966ccc25f6SSrinivas Kandagatla 		&tx_amic_mux4),
46976ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX5", SND_SOC_NOPM, 0, 0,
46986ccc25f6SSrinivas Kandagatla 		&tx_amic_mux5),
46996ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX6", SND_SOC_NOPM, 0, 0,
47006ccc25f6SSrinivas Kandagatla 		&tx_amic_mux6),
47016ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX7", SND_SOC_NOPM, 0, 0,
47026ccc25f6SSrinivas Kandagatla 		&tx_amic_mux7),
47036ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("AMIC MUX8", SND_SOC_NOPM, 0, 0,
47046ccc25f6SSrinivas Kandagatla 		&tx_amic_mux8),
47056ccc25f6SSrinivas Kandagatla 
47066ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0,
47076ccc25f6SSrinivas Kandagatla 		aif1_cap_mixer, ARRAY_SIZE(aif1_cap_mixer)),
47086ccc25f6SSrinivas Kandagatla 
47096ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0,
47106ccc25f6SSrinivas Kandagatla 		aif2_cap_mixer, ARRAY_SIZE(aif2_cap_mixer)),
47116ccc25f6SSrinivas Kandagatla 
47126ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0,
47136ccc25f6SSrinivas Kandagatla 		aif3_cap_mixer, ARRAY_SIZE(aif3_cap_mixer)),
47146ccc25f6SSrinivas Kandagatla 
47156ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX0 MUX", SND_SOC_NOPM, WCD9335_TX0, 0,
47166ccc25f6SSrinivas Kandagatla 		&sb_tx0_mux),
47176ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX1 MUX", SND_SOC_NOPM, WCD9335_TX1, 0,
47186ccc25f6SSrinivas Kandagatla 		&sb_tx1_mux),
47196ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX2 MUX", SND_SOC_NOPM, WCD9335_TX2, 0,
47206ccc25f6SSrinivas Kandagatla 		&sb_tx2_mux),
47216ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX3 MUX", SND_SOC_NOPM, WCD9335_TX3, 0,
47226ccc25f6SSrinivas Kandagatla 		&sb_tx3_mux),
47236ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX4 MUX", SND_SOC_NOPM, WCD9335_TX4, 0,
47246ccc25f6SSrinivas Kandagatla 		&sb_tx4_mux),
47256ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX5 MUX", SND_SOC_NOPM, WCD9335_TX5, 0,
47266ccc25f6SSrinivas Kandagatla 		&sb_tx5_mux),
47276ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX6 MUX", SND_SOC_NOPM, WCD9335_TX6, 0,
47286ccc25f6SSrinivas Kandagatla 		&sb_tx6_mux),
47296ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX7 MUX", SND_SOC_NOPM, WCD9335_TX7, 0,
47306ccc25f6SSrinivas Kandagatla 		&sb_tx7_mux),
47316ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX("SLIM TX8 MUX", SND_SOC_NOPM, WCD9335_TX8, 0,
47326ccc25f6SSrinivas Kandagatla 		&sb_tx8_mux),
47336ccc25f6SSrinivas Kandagatla 
47346ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX0", WCD9335_CDC_TX0_TX_PATH_CTL, 5, 0,
47356ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux0, wcd9335_codec_enable_dec,
47366ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47376ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47386ccc25f6SSrinivas Kandagatla 
47396ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX1", WCD9335_CDC_TX1_TX_PATH_CTL, 5, 0,
47406ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux1, wcd9335_codec_enable_dec,
47416ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47426ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47436ccc25f6SSrinivas Kandagatla 
47446ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX2", WCD9335_CDC_TX2_TX_PATH_CTL, 5, 0,
47456ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux2, wcd9335_codec_enable_dec,
47466ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47476ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47486ccc25f6SSrinivas Kandagatla 
47496ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX3", WCD9335_CDC_TX3_TX_PATH_CTL, 5, 0,
47506ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux3, wcd9335_codec_enable_dec,
47516ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47526ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47536ccc25f6SSrinivas Kandagatla 
47546ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX4", WCD9335_CDC_TX4_TX_PATH_CTL, 5, 0,
47556ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux4, wcd9335_codec_enable_dec,
47566ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47576ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47586ccc25f6SSrinivas Kandagatla 
47596ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX5", WCD9335_CDC_TX5_TX_PATH_CTL, 5, 0,
47606ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux5, wcd9335_codec_enable_dec,
47616ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47626ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47636ccc25f6SSrinivas Kandagatla 
47646ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX6", WCD9335_CDC_TX6_TX_PATH_CTL, 5, 0,
47656ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux6, wcd9335_codec_enable_dec,
47666ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47676ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47686ccc25f6SSrinivas Kandagatla 
47696ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX7", WCD9335_CDC_TX7_TX_PATH_CTL, 5, 0,
47706ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux7, wcd9335_codec_enable_dec,
47716ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47726ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
47736ccc25f6SSrinivas Kandagatla 
47746ccc25f6SSrinivas Kandagatla 	SND_SOC_DAPM_MUX_E("ADC MUX8", WCD9335_CDC_TX8_TX_PATH_CTL, 5, 0,
47756ccc25f6SSrinivas Kandagatla 			   &tx_adc_mux8, wcd9335_codec_enable_dec,
47766ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
47776ccc25f6SSrinivas Kandagatla 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
477835446148SSrinivas Kandagatla };
477935446148SSrinivas Kandagatla 
wcd9335_enable_sido_buck(struct snd_soc_component * component)478020aedafdSSrinivas Kandagatla static void wcd9335_enable_sido_buck(struct snd_soc_component *component)
478120aedafdSSrinivas Kandagatla {
478220aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
478320aedafdSSrinivas Kandagatla 
478420aedafdSSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_ANA_RCO,
478520aedafdSSrinivas Kandagatla 					WCD9335_ANA_RCO_BG_EN_MASK,
478620aedafdSSrinivas Kandagatla 					WCD9335_ANA_RCO_BG_ENABLE);
478720aedafdSSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_ANA_BUCK_CTL,
478820aedafdSSrinivas Kandagatla 					WCD9335_ANA_BUCK_CTL_VOUT_D_IREF_MASK,
478920aedafdSSrinivas Kandagatla 					WCD9335_ANA_BUCK_CTL_VOUT_D_IREF_EXT);
479020aedafdSSrinivas Kandagatla 	/* 100us sleep needed after IREF settings */
479120aedafdSSrinivas Kandagatla 	usleep_range(100, 110);
479220aedafdSSrinivas Kandagatla 	snd_soc_component_update_bits(component, WCD9335_ANA_BUCK_CTL,
479320aedafdSSrinivas Kandagatla 					WCD9335_ANA_BUCK_CTL_VOUT_D_VREF_MASK,
479420aedafdSSrinivas Kandagatla 					WCD9335_ANA_BUCK_CTL_VOUT_D_VREF_EXT);
479520aedafdSSrinivas Kandagatla 	/* 100us sleep needed after VREF settings */
479620aedafdSSrinivas Kandagatla 	usleep_range(100, 110);
479720aedafdSSrinivas Kandagatla 	wcd->sido_input_src = SIDO_SOURCE_RCO_BG;
479820aedafdSSrinivas Kandagatla }
479920aedafdSSrinivas Kandagatla 
wcd9335_enable_efuse_sensing(struct snd_soc_component * comp)480020aedafdSSrinivas Kandagatla static int wcd9335_enable_efuse_sensing(struct snd_soc_component *comp)
480120aedafdSSrinivas Kandagatla {
480220aedafdSSrinivas Kandagatla 	_wcd9335_codec_enable_mclk(comp, true);
480320aedafdSSrinivas Kandagatla 	snd_soc_component_update_bits(comp,
480420aedafdSSrinivas Kandagatla 				WCD9335_CHIP_TIER_CTRL_EFUSE_CTL,
480520aedafdSSrinivas Kandagatla 				WCD9335_CHIP_TIER_CTRL_EFUSE_EN_MASK,
480620aedafdSSrinivas Kandagatla 				WCD9335_CHIP_TIER_CTRL_EFUSE_ENABLE);
480720aedafdSSrinivas Kandagatla 	/*
480820aedafdSSrinivas Kandagatla 	 * 5ms sleep required after enabling efuse control
480920aedafdSSrinivas Kandagatla 	 * before checking the status.
481020aedafdSSrinivas Kandagatla 	 */
481120aedafdSSrinivas Kandagatla 	usleep_range(5000, 5500);
481220aedafdSSrinivas Kandagatla 
4813eaf2767cSKuninori Morimoto 	if (!(snd_soc_component_read(comp,
481420aedafdSSrinivas Kandagatla 					WCD9335_CHIP_TIER_CTRL_EFUSE_STATUS) &
481520aedafdSSrinivas Kandagatla 					WCD9335_CHIP_TIER_CTRL_EFUSE_EN_MASK))
481620aedafdSSrinivas Kandagatla 		WARN(1, "%s: Efuse sense is not complete\n", __func__);
481720aedafdSSrinivas Kandagatla 
481820aedafdSSrinivas Kandagatla 	wcd9335_enable_sido_buck(comp);
481920aedafdSSrinivas Kandagatla 	_wcd9335_codec_enable_mclk(comp, false);
482020aedafdSSrinivas Kandagatla 
482120aedafdSSrinivas Kandagatla 	return 0;
482220aedafdSSrinivas Kandagatla }
482320aedafdSSrinivas Kandagatla 
wcd9335_codec_init(struct snd_soc_component * component)482420aedafdSSrinivas Kandagatla static void wcd9335_codec_init(struct snd_soc_component *component)
482520aedafdSSrinivas Kandagatla {
482620aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
482720aedafdSSrinivas Kandagatla 	int i;
482820aedafdSSrinivas Kandagatla 
482920aedafdSSrinivas Kandagatla 	/* ungate MCLK and set clk rate */
483020aedafdSSrinivas Kandagatla 	regmap_update_bits(wcd->regmap, WCD9335_CODEC_RPM_CLK_GATE,
483120aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_GATE_MCLK_GATE_MASK, 0);
483220aedafdSSrinivas Kandagatla 
483320aedafdSSrinivas Kandagatla 	regmap_update_bits(wcd->regmap, WCD9335_CODEC_RPM_CLK_MCLK_CFG,
483420aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
483520aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG_9P6MHZ);
483620aedafdSSrinivas Kandagatla 
483720aedafdSSrinivas Kandagatla 	for (i = 0; i < ARRAY_SIZE(wcd9335_codec_reg_init); i++)
483820aedafdSSrinivas Kandagatla 		snd_soc_component_update_bits(component,
483920aedafdSSrinivas Kandagatla 					wcd9335_codec_reg_init[i].reg,
484020aedafdSSrinivas Kandagatla 					wcd9335_codec_reg_init[i].mask,
484120aedafdSSrinivas Kandagatla 					wcd9335_codec_reg_init[i].val);
484220aedafdSSrinivas Kandagatla 
484320aedafdSSrinivas Kandagatla 	wcd9335_enable_efuse_sensing(component);
484420aedafdSSrinivas Kandagatla }
484520aedafdSSrinivas Kandagatla 
wcd9335_codec_probe(struct snd_soc_component * component)484620aedafdSSrinivas Kandagatla static int wcd9335_codec_probe(struct snd_soc_component *component)
484720aedafdSSrinivas Kandagatla {
484820aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
4849fc6fc81cSChristophe JAILLET 	int ret;
485020aedafdSSrinivas Kandagatla 	int i;
485120aedafdSSrinivas Kandagatla 
485220aedafdSSrinivas Kandagatla 	snd_soc_component_init_regmap(component, wcd->regmap);
4853cc2e324dSSrinivas Kandagatla 	/* Class-H Init*/
4854a270bd9aSYassine Oudjana 	wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, WCD9335);
4855cc2e324dSSrinivas Kandagatla 	if (IS_ERR(wcd->clsh_ctrl))
4856cc2e324dSSrinivas Kandagatla 		return PTR_ERR(wcd->clsh_ctrl);
4857cc2e324dSSrinivas Kandagatla 
4858cc2e324dSSrinivas Kandagatla 	/* Default HPH Mode to Class-H HiFi */
4859cc2e324dSSrinivas Kandagatla 	wcd->hph_mode = CLS_H_HIFI;
486020aedafdSSrinivas Kandagatla 	wcd->component = component;
486120aedafdSSrinivas Kandagatla 
486220aedafdSSrinivas Kandagatla 	wcd9335_codec_init(component);
486320aedafdSSrinivas Kandagatla 
486420aedafdSSrinivas Kandagatla 	for (i = 0; i < NUM_CODEC_DAIS; i++)
486520aedafdSSrinivas Kandagatla 		INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
486620aedafdSSrinivas Kandagatla 
4867fc6fc81cSChristophe JAILLET 	ret = wcd9335_setup_irqs(wcd);
4868fc6fc81cSChristophe JAILLET 	if (ret)
4869fc6fc81cSChristophe JAILLET 		goto free_clsh_ctrl;
4870fc6fc81cSChristophe JAILLET 
4871fc6fc81cSChristophe JAILLET 	return 0;
4872fc6fc81cSChristophe JAILLET 
4873fc6fc81cSChristophe JAILLET free_clsh_ctrl:
4874fc6fc81cSChristophe JAILLET 	wcd_clsh_ctrl_free(wcd->clsh_ctrl);
4875fc6fc81cSChristophe JAILLET 	return ret;
487620aedafdSSrinivas Kandagatla }
487720aedafdSSrinivas Kandagatla 
wcd9335_codec_remove(struct snd_soc_component * comp)487820aedafdSSrinivas Kandagatla static void wcd9335_codec_remove(struct snd_soc_component *comp)
487920aedafdSSrinivas Kandagatla {
488020aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
488120aedafdSSrinivas Kandagatla 
4882cc2e324dSSrinivas Kandagatla 	wcd_clsh_ctrl_free(wcd->clsh_ctrl);
4883d3efd26aSChristophe JAILLET 	wcd9335_teardown_irqs(wcd);
488420aedafdSSrinivas Kandagatla }
488520aedafdSSrinivas Kandagatla 
wcd9335_codec_set_sysclk(struct snd_soc_component * comp,int clk_id,int source,unsigned int freq,int dir)488620aedafdSSrinivas Kandagatla static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
488720aedafdSSrinivas Kandagatla 				    int clk_id, int source,
488820aedafdSSrinivas Kandagatla 				    unsigned int freq, int dir)
488920aedafdSSrinivas Kandagatla {
489020aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
489120aedafdSSrinivas Kandagatla 
489220aedafdSSrinivas Kandagatla 	wcd->mclk_rate = freq;
489320aedafdSSrinivas Kandagatla 
489420aedafdSSrinivas Kandagatla 	if (wcd->mclk_rate == WCD9335_MCLK_CLK_12P288MHZ)
489520aedafdSSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
489620aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG,
489720aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
489820aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG_12P288MHZ);
489920aedafdSSrinivas Kandagatla 	else if (wcd->mclk_rate == WCD9335_MCLK_CLK_9P6MHZ)
490020aedafdSSrinivas Kandagatla 		snd_soc_component_update_bits(comp,
490120aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG,
490220aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
490320aedafdSSrinivas Kandagatla 				WCD9335_CODEC_RPM_CLK_MCLK_CFG_9P6MHZ);
490420aedafdSSrinivas Kandagatla 
490520aedafdSSrinivas Kandagatla 	return clk_set_rate(wcd->mclk, freq);
490620aedafdSSrinivas Kandagatla }
490720aedafdSSrinivas Kandagatla 
490820aedafdSSrinivas Kandagatla static const struct snd_soc_component_driver wcd9335_component_drv = {
490920aedafdSSrinivas Kandagatla 	.probe = wcd9335_codec_probe,
491020aedafdSSrinivas Kandagatla 	.remove = wcd9335_codec_remove,
491120aedafdSSrinivas Kandagatla 	.set_sysclk = wcd9335_codec_set_sysclk,
49128c4f021dSSrinivas Kandagatla 	.controls = wcd9335_snd_controls,
49138c4f021dSSrinivas Kandagatla 	.num_controls = ARRAY_SIZE(wcd9335_snd_controls),
491435446148SSrinivas Kandagatla 	.dapm_widgets = wcd9335_dapm_widgets,
491535446148SSrinivas Kandagatla 	.num_dapm_widgets = ARRAY_SIZE(wcd9335_dapm_widgets),
491693f97ff1SSrinivas Kandagatla 	.dapm_routes = wcd9335_audio_map,
491793f97ff1SSrinivas Kandagatla 	.num_dapm_routes = ARRAY_SIZE(wcd9335_audio_map),
4918e230b1b1SCharles Keepax 	.endianness = 1,
491920aedafdSSrinivas Kandagatla };
492020aedafdSSrinivas Kandagatla 
wcd9335_probe(struct wcd9335_codec * wcd)492120aedafdSSrinivas Kandagatla static int wcd9335_probe(struct wcd9335_codec *wcd)
492220aedafdSSrinivas Kandagatla {
492320aedafdSSrinivas Kandagatla 	struct device *dev = wcd->dev;
492420aedafdSSrinivas Kandagatla 
492520aedafdSSrinivas Kandagatla 	memcpy(wcd->rx_chs, wcd9335_rx_chs, sizeof(wcd9335_rx_chs));
49266ccc25f6SSrinivas Kandagatla 	memcpy(wcd->tx_chs, wcd9335_tx_chs, sizeof(wcd9335_tx_chs));
492720aedafdSSrinivas Kandagatla 
492820aedafdSSrinivas Kandagatla 	wcd->sido_input_src = SIDO_SOURCE_INTERNAL;
492920aedafdSSrinivas Kandagatla 	wcd->sido_voltage = SIDO_VOLTAGE_NOMINAL_MV;
493020aedafdSSrinivas Kandagatla 
493120aedafdSSrinivas Kandagatla 	return devm_snd_soc_register_component(dev, &wcd9335_component_drv,
493220aedafdSSrinivas Kandagatla 					       wcd9335_slim_dais,
493320aedafdSSrinivas Kandagatla 					       ARRAY_SIZE(wcd9335_slim_dais));
493420aedafdSSrinivas Kandagatla }
493520aedafdSSrinivas Kandagatla 
493620aedafdSSrinivas Kandagatla static const struct regmap_range_cfg wcd9335_ranges[] = {
493720aedafdSSrinivas Kandagatla 	{
493820aedafdSSrinivas Kandagatla 		.name = "WCD9335",
493920aedafdSSrinivas Kandagatla 		.range_min =  0x0,
494020aedafdSSrinivas Kandagatla 		.range_max =  WCD9335_MAX_REGISTER,
4941d902e785SSrinivas Kandagatla 		.selector_reg = WCD9335_SEL_REGISTER,
494220aedafdSSrinivas Kandagatla 		.selector_mask = 0xff,
494320aedafdSSrinivas Kandagatla 		.selector_shift = 0,
4944d902e785SSrinivas Kandagatla 		.window_start = 0x800,
4945d902e785SSrinivas Kandagatla 		.window_len = 0x100,
494620aedafdSSrinivas Kandagatla 	},
494720aedafdSSrinivas Kandagatla };
494820aedafdSSrinivas Kandagatla 
wcd9335_is_volatile_register(struct device * dev,unsigned int reg)494920aedafdSSrinivas Kandagatla static bool wcd9335_is_volatile_register(struct device *dev, unsigned int reg)
495020aedafdSSrinivas Kandagatla {
495120aedafdSSrinivas Kandagatla 	switch (reg) {
495220aedafdSSrinivas Kandagatla 	case WCD9335_INTR_PIN1_STATUS0...WCD9335_INTR_PIN2_CLEAR3:
495320aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MBHC_RESULT_3:
495420aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MBHC_RESULT_2:
495520aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MBHC_RESULT_1:
495620aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MBHC_MECH:
495720aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MBHC_ELECT:
495820aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MBHC_ZDET:
495920aedafdSSrinivas Kandagatla 	case WCD9335_ANA_MICB2:
496020aedafdSSrinivas Kandagatla 	case WCD9335_ANA_RCO:
496120aedafdSSrinivas Kandagatla 	case WCD9335_ANA_BIAS:
496220aedafdSSrinivas Kandagatla 		return true;
496320aedafdSSrinivas Kandagatla 	default:
496420aedafdSSrinivas Kandagatla 		return false;
496520aedafdSSrinivas Kandagatla 	}
496620aedafdSSrinivas Kandagatla }
496720aedafdSSrinivas Kandagatla 
496820aedafdSSrinivas Kandagatla static struct regmap_config wcd9335_regmap_config = {
496920aedafdSSrinivas Kandagatla 	.reg_bits = 16,
497020aedafdSSrinivas Kandagatla 	.val_bits = 8,
4971*272aedb2SMark Brown 	.cache_type = REGCACHE_MAPLE,
497220aedafdSSrinivas Kandagatla 	.max_register = WCD9335_MAX_REGISTER,
497320aedafdSSrinivas Kandagatla 	.can_multi_write = true,
497420aedafdSSrinivas Kandagatla 	.ranges = wcd9335_ranges,
497520aedafdSSrinivas Kandagatla 	.num_ranges = ARRAY_SIZE(wcd9335_ranges),
497620aedafdSSrinivas Kandagatla 	.volatile_reg = wcd9335_is_volatile_register,
497720aedafdSSrinivas Kandagatla };
497820aedafdSSrinivas Kandagatla 
497920aedafdSSrinivas Kandagatla static const struct regmap_range_cfg wcd9335_ifc_ranges[] = {
498020aedafdSSrinivas Kandagatla 	{
498120aedafdSSrinivas Kandagatla 		.name = "WCD9335-IFC-DEV",
498220aedafdSSrinivas Kandagatla 		.range_min =  0x0,
4983d902e785SSrinivas Kandagatla 		.range_max = WCD9335_MAX_REGISTER,
4984d902e785SSrinivas Kandagatla 		.selector_reg = WCD9335_SEL_REGISTER,
4985d902e785SSrinivas Kandagatla 		.selector_mask = 0xfff,
498620aedafdSSrinivas Kandagatla 		.selector_shift = 0,
4987d902e785SSrinivas Kandagatla 		.window_start = 0x800,
4988d902e785SSrinivas Kandagatla 		.window_len = 0x400,
498920aedafdSSrinivas Kandagatla 	},
499020aedafdSSrinivas Kandagatla };
499120aedafdSSrinivas Kandagatla 
499220aedafdSSrinivas Kandagatla static struct regmap_config wcd9335_ifc_regmap_config = {
499320aedafdSSrinivas Kandagatla 	.reg_bits = 16,
499420aedafdSSrinivas Kandagatla 	.val_bits = 8,
499520aedafdSSrinivas Kandagatla 	.can_multi_write = true,
4996d902e785SSrinivas Kandagatla 	.max_register = WCD9335_MAX_REGISTER,
499720aedafdSSrinivas Kandagatla 	.ranges = wcd9335_ifc_ranges,
499820aedafdSSrinivas Kandagatla 	.num_ranges = ARRAY_SIZE(wcd9335_ifc_ranges),
499920aedafdSSrinivas Kandagatla };
500020aedafdSSrinivas Kandagatla 
500120aedafdSSrinivas Kandagatla static const struct regmap_irq wcd9335_codec_irqs[] = {
500220aedafdSSrinivas Kandagatla 	/* INTR_REG 0 */
500320aedafdSSrinivas Kandagatla 	[WCD9335_IRQ_SLIMBUS] = {
500420aedafdSSrinivas Kandagatla 		.reg_offset = 0,
500520aedafdSSrinivas Kandagatla 		.mask = BIT(0),
500620aedafdSSrinivas Kandagatla 		.type = {
500720aedafdSSrinivas Kandagatla 			.type_reg_offset = 0,
500820aedafdSSrinivas Kandagatla 			.types_supported = IRQ_TYPE_EDGE_BOTH,
500920aedafdSSrinivas Kandagatla 			.type_reg_mask	= BIT(0),
501020aedafdSSrinivas Kandagatla 		},
501120aedafdSSrinivas Kandagatla 	},
501220aedafdSSrinivas Kandagatla };
501320aedafdSSrinivas Kandagatla 
5014255a03bbSAidan MacDonald static const unsigned int wcd9335_config_regs[] = {
5015255a03bbSAidan MacDonald 	WCD9335_INTR_LEVEL0,
5016255a03bbSAidan MacDonald };
5017255a03bbSAidan MacDonald 
501820aedafdSSrinivas Kandagatla static const struct regmap_irq_chip wcd9335_regmap_irq1_chip = {
501920aedafdSSrinivas Kandagatla 	.name = "wcd9335_pin1_irq",
502020aedafdSSrinivas Kandagatla 	.status_base = WCD9335_INTR_PIN1_STATUS0,
502120aedafdSSrinivas Kandagatla 	.mask_base = WCD9335_INTR_PIN1_MASK0,
502220aedafdSSrinivas Kandagatla 	.ack_base = WCD9335_INTR_PIN1_CLEAR0,
502320aedafdSSrinivas Kandagatla 	.num_regs = 4,
502420aedafdSSrinivas Kandagatla 	.irqs = wcd9335_codec_irqs,
502520aedafdSSrinivas Kandagatla 	.num_irqs = ARRAY_SIZE(wcd9335_codec_irqs),
5026255a03bbSAidan MacDonald 	.config_base = wcd9335_config_regs,
5027255a03bbSAidan MacDonald 	.num_config_bases = ARRAY_SIZE(wcd9335_config_regs),
5028255a03bbSAidan MacDonald 	.num_config_regs = 4,
5029255a03bbSAidan MacDonald 	.set_type_config = regmap_irq_set_type_config_simple,
503020aedafdSSrinivas Kandagatla };
503120aedafdSSrinivas Kandagatla 
wcd9335_parse_dt(struct wcd9335_codec * wcd)503220aedafdSSrinivas Kandagatla static int wcd9335_parse_dt(struct wcd9335_codec *wcd)
503320aedafdSSrinivas Kandagatla {
503420aedafdSSrinivas Kandagatla 	struct device *dev = wcd->dev;
503520aedafdSSrinivas Kandagatla 	struct device_node *np = dev->of_node;
503620aedafdSSrinivas Kandagatla 	int ret;
503720aedafdSSrinivas Kandagatla 
503820aedafdSSrinivas Kandagatla 	wcd->reset_gpio = of_get_named_gpio(np,	"reset-gpios", 0);
503920aedafdSSrinivas Kandagatla 	if (wcd->reset_gpio < 0) {
504020aedafdSSrinivas Kandagatla 		dev_err(dev, "Reset GPIO missing from DT\n");
504120aedafdSSrinivas Kandagatla 		return wcd->reset_gpio;
504220aedafdSSrinivas Kandagatla 	}
504320aedafdSSrinivas Kandagatla 
504420aedafdSSrinivas Kandagatla 	wcd->mclk = devm_clk_get(dev, "mclk");
504520aedafdSSrinivas Kandagatla 	if (IS_ERR(wcd->mclk)) {
504620aedafdSSrinivas Kandagatla 		dev_err(dev, "mclk not found\n");
504720aedafdSSrinivas Kandagatla 		return PTR_ERR(wcd->mclk);
504820aedafdSSrinivas Kandagatla 	}
504920aedafdSSrinivas Kandagatla 
505020aedafdSSrinivas Kandagatla 	wcd->native_clk = devm_clk_get(dev, "slimbus");
505120aedafdSSrinivas Kandagatla 	if (IS_ERR(wcd->native_clk)) {
505220aedafdSSrinivas Kandagatla 		dev_err(dev, "slimbus clock not found\n");
505320aedafdSSrinivas Kandagatla 		return PTR_ERR(wcd->native_clk);
505420aedafdSSrinivas Kandagatla 	}
505520aedafdSSrinivas Kandagatla 
505620aedafdSSrinivas Kandagatla 	wcd->supplies[0].supply = "vdd-buck";
505720aedafdSSrinivas Kandagatla 	wcd->supplies[1].supply = "vdd-buck-sido";
505820aedafdSSrinivas Kandagatla 	wcd->supplies[2].supply = "vdd-tx";
505920aedafdSSrinivas Kandagatla 	wcd->supplies[3].supply = "vdd-rx";
506020aedafdSSrinivas Kandagatla 	wcd->supplies[4].supply = "vdd-io";
506120aedafdSSrinivas Kandagatla 
506220aedafdSSrinivas Kandagatla 	ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies);
506320aedafdSSrinivas Kandagatla 	if (ret) {
506420aedafdSSrinivas Kandagatla 		dev_err(dev, "Failed to get supplies: err = %d\n", ret);
506520aedafdSSrinivas Kandagatla 		return ret;
506620aedafdSSrinivas Kandagatla 	}
506720aedafdSSrinivas Kandagatla 
506820aedafdSSrinivas Kandagatla 	return 0;
506920aedafdSSrinivas Kandagatla }
507020aedafdSSrinivas Kandagatla 
wcd9335_power_on_reset(struct wcd9335_codec * wcd)507120aedafdSSrinivas Kandagatla static int wcd9335_power_on_reset(struct wcd9335_codec *wcd)
507220aedafdSSrinivas Kandagatla {
507320aedafdSSrinivas Kandagatla 	struct device *dev = wcd->dev;
507420aedafdSSrinivas Kandagatla 	int ret;
507520aedafdSSrinivas Kandagatla 
507620aedafdSSrinivas Kandagatla 	ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies);
507720aedafdSSrinivas Kandagatla 	if (ret) {
507820aedafdSSrinivas Kandagatla 		dev_err(dev, "Failed to get supplies: err = %d\n", ret);
507920aedafdSSrinivas Kandagatla 		return ret;
508020aedafdSSrinivas Kandagatla 	}
508120aedafdSSrinivas Kandagatla 
508220aedafdSSrinivas Kandagatla 	/*
508320aedafdSSrinivas Kandagatla 	 * For WCD9335, it takes about 600us for the Vout_A and
508420aedafdSSrinivas Kandagatla 	 * Vout_D to be ready after BUCK_SIDO is powered up.
508520aedafdSSrinivas Kandagatla 	 * SYS_RST_N shouldn't be pulled high during this time
508620aedafdSSrinivas Kandagatla 	 * Toggle the reset line to make sure the reset pulse is
508720aedafdSSrinivas Kandagatla 	 * correctly applied
508820aedafdSSrinivas Kandagatla 	 */
508920aedafdSSrinivas Kandagatla 	usleep_range(600, 650);
509020aedafdSSrinivas Kandagatla 
509120aedafdSSrinivas Kandagatla 	gpio_direction_output(wcd->reset_gpio, 0);
509220aedafdSSrinivas Kandagatla 	msleep(20);
509320aedafdSSrinivas Kandagatla 	gpio_set_value(wcd->reset_gpio, 1);
509420aedafdSSrinivas Kandagatla 	msleep(20);
509520aedafdSSrinivas Kandagatla 
509620aedafdSSrinivas Kandagatla 	return 0;
509720aedafdSSrinivas Kandagatla }
509820aedafdSSrinivas Kandagatla 
wcd9335_bring_up(struct wcd9335_codec * wcd)509920aedafdSSrinivas Kandagatla static int wcd9335_bring_up(struct wcd9335_codec *wcd)
510020aedafdSSrinivas Kandagatla {
510120aedafdSSrinivas Kandagatla 	struct regmap *rm = wcd->regmap;
510220aedafdSSrinivas Kandagatla 	int val, byte0;
510320aedafdSSrinivas Kandagatla 
510420aedafdSSrinivas Kandagatla 	regmap_read(rm, WCD9335_CHIP_TIER_CTRL_EFUSE_VAL_OUT0, &val);
510520aedafdSSrinivas Kandagatla 	regmap_read(rm, WCD9335_CHIP_TIER_CTRL_CHIP_ID_BYTE0, &byte0);
510620aedafdSSrinivas Kandagatla 
510720aedafdSSrinivas Kandagatla 	if ((val < 0) || (byte0 < 0)) {
510820aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "WCD9335 CODEC version detection fail!\n");
510920aedafdSSrinivas Kandagatla 		return -EINVAL;
511020aedafdSSrinivas Kandagatla 	}
511120aedafdSSrinivas Kandagatla 
511220aedafdSSrinivas Kandagatla 	if (byte0 == 0x1) {
511320aedafdSSrinivas Kandagatla 		dev_info(wcd->dev, "WCD9335 CODEC version is v2.0\n");
511420aedafdSSrinivas Kandagatla 		wcd->version = WCD9335_VERSION_2_0;
511520aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_CODEC_RPM_RST_CTL, 0x01);
511620aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_SIDO_SIDO_TEST_2, 0x00);
511720aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_SIDO_SIDO_CCL_8, 0x6F);
511820aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_BIAS_VBG_FINE_ADJ, 0x65);
511920aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x5);
512020aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x7);
512120aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_CODEC_RPM_PWR_CDC_DIG_HM_CTL, 0x3);
512220aedafdSSrinivas Kandagatla 		regmap_write(rm, WCD9335_CODEC_RPM_RST_CTL, 0x3);
512320aedafdSSrinivas Kandagatla 	} else {
512420aedafdSSrinivas Kandagatla 		dev_err(wcd->dev, "WCD9335 CODEC version not supported\n");
512520aedafdSSrinivas Kandagatla 		return -EINVAL;
512620aedafdSSrinivas Kandagatla 	}
512720aedafdSSrinivas Kandagatla 
512820aedafdSSrinivas Kandagatla 	return 0;
512920aedafdSSrinivas Kandagatla }
513020aedafdSSrinivas Kandagatla 
wcd9335_irq_init(struct wcd9335_codec * wcd)513120aedafdSSrinivas Kandagatla static int wcd9335_irq_init(struct wcd9335_codec *wcd)
513220aedafdSSrinivas Kandagatla {
513320aedafdSSrinivas Kandagatla 	int ret;
513420aedafdSSrinivas Kandagatla 
513520aedafdSSrinivas Kandagatla 	/*
513620aedafdSSrinivas Kandagatla 	 * INTR1 consists of all possible interrupt sources Ear OCP,
513720aedafdSSrinivas Kandagatla 	 * HPH OCP, MBHC, MAD, VBAT, and SVA
513820aedafdSSrinivas Kandagatla 	 * INTR2 is a subset of first interrupt sources MAD, VBAT, and SVA
513920aedafdSSrinivas Kandagatla 	 */
514020aedafdSSrinivas Kandagatla 	wcd->intr1 = of_irq_get_byname(wcd->dev->of_node, "intr1");
514167380533SKrzysztof Kozlowski 	if (wcd->intr1 < 0)
514267380533SKrzysztof Kozlowski 		return dev_err_probe(wcd->dev, wcd->intr1,
514367380533SKrzysztof Kozlowski 				     "Unable to configure IRQ\n");
514420aedafdSSrinivas Kandagatla 
514520aedafdSSrinivas Kandagatla 	ret = devm_regmap_add_irq_chip(wcd->dev, wcd->regmap, wcd->intr1,
514620aedafdSSrinivas Kandagatla 				 IRQF_TRIGGER_HIGH, 0,
514720aedafdSSrinivas Kandagatla 				 &wcd9335_regmap_irq1_chip, &wcd->irq_data);
514820aedafdSSrinivas Kandagatla 	if (ret)
514967380533SKrzysztof Kozlowski 		return dev_err_probe(wcd->dev, ret, "Failed to register IRQ chip\n");
515020aedafdSSrinivas Kandagatla 
515167380533SKrzysztof Kozlowski 	return 0;
515220aedafdSSrinivas Kandagatla }
515320aedafdSSrinivas Kandagatla 
wcd9335_slim_probe(struct slim_device * slim)515420aedafdSSrinivas Kandagatla static int wcd9335_slim_probe(struct slim_device *slim)
515520aedafdSSrinivas Kandagatla {
515620aedafdSSrinivas Kandagatla 	struct device *dev = &slim->dev;
515720aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd;
515820aedafdSSrinivas Kandagatla 	int ret;
515920aedafdSSrinivas Kandagatla 
516020aedafdSSrinivas Kandagatla 	wcd = devm_kzalloc(dev, sizeof(*wcd), GFP_KERNEL);
516120aedafdSSrinivas Kandagatla 	if (!wcd)
516220aedafdSSrinivas Kandagatla 		return	-ENOMEM;
516320aedafdSSrinivas Kandagatla 
516420aedafdSSrinivas Kandagatla 	wcd->dev = dev;
516520aedafdSSrinivas Kandagatla 	ret = wcd9335_parse_dt(wcd);
516620aedafdSSrinivas Kandagatla 	if (ret) {
516720aedafdSSrinivas Kandagatla 		dev_err(dev, "Error parsing DT: %d\n", ret);
516820aedafdSSrinivas Kandagatla 		return ret;
516920aedafdSSrinivas Kandagatla 	}
517020aedafdSSrinivas Kandagatla 
517120aedafdSSrinivas Kandagatla 	ret = wcd9335_power_on_reset(wcd);
517220aedafdSSrinivas Kandagatla 	if (ret)
517320aedafdSSrinivas Kandagatla 		return ret;
517420aedafdSSrinivas Kandagatla 
517520aedafdSSrinivas Kandagatla 	dev_set_drvdata(dev, wcd);
517620aedafdSSrinivas Kandagatla 
517720aedafdSSrinivas Kandagatla 	return 0;
517820aedafdSSrinivas Kandagatla }
517920aedafdSSrinivas Kandagatla 
wcd9335_slim_status(struct slim_device * sdev,enum slim_device_status status)518020aedafdSSrinivas Kandagatla static int wcd9335_slim_status(struct slim_device *sdev,
518120aedafdSSrinivas Kandagatla 			       enum slim_device_status status)
518220aedafdSSrinivas Kandagatla {
518320aedafdSSrinivas Kandagatla 	struct device *dev = &sdev->dev;
518420aedafdSSrinivas Kandagatla 	struct device_node *ifc_dev_np;
518520aedafdSSrinivas Kandagatla 	struct wcd9335_codec *wcd;
518620aedafdSSrinivas Kandagatla 	int ret;
518720aedafdSSrinivas Kandagatla 
518820aedafdSSrinivas Kandagatla 	wcd = dev_get_drvdata(dev);
518920aedafdSSrinivas Kandagatla 
519020aedafdSSrinivas Kandagatla 	ifc_dev_np = of_parse_phandle(dev->of_node, "slim-ifc-dev", 0);
519120aedafdSSrinivas Kandagatla 	if (!ifc_dev_np) {
519220aedafdSSrinivas Kandagatla 		dev_err(dev, "No Interface device found\n");
519320aedafdSSrinivas Kandagatla 		return -EINVAL;
519420aedafdSSrinivas Kandagatla 	}
519520aedafdSSrinivas Kandagatla 
519620aedafdSSrinivas Kandagatla 	wcd->slim = sdev;
519720aedafdSSrinivas Kandagatla 	wcd->slim_ifc_dev = of_slim_get_device(sdev->ctrl, ifc_dev_np);
519864b92de9SWen Yang 	of_node_put(ifc_dev_np);
519920aedafdSSrinivas Kandagatla 	if (!wcd->slim_ifc_dev) {
520020aedafdSSrinivas Kandagatla 		dev_err(dev, "Unable to get SLIM Interface device\n");
520120aedafdSSrinivas Kandagatla 		return -EINVAL;
520220aedafdSSrinivas Kandagatla 	}
520320aedafdSSrinivas Kandagatla 
520420aedafdSSrinivas Kandagatla 	slim_get_logical_addr(wcd->slim_ifc_dev);
520520aedafdSSrinivas Kandagatla 
520620aedafdSSrinivas Kandagatla 	wcd->regmap = regmap_init_slimbus(sdev, &wcd9335_regmap_config);
520767380533SKrzysztof Kozlowski 	if (IS_ERR(wcd->regmap))
520867380533SKrzysztof Kozlowski 		return dev_err_probe(dev, PTR_ERR(wcd->regmap),
520967380533SKrzysztof Kozlowski 				     "Failed to allocate slim register map\n");
521020aedafdSSrinivas Kandagatla 
521120aedafdSSrinivas Kandagatla 	wcd->if_regmap = regmap_init_slimbus(wcd->slim_ifc_dev,
521220aedafdSSrinivas Kandagatla 						  &wcd9335_ifc_regmap_config);
521367380533SKrzysztof Kozlowski 	if (IS_ERR(wcd->if_regmap))
521467380533SKrzysztof Kozlowski 		return dev_err_probe(dev, PTR_ERR(wcd->if_regmap),
521567380533SKrzysztof Kozlowski 				     "Failed to allocate ifc register map\n");
521620aedafdSSrinivas Kandagatla 
521720aedafdSSrinivas Kandagatla 	ret = wcd9335_bring_up(wcd);
521820aedafdSSrinivas Kandagatla 	if (ret) {
521920aedafdSSrinivas Kandagatla 		dev_err(dev, "Failed to bringup WCD9335\n");
522020aedafdSSrinivas Kandagatla 		return ret;
522120aedafdSSrinivas Kandagatla 	}
522220aedafdSSrinivas Kandagatla 
522320aedafdSSrinivas Kandagatla 	ret = wcd9335_irq_init(wcd);
522420aedafdSSrinivas Kandagatla 	if (ret)
522520aedafdSSrinivas Kandagatla 		return ret;
522620aedafdSSrinivas Kandagatla 
522720aedafdSSrinivas Kandagatla 	wcd9335_probe(wcd);
522820aedafdSSrinivas Kandagatla 
52298d2f2d7fSPierre-Louis Bossart 	return 0;
523020aedafdSSrinivas Kandagatla }
523120aedafdSSrinivas Kandagatla 
523220aedafdSSrinivas Kandagatla static const struct slim_device_id wcd9335_slim_id[] = {
523320aedafdSSrinivas Kandagatla 	{SLIM_MANF_ID_QCOM, SLIM_PROD_CODE_WCD9335, 0x1, 0x0},
523420aedafdSSrinivas Kandagatla 	{}
523520aedafdSSrinivas Kandagatla };
523620aedafdSSrinivas Kandagatla MODULE_DEVICE_TABLE(slim, wcd9335_slim_id);
523720aedafdSSrinivas Kandagatla 
523820aedafdSSrinivas Kandagatla static struct slim_driver wcd9335_slim_driver = {
523920aedafdSSrinivas Kandagatla 	.driver = {
524020aedafdSSrinivas Kandagatla 		.name = "wcd9335-slim",
524120aedafdSSrinivas Kandagatla 	},
524220aedafdSSrinivas Kandagatla 	.probe = wcd9335_slim_probe,
524320aedafdSSrinivas Kandagatla 	.device_status = wcd9335_slim_status,
524420aedafdSSrinivas Kandagatla 	.id_table = wcd9335_slim_id,
524520aedafdSSrinivas Kandagatla };
524620aedafdSSrinivas Kandagatla 
524720aedafdSSrinivas Kandagatla module_slim_driver(wcd9335_slim_driver);
524820aedafdSSrinivas Kandagatla MODULE_DESCRIPTION("WCD9335 slim driver");
524920aedafdSSrinivas Kandagatla MODULE_LICENSE("GPL v2");
525020aedafdSSrinivas Kandagatla MODULE_ALIAS("slim:217:1a0:*");
5251