18d78602aSSrinivas Kandagatla // SPDX-License-Identifier: GPL-2.0-only 28d78602aSSrinivas Kandagatla // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. 38d78602aSSrinivas Kandagatla 48d78602aSSrinivas Kandagatla #include <linux/module.h> 58d78602aSSrinivas Kandagatla #include <linux/slab.h> 68d78602aSSrinivas Kandagatla #include <linux/platform_device.h> 78d78602aSSrinivas Kandagatla #include <linux/device.h> 88d78602aSSrinivas Kandagatla #include <linux/delay.h> 98d78602aSSrinivas Kandagatla #include <linux/kernel.h> 108d78602aSSrinivas Kandagatla #include <linux/pm_runtime.h> 118d78602aSSrinivas Kandagatla #include <linux/component.h> 128d78602aSSrinivas Kandagatla #include <sound/tlv.h> 138d78602aSSrinivas Kandagatla #include <linux/of_gpio.h> 148d78602aSSrinivas Kandagatla #include <linux/of.h> 158d78602aSSrinivas Kandagatla #include <sound/jack.h> 168d78602aSSrinivas Kandagatla #include <sound/pcm.h> 178d78602aSSrinivas Kandagatla #include <sound/pcm_params.h> 188d78602aSSrinivas Kandagatla #include <linux/regmap.h> 198d78602aSSrinivas Kandagatla #include <sound/soc.h> 208d78602aSSrinivas Kandagatla #include <sound/soc-dapm.h> 218d78602aSSrinivas Kandagatla #include <linux/regulator/consumer.h> 228d78602aSSrinivas Kandagatla 238d78602aSSrinivas Kandagatla #include "wcd-clsh-v2.h" 248d78602aSSrinivas Kandagatla #include "wcd938x.h" 258d78602aSSrinivas Kandagatla 268d78602aSSrinivas Kandagatla #define WCD938X_MAX_MICBIAS (4) 278d78602aSSrinivas Kandagatla #define WCD938X_MAX_SUPPLY (4) 288d78602aSSrinivas Kandagatla #define WCD938X_MBHC_MAX_BUTTONS (8) 298d78602aSSrinivas Kandagatla #define TX_ADC_MAX (4) 308d78602aSSrinivas Kandagatla #define WCD938X_TX_MAX_SWR_PORTS (5) 318d78602aSSrinivas Kandagatla 328d78602aSSrinivas Kandagatla #define WCD938X_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 338d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 348d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 358d78602aSSrinivas Kandagatla /* Fractional Rates */ 368d78602aSSrinivas Kandagatla #define WCD938X_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ 378d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_176400) 388d78602aSSrinivas Kandagatla #define WCD938X_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ 398d78602aSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE) 408d78602aSSrinivas Kandagatla /* Convert from vout ctl to micbias voltage in mV */ 418d78602aSSrinivas Kandagatla #define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) 428d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_0P6MHZ (600000) 438d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_1P2MHZ (1200000) 448d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_2P4MHZ (2400000) 458d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_4P8MHZ (4800000) 468d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_9P6MHZ (9600000) 478d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_11P2896MHZ (1128960) 488d78602aSSrinivas Kandagatla 498d78602aSSrinivas Kandagatla #define WCD938X_DRV_NAME "wcd938x_codec" 508d78602aSSrinivas Kandagatla #define WCD938X_VERSION_1_0 (1) 518d78602aSSrinivas Kandagatla #define EAR_RX_PATH_AUX (1) 528d78602aSSrinivas Kandagatla 538d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_HIFI 0x01 548d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_LO_HIF 0x02 558d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_NORMAL 0x03 568d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_LP 0x05 578d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_ULP1 0x09 588d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_ULP2 0x0B 598d78602aSSrinivas Kandagatla 608d78602aSSrinivas Kandagatla /* Z value defined in milliohm */ 618d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_32 (32000) 628d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_400 (400000) 638d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_1200 (1200000) 648d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_100K (100000000) 658d78602aSSrinivas Kandagatla /* Z floating defined in ohms */ 668d78602aSSrinivas Kandagatla #define WCD938X_ZDET_FLOATING_IMPEDANCE (0x0FFFFFFE) 678d78602aSSrinivas Kandagatla #define WCD938X_ZDET_NUM_MEASUREMENTS (900) 688d78602aSSrinivas Kandagatla #define WCD938X_MBHC_GET_C1(c) ((c & 0xC000) >> 14) 698d78602aSSrinivas Kandagatla #define WCD938X_MBHC_GET_X1(x) (x & 0x3FFF) 708d78602aSSrinivas Kandagatla /* Z value compared in milliOhm */ 718d78602aSSrinivas Kandagatla #define WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) 728d78602aSSrinivas Kandagatla #define WCD938X_MBHC_ZDET_CONST (86 * 16384) 738d78602aSSrinivas Kandagatla #define WCD938X_MBHC_MOISTURE_RREF R_24_KOHM 748d78602aSSrinivas Kandagatla #define WCD_MBHC_HS_V_MAX 1600 758d78602aSSrinivas Kandagatla 76e8ba1e05SSrinivas Kandagatla #define WCD938X_EAR_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \ 77e8ba1e05SSrinivas Kandagatla { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 78e8ba1e05SSrinivas Kandagatla .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ 79e8ba1e05SSrinivas Kandagatla SNDRV_CTL_ELEM_ACCESS_READWRITE,\ 80e8ba1e05SSrinivas Kandagatla .tlv.p = (tlv_array), \ 81e8ba1e05SSrinivas Kandagatla .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\ 82e8ba1e05SSrinivas Kandagatla .put = wcd938x_ear_pa_put_gain, \ 83e8ba1e05SSrinivas Kandagatla .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } 84e8ba1e05SSrinivas Kandagatla 858d78602aSSrinivas Kandagatla enum { 868d78602aSSrinivas Kandagatla WCD9380 = 0, 878d78602aSSrinivas Kandagatla WCD9385 = 5, 888d78602aSSrinivas Kandagatla }; 898d78602aSSrinivas Kandagatla 908d78602aSSrinivas Kandagatla enum { 918d78602aSSrinivas Kandagatla TX_HDR12 = 0, 928d78602aSSrinivas Kandagatla TX_HDR34, 938d78602aSSrinivas Kandagatla TX_HDR_MAX, 948d78602aSSrinivas Kandagatla }; 958d78602aSSrinivas Kandagatla 968d78602aSSrinivas Kandagatla enum { 978d78602aSSrinivas Kandagatla WCD_RX1, 988d78602aSSrinivas Kandagatla WCD_RX2, 998d78602aSSrinivas Kandagatla WCD_RX3 1008d78602aSSrinivas Kandagatla }; 1018d78602aSSrinivas Kandagatla 1028d78602aSSrinivas Kandagatla enum { 1038d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_0 */ 1048d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_PRESS_DET = 0, 1058d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 1068d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 1078d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 1088d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_SW_DET, 1098d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_OCP_INT, 1108d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_CNP_INT, 1118d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_OCP_INT, 1128d78602aSSrinivas Kandagatla 1138d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_1 */ 1148d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_CNP_INT, 1158d78602aSSrinivas Kandagatla WCD938X_IRQ_EAR_CNP_INT, 1168d78602aSSrinivas Kandagatla WCD938X_IRQ_EAR_SCD_INT, 1178d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_CNP_INT, 1188d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_SCD_INT, 1198d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT, 1208d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT, 1218d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT, 1228d78602aSSrinivas Kandagatla 1238d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_2 */ 1248d78602aSSrinivas Kandagatla WCD938X_IRQ_LDORT_SCD_INT, 1258d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_MOISTURE_INT, 1268d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_SURGE_DET_INT, 1278d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_SURGE_DET_INT, 1288d78602aSSrinivas Kandagatla WCD938X_NUM_IRQS, 1298d78602aSSrinivas Kandagatla }; 1308d78602aSSrinivas Kandagatla 1318d78602aSSrinivas Kandagatla enum { 1328d78602aSSrinivas Kandagatla WCD_ADC1 = 0, 1338d78602aSSrinivas Kandagatla WCD_ADC2, 1348d78602aSSrinivas Kandagatla WCD_ADC3, 1358d78602aSSrinivas Kandagatla WCD_ADC4, 1368d78602aSSrinivas Kandagatla ALLOW_BUCK_DISABLE, 1378d78602aSSrinivas Kandagatla HPH_COMP_DELAY, 1388d78602aSSrinivas Kandagatla HPH_PA_DELAY, 1398d78602aSSrinivas Kandagatla AMIC2_BCS_ENABLE, 1408d78602aSSrinivas Kandagatla WCD_SUPPLIES_LPM_MODE, 1418d78602aSSrinivas Kandagatla }; 1428d78602aSSrinivas Kandagatla 1438d78602aSSrinivas Kandagatla enum { 1448d78602aSSrinivas Kandagatla ADC_MODE_INVALID = 0, 1458d78602aSSrinivas Kandagatla ADC_MODE_HIFI, 1468d78602aSSrinivas Kandagatla ADC_MODE_LO_HIF, 1478d78602aSSrinivas Kandagatla ADC_MODE_NORMAL, 1488d78602aSSrinivas Kandagatla ADC_MODE_LP, 1498d78602aSSrinivas Kandagatla ADC_MODE_ULP1, 1508d78602aSSrinivas Kandagatla ADC_MODE_ULP2, 1518d78602aSSrinivas Kandagatla }; 1528d78602aSSrinivas Kandagatla 1538d78602aSSrinivas Kandagatla enum { 1548d78602aSSrinivas Kandagatla AIF1_PB = 0, 1558d78602aSSrinivas Kandagatla AIF1_CAP, 1568d78602aSSrinivas Kandagatla NUM_CODEC_DAIS, 1578d78602aSSrinivas Kandagatla }; 1588d78602aSSrinivas Kandagatla 159d5add08fSSrinivas Kandagatla static u8 tx_mode_bit[] = { 160d5add08fSSrinivas Kandagatla [ADC_MODE_INVALID] = 0x00, 161d5add08fSSrinivas Kandagatla [ADC_MODE_HIFI] = 0x01, 162d5add08fSSrinivas Kandagatla [ADC_MODE_LO_HIF] = 0x02, 163d5add08fSSrinivas Kandagatla [ADC_MODE_NORMAL] = 0x04, 164d5add08fSSrinivas Kandagatla [ADC_MODE_LP] = 0x08, 165d5add08fSSrinivas Kandagatla [ADC_MODE_ULP1] = 0x10, 166d5add08fSSrinivas Kandagatla [ADC_MODE_ULP2] = 0x20, 167d5add08fSSrinivas Kandagatla }; 168d5add08fSSrinivas Kandagatla 1698d78602aSSrinivas Kandagatla struct wcd938x_priv { 1708d78602aSSrinivas Kandagatla struct sdw_slave *tx_sdw_dev; 1718d78602aSSrinivas Kandagatla struct wcd938x_sdw_priv *sdw_priv[NUM_CODEC_DAIS]; 1728d78602aSSrinivas Kandagatla struct device *txdev; 1738d78602aSSrinivas Kandagatla struct device *rxdev; 1748d78602aSSrinivas Kandagatla struct device_node *rxnode, *txnode; 1758d78602aSSrinivas Kandagatla struct regmap *regmap; 1768d78602aSSrinivas Kandagatla struct wcd_clsh_ctrl *clsh_info; 1778d78602aSSrinivas Kandagatla struct irq_domain *virq; 1788d78602aSSrinivas Kandagatla struct regmap_irq_chip *wcd_regmap_irq_chip; 1798d78602aSSrinivas Kandagatla struct regmap_irq_chip_data *irq_chip; 1808d78602aSSrinivas Kandagatla struct regulator_bulk_data supplies[WCD938X_MAX_SUPPLY]; 1818d78602aSSrinivas Kandagatla struct snd_soc_jack *jack; 1828d78602aSSrinivas Kandagatla unsigned long status_mask; 1838d78602aSSrinivas Kandagatla s32 micb_ref[WCD938X_MAX_MICBIAS]; 1848d78602aSSrinivas Kandagatla s32 pullup_ref[WCD938X_MAX_MICBIAS]; 1858d78602aSSrinivas Kandagatla u32 hph_mode; 1868d78602aSSrinivas Kandagatla u32 tx_mode[TX_ADC_MAX]; 1878d78602aSSrinivas Kandagatla int flyback_cur_det_disable; 1888d78602aSSrinivas Kandagatla int ear_rx_path; 1898d78602aSSrinivas Kandagatla int variant; 1908d78602aSSrinivas Kandagatla int reset_gpio; 1918d78602aSSrinivas Kandagatla u32 micb1_mv; 1928d78602aSSrinivas Kandagatla u32 micb2_mv; 1938d78602aSSrinivas Kandagatla u32 micb3_mv; 1948d78602aSSrinivas Kandagatla u32 micb4_mv; 1958d78602aSSrinivas Kandagatla int hphr_pdm_wd_int; 1968d78602aSSrinivas Kandagatla int hphl_pdm_wd_int; 1978d78602aSSrinivas Kandagatla int aux_pdm_wd_int; 1988d78602aSSrinivas Kandagatla bool comp1_enable; 1998d78602aSSrinivas Kandagatla bool comp2_enable; 2008d78602aSSrinivas Kandagatla bool ldoh; 2018d78602aSSrinivas Kandagatla bool bcs_dis; 2028d78602aSSrinivas Kandagatla }; 2038d78602aSSrinivas Kandagatla 2048d78602aSSrinivas Kandagatla enum { 2058d78602aSSrinivas Kandagatla MIC_BIAS_1 = 1, 2068d78602aSSrinivas Kandagatla MIC_BIAS_2, 2078d78602aSSrinivas Kandagatla MIC_BIAS_3, 2088d78602aSSrinivas Kandagatla MIC_BIAS_4 2098d78602aSSrinivas Kandagatla }; 2108d78602aSSrinivas Kandagatla 2118d78602aSSrinivas Kandagatla enum { 2128d78602aSSrinivas Kandagatla MICB_PULLUP_ENABLE, 2138d78602aSSrinivas Kandagatla MICB_PULLUP_DISABLE, 2148d78602aSSrinivas Kandagatla MICB_ENABLE, 2158d78602aSSrinivas Kandagatla MICB_DISABLE, 2168d78602aSSrinivas Kandagatla }; 2178d78602aSSrinivas Kandagatla 218e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800); 219e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(line_gain, 600, -3000); 220e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(analog_gain, 0, 3000); 221e8ba1e05SSrinivas Kandagatla 2228d78602aSSrinivas Kandagatla static const struct reg_default wcd938x_defaults[] = { 2238d78602aSSrinivas Kandagatla {WCD938X_ANA_PAGE_REGISTER, 0x00}, 2248d78602aSSrinivas Kandagatla {WCD938X_ANA_BIAS, 0x00}, 2258d78602aSSrinivas Kandagatla {WCD938X_ANA_RX_SUPPLIES, 0x00}, 2268d78602aSSrinivas Kandagatla {WCD938X_ANA_HPH, 0x0C}, 2278d78602aSSrinivas Kandagatla {WCD938X_ANA_EAR, 0x00}, 2288d78602aSSrinivas Kandagatla {WCD938X_ANA_EAR_COMPANDER_CTL, 0x02}, 2298d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH1, 0x20}, 2308d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH2, 0x00}, 2318d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH3, 0x20}, 2328d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH4, 0x00}, 2338d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00}, 2348d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB3_DSP_EN_LOGIC, 0x00}, 2358d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_MECH, 0x39}, 2368d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_ELECT, 0x08}, 2378d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_ZDET, 0x00}, 2388d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_1, 0x00}, 2398d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_2, 0x00}, 2408d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_3, 0x00}, 2418d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN0, 0x00}, 2428d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN1, 0x10}, 2438d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN2, 0x20}, 2448d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN3, 0x30}, 2458d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN4, 0x40}, 2468d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN5, 0x50}, 2478d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN6, 0x60}, 2488d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN7, 0x70}, 2498d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB1, 0x10}, 2508d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB2, 0x10}, 2518d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB2_RAMP, 0x00}, 2528d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB3, 0x10}, 2538d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB4, 0x10}, 2548d78602aSSrinivas Kandagatla {WCD938X_BIAS_CTL, 0x2A}, 2558d78602aSSrinivas Kandagatla {WCD938X_BIAS_VBG_FINE_ADJ, 0x55}, 2568d78602aSSrinivas Kandagatla {WCD938X_LDOL_VDDCX_ADJUST, 0x01}, 2578d78602aSSrinivas Kandagatla {WCD938X_LDOL_DISABLE_LDOL, 0x00}, 2588d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_CLK, 0x00}, 2598d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_ANA, 0x00}, 2608d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_SPARE_1, 0x00}, 2618d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_SPARE_2, 0x00}, 2628d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_BCS, 0x00}, 2638d78602aSSrinivas Kandagatla {WCD938X_MBHC_MOISTURE_DET_FSM_STATUS, 0x00}, 2648d78602aSSrinivas Kandagatla {WCD938X_MBHC_TEST_CTL, 0x00}, 2658d78602aSSrinivas Kandagatla {WCD938X_LDOH_MODE, 0x2B}, 2668d78602aSSrinivas Kandagatla {WCD938X_LDOH_BIAS, 0x68}, 2678d78602aSSrinivas Kandagatla {WCD938X_LDOH_STB_LOADS, 0x00}, 2688d78602aSSrinivas Kandagatla {WCD938X_LDOH_SLOWRAMP, 0x50}, 2698d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_1, 0x1A}, 2708d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_2, 0x00}, 2718d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_3, 0xA4}, 2728d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_1, 0x1A}, 2738d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_2, 0x00}, 2748d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_3, 0x24}, 2758d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_1, 0x1A}, 2768d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_2, 0x00}, 2778d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_3, 0xA4}, 2788d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_1, 0x1A}, 2798d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_2, 0x00}, 2808d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_3, 0xA4}, 2818d78602aSSrinivas Kandagatla {WCD938X_TX_COM_ADC_VCM, 0x39}, 2828d78602aSSrinivas Kandagatla {WCD938X_TX_COM_BIAS_ATEST, 0xE0}, 2838d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE1, 0x00}, 2848d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE2, 0x00}, 2858d78602aSSrinivas Kandagatla {WCD938X_TX_COM_TXFE_DIV_CTL, 0x22}, 2868d78602aSSrinivas Kandagatla {WCD938X_TX_COM_TXFE_DIV_START, 0x00}, 2878d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE3, 0x00}, 2888d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE4, 0x00}, 2898d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_EN, 0xCC}, 2908d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_ADC_IB, 0xE9}, 2918d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_ATEST_REFCTL, 0x0A}, 2928d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_CTL, 0x38}, 2938d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_BLK_EN1, 0xFF}, 2948d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TXFE1_CLKDIV, 0x00}, 2958d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_SAR2_ERR, 0x00}, 2968d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_SAR1_ERR, 0x00}, 2978d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_EN, 0xCC}, 2988d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_ADC_IB, 0xE9}, 2998d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_ATEST_REFCTL, 0x0A}, 3008d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_CTL, 0x38}, 3018d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN3, 0xFF}, 3028d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE3_CLKDIV, 0x00}, 3038d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SAR4_ERR, 0x00}, 3048d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SAR3_ERR, 0x00}, 3058d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN2, 0xFB}, 3068d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE2_CLKDIV, 0x00}, 3078d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SPARE1, 0x00}, 3088d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN4, 0xFB}, 3098d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE4_CLKDIV, 0x00}, 3108d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SPARE2, 0x00}, 3118d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_1, 0x40}, 3128d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_2, 0x3A}, 3138d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_3, 0x00}, 3148d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_VCL_1, 0x70}, 3158d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_VCL_2, 0x82}, 3168d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_1, 0x31}, 3178d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_2, 0x80}, 3188d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_3, 0x80}, 3198d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_4, 0x51}, 3208d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_5, 0x00}, 3218d78602aSSrinivas Kandagatla {WCD938X_CLASSH_BUCK_TMUX_A_D, 0x00}, 3228d78602aSSrinivas Kandagatla {WCD938X_CLASSH_BUCK_SW_DRV_CNTL, 0x77}, 3238d78602aSSrinivas Kandagatla {WCD938X_CLASSH_SPARE, 0x00}, 3248d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_EN, 0x4E}, 3258d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_1, 0x0B}, 3268d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_2, 0x45}, 3278d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_3, 0x74}, 3288d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_4, 0x7F}, 3298d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_5, 0x83}, 3308d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_6, 0x98}, 3318d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_7, 0xA9}, 3328d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_8, 0x68}, 3338d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_9, 0x64}, 3348d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_1, 0xED}, 3358d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_2, 0xF0}, 3368d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_3, 0xA6}, 3378d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_CTRL_1, 0x65}, 3388d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_TEST_CTL, 0x00}, 3398d78602aSSrinivas Kandagatla {WCD938X_RX_AUX_SW_CTL, 0x00}, 3408d78602aSSrinivas Kandagatla {WCD938X_RX_PA_AUX_IN_CONN, 0x01}, 3418d78602aSSrinivas Kandagatla {WCD938X_RX_TIMER_DIV, 0x32}, 3428d78602aSSrinivas Kandagatla {WCD938X_RX_OCP_CTL, 0x1F}, 3438d78602aSSrinivas Kandagatla {WCD938X_RX_OCP_COUNT, 0x77}, 3448d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_EAR_DAC, 0xA0}, 3458d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_EAR_AMP, 0xAA}, 3468d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_LDO, 0xA9}, 3478d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_PA, 0xAA}, 3488d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A}, 3498d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_RDAC_LDO, 0x88}, 3508d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_CNP1, 0x82}, 3518d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_LOWPOWER, 0x82}, 3528d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_AUX_DAC, 0xA0}, 3538d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_AUX_AMP, 0xAA}, 3548d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_VNEGDAC_BLEEDER, 0x50}, 3558d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_MISC, 0x00}, 3568d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_BUCK_RST, 0x08}, 3578d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44}, 3588d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_ERRAMP, 0x40}, 3598d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_BUFF, 0xAA}, 3608d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_MID_RST, 0x14}, 3618d78602aSSrinivas Kandagatla {WCD938X_HPH_L_STATUS, 0x04}, 3628d78602aSSrinivas Kandagatla {WCD938X_HPH_R_STATUS, 0x04}, 3638d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_EN, 0x80}, 3648d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_WG_CTL, 0x9A}, 3658d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_WG_TIME, 0x14}, 3668d78602aSSrinivas Kandagatla {WCD938X_HPH_OCP_CTL, 0x28}, 3678d78602aSSrinivas Kandagatla {WCD938X_HPH_AUTO_CHOP, 0x16}, 3688d78602aSSrinivas Kandagatla {WCD938X_HPH_CHOP_CTL, 0x83}, 3698d78602aSSrinivas Kandagatla {WCD938X_HPH_PA_CTL1, 0x46}, 3708d78602aSSrinivas Kandagatla {WCD938X_HPH_PA_CTL2, 0x50}, 3718d78602aSSrinivas Kandagatla {WCD938X_HPH_L_EN, 0x80}, 3728d78602aSSrinivas Kandagatla {WCD938X_HPH_L_TEST, 0xE0}, 3738d78602aSSrinivas Kandagatla {WCD938X_HPH_L_ATEST, 0x50}, 3748d78602aSSrinivas Kandagatla {WCD938X_HPH_R_EN, 0x80}, 3758d78602aSSrinivas Kandagatla {WCD938X_HPH_R_TEST, 0xE0}, 3768d78602aSSrinivas Kandagatla {WCD938X_HPH_R_ATEST, 0x54}, 3778d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CLK_CTL1, 0x99}, 3788d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CLK_CTL2, 0x9B}, 3798d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_LDO_CTL, 0x33}, 3808d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00}, 3818d78602aSSrinivas Kandagatla {WCD938X_HPH_REFBUFF_UHQA_CTL, 0x68}, 3828d78602aSSrinivas Kandagatla {WCD938X_HPH_REFBUFF_LP_CTL, 0x0E}, 3838d78602aSSrinivas Kandagatla {WCD938X_HPH_L_DAC_CTL, 0x20}, 3848d78602aSSrinivas Kandagatla {WCD938X_HPH_R_DAC_CTL, 0x20}, 3858d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL, 0x55}, 3868d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0x19}, 3878d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1, 0xA0}, 3888d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS, 0x00}, 3898d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_EN_REG, 0x22}, 3908d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_PA_CON, 0x44}, 3918d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_SP_CON, 0xDB}, 3928d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_DAC_CON, 0x80}, 3938d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_CNP_FSM_CON, 0xB2}, 3948d78602aSSrinivas Kandagatla {WCD938X_EAR_TEST_CTL, 0x00}, 3958d78602aSSrinivas Kandagatla {WCD938X_EAR_STATUS_REG_1, 0x00}, 3968d78602aSSrinivas Kandagatla {WCD938X_EAR_STATUS_REG_2, 0x08}, 3978d78602aSSrinivas Kandagatla {WCD938X_ANA_NEW_PAGE_REGISTER, 0x00}, 3988d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_ANA_HPH2, 0x00}, 3998d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_ANA_HPH3, 0x00}, 4008d78602aSSrinivas Kandagatla {WCD938X_SLEEP_CTL, 0x16}, 4018d78602aSSrinivas Kandagatla {WCD938X_SLEEP_WATCHDOG_CTL, 0x00}, 4028d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00}, 4038d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_CTL_1, 0x02}, 4048d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_CTL_2, 0x05}, 4058d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0xE9}, 4068d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ZDET_ANA_CTL, 0x0F}, 4078d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ZDET_RAMP_CTL, 0x00}, 4088d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_FSM_STATUS, 0x00}, 4098d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ADC_RESULT, 0x00}, 4108d78602aSSrinivas Kandagatla {WCD938X_TX_NEW_AMIC_MUX_CFG, 0x00}, 4118d78602aSSrinivas Kandagatla {WCD938X_AUX_AUXPA, 0x00}, 4128d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_MODE, 0x0C}, 4138d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_CONFIG, 0x10}, 4148d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_DIE_CRK_DET_EN, 0x00}, 4158d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_DIE_CRK_DET_OUT, 0x00}, 4168d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40}, 4178d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81}, 4188d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10}, 4198d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00}, 4208d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81}, 4218d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_MISC1, 0x22}, 4228d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_MISC2, 0x00}, 4238d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC, 0x00}, 4248d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER1, 0xFE}, 4258d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER2, 0x02}, 4268d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER3, 0x4E}, 4278d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER4, 0x54}, 4288d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00}, 4298d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00}, 4308d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 0x90}, 4318d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 0x90}, 4328d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62}, 4338d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01}, 4348d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11}, 4358d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57}, 4368d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01}, 4378d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00}, 4388d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_SPARE_2, 0x00}, 4398d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8}, 4408d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_CNP_VCM_CON1, 0x42}, 4418d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_CNP_VCM_CON2, 0x22}, 4428d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00}, 4438d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_EN_REG, 0x00}, 4448d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_PA_CTRL, 0x06}, 4458d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_SP_CTRL, 0xD2}, 4468d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_DAC_CTRL, 0x80}, 4478d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_CLK_CTRL, 0x50}, 4488d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_TEST_CTRL, 0x00}, 4498d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_STATUS_REG, 0x00}, 4508d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_MISC, 0x00}, 4518d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_BIAS, 0x6E}, 4528d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STB_LOADS_DTEST, 0x50}, 4538d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_TEST0, 0x1C}, 4548d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STARTUP_TIMER, 0xFF}, 4558d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_TEST1, 0x1F}, 4568d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STATUS, 0x00}, 4578d78602aSSrinivas Kandagatla {WCD938X_SLEEP_INT_WATCHDOG_CTL_1, 0x0A}, 4588d78602aSSrinivas Kandagatla {WCD938X_SLEEP_INT_WATCHDOG_CTL_2, 0x0A}, 4598d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1, 0x02}, 4608d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2, 0x60}, 4618d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2, 0xFF}, 4628d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1, 0x7F}, 4638d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0, 0x3F}, 4648d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M, 0x1F}, 4658d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M, 0x0F}, 4668d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1, 0xD7}, 4678d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0, 0xC8}, 4688d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP, 0xC6}, 4698d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1, 0xD5}, 4708d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0, 0xCA}, 4718d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 0x05}, 4728d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0, 0xA5}, 4738d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 0x13}, 4748d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1, 0x88}, 4758d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP, 0x42}, 4768d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L2, 0xFF}, 4778d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L1, 0x64}, 4788d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L0, 0x64}, 4798d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP, 0x77}, 4808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAGE_REGISTER, 0x00}, 4818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID0, 0x00}, 4828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID1, 0x00}, 4838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID2, 0x0D}, 4848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID3, 0x01}, 4858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_TX_CLK_RATE, 0x00}, 4868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RST_CTL, 0x03}, 4878d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TOP_CLK_CFG, 0x00}, 4888d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x00}, 4898d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0xF0}, 4908d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_RST_EN, 0x00}, 4918d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_PATH_MODE, 0x55}, 4928d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX_RST, 0x00}, 4938d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX0_CTL, 0xFC}, 4948d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX1_CTL, 0xFC}, 4958d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX2_CTL, 0xFC}, 4968d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x00}, 4978d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x00}, 4988d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x00}, 4998d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 0x1E}, 5008d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00}, 5018d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01}, 5028d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63}, 5038d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04}, 5048d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A3_0, 0xAC}, 5058d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04}, 5068d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1A}, 5078d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03}, 5088d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A5_0, 0xBC}, 5098d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02}, 5108d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A6_0, 0xC7}, 5118d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A7_0, 0xF8}, 5128d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_0, 0x47}, 5138d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_1, 0x43}, 5148d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_2, 0xB1}, 5158d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_3, 0x17}, 5168d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R1, 0x4D}, 5178d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R2, 0x29}, 5188d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R3, 0x34}, 5198d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R4, 0x59}, 5208d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R5, 0x66}, 5218d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R6, 0x87}, 5228d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R7, 0x64}, 5238d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A1_0, 0x00}, 5248d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A1_1, 0x01}, 5258d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A2_0, 0x96}, 5268d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A2_1, 0x09}, 5278d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A3_0, 0xAB}, 5288d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A3_1, 0x05}, 5298d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A4_0, 0x1C}, 5308d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A4_1, 0x02}, 5318d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A5_0, 0x17}, 5328d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A5_1, 0x02}, 5338d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A6_0, 0xAA}, 5348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A7_0, 0xE3}, 5358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_0, 0x69}, 5368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_1, 0x54}, 5378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_2, 0x02}, 5388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_3, 0x15}, 5398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R1, 0xA4}, 5408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R2, 0xB5}, 5418d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R3, 0x86}, 5428d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R4, 0x85}, 5438d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R5, 0xAA}, 5448d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R6, 0xE2}, 5458d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R7, 0x62}, 5468d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55}, 5478d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xA9}, 5488d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3D}, 5498d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2E}, 5508d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01}, 5518d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0, 0x00}, 5528d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1, 0xFC}, 5538d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2, 0x01}, 5548d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00}, 5558d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x00}, 5568d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0x00}, 5578d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_SWR_CLH, 0x00}, 5588d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_CLH_BYP, 0x00}, 5598d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX0_CTL, 0x68}, 5608d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX1_CTL, 0x68}, 5618d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX2_CTL, 0x68}, 5628d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_RST, 0x00}, 5638d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_REQ_CTL, 0x01}, 5648d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RST, 0x00}, 5658d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AMIC_CTL, 0x0F}, 5668d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_CTL, 0x04}, 5678d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC1_CTL, 0x01}, 5688d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC2_CTL, 0x01}, 5698d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC3_CTL, 0x01}, 5708d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC4_CTL, 0x01}, 5718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_PRG_CTL, 0x00}, 5728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_CTL, 0x2B}, 5738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_RATE_1_2, 0x11}, 5748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_RATE_3_4, 0x11}, 5758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL0, 0x00}, 5768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL1, 0x00}, 5778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL2, 0x00}, 5788d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MODE, 0x00}, 5798d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_0, 0xFF}, 5808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_1, 0xFF}, 5818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_2, 0x3F}, 5828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_0, 0x00}, 5838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_1, 0x00}, 5848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_2, 0x00}, 5858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_0, 0x00}, 5868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_1, 0x00}, 5878d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_2, 0x00}, 5888d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_0, 0x00}, 5898d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_1, 0x00}, 5908d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_2, 0x00}, 5918d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_0, 0x00}, 5928d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_1, 0x00}, 5938d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_2, 0x00}, 5948d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_0, 0x00}, 5958d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_1, 0x00}, 5968d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_2, 0x00}, 5978d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_EN, 0x00}, 5988d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_0_1, 0x00}, 5998d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_2_3, 0x00}, 6008d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_LB_IN_SEL_CTL, 0x00}, 6018d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_LOOP_BACK_MODE, 0x00}, 6028d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_DAC_TEST, 0x00}, 6038d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_RX_0, 0x40}, 6048d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_0, 0x40}, 6058d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_RX_1, 0x00}, 6068d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_1, 0x00}, 6078d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_2, 0x00}, 6088d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_0, 0x00}, 6098d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_1, 0x00}, 6108d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_SWR_0, 0x8F}, 6118d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_SWR_1, 0x06}, 6128d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_I2C_CTL, 0x00}, 6138d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE, 0x00}, 6148d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_TEST_CTL_0, 0x00}, 6158d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_TEST_CTL_1, 0x00}, 6168d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_T_DATA_0, 0x00}, 6178d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_T_DATA_1, 0x00}, 6188d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_RX0, 0xF1}, 6198d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_RX1, 0xF1}, 6208d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX0, 0xF1}, 6218d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX1, 0xF1}, 6228d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX2, 0xF1}, 6238d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_INP_DIS_0, 0x00}, 6248d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_INP_DIS_1, 0x00}, 6258d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_0, 0x00}, 6268d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_1, 0x00}, 6278d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_2, 0x00}, 6288d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_RX_DATA_EDGE_CTL, 0x1F}, 6298d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_DATA_EDGE_CTL, 0x80}, 6308d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_GPIO_MODE, 0x00}, 6318d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_OE, 0x00}, 6328d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_DATA_0, 0x00}, 6338d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_DATA_1, 0x00}, 6348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_STATUS_0, 0x00}, 6358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_STATUS_1, 0x00}, 6368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DIG_DEBUG_CTL, 0x00}, 6378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DIG_DEBUG_EN, 0x00}, 6388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_ANA_CSR_DBG_ADD, 0x00}, 6398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_ANA_CSR_DBG_CTL, 0x48}, 6408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SSP_DBG, 0x00}, 6418d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_MODE_STATUS_0, 0x00}, 6428d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_MODE_STATUS_1, 0x00}, 6438d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_0, 0x00}, 6448d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_1, 0x00}, 6458d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_2, 0x00}, 6468d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_0, 0x00}, 6478d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_1, 0xFF}, 6488d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_2, 0xFF}, 6498d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_3, 0xFF}, 6508d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_4, 0xFF}, 6518d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_5, 0xFF}, 6528d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_6, 0xFF}, 6538d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_7, 0xFF}, 6548d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_8, 0xFF}, 6558d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_9, 0xFF}, 6568d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_10, 0xFF}, 6578d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_11, 0xFF}, 6588d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_12, 0xFF}, 6598d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_13, 0xFF}, 6608d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_14, 0xFF}, 6618d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_15, 0xFF}, 6628d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_16, 0xFF}, 6638d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_17, 0xFF}, 6648d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_18, 0xFF}, 6658d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_19, 0xFF}, 6668d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_20, 0x0E}, 6678d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_21, 0x00}, 6688d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_22, 0x00}, 6698d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_23, 0xF8}, 6708d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_24, 0x16}, 6718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_25, 0x00}, 6728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_26, 0x00}, 6738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_27, 0x00}, 6748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_28, 0x00}, 6758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_29, 0x00}, 6768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_30, 0x00}, 6778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_31, 0x00}, 6788d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0x88}, 6798d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0x88}, 6808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0x88}, 6818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0x88}, 6828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0x88}, 6838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA0, 0x55}, 6848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA1, 0x55}, 6858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA2, 0x55}, 6868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA3, 0x01}, 6878d78602aSSrinivas Kandagatla }; 6888d78602aSSrinivas Kandagatla 6898d78602aSSrinivas Kandagatla static bool wcd938x_rdwr_register(struct device *dev, unsigned int reg) 6908d78602aSSrinivas Kandagatla { 6918d78602aSSrinivas Kandagatla switch (reg) { 6928d78602aSSrinivas Kandagatla case WCD938X_ANA_PAGE_REGISTER: 6938d78602aSSrinivas Kandagatla case WCD938X_ANA_BIAS: 6948d78602aSSrinivas Kandagatla case WCD938X_ANA_RX_SUPPLIES: 6958d78602aSSrinivas Kandagatla case WCD938X_ANA_HPH: 6968d78602aSSrinivas Kandagatla case WCD938X_ANA_EAR: 6978d78602aSSrinivas Kandagatla case WCD938X_ANA_EAR_COMPANDER_CTL: 6988d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH1: 6998d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH2: 7008d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH3: 7018d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH4: 7028d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC: 7038d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB3_DSP_EN_LOGIC: 7048d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_MECH: 7058d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_ELECT: 7068d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_ZDET: 7078d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN0: 7088d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN1: 7098d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN2: 7108d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN3: 7118d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN4: 7128d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN5: 7138d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN6: 7148d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN7: 7158d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB1: 7168d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB2: 7178d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB2_RAMP: 7188d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB3: 7198d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB4: 7208d78602aSSrinivas Kandagatla case WCD938X_BIAS_CTL: 7218d78602aSSrinivas Kandagatla case WCD938X_BIAS_VBG_FINE_ADJ: 7228d78602aSSrinivas Kandagatla case WCD938X_LDOL_VDDCX_ADJUST: 7238d78602aSSrinivas Kandagatla case WCD938X_LDOL_DISABLE_LDOL: 7248d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_CLK: 7258d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_ANA: 7268d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_SPARE_1: 7278d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_SPARE_2: 7288d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_BCS: 7298d78602aSSrinivas Kandagatla case WCD938X_MBHC_TEST_CTL: 7308d78602aSSrinivas Kandagatla case WCD938X_LDOH_MODE: 7318d78602aSSrinivas Kandagatla case WCD938X_LDOH_BIAS: 7328d78602aSSrinivas Kandagatla case WCD938X_LDOH_STB_LOADS: 7338d78602aSSrinivas Kandagatla case WCD938X_LDOH_SLOWRAMP: 7348d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_1: 7358d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_2: 7368d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_3: 7378d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_1: 7388d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_2: 7398d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_3: 7408d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_1: 7418d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_2: 7428d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_3: 7438d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_1: 7448d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_2: 7458d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_3: 7468d78602aSSrinivas Kandagatla case WCD938X_TX_COM_ADC_VCM: 7478d78602aSSrinivas Kandagatla case WCD938X_TX_COM_BIAS_ATEST: 7488d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE1: 7498d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE2: 7508d78602aSSrinivas Kandagatla case WCD938X_TX_COM_TXFE_DIV_CTL: 7518d78602aSSrinivas Kandagatla case WCD938X_TX_COM_TXFE_DIV_START: 7528d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE3: 7538d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE4: 7548d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_EN: 7558d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_ADC_IB: 7568d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_ATEST_REFCTL: 7578d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_CTL: 7588d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_BLK_EN1: 7598d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TXFE1_CLKDIV: 7608d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_EN: 7618d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_ADC_IB: 7628d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_ATEST_REFCTL: 7638d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_CTL: 7648d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN3: 7658d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE3_CLKDIV: 7668d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN2: 7678d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE2_CLKDIV: 7688d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SPARE1: 7698d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN4: 7708d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE4_CLKDIV: 7718d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SPARE2: 7728d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_1: 7738d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_2: 7748d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_3: 7758d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_VCL_1: 7768d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_VCL_2: 7778d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_1: 7788d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_2: 7798d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_3: 7808d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_4: 7818d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_5: 7828d78602aSSrinivas Kandagatla case WCD938X_CLASSH_BUCK_TMUX_A_D: 7838d78602aSSrinivas Kandagatla case WCD938X_CLASSH_BUCK_SW_DRV_CNTL: 7848d78602aSSrinivas Kandagatla case WCD938X_CLASSH_SPARE: 7858d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_EN: 7868d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_1: 7878d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_2: 7888d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_3: 7898d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_4: 7908d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_5: 7918d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_6: 7928d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_7: 7938d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_8: 7948d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_9: 7958d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_1: 7968d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_2: 7978d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_3: 7988d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_CTRL_1: 7998d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_TEST_CTL: 8008d78602aSSrinivas Kandagatla case WCD938X_RX_AUX_SW_CTL: 8018d78602aSSrinivas Kandagatla case WCD938X_RX_PA_AUX_IN_CONN: 8028d78602aSSrinivas Kandagatla case WCD938X_RX_TIMER_DIV: 8038d78602aSSrinivas Kandagatla case WCD938X_RX_OCP_CTL: 8048d78602aSSrinivas Kandagatla case WCD938X_RX_OCP_COUNT: 8058d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_EAR_DAC: 8068d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_EAR_AMP: 8078d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_LDO: 8088d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_PA: 8098d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2: 8108d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_RDAC_LDO: 8118d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_CNP1: 8128d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_LOWPOWER: 8138d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_AUX_DAC: 8148d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_AUX_AMP: 8158d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_VNEGDAC_BLEEDER: 8168d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_MISC: 8178d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_BUCK_RST: 8188d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_BUCK_VREF_ERRAMP: 8198d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_ERRAMP: 8208d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_BUFF: 8218d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_MID_RST: 8228d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_EN: 8238d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_WG_CTL: 8248d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_WG_TIME: 8258d78602aSSrinivas Kandagatla case WCD938X_HPH_OCP_CTL: 8268d78602aSSrinivas Kandagatla case WCD938X_HPH_AUTO_CHOP: 8278d78602aSSrinivas Kandagatla case WCD938X_HPH_CHOP_CTL: 8288d78602aSSrinivas Kandagatla case WCD938X_HPH_PA_CTL1: 8298d78602aSSrinivas Kandagatla case WCD938X_HPH_PA_CTL2: 8308d78602aSSrinivas Kandagatla case WCD938X_HPH_L_EN: 8318d78602aSSrinivas Kandagatla case WCD938X_HPH_L_TEST: 8328d78602aSSrinivas Kandagatla case WCD938X_HPH_L_ATEST: 8338d78602aSSrinivas Kandagatla case WCD938X_HPH_R_EN: 8348d78602aSSrinivas Kandagatla case WCD938X_HPH_R_TEST: 8358d78602aSSrinivas Kandagatla case WCD938X_HPH_R_ATEST: 8368d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CLK_CTL1: 8378d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CLK_CTL2: 8388d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_LDO_CTL: 8398d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL: 8408d78602aSSrinivas Kandagatla case WCD938X_HPH_REFBUFF_UHQA_CTL: 8418d78602aSSrinivas Kandagatla case WCD938X_HPH_REFBUFF_LP_CTL: 8428d78602aSSrinivas Kandagatla case WCD938X_HPH_L_DAC_CTL: 8438d78602aSSrinivas Kandagatla case WCD938X_HPH_R_DAC_CTL: 8448d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL: 8458d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_EN: 8468d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1: 8478d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_EN_REG: 8488d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_PA_CON: 8498d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_SP_CON: 8508d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_DAC_CON: 8518d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_CNP_FSM_CON: 8528d78602aSSrinivas Kandagatla case WCD938X_EAR_TEST_CTL: 8538d78602aSSrinivas Kandagatla case WCD938X_ANA_NEW_PAGE_REGISTER: 8548d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_ANA_HPH2: 8558d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_ANA_HPH3: 8568d78602aSSrinivas Kandagatla case WCD938X_SLEEP_CTL: 8578d78602aSSrinivas Kandagatla case WCD938X_SLEEP_WATCHDOG_CTL: 8588d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL: 8598d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_CTL_1: 8608d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_CTL_2: 8618d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_PLUG_DETECT_CTL: 8628d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ZDET_ANA_CTL: 8638d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ZDET_RAMP_CTL: 8648d78602aSSrinivas Kandagatla case WCD938X_TX_NEW_AMIC_MUX_CFG: 8658d78602aSSrinivas Kandagatla case WCD938X_AUX_AUXPA: 8668d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_MODE: 8678d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_CONFIG: 8688d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_DIE_CRK_DET_EN: 8698d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL: 8708d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L: 8718d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_VREF_CTL: 8728d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL: 8738d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R: 8748d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_MISC1: 8758d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_MISC2: 8768d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC: 8778d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER1: 8788d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER2: 8798d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER3: 8808d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER4: 8818d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC2: 8828d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC3: 8838d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW: 8848d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW: 8858d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI: 8868d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP: 8878d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP: 8888d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL: 8898d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL: 8908d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT: 8918d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_SPARE_2: 8928d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON: 8938d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_CNP_VCM_CON1: 8948d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_CNP_VCM_CON2: 8958d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS: 8968d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_EN_REG: 8978d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_PA_CTRL: 8988d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_SP_CTRL: 8998d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_DAC_CTRL: 9008d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_CLK_CTRL: 9018d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_TEST_CTRL: 9028d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_MISC: 9038d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_BIAS: 9048d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STB_LOADS_DTEST: 9058d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_TEST0: 9068d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STARTUP_TIMER: 9078d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_TEST1: 9088d78602aSSrinivas Kandagatla case WCD938X_SLEEP_INT_WATCHDOG_CTL_1: 9098d78602aSSrinivas Kandagatla case WCD938X_SLEEP_INT_WATCHDOG_CTL_2: 9108d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1: 9118d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2: 9128d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2: 9138d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1: 9148d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0: 9158d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M: 9168d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M: 9178d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1: 9188d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0: 9198d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP: 9208d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1: 9218d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0: 9228d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP: 9238d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0: 9248d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP: 9258d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1: 9268d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP: 9278d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L2: 9288d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L1: 9298d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L0: 9308d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP: 9318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAGE_REGISTER: 9328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_TX_CLK_RATE: 9338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RST_CTL: 9348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TOP_CLK_CFG: 9358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_ANA_CLK_CTL: 9368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DIG_CLK_CTL: 9378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_RST_EN: 9388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_PATH_MODE: 9398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX_RST: 9408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX0_CTL: 9418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX1_CTL: 9428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX2_CTL: 9438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1: 9448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3: 9458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_COMP_CTL_0: 9468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL: 9478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A1_0: 9488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A1_1: 9498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A2_0: 9508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A2_1: 9518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A3_0: 9528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A3_1: 9538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A4_0: 9548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A4_1: 9558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A5_0: 9568d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A5_1: 9578d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A6_0: 9588d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A7_0: 9598d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_0: 9608d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_1: 9618d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_2: 9628d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_3: 9638d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R1: 9648d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R2: 9658d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R3: 9668d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R4: 9678d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R5: 9688d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R6: 9698d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R7: 9708d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A1_0: 9718d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A1_1: 9728d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A2_0: 9738d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A2_1: 9748d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A3_0: 9758d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A3_1: 9768d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A4_0: 9778d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A4_1: 9788d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A5_0: 9798d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A5_1: 9808d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A6_0: 9818d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A7_0: 9828d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_0: 9838d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_1: 9848d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_2: 9858d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_3: 9868d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R1: 9878d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R2: 9888d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R3: 9898d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R4: 9908d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R5: 9918d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R6: 9928d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R7: 9938d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0: 9948d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1: 9958d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0: 9968d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1: 9978d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2: 9988d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0: 9998d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1: 10008d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2: 10018d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_CTL: 10028d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_CTL: 10038d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_EAR_PATH_CTL: 10048d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_SWR_CLH: 10058d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_CLH_BYP: 10068d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX0_CTL: 10078d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX1_CTL: 10088d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX2_CTL: 10098d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_RST: 10108d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_REQ_CTL: 10118d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RST: 10128d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AMIC_CTL: 10138d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_CTL: 10148d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC1_CTL: 10158d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC2_CTL: 10168d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC3_CTL: 10178d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC4_CTL: 10188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_PRG_CTL: 10198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_CTL: 10208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_RATE_1_2: 10218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_RATE_3_4: 10228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL0: 10238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL1: 10248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL2: 10258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MODE: 10268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_0: 10278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_1: 10288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_2: 10298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_0: 10308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_1: 10318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_2: 10328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_0: 10338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_1: 10348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_2: 10358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_0: 10368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_1: 10378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_2: 10388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_0: 10398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_1: 10408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_2: 10418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_EN: 10428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_0_1: 10438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_2_3: 10448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_LB_IN_SEL_CTL: 10458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_LOOP_BACK_MODE: 10468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_DAC_TEST: 10478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_RX_0: 10488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_0: 10498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_RX_1: 10508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_1: 10518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_2: 10528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_SWR_0: 10538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_SWR_1: 10548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_I2C_CTL: 10558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE: 10568d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_TEST_CTL_0: 10578d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_TEST_CTL_1: 10588d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_RX0: 10598d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_RX1: 10608d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX0: 10618d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX1: 10628d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX2: 10638d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_INP_DIS_0: 10648d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_INP_DIS_1: 10658d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_0: 10668d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_1: 10678d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_2: 10688d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_RX_DATA_EDGE_CTL: 10698d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_DATA_EDGE_CTL: 10708d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_GPIO_MODE: 10718d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_OE: 10728d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_DATA_0: 10738d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_DATA_1: 10748d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DIG_DEBUG_CTL: 10758d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DIG_DEBUG_EN: 10768d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_ANA_CSR_DBG_ADD: 10778d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_ANA_CSR_DBG_CTL: 10788d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SSP_DBG: 10798d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_0: 10808d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_1: 10818d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_2: 10828d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_0: 10838d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_1: 10848d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_2: 10858d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_3: 10868d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_4: 10878d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA0: 10888d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA1: 10898d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA2: 10908d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA3: 10918d78602aSSrinivas Kandagatla return true; 10928d78602aSSrinivas Kandagatla } 10938d78602aSSrinivas Kandagatla 10948d78602aSSrinivas Kandagatla return false; 10958d78602aSSrinivas Kandagatla } 10968d78602aSSrinivas Kandagatla 10978d78602aSSrinivas Kandagatla static bool wcd938x_readonly_register(struct device *dev, unsigned int reg) 10988d78602aSSrinivas Kandagatla { 10998d78602aSSrinivas Kandagatla switch (reg) { 11008d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_1: 11018d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_2: 11028d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_3: 11038d78602aSSrinivas Kandagatla case WCD938X_MBHC_MOISTURE_DET_FSM_STATUS: 11048d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_SAR2_ERR: 11058d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_SAR1_ERR: 11068d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SAR4_ERR: 11078d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SAR3_ERR: 11088d78602aSSrinivas Kandagatla case WCD938X_HPH_L_STATUS: 11098d78602aSSrinivas Kandagatla case WCD938X_HPH_R_STATUS: 11108d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS: 11118d78602aSSrinivas Kandagatla case WCD938X_EAR_STATUS_REG_1: 11128d78602aSSrinivas Kandagatla case WCD938X_EAR_STATUS_REG_2: 11138d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_FSM_STATUS: 11148d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ADC_RESULT: 11158d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_DIE_CRK_DET_OUT: 11168d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_STATUS_REG: 11178d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STATUS: 11188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID0: 11198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID1: 11208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID2: 11218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID3: 11228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_0: 11238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_1: 11248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_2: 11258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_0: 11268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_1: 11278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_T_DATA_0: 11288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_T_DATA_1: 11298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_STATUS_0: 11308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_STATUS_1: 11318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_MODE_STATUS_0: 11328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_MODE_STATUS_1: 11338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_0: 11348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_1: 11358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_2: 11368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_3: 11378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_4: 11388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_5: 11398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_6: 11408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_7: 11418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_8: 11428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_9: 11438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_10: 11448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_11: 11458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_12: 11468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_13: 11478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_14: 11488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_15: 11498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_16: 11508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_17: 11518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_18: 11528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_19: 11538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_20: 11548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_21: 11558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_22: 11568d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_23: 11578d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_24: 11588d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_25: 11598d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_26: 11608d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_27: 11618d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_28: 11628d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_29: 11638d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_30: 11648d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_31: 11658d78602aSSrinivas Kandagatla return true; 11668d78602aSSrinivas Kandagatla } 11678d78602aSSrinivas Kandagatla return false; 11688d78602aSSrinivas Kandagatla } 11698d78602aSSrinivas Kandagatla 11708d78602aSSrinivas Kandagatla static bool wcd938x_readable_register(struct device *dev, unsigned int reg) 11718d78602aSSrinivas Kandagatla { 11728d78602aSSrinivas Kandagatla bool ret; 11738d78602aSSrinivas Kandagatla 11748d78602aSSrinivas Kandagatla ret = wcd938x_readonly_register(dev, reg); 11758d78602aSSrinivas Kandagatla if (!ret) 11768d78602aSSrinivas Kandagatla return wcd938x_rdwr_register(dev, reg); 11778d78602aSSrinivas Kandagatla 11788d78602aSSrinivas Kandagatla return ret; 11798d78602aSSrinivas Kandagatla } 11808d78602aSSrinivas Kandagatla 11818d78602aSSrinivas Kandagatla static bool wcd938x_writeable_register(struct device *dev, unsigned int reg) 11828d78602aSSrinivas Kandagatla { 11838d78602aSSrinivas Kandagatla return wcd938x_rdwr_register(dev, reg); 11848d78602aSSrinivas Kandagatla } 11858d78602aSSrinivas Kandagatla 11868d78602aSSrinivas Kandagatla static bool wcd938x_volatile_register(struct device *dev, unsigned int reg) 11878d78602aSSrinivas Kandagatla { 11888d78602aSSrinivas Kandagatla if (reg <= WCD938X_BASE_ADDRESS) 1189*83bd5c53SYang Li return false; 11908d78602aSSrinivas Kandagatla 11918d78602aSSrinivas Kandagatla if (reg == WCD938X_DIGITAL_SWR_TX_CLK_RATE) 11928d78602aSSrinivas Kandagatla return true; 11938d78602aSSrinivas Kandagatla 11948d78602aSSrinivas Kandagatla if (wcd938x_readonly_register(dev, reg)) 11958d78602aSSrinivas Kandagatla return true; 11968d78602aSSrinivas Kandagatla 11978d78602aSSrinivas Kandagatla return false; 11988d78602aSSrinivas Kandagatla } 11998d78602aSSrinivas Kandagatla 1200b90d9398SSrinivas Kandagatla static struct regmap_config wcd938x_regmap_config = { 12018d78602aSSrinivas Kandagatla .name = "wcd938x_csr", 12028d78602aSSrinivas Kandagatla .reg_bits = 32, 12038d78602aSSrinivas Kandagatla .val_bits = 8, 12048d78602aSSrinivas Kandagatla .cache_type = REGCACHE_RBTREE, 12058d78602aSSrinivas Kandagatla .reg_defaults = wcd938x_defaults, 12068d78602aSSrinivas Kandagatla .num_reg_defaults = ARRAY_SIZE(wcd938x_defaults), 12078d78602aSSrinivas Kandagatla .max_register = WCD938X_MAX_REGISTER, 12088d78602aSSrinivas Kandagatla .readable_reg = wcd938x_readable_register, 12098d78602aSSrinivas Kandagatla .writeable_reg = wcd938x_writeable_register, 12108d78602aSSrinivas Kandagatla .volatile_reg = wcd938x_volatile_register, 12118d78602aSSrinivas Kandagatla .can_multi_write = true, 12128d78602aSSrinivas Kandagatla }; 12138d78602aSSrinivas Kandagatla 12148d78602aSSrinivas Kandagatla static const struct regmap_irq wcd938x_irqs[WCD938X_NUM_IRQS] = { 12158d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01), 12168d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02), 12178d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), 12188d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), 12198d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_SW_DET, 0, 0x10), 12208d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_OCP_INT, 0, 0x20), 12218d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_CNP_INT, 0, 0x40), 12228d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_OCP_INT, 0, 0x80), 12238d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_CNP_INT, 1, 0x01), 12248d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_EAR_CNP_INT, 1, 0x02), 12258d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_EAR_SCD_INT, 1, 0x04), 12268d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_CNP_INT, 1, 0x08), 12278d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_SCD_INT, 1, 0x10), 12288d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_PDM_WD_INT, 1, 0x20), 12298d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_PDM_WD_INT, 1, 0x40), 12308d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_PDM_WD_INT, 1, 0x80), 12318d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_LDORT_SCD_INT, 2, 0x01), 12328d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_MOISTURE_INT, 2, 0x02), 12338d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_SURGE_DET_INT, 2, 0x04), 12348d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_SURGE_DET_INT, 2, 0x08), 12358d78602aSSrinivas Kandagatla }; 12368d78602aSSrinivas Kandagatla 12378d78602aSSrinivas Kandagatla static struct regmap_irq_chip wcd938x_regmap_irq_chip = { 12388d78602aSSrinivas Kandagatla .name = "wcd938x", 12398d78602aSSrinivas Kandagatla .irqs = wcd938x_irqs, 12408d78602aSSrinivas Kandagatla .num_irqs = ARRAY_SIZE(wcd938x_irqs), 12418d78602aSSrinivas Kandagatla .num_regs = 3, 12428d78602aSSrinivas Kandagatla .status_base = WCD938X_DIGITAL_INTR_STATUS_0, 12438d78602aSSrinivas Kandagatla .mask_base = WCD938X_DIGITAL_INTR_MASK_0, 12448d78602aSSrinivas Kandagatla .type_base = WCD938X_DIGITAL_INTR_LEVEL_0, 12458d78602aSSrinivas Kandagatla .ack_base = WCD938X_DIGITAL_INTR_CLEAR_0, 12468d78602aSSrinivas Kandagatla .use_ack = 1, 12478d78602aSSrinivas Kandagatla .runtime_pm = true, 12488d78602aSSrinivas Kandagatla .irq_drv_data = NULL, 12498d78602aSSrinivas Kandagatla }; 12508d78602aSSrinivas Kandagatla 1251d5add08fSSrinivas Kandagatla static int wcd938x_get_clk_rate(int mode) 1252d5add08fSSrinivas Kandagatla { 1253d5add08fSSrinivas Kandagatla int rate; 1254d5add08fSSrinivas Kandagatla 1255d5add08fSSrinivas Kandagatla switch (mode) { 1256d5add08fSSrinivas Kandagatla case ADC_MODE_ULP2: 1257d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_0P6MHZ; 1258d5add08fSSrinivas Kandagatla break; 1259d5add08fSSrinivas Kandagatla case ADC_MODE_ULP1: 1260d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_1P2MHZ; 1261d5add08fSSrinivas Kandagatla break; 1262d5add08fSSrinivas Kandagatla case ADC_MODE_LP: 1263d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_4P8MHZ; 1264d5add08fSSrinivas Kandagatla break; 1265d5add08fSSrinivas Kandagatla case ADC_MODE_NORMAL: 1266d5add08fSSrinivas Kandagatla case ADC_MODE_LO_HIF: 1267d5add08fSSrinivas Kandagatla case ADC_MODE_HIFI: 1268d5add08fSSrinivas Kandagatla case ADC_MODE_INVALID: 1269d5add08fSSrinivas Kandagatla default: 1270d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_9P6MHZ; 1271d5add08fSSrinivas Kandagatla break; 1272d5add08fSSrinivas Kandagatla } 1273d5add08fSSrinivas Kandagatla 1274d5add08fSSrinivas Kandagatla return rate; 1275d5add08fSSrinivas Kandagatla } 1276d5add08fSSrinivas Kandagatla 1277d5add08fSSrinivas Kandagatla static int wcd938x_set_swr_clk_rate(struct snd_soc_component *component, int rate, int bank) 1278d5add08fSSrinivas Kandagatla { 1279d5add08fSSrinivas Kandagatla u8 mask = (bank ? 0xF0 : 0x0F); 1280d5add08fSSrinivas Kandagatla u8 val = 0; 1281d5add08fSSrinivas Kandagatla 1282d5add08fSSrinivas Kandagatla switch (rate) { 1283d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_0P6MHZ: 1284d5add08fSSrinivas Kandagatla val = (bank ? 0x60 : 0x06); 1285d5add08fSSrinivas Kandagatla break; 1286d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_1P2MHZ: 1287d5add08fSSrinivas Kandagatla val = (bank ? 0x50 : 0x05); 1288d5add08fSSrinivas Kandagatla break; 1289d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_2P4MHZ: 1290d5add08fSSrinivas Kandagatla val = (bank ? 0x30 : 0x03); 1291d5add08fSSrinivas Kandagatla break; 1292d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_4P8MHZ: 1293d5add08fSSrinivas Kandagatla val = (bank ? 0x10 : 0x01); 1294d5add08fSSrinivas Kandagatla break; 1295d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_9P6MHZ: 1296d5add08fSSrinivas Kandagatla default: 1297d5add08fSSrinivas Kandagatla val = 0x00; 1298d5add08fSSrinivas Kandagatla break; 1299d5add08fSSrinivas Kandagatla } 1300d5add08fSSrinivas Kandagatla snd_soc_component_update_bits(component, WCD938X_DIGITAL_SWR_TX_CLK_RATE, 1301d5add08fSSrinivas Kandagatla mask, val); 1302d5add08fSSrinivas Kandagatla 1303d5add08fSSrinivas Kandagatla return 0; 1304d5add08fSSrinivas Kandagatla } 1305d5add08fSSrinivas Kandagatla 13068d78602aSSrinivas Kandagatla static int wcd938x_io_init(struct wcd938x_priv *wcd938x) 13078d78602aSSrinivas Kandagatla { 13088d78602aSSrinivas Kandagatla struct regmap *rm = wcd938x->regmap; 13098d78602aSSrinivas Kandagatla 13108d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x0E, 0x0E); 13118d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x80, 0x80); 13128d78602aSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 13138d78602aSSrinivas Kandagatla usleep_range(1000, 1010); 13148d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x40, 0x40); 13158d78602aSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 13168d78602aSSrinivas Kandagatla usleep_range(1000, 1010); 13178d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_LDORXTX_CONFIG, 0x10, 0x00); 13188d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_BIAS_VBG_FINE_ADJ, 13198d78602aSSrinivas Kandagatla 0xF0, 0x80); 13208d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x80, 0x80); 13218d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x40, 0x40); 13228d78602aSSrinivas Kandagatla /* 10 msec delay as per HW requirement */ 13238d78602aSSrinivas Kandagatla usleep_range(10000, 10010); 13248d78602aSSrinivas Kandagatla 13258d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x40, 0x00); 13268d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 13278d78602aSSrinivas Kandagatla 0xF0, 0x00); 13288d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 13298d78602aSSrinivas Kandagatla 0x1F, 0x15); 13308d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 13318d78602aSSrinivas Kandagatla 0x1F, 0x15); 13328d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_REFBUFF_UHQA_CTL, 13338d78602aSSrinivas Kandagatla 0xC0, 0x80); 13348d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_CDC_DMIC_CTL, 13358d78602aSSrinivas Kandagatla 0x02, 0x02); 13368d78602aSSrinivas Kandagatla 13378d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 13388d78602aSSrinivas Kandagatla 0xFF, 0x14); 13398d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 13408d78602aSSrinivas Kandagatla 0x1F, 0x08); 13418d78602aSSrinivas Kandagatla 13428d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0xFF, 0x55); 13438d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0xFF, 0x44); 13448d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0xFF, 0x11); 13458d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0xFF, 0x00); 13468d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0xFF, 0x00); 13478d78602aSSrinivas Kandagatla 13488d78602aSSrinivas Kandagatla /* Set Noise Filter Resistor value */ 13498d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB1_TEST_CTL_1, 0xE0, 0xE0); 13508d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB2_TEST_CTL_1, 0xE0, 0xE0); 13518d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB3_TEST_CTL_1, 0xE0, 0xE0); 13528d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB4_TEST_CTL_1, 0xE0, 0xE0); 13538d78602aSSrinivas Kandagatla 13548d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_3_4_TEST_BLK_EN2, 0x01, 0x00); 13558d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); 13568d78602aSSrinivas Kandagatla 13578d78602aSSrinivas Kandagatla return 0; 13588d78602aSSrinivas Kandagatla 13598d78602aSSrinivas Kandagatla } 13608d78602aSSrinivas Kandagatla 1361e8ba1e05SSrinivas Kandagatla static int wcd938x_sdw_connect_port(struct wcd938x_sdw_ch_info *ch_info, 1362e8ba1e05SSrinivas Kandagatla struct sdw_port_config *port_config, 1363e8ba1e05SSrinivas Kandagatla u32 mstr_port_num, 1364e8ba1e05SSrinivas Kandagatla u8 enable) 1365e8ba1e05SSrinivas Kandagatla { 1366e8ba1e05SSrinivas Kandagatla u8 ch_mask, port_num; 1367e8ba1e05SSrinivas Kandagatla 1368e8ba1e05SSrinivas Kandagatla port_num = ch_info->port_num; 1369e8ba1e05SSrinivas Kandagatla ch_mask = ch_info->ch_mask; 1370e8ba1e05SSrinivas Kandagatla 1371e8ba1e05SSrinivas Kandagatla port_config->num = port_num; 1372e8ba1e05SSrinivas Kandagatla 1373e8ba1e05SSrinivas Kandagatla if (enable) 1374e8ba1e05SSrinivas Kandagatla port_config->ch_mask |= ch_mask; 1375e8ba1e05SSrinivas Kandagatla else 1376e8ba1e05SSrinivas Kandagatla port_config->ch_mask &= ~ch_mask; 1377e8ba1e05SSrinivas Kandagatla 1378e8ba1e05SSrinivas Kandagatla return 0; 1379e8ba1e05SSrinivas Kandagatla } 1380e8ba1e05SSrinivas Kandagatla 1381e8ba1e05SSrinivas Kandagatla static int wcd938x_connect_port(struct wcd938x_sdw_priv *wcd, u8 ch_id, u8 enable) 1382e8ba1e05SSrinivas Kandagatla { 1383e8ba1e05SSrinivas Kandagatla u8 port_num, mstr_port_num; 1384e8ba1e05SSrinivas Kandagatla 1385e8ba1e05SSrinivas Kandagatla port_num = wcd->ch_info[ch_id].port_num; 1386e8ba1e05SSrinivas Kandagatla mstr_port_num = wcd->port_map[port_num - 1]; 1387e8ba1e05SSrinivas Kandagatla 1388e8ba1e05SSrinivas Kandagatla return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], 1389e8ba1e05SSrinivas Kandagatla &wcd->port_config[port_num], 1390e8ba1e05SSrinivas Kandagatla mstr_port_num, 1391e8ba1e05SSrinivas Kandagatla enable); 1392e8ba1e05SSrinivas Kandagatla } 1393e8ba1e05SSrinivas Kandagatla 13948da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_rxclk(struct snd_soc_dapm_widget *w, 13958da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 13968da9db0cSSrinivas Kandagatla int event) 13978da9db0cSSrinivas Kandagatla { 13988da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 13998da9db0cSSrinivas Kandagatla 14008da9db0cSSrinivas Kandagatla switch (event) { 14018da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14028da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14038da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_CLK_EN_MASK, 1); 14048da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14058da9db0cSSrinivas Kandagatla WCD938X_RX_BIAS_EN_MASK, 1); 14068da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX0_CTL, 14078da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 14088da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX1_CTL, 14098da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 14108da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX2_CTL, 14118da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 14128da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14138da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV2_CLK_EN_MASK, 1); 14148da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_AUX_AUXPA, 14158da9db0cSSrinivas Kandagatla WCD938X_AUXPA_CLK_EN_MASK, 1); 14168da9db0cSSrinivas Kandagatla break; 14178da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 14188da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14198da9db0cSSrinivas Kandagatla WCD938X_VNEG_EN_MASK, 0); 14208da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14218da9db0cSSrinivas Kandagatla WCD938X_VPOS_EN_MASK, 0); 14228da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14238da9db0cSSrinivas Kandagatla WCD938X_RX_BIAS_EN_MASK, 0); 14248da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14258da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV2_CLK_EN_MASK, 0); 14268da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14278da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_CLK_EN_MASK, 0); 14288da9db0cSSrinivas Kandagatla break; 14298da9db0cSSrinivas Kandagatla } 14308da9db0cSSrinivas Kandagatla return 0; 14318da9db0cSSrinivas Kandagatla } 14328da9db0cSSrinivas Kandagatla 14338da9db0cSSrinivas Kandagatla static int wcd938x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, 14348da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 14358da9db0cSSrinivas Kandagatla int event) 14368da9db0cSSrinivas Kandagatla { 14378da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 14388da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 14398da9db0cSSrinivas Kandagatla 14408da9db0cSSrinivas Kandagatla switch (event) { 14418da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14428da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14438da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 14448da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 0x01); 14458da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14468da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 14478da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 1); 14488da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14498da9db0cSSrinivas Kandagatla WCD938X_HPH_RDAC_CLK_CTL1, 14508da9db0cSSrinivas Kandagatla WCD938X_CHOP_CLK_EN_MASK, 0); 14518da9db0cSSrinivas Kandagatla break; 14528da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 14538da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14548da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 14558da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x02); 14568da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) { 14578da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14588da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 14598da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 1); 14608da9db0cSSrinivas Kandagatla /* 5msec compander delay as per HW requirement */ 14618da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable || (snd_soc_component_read(component, 14628da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x01)) 14638da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 14648da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 14658da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 0); 14668da9db0cSSrinivas Kandagatla } else { 14678da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14688da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 14698da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 0); 14708da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14718da9db0cSSrinivas Kandagatla WCD938X_HPH_L_EN, 14728da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_MASK, 14738da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_REGISTER); 14748da9db0cSSrinivas Kandagatla 14758da9db0cSSrinivas Kandagatla } 14768da9db0cSSrinivas Kandagatla break; 14778da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 14788da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14798da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 14808da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x1); 14818da9db0cSSrinivas Kandagatla break; 14828da9db0cSSrinivas Kandagatla } 14838da9db0cSSrinivas Kandagatla 14848da9db0cSSrinivas Kandagatla return 0; 14858da9db0cSSrinivas Kandagatla } 14868da9db0cSSrinivas Kandagatla 14878da9db0cSSrinivas Kandagatla static int wcd938x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, 14888da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 14898da9db0cSSrinivas Kandagatla int event) 14908da9db0cSSrinivas Kandagatla { 14918da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 14928da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 14938da9db0cSSrinivas Kandagatla 14948da9db0cSSrinivas Kandagatla switch (event) { 14958da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14968da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14978da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 14988da9db0cSSrinivas Kandagatla WCD938X_RXD1_CLK_EN_MASK, 1); 14998da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15008da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 15018da9db0cSSrinivas Kandagatla WCD938X_HPHR_RX_EN_MASK, 1); 15028da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15038da9db0cSSrinivas Kandagatla WCD938X_HPH_RDAC_CLK_CTL1, 15048da9db0cSSrinivas Kandagatla WCD938X_CHOP_CLK_EN_MASK, 0); 15058da9db0cSSrinivas Kandagatla break; 15068da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 15078da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15088da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 15098da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x02); 15108da9db0cSSrinivas Kandagatla if (wcd938x->comp2_enable) { 15118da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15128da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15138da9db0cSSrinivas Kandagatla WCD938X_HPHR_COMP_EN_MASK, 1); 15148da9db0cSSrinivas Kandagatla /* 5msec compander delay as per HW requirement */ 15158da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable || 15168da9db0cSSrinivas Kandagatla (snd_soc_component_read(component, 15178da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x02)) 15188da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 15198da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 15208da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 0); 15218da9db0cSSrinivas Kandagatla } else { 15228da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15238da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15248da9db0cSSrinivas Kandagatla WCD938X_HPHR_COMP_EN_MASK, 0); 15258da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15268da9db0cSSrinivas Kandagatla WCD938X_HPH_R_EN, 15278da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_MASK, 15288da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_REGISTER); 15298da9db0cSSrinivas Kandagatla } 15308da9db0cSSrinivas Kandagatla break; 15318da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 15328da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15338da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 15348da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x01); 15358da9db0cSSrinivas Kandagatla break; 15368da9db0cSSrinivas Kandagatla } 15378da9db0cSSrinivas Kandagatla 15388da9db0cSSrinivas Kandagatla return 0; 15398da9db0cSSrinivas Kandagatla } 15408da9db0cSSrinivas Kandagatla 15418da9db0cSSrinivas Kandagatla static int wcd938x_codec_ear_dac_event(struct snd_soc_dapm_widget *w, 15428da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 15438da9db0cSSrinivas Kandagatla int event) 15448da9db0cSSrinivas Kandagatla { 15458da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 15468da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 15478da9db0cSSrinivas Kandagatla 15488da9db0cSSrinivas Kandagatla switch (event) { 15498da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 15508da9db0cSSrinivas Kandagatla wcd938x->ear_rx_path = 15518da9db0cSSrinivas Kandagatla snd_soc_component_read( 15528da9db0cSSrinivas Kandagatla component, WCD938X_DIGITAL_CDC_EAR_PATH_CTL); 15538da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { 15548da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15558da9db0cSSrinivas Kandagatla WCD938X_EAR_EAR_DAC_CON, 15568da9db0cSSrinivas Kandagatla WCD938X_DAC_SAMPLE_EDGE_SEL_MASK, 0); 15578da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15588da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 15598da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 1); 15608da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15618da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 15628da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 1); 15638da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15648da9db0cSSrinivas Kandagatla WCD938X_ANA_EAR_COMPANDER_CTL, 15658da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 1); 15668da9db0cSSrinivas Kandagatla } else { 15678da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15688da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 15698da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 1); 15708da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15718da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 15728da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 1); 15738da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) 15748da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15758da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15768da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 1); 15778da9db0cSSrinivas Kandagatla } 15788da9db0cSSrinivas Kandagatla /* 5 msec delay as per HW requirement */ 15798da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 15808da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 15818da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 15828da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 0); 15838da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable++; 15848da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 15858da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_PRE_DAC, 15868da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_EAR, 15878da9db0cSSrinivas Kandagatla wcd938x->hph_mode); 15888da9db0cSSrinivas Kandagatla break; 15898da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 15908da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { 15918da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15928da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 15938da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 0); 15948da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15958da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 15968da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 0); 15978da9db0cSSrinivas Kandagatla } else { 15988da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15998da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 16008da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 0); 16018da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16028da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16038da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 0); 16048da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) 16058da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16068da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 16078da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 0); 16088da9db0cSSrinivas Kandagatla } 16098da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 16108da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 0); 16118da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16128da9db0cSSrinivas Kandagatla WCD938X_EAR_EAR_DAC_CON, 16138da9db0cSSrinivas Kandagatla WCD938X_DAC_SAMPLE_EDGE_SEL_MASK, 1); 16148da9db0cSSrinivas Kandagatla break; 16158da9db0cSSrinivas Kandagatla } 16168da9db0cSSrinivas Kandagatla return 0; 16178da9db0cSSrinivas Kandagatla 16188da9db0cSSrinivas Kandagatla } 16198da9db0cSSrinivas Kandagatla 16208da9db0cSSrinivas Kandagatla static int wcd938x_codec_aux_dac_event(struct snd_soc_dapm_widget *w, 16218da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 16228da9db0cSSrinivas Kandagatla int event) 16238da9db0cSSrinivas Kandagatla { 16248da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 16258da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 16268da9db0cSSrinivas Kandagatla int ret = 0; 16278da9db0cSSrinivas Kandagatla 16288da9db0cSSrinivas Kandagatla switch (event) { 16298da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 16308da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16318da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 16328da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV4_CLK_EN_MASK, 1); 16338da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16348da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16358da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 1); 16368da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16378da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 16388da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 1); 16398da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 16408da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 16418da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 0); 16428da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable++; 16438da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 16448da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_PRE_DAC, 16458da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_AUX, 16468da9db0cSSrinivas Kandagatla wcd938x->hph_mode); 16478da9db0cSSrinivas Kandagatla break; 16488da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 16498da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16508da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 16518da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV4_CLK_EN_MASK, 0); 16528da9db0cSSrinivas Kandagatla break; 16538da9db0cSSrinivas Kandagatla } 16548da9db0cSSrinivas Kandagatla return ret; 16558da9db0cSSrinivas Kandagatla 16568da9db0cSSrinivas Kandagatla } 16578da9db0cSSrinivas Kandagatla 16588da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, 16598da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 16608da9db0cSSrinivas Kandagatla { 16618da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 16628da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 16638da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 16648da9db0cSSrinivas Kandagatla 16658da9db0cSSrinivas Kandagatla switch (event) { 16668da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 16678da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 16688da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 16698da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 1); 16708da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, 16718da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHR, hph_mode); 16728da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); 16738da9db0cSSrinivas Kandagatla 16748da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 16758da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) { 16768da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16778da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 16788da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 1); 16798da9db0cSSrinivas Kandagatla } 16808da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 16818da9db0cSSrinivas Kandagatla WCD938X_HPHR_REF_EN_MASK, 1); 16828da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); 16838da9db0cSSrinivas Kandagatla /* 100 usec delay as per HW requirement */ 16848da9db0cSSrinivas Kandagatla usleep_range(100, 110); 16858da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 16868da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16878da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL1, 16888da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 16898da9db0cSSrinivas Kandagatla break; 16908da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 16918da9db0cSSrinivas Kandagatla /* 16928da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 16938da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 16948da9db0cSSrinivas Kandagatla * 20ms delay is required. 16958da9db0cSSrinivas Kandagatla */ 16968da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 16978da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 16988da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 16998da9db0cSSrinivas Kandagatla else 17008da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 17018da9db0cSSrinivas Kandagatla 17028da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 17038da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) 17048da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 17058da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 17068da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 0); 17078da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17088da9db0cSSrinivas Kandagatla } 17098da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 17108da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 1); 17118da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 17128da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 17138da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 17148da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 17158da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 17168da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphr_pdm_wd_int); 17178da9db0cSSrinivas Kandagatla break; 17188da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 17198da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 17208da9db0cSSrinivas Kandagatla /* 17218da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 17228da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 17238da9db0cSSrinivas Kandagatla * 20ms delay is required. 17248da9db0cSSrinivas Kandagatla */ 17258da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 17268da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 17278da9db0cSSrinivas Kandagatla else 17288da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 17298da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 17308da9db0cSSrinivas Kandagatla WCD938X_HPHR_EN_MASK, 0); 17318da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17328da9db0cSSrinivas Kandagatla break; 17338da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 17348da9db0cSSrinivas Kandagatla /* 17358da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 17368da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 17378da9db0cSSrinivas Kandagatla * 20ms delay is required. 17388da9db0cSSrinivas Kandagatla */ 17398da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 17408da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 17418da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 17428da9db0cSSrinivas Kandagatla else 17438da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 17448da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17458da9db0cSSrinivas Kandagatla } 17468da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 17478da9db0cSSrinivas Kandagatla WCD938X_HPHR_REF_EN_MASK, 0); 17488da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL1, 17498da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 17508da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 17518da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHR, hph_mode); 17528da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 17538da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 17548da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 0); 17558da9db0cSSrinivas Kandagatla break; 17568da9db0cSSrinivas Kandagatla } 17578da9db0cSSrinivas Kandagatla 17588da9db0cSSrinivas Kandagatla return 0; 17598da9db0cSSrinivas Kandagatla } 17608da9db0cSSrinivas Kandagatla 17618da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, 17628da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 17638da9db0cSSrinivas Kandagatla { 17648da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 17658da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 17668da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 17678da9db0cSSrinivas Kandagatla 17688da9db0cSSrinivas Kandagatla switch (event) { 17698da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 17708da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 17718da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 17728da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 1); 17738da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, 17748da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHL, hph_mode); 17758da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); 17768da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 17778da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) { 17788da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 17798da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 17808da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 1); 17818da9db0cSSrinivas Kandagatla } 17828da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 17838da9db0cSSrinivas Kandagatla WCD938X_HPHL_REF_EN_MASK, 1); 17848da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); 17858da9db0cSSrinivas Kandagatla /* 100 usec delay as per HW requirement */ 17868da9db0cSSrinivas Kandagatla usleep_range(100, 110); 17878da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17888da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 17898da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL0, 17908da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 17918da9db0cSSrinivas Kandagatla break; 17928da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 17938da9db0cSSrinivas Kandagatla /* 17948da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 17958da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 17968da9db0cSSrinivas Kandagatla * 20ms delay is required. 17978da9db0cSSrinivas Kandagatla */ 17988da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 17998da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 18008da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 18018da9db0cSSrinivas Kandagatla else 18028da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 18038da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 18048da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) 18058da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 18068da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 18078da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 0); 18088da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 18098da9db0cSSrinivas Kandagatla } 18108da9db0cSSrinivas Kandagatla 18118da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 18128da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 1); 18138da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 18148da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 18158da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 18168da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 18178da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 18188da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphl_pdm_wd_int); 18198da9db0cSSrinivas Kandagatla break; 18208da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 18218da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 18228da9db0cSSrinivas Kandagatla /* 18238da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 18248da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 18258da9db0cSSrinivas Kandagatla * 20ms delay is required. 18268da9db0cSSrinivas Kandagatla */ 18278da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 18288da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 18298da9db0cSSrinivas Kandagatla else 18308da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 18318da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 18328da9db0cSSrinivas Kandagatla WCD938X_HPHL_EN_MASK, 0); 18338da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 18348da9db0cSSrinivas Kandagatla break; 18358da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 18368da9db0cSSrinivas Kandagatla /* 18378da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 18388da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 18398da9db0cSSrinivas Kandagatla * 20ms delay is required. 18408da9db0cSSrinivas Kandagatla */ 18418da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 18428da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 18438da9db0cSSrinivas Kandagatla usleep_range(21000, 21100); 18448da9db0cSSrinivas Kandagatla else 18458da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 18468da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 18478da9db0cSSrinivas Kandagatla } 18488da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 18498da9db0cSSrinivas Kandagatla WCD938X_HPHL_REF_EN_MASK, 0); 18508da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL0, 18518da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 18528da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 18538da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHL, hph_mode); 18548da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 18558da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 18568da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 0); 18578da9db0cSSrinivas Kandagatla break; 18588da9db0cSSrinivas Kandagatla } 18598da9db0cSSrinivas Kandagatla 18608da9db0cSSrinivas Kandagatla return 0; 18618da9db0cSSrinivas Kandagatla } 18628da9db0cSSrinivas Kandagatla 18638da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, 18648da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 18658da9db0cSSrinivas Kandagatla { 18668da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 18678da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 18688da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 18698da9db0cSSrinivas Kandagatla int ret = 0; 18708da9db0cSSrinivas Kandagatla 18718da9db0cSSrinivas Kandagatla switch (event) { 18728da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 18738da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 18748da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 1); 18758da9db0cSSrinivas Kandagatla break; 18768da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 18778da9db0cSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 18788da9db0cSSrinivas Kandagatla usleep_range(1000, 1010); 18798da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 18808da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 18818da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 18828da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 18838da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 18848da9db0cSSrinivas Kandagatla enable_irq(wcd938x->aux_pdm_wd_int); 18858da9db0cSSrinivas Kandagatla break; 18868da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 18878da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 18888da9db0cSSrinivas Kandagatla break; 18898da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 18908da9db0cSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 18918da9db0cSSrinivas Kandagatla usleep_range(1000, 1010); 18928da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 18938da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 0); 18948da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 18958da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_POST_PA, 18968da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_AUX, 18978da9db0cSSrinivas Kandagatla hph_mode); 18988da9db0cSSrinivas Kandagatla 18998da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable--; 19008da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 19018da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 19028da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 1); 19038da9db0cSSrinivas Kandagatla break; 19048da9db0cSSrinivas Kandagatla } 19058da9db0cSSrinivas Kandagatla return ret; 19068da9db0cSSrinivas Kandagatla } 19078da9db0cSSrinivas Kandagatla 19088da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, 19098da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 19108da9db0cSSrinivas Kandagatla { 19118da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 19128da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 19138da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 19148da9db0cSSrinivas Kandagatla 19158da9db0cSSrinivas Kandagatla switch (event) { 19168da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 19178da9db0cSSrinivas Kandagatla /* 19188da9db0cSSrinivas Kandagatla * Enable watchdog interrupt for HPHL or AUX 19198da9db0cSSrinivas Kandagatla * depending on mux value 19208da9db0cSSrinivas Kandagatla */ 19218da9db0cSSrinivas Kandagatla wcd938x->ear_rx_path = snd_soc_component_read(component, 19228da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_EAR_PATH_CTL); 19238da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 19248da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 19258da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 1); 19268da9db0cSSrinivas Kandagatla else 19278da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 19288da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL0, 19298da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 19308da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 19318da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 19328da9db0cSSrinivas Kandagatla WCD938X_ANA_EAR_COMPANDER_CTL, 19338da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 1); 19348da9db0cSSrinivas Kandagatla 19358da9db0cSSrinivas Kandagatla break; 19368da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 19378da9db0cSSrinivas Kandagatla /* 6 msec delay as per HW requirement */ 19388da9db0cSSrinivas Kandagatla usleep_range(6000, 6010); 19398da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 19408da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 19418da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 19428da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 19438da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 19448da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 19458da9db0cSSrinivas Kandagatla enable_irq(wcd938x->aux_pdm_wd_int); 19468da9db0cSSrinivas Kandagatla else 19478da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphl_pdm_wd_int); 19488da9db0cSSrinivas Kandagatla break; 19498da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 19508da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 19518da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 19528da9db0cSSrinivas Kandagatla else 19538da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 19548da9db0cSSrinivas Kandagatla break; 19558da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 19568da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 19578da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 19588da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 0); 19598da9db0cSSrinivas Kandagatla /* 7 msec delay as per HW requirement */ 19608da9db0cSSrinivas Kandagatla usleep_range(7000, 7010); 19618da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 19628da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 19638da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 0); 19648da9db0cSSrinivas Kandagatla else 19658da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL0, 19668da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 19678da9db0cSSrinivas Kandagatla 19688da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 19698da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_EAR, hph_mode); 19708da9db0cSSrinivas Kandagatla 19718da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable--; 19728da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 19738da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 19748da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 1); 19758da9db0cSSrinivas Kandagatla break; 19768da9db0cSSrinivas Kandagatla } 19778da9db0cSSrinivas Kandagatla 19788da9db0cSSrinivas Kandagatla return 0; 19798da9db0cSSrinivas Kandagatla } 19808da9db0cSSrinivas Kandagatla 1981d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_dmic(struct snd_soc_dapm_widget *w, 1982d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 1983d5add08fSSrinivas Kandagatla int event) 1984d5add08fSSrinivas Kandagatla { 1985d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1986d5add08fSSrinivas Kandagatla u16 dmic_clk_reg, dmic_clk_en_reg; 1987d5add08fSSrinivas Kandagatla u8 dmic_sel_mask, dmic_clk_mask; 1988d5add08fSSrinivas Kandagatla 1989d5add08fSSrinivas Kandagatla switch (w->shift) { 1990d5add08fSSrinivas Kandagatla case 0: 1991d5add08fSSrinivas Kandagatla case 1: 1992d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2; 1993d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC1_CTL; 1994d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC1_RATE_MASK; 1995d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC1_IN_SEL_MASK; 1996d5add08fSSrinivas Kandagatla break; 1997d5add08fSSrinivas Kandagatla case 2: 1998d5add08fSSrinivas Kandagatla case 3: 1999d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2; 2000d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC2_CTL; 2001d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC2_RATE_MASK; 2002d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC3_IN_SEL_MASK; 2003d5add08fSSrinivas Kandagatla break; 2004d5add08fSSrinivas Kandagatla case 4: 2005d5add08fSSrinivas Kandagatla case 5: 2006d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_3_4; 2007d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC3_CTL; 2008d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC3_RATE_MASK; 2009d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC4_IN_SEL_MASK; 2010d5add08fSSrinivas Kandagatla break; 2011d5add08fSSrinivas Kandagatla case 6: 2012d5add08fSSrinivas Kandagatla case 7: 2013d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_3_4; 2014d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC4_CTL; 2015d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC4_RATE_MASK; 2016d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC5_IN_SEL_MASK; 2017d5add08fSSrinivas Kandagatla break; 2018d5add08fSSrinivas Kandagatla default: 2019d5add08fSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid DMIC Selection\n", 2020d5add08fSSrinivas Kandagatla __func__); 2021d5add08fSSrinivas Kandagatla return -EINVAL; 2022d5add08fSSrinivas Kandagatla } 2023d5add08fSSrinivas Kandagatla 2024d5add08fSSrinivas Kandagatla switch (event) { 2025d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2026d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2027d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AMIC_CTL, 2028d5add08fSSrinivas Kandagatla dmic_sel_mask, 2029d5add08fSSrinivas Kandagatla WCD938X_AMIC1_IN_SEL_DMIC); 2030d5add08fSSrinivas Kandagatla /* 250us sleep as per HW requirement */ 2031d5add08fSSrinivas Kandagatla usleep_range(250, 260); 2032d5add08fSSrinivas Kandagatla /* Setting DMIC clock rate to 2.4MHz */ 2033d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, dmic_clk_reg, 2034d5add08fSSrinivas Kandagatla dmic_clk_mask, 2035d5add08fSSrinivas Kandagatla WCD938X_DMIC4_RATE_2P4MHZ); 2036d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, dmic_clk_en_reg, 2037d5add08fSSrinivas Kandagatla WCD938X_DMIC_CLK_EN_MASK, 1); 2038d5add08fSSrinivas Kandagatla /* enable clock scaling */ 2039d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_DMIC_CTL, 2040d5add08fSSrinivas Kandagatla WCD938X_DMIC_CLK_SCALING_EN_MASK, 0x3); 2041d5add08fSSrinivas Kandagatla break; 2042d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2043d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2044d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AMIC_CTL, 2045d5add08fSSrinivas Kandagatla dmic_sel_mask, WCD938X_AMIC1_IN_SEL_AMIC); 2046d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, dmic_clk_en_reg, 2047d5add08fSSrinivas Kandagatla WCD938X_DMIC_CLK_EN_MASK, 0); 2048d5add08fSSrinivas Kandagatla break; 2049d5add08fSSrinivas Kandagatla } 2050d5add08fSSrinivas Kandagatla return 0; 2051d5add08fSSrinivas Kandagatla } 2052d5add08fSSrinivas Kandagatla 2053d5add08fSSrinivas Kandagatla static int wcd938x_tx_swr_ctrl(struct snd_soc_dapm_widget *w, 2054d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 2055d5add08fSSrinivas Kandagatla { 2056d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2057d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2058d5add08fSSrinivas Kandagatla int bank; 2059d5add08fSSrinivas Kandagatla int rate; 2060d5add08fSSrinivas Kandagatla 2061d5add08fSSrinivas Kandagatla bank = (wcd938x_swr_get_current_bank(wcd938x->sdw_priv[AIF1_CAP]->sdev)) ? 0 : 1; 2062d5add08fSSrinivas Kandagatla bank = bank ? 0 : 1; 2063d5add08fSSrinivas Kandagatla 2064d5add08fSSrinivas Kandagatla switch (event) { 2065d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2066d5add08fSSrinivas Kandagatla if (strnstr(w->name, "ADC", sizeof("ADC"))) { 2067d5add08fSSrinivas Kandagatla int i = 0, mode = 0; 2068d5add08fSSrinivas Kandagatla 2069d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC1, &wcd938x->status_mask)) 2070d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC1]]; 2071d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC2, &wcd938x->status_mask)) 2072d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC2]]; 2073d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC3, &wcd938x->status_mask)) 2074d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC3]]; 2075d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC4, &wcd938x->status_mask)) 2076d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC4]]; 2077d5add08fSSrinivas Kandagatla 2078d5add08fSSrinivas Kandagatla if (mode != 0) { 2079d5add08fSSrinivas Kandagatla for (i = 0; i < ADC_MODE_ULP2; i++) { 2080d5add08fSSrinivas Kandagatla if (mode & (1 << i)) { 2081d5add08fSSrinivas Kandagatla i++; 2082d5add08fSSrinivas Kandagatla break; 2083d5add08fSSrinivas Kandagatla } 2084d5add08fSSrinivas Kandagatla } 2085d5add08fSSrinivas Kandagatla } 2086d5add08fSSrinivas Kandagatla rate = wcd938x_get_clk_rate(i); 2087d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, bank); 2088d5add08fSSrinivas Kandagatla } 2089d5add08fSSrinivas Kandagatla 2090d5add08fSSrinivas Kandagatla if (strnstr(w->name, "ADC", sizeof("ADC"))) 2091d5add08fSSrinivas Kandagatla /* Copy clk settings to active bank */ 2092d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, !bank); 2093d5add08fSSrinivas Kandagatla break; 2094d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2095d5add08fSSrinivas Kandagatla if (strnstr(w->name, "ADC", sizeof("ADC"))) { 2096d5add08fSSrinivas Kandagatla rate = wcd938x_get_clk_rate(ADC_MODE_INVALID); 2097d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, !bank); 2098d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, bank); 2099d5add08fSSrinivas Kandagatla } 2100d5add08fSSrinivas Kandagatla break; 2101d5add08fSSrinivas Kandagatla } 2102d5add08fSSrinivas Kandagatla 2103d5add08fSSrinivas Kandagatla return 0; 2104d5add08fSSrinivas Kandagatla } 2105d5add08fSSrinivas Kandagatla 2106d5add08fSSrinivas Kandagatla static int wcd938x_get_adc_mode(int val) 2107d5add08fSSrinivas Kandagatla { 2108d5add08fSSrinivas Kandagatla int ret = 0; 2109d5add08fSSrinivas Kandagatla 2110d5add08fSSrinivas Kandagatla switch (val) { 2111d5add08fSSrinivas Kandagatla case ADC_MODE_INVALID: 2112d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_NORMAL; 2113d5add08fSSrinivas Kandagatla break; 2114d5add08fSSrinivas Kandagatla case ADC_MODE_HIFI: 2115d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_HIFI; 2116d5add08fSSrinivas Kandagatla break; 2117d5add08fSSrinivas Kandagatla case ADC_MODE_LO_HIF: 2118d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_LO_HIF; 2119d5add08fSSrinivas Kandagatla break; 2120d5add08fSSrinivas Kandagatla case ADC_MODE_NORMAL: 2121d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_NORMAL; 2122d5add08fSSrinivas Kandagatla break; 2123d5add08fSSrinivas Kandagatla case ADC_MODE_LP: 2124d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_LP; 2125d5add08fSSrinivas Kandagatla break; 2126d5add08fSSrinivas Kandagatla case ADC_MODE_ULP1: 2127d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_ULP1; 2128d5add08fSSrinivas Kandagatla break; 2129d5add08fSSrinivas Kandagatla case ADC_MODE_ULP2: 2130d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_ULP2; 2131d5add08fSSrinivas Kandagatla break; 2132d5add08fSSrinivas Kandagatla default: 2133d5add08fSSrinivas Kandagatla ret = -EINVAL; 2134d5add08fSSrinivas Kandagatla break; 2135d5add08fSSrinivas Kandagatla } 2136d5add08fSSrinivas Kandagatla return ret; 2137d5add08fSSrinivas Kandagatla } 2138d5add08fSSrinivas Kandagatla 2139d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_adc(struct snd_soc_dapm_widget *w, 2140d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 2141d5add08fSSrinivas Kandagatla { 2142d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2143d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2144d5add08fSSrinivas Kandagatla 2145d5add08fSSrinivas Kandagatla switch (event) { 2146d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2147d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2148d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2149d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_CLK_EN_MASK, 1); 2150d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2151d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2152d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_DIV2_CLK_EN_MASK, 1); 2153d5add08fSSrinivas Kandagatla set_bit(w->shift, &wcd938x->status_mask); 2154d5add08fSSrinivas Kandagatla break; 2155d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2156d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2157d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_CLK_EN_MASK, 0); 2158d5add08fSSrinivas Kandagatla clear_bit(w->shift, &wcd938x->status_mask); 2159d5add08fSSrinivas Kandagatla break; 2160d5add08fSSrinivas Kandagatla } 2161d5add08fSSrinivas Kandagatla 2162d5add08fSSrinivas Kandagatla return 0; 2163d5add08fSSrinivas Kandagatla } 2164d5add08fSSrinivas Kandagatla 2165d5add08fSSrinivas Kandagatla static void wcd938x_tx_channel_config(struct snd_soc_component *component, 2166d5add08fSSrinivas Kandagatla int channel, int mode) 2167d5add08fSSrinivas Kandagatla { 2168d5add08fSSrinivas Kandagatla int reg, mask; 2169d5add08fSSrinivas Kandagatla 2170d5add08fSSrinivas Kandagatla switch (channel) { 2171d5add08fSSrinivas Kandagatla case 0: 2172d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH2; 2173d5add08fSSrinivas Kandagatla mask = WCD938X_HPF1_INIT_MASK; 2174d5add08fSSrinivas Kandagatla break; 2175d5add08fSSrinivas Kandagatla case 1: 2176d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH2; 2177d5add08fSSrinivas Kandagatla mask = WCD938X_HPF2_INIT_MASK; 2178d5add08fSSrinivas Kandagatla break; 2179d5add08fSSrinivas Kandagatla case 2: 2180d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH4; 2181d5add08fSSrinivas Kandagatla mask = WCD938X_HPF3_INIT_MASK; 2182d5add08fSSrinivas Kandagatla break; 2183d5add08fSSrinivas Kandagatla case 3: 2184d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH4; 2185d5add08fSSrinivas Kandagatla mask = WCD938X_HPF4_INIT_MASK; 2186d5add08fSSrinivas Kandagatla break; 2187d5add08fSSrinivas Kandagatla } 2188d5add08fSSrinivas Kandagatla 2189d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, reg, mask, mode); 2190d5add08fSSrinivas Kandagatla } 2191d5add08fSSrinivas Kandagatla 2192d5add08fSSrinivas Kandagatla static int wcd938x_adc_enable_req(struct snd_soc_dapm_widget *w, 2193d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 2194d5add08fSSrinivas Kandagatla { 2195d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2196d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2197d5add08fSSrinivas Kandagatla int mode; 2198d5add08fSSrinivas Kandagatla 2199d5add08fSSrinivas Kandagatla switch (event) { 2200d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2201d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2202d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_REQ_CTL, 2203d5add08fSSrinivas Kandagatla WCD938X_FS_RATE_4P8_MASK, 1); 2204d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2205d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_REQ_CTL, 2206d5add08fSSrinivas Kandagatla WCD938X_NO_NOTCH_MASK, 0); 2207d5add08fSSrinivas Kandagatla wcd938x_tx_channel_config(component, w->shift, 1); 2208d5add08fSSrinivas Kandagatla mode = wcd938x_get_adc_mode(wcd938x->tx_mode[w->shift]); 2209d5add08fSSrinivas Kandagatla if (mode < 0) { 2210d5add08fSSrinivas Kandagatla dev_info(component->dev, "Invalid ADC mode\n"); 2211d5add08fSSrinivas Kandagatla return -EINVAL; 2212d5add08fSSrinivas Kandagatla } 2213d5add08fSSrinivas Kandagatla switch (w->shift) { 2214d5add08fSSrinivas Kandagatla case 0: 2215d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2216d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2217d5add08fSSrinivas Kandagatla WCD938X_TXD0_MODE_MASK, mode); 2218d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2219d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2220d5add08fSSrinivas Kandagatla WCD938X_TXD0_CLK_EN_MASK, 1); 2221d5add08fSSrinivas Kandagatla break; 2222d5add08fSSrinivas Kandagatla case 1: 2223d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2224d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2225d5add08fSSrinivas Kandagatla WCD938X_TXD1_MODE_MASK, mode); 2226d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2227d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2228d5add08fSSrinivas Kandagatla WCD938X_TXD1_CLK_EN_MASK, 1); 2229d5add08fSSrinivas Kandagatla break; 2230d5add08fSSrinivas Kandagatla case 2: 2231d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2232d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2233d5add08fSSrinivas Kandagatla WCD938X_TXD2_MODE_MASK, mode); 2234d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2235d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2236d5add08fSSrinivas Kandagatla WCD938X_TXD2_CLK_EN_MASK, 1); 2237d5add08fSSrinivas Kandagatla break; 2238d5add08fSSrinivas Kandagatla case 3: 2239d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2240d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2241d5add08fSSrinivas Kandagatla WCD938X_TXD3_MODE_MASK, mode); 2242d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2243d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2244d5add08fSSrinivas Kandagatla WCD938X_TXD3_CLK_EN_MASK, 1); 2245d5add08fSSrinivas Kandagatla break; 2246d5add08fSSrinivas Kandagatla default: 2247d5add08fSSrinivas Kandagatla break; 2248d5add08fSSrinivas Kandagatla } 2249d5add08fSSrinivas Kandagatla 2250d5add08fSSrinivas Kandagatla wcd938x_tx_channel_config(component, w->shift, 0); 2251d5add08fSSrinivas Kandagatla break; 2252d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2253d5add08fSSrinivas Kandagatla switch (w->shift) { 2254d5add08fSSrinivas Kandagatla case 0: 2255d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2256d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2257d5add08fSSrinivas Kandagatla WCD938X_TXD0_MODE_MASK, 0); 2258d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2259d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2260d5add08fSSrinivas Kandagatla WCD938X_TXD0_CLK_EN_MASK, 0); 2261d5add08fSSrinivas Kandagatla break; 2262d5add08fSSrinivas Kandagatla case 1: 2263d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2264d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2265d5add08fSSrinivas Kandagatla WCD938X_TXD1_MODE_MASK, 0); 2266d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2267d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2268d5add08fSSrinivas Kandagatla WCD938X_TXD1_CLK_EN_MASK, 0); 2269d5add08fSSrinivas Kandagatla break; 2270d5add08fSSrinivas Kandagatla case 2: 2271d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2272d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2273d5add08fSSrinivas Kandagatla WCD938X_TXD2_MODE_MASK, 0); 2274d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2275d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2276d5add08fSSrinivas Kandagatla WCD938X_TXD2_CLK_EN_MASK, 0); 2277d5add08fSSrinivas Kandagatla break; 2278d5add08fSSrinivas Kandagatla case 3: 2279d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2280d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2281d5add08fSSrinivas Kandagatla WCD938X_TXD3_MODE_MASK, 0); 2282d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2283d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2284d5add08fSSrinivas Kandagatla WCD938X_TXD3_CLK_EN_MASK, 0); 2285d5add08fSSrinivas Kandagatla break; 2286d5add08fSSrinivas Kandagatla default: 2287d5add08fSSrinivas Kandagatla break; 2288d5add08fSSrinivas Kandagatla } 2289d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2290d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2291d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_DIV2_CLK_EN_MASK, 0); 2292d5add08fSSrinivas Kandagatla break; 2293d5add08fSSrinivas Kandagatla } 2294d5add08fSSrinivas Kandagatla 2295d5add08fSSrinivas Kandagatla return 0; 2296d5add08fSSrinivas Kandagatla } 2297d5add08fSSrinivas Kandagatla 2298d5add08fSSrinivas Kandagatla static int wcd938x_micbias_control(struct snd_soc_component *component, 2299d5add08fSSrinivas Kandagatla int micb_num, int req, bool is_dapm) 2300d5add08fSSrinivas Kandagatla { 2301d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2302d5add08fSSrinivas Kandagatla int micb_index = micb_num - 1; 2303d5add08fSSrinivas Kandagatla u16 micb_reg; 2304d5add08fSSrinivas Kandagatla 2305d5add08fSSrinivas Kandagatla switch (micb_num) { 2306d5add08fSSrinivas Kandagatla case MIC_BIAS_1: 2307d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB1; 2308d5add08fSSrinivas Kandagatla break; 2309d5add08fSSrinivas Kandagatla case MIC_BIAS_2: 2310d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB2; 2311d5add08fSSrinivas Kandagatla break; 2312d5add08fSSrinivas Kandagatla case MIC_BIAS_3: 2313d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB3; 2314d5add08fSSrinivas Kandagatla break; 2315d5add08fSSrinivas Kandagatla case MIC_BIAS_4: 2316d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB4; 2317d5add08fSSrinivas Kandagatla break; 2318d5add08fSSrinivas Kandagatla default: 2319d5add08fSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid micbias number: %d\n", 2320d5add08fSSrinivas Kandagatla __func__, micb_num); 2321d5add08fSSrinivas Kandagatla return -EINVAL; 2322d5add08fSSrinivas Kandagatla } 2323d5add08fSSrinivas Kandagatla 2324d5add08fSSrinivas Kandagatla switch (req) { 2325d5add08fSSrinivas Kandagatla case MICB_PULLUP_ENABLE: 2326d5add08fSSrinivas Kandagatla wcd938x->pullup_ref[micb_index]++; 2327d5add08fSSrinivas Kandagatla if ((wcd938x->pullup_ref[micb_index] == 1) && 2328d5add08fSSrinivas Kandagatla (wcd938x->micb_ref[micb_index] == 0)) 2329d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2330d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 2331d5add08fSSrinivas Kandagatla WCD938X_MICB_PULL_UP); 2332d5add08fSSrinivas Kandagatla break; 2333d5add08fSSrinivas Kandagatla case MICB_PULLUP_DISABLE: 2334d5add08fSSrinivas Kandagatla if (wcd938x->pullup_ref[micb_index] > 0) 2335d5add08fSSrinivas Kandagatla wcd938x->pullup_ref[micb_index]--; 2336d5add08fSSrinivas Kandagatla 2337d5add08fSSrinivas Kandagatla if ((wcd938x->pullup_ref[micb_index] == 0) && 2338d5add08fSSrinivas Kandagatla (wcd938x->micb_ref[micb_index] == 0)) 2339d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2340d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 0); 2341d5add08fSSrinivas Kandagatla break; 2342d5add08fSSrinivas Kandagatla case MICB_ENABLE: 2343d5add08fSSrinivas Kandagatla wcd938x->micb_ref[micb_index]++; 2344d5add08fSSrinivas Kandagatla if (wcd938x->micb_ref[micb_index] == 1) { 2345d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2346d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2347d5add08fSSrinivas Kandagatla WCD938X_TX_CLK_EN_MASK, 0xF); 2348d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2349d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2350d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_DIV2_CLK_EN_MASK, 1); 2351d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2352d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 2353d5add08fSSrinivas Kandagatla WCD938X_TX_SC_CLK_EN_MASK, 1); 2354d5add08fSSrinivas Kandagatla 2355d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2356d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 2357d5add08fSSrinivas Kandagatla WCD938X_MICB_ENABLE); 2358d5add08fSSrinivas Kandagatla } 2359d5add08fSSrinivas Kandagatla 2360d5add08fSSrinivas Kandagatla break; 2361d5add08fSSrinivas Kandagatla case MICB_DISABLE: 2362d5add08fSSrinivas Kandagatla if (wcd938x->micb_ref[micb_index] > 0) 2363d5add08fSSrinivas Kandagatla wcd938x->micb_ref[micb_index]--; 2364d5add08fSSrinivas Kandagatla 2365d5add08fSSrinivas Kandagatla if ((wcd938x->micb_ref[micb_index] == 0) && 2366d5add08fSSrinivas Kandagatla (wcd938x->pullup_ref[micb_index] > 0)) 2367d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2368d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 2369d5add08fSSrinivas Kandagatla WCD938X_MICB_PULL_UP); 2370d5add08fSSrinivas Kandagatla else if ((wcd938x->micb_ref[micb_index] == 0) && 2371d5add08fSSrinivas Kandagatla (wcd938x->pullup_ref[micb_index] == 0)) { 2372d5add08fSSrinivas Kandagatla 2373d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2374d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 0); 2375d5add08fSSrinivas Kandagatla } 2376d5add08fSSrinivas Kandagatla break; 2377d5add08fSSrinivas Kandagatla } 2378d5add08fSSrinivas Kandagatla 2379d5add08fSSrinivas Kandagatla return 0; 2380d5add08fSSrinivas Kandagatla } 2381d5add08fSSrinivas Kandagatla 2382d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_micbias(struct snd_soc_dapm_widget *w, 2383d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 2384d5add08fSSrinivas Kandagatla int event) 2385d5add08fSSrinivas Kandagatla { 2386d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2387d5add08fSSrinivas Kandagatla int micb_num = w->shift; 2388d5add08fSSrinivas Kandagatla 2389d5add08fSSrinivas Kandagatla switch (event) { 2390d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2391d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, MICB_ENABLE, true); 2392d5add08fSSrinivas Kandagatla break; 2393d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 2394d5add08fSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 2395d5add08fSSrinivas Kandagatla usleep_range(1000, 1100); 2396d5add08fSSrinivas Kandagatla break; 2397d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2398d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, MICB_DISABLE, true); 2399d5add08fSSrinivas Kandagatla break; 2400d5add08fSSrinivas Kandagatla } 2401d5add08fSSrinivas Kandagatla 2402d5add08fSSrinivas Kandagatla return 0; 2403d5add08fSSrinivas Kandagatla } 2404d5add08fSSrinivas Kandagatla 2405d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, 2406d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 2407d5add08fSSrinivas Kandagatla int event) 2408d5add08fSSrinivas Kandagatla { 2409d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2410d5add08fSSrinivas Kandagatla int micb_num = w->shift; 2411d5add08fSSrinivas Kandagatla 2412d5add08fSSrinivas Kandagatla switch (event) { 2413d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2414d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, 2415d5add08fSSrinivas Kandagatla MICB_PULLUP_ENABLE, true); 2416d5add08fSSrinivas Kandagatla break; 2417d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 2418d5add08fSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 2419d5add08fSSrinivas Kandagatla usleep_range(1000, 1100); 2420d5add08fSSrinivas Kandagatla break; 2421d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2422d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, 2423d5add08fSSrinivas Kandagatla MICB_PULLUP_DISABLE, true); 2424d5add08fSSrinivas Kandagatla break; 2425d5add08fSSrinivas Kandagatla } 2426d5add08fSSrinivas Kandagatla 2427d5add08fSSrinivas Kandagatla return 0; 2428d5add08fSSrinivas Kandagatla } 2429d5add08fSSrinivas Kandagatla 2430e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_get(struct snd_kcontrol *kcontrol, 2431e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2432e8ba1e05SSrinivas Kandagatla { 2433e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2434e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2435e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2436e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 2437e8ba1e05SSrinivas Kandagatla 2438e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->tx_mode[path]; 2439e8ba1e05SSrinivas Kandagatla 2440e8ba1e05SSrinivas Kandagatla return 0; 2441e8ba1e05SSrinivas Kandagatla } 2442e8ba1e05SSrinivas Kandagatla 2443e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_put(struct snd_kcontrol *kcontrol, 2444e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2445e8ba1e05SSrinivas Kandagatla { 2446e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2447e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2448e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2449e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 2450e8ba1e05SSrinivas Kandagatla 2451e8ba1e05SSrinivas Kandagatla wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0]; 2452e8ba1e05SSrinivas Kandagatla 2453e8ba1e05SSrinivas Kandagatla return 1; 2454e8ba1e05SSrinivas Kandagatla } 2455e8ba1e05SSrinivas Kandagatla 2456e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, 2457e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2458e8ba1e05SSrinivas Kandagatla { 2459e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2460e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2461e8ba1e05SSrinivas Kandagatla 2462e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->hph_mode; 2463e8ba1e05SSrinivas Kandagatla 2464e8ba1e05SSrinivas Kandagatla return 0; 2465e8ba1e05SSrinivas Kandagatla } 2466e8ba1e05SSrinivas Kandagatla 2467e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, 2468e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2469e8ba1e05SSrinivas Kandagatla { 2470e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2471e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2472e8ba1e05SSrinivas Kandagatla 2473e8ba1e05SSrinivas Kandagatla wcd938x->hph_mode = ucontrol->value.enumerated.item[0]; 2474e8ba1e05SSrinivas Kandagatla 2475e8ba1e05SSrinivas Kandagatla return 1; 2476e8ba1e05SSrinivas Kandagatla } 2477e8ba1e05SSrinivas Kandagatla 2478e8ba1e05SSrinivas Kandagatla static int wcd938x_ear_pa_put_gain(struct snd_kcontrol *kcontrol, 2479e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2480e8ba1e05SSrinivas Kandagatla { 2481e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2482e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2483e8ba1e05SSrinivas Kandagatla 2484e8ba1e05SSrinivas Kandagatla if (wcd938x->comp1_enable) { 2485e8ba1e05SSrinivas Kandagatla dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n"); 2486e8ba1e05SSrinivas Kandagatla return -EINVAL; 2487e8ba1e05SSrinivas Kandagatla } 2488e8ba1e05SSrinivas Kandagatla 2489e8ba1e05SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 2490e8ba1e05SSrinivas Kandagatla WCD938X_EAR_GAIN_MASK, 2491e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0]); 2492e8ba1e05SSrinivas Kandagatla 2493e8ba1e05SSrinivas Kandagatla return 0; 2494e8ba1e05SSrinivas Kandagatla } 2495e8ba1e05SSrinivas Kandagatla 2496e8ba1e05SSrinivas Kandagatla static int wcd938x_get_compander(struct snd_kcontrol *kcontrol, 2497e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2498e8ba1e05SSrinivas Kandagatla { 2499e8ba1e05SSrinivas Kandagatla 2500e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2501e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2502e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 2503e8ba1e05SSrinivas Kandagatla bool hphr; 2504e8ba1e05SSrinivas Kandagatla 2505e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 2506e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 2507e8ba1e05SSrinivas Kandagatla 2508e8ba1e05SSrinivas Kandagatla if (hphr) 2509e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp2_enable; 2510e8ba1e05SSrinivas Kandagatla else 2511e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp1_enable; 2512e8ba1e05SSrinivas Kandagatla 2513e8ba1e05SSrinivas Kandagatla return 0; 2514e8ba1e05SSrinivas Kandagatla } 2515e8ba1e05SSrinivas Kandagatla 2516e8ba1e05SSrinivas Kandagatla static int wcd938x_set_compander(struct snd_kcontrol *kcontrol, 2517e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2518e8ba1e05SSrinivas Kandagatla { 2519e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2520e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2521e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2522e8ba1e05SSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 2523e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 2524e8ba1e05SSrinivas Kandagatla bool hphr; 2525e8ba1e05SSrinivas Kandagatla 2526e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 2527e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 2528e8ba1e05SSrinivas Kandagatla 2529e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[AIF1_PB]; 2530e8ba1e05SSrinivas Kandagatla 2531e8ba1e05SSrinivas Kandagatla if (hphr) 2532e8ba1e05SSrinivas Kandagatla wcd938x->comp2_enable = value; 2533e8ba1e05SSrinivas Kandagatla else 2534e8ba1e05SSrinivas Kandagatla wcd938x->comp1_enable = value; 2535e8ba1e05SSrinivas Kandagatla 2536e8ba1e05SSrinivas Kandagatla if (value) 2537e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, mc->reg, true); 2538e8ba1e05SSrinivas Kandagatla else 2539e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, mc->reg, false); 2540e8ba1e05SSrinivas Kandagatla 2541e8ba1e05SSrinivas Kandagatla return 0; 2542e8ba1e05SSrinivas Kandagatla } 2543e8ba1e05SSrinivas Kandagatla 2544e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol, 2545e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2546e8ba1e05SSrinivas Kandagatla { 2547e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2548e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2549e8ba1e05SSrinivas Kandagatla 2550e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->ldoh; 2551e8ba1e05SSrinivas Kandagatla 2552e8ba1e05SSrinivas Kandagatla return 0; 2553e8ba1e05SSrinivas Kandagatla } 2554e8ba1e05SSrinivas Kandagatla 2555e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_put(struct snd_kcontrol *kcontrol, 2556e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2557e8ba1e05SSrinivas Kandagatla { 2558e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2559e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2560e8ba1e05SSrinivas Kandagatla 2561e8ba1e05SSrinivas Kandagatla wcd938x->ldoh = ucontrol->value.integer.value[0]; 2562e8ba1e05SSrinivas Kandagatla 2563e8ba1e05SSrinivas Kandagatla return 1; 2564e8ba1e05SSrinivas Kandagatla } 2565e8ba1e05SSrinivas Kandagatla 2566e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_get(struct snd_kcontrol *kcontrol, 2567e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2568e8ba1e05SSrinivas Kandagatla { 2569e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2570e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2571e8ba1e05SSrinivas Kandagatla 2572e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->bcs_dis; 2573e8ba1e05SSrinivas Kandagatla 2574e8ba1e05SSrinivas Kandagatla return 0; 2575e8ba1e05SSrinivas Kandagatla } 2576e8ba1e05SSrinivas Kandagatla 2577e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, 2578e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2579e8ba1e05SSrinivas Kandagatla { 2580e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2581e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2582e8ba1e05SSrinivas Kandagatla 2583e8ba1e05SSrinivas Kandagatla wcd938x->bcs_dis = ucontrol->value.integer.value[0]; 2584e8ba1e05SSrinivas Kandagatla 2585e8ba1e05SSrinivas Kandagatla return 1; 2586e8ba1e05SSrinivas Kandagatla } 2587e8ba1e05SSrinivas Kandagatla 2588e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text_wcd9380[] = { 2589e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 2590e8ba1e05SSrinivas Kandagatla }; 2591e8ba1e05SSrinivas Kandagatla 2592e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text[] = { 2593e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 2594e8ba1e05SSrinivas Kandagatla "ADC_ULP1", "ADC_ULP2", 2595e8ba1e05SSrinivas Kandagatla }; 2596e8ba1e05SSrinivas Kandagatla 2597e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text_wcd9380[] = { 2598e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_INVALID_1", "CLS_H_LP", "CLS_AB", 2599e8ba1e05SSrinivas Kandagatla "CLS_H_LOHIFI", "CLS_H_ULP", "CLS_H_INVALID_2", "CLS_AB_LP", 2600e8ba1e05SSrinivas Kandagatla "CLS_AB_LOHIFI", 2601e8ba1e05SSrinivas Kandagatla }; 2602e8ba1e05SSrinivas Kandagatla 2603e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text[] = { 2604e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", 2605e8ba1e05SSrinivas Kandagatla "CLS_H_ULP", "CLS_AB_HIFI", "CLS_AB_LP", "CLS_AB_LOHIFI", 2606e8ba1e05SSrinivas Kandagatla }; 2607e8ba1e05SSrinivas Kandagatla 26088da9db0cSSrinivas Kandagatla static const char * const adc2_mux_text[] = { 26098da9db0cSSrinivas Kandagatla "INP2", "INP3" 26108da9db0cSSrinivas Kandagatla }; 26118da9db0cSSrinivas Kandagatla 26128da9db0cSSrinivas Kandagatla static const char * const adc3_mux_text[] = { 26138da9db0cSSrinivas Kandagatla "INP4", "INP6" 26148da9db0cSSrinivas Kandagatla }; 26158da9db0cSSrinivas Kandagatla 26168da9db0cSSrinivas Kandagatla static const char * const adc4_mux_text[] = { 26178da9db0cSSrinivas Kandagatla "INP5", "INP7" 26188da9db0cSSrinivas Kandagatla }; 26198da9db0cSSrinivas Kandagatla 26208da9db0cSSrinivas Kandagatla static const char * const rdac3_mux_text[] = { 26218da9db0cSSrinivas Kandagatla "RX1", "RX3" 26228da9db0cSSrinivas Kandagatla }; 26238da9db0cSSrinivas Kandagatla 26248da9db0cSSrinivas Kandagatla static const char * const hdr12_mux_text[] = { 26258da9db0cSSrinivas Kandagatla "NO_HDR12", "HDR12" 26268da9db0cSSrinivas Kandagatla }; 26278da9db0cSSrinivas Kandagatla 26288da9db0cSSrinivas Kandagatla static const char * const hdr34_mux_text[] = { 26298da9db0cSSrinivas Kandagatla "NO_HDR34", "HDR34" 26308da9db0cSSrinivas Kandagatla }; 26318da9db0cSSrinivas Kandagatla 2632e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9380 = 2633e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2634e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2635e8ba1e05SSrinivas Kandagatla 2636e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9380 = 2637e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2638e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2639e8ba1e05SSrinivas Kandagatla 2640e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9380 = 2641e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2642e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2643e8ba1e05SSrinivas Kandagatla 2644e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9380 = 2645e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2646e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2647e8ba1e05SSrinivas Kandagatla 2648e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9385 = 2649e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text), 2650e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2651e8ba1e05SSrinivas Kandagatla 2652e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9385 = 2653e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text), 2654e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2655e8ba1e05SSrinivas Kandagatla 2656e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9385 = 2657e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text), 2658e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2659e8ba1e05SSrinivas Kandagatla 2660e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9385 = 2661e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text), 2662e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2663e8ba1e05SSrinivas Kandagatla 2664e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 = 2665e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380), 2666e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text_wcd9380); 2667e8ba1e05SSrinivas Kandagatla 2668e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum = 2669e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), 2670e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text); 2671e8ba1e05SSrinivas Kandagatla 2672d5add08fSSrinivas Kandagatla static const struct soc_enum adc2_enum = 2673d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 7, 2674d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc2_mux_text), adc2_mux_text); 2675d5add08fSSrinivas Kandagatla 2676d5add08fSSrinivas Kandagatla static const struct soc_enum adc3_enum = 2677d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 6, 2678d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc3_mux_text), adc3_mux_text); 2679d5add08fSSrinivas Kandagatla 2680d5add08fSSrinivas Kandagatla static const struct soc_enum adc4_enum = 2681d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 5, 2682d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc4_mux_text), adc4_mux_text); 2683d5add08fSSrinivas Kandagatla 2684d5add08fSSrinivas Kandagatla static const struct soc_enum hdr12_enum = 2685d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 4, 2686d5add08fSSrinivas Kandagatla ARRAY_SIZE(hdr12_mux_text), hdr12_mux_text); 2687d5add08fSSrinivas Kandagatla 2688d5add08fSSrinivas Kandagatla static const struct soc_enum hdr34_enum = 2689d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 3, 2690d5add08fSSrinivas Kandagatla ARRAY_SIZE(hdr34_mux_text), hdr34_mux_text); 2691d5add08fSSrinivas Kandagatla 26928da9db0cSSrinivas Kandagatla static const struct soc_enum rdac3_enum = 26938da9db0cSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0, 26948da9db0cSSrinivas Kandagatla ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text); 26958da9db0cSSrinivas Kandagatla 2696d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc1_switch[] = { 2697d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2698d5add08fSSrinivas Kandagatla }; 2699d5add08fSSrinivas Kandagatla 2700d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc2_switch[] = { 2701d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2702d5add08fSSrinivas Kandagatla }; 2703d5add08fSSrinivas Kandagatla 2704d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc3_switch[] = { 2705d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2706d5add08fSSrinivas Kandagatla }; 2707d5add08fSSrinivas Kandagatla 2708d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc4_switch[] = { 2709d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2710d5add08fSSrinivas Kandagatla }; 2711d5add08fSSrinivas Kandagatla 2712d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic1_switch[] = { 2713d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2714d5add08fSSrinivas Kandagatla }; 2715d5add08fSSrinivas Kandagatla 2716d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic2_switch[] = { 2717d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2718d5add08fSSrinivas Kandagatla }; 2719d5add08fSSrinivas Kandagatla 2720d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic3_switch[] = { 2721d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2722d5add08fSSrinivas Kandagatla }; 2723d5add08fSSrinivas Kandagatla 2724d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic4_switch[] = { 2725d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2726d5add08fSSrinivas Kandagatla }; 2727d5add08fSSrinivas Kandagatla 2728d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic5_switch[] = { 2729d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2730d5add08fSSrinivas Kandagatla }; 2731d5add08fSSrinivas Kandagatla 2732d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic6_switch[] = { 2733d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2734d5add08fSSrinivas Kandagatla }; 2735d5add08fSSrinivas Kandagatla 2736d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic7_switch[] = { 2737d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2738d5add08fSSrinivas Kandagatla }; 2739d5add08fSSrinivas Kandagatla 2740d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic8_switch[] = { 2741d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2742d5add08fSSrinivas Kandagatla }; 2743d5add08fSSrinivas Kandagatla 27448da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new ear_rdac_switch[] = { 27458da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 27468da9db0cSSrinivas Kandagatla }; 27478da9db0cSSrinivas Kandagatla 27488da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new aux_rdac_switch[] = { 27498da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 27508da9db0cSSrinivas Kandagatla }; 27518da9db0cSSrinivas Kandagatla 27528da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new hphl_rdac_switch[] = { 27538da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 27548da9db0cSSrinivas Kandagatla }; 27558da9db0cSSrinivas Kandagatla 27568da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new hphr_rdac_switch[] = { 27578da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 27588da9db0cSSrinivas Kandagatla }; 27598da9db0cSSrinivas Kandagatla 2760d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc2_mux = 2761d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum); 2762d5add08fSSrinivas Kandagatla 2763d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc3_mux = 2764d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("ADC3 MUX Mux", adc3_enum); 2765d5add08fSSrinivas Kandagatla 2766d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc4_mux = 2767d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("ADC4 MUX Mux", adc4_enum); 2768d5add08fSSrinivas Kandagatla 2769d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_hdr12_mux = 2770d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("HDR12 MUX Mux", hdr12_enum); 2771d5add08fSSrinivas Kandagatla 2772d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_hdr34_mux = 2773d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("HDR34 MUX Mux", hdr34_enum); 2774d5add08fSSrinivas Kandagatla 27758da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new rx_rdac3_mux = 27768da9db0cSSrinivas Kandagatla SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum); 27778da9db0cSSrinivas Kandagatla 2778e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9380_snd_controls[] = { 2779e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380, 2780e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 2781e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9380, 2782e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2783e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9380, 2784e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2785e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9380, 2786e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2787e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9380, 2788e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2789e8ba1e05SSrinivas Kandagatla }; 2790e8ba1e05SSrinivas Kandagatla 2791e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9385_snd_controls[] = { 2792e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, 2793e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 2794e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9385, 2795e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2796e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9385, 2797e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2798e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9385, 2799e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2800e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9385, 2801e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2802e8ba1e05SSrinivas Kandagatla }; 2803e8ba1e05SSrinivas Kandagatla 2804e8ba1e05SSrinivas Kandagatla static int wcd938x_get_swr_port(struct snd_kcontrol *kcontrol, 2805e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2806e8ba1e05SSrinivas Kandagatla { 2807e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 2808e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 2809e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2810e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 2811e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 2812e8ba1e05SSrinivas Kandagatla int portidx = mixer->reg; 2813e8ba1e05SSrinivas Kandagatla 2814e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 2815e8ba1e05SSrinivas Kandagatla 2816e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; 2817e8ba1e05SSrinivas Kandagatla 2818e8ba1e05SSrinivas Kandagatla return 0; 2819e8ba1e05SSrinivas Kandagatla } 2820e8ba1e05SSrinivas Kandagatla 2821e8ba1e05SSrinivas Kandagatla static int wcd938x_set_swr_port(struct snd_kcontrol *kcontrol, 2822e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2823e8ba1e05SSrinivas Kandagatla { 2824e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 2825e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 2826e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2827e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = 2828e8ba1e05SSrinivas Kandagatla (struct soc_mixer_control *)kcontrol->private_value; 2829e8ba1e05SSrinivas Kandagatla int portidx = mixer->reg; 2830e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 2831e8ba1e05SSrinivas Kandagatla bool enable; 2832e8ba1e05SSrinivas Kandagatla 2833e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 2834e8ba1e05SSrinivas Kandagatla 2835e8ba1e05SSrinivas Kandagatla if (ucontrol->value.integer.value[0]) 2836e8ba1e05SSrinivas Kandagatla enable = true; 2837e8ba1e05SSrinivas Kandagatla else 2838e8ba1e05SSrinivas Kandagatla enable = false; 2839e8ba1e05SSrinivas Kandagatla 2840e8ba1e05SSrinivas Kandagatla wcd->port_enable[portidx] = enable; 2841e8ba1e05SSrinivas Kandagatla 2842e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, portidx, enable); 2843e8ba1e05SSrinivas Kandagatla 2844e8ba1e05SSrinivas Kandagatla return 0; 2845e8ba1e05SSrinivas Kandagatla 2846e8ba1e05SSrinivas Kandagatla } 2847e8ba1e05SSrinivas Kandagatla 2848e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd938x_snd_controls[] = { 2849e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL_COMP Switch", WCD938X_COMP_L, 0, 1, 0, 2850e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 2851e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR_COMP Switch", WCD938X_COMP_R, 1, 1, 0, 2852e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 2853e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL Switch", WCD938X_HPH_L, 0, 1, 0, 2854e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2855e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR Switch", WCD938X_HPH_R, 0, 1, 0, 2856e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2857e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("CLSH Switch", WCD938X_CLSH, 0, 1, 0, 2858e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2859e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LO Switch", WCD938X_LO, 0, 1, 0, 2860e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2861e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_L Switch", WCD938X_DSD_L, 0, 1, 0, 2862e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2863e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_R Switch", WCD938X_DSD_R, 0, 1, 0, 2864e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2865e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 0x18, 0, line_gain), 2866e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 0x18, 0, line_gain), 2867e8ba1e05SSrinivas Kandagatla WCD938X_EAR_PA_GAIN_TLV("EAR_PA Volume", WCD938X_ANA_EAR_COMPANDER_CTL, 2868e8ba1e05SSrinivas Kandagatla 2, 0x10, 0, ear_pa_gain), 2869e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC1 Switch", WCD938X_ADC1, 1, 1, 0, 2870e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2871e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2 Switch", WCD938X_ADC2, 1, 1, 0, 2872e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2873e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC3 Switch", WCD938X_ADC3, 1, 1, 0, 2874e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2875e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC4 Switch", WCD938X_ADC4, 1, 1, 0, 2876e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2877e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC0 Switch", WCD938X_DMIC0, 1, 1, 0, 2878e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2879e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC1 Switch", WCD938X_DMIC1, 1, 1, 0, 2880e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2881e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("MBHC Switch", WCD938X_MBHC, 1, 1, 0, 2882e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2883e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC2 Switch", WCD938X_DMIC2, 1, 1, 0, 2884e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2885e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC3 Switch", WCD938X_DMIC3, 1, 1, 0, 2886e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2887e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC4 Switch", WCD938X_DMIC4, 1, 1, 0, 2888e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2889e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC5 Switch", WCD938X_DMIC5, 1, 1, 0, 2890e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2891e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC6 Switch", WCD938X_DMIC6, 1, 1, 0, 2892e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2893e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC7 Switch", WCD938X_DMIC7, 1, 1, 0, 2894e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2895e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LDOH Enable Switch", SND_SOC_NOPM, 0, 1, 0, 2896e8ba1e05SSrinivas Kandagatla wcd938x_ldoh_get, wcd938x_ldoh_put), 2897e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2_BCS Disable Switch", SND_SOC_NOPM, 0, 1, 0, 2898e8ba1e05SSrinivas Kandagatla wcd938x_bcs_get, wcd938x_bcs_put), 2899e8ba1e05SSrinivas Kandagatla 2900e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC1 Volume", WCD938X_ANA_TX_CH1, 0, 20, 0, analog_gain), 2901e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC2 Volume", WCD938X_ANA_TX_CH2, 0, 20, 0, analog_gain), 2902e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC3 Volume", WCD938X_ANA_TX_CH3, 0, 20, 0, analog_gain), 2903e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC4 Volume", WCD938X_ANA_TX_CH4, 0, 20, 0, analog_gain), 2904e8ba1e05SSrinivas Kandagatla }; 2905e8ba1e05SSrinivas Kandagatla 29068da9db0cSSrinivas Kandagatla static const struct snd_soc_dapm_widget wcd938x_dapm_widgets[] = { 2907d5add08fSSrinivas Kandagatla 2908d5add08fSSrinivas Kandagatla /*input widgets*/ 2909d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC1"), 2910d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC2"), 2911d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC3"), 2912d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC4"), 2913d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC5"), 2914d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC6"), 2915d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC7"), 2916d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic1", NULL), 2917d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic2", NULL), 2918d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic3", NULL), 2919d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic4", NULL), 2920d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic5", NULL), 2921d5add08fSSrinivas Kandagatla 2922d5add08fSSrinivas Kandagatla /*tx widgets*/ 2923d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0, 2924d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 2925d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2926d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0, 2927d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 2928d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2929d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0, 2930d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 2931d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2932d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC4", NULL, SND_SOC_NOPM, 3, 0, 2933d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 2934d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2935d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, 2936d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2937d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2938d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0, 2939d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2940d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2941d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0, 2942d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2943d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2944d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0, 2945d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2946d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2947d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0, 2948d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2949d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2950d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0, 2951d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2952d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2953d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC7", NULL, SND_SOC_NOPM, 6, 0, 2954d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2955d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2956d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC8", NULL, SND_SOC_NOPM, 7, 0, 2957d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 2958d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2959d5add08fSSrinivas Kandagatla 2960d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC1 REQ", SND_SOC_NOPM, 0, 0, 2961d5add08fSSrinivas Kandagatla NULL, 0, wcd938x_adc_enable_req, 2962d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2963d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 1, 0, 2964d5add08fSSrinivas Kandagatla NULL, 0, wcd938x_adc_enable_req, 2965d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2966d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC3 REQ", SND_SOC_NOPM, 2, 0, 2967d5add08fSSrinivas Kandagatla NULL, 0, wcd938x_adc_enable_req, 2968d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2969d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC4 REQ", SND_SOC_NOPM, 3, 0, NULL, 0, 2970d5add08fSSrinivas Kandagatla wcd938x_adc_enable_req, 2971d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2972d5add08fSSrinivas Kandagatla 2973d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux), 2974d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("ADC3 MUX", SND_SOC_NOPM, 0, 0, &tx_adc3_mux), 2975d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("ADC4 MUX", SND_SOC_NOPM, 0, 0, &tx_adc4_mux), 2976d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("HDR12 MUX", SND_SOC_NOPM, 0, 0, &tx_hdr12_mux), 2977d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("HDR34 MUX", SND_SOC_NOPM, 0, 0, &tx_hdr34_mux), 2978d5add08fSSrinivas Kandagatla 2979d5add08fSSrinivas Kandagatla /*tx mixers*/ 2980d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0, adc1_switch, 2981d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc1_switch), wcd938x_tx_swr_ctrl, 2982d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2983d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 0, 0, adc2_switch, 2984d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc2_switch), wcd938x_tx_swr_ctrl, 2985d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2986d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 0, 0, adc3_switch, 2987d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc3_switch), wcd938x_tx_swr_ctrl, 2988d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2989d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC4_MIXER", SND_SOC_NOPM, 0, 0, adc4_switch, 2990d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc4_switch), wcd938x_tx_swr_ctrl, 2991d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2992d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0, 0, dmic1_switch, 2993d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic1_switch), wcd938x_tx_swr_ctrl, 2994d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2995d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 0, 0, dmic2_switch, 2996d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic2_switch), wcd938x_tx_swr_ctrl, 2997d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2998d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 0, 0, dmic3_switch, 2999d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic3_switch), wcd938x_tx_swr_ctrl, 3000d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3001d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 0, 0, dmic4_switch, 3002d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic4_switch), wcd938x_tx_swr_ctrl, 3003d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3004d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 0, 0, dmic5_switch, 3005d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic5_switch), wcd938x_tx_swr_ctrl, 3006d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3007d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 0, 0, dmic6_switch, 3008d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic6_switch), wcd938x_tx_swr_ctrl, 3009d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3010d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC7_MIXER", SND_SOC_NOPM, 0, 0, dmic7_switch, 3011d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic7_switch), wcd938x_tx_swr_ctrl, 3012d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3013d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC8_MIXER", SND_SOC_NOPM, 0, 0, dmic8_switch, 3014d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic8_switch), wcd938x_tx_swr_ctrl, 3015d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3016d5add08fSSrinivas Kandagatla /* micbias widgets*/ 3017d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, MIC_BIAS_1, 0, 3018d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3019d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3020d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3021d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, MIC_BIAS_2, 0, 3022d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3023d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3024d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3025d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, MIC_BIAS_3, 0, 3026d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3027d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3028d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3029d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS4", SND_SOC_NOPM, MIC_BIAS_4, 0, 3030d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3031d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3032d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3033d5add08fSSrinivas Kandagatla 3034d5add08fSSrinivas Kandagatla /* micbias pull up widgets*/ 3035d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS1", SND_SOC_NOPM, MIC_BIAS_1, 0, 3036d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3037d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3038d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3039d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS2", SND_SOC_NOPM, MIC_BIAS_2, 0, 3040d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3041d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3042d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3043d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS3", SND_SOC_NOPM, MIC_BIAS_3, 0, 3044d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3045d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3046d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3047d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS4", SND_SOC_NOPM, MIC_BIAS_4, 0, 3048d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3049d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3050d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3051d5add08fSSrinivas Kandagatla 3052d5add08fSSrinivas Kandagatla /*output widgets tx*/ 3053d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC1_OUTPUT"), 3054d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC2_OUTPUT"), 3055d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC3_OUTPUT"), 3056d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC4_OUTPUT"), 3057d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC1_OUTPUT"), 3058d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC2_OUTPUT"), 3059d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC3_OUTPUT"), 3060d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC4_OUTPUT"), 3061d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC5_OUTPUT"), 3062d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC6_OUTPUT"), 3063d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC7_OUTPUT"), 3064d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC8_OUTPUT"), 3065d5add08fSSrinivas Kandagatla 30668da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN1_HPHL"), 30678da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN2_HPHR"), 30688da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN3_AUX"), 30698da9db0cSSrinivas Kandagatla 30708da9db0cSSrinivas Kandagatla /*rx widgets*/ 30718da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("EAR PGA", WCD938X_ANA_EAR, 7, 0, NULL, 0, 30728da9db0cSSrinivas Kandagatla wcd938x_codec_enable_ear_pa, 30738da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30748da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 30758da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("AUX PGA", WCD938X_AUX_AUXPA, 7, 0, NULL, 0, 30768da9db0cSSrinivas Kandagatla wcd938x_codec_enable_aux_pa, 30778da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30788da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 30798da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("HPHL PGA", WCD938X_ANA_HPH, 7, 0, NULL, 0, 30808da9db0cSSrinivas Kandagatla wcd938x_codec_enable_hphl_pa, 30818da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30828da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 30838da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("HPHR PGA", WCD938X_ANA_HPH, 6, 0, NULL, 0, 30848da9db0cSSrinivas Kandagatla wcd938x_codec_enable_hphr_pa, 30858da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30868da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 30878da9db0cSSrinivas Kandagatla 30888da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, 30898da9db0cSSrinivas Kandagatla wcd938x_codec_hphl_dac_event, 30908da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30918da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 30928da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC2", NULL, SND_SOC_NOPM, 0, 0, 30938da9db0cSSrinivas Kandagatla wcd938x_codec_hphr_dac_event, 30948da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30958da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 30968da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC3", NULL, SND_SOC_NOPM, 0, 0, 30978da9db0cSSrinivas Kandagatla wcd938x_codec_ear_dac_event, 30988da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 30998da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 31008da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC4", NULL, SND_SOC_NOPM, 0, 0, 31018da9db0cSSrinivas Kandagatla wcd938x_codec_aux_dac_event, 31028da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 31038da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 31048da9db0cSSrinivas Kandagatla 31058da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MUX("RDAC3_MUX", SND_SOC_NOPM, 0, 0, &rx_rdac3_mux), 31068da9db0cSSrinivas Kandagatla 31078da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, NULL, 0), 31088da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("RXCLK", SND_SOC_NOPM, 0, 0, 31098da9db0cSSrinivas Kandagatla wcd938x_codec_enable_rxclk, 31108da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 31118da9db0cSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 31128da9db0cSSrinivas Kandagatla 31138da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY_S("CLS_H_PORT", 1, SND_SOC_NOPM, 0, 0, NULL, 0), 31148da9db0cSSrinivas Kandagatla 31158da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX1", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 31168da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX2", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 31178da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX3", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 31188da9db0cSSrinivas Kandagatla 31198da9db0cSSrinivas Kandagatla /* rx mixer widgets*/ 31208da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("EAR_RDAC", SND_SOC_NOPM, 0, 0, 31218da9db0cSSrinivas Kandagatla ear_rdac_switch, ARRAY_SIZE(ear_rdac_switch)), 31228da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("AUX_RDAC", SND_SOC_NOPM, 0, 0, 31238da9db0cSSrinivas Kandagatla aux_rdac_switch, ARRAY_SIZE(aux_rdac_switch)), 31248da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("HPHL_RDAC", SND_SOC_NOPM, 0, 0, 31258da9db0cSSrinivas Kandagatla hphl_rdac_switch, ARRAY_SIZE(hphl_rdac_switch)), 31268da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0, 31278da9db0cSSrinivas Kandagatla hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)), 31288da9db0cSSrinivas Kandagatla 31298da9db0cSSrinivas Kandagatla /*output widgets rx*/ 31308da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("EAR"), 31318da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("AUX"), 31328da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("HPHL"), 31338da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("HPHR"), 313404544222SSrinivas Kandagatla 313504544222SSrinivas Kandagatla }; 313604544222SSrinivas Kandagatla 313704544222SSrinivas Kandagatla static const struct snd_soc_dapm_route wcd938x_audio_map[] = { 313804544222SSrinivas Kandagatla {"ADC1_OUTPUT", NULL, "ADC1_MIXER"}, 313904544222SSrinivas Kandagatla {"ADC1_MIXER", "Switch", "ADC1 REQ"}, 314004544222SSrinivas Kandagatla {"ADC1 REQ", NULL, "ADC1"}, 314104544222SSrinivas Kandagatla {"ADC1", NULL, "AMIC1"}, 314204544222SSrinivas Kandagatla 314304544222SSrinivas Kandagatla {"ADC2_OUTPUT", NULL, "ADC2_MIXER"}, 314404544222SSrinivas Kandagatla {"ADC2_MIXER", "Switch", "ADC2 REQ"}, 314504544222SSrinivas Kandagatla {"ADC2 REQ", NULL, "ADC2"}, 314604544222SSrinivas Kandagatla {"ADC2", NULL, "HDR12 MUX"}, 314704544222SSrinivas Kandagatla {"HDR12 MUX", "NO_HDR12", "ADC2 MUX"}, 314804544222SSrinivas Kandagatla {"HDR12 MUX", "HDR12", "AMIC1"}, 314904544222SSrinivas Kandagatla {"ADC2 MUX", "INP3", "AMIC3"}, 315004544222SSrinivas Kandagatla {"ADC2 MUX", "INP2", "AMIC2"}, 315104544222SSrinivas Kandagatla 315204544222SSrinivas Kandagatla {"ADC3_OUTPUT", NULL, "ADC3_MIXER"}, 315304544222SSrinivas Kandagatla {"ADC3_MIXER", "Switch", "ADC3 REQ"}, 315404544222SSrinivas Kandagatla {"ADC3 REQ", NULL, "ADC3"}, 315504544222SSrinivas Kandagatla {"ADC3", NULL, "HDR34 MUX"}, 315604544222SSrinivas Kandagatla {"HDR34 MUX", "NO_HDR34", "ADC3 MUX"}, 315704544222SSrinivas Kandagatla {"HDR34 MUX", "HDR34", "AMIC5"}, 315804544222SSrinivas Kandagatla {"ADC3 MUX", "INP4", "AMIC4"}, 315904544222SSrinivas Kandagatla {"ADC3 MUX", "INP6", "AMIC6"}, 316004544222SSrinivas Kandagatla 316104544222SSrinivas Kandagatla {"ADC4_OUTPUT", NULL, "ADC4_MIXER"}, 316204544222SSrinivas Kandagatla {"ADC4_MIXER", "Switch", "ADC4 REQ"}, 316304544222SSrinivas Kandagatla {"ADC4 REQ", NULL, "ADC4"}, 316404544222SSrinivas Kandagatla {"ADC4", NULL, "ADC4 MUX"}, 316504544222SSrinivas Kandagatla {"ADC4 MUX", "INP5", "AMIC5"}, 316604544222SSrinivas Kandagatla {"ADC4 MUX", "INP7", "AMIC7"}, 316704544222SSrinivas Kandagatla 316804544222SSrinivas Kandagatla {"DMIC1_OUTPUT", NULL, "DMIC1_MIXER"}, 316904544222SSrinivas Kandagatla {"DMIC1_MIXER", "Switch", "DMIC1"}, 317004544222SSrinivas Kandagatla 317104544222SSrinivas Kandagatla {"DMIC2_OUTPUT", NULL, "DMIC2_MIXER"}, 317204544222SSrinivas Kandagatla {"DMIC2_MIXER", "Switch", "DMIC2"}, 317304544222SSrinivas Kandagatla 317404544222SSrinivas Kandagatla {"DMIC3_OUTPUT", NULL, "DMIC3_MIXER"}, 317504544222SSrinivas Kandagatla {"DMIC3_MIXER", "Switch", "DMIC3"}, 317604544222SSrinivas Kandagatla 317704544222SSrinivas Kandagatla {"DMIC4_OUTPUT", NULL, "DMIC4_MIXER"}, 317804544222SSrinivas Kandagatla {"DMIC4_MIXER", "Switch", "DMIC4"}, 317904544222SSrinivas Kandagatla 318004544222SSrinivas Kandagatla {"DMIC5_OUTPUT", NULL, "DMIC5_MIXER"}, 318104544222SSrinivas Kandagatla {"DMIC5_MIXER", "Switch", "DMIC5"}, 318204544222SSrinivas Kandagatla 318304544222SSrinivas Kandagatla {"DMIC6_OUTPUT", NULL, "DMIC6_MIXER"}, 318404544222SSrinivas Kandagatla {"DMIC6_MIXER", "Switch", "DMIC6"}, 318504544222SSrinivas Kandagatla 318604544222SSrinivas Kandagatla {"DMIC7_OUTPUT", NULL, "DMIC7_MIXER"}, 318704544222SSrinivas Kandagatla {"DMIC7_MIXER", "Switch", "DMIC7"}, 318804544222SSrinivas Kandagatla 318904544222SSrinivas Kandagatla {"DMIC8_OUTPUT", NULL, "DMIC8_MIXER"}, 319004544222SSrinivas Kandagatla {"DMIC8_MIXER", "Switch", "DMIC8"}, 319104544222SSrinivas Kandagatla 319204544222SSrinivas Kandagatla {"IN1_HPHL", NULL, "VDD_BUCK"}, 319304544222SSrinivas Kandagatla {"IN1_HPHL", NULL, "CLS_H_PORT"}, 319404544222SSrinivas Kandagatla 319504544222SSrinivas Kandagatla {"RX1", NULL, "IN1_HPHL"}, 319604544222SSrinivas Kandagatla {"RX1", NULL, "RXCLK"}, 319704544222SSrinivas Kandagatla {"RDAC1", NULL, "RX1"}, 319804544222SSrinivas Kandagatla {"HPHL_RDAC", "Switch", "RDAC1"}, 319904544222SSrinivas Kandagatla {"HPHL PGA", NULL, "HPHL_RDAC"}, 320004544222SSrinivas Kandagatla {"HPHL", NULL, "HPHL PGA"}, 320104544222SSrinivas Kandagatla 320204544222SSrinivas Kandagatla {"IN2_HPHR", NULL, "VDD_BUCK"}, 320304544222SSrinivas Kandagatla {"IN2_HPHR", NULL, "CLS_H_PORT"}, 320404544222SSrinivas Kandagatla {"RX2", NULL, "IN2_HPHR"}, 320504544222SSrinivas Kandagatla {"RDAC2", NULL, "RX2"}, 320604544222SSrinivas Kandagatla {"RX2", NULL, "RXCLK"}, 320704544222SSrinivas Kandagatla {"HPHR_RDAC", "Switch", "RDAC2"}, 320804544222SSrinivas Kandagatla {"HPHR PGA", NULL, "HPHR_RDAC"}, 320904544222SSrinivas Kandagatla {"HPHR", NULL, "HPHR PGA"}, 321004544222SSrinivas Kandagatla 321104544222SSrinivas Kandagatla {"IN3_AUX", NULL, "VDD_BUCK"}, 321204544222SSrinivas Kandagatla {"IN3_AUX", NULL, "CLS_H_PORT"}, 321304544222SSrinivas Kandagatla {"RX3", NULL, "IN3_AUX"}, 321404544222SSrinivas Kandagatla {"RDAC4", NULL, "RX3"}, 321504544222SSrinivas Kandagatla {"RX3", NULL, "RXCLK"}, 321604544222SSrinivas Kandagatla {"AUX_RDAC", "Switch", "RDAC4"}, 321704544222SSrinivas Kandagatla {"AUX PGA", NULL, "AUX_RDAC"}, 321804544222SSrinivas Kandagatla {"AUX", NULL, "AUX PGA"}, 321904544222SSrinivas Kandagatla 322004544222SSrinivas Kandagatla {"RDAC3_MUX", "RX3", "RX3"}, 322104544222SSrinivas Kandagatla {"RDAC3_MUX", "RX1", "RX1"}, 322204544222SSrinivas Kandagatla {"RDAC3", NULL, "RDAC3_MUX"}, 322304544222SSrinivas Kandagatla {"EAR_RDAC", "Switch", "RDAC3"}, 322404544222SSrinivas Kandagatla {"EAR PGA", NULL, "EAR_RDAC"}, 322504544222SSrinivas Kandagatla {"EAR", NULL, "EAR PGA"}, 32268da9db0cSSrinivas Kandagatla }; 32278da9db0cSSrinivas Kandagatla 32288d78602aSSrinivas Kandagatla static int wcd938x_get_micb_vout_ctl_val(u32 micb_mv) 32298d78602aSSrinivas Kandagatla { 32308d78602aSSrinivas Kandagatla /* min micbias voltage is 1V and maximum is 2.85V */ 32318d78602aSSrinivas Kandagatla if (micb_mv < 1000 || micb_mv > 2850) 32328d78602aSSrinivas Kandagatla return -EINVAL; 32338d78602aSSrinivas Kandagatla 32348d78602aSSrinivas Kandagatla return (micb_mv - 1000) / 50; 32358d78602aSSrinivas Kandagatla } 32368d78602aSSrinivas Kandagatla 32378d78602aSSrinivas Kandagatla static int wcd938x_set_micbias_data(struct wcd938x_priv *wcd938x) 32388d78602aSSrinivas Kandagatla { 32398d78602aSSrinivas Kandagatla int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 32408d78602aSSrinivas Kandagatla 32418d78602aSSrinivas Kandagatla /* set micbias voltage */ 32428d78602aSSrinivas Kandagatla vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb1_mv); 32438d78602aSSrinivas Kandagatla vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb2_mv); 32448d78602aSSrinivas Kandagatla vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb3_mv); 32458d78602aSSrinivas Kandagatla vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb4_mv); 32468d78602aSSrinivas Kandagatla if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || vout_ctl_4 < 0) 32478d78602aSSrinivas Kandagatla return -EINVAL; 32488d78602aSSrinivas Kandagatla 32498d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, 32508d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_1); 32518d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, 32528d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_2); 32538d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, 32548d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_3); 32558d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, 32568d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_4); 32578d78602aSSrinivas Kandagatla 32588d78602aSSrinivas Kandagatla return 0; 32598d78602aSSrinivas Kandagatla } 32608d78602aSSrinivas Kandagatla 32618d78602aSSrinivas Kandagatla static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) 32628d78602aSSrinivas Kandagatla { 32638d78602aSSrinivas Kandagatla return IRQ_HANDLED; 32648d78602aSSrinivas Kandagatla } 32658d78602aSSrinivas Kandagatla 32668d78602aSSrinivas Kandagatla static struct irq_chip wcd_irq_chip = { 32678d78602aSSrinivas Kandagatla .name = "WCD938x", 32688d78602aSSrinivas Kandagatla }; 32698d78602aSSrinivas Kandagatla 32708d78602aSSrinivas Kandagatla static int wcd_irq_chip_map(struct irq_domain *irqd, unsigned int virq, 32718d78602aSSrinivas Kandagatla irq_hw_number_t hw) 32728d78602aSSrinivas Kandagatla { 32738d78602aSSrinivas Kandagatla irq_set_chip_and_handler(virq, &wcd_irq_chip, handle_simple_irq); 32748d78602aSSrinivas Kandagatla irq_set_nested_thread(virq, 1); 32758d78602aSSrinivas Kandagatla irq_set_noprobe(virq); 32768d78602aSSrinivas Kandagatla 32778d78602aSSrinivas Kandagatla return 0; 32788d78602aSSrinivas Kandagatla } 32798d78602aSSrinivas Kandagatla 32808d78602aSSrinivas Kandagatla static const struct irq_domain_ops wcd_domain_ops = { 32818d78602aSSrinivas Kandagatla .map = wcd_irq_chip_map, 32828d78602aSSrinivas Kandagatla }; 32838d78602aSSrinivas Kandagatla 32848d78602aSSrinivas Kandagatla static int wcd938x_irq_init(struct wcd938x_priv *wcd, struct device *dev) 32858d78602aSSrinivas Kandagatla { 32868d78602aSSrinivas Kandagatla 32878d78602aSSrinivas Kandagatla wcd->virq = irq_domain_add_linear(NULL, 1, &wcd_domain_ops, NULL); 32888d78602aSSrinivas Kandagatla if (!(wcd->virq)) { 32898d78602aSSrinivas Kandagatla dev_err(dev, "%s: Failed to add IRQ domain\n", __func__); 32908d78602aSSrinivas Kandagatla return -EINVAL; 32918d78602aSSrinivas Kandagatla } 32928d78602aSSrinivas Kandagatla 32938d78602aSSrinivas Kandagatla return devm_regmap_add_irq_chip(dev, wcd->regmap, 32948d78602aSSrinivas Kandagatla irq_create_mapping(wcd->virq, 0), 32958d78602aSSrinivas Kandagatla IRQF_ONESHOT, 0, &wcd938x_regmap_irq_chip, 32968d78602aSSrinivas Kandagatla &wcd->irq_chip); 32978d78602aSSrinivas Kandagatla } 32988d78602aSSrinivas Kandagatla 32998d78602aSSrinivas Kandagatla static int wcd938x_soc_codec_probe(struct snd_soc_component *component) 33008d78602aSSrinivas Kandagatla { 33018d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 33028d78602aSSrinivas Kandagatla struct device *dev = component->dev; 33038d78602aSSrinivas Kandagatla int ret, i; 33048d78602aSSrinivas Kandagatla 33058d78602aSSrinivas Kandagatla snd_soc_component_init_regmap(component, wcd938x->regmap); 33068d78602aSSrinivas Kandagatla 33078d78602aSSrinivas Kandagatla wcd938x->variant = snd_soc_component_read_field(component, 33088d78602aSSrinivas Kandagatla WCD938X_DIGITAL_EFUSE_REG_0, 33098d78602aSSrinivas Kandagatla WCD938X_ID_MASK); 33108d78602aSSrinivas Kandagatla 33118d78602aSSrinivas Kandagatla wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X); 33128d78602aSSrinivas Kandagatla 33138d78602aSSrinivas Kandagatla wcd938x_io_init(wcd938x); 33148d78602aSSrinivas Kandagatla /* Set all interrupts as edge triggered */ 33158d78602aSSrinivas Kandagatla for (i = 0; i < wcd938x_regmap_irq_chip.num_regs; i++) { 33168d78602aSSrinivas Kandagatla regmap_write(wcd938x->regmap, 33178d78602aSSrinivas Kandagatla (WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0); 33188d78602aSSrinivas Kandagatla } 33198d78602aSSrinivas Kandagatla 33208d78602aSSrinivas Kandagatla ret = wcd938x_irq_init(wcd938x, component->dev); 33218d78602aSSrinivas Kandagatla if (ret) { 33228d78602aSSrinivas Kandagatla dev_err(component->dev, "%s: IRQ init failed: %d\n", 33238d78602aSSrinivas Kandagatla __func__, ret); 33248d78602aSSrinivas Kandagatla return ret; 33258d78602aSSrinivas Kandagatla } 33268d78602aSSrinivas Kandagatla 33278d78602aSSrinivas Kandagatla wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 33288d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT); 33298d78602aSSrinivas Kandagatla wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 33308d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT); 33318d78602aSSrinivas Kandagatla wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 33328d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT); 33338d78602aSSrinivas Kandagatla 33348d78602aSSrinivas Kandagatla /* Request for watchdog interrupt */ 33358d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 33368d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 33378d78602aSSrinivas Kandagatla "HPHR PDM WD INT", wcd938x); 33388d78602aSSrinivas Kandagatla if (ret) 33398d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHR WD interrupt (%d)\n", ret); 33408d78602aSSrinivas Kandagatla 33418d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 33428d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 33438d78602aSSrinivas Kandagatla "HPHL PDM WD INT", wcd938x); 33448d78602aSSrinivas Kandagatla if (ret) 33458d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHL WD interrupt (%d)\n", ret); 33468d78602aSSrinivas Kandagatla 33478d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 33488d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 33498d78602aSSrinivas Kandagatla "AUX PDM WD INT", wcd938x); 33508d78602aSSrinivas Kandagatla if (ret) 33518d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request Aux WD interrupt (%d)\n", ret); 33528d78602aSSrinivas Kandagatla 33538d78602aSSrinivas Kandagatla /* Disable watchdog interrupt for HPH and AUX */ 33548d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 33558d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 33568d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 33578d78602aSSrinivas Kandagatla 3358e8ba1e05SSrinivas Kandagatla switch (wcd938x->variant) { 3359e8ba1e05SSrinivas Kandagatla case WCD9380: 3360e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9380_snd_controls, 3361e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9380_snd_controls)); 3362e8ba1e05SSrinivas Kandagatla if (ret < 0) { 3363e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 3364e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 3365e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 3366e8ba1e05SSrinivas Kandagatla goto err; 3367e8ba1e05SSrinivas Kandagatla } 3368e8ba1e05SSrinivas Kandagatla break; 3369e8ba1e05SSrinivas Kandagatla case WCD9385: 3370e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9385_snd_controls, 3371e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9385_snd_controls)); 3372e8ba1e05SSrinivas Kandagatla if (ret < 0) { 3373e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 3374e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 3375e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 3376e8ba1e05SSrinivas Kandagatla goto err; 3377e8ba1e05SSrinivas Kandagatla } 3378e8ba1e05SSrinivas Kandagatla break; 3379e8ba1e05SSrinivas Kandagatla default: 3380e8ba1e05SSrinivas Kandagatla break; 3381e8ba1e05SSrinivas Kandagatla } 3382e8ba1e05SSrinivas Kandagatla err: 33838d78602aSSrinivas Kandagatla return ret; 33848d78602aSSrinivas Kandagatla } 33858d78602aSSrinivas Kandagatla 33868d78602aSSrinivas Kandagatla static const struct snd_soc_component_driver soc_codec_dev_wcd938x = { 33878d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 33888d78602aSSrinivas Kandagatla .probe = wcd938x_soc_codec_probe, 3389e8ba1e05SSrinivas Kandagatla .controls = wcd938x_snd_controls, 3390e8ba1e05SSrinivas Kandagatla .num_controls = ARRAY_SIZE(wcd938x_snd_controls), 33918da9db0cSSrinivas Kandagatla .dapm_widgets = wcd938x_dapm_widgets, 33928da9db0cSSrinivas Kandagatla .num_dapm_widgets = ARRAY_SIZE(wcd938x_dapm_widgets), 339304544222SSrinivas Kandagatla .dapm_routes = wcd938x_audio_map, 339404544222SSrinivas Kandagatla .num_dapm_routes = ARRAY_SIZE(wcd938x_audio_map), 33958d78602aSSrinivas Kandagatla }; 33968d78602aSSrinivas Kandagatla 33978d78602aSSrinivas Kandagatla static void wcd938x_dt_parse_micbias_info(struct device *dev, struct wcd938x_priv *wcd) 33988d78602aSSrinivas Kandagatla { 33998d78602aSSrinivas Kandagatla struct device_node *np = dev->of_node; 34008d78602aSSrinivas Kandagatla u32 prop_val = 0; 34018d78602aSSrinivas Kandagatla int rc = 0; 34028d78602aSSrinivas Kandagatla 34038d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 34048d78602aSSrinivas Kandagatla if (!rc) 34058d78602aSSrinivas Kandagatla wcd->micb1_mv = prop_val/1000; 34068d78602aSSrinivas Kandagatla else 34078d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias1 DT property not found\n", __func__); 34088d78602aSSrinivas Kandagatla 34098d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 34108d78602aSSrinivas Kandagatla if (!rc) 34118d78602aSSrinivas Kandagatla wcd->micb2_mv = prop_val/1000; 34128d78602aSSrinivas Kandagatla else 34138d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias2 DT property not found\n", __func__); 34148d78602aSSrinivas Kandagatla 34158d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 34168d78602aSSrinivas Kandagatla if (!rc) 34178d78602aSSrinivas Kandagatla wcd->micb3_mv = prop_val/1000; 34188d78602aSSrinivas Kandagatla else 34198d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); 34208d78602aSSrinivas Kandagatla 34218d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); 34228d78602aSSrinivas Kandagatla if (!rc) 34238d78602aSSrinivas Kandagatla wcd->micb4_mv = prop_val/1000; 34248d78602aSSrinivas Kandagatla else 34258d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias4 DT property not found\n", __func__); 34268d78602aSSrinivas Kandagatla } 34278d78602aSSrinivas Kandagatla 34288d78602aSSrinivas Kandagatla static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device *dev) 34298d78602aSSrinivas Kandagatla { 34308d78602aSSrinivas Kandagatla int ret; 34318d78602aSSrinivas Kandagatla 34328d78602aSSrinivas Kandagatla wcd938x->reset_gpio = of_get_named_gpio(dev->of_node, "reset-gpios", 0); 34338d78602aSSrinivas Kandagatla if (wcd938x->reset_gpio < 0) { 34348d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get reset gpio: err = %d\n", 34358d78602aSSrinivas Kandagatla wcd938x->reset_gpio); 34368d78602aSSrinivas Kandagatla return wcd938x->reset_gpio; 34378d78602aSSrinivas Kandagatla } 34388d78602aSSrinivas Kandagatla 34398d78602aSSrinivas Kandagatla wcd938x->supplies[0].supply = "vdd-rxtx"; 34408d78602aSSrinivas Kandagatla wcd938x->supplies[1].supply = "vdd-io"; 34418d78602aSSrinivas Kandagatla wcd938x->supplies[2].supply = "vdd-buck"; 34428d78602aSSrinivas Kandagatla wcd938x->supplies[3].supply = "vdd-mic-bias"; 34438d78602aSSrinivas Kandagatla 34448d78602aSSrinivas Kandagatla ret = regulator_bulk_get(dev, WCD938X_MAX_SUPPLY, wcd938x->supplies); 34458d78602aSSrinivas Kandagatla if (ret) { 34468d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get supplies: err = %d\n", ret); 34478d78602aSSrinivas Kandagatla return ret; 34488d78602aSSrinivas Kandagatla } 34498d78602aSSrinivas Kandagatla 34508d78602aSSrinivas Kandagatla ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); 34518d78602aSSrinivas Kandagatla if (ret) { 34528d78602aSSrinivas Kandagatla dev_err(dev, "Failed to enable supplies: err = %d\n", ret); 34538d78602aSSrinivas Kandagatla return ret; 34548d78602aSSrinivas Kandagatla } 34558d78602aSSrinivas Kandagatla 34568d78602aSSrinivas Kandagatla wcd938x_dt_parse_micbias_info(dev, wcd938x); 34578d78602aSSrinivas Kandagatla 34588d78602aSSrinivas Kandagatla return 0; 34598d78602aSSrinivas Kandagatla } 34608d78602aSSrinivas Kandagatla 34618d78602aSSrinivas Kandagatla static int wcd938x_reset(struct wcd938x_priv *wcd938x) 34628d78602aSSrinivas Kandagatla { 34638d78602aSSrinivas Kandagatla gpio_direction_output(wcd938x->reset_gpio, 0); 34648d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to LOW */ 34658d78602aSSrinivas Kandagatla usleep_range(20, 30); 34668d78602aSSrinivas Kandagatla gpio_set_value(wcd938x->reset_gpio, 1); 34678d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to HIGH */ 34688d78602aSSrinivas Kandagatla usleep_range(20, 30); 34698d78602aSSrinivas Kandagatla 34708d78602aSSrinivas Kandagatla return 0; 34718d78602aSSrinivas Kandagatla } 34728d78602aSSrinivas Kandagatla 347316572522SSrinivas Kandagatla static int wcd938x_codec_hw_params(struct snd_pcm_substream *substream, 347416572522SSrinivas Kandagatla struct snd_pcm_hw_params *params, 347516572522SSrinivas Kandagatla struct snd_soc_dai *dai) 347616572522SSrinivas Kandagatla { 347716572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 347816572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 347916572522SSrinivas Kandagatla 348016572522SSrinivas Kandagatla return wcd938x_sdw_hw_params(wcd, substream, params, dai); 348116572522SSrinivas Kandagatla } 348216572522SSrinivas Kandagatla 348316572522SSrinivas Kandagatla static int wcd938x_codec_free(struct snd_pcm_substream *substream, 348416572522SSrinivas Kandagatla struct snd_soc_dai *dai) 348516572522SSrinivas Kandagatla { 348616572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 348716572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 348816572522SSrinivas Kandagatla 348916572522SSrinivas Kandagatla return wcd938x_sdw_free(wcd, substream, dai); 349016572522SSrinivas Kandagatla } 349116572522SSrinivas Kandagatla 349216572522SSrinivas Kandagatla static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai, 349316572522SSrinivas Kandagatla void *stream, int direction) 349416572522SSrinivas Kandagatla { 349516572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 349616572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 349716572522SSrinivas Kandagatla 349816572522SSrinivas Kandagatla return wcd938x_sdw_set_sdw_stream(wcd, dai, stream, direction); 349916572522SSrinivas Kandagatla 350016572522SSrinivas Kandagatla } 350116572522SSrinivas Kandagatla 3502355af6c0SPu Lehui static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = { 350316572522SSrinivas Kandagatla .hw_params = wcd938x_codec_hw_params, 350416572522SSrinivas Kandagatla .hw_free = wcd938x_codec_free, 350516572522SSrinivas Kandagatla .set_sdw_stream = wcd938x_codec_set_sdw_stream, 35068d78602aSSrinivas Kandagatla }; 35078d78602aSSrinivas Kandagatla 35088d78602aSSrinivas Kandagatla static struct snd_soc_dai_driver wcd938x_dais[] = { 35098d78602aSSrinivas Kandagatla [0] = { 35108d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-rx", 35118d78602aSSrinivas Kandagatla .playback = { 35128d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Playback", 35138d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK | WCD938X_FRAC_RATES_MASK, 35148d78602aSSrinivas Kandagatla .formats = WCD938X_FORMATS_S16_S24_LE, 35158d78602aSSrinivas Kandagatla .rate_max = 192000, 35168d78602aSSrinivas Kandagatla .rate_min = 8000, 35178d78602aSSrinivas Kandagatla .channels_min = 1, 35188d78602aSSrinivas Kandagatla .channels_max = 2, 35198d78602aSSrinivas Kandagatla }, 35208d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 35218d78602aSSrinivas Kandagatla }, 35228d78602aSSrinivas Kandagatla [1] = { 35238d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-tx", 35248d78602aSSrinivas Kandagatla .capture = { 35258d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Capture", 35268d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK, 35278d78602aSSrinivas Kandagatla .formats = SNDRV_PCM_FMTBIT_S16_LE, 35288d78602aSSrinivas Kandagatla .rate_min = 8000, 35298d78602aSSrinivas Kandagatla .rate_max = 192000, 35308d78602aSSrinivas Kandagatla .channels_min = 1, 35318d78602aSSrinivas Kandagatla .channels_max = 4, 35328d78602aSSrinivas Kandagatla }, 35338d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 35348d78602aSSrinivas Kandagatla }, 35358d78602aSSrinivas Kandagatla }; 35368d78602aSSrinivas Kandagatla 35378d78602aSSrinivas Kandagatla static int wcd938x_bind(struct device *dev) 35388d78602aSSrinivas Kandagatla { 35398d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 35408d78602aSSrinivas Kandagatla int ret; 35418d78602aSSrinivas Kandagatla 35428d78602aSSrinivas Kandagatla ret = component_bind_all(dev, wcd938x); 35438d78602aSSrinivas Kandagatla if (ret) { 35448d78602aSSrinivas Kandagatla dev_err(dev, "%s: Slave bind failed, ret = %d\n", 35458d78602aSSrinivas Kandagatla __func__, ret); 35468d78602aSSrinivas Kandagatla return ret; 35478d78602aSSrinivas Kandagatla } 35488d78602aSSrinivas Kandagatla 354916572522SSrinivas Kandagatla wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); 355016572522SSrinivas Kandagatla if (!wcd938x->rxdev) { 355116572522SSrinivas Kandagatla dev_err(dev, "could not find slave with matching of node\n"); 355216572522SSrinivas Kandagatla return -EINVAL; 355316572522SSrinivas Kandagatla } 355416572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); 355516572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; 3556b90d9398SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; 355716572522SSrinivas Kandagatla 355816572522SSrinivas Kandagatla wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); 355916572522SSrinivas Kandagatla if (!wcd938x->txdev) { 356016572522SSrinivas Kandagatla dev_err(dev, "could not find txslave with matching of node\n"); 356116572522SSrinivas Kandagatla return -EINVAL; 356216572522SSrinivas Kandagatla } 356316572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); 356416572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; 3565b90d9398SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq; 356616572522SSrinivas Kandagatla wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); 356716572522SSrinivas Kandagatla if (!wcd938x->tx_sdw_dev) { 356816572522SSrinivas Kandagatla dev_err(dev, "could not get txslave with matching of dev\n"); 356916572522SSrinivas Kandagatla return -EINVAL; 357016572522SSrinivas Kandagatla } 357116572522SSrinivas Kandagatla 357216572522SSrinivas Kandagatla /* As TX is main CSR reg interface, which should not be suspended first. 357316572522SSrinivas Kandagatla * expicilty add the dependency link */ 357416572522SSrinivas Kandagatla if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | 357516572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 357616572522SSrinivas Kandagatla dev_err(dev, "could not devlink tx and rx\n"); 357716572522SSrinivas Kandagatla return -EINVAL; 357816572522SSrinivas Kandagatla } 357916572522SSrinivas Kandagatla 358016572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | 358116572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 358216572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and tx\n"); 358316572522SSrinivas Kandagatla return -EINVAL; 358416572522SSrinivas Kandagatla } 358516572522SSrinivas Kandagatla 358616572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | 358716572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 358816572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and rx\n"); 358916572522SSrinivas Kandagatla return -EINVAL; 359016572522SSrinivas Kandagatla } 359116572522SSrinivas Kandagatla 3592b90d9398SSrinivas Kandagatla wcd938x->regmap = devm_regmap_init_sdw(wcd938x->tx_sdw_dev, &wcd938x_regmap_config); 3593b90d9398SSrinivas Kandagatla if (IS_ERR(wcd938x->regmap)) { 359416572522SSrinivas Kandagatla dev_err(dev, "%s: tx csr regmap not found\n", __func__); 359516572522SSrinivas Kandagatla return PTR_ERR(wcd938x->regmap); 359616572522SSrinivas Kandagatla } 359716572522SSrinivas Kandagatla 35988d78602aSSrinivas Kandagatla ret = wcd938x_set_micbias_data(wcd938x); 35998d78602aSSrinivas Kandagatla if (ret < 0) { 36008d78602aSSrinivas Kandagatla dev_err(dev, "%s: bad micbias pdata\n", __func__); 36018d78602aSSrinivas Kandagatla return ret; 36028d78602aSSrinivas Kandagatla } 36038d78602aSSrinivas Kandagatla 36048d78602aSSrinivas Kandagatla ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, 36058d78602aSSrinivas Kandagatla wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); 36068d78602aSSrinivas Kandagatla if (ret) 36078d78602aSSrinivas Kandagatla dev_err(dev, "%s: Codec registration failed\n", 36088d78602aSSrinivas Kandagatla __func__); 36098d78602aSSrinivas Kandagatla 36108d78602aSSrinivas Kandagatla return ret; 36118d78602aSSrinivas Kandagatla 36128d78602aSSrinivas Kandagatla } 36138d78602aSSrinivas Kandagatla 36148d78602aSSrinivas Kandagatla static void wcd938x_unbind(struct device *dev) 36158d78602aSSrinivas Kandagatla { 36168d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 36178d78602aSSrinivas Kandagatla 361816572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->txdev); 361916572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->rxdev); 362016572522SSrinivas Kandagatla device_link_remove(wcd938x->rxdev, wcd938x->txdev); 36218d78602aSSrinivas Kandagatla snd_soc_unregister_component(dev); 36228d78602aSSrinivas Kandagatla component_unbind_all(dev, wcd938x); 36238d78602aSSrinivas Kandagatla } 36248d78602aSSrinivas Kandagatla 36258d78602aSSrinivas Kandagatla static const struct component_master_ops wcd938x_comp_ops = { 36268d78602aSSrinivas Kandagatla .bind = wcd938x_bind, 36278d78602aSSrinivas Kandagatla .unbind = wcd938x_unbind, 36288d78602aSSrinivas Kandagatla }; 36298d78602aSSrinivas Kandagatla 36308d78602aSSrinivas Kandagatla static int wcd938x_compare_of(struct device *dev, void *data) 36318d78602aSSrinivas Kandagatla { 36328d78602aSSrinivas Kandagatla return dev->of_node == data; 36338d78602aSSrinivas Kandagatla } 36348d78602aSSrinivas Kandagatla 36358d78602aSSrinivas Kandagatla static void wcd938x_release_of(struct device *dev, void *data) 36368d78602aSSrinivas Kandagatla { 36378d78602aSSrinivas Kandagatla of_node_put(data); 36388d78602aSSrinivas Kandagatla } 36398d78602aSSrinivas Kandagatla 36408d78602aSSrinivas Kandagatla static int wcd938x_add_slave_components(struct wcd938x_priv *wcd938x, 36418d78602aSSrinivas Kandagatla struct device *dev, 36428d78602aSSrinivas Kandagatla struct component_match **matchptr) 36438d78602aSSrinivas Kandagatla { 36448d78602aSSrinivas Kandagatla struct device_node *np; 36458d78602aSSrinivas Kandagatla 36468d78602aSSrinivas Kandagatla np = dev->of_node; 36478d78602aSSrinivas Kandagatla 36488d78602aSSrinivas Kandagatla wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); 36498d78602aSSrinivas Kandagatla if (!wcd938x->rxnode) { 36508d78602aSSrinivas Kandagatla dev_err(dev, "%s: Rx-device node not defined\n", __func__); 36518d78602aSSrinivas Kandagatla return -ENODEV; 36528d78602aSSrinivas Kandagatla } 36538d78602aSSrinivas Kandagatla 36548d78602aSSrinivas Kandagatla of_node_get(wcd938x->rxnode); 36558d78602aSSrinivas Kandagatla component_match_add_release(dev, matchptr, wcd938x_release_of, 36568d78602aSSrinivas Kandagatla wcd938x_compare_of, wcd938x->rxnode); 36578d78602aSSrinivas Kandagatla 36588d78602aSSrinivas Kandagatla wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); 36598d78602aSSrinivas Kandagatla if (!wcd938x->txnode) { 36608d78602aSSrinivas Kandagatla dev_err(dev, "%s: Tx-device node not defined\n", __func__); 36618d78602aSSrinivas Kandagatla return -ENODEV; 36628d78602aSSrinivas Kandagatla } 36638d78602aSSrinivas Kandagatla of_node_get(wcd938x->txnode); 36648d78602aSSrinivas Kandagatla component_match_add_release(dev, matchptr, wcd938x_release_of, 36658d78602aSSrinivas Kandagatla wcd938x_compare_of, wcd938x->txnode); 36668d78602aSSrinivas Kandagatla return 0; 36678d78602aSSrinivas Kandagatla } 36688d78602aSSrinivas Kandagatla 36698d78602aSSrinivas Kandagatla static int wcd938x_probe(struct platform_device *pdev) 36708d78602aSSrinivas Kandagatla { 36718d78602aSSrinivas Kandagatla struct component_match *match = NULL; 36728d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = NULL; 36738d78602aSSrinivas Kandagatla struct device *dev = &pdev->dev; 36748d78602aSSrinivas Kandagatla int ret; 36758d78602aSSrinivas Kandagatla 36768d78602aSSrinivas Kandagatla wcd938x = devm_kzalloc(dev, sizeof(struct wcd938x_priv), 36778d78602aSSrinivas Kandagatla GFP_KERNEL); 36788d78602aSSrinivas Kandagatla if (!wcd938x) 36798d78602aSSrinivas Kandagatla return -ENOMEM; 36808d78602aSSrinivas Kandagatla 36818d78602aSSrinivas Kandagatla dev_set_drvdata(dev, wcd938x); 36828d78602aSSrinivas Kandagatla 36838d78602aSSrinivas Kandagatla ret = wcd938x_populate_dt_data(wcd938x, dev); 36848d78602aSSrinivas Kandagatla if (ret) { 36858d78602aSSrinivas Kandagatla dev_err(dev, "%s: Fail to obtain platform data\n", __func__); 36868d78602aSSrinivas Kandagatla return -EINVAL; 36878d78602aSSrinivas Kandagatla } 36888d78602aSSrinivas Kandagatla 36898d78602aSSrinivas Kandagatla ret = wcd938x_add_slave_components(wcd938x, dev, &match); 36908d78602aSSrinivas Kandagatla if (ret) 36918d78602aSSrinivas Kandagatla return ret; 36928d78602aSSrinivas Kandagatla 36938d78602aSSrinivas Kandagatla wcd938x_reset(wcd938x); 36948d78602aSSrinivas Kandagatla 36958d78602aSSrinivas Kandagatla ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match); 36968d78602aSSrinivas Kandagatla if (ret) 36978d78602aSSrinivas Kandagatla return ret; 36988d78602aSSrinivas Kandagatla 36998d78602aSSrinivas Kandagatla pm_runtime_set_autosuspend_delay(dev, 1000); 37008d78602aSSrinivas Kandagatla pm_runtime_use_autosuspend(dev); 37018d78602aSSrinivas Kandagatla pm_runtime_mark_last_busy(dev); 37028d78602aSSrinivas Kandagatla pm_runtime_set_active(dev); 37038d78602aSSrinivas Kandagatla pm_runtime_enable(dev); 37048d78602aSSrinivas Kandagatla pm_runtime_idle(dev); 37058d78602aSSrinivas Kandagatla 37068d78602aSSrinivas Kandagatla return ret; 37078d78602aSSrinivas Kandagatla } 37088d78602aSSrinivas Kandagatla 37098d78602aSSrinivas Kandagatla static int wcd938x_remove(struct platform_device *pdev) 37108d78602aSSrinivas Kandagatla { 37118d78602aSSrinivas Kandagatla component_master_del(&pdev->dev, &wcd938x_comp_ops); 37128d78602aSSrinivas Kandagatla 37138d78602aSSrinivas Kandagatla return 0; 37148d78602aSSrinivas Kandagatla } 37158d78602aSSrinivas Kandagatla 37168d78602aSSrinivas Kandagatla static const struct of_device_id wcd938x_dt_match[] = { 37178d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9380-codec" }, 37188d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9385-codec" }, 37198d78602aSSrinivas Kandagatla {} 37208d78602aSSrinivas Kandagatla }; 37218d78602aSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wcd938x_dt_match); 37228d78602aSSrinivas Kandagatla 37238d78602aSSrinivas Kandagatla static struct platform_driver wcd938x_codec_driver = { 37248d78602aSSrinivas Kandagatla .probe = wcd938x_probe, 37258d78602aSSrinivas Kandagatla .remove = wcd938x_remove, 37268d78602aSSrinivas Kandagatla .driver = { 37278d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 37288d78602aSSrinivas Kandagatla .of_match_table = of_match_ptr(wcd938x_dt_match), 37298d78602aSSrinivas Kandagatla .suppress_bind_attrs = true, 37308d78602aSSrinivas Kandagatla }, 37318d78602aSSrinivas Kandagatla }; 37328d78602aSSrinivas Kandagatla 37338d78602aSSrinivas Kandagatla module_platform_driver(wcd938x_codec_driver); 37348d78602aSSrinivas Kandagatla MODULE_DESCRIPTION("WCD938X Codec driver"); 37358d78602aSSrinivas Kandagatla MODULE_LICENSE("GPL"); 3736