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