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/soc.h> 138d78602aSSrinivas Kandagatla #include <sound/tlv.h> 148d78602aSSrinivas Kandagatla #include <linux/of_gpio.h> 158d78602aSSrinivas Kandagatla #include <linux/of.h> 168d78602aSSrinivas Kandagatla #include <sound/jack.h> 178d78602aSSrinivas Kandagatla #include <sound/pcm.h> 188d78602aSSrinivas Kandagatla #include <sound/pcm_params.h> 198d78602aSSrinivas Kandagatla #include <linux/regmap.h> 208d78602aSSrinivas Kandagatla #include <sound/soc.h> 218d78602aSSrinivas Kandagatla #include <sound/soc-dapm.h> 228d78602aSSrinivas Kandagatla #include <linux/regulator/consumer.h> 238d78602aSSrinivas Kandagatla 248d78602aSSrinivas Kandagatla #include "wcd-clsh-v2.h" 258d78602aSSrinivas Kandagatla #include "wcd938x.h" 268d78602aSSrinivas Kandagatla 278d78602aSSrinivas Kandagatla #define WCD938X_MAX_MICBIAS (4) 288d78602aSSrinivas Kandagatla #define WCD938X_MAX_SUPPLY (4) 298d78602aSSrinivas Kandagatla #define WCD938X_MBHC_MAX_BUTTONS (8) 308d78602aSSrinivas Kandagatla #define TX_ADC_MAX (4) 318d78602aSSrinivas Kandagatla #define WCD938X_TX_MAX_SWR_PORTS (5) 328d78602aSSrinivas Kandagatla 338d78602aSSrinivas Kandagatla #define WCD938X_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 348d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 358d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 368d78602aSSrinivas Kandagatla /* Fractional Rates */ 378d78602aSSrinivas Kandagatla #define WCD938X_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ 388d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_176400) 398d78602aSSrinivas Kandagatla #define WCD938X_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ 408d78602aSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE) 418d78602aSSrinivas Kandagatla /* Convert from vout ctl to micbias voltage in mV */ 428d78602aSSrinivas Kandagatla #define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) 438d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_0P6MHZ (600000) 448d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_1P2MHZ (1200000) 458d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_2P4MHZ (2400000) 468d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_4P8MHZ (4800000) 478d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_9P6MHZ (9600000) 488d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_11P2896MHZ (1128960) 498d78602aSSrinivas Kandagatla 508d78602aSSrinivas Kandagatla #define WCD938X_DRV_NAME "wcd938x_codec" 518d78602aSSrinivas Kandagatla #define WCD938X_VERSION_1_0 (1) 528d78602aSSrinivas Kandagatla #define EAR_RX_PATH_AUX (1) 538d78602aSSrinivas Kandagatla 548d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_HIFI 0x01 558d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_LO_HIF 0x02 568d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_NORMAL 0x03 578d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_LP 0x05 588d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_ULP1 0x09 598d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_ULP2 0x0B 608d78602aSSrinivas Kandagatla 618d78602aSSrinivas Kandagatla /* Z value defined in milliohm */ 628d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_32 (32000) 638d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_400 (400000) 648d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_1200 (1200000) 658d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_100K (100000000) 668d78602aSSrinivas Kandagatla /* Z floating defined in ohms */ 678d78602aSSrinivas Kandagatla #define WCD938X_ZDET_FLOATING_IMPEDANCE (0x0FFFFFFE) 688d78602aSSrinivas Kandagatla #define WCD938X_ZDET_NUM_MEASUREMENTS (900) 698d78602aSSrinivas Kandagatla #define WCD938X_MBHC_GET_C1(c) ((c & 0xC000) >> 14) 708d78602aSSrinivas Kandagatla #define WCD938X_MBHC_GET_X1(x) (x & 0x3FFF) 718d78602aSSrinivas Kandagatla /* Z value compared in milliOhm */ 728d78602aSSrinivas Kandagatla #define WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) 738d78602aSSrinivas Kandagatla #define WCD938X_MBHC_ZDET_CONST (86 * 16384) 748d78602aSSrinivas Kandagatla #define WCD938X_MBHC_MOISTURE_RREF R_24_KOHM 758d78602aSSrinivas Kandagatla #define WCD_MBHC_HS_V_MAX 1600 768d78602aSSrinivas Kandagatla 77*e8ba1e05SSrinivas Kandagatla #define WCD938X_EAR_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \ 78*e8ba1e05SSrinivas Kandagatla { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 79*e8ba1e05SSrinivas Kandagatla .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ 80*e8ba1e05SSrinivas Kandagatla SNDRV_CTL_ELEM_ACCESS_READWRITE,\ 81*e8ba1e05SSrinivas Kandagatla .tlv.p = (tlv_array), \ 82*e8ba1e05SSrinivas Kandagatla .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\ 83*e8ba1e05SSrinivas Kandagatla .put = wcd938x_ear_pa_put_gain, \ 84*e8ba1e05SSrinivas Kandagatla .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } 85*e8ba1e05SSrinivas Kandagatla 868d78602aSSrinivas Kandagatla enum { 878d78602aSSrinivas Kandagatla WCD9380 = 0, 888d78602aSSrinivas Kandagatla WCD9385 = 5, 898d78602aSSrinivas Kandagatla }; 908d78602aSSrinivas Kandagatla 918d78602aSSrinivas Kandagatla enum { 928d78602aSSrinivas Kandagatla TX_HDR12 = 0, 938d78602aSSrinivas Kandagatla TX_HDR34, 948d78602aSSrinivas Kandagatla TX_HDR_MAX, 958d78602aSSrinivas Kandagatla }; 968d78602aSSrinivas Kandagatla 978d78602aSSrinivas Kandagatla enum { 988d78602aSSrinivas Kandagatla WCD_RX1, 998d78602aSSrinivas Kandagatla WCD_RX2, 1008d78602aSSrinivas Kandagatla WCD_RX3 1018d78602aSSrinivas Kandagatla }; 1028d78602aSSrinivas Kandagatla 1038d78602aSSrinivas Kandagatla enum { 1048d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_0 */ 1058d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_PRESS_DET = 0, 1068d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 1078d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 1088d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 1098d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_SW_DET, 1108d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_OCP_INT, 1118d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_CNP_INT, 1128d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_OCP_INT, 1138d78602aSSrinivas Kandagatla 1148d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_1 */ 1158d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_CNP_INT, 1168d78602aSSrinivas Kandagatla WCD938X_IRQ_EAR_CNP_INT, 1178d78602aSSrinivas Kandagatla WCD938X_IRQ_EAR_SCD_INT, 1188d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_CNP_INT, 1198d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_SCD_INT, 1208d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT, 1218d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT, 1228d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT, 1238d78602aSSrinivas Kandagatla 1248d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_2 */ 1258d78602aSSrinivas Kandagatla WCD938X_IRQ_LDORT_SCD_INT, 1268d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_MOISTURE_INT, 1278d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_SURGE_DET_INT, 1288d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_SURGE_DET_INT, 1298d78602aSSrinivas Kandagatla WCD938X_NUM_IRQS, 1308d78602aSSrinivas Kandagatla }; 1318d78602aSSrinivas Kandagatla 1328d78602aSSrinivas Kandagatla enum { 1338d78602aSSrinivas Kandagatla WCD_ADC1 = 0, 1348d78602aSSrinivas Kandagatla WCD_ADC2, 1358d78602aSSrinivas Kandagatla WCD_ADC3, 1368d78602aSSrinivas Kandagatla WCD_ADC4, 1378d78602aSSrinivas Kandagatla ALLOW_BUCK_DISABLE, 1388d78602aSSrinivas Kandagatla HPH_COMP_DELAY, 1398d78602aSSrinivas Kandagatla HPH_PA_DELAY, 1408d78602aSSrinivas Kandagatla AMIC2_BCS_ENABLE, 1418d78602aSSrinivas Kandagatla WCD_SUPPLIES_LPM_MODE, 1428d78602aSSrinivas Kandagatla }; 1438d78602aSSrinivas Kandagatla 1448d78602aSSrinivas Kandagatla enum { 1458d78602aSSrinivas Kandagatla ADC_MODE_INVALID = 0, 1468d78602aSSrinivas Kandagatla ADC_MODE_HIFI, 1478d78602aSSrinivas Kandagatla ADC_MODE_LO_HIF, 1488d78602aSSrinivas Kandagatla ADC_MODE_NORMAL, 1498d78602aSSrinivas Kandagatla ADC_MODE_LP, 1508d78602aSSrinivas Kandagatla ADC_MODE_ULP1, 1518d78602aSSrinivas Kandagatla ADC_MODE_ULP2, 1528d78602aSSrinivas Kandagatla }; 1538d78602aSSrinivas Kandagatla 1548d78602aSSrinivas Kandagatla enum { 1558d78602aSSrinivas Kandagatla AIF1_PB = 0, 1568d78602aSSrinivas Kandagatla AIF1_CAP, 1578d78602aSSrinivas Kandagatla NUM_CODEC_DAIS, 1588d78602aSSrinivas Kandagatla }; 1598d78602aSSrinivas Kandagatla 1608d78602aSSrinivas Kandagatla struct wcd938x_priv { 1618d78602aSSrinivas Kandagatla struct sdw_slave *tx_sdw_dev; 1628d78602aSSrinivas Kandagatla struct wcd938x_sdw_priv *sdw_priv[NUM_CODEC_DAIS]; 1638d78602aSSrinivas Kandagatla struct device *txdev; 1648d78602aSSrinivas Kandagatla struct device *rxdev; 1658d78602aSSrinivas Kandagatla struct device_node *rxnode, *txnode; 1668d78602aSSrinivas Kandagatla struct regmap *regmap; 1678d78602aSSrinivas Kandagatla struct wcd_clsh_ctrl *clsh_info; 1688d78602aSSrinivas Kandagatla struct irq_domain *virq; 1698d78602aSSrinivas Kandagatla struct regmap_irq_chip *wcd_regmap_irq_chip; 1708d78602aSSrinivas Kandagatla struct regmap_irq_chip_data *irq_chip; 1718d78602aSSrinivas Kandagatla struct regulator_bulk_data supplies[WCD938X_MAX_SUPPLY]; 1728d78602aSSrinivas Kandagatla struct snd_soc_jack *jack; 1738d78602aSSrinivas Kandagatla unsigned long status_mask; 1748d78602aSSrinivas Kandagatla s32 micb_ref[WCD938X_MAX_MICBIAS]; 1758d78602aSSrinivas Kandagatla s32 pullup_ref[WCD938X_MAX_MICBIAS]; 1768d78602aSSrinivas Kandagatla u32 hph_mode; 1778d78602aSSrinivas Kandagatla u32 tx_mode[TX_ADC_MAX]; 1788d78602aSSrinivas Kandagatla int flyback_cur_det_disable; 1798d78602aSSrinivas Kandagatla int ear_rx_path; 1808d78602aSSrinivas Kandagatla int variant; 1818d78602aSSrinivas Kandagatla int reset_gpio; 1828d78602aSSrinivas Kandagatla u32 micb1_mv; 1838d78602aSSrinivas Kandagatla u32 micb2_mv; 1848d78602aSSrinivas Kandagatla u32 micb3_mv; 1858d78602aSSrinivas Kandagatla u32 micb4_mv; 1868d78602aSSrinivas Kandagatla int hphr_pdm_wd_int; 1878d78602aSSrinivas Kandagatla int hphl_pdm_wd_int; 1888d78602aSSrinivas Kandagatla int aux_pdm_wd_int; 1898d78602aSSrinivas Kandagatla bool comp1_enable; 1908d78602aSSrinivas Kandagatla bool comp2_enable; 1918d78602aSSrinivas Kandagatla bool ldoh; 1928d78602aSSrinivas Kandagatla bool bcs_dis; 1938d78602aSSrinivas Kandagatla }; 1948d78602aSSrinivas Kandagatla 1958d78602aSSrinivas Kandagatla enum { 1968d78602aSSrinivas Kandagatla MIC_BIAS_1 = 1, 1978d78602aSSrinivas Kandagatla MIC_BIAS_2, 1988d78602aSSrinivas Kandagatla MIC_BIAS_3, 1998d78602aSSrinivas Kandagatla MIC_BIAS_4 2008d78602aSSrinivas Kandagatla }; 2018d78602aSSrinivas Kandagatla 2028d78602aSSrinivas Kandagatla enum { 2038d78602aSSrinivas Kandagatla MICB_PULLUP_ENABLE, 2048d78602aSSrinivas Kandagatla MICB_PULLUP_DISABLE, 2058d78602aSSrinivas Kandagatla MICB_ENABLE, 2068d78602aSSrinivas Kandagatla MICB_DISABLE, 2078d78602aSSrinivas Kandagatla }; 2088d78602aSSrinivas Kandagatla 209*e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800); 210*e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(line_gain, 600, -3000); 211*e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(analog_gain, 0, 3000); 212*e8ba1e05SSrinivas Kandagatla 2138d78602aSSrinivas Kandagatla static const struct reg_default wcd938x_defaults[] = { 2148d78602aSSrinivas Kandagatla {WCD938X_ANA_PAGE_REGISTER, 0x00}, 2158d78602aSSrinivas Kandagatla {WCD938X_ANA_BIAS, 0x00}, 2168d78602aSSrinivas Kandagatla {WCD938X_ANA_RX_SUPPLIES, 0x00}, 2178d78602aSSrinivas Kandagatla {WCD938X_ANA_HPH, 0x0C}, 2188d78602aSSrinivas Kandagatla {WCD938X_ANA_EAR, 0x00}, 2198d78602aSSrinivas Kandagatla {WCD938X_ANA_EAR_COMPANDER_CTL, 0x02}, 2208d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH1, 0x20}, 2218d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH2, 0x00}, 2228d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH3, 0x20}, 2238d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH4, 0x00}, 2248d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00}, 2258d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB3_DSP_EN_LOGIC, 0x00}, 2268d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_MECH, 0x39}, 2278d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_ELECT, 0x08}, 2288d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_ZDET, 0x00}, 2298d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_1, 0x00}, 2308d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_2, 0x00}, 2318d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_3, 0x00}, 2328d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN0, 0x00}, 2338d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN1, 0x10}, 2348d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN2, 0x20}, 2358d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN3, 0x30}, 2368d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN4, 0x40}, 2378d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN5, 0x50}, 2388d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN6, 0x60}, 2398d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN7, 0x70}, 2408d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB1, 0x10}, 2418d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB2, 0x10}, 2428d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB2_RAMP, 0x00}, 2438d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB3, 0x10}, 2448d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB4, 0x10}, 2458d78602aSSrinivas Kandagatla {WCD938X_BIAS_CTL, 0x2A}, 2468d78602aSSrinivas Kandagatla {WCD938X_BIAS_VBG_FINE_ADJ, 0x55}, 2478d78602aSSrinivas Kandagatla {WCD938X_LDOL_VDDCX_ADJUST, 0x01}, 2488d78602aSSrinivas Kandagatla {WCD938X_LDOL_DISABLE_LDOL, 0x00}, 2498d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_CLK, 0x00}, 2508d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_ANA, 0x00}, 2518d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_SPARE_1, 0x00}, 2528d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_SPARE_2, 0x00}, 2538d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_BCS, 0x00}, 2548d78602aSSrinivas Kandagatla {WCD938X_MBHC_MOISTURE_DET_FSM_STATUS, 0x00}, 2558d78602aSSrinivas Kandagatla {WCD938X_MBHC_TEST_CTL, 0x00}, 2568d78602aSSrinivas Kandagatla {WCD938X_LDOH_MODE, 0x2B}, 2578d78602aSSrinivas Kandagatla {WCD938X_LDOH_BIAS, 0x68}, 2588d78602aSSrinivas Kandagatla {WCD938X_LDOH_STB_LOADS, 0x00}, 2598d78602aSSrinivas Kandagatla {WCD938X_LDOH_SLOWRAMP, 0x50}, 2608d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_1, 0x1A}, 2618d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_2, 0x00}, 2628d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_3, 0xA4}, 2638d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_1, 0x1A}, 2648d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_2, 0x00}, 2658d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_3, 0x24}, 2668d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_1, 0x1A}, 2678d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_2, 0x00}, 2688d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_3, 0xA4}, 2698d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_1, 0x1A}, 2708d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_2, 0x00}, 2718d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_3, 0xA4}, 2728d78602aSSrinivas Kandagatla {WCD938X_TX_COM_ADC_VCM, 0x39}, 2738d78602aSSrinivas Kandagatla {WCD938X_TX_COM_BIAS_ATEST, 0xE0}, 2748d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE1, 0x00}, 2758d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE2, 0x00}, 2768d78602aSSrinivas Kandagatla {WCD938X_TX_COM_TXFE_DIV_CTL, 0x22}, 2778d78602aSSrinivas Kandagatla {WCD938X_TX_COM_TXFE_DIV_START, 0x00}, 2788d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE3, 0x00}, 2798d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE4, 0x00}, 2808d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_EN, 0xCC}, 2818d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_ADC_IB, 0xE9}, 2828d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_ATEST_REFCTL, 0x0A}, 2838d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_CTL, 0x38}, 2848d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_BLK_EN1, 0xFF}, 2858d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TXFE1_CLKDIV, 0x00}, 2868d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_SAR2_ERR, 0x00}, 2878d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_SAR1_ERR, 0x00}, 2888d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_EN, 0xCC}, 2898d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_ADC_IB, 0xE9}, 2908d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_ATEST_REFCTL, 0x0A}, 2918d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_CTL, 0x38}, 2928d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN3, 0xFF}, 2938d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE3_CLKDIV, 0x00}, 2948d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SAR4_ERR, 0x00}, 2958d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SAR3_ERR, 0x00}, 2968d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN2, 0xFB}, 2978d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE2_CLKDIV, 0x00}, 2988d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SPARE1, 0x00}, 2998d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN4, 0xFB}, 3008d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE4_CLKDIV, 0x00}, 3018d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SPARE2, 0x00}, 3028d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_1, 0x40}, 3038d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_2, 0x3A}, 3048d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_3, 0x00}, 3058d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_VCL_1, 0x70}, 3068d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_VCL_2, 0x82}, 3078d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_1, 0x31}, 3088d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_2, 0x80}, 3098d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_3, 0x80}, 3108d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_4, 0x51}, 3118d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_5, 0x00}, 3128d78602aSSrinivas Kandagatla {WCD938X_CLASSH_BUCK_TMUX_A_D, 0x00}, 3138d78602aSSrinivas Kandagatla {WCD938X_CLASSH_BUCK_SW_DRV_CNTL, 0x77}, 3148d78602aSSrinivas Kandagatla {WCD938X_CLASSH_SPARE, 0x00}, 3158d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_EN, 0x4E}, 3168d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_1, 0x0B}, 3178d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_2, 0x45}, 3188d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_3, 0x74}, 3198d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_4, 0x7F}, 3208d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_5, 0x83}, 3218d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_6, 0x98}, 3228d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_7, 0xA9}, 3238d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_8, 0x68}, 3248d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_9, 0x64}, 3258d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_1, 0xED}, 3268d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_2, 0xF0}, 3278d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_3, 0xA6}, 3288d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_CTRL_1, 0x65}, 3298d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_TEST_CTL, 0x00}, 3308d78602aSSrinivas Kandagatla {WCD938X_RX_AUX_SW_CTL, 0x00}, 3318d78602aSSrinivas Kandagatla {WCD938X_RX_PA_AUX_IN_CONN, 0x01}, 3328d78602aSSrinivas Kandagatla {WCD938X_RX_TIMER_DIV, 0x32}, 3338d78602aSSrinivas Kandagatla {WCD938X_RX_OCP_CTL, 0x1F}, 3348d78602aSSrinivas Kandagatla {WCD938X_RX_OCP_COUNT, 0x77}, 3358d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_EAR_DAC, 0xA0}, 3368d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_EAR_AMP, 0xAA}, 3378d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_LDO, 0xA9}, 3388d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_PA, 0xAA}, 3398d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A}, 3408d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_RDAC_LDO, 0x88}, 3418d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_CNP1, 0x82}, 3428d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_LOWPOWER, 0x82}, 3438d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_AUX_DAC, 0xA0}, 3448d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_AUX_AMP, 0xAA}, 3458d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_VNEGDAC_BLEEDER, 0x50}, 3468d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_MISC, 0x00}, 3478d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_BUCK_RST, 0x08}, 3488d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44}, 3498d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_ERRAMP, 0x40}, 3508d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_BUFF, 0xAA}, 3518d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_MID_RST, 0x14}, 3528d78602aSSrinivas Kandagatla {WCD938X_HPH_L_STATUS, 0x04}, 3538d78602aSSrinivas Kandagatla {WCD938X_HPH_R_STATUS, 0x04}, 3548d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_EN, 0x80}, 3558d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_WG_CTL, 0x9A}, 3568d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_WG_TIME, 0x14}, 3578d78602aSSrinivas Kandagatla {WCD938X_HPH_OCP_CTL, 0x28}, 3588d78602aSSrinivas Kandagatla {WCD938X_HPH_AUTO_CHOP, 0x16}, 3598d78602aSSrinivas Kandagatla {WCD938X_HPH_CHOP_CTL, 0x83}, 3608d78602aSSrinivas Kandagatla {WCD938X_HPH_PA_CTL1, 0x46}, 3618d78602aSSrinivas Kandagatla {WCD938X_HPH_PA_CTL2, 0x50}, 3628d78602aSSrinivas Kandagatla {WCD938X_HPH_L_EN, 0x80}, 3638d78602aSSrinivas Kandagatla {WCD938X_HPH_L_TEST, 0xE0}, 3648d78602aSSrinivas Kandagatla {WCD938X_HPH_L_ATEST, 0x50}, 3658d78602aSSrinivas Kandagatla {WCD938X_HPH_R_EN, 0x80}, 3668d78602aSSrinivas Kandagatla {WCD938X_HPH_R_TEST, 0xE0}, 3678d78602aSSrinivas Kandagatla {WCD938X_HPH_R_ATEST, 0x54}, 3688d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CLK_CTL1, 0x99}, 3698d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CLK_CTL2, 0x9B}, 3708d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_LDO_CTL, 0x33}, 3718d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00}, 3728d78602aSSrinivas Kandagatla {WCD938X_HPH_REFBUFF_UHQA_CTL, 0x68}, 3738d78602aSSrinivas Kandagatla {WCD938X_HPH_REFBUFF_LP_CTL, 0x0E}, 3748d78602aSSrinivas Kandagatla {WCD938X_HPH_L_DAC_CTL, 0x20}, 3758d78602aSSrinivas Kandagatla {WCD938X_HPH_R_DAC_CTL, 0x20}, 3768d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL, 0x55}, 3778d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0x19}, 3788d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1, 0xA0}, 3798d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS, 0x00}, 3808d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_EN_REG, 0x22}, 3818d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_PA_CON, 0x44}, 3828d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_SP_CON, 0xDB}, 3838d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_DAC_CON, 0x80}, 3848d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_CNP_FSM_CON, 0xB2}, 3858d78602aSSrinivas Kandagatla {WCD938X_EAR_TEST_CTL, 0x00}, 3868d78602aSSrinivas Kandagatla {WCD938X_EAR_STATUS_REG_1, 0x00}, 3878d78602aSSrinivas Kandagatla {WCD938X_EAR_STATUS_REG_2, 0x08}, 3888d78602aSSrinivas Kandagatla {WCD938X_ANA_NEW_PAGE_REGISTER, 0x00}, 3898d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_ANA_HPH2, 0x00}, 3908d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_ANA_HPH3, 0x00}, 3918d78602aSSrinivas Kandagatla {WCD938X_SLEEP_CTL, 0x16}, 3928d78602aSSrinivas Kandagatla {WCD938X_SLEEP_WATCHDOG_CTL, 0x00}, 3938d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00}, 3948d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_CTL_1, 0x02}, 3958d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_CTL_2, 0x05}, 3968d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0xE9}, 3978d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ZDET_ANA_CTL, 0x0F}, 3988d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ZDET_RAMP_CTL, 0x00}, 3998d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_FSM_STATUS, 0x00}, 4008d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ADC_RESULT, 0x00}, 4018d78602aSSrinivas Kandagatla {WCD938X_TX_NEW_AMIC_MUX_CFG, 0x00}, 4028d78602aSSrinivas Kandagatla {WCD938X_AUX_AUXPA, 0x00}, 4038d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_MODE, 0x0C}, 4048d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_CONFIG, 0x10}, 4058d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_DIE_CRK_DET_EN, 0x00}, 4068d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_DIE_CRK_DET_OUT, 0x00}, 4078d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40}, 4088d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81}, 4098d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10}, 4108d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00}, 4118d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81}, 4128d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_MISC1, 0x22}, 4138d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_MISC2, 0x00}, 4148d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC, 0x00}, 4158d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER1, 0xFE}, 4168d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER2, 0x02}, 4178d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER3, 0x4E}, 4188d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER4, 0x54}, 4198d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00}, 4208d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00}, 4218d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 0x90}, 4228d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 0x90}, 4238d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62}, 4248d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01}, 4258d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11}, 4268d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57}, 4278d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01}, 4288d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00}, 4298d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_SPARE_2, 0x00}, 4308d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8}, 4318d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_CNP_VCM_CON1, 0x42}, 4328d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_CNP_VCM_CON2, 0x22}, 4338d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00}, 4348d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_EN_REG, 0x00}, 4358d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_PA_CTRL, 0x06}, 4368d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_SP_CTRL, 0xD2}, 4378d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_DAC_CTRL, 0x80}, 4388d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_CLK_CTRL, 0x50}, 4398d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_TEST_CTRL, 0x00}, 4408d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_STATUS_REG, 0x00}, 4418d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_MISC, 0x00}, 4428d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_BIAS, 0x6E}, 4438d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STB_LOADS_DTEST, 0x50}, 4448d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_TEST0, 0x1C}, 4458d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STARTUP_TIMER, 0xFF}, 4468d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_TEST1, 0x1F}, 4478d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STATUS, 0x00}, 4488d78602aSSrinivas Kandagatla {WCD938X_SLEEP_INT_WATCHDOG_CTL_1, 0x0A}, 4498d78602aSSrinivas Kandagatla {WCD938X_SLEEP_INT_WATCHDOG_CTL_2, 0x0A}, 4508d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1, 0x02}, 4518d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2, 0x60}, 4528d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2, 0xFF}, 4538d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1, 0x7F}, 4548d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0, 0x3F}, 4558d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M, 0x1F}, 4568d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M, 0x0F}, 4578d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1, 0xD7}, 4588d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0, 0xC8}, 4598d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP, 0xC6}, 4608d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1, 0xD5}, 4618d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0, 0xCA}, 4628d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 0x05}, 4638d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0, 0xA5}, 4648d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 0x13}, 4658d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1, 0x88}, 4668d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP, 0x42}, 4678d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L2, 0xFF}, 4688d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L1, 0x64}, 4698d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L0, 0x64}, 4708d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP, 0x77}, 4718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAGE_REGISTER, 0x00}, 4728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID0, 0x00}, 4738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID1, 0x00}, 4748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID2, 0x0D}, 4758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID3, 0x01}, 4768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_TX_CLK_RATE, 0x00}, 4778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RST_CTL, 0x03}, 4788d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TOP_CLK_CFG, 0x00}, 4798d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x00}, 4808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0xF0}, 4818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_RST_EN, 0x00}, 4828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_PATH_MODE, 0x55}, 4838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX_RST, 0x00}, 4848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX0_CTL, 0xFC}, 4858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX1_CTL, 0xFC}, 4868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX2_CTL, 0xFC}, 4878d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x00}, 4888d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x00}, 4898d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x00}, 4908d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 0x1E}, 4918d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00}, 4928d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01}, 4938d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63}, 4948d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04}, 4958d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A3_0, 0xAC}, 4968d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04}, 4978d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1A}, 4988d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03}, 4998d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A5_0, 0xBC}, 5008d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02}, 5018d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A6_0, 0xC7}, 5028d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A7_0, 0xF8}, 5038d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_0, 0x47}, 5048d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_1, 0x43}, 5058d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_2, 0xB1}, 5068d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_3, 0x17}, 5078d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R1, 0x4D}, 5088d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R2, 0x29}, 5098d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R3, 0x34}, 5108d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R4, 0x59}, 5118d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R5, 0x66}, 5128d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R6, 0x87}, 5138d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R7, 0x64}, 5148d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A1_0, 0x00}, 5158d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A1_1, 0x01}, 5168d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A2_0, 0x96}, 5178d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A2_1, 0x09}, 5188d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A3_0, 0xAB}, 5198d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A3_1, 0x05}, 5208d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A4_0, 0x1C}, 5218d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A4_1, 0x02}, 5228d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A5_0, 0x17}, 5238d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A5_1, 0x02}, 5248d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A6_0, 0xAA}, 5258d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A7_0, 0xE3}, 5268d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_0, 0x69}, 5278d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_1, 0x54}, 5288d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_2, 0x02}, 5298d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_3, 0x15}, 5308d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R1, 0xA4}, 5318d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R2, 0xB5}, 5328d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R3, 0x86}, 5338d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R4, 0x85}, 5348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R5, 0xAA}, 5358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R6, 0xE2}, 5368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R7, 0x62}, 5378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55}, 5388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xA9}, 5398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3D}, 5408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2E}, 5418d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01}, 5428d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0, 0x00}, 5438d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1, 0xFC}, 5448d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2, 0x01}, 5458d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00}, 5468d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x00}, 5478d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0x00}, 5488d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_SWR_CLH, 0x00}, 5498d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_CLH_BYP, 0x00}, 5508d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX0_CTL, 0x68}, 5518d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX1_CTL, 0x68}, 5528d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX2_CTL, 0x68}, 5538d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_RST, 0x00}, 5548d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_REQ_CTL, 0x01}, 5558d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RST, 0x00}, 5568d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AMIC_CTL, 0x0F}, 5578d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_CTL, 0x04}, 5588d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC1_CTL, 0x01}, 5598d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC2_CTL, 0x01}, 5608d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC3_CTL, 0x01}, 5618d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC4_CTL, 0x01}, 5628d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_PRG_CTL, 0x00}, 5638d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_CTL, 0x2B}, 5648d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_RATE_1_2, 0x11}, 5658d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_RATE_3_4, 0x11}, 5668d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL0, 0x00}, 5678d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL1, 0x00}, 5688d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL2, 0x00}, 5698d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MODE, 0x00}, 5708d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_0, 0xFF}, 5718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_1, 0xFF}, 5728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_2, 0x3F}, 5738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_0, 0x00}, 5748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_1, 0x00}, 5758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_2, 0x00}, 5768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_0, 0x00}, 5778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_1, 0x00}, 5788d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_2, 0x00}, 5798d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_0, 0x00}, 5808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_1, 0x00}, 5818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_2, 0x00}, 5828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_0, 0x00}, 5838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_1, 0x00}, 5848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_2, 0x00}, 5858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_0, 0x00}, 5868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_1, 0x00}, 5878d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_2, 0x00}, 5888d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_EN, 0x00}, 5898d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_0_1, 0x00}, 5908d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_2_3, 0x00}, 5918d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_LB_IN_SEL_CTL, 0x00}, 5928d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_LOOP_BACK_MODE, 0x00}, 5938d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_DAC_TEST, 0x00}, 5948d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_RX_0, 0x40}, 5958d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_0, 0x40}, 5968d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_RX_1, 0x00}, 5978d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_1, 0x00}, 5988d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_2, 0x00}, 5998d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_0, 0x00}, 6008d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_1, 0x00}, 6018d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_SWR_0, 0x8F}, 6028d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_SWR_1, 0x06}, 6038d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_I2C_CTL, 0x00}, 6048d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE, 0x00}, 6058d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_TEST_CTL_0, 0x00}, 6068d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_TEST_CTL_1, 0x00}, 6078d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_T_DATA_0, 0x00}, 6088d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_T_DATA_1, 0x00}, 6098d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_RX0, 0xF1}, 6108d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_RX1, 0xF1}, 6118d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX0, 0xF1}, 6128d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX1, 0xF1}, 6138d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX2, 0xF1}, 6148d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_INP_DIS_0, 0x00}, 6158d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_INP_DIS_1, 0x00}, 6168d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_0, 0x00}, 6178d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_1, 0x00}, 6188d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_2, 0x00}, 6198d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_RX_DATA_EDGE_CTL, 0x1F}, 6208d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_DATA_EDGE_CTL, 0x80}, 6218d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_GPIO_MODE, 0x00}, 6228d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_OE, 0x00}, 6238d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_DATA_0, 0x00}, 6248d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_DATA_1, 0x00}, 6258d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_STATUS_0, 0x00}, 6268d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_STATUS_1, 0x00}, 6278d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DIG_DEBUG_CTL, 0x00}, 6288d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DIG_DEBUG_EN, 0x00}, 6298d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_ANA_CSR_DBG_ADD, 0x00}, 6308d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_ANA_CSR_DBG_CTL, 0x48}, 6318d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SSP_DBG, 0x00}, 6328d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_MODE_STATUS_0, 0x00}, 6338d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_MODE_STATUS_1, 0x00}, 6348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_0, 0x00}, 6358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_1, 0x00}, 6368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_2, 0x00}, 6378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_0, 0x00}, 6388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_1, 0xFF}, 6398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_2, 0xFF}, 6408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_3, 0xFF}, 6418d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_4, 0xFF}, 6428d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_5, 0xFF}, 6438d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_6, 0xFF}, 6448d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_7, 0xFF}, 6458d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_8, 0xFF}, 6468d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_9, 0xFF}, 6478d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_10, 0xFF}, 6488d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_11, 0xFF}, 6498d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_12, 0xFF}, 6508d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_13, 0xFF}, 6518d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_14, 0xFF}, 6528d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_15, 0xFF}, 6538d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_16, 0xFF}, 6548d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_17, 0xFF}, 6558d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_18, 0xFF}, 6568d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_19, 0xFF}, 6578d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_20, 0x0E}, 6588d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_21, 0x00}, 6598d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_22, 0x00}, 6608d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_23, 0xF8}, 6618d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_24, 0x16}, 6628d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_25, 0x00}, 6638d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_26, 0x00}, 6648d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_27, 0x00}, 6658d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_28, 0x00}, 6668d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_29, 0x00}, 6678d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_30, 0x00}, 6688d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_31, 0x00}, 6698d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0x88}, 6708d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0x88}, 6718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0x88}, 6728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0x88}, 6738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0x88}, 6748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA0, 0x55}, 6758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA1, 0x55}, 6768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA2, 0x55}, 6778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA3, 0x01}, 6788d78602aSSrinivas Kandagatla }; 6798d78602aSSrinivas Kandagatla 6808d78602aSSrinivas Kandagatla static bool wcd938x_rdwr_register(struct device *dev, unsigned int reg) 6818d78602aSSrinivas Kandagatla { 6828d78602aSSrinivas Kandagatla switch (reg) { 6838d78602aSSrinivas Kandagatla case WCD938X_ANA_PAGE_REGISTER: 6848d78602aSSrinivas Kandagatla case WCD938X_ANA_BIAS: 6858d78602aSSrinivas Kandagatla case WCD938X_ANA_RX_SUPPLIES: 6868d78602aSSrinivas Kandagatla case WCD938X_ANA_HPH: 6878d78602aSSrinivas Kandagatla case WCD938X_ANA_EAR: 6888d78602aSSrinivas Kandagatla case WCD938X_ANA_EAR_COMPANDER_CTL: 6898d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH1: 6908d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH2: 6918d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH3: 6928d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH4: 6938d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC: 6948d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB3_DSP_EN_LOGIC: 6958d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_MECH: 6968d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_ELECT: 6978d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_ZDET: 6988d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN0: 6998d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN1: 7008d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN2: 7018d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN3: 7028d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN4: 7038d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN5: 7048d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN6: 7058d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN7: 7068d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB1: 7078d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB2: 7088d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB2_RAMP: 7098d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB3: 7108d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB4: 7118d78602aSSrinivas Kandagatla case WCD938X_BIAS_CTL: 7128d78602aSSrinivas Kandagatla case WCD938X_BIAS_VBG_FINE_ADJ: 7138d78602aSSrinivas Kandagatla case WCD938X_LDOL_VDDCX_ADJUST: 7148d78602aSSrinivas Kandagatla case WCD938X_LDOL_DISABLE_LDOL: 7158d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_CLK: 7168d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_ANA: 7178d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_SPARE_1: 7188d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_SPARE_2: 7198d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_BCS: 7208d78602aSSrinivas Kandagatla case WCD938X_MBHC_TEST_CTL: 7218d78602aSSrinivas Kandagatla case WCD938X_LDOH_MODE: 7228d78602aSSrinivas Kandagatla case WCD938X_LDOH_BIAS: 7238d78602aSSrinivas Kandagatla case WCD938X_LDOH_STB_LOADS: 7248d78602aSSrinivas Kandagatla case WCD938X_LDOH_SLOWRAMP: 7258d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_1: 7268d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_2: 7278d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_3: 7288d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_1: 7298d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_2: 7308d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_3: 7318d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_1: 7328d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_2: 7338d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_3: 7348d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_1: 7358d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_2: 7368d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_3: 7378d78602aSSrinivas Kandagatla case WCD938X_TX_COM_ADC_VCM: 7388d78602aSSrinivas Kandagatla case WCD938X_TX_COM_BIAS_ATEST: 7398d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE1: 7408d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE2: 7418d78602aSSrinivas Kandagatla case WCD938X_TX_COM_TXFE_DIV_CTL: 7428d78602aSSrinivas Kandagatla case WCD938X_TX_COM_TXFE_DIV_START: 7438d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE3: 7448d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE4: 7458d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_EN: 7468d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_ADC_IB: 7478d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_ATEST_REFCTL: 7488d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_CTL: 7498d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_BLK_EN1: 7508d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TXFE1_CLKDIV: 7518d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_EN: 7528d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_ADC_IB: 7538d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_ATEST_REFCTL: 7548d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_CTL: 7558d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN3: 7568d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE3_CLKDIV: 7578d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN2: 7588d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE2_CLKDIV: 7598d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SPARE1: 7608d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN4: 7618d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE4_CLKDIV: 7628d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SPARE2: 7638d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_1: 7648d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_2: 7658d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_3: 7668d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_VCL_1: 7678d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_VCL_2: 7688d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_1: 7698d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_2: 7708d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_3: 7718d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_4: 7728d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_5: 7738d78602aSSrinivas Kandagatla case WCD938X_CLASSH_BUCK_TMUX_A_D: 7748d78602aSSrinivas Kandagatla case WCD938X_CLASSH_BUCK_SW_DRV_CNTL: 7758d78602aSSrinivas Kandagatla case WCD938X_CLASSH_SPARE: 7768d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_EN: 7778d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_1: 7788d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_2: 7798d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_3: 7808d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_4: 7818d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_5: 7828d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_6: 7838d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_7: 7848d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_8: 7858d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_9: 7868d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_1: 7878d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_2: 7888d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_3: 7898d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_CTRL_1: 7908d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_TEST_CTL: 7918d78602aSSrinivas Kandagatla case WCD938X_RX_AUX_SW_CTL: 7928d78602aSSrinivas Kandagatla case WCD938X_RX_PA_AUX_IN_CONN: 7938d78602aSSrinivas Kandagatla case WCD938X_RX_TIMER_DIV: 7948d78602aSSrinivas Kandagatla case WCD938X_RX_OCP_CTL: 7958d78602aSSrinivas Kandagatla case WCD938X_RX_OCP_COUNT: 7968d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_EAR_DAC: 7978d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_EAR_AMP: 7988d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_LDO: 7998d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_PA: 8008d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2: 8018d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_RDAC_LDO: 8028d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_CNP1: 8038d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_LOWPOWER: 8048d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_AUX_DAC: 8058d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_AUX_AMP: 8068d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_VNEGDAC_BLEEDER: 8078d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_MISC: 8088d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_BUCK_RST: 8098d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_BUCK_VREF_ERRAMP: 8108d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_ERRAMP: 8118d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_BUFF: 8128d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_MID_RST: 8138d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_EN: 8148d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_WG_CTL: 8158d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_WG_TIME: 8168d78602aSSrinivas Kandagatla case WCD938X_HPH_OCP_CTL: 8178d78602aSSrinivas Kandagatla case WCD938X_HPH_AUTO_CHOP: 8188d78602aSSrinivas Kandagatla case WCD938X_HPH_CHOP_CTL: 8198d78602aSSrinivas Kandagatla case WCD938X_HPH_PA_CTL1: 8208d78602aSSrinivas Kandagatla case WCD938X_HPH_PA_CTL2: 8218d78602aSSrinivas Kandagatla case WCD938X_HPH_L_EN: 8228d78602aSSrinivas Kandagatla case WCD938X_HPH_L_TEST: 8238d78602aSSrinivas Kandagatla case WCD938X_HPH_L_ATEST: 8248d78602aSSrinivas Kandagatla case WCD938X_HPH_R_EN: 8258d78602aSSrinivas Kandagatla case WCD938X_HPH_R_TEST: 8268d78602aSSrinivas Kandagatla case WCD938X_HPH_R_ATEST: 8278d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CLK_CTL1: 8288d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CLK_CTL2: 8298d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_LDO_CTL: 8308d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL: 8318d78602aSSrinivas Kandagatla case WCD938X_HPH_REFBUFF_UHQA_CTL: 8328d78602aSSrinivas Kandagatla case WCD938X_HPH_REFBUFF_LP_CTL: 8338d78602aSSrinivas Kandagatla case WCD938X_HPH_L_DAC_CTL: 8348d78602aSSrinivas Kandagatla case WCD938X_HPH_R_DAC_CTL: 8358d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL: 8368d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_EN: 8378d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1: 8388d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_EN_REG: 8398d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_PA_CON: 8408d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_SP_CON: 8418d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_DAC_CON: 8428d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_CNP_FSM_CON: 8438d78602aSSrinivas Kandagatla case WCD938X_EAR_TEST_CTL: 8448d78602aSSrinivas Kandagatla case WCD938X_ANA_NEW_PAGE_REGISTER: 8458d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_ANA_HPH2: 8468d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_ANA_HPH3: 8478d78602aSSrinivas Kandagatla case WCD938X_SLEEP_CTL: 8488d78602aSSrinivas Kandagatla case WCD938X_SLEEP_WATCHDOG_CTL: 8498d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL: 8508d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_CTL_1: 8518d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_CTL_2: 8528d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_PLUG_DETECT_CTL: 8538d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ZDET_ANA_CTL: 8548d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ZDET_RAMP_CTL: 8558d78602aSSrinivas Kandagatla case WCD938X_TX_NEW_AMIC_MUX_CFG: 8568d78602aSSrinivas Kandagatla case WCD938X_AUX_AUXPA: 8578d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_MODE: 8588d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_CONFIG: 8598d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_DIE_CRK_DET_EN: 8608d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL: 8618d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L: 8628d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_VREF_CTL: 8638d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL: 8648d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R: 8658d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_MISC1: 8668d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_MISC2: 8678d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC: 8688d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER1: 8698d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER2: 8708d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER3: 8718d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER4: 8728d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC2: 8738d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC3: 8748d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW: 8758d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW: 8768d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI: 8778d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP: 8788d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP: 8798d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL: 8808d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL: 8818d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT: 8828d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_SPARE_2: 8838d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON: 8848d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_CNP_VCM_CON1: 8858d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_CNP_VCM_CON2: 8868d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS: 8878d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_EN_REG: 8888d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_PA_CTRL: 8898d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_SP_CTRL: 8908d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_DAC_CTRL: 8918d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_CLK_CTRL: 8928d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_TEST_CTRL: 8938d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_MISC: 8948d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_BIAS: 8958d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STB_LOADS_DTEST: 8968d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_TEST0: 8978d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STARTUP_TIMER: 8988d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_TEST1: 8998d78602aSSrinivas Kandagatla case WCD938X_SLEEP_INT_WATCHDOG_CTL_1: 9008d78602aSSrinivas Kandagatla case WCD938X_SLEEP_INT_WATCHDOG_CTL_2: 9018d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1: 9028d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2: 9038d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2: 9048d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1: 9058d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0: 9068d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M: 9078d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M: 9088d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1: 9098d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0: 9108d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP: 9118d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1: 9128d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0: 9138d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP: 9148d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0: 9158d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP: 9168d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1: 9178d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP: 9188d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L2: 9198d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L1: 9208d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L0: 9218d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP: 9228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAGE_REGISTER: 9238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_TX_CLK_RATE: 9248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RST_CTL: 9258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TOP_CLK_CFG: 9268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_ANA_CLK_CTL: 9278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DIG_CLK_CTL: 9288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_RST_EN: 9298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_PATH_MODE: 9308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX_RST: 9318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX0_CTL: 9328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX1_CTL: 9338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX2_CTL: 9348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1: 9358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3: 9368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_COMP_CTL_0: 9378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL: 9388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A1_0: 9398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A1_1: 9408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A2_0: 9418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A2_1: 9428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A3_0: 9438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A3_1: 9448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A4_0: 9458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A4_1: 9468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A5_0: 9478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A5_1: 9488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A6_0: 9498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A7_0: 9508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_0: 9518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_1: 9528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_2: 9538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_3: 9548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R1: 9558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R2: 9568d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R3: 9578d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R4: 9588d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R5: 9598d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R6: 9608d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R7: 9618d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A1_0: 9628d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A1_1: 9638d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A2_0: 9648d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A2_1: 9658d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A3_0: 9668d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A3_1: 9678d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A4_0: 9688d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A4_1: 9698d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A5_0: 9708d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A5_1: 9718d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A6_0: 9728d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A7_0: 9738d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_0: 9748d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_1: 9758d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_2: 9768d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_3: 9778d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R1: 9788d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R2: 9798d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R3: 9808d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R4: 9818d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R5: 9828d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R6: 9838d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R7: 9848d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0: 9858d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1: 9868d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0: 9878d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1: 9888d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2: 9898d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0: 9908d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1: 9918d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2: 9928d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_CTL: 9938d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_CTL: 9948d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_EAR_PATH_CTL: 9958d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_SWR_CLH: 9968d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_CLH_BYP: 9978d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX0_CTL: 9988d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX1_CTL: 9998d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX2_CTL: 10008d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_RST: 10018d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_REQ_CTL: 10028d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RST: 10038d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AMIC_CTL: 10048d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_CTL: 10058d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC1_CTL: 10068d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC2_CTL: 10078d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC3_CTL: 10088d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC4_CTL: 10098d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_PRG_CTL: 10108d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_CTL: 10118d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_RATE_1_2: 10128d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_RATE_3_4: 10138d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL0: 10148d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL1: 10158d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL2: 10168d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MODE: 10178d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_0: 10188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_1: 10198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_2: 10208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_0: 10218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_1: 10228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_2: 10238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_0: 10248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_1: 10258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_2: 10268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_0: 10278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_1: 10288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_2: 10298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_0: 10308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_1: 10318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_2: 10328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_EN: 10338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_0_1: 10348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_2_3: 10358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_LB_IN_SEL_CTL: 10368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_LOOP_BACK_MODE: 10378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_DAC_TEST: 10388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_RX_0: 10398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_0: 10408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_RX_1: 10418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_1: 10428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_2: 10438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_SWR_0: 10448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_SWR_1: 10458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_I2C_CTL: 10468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE: 10478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_TEST_CTL_0: 10488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_TEST_CTL_1: 10498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_RX0: 10508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_RX1: 10518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX0: 10528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX1: 10538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX2: 10548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_INP_DIS_0: 10558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_INP_DIS_1: 10568d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_0: 10578d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_1: 10588d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_2: 10598d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_RX_DATA_EDGE_CTL: 10608d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_DATA_EDGE_CTL: 10618d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_GPIO_MODE: 10628d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_OE: 10638d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_DATA_0: 10648d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_DATA_1: 10658d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DIG_DEBUG_CTL: 10668d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DIG_DEBUG_EN: 10678d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_ANA_CSR_DBG_ADD: 10688d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_ANA_CSR_DBG_CTL: 10698d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SSP_DBG: 10708d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_0: 10718d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_1: 10728d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_2: 10738d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_0: 10748d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_1: 10758d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_2: 10768d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_3: 10778d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_4: 10788d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA0: 10798d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA1: 10808d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA2: 10818d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA3: 10828d78602aSSrinivas Kandagatla return true; 10838d78602aSSrinivas Kandagatla } 10848d78602aSSrinivas Kandagatla 10858d78602aSSrinivas Kandagatla return false; 10868d78602aSSrinivas Kandagatla } 10878d78602aSSrinivas Kandagatla 10888d78602aSSrinivas Kandagatla static bool wcd938x_readonly_register(struct device *dev, unsigned int reg) 10898d78602aSSrinivas Kandagatla { 10908d78602aSSrinivas Kandagatla switch (reg) { 10918d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_1: 10928d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_2: 10938d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_3: 10948d78602aSSrinivas Kandagatla case WCD938X_MBHC_MOISTURE_DET_FSM_STATUS: 10958d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_SAR2_ERR: 10968d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_SAR1_ERR: 10978d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SAR4_ERR: 10988d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SAR3_ERR: 10998d78602aSSrinivas Kandagatla case WCD938X_HPH_L_STATUS: 11008d78602aSSrinivas Kandagatla case WCD938X_HPH_R_STATUS: 11018d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS: 11028d78602aSSrinivas Kandagatla case WCD938X_EAR_STATUS_REG_1: 11038d78602aSSrinivas Kandagatla case WCD938X_EAR_STATUS_REG_2: 11048d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_FSM_STATUS: 11058d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ADC_RESULT: 11068d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_DIE_CRK_DET_OUT: 11078d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_STATUS_REG: 11088d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STATUS: 11098d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID0: 11108d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID1: 11118d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID2: 11128d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID3: 11138d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_0: 11148d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_1: 11158d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_2: 11168d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_0: 11178d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_1: 11188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_T_DATA_0: 11198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_T_DATA_1: 11208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_STATUS_0: 11218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_STATUS_1: 11228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_MODE_STATUS_0: 11238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_MODE_STATUS_1: 11248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_0: 11258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_1: 11268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_2: 11278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_3: 11288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_4: 11298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_5: 11308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_6: 11318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_7: 11328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_8: 11338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_9: 11348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_10: 11358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_11: 11368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_12: 11378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_13: 11388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_14: 11398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_15: 11408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_16: 11418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_17: 11428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_18: 11438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_19: 11448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_20: 11458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_21: 11468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_22: 11478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_23: 11488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_24: 11498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_25: 11508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_26: 11518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_27: 11528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_28: 11538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_29: 11548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_30: 11558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_31: 11568d78602aSSrinivas Kandagatla return true; 11578d78602aSSrinivas Kandagatla } 11588d78602aSSrinivas Kandagatla return false; 11598d78602aSSrinivas Kandagatla } 11608d78602aSSrinivas Kandagatla 11618d78602aSSrinivas Kandagatla static bool wcd938x_readable_register(struct device *dev, unsigned int reg) 11628d78602aSSrinivas Kandagatla { 11638d78602aSSrinivas Kandagatla bool ret; 11648d78602aSSrinivas Kandagatla 11658d78602aSSrinivas Kandagatla ret = wcd938x_readonly_register(dev, reg); 11668d78602aSSrinivas Kandagatla if (!ret) 11678d78602aSSrinivas Kandagatla return wcd938x_rdwr_register(dev, reg); 11688d78602aSSrinivas Kandagatla 11698d78602aSSrinivas Kandagatla return ret; 11708d78602aSSrinivas Kandagatla } 11718d78602aSSrinivas Kandagatla 11728d78602aSSrinivas Kandagatla static bool wcd938x_writeable_register(struct device *dev, unsigned int reg) 11738d78602aSSrinivas Kandagatla { 11748d78602aSSrinivas Kandagatla return wcd938x_rdwr_register(dev, reg); 11758d78602aSSrinivas Kandagatla } 11768d78602aSSrinivas Kandagatla 11778d78602aSSrinivas Kandagatla static bool wcd938x_volatile_register(struct device *dev, unsigned int reg) 11788d78602aSSrinivas Kandagatla { 11798d78602aSSrinivas Kandagatla if (reg <= WCD938X_BASE_ADDRESS) 11808d78602aSSrinivas Kandagatla return 0; 11818d78602aSSrinivas Kandagatla 11828d78602aSSrinivas Kandagatla if (reg == WCD938X_DIGITAL_SWR_TX_CLK_RATE) 11838d78602aSSrinivas Kandagatla return true; 11848d78602aSSrinivas Kandagatla 11858d78602aSSrinivas Kandagatla if (wcd938x_readonly_register(dev, reg)) 11868d78602aSSrinivas Kandagatla return true; 11878d78602aSSrinivas Kandagatla 11888d78602aSSrinivas Kandagatla return false; 11898d78602aSSrinivas Kandagatla } 11908d78602aSSrinivas Kandagatla 11918d78602aSSrinivas Kandagatla struct regmap_config wcd938x_regmap_config = { 11928d78602aSSrinivas Kandagatla .name = "wcd938x_csr", 11938d78602aSSrinivas Kandagatla .reg_bits = 32, 11948d78602aSSrinivas Kandagatla .val_bits = 8, 11958d78602aSSrinivas Kandagatla .cache_type = REGCACHE_RBTREE, 11968d78602aSSrinivas Kandagatla .reg_defaults = wcd938x_defaults, 11978d78602aSSrinivas Kandagatla .num_reg_defaults = ARRAY_SIZE(wcd938x_defaults), 11988d78602aSSrinivas Kandagatla .max_register = WCD938X_MAX_REGISTER, 11998d78602aSSrinivas Kandagatla .readable_reg = wcd938x_readable_register, 12008d78602aSSrinivas Kandagatla .writeable_reg = wcd938x_writeable_register, 12018d78602aSSrinivas Kandagatla .volatile_reg = wcd938x_volatile_register, 12028d78602aSSrinivas Kandagatla .can_multi_write = true, 12038d78602aSSrinivas Kandagatla }; 12048d78602aSSrinivas Kandagatla EXPORT_SYMBOL_GPL(wcd938x_regmap_config); 12058d78602aSSrinivas Kandagatla 12068d78602aSSrinivas Kandagatla static const struct regmap_irq wcd938x_irqs[WCD938X_NUM_IRQS] = { 12078d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01), 12088d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02), 12098d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), 12108d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), 12118d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_SW_DET, 0, 0x10), 12128d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_OCP_INT, 0, 0x20), 12138d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_CNP_INT, 0, 0x40), 12148d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_OCP_INT, 0, 0x80), 12158d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_CNP_INT, 1, 0x01), 12168d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_EAR_CNP_INT, 1, 0x02), 12178d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_EAR_SCD_INT, 1, 0x04), 12188d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_CNP_INT, 1, 0x08), 12198d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_SCD_INT, 1, 0x10), 12208d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_PDM_WD_INT, 1, 0x20), 12218d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_PDM_WD_INT, 1, 0x40), 12228d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_PDM_WD_INT, 1, 0x80), 12238d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_LDORT_SCD_INT, 2, 0x01), 12248d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_MOISTURE_INT, 2, 0x02), 12258d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_SURGE_DET_INT, 2, 0x04), 12268d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_SURGE_DET_INT, 2, 0x08), 12278d78602aSSrinivas Kandagatla }; 12288d78602aSSrinivas Kandagatla 12298d78602aSSrinivas Kandagatla static struct regmap_irq_chip wcd938x_regmap_irq_chip = { 12308d78602aSSrinivas Kandagatla .name = "wcd938x", 12318d78602aSSrinivas Kandagatla .irqs = wcd938x_irqs, 12328d78602aSSrinivas Kandagatla .num_irqs = ARRAY_SIZE(wcd938x_irqs), 12338d78602aSSrinivas Kandagatla .num_regs = 3, 12348d78602aSSrinivas Kandagatla .status_base = WCD938X_DIGITAL_INTR_STATUS_0, 12358d78602aSSrinivas Kandagatla .mask_base = WCD938X_DIGITAL_INTR_MASK_0, 12368d78602aSSrinivas Kandagatla .type_base = WCD938X_DIGITAL_INTR_LEVEL_0, 12378d78602aSSrinivas Kandagatla .ack_base = WCD938X_DIGITAL_INTR_CLEAR_0, 12388d78602aSSrinivas Kandagatla .use_ack = 1, 12398d78602aSSrinivas Kandagatla .runtime_pm = true, 12408d78602aSSrinivas Kandagatla .irq_drv_data = NULL, 12418d78602aSSrinivas Kandagatla }; 12428d78602aSSrinivas Kandagatla 12438d78602aSSrinivas Kandagatla static int wcd938x_io_init(struct wcd938x_priv *wcd938x) 12448d78602aSSrinivas Kandagatla { 12458d78602aSSrinivas Kandagatla struct regmap *rm = wcd938x->regmap; 12468d78602aSSrinivas Kandagatla 12478d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x0E, 0x0E); 12488d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x80, 0x80); 12498d78602aSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 12508d78602aSSrinivas Kandagatla usleep_range(1000, 1010); 12518d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x40, 0x40); 12528d78602aSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 12538d78602aSSrinivas Kandagatla usleep_range(1000, 1010); 12548d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_LDORXTX_CONFIG, 0x10, 0x00); 12558d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_BIAS_VBG_FINE_ADJ, 12568d78602aSSrinivas Kandagatla 0xF0, 0x80); 12578d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x80, 0x80); 12588d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x40, 0x40); 12598d78602aSSrinivas Kandagatla /* 10 msec delay as per HW requirement */ 12608d78602aSSrinivas Kandagatla usleep_range(10000, 10010); 12618d78602aSSrinivas Kandagatla 12628d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x40, 0x00); 12638d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 12648d78602aSSrinivas Kandagatla 0xF0, 0x00); 12658d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 12668d78602aSSrinivas Kandagatla 0x1F, 0x15); 12678d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 12688d78602aSSrinivas Kandagatla 0x1F, 0x15); 12698d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_REFBUFF_UHQA_CTL, 12708d78602aSSrinivas Kandagatla 0xC0, 0x80); 12718d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_CDC_DMIC_CTL, 12728d78602aSSrinivas Kandagatla 0x02, 0x02); 12738d78602aSSrinivas Kandagatla 12748d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 12758d78602aSSrinivas Kandagatla 0xFF, 0x14); 12768d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 12778d78602aSSrinivas Kandagatla 0x1F, 0x08); 12788d78602aSSrinivas Kandagatla 12798d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0xFF, 0x55); 12808d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0xFF, 0x44); 12818d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0xFF, 0x11); 12828d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0xFF, 0x00); 12838d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0xFF, 0x00); 12848d78602aSSrinivas Kandagatla 12858d78602aSSrinivas Kandagatla /* Set Noise Filter Resistor value */ 12868d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB1_TEST_CTL_1, 0xE0, 0xE0); 12878d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB2_TEST_CTL_1, 0xE0, 0xE0); 12888d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB3_TEST_CTL_1, 0xE0, 0xE0); 12898d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB4_TEST_CTL_1, 0xE0, 0xE0); 12908d78602aSSrinivas Kandagatla 12918d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_3_4_TEST_BLK_EN2, 0x01, 0x00); 12928d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); 12938d78602aSSrinivas Kandagatla 12948d78602aSSrinivas Kandagatla return 0; 12958d78602aSSrinivas Kandagatla 12968d78602aSSrinivas Kandagatla } 12978d78602aSSrinivas Kandagatla 1298*e8ba1e05SSrinivas Kandagatla static int wcd938x_sdw_connect_port(struct wcd938x_sdw_ch_info *ch_info, 1299*e8ba1e05SSrinivas Kandagatla struct sdw_port_config *port_config, 1300*e8ba1e05SSrinivas Kandagatla u32 mstr_port_num, 1301*e8ba1e05SSrinivas Kandagatla u8 enable) 1302*e8ba1e05SSrinivas Kandagatla { 1303*e8ba1e05SSrinivas Kandagatla u8 ch_mask, port_num; 1304*e8ba1e05SSrinivas Kandagatla 1305*e8ba1e05SSrinivas Kandagatla port_num = ch_info->port_num; 1306*e8ba1e05SSrinivas Kandagatla ch_mask = ch_info->ch_mask; 1307*e8ba1e05SSrinivas Kandagatla 1308*e8ba1e05SSrinivas Kandagatla port_config->num = port_num; 1309*e8ba1e05SSrinivas Kandagatla 1310*e8ba1e05SSrinivas Kandagatla if (enable) 1311*e8ba1e05SSrinivas Kandagatla port_config->ch_mask |= ch_mask; 1312*e8ba1e05SSrinivas Kandagatla else 1313*e8ba1e05SSrinivas Kandagatla port_config->ch_mask &= ~ch_mask; 1314*e8ba1e05SSrinivas Kandagatla 1315*e8ba1e05SSrinivas Kandagatla return 0; 1316*e8ba1e05SSrinivas Kandagatla } 1317*e8ba1e05SSrinivas Kandagatla 1318*e8ba1e05SSrinivas Kandagatla static int wcd938x_connect_port(struct wcd938x_sdw_priv *wcd, u8 ch_id, u8 enable) 1319*e8ba1e05SSrinivas Kandagatla { 1320*e8ba1e05SSrinivas Kandagatla u8 port_num, mstr_port_num; 1321*e8ba1e05SSrinivas Kandagatla 1322*e8ba1e05SSrinivas Kandagatla port_num = wcd->ch_info[ch_id].port_num; 1323*e8ba1e05SSrinivas Kandagatla mstr_port_num = wcd->port_map[port_num - 1]; 1324*e8ba1e05SSrinivas Kandagatla 1325*e8ba1e05SSrinivas Kandagatla return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], 1326*e8ba1e05SSrinivas Kandagatla &wcd->port_config[port_num], 1327*e8ba1e05SSrinivas Kandagatla mstr_port_num, 1328*e8ba1e05SSrinivas Kandagatla enable); 1329*e8ba1e05SSrinivas Kandagatla } 1330*e8ba1e05SSrinivas Kandagatla 1331*e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_get(struct snd_kcontrol *kcontrol, 1332*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1333*e8ba1e05SSrinivas Kandagatla { 1334*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1335*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1336*e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1337*e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 1338*e8ba1e05SSrinivas Kandagatla 1339*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->tx_mode[path]; 1340*e8ba1e05SSrinivas Kandagatla 1341*e8ba1e05SSrinivas Kandagatla return 0; 1342*e8ba1e05SSrinivas Kandagatla } 1343*e8ba1e05SSrinivas Kandagatla 1344*e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_put(struct snd_kcontrol *kcontrol, 1345*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1346*e8ba1e05SSrinivas Kandagatla { 1347*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1348*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1349*e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1350*e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 1351*e8ba1e05SSrinivas Kandagatla 1352*e8ba1e05SSrinivas Kandagatla wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0]; 1353*e8ba1e05SSrinivas Kandagatla 1354*e8ba1e05SSrinivas Kandagatla return 1; 1355*e8ba1e05SSrinivas Kandagatla } 1356*e8ba1e05SSrinivas Kandagatla 1357*e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, 1358*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1359*e8ba1e05SSrinivas Kandagatla { 1360*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1361*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1362*e8ba1e05SSrinivas Kandagatla 1363*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->hph_mode; 1364*e8ba1e05SSrinivas Kandagatla 1365*e8ba1e05SSrinivas Kandagatla return 0; 1366*e8ba1e05SSrinivas Kandagatla } 1367*e8ba1e05SSrinivas Kandagatla 1368*e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, 1369*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1370*e8ba1e05SSrinivas Kandagatla { 1371*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1372*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1373*e8ba1e05SSrinivas Kandagatla 1374*e8ba1e05SSrinivas Kandagatla wcd938x->hph_mode = ucontrol->value.enumerated.item[0]; 1375*e8ba1e05SSrinivas Kandagatla 1376*e8ba1e05SSrinivas Kandagatla return 1; 1377*e8ba1e05SSrinivas Kandagatla } 1378*e8ba1e05SSrinivas Kandagatla 1379*e8ba1e05SSrinivas Kandagatla static int wcd938x_ear_pa_put_gain(struct snd_kcontrol *kcontrol, 1380*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1381*e8ba1e05SSrinivas Kandagatla { 1382*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1383*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1384*e8ba1e05SSrinivas Kandagatla 1385*e8ba1e05SSrinivas Kandagatla if (wcd938x->comp1_enable) { 1386*e8ba1e05SSrinivas Kandagatla dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n"); 1387*e8ba1e05SSrinivas Kandagatla return -EINVAL; 1388*e8ba1e05SSrinivas Kandagatla } 1389*e8ba1e05SSrinivas Kandagatla 1390*e8ba1e05SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 1391*e8ba1e05SSrinivas Kandagatla WCD938X_EAR_GAIN_MASK, 1392*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0]); 1393*e8ba1e05SSrinivas Kandagatla 1394*e8ba1e05SSrinivas Kandagatla return 0; 1395*e8ba1e05SSrinivas Kandagatla } 1396*e8ba1e05SSrinivas Kandagatla 1397*e8ba1e05SSrinivas Kandagatla static int wcd938x_get_compander(struct snd_kcontrol *kcontrol, 1398*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1399*e8ba1e05SSrinivas Kandagatla { 1400*e8ba1e05SSrinivas Kandagatla 1401*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1402*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1403*e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 1404*e8ba1e05SSrinivas Kandagatla bool hphr; 1405*e8ba1e05SSrinivas Kandagatla 1406*e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 1407*e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 1408*e8ba1e05SSrinivas Kandagatla 1409*e8ba1e05SSrinivas Kandagatla if (hphr) 1410*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp2_enable; 1411*e8ba1e05SSrinivas Kandagatla else 1412*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp1_enable; 1413*e8ba1e05SSrinivas Kandagatla 1414*e8ba1e05SSrinivas Kandagatla return 0; 1415*e8ba1e05SSrinivas Kandagatla } 1416*e8ba1e05SSrinivas Kandagatla 1417*e8ba1e05SSrinivas Kandagatla static int wcd938x_set_compander(struct snd_kcontrol *kcontrol, 1418*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1419*e8ba1e05SSrinivas Kandagatla { 1420*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1421*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1422*e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 1423*e8ba1e05SSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 1424*e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 1425*e8ba1e05SSrinivas Kandagatla bool hphr; 1426*e8ba1e05SSrinivas Kandagatla 1427*e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 1428*e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 1429*e8ba1e05SSrinivas Kandagatla 1430*e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[AIF1_PB]; 1431*e8ba1e05SSrinivas Kandagatla 1432*e8ba1e05SSrinivas Kandagatla if (hphr) 1433*e8ba1e05SSrinivas Kandagatla wcd938x->comp2_enable = value; 1434*e8ba1e05SSrinivas Kandagatla else 1435*e8ba1e05SSrinivas Kandagatla wcd938x->comp1_enable = value; 1436*e8ba1e05SSrinivas Kandagatla 1437*e8ba1e05SSrinivas Kandagatla if (value) 1438*e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, mc->reg, true); 1439*e8ba1e05SSrinivas Kandagatla else 1440*e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, mc->reg, false); 1441*e8ba1e05SSrinivas Kandagatla 1442*e8ba1e05SSrinivas Kandagatla return 0; 1443*e8ba1e05SSrinivas Kandagatla } 1444*e8ba1e05SSrinivas Kandagatla 1445*e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol, 1446*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1447*e8ba1e05SSrinivas Kandagatla { 1448*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1449*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1450*e8ba1e05SSrinivas Kandagatla 1451*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->ldoh; 1452*e8ba1e05SSrinivas Kandagatla 1453*e8ba1e05SSrinivas Kandagatla return 0; 1454*e8ba1e05SSrinivas Kandagatla } 1455*e8ba1e05SSrinivas Kandagatla 1456*e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_put(struct snd_kcontrol *kcontrol, 1457*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1458*e8ba1e05SSrinivas Kandagatla { 1459*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1460*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1461*e8ba1e05SSrinivas Kandagatla 1462*e8ba1e05SSrinivas Kandagatla wcd938x->ldoh = ucontrol->value.integer.value[0]; 1463*e8ba1e05SSrinivas Kandagatla 1464*e8ba1e05SSrinivas Kandagatla return 1; 1465*e8ba1e05SSrinivas Kandagatla } 1466*e8ba1e05SSrinivas Kandagatla 1467*e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_get(struct snd_kcontrol *kcontrol, 1468*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1469*e8ba1e05SSrinivas Kandagatla { 1470*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1471*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1472*e8ba1e05SSrinivas Kandagatla 1473*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->bcs_dis; 1474*e8ba1e05SSrinivas Kandagatla 1475*e8ba1e05SSrinivas Kandagatla return 0; 1476*e8ba1e05SSrinivas Kandagatla } 1477*e8ba1e05SSrinivas Kandagatla 1478*e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, 1479*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1480*e8ba1e05SSrinivas Kandagatla { 1481*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1482*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1483*e8ba1e05SSrinivas Kandagatla 1484*e8ba1e05SSrinivas Kandagatla wcd938x->bcs_dis = ucontrol->value.integer.value[0]; 1485*e8ba1e05SSrinivas Kandagatla 1486*e8ba1e05SSrinivas Kandagatla return 1; 1487*e8ba1e05SSrinivas Kandagatla } 1488*e8ba1e05SSrinivas Kandagatla 1489*e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text_wcd9380[] = { 1490*e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 1491*e8ba1e05SSrinivas Kandagatla }; 1492*e8ba1e05SSrinivas Kandagatla 1493*e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text[] = { 1494*e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 1495*e8ba1e05SSrinivas Kandagatla "ADC_ULP1", "ADC_ULP2", 1496*e8ba1e05SSrinivas Kandagatla }; 1497*e8ba1e05SSrinivas Kandagatla 1498*e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text_wcd9380[] = { 1499*e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_INVALID_1", "CLS_H_LP", "CLS_AB", 1500*e8ba1e05SSrinivas Kandagatla "CLS_H_LOHIFI", "CLS_H_ULP", "CLS_H_INVALID_2", "CLS_AB_LP", 1501*e8ba1e05SSrinivas Kandagatla "CLS_AB_LOHIFI", 1502*e8ba1e05SSrinivas Kandagatla }; 1503*e8ba1e05SSrinivas Kandagatla 1504*e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text[] = { 1505*e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", 1506*e8ba1e05SSrinivas Kandagatla "CLS_H_ULP", "CLS_AB_HIFI", "CLS_AB_LP", "CLS_AB_LOHIFI", 1507*e8ba1e05SSrinivas Kandagatla }; 1508*e8ba1e05SSrinivas Kandagatla 1509*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9380 = 1510*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 1511*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 1512*e8ba1e05SSrinivas Kandagatla 1513*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9380 = 1514*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 1515*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 1516*e8ba1e05SSrinivas Kandagatla 1517*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9380 = 1518*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 1519*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 1520*e8ba1e05SSrinivas Kandagatla 1521*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9380 = 1522*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 1523*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 1524*e8ba1e05SSrinivas Kandagatla 1525*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9385 = 1526*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text), 1527*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 1528*e8ba1e05SSrinivas Kandagatla 1529*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9385 = 1530*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text), 1531*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 1532*e8ba1e05SSrinivas Kandagatla 1533*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9385 = 1534*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text), 1535*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 1536*e8ba1e05SSrinivas Kandagatla 1537*e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9385 = 1538*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text), 1539*e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 1540*e8ba1e05SSrinivas Kandagatla 1541*e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 = 1542*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380), 1543*e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text_wcd9380); 1544*e8ba1e05SSrinivas Kandagatla 1545*e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum = 1546*e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), 1547*e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text); 1548*e8ba1e05SSrinivas Kandagatla 1549*e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9380_snd_controls[] = { 1550*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380, 1551*e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 1552*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9380, 1553*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1554*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9380, 1555*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1556*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9380, 1557*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1558*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9380, 1559*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1560*e8ba1e05SSrinivas Kandagatla }; 1561*e8ba1e05SSrinivas Kandagatla 1562*e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9385_snd_controls[] = { 1563*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, 1564*e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 1565*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9385, 1566*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1567*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9385, 1568*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1569*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9385, 1570*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1571*e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9385, 1572*e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 1573*e8ba1e05SSrinivas Kandagatla }; 1574*e8ba1e05SSrinivas Kandagatla 1575*e8ba1e05SSrinivas Kandagatla static int wcd938x_get_swr_port(struct snd_kcontrol *kcontrol, 1576*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1577*e8ba1e05SSrinivas Kandagatla { 1578*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 1579*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 1580*e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 1581*e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 1582*e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 1583*e8ba1e05SSrinivas Kandagatla int portidx = mixer->reg; 1584*e8ba1e05SSrinivas Kandagatla 1585*e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 1586*e8ba1e05SSrinivas Kandagatla 1587*e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; 1588*e8ba1e05SSrinivas Kandagatla 1589*e8ba1e05SSrinivas Kandagatla return 0; 1590*e8ba1e05SSrinivas Kandagatla } 1591*e8ba1e05SSrinivas Kandagatla 1592*e8ba1e05SSrinivas Kandagatla static int wcd938x_set_swr_port(struct snd_kcontrol *kcontrol, 1593*e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1594*e8ba1e05SSrinivas Kandagatla { 1595*e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 1596*e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 1597*e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 1598*e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = 1599*e8ba1e05SSrinivas Kandagatla (struct soc_mixer_control *)kcontrol->private_value; 1600*e8ba1e05SSrinivas Kandagatla int portidx = mixer->reg; 1601*e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 1602*e8ba1e05SSrinivas Kandagatla bool enable; 1603*e8ba1e05SSrinivas Kandagatla 1604*e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 1605*e8ba1e05SSrinivas Kandagatla 1606*e8ba1e05SSrinivas Kandagatla if (ucontrol->value.integer.value[0]) 1607*e8ba1e05SSrinivas Kandagatla enable = true; 1608*e8ba1e05SSrinivas Kandagatla else 1609*e8ba1e05SSrinivas Kandagatla enable = false; 1610*e8ba1e05SSrinivas Kandagatla 1611*e8ba1e05SSrinivas Kandagatla wcd->port_enable[portidx] = enable; 1612*e8ba1e05SSrinivas Kandagatla 1613*e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, portidx, enable); 1614*e8ba1e05SSrinivas Kandagatla 1615*e8ba1e05SSrinivas Kandagatla return 0; 1616*e8ba1e05SSrinivas Kandagatla 1617*e8ba1e05SSrinivas Kandagatla } 1618*e8ba1e05SSrinivas Kandagatla 1619*e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd938x_snd_controls[] = { 1620*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL_COMP Switch", WCD938X_COMP_L, 0, 1, 0, 1621*e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 1622*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR_COMP Switch", WCD938X_COMP_R, 1, 1, 0, 1623*e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 1624*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL Switch", WCD938X_HPH_L, 0, 1, 0, 1625*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1626*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR Switch", WCD938X_HPH_R, 0, 1, 0, 1627*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1628*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("CLSH Switch", WCD938X_CLSH, 0, 1, 0, 1629*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1630*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LO Switch", WCD938X_LO, 0, 1, 0, 1631*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1632*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_L Switch", WCD938X_DSD_L, 0, 1, 0, 1633*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1634*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_R Switch", WCD938X_DSD_R, 0, 1, 0, 1635*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1636*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 0x18, 0, line_gain), 1637*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 0x18, 0, line_gain), 1638*e8ba1e05SSrinivas Kandagatla WCD938X_EAR_PA_GAIN_TLV("EAR_PA Volume", WCD938X_ANA_EAR_COMPANDER_CTL, 1639*e8ba1e05SSrinivas Kandagatla 2, 0x10, 0, ear_pa_gain), 1640*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC1 Switch", WCD938X_ADC1, 1, 1, 0, 1641*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1642*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2 Switch", WCD938X_ADC2, 1, 1, 0, 1643*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1644*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC3 Switch", WCD938X_ADC3, 1, 1, 0, 1645*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1646*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC4 Switch", WCD938X_ADC4, 1, 1, 0, 1647*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1648*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC0 Switch", WCD938X_DMIC0, 1, 1, 0, 1649*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1650*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC1 Switch", WCD938X_DMIC1, 1, 1, 0, 1651*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1652*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("MBHC Switch", WCD938X_MBHC, 1, 1, 0, 1653*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1654*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC2 Switch", WCD938X_DMIC2, 1, 1, 0, 1655*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1656*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC3 Switch", WCD938X_DMIC3, 1, 1, 0, 1657*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1658*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC4 Switch", WCD938X_DMIC4, 1, 1, 0, 1659*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1660*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC5 Switch", WCD938X_DMIC5, 1, 1, 0, 1661*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1662*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC6 Switch", WCD938X_DMIC6, 1, 1, 0, 1663*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1664*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC7 Switch", WCD938X_DMIC7, 1, 1, 0, 1665*e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 1666*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LDOH Enable Switch", SND_SOC_NOPM, 0, 1, 0, 1667*e8ba1e05SSrinivas Kandagatla wcd938x_ldoh_get, wcd938x_ldoh_put), 1668*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2_BCS Disable Switch", SND_SOC_NOPM, 0, 1, 0, 1669*e8ba1e05SSrinivas Kandagatla wcd938x_bcs_get, wcd938x_bcs_put), 1670*e8ba1e05SSrinivas Kandagatla 1671*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC1 Volume", WCD938X_ANA_TX_CH1, 0, 20, 0, analog_gain), 1672*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC2 Volume", WCD938X_ANA_TX_CH2, 0, 20, 0, analog_gain), 1673*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC3 Volume", WCD938X_ANA_TX_CH3, 0, 20, 0, analog_gain), 1674*e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC4 Volume", WCD938X_ANA_TX_CH4, 0, 20, 0, analog_gain), 1675*e8ba1e05SSrinivas Kandagatla }; 1676*e8ba1e05SSrinivas Kandagatla 16778d78602aSSrinivas Kandagatla static int wcd938x_get_micb_vout_ctl_val(u32 micb_mv) 16788d78602aSSrinivas Kandagatla { 16798d78602aSSrinivas Kandagatla /* min micbias voltage is 1V and maximum is 2.85V */ 16808d78602aSSrinivas Kandagatla if (micb_mv < 1000 || micb_mv > 2850) 16818d78602aSSrinivas Kandagatla return -EINVAL; 16828d78602aSSrinivas Kandagatla 16838d78602aSSrinivas Kandagatla return (micb_mv - 1000) / 50; 16848d78602aSSrinivas Kandagatla } 16858d78602aSSrinivas Kandagatla 16868d78602aSSrinivas Kandagatla static int wcd938x_set_micbias_data(struct wcd938x_priv *wcd938x) 16878d78602aSSrinivas Kandagatla { 16888d78602aSSrinivas Kandagatla int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 16898d78602aSSrinivas Kandagatla 16908d78602aSSrinivas Kandagatla /* set micbias voltage */ 16918d78602aSSrinivas Kandagatla vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb1_mv); 16928d78602aSSrinivas Kandagatla vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb2_mv); 16938d78602aSSrinivas Kandagatla vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb3_mv); 16948d78602aSSrinivas Kandagatla vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb4_mv); 16958d78602aSSrinivas Kandagatla if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || vout_ctl_4 < 0) 16968d78602aSSrinivas Kandagatla return -EINVAL; 16978d78602aSSrinivas Kandagatla 16988d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, 16998d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_1); 17008d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, 17018d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_2); 17028d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, 17038d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_3); 17048d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, 17058d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_4); 17068d78602aSSrinivas Kandagatla 17078d78602aSSrinivas Kandagatla return 0; 17088d78602aSSrinivas Kandagatla } 17098d78602aSSrinivas Kandagatla 17108d78602aSSrinivas Kandagatla static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) 17118d78602aSSrinivas Kandagatla { 17128d78602aSSrinivas Kandagatla return IRQ_HANDLED; 17138d78602aSSrinivas Kandagatla } 17148d78602aSSrinivas Kandagatla 17158d78602aSSrinivas Kandagatla static struct irq_chip wcd_irq_chip = { 17168d78602aSSrinivas Kandagatla .name = "WCD938x", 17178d78602aSSrinivas Kandagatla }; 17188d78602aSSrinivas Kandagatla 17198d78602aSSrinivas Kandagatla static int wcd_irq_chip_map(struct irq_domain *irqd, unsigned int virq, 17208d78602aSSrinivas Kandagatla irq_hw_number_t hw) 17218d78602aSSrinivas Kandagatla { 17228d78602aSSrinivas Kandagatla irq_set_chip_and_handler(virq, &wcd_irq_chip, handle_simple_irq); 17238d78602aSSrinivas Kandagatla irq_set_nested_thread(virq, 1); 17248d78602aSSrinivas Kandagatla irq_set_noprobe(virq); 17258d78602aSSrinivas Kandagatla 17268d78602aSSrinivas Kandagatla return 0; 17278d78602aSSrinivas Kandagatla } 17288d78602aSSrinivas Kandagatla 17298d78602aSSrinivas Kandagatla static const struct irq_domain_ops wcd_domain_ops = { 17308d78602aSSrinivas Kandagatla .map = wcd_irq_chip_map, 17318d78602aSSrinivas Kandagatla }; 17328d78602aSSrinivas Kandagatla 17338d78602aSSrinivas Kandagatla static int wcd938x_irq_init(struct wcd938x_priv *wcd, struct device *dev) 17348d78602aSSrinivas Kandagatla { 17358d78602aSSrinivas Kandagatla 17368d78602aSSrinivas Kandagatla wcd->virq = irq_domain_add_linear(NULL, 1, &wcd_domain_ops, NULL); 17378d78602aSSrinivas Kandagatla if (!(wcd->virq)) { 17388d78602aSSrinivas Kandagatla dev_err(dev, "%s: Failed to add IRQ domain\n", __func__); 17398d78602aSSrinivas Kandagatla return -EINVAL; 17408d78602aSSrinivas Kandagatla } 17418d78602aSSrinivas Kandagatla 17428d78602aSSrinivas Kandagatla return devm_regmap_add_irq_chip(dev, wcd->regmap, 17438d78602aSSrinivas Kandagatla irq_create_mapping(wcd->virq, 0), 17448d78602aSSrinivas Kandagatla IRQF_ONESHOT, 0, &wcd938x_regmap_irq_chip, 17458d78602aSSrinivas Kandagatla &wcd->irq_chip); 17468d78602aSSrinivas Kandagatla } 17478d78602aSSrinivas Kandagatla 17488d78602aSSrinivas Kandagatla static int wcd938x_soc_codec_probe(struct snd_soc_component *component) 17498d78602aSSrinivas Kandagatla { 17508d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 17518d78602aSSrinivas Kandagatla struct device *dev = component->dev; 17528d78602aSSrinivas Kandagatla int ret, i; 17538d78602aSSrinivas Kandagatla 17548d78602aSSrinivas Kandagatla snd_soc_component_init_regmap(component, wcd938x->regmap); 17558d78602aSSrinivas Kandagatla 17568d78602aSSrinivas Kandagatla wcd938x->variant = snd_soc_component_read_field(component, 17578d78602aSSrinivas Kandagatla WCD938X_DIGITAL_EFUSE_REG_0, 17588d78602aSSrinivas Kandagatla WCD938X_ID_MASK); 17598d78602aSSrinivas Kandagatla 17608d78602aSSrinivas Kandagatla wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X); 17618d78602aSSrinivas Kandagatla 17628d78602aSSrinivas Kandagatla wcd938x_io_init(wcd938x); 17638d78602aSSrinivas Kandagatla /* Set all interrupts as edge triggered */ 17648d78602aSSrinivas Kandagatla for (i = 0; i < wcd938x_regmap_irq_chip.num_regs; i++) { 17658d78602aSSrinivas Kandagatla regmap_write(wcd938x->regmap, 17668d78602aSSrinivas Kandagatla (WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0); 17678d78602aSSrinivas Kandagatla } 17688d78602aSSrinivas Kandagatla 17698d78602aSSrinivas Kandagatla ret = wcd938x_irq_init(wcd938x, component->dev); 17708d78602aSSrinivas Kandagatla if (ret) { 17718d78602aSSrinivas Kandagatla dev_err(component->dev, "%s: IRQ init failed: %d\n", 17728d78602aSSrinivas Kandagatla __func__, ret); 17738d78602aSSrinivas Kandagatla return ret; 17748d78602aSSrinivas Kandagatla } 17758d78602aSSrinivas Kandagatla 17768d78602aSSrinivas Kandagatla wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 17778d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT); 17788d78602aSSrinivas Kandagatla wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 17798d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT); 17808d78602aSSrinivas Kandagatla wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 17818d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT); 17828d78602aSSrinivas Kandagatla 17838d78602aSSrinivas Kandagatla /* Request for watchdog interrupt */ 17848d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 17858d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 17868d78602aSSrinivas Kandagatla "HPHR PDM WD INT", wcd938x); 17878d78602aSSrinivas Kandagatla if (ret) 17888d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHR WD interrupt (%d)\n", ret); 17898d78602aSSrinivas Kandagatla 17908d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 17918d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 17928d78602aSSrinivas Kandagatla "HPHL PDM WD INT", wcd938x); 17938d78602aSSrinivas Kandagatla if (ret) 17948d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHL WD interrupt (%d)\n", ret); 17958d78602aSSrinivas Kandagatla 17968d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 17978d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 17988d78602aSSrinivas Kandagatla "AUX PDM WD INT", wcd938x); 17998d78602aSSrinivas Kandagatla if (ret) 18008d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request Aux WD interrupt (%d)\n", ret); 18018d78602aSSrinivas Kandagatla 18028d78602aSSrinivas Kandagatla /* Disable watchdog interrupt for HPH and AUX */ 18038d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 18048d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 18058d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 18068d78602aSSrinivas Kandagatla 1807*e8ba1e05SSrinivas Kandagatla switch (wcd938x->variant) { 1808*e8ba1e05SSrinivas Kandagatla case WCD9380: 1809*e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9380_snd_controls, 1810*e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9380_snd_controls)); 1811*e8ba1e05SSrinivas Kandagatla if (ret < 0) { 1812*e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 1813*e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 1814*e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 1815*e8ba1e05SSrinivas Kandagatla goto err; 1816*e8ba1e05SSrinivas Kandagatla } 1817*e8ba1e05SSrinivas Kandagatla break; 1818*e8ba1e05SSrinivas Kandagatla case WCD9385: 1819*e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9385_snd_controls, 1820*e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9385_snd_controls)); 1821*e8ba1e05SSrinivas Kandagatla if (ret < 0) { 1822*e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 1823*e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 1824*e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 1825*e8ba1e05SSrinivas Kandagatla goto err; 1826*e8ba1e05SSrinivas Kandagatla } 1827*e8ba1e05SSrinivas Kandagatla break; 1828*e8ba1e05SSrinivas Kandagatla default: 1829*e8ba1e05SSrinivas Kandagatla break; 1830*e8ba1e05SSrinivas Kandagatla } 1831*e8ba1e05SSrinivas Kandagatla err: 18328d78602aSSrinivas Kandagatla return ret; 18338d78602aSSrinivas Kandagatla } 18348d78602aSSrinivas Kandagatla 18358d78602aSSrinivas Kandagatla static const struct snd_soc_component_driver soc_codec_dev_wcd938x = { 18368d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 18378d78602aSSrinivas Kandagatla .probe = wcd938x_soc_codec_probe, 1838*e8ba1e05SSrinivas Kandagatla .controls = wcd938x_snd_controls, 1839*e8ba1e05SSrinivas Kandagatla .num_controls = ARRAY_SIZE(wcd938x_snd_controls), 18408d78602aSSrinivas Kandagatla }; 18418d78602aSSrinivas Kandagatla 18428d78602aSSrinivas Kandagatla static void wcd938x_dt_parse_micbias_info(struct device *dev, struct wcd938x_priv *wcd) 18438d78602aSSrinivas Kandagatla { 18448d78602aSSrinivas Kandagatla struct device_node *np = dev->of_node; 18458d78602aSSrinivas Kandagatla u32 prop_val = 0; 18468d78602aSSrinivas Kandagatla int rc = 0; 18478d78602aSSrinivas Kandagatla 18488d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 18498d78602aSSrinivas Kandagatla if (!rc) 18508d78602aSSrinivas Kandagatla wcd->micb1_mv = prop_val/1000; 18518d78602aSSrinivas Kandagatla else 18528d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias1 DT property not found\n", __func__); 18538d78602aSSrinivas Kandagatla 18548d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 18558d78602aSSrinivas Kandagatla if (!rc) 18568d78602aSSrinivas Kandagatla wcd->micb2_mv = prop_val/1000; 18578d78602aSSrinivas Kandagatla else 18588d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias2 DT property not found\n", __func__); 18598d78602aSSrinivas Kandagatla 18608d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 18618d78602aSSrinivas Kandagatla if (!rc) 18628d78602aSSrinivas Kandagatla wcd->micb3_mv = prop_val/1000; 18638d78602aSSrinivas Kandagatla else 18648d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); 18658d78602aSSrinivas Kandagatla 18668d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); 18678d78602aSSrinivas Kandagatla if (!rc) 18688d78602aSSrinivas Kandagatla wcd->micb4_mv = prop_val/1000; 18698d78602aSSrinivas Kandagatla else 18708d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias4 DT property not found\n", __func__); 18718d78602aSSrinivas Kandagatla } 18728d78602aSSrinivas Kandagatla 18738d78602aSSrinivas Kandagatla static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device *dev) 18748d78602aSSrinivas Kandagatla { 18758d78602aSSrinivas Kandagatla int ret; 18768d78602aSSrinivas Kandagatla 18778d78602aSSrinivas Kandagatla wcd938x->reset_gpio = of_get_named_gpio(dev->of_node, "reset-gpios", 0); 18788d78602aSSrinivas Kandagatla if (wcd938x->reset_gpio < 0) { 18798d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get reset gpio: err = %d\n", 18808d78602aSSrinivas Kandagatla wcd938x->reset_gpio); 18818d78602aSSrinivas Kandagatla return wcd938x->reset_gpio; 18828d78602aSSrinivas Kandagatla } 18838d78602aSSrinivas Kandagatla 18848d78602aSSrinivas Kandagatla wcd938x->supplies[0].supply = "vdd-rxtx"; 18858d78602aSSrinivas Kandagatla wcd938x->supplies[1].supply = "vdd-io"; 18868d78602aSSrinivas Kandagatla wcd938x->supplies[2].supply = "vdd-buck"; 18878d78602aSSrinivas Kandagatla wcd938x->supplies[3].supply = "vdd-mic-bias"; 18888d78602aSSrinivas Kandagatla 18898d78602aSSrinivas Kandagatla ret = regulator_bulk_get(dev, WCD938X_MAX_SUPPLY, wcd938x->supplies); 18908d78602aSSrinivas Kandagatla if (ret) { 18918d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get supplies: err = %d\n", ret); 18928d78602aSSrinivas Kandagatla return ret; 18938d78602aSSrinivas Kandagatla } 18948d78602aSSrinivas Kandagatla 18958d78602aSSrinivas Kandagatla ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); 18968d78602aSSrinivas Kandagatla if (ret) { 18978d78602aSSrinivas Kandagatla dev_err(dev, "Failed to enable supplies: err = %d\n", ret); 18988d78602aSSrinivas Kandagatla return ret; 18998d78602aSSrinivas Kandagatla } 19008d78602aSSrinivas Kandagatla 19018d78602aSSrinivas Kandagatla wcd938x_dt_parse_micbias_info(dev, wcd938x); 19028d78602aSSrinivas Kandagatla 19038d78602aSSrinivas Kandagatla return 0; 19048d78602aSSrinivas Kandagatla } 19058d78602aSSrinivas Kandagatla 19068d78602aSSrinivas Kandagatla static int wcd938x_reset(struct wcd938x_priv *wcd938x) 19078d78602aSSrinivas Kandagatla { 19088d78602aSSrinivas Kandagatla gpio_direction_output(wcd938x->reset_gpio, 0); 19098d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to LOW */ 19108d78602aSSrinivas Kandagatla usleep_range(20, 30); 19118d78602aSSrinivas Kandagatla gpio_set_value(wcd938x->reset_gpio, 1); 19128d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to HIGH */ 19138d78602aSSrinivas Kandagatla usleep_range(20, 30); 19148d78602aSSrinivas Kandagatla 19158d78602aSSrinivas Kandagatla return 0; 19168d78602aSSrinivas Kandagatla } 19178d78602aSSrinivas Kandagatla 19188d78602aSSrinivas Kandagatla int wcd938x_handle_sdw_irq(struct wcd938x_sdw_priv *wcd) 19198d78602aSSrinivas Kandagatla { 19208d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = wcd->wcd938x; 19218d78602aSSrinivas Kandagatla struct irq_domain *slave_irq = wcd938x->virq; 19228d78602aSSrinivas Kandagatla u32 sts1, sts2, sts3; 19238d78602aSSrinivas Kandagatla 19248d78602aSSrinivas Kandagatla do { 19258d78602aSSrinivas Kandagatla handle_nested_irq(irq_find_mapping(slave_irq, 0)); 19268d78602aSSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1); 19278d78602aSSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2); 19288d78602aSSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3); 19298d78602aSSrinivas Kandagatla 19308d78602aSSrinivas Kandagatla } while (sts1 || sts2 || sts3); 19318d78602aSSrinivas Kandagatla 19328d78602aSSrinivas Kandagatla return IRQ_HANDLED; 19338d78602aSSrinivas Kandagatla } 19348d78602aSSrinivas Kandagatla EXPORT_SYMBOL_GPL(wcd938x_handle_sdw_irq); 19358d78602aSSrinivas Kandagatla 193616572522SSrinivas Kandagatla static int wcd938x_codec_hw_params(struct snd_pcm_substream *substream, 193716572522SSrinivas Kandagatla struct snd_pcm_hw_params *params, 193816572522SSrinivas Kandagatla struct snd_soc_dai *dai) 193916572522SSrinivas Kandagatla { 194016572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 194116572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 194216572522SSrinivas Kandagatla 194316572522SSrinivas Kandagatla return wcd938x_sdw_hw_params(wcd, substream, params, dai); 194416572522SSrinivas Kandagatla } 194516572522SSrinivas Kandagatla 194616572522SSrinivas Kandagatla static int wcd938x_codec_free(struct snd_pcm_substream *substream, 194716572522SSrinivas Kandagatla struct snd_soc_dai *dai) 194816572522SSrinivas Kandagatla { 194916572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 195016572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 195116572522SSrinivas Kandagatla 195216572522SSrinivas Kandagatla return wcd938x_sdw_free(wcd, substream, dai); 195316572522SSrinivas Kandagatla } 195416572522SSrinivas Kandagatla 195516572522SSrinivas Kandagatla static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai, 195616572522SSrinivas Kandagatla void *stream, int direction) 195716572522SSrinivas Kandagatla { 195816572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 195916572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 196016572522SSrinivas Kandagatla 196116572522SSrinivas Kandagatla return wcd938x_sdw_set_sdw_stream(wcd, dai, stream, direction); 196216572522SSrinivas Kandagatla 196316572522SSrinivas Kandagatla } 196416572522SSrinivas Kandagatla 19658d78602aSSrinivas Kandagatla static struct snd_soc_dai_ops wcd938x_sdw_dai_ops = { 196616572522SSrinivas Kandagatla .hw_params = wcd938x_codec_hw_params, 196716572522SSrinivas Kandagatla .hw_free = wcd938x_codec_free, 196816572522SSrinivas Kandagatla .set_sdw_stream = wcd938x_codec_set_sdw_stream, 19698d78602aSSrinivas Kandagatla }; 19708d78602aSSrinivas Kandagatla 19718d78602aSSrinivas Kandagatla static struct snd_soc_dai_driver wcd938x_dais[] = { 19728d78602aSSrinivas Kandagatla [0] = { 19738d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-rx", 19748d78602aSSrinivas Kandagatla .playback = { 19758d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Playback", 19768d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK | WCD938X_FRAC_RATES_MASK, 19778d78602aSSrinivas Kandagatla .formats = WCD938X_FORMATS_S16_S24_LE, 19788d78602aSSrinivas Kandagatla .rate_max = 192000, 19798d78602aSSrinivas Kandagatla .rate_min = 8000, 19808d78602aSSrinivas Kandagatla .channels_min = 1, 19818d78602aSSrinivas Kandagatla .channels_max = 2, 19828d78602aSSrinivas Kandagatla }, 19838d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 19848d78602aSSrinivas Kandagatla }, 19858d78602aSSrinivas Kandagatla [1] = { 19868d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-tx", 19878d78602aSSrinivas Kandagatla .capture = { 19888d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Capture", 19898d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK, 19908d78602aSSrinivas Kandagatla .formats = SNDRV_PCM_FMTBIT_S16_LE, 19918d78602aSSrinivas Kandagatla .rate_min = 8000, 19928d78602aSSrinivas Kandagatla .rate_max = 192000, 19938d78602aSSrinivas Kandagatla .channels_min = 1, 19948d78602aSSrinivas Kandagatla .channels_max = 4, 19958d78602aSSrinivas Kandagatla }, 19968d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 19978d78602aSSrinivas Kandagatla }, 19988d78602aSSrinivas Kandagatla }; 19998d78602aSSrinivas Kandagatla 20008d78602aSSrinivas Kandagatla static int wcd938x_bind(struct device *dev) 20018d78602aSSrinivas Kandagatla { 20028d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 20038d78602aSSrinivas Kandagatla int ret; 20048d78602aSSrinivas Kandagatla 20058d78602aSSrinivas Kandagatla ret = component_bind_all(dev, wcd938x); 20068d78602aSSrinivas Kandagatla if (ret) { 20078d78602aSSrinivas Kandagatla dev_err(dev, "%s: Slave bind failed, ret = %d\n", 20088d78602aSSrinivas Kandagatla __func__, ret); 20098d78602aSSrinivas Kandagatla return ret; 20108d78602aSSrinivas Kandagatla } 20118d78602aSSrinivas Kandagatla 201216572522SSrinivas Kandagatla wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); 201316572522SSrinivas Kandagatla if (!wcd938x->rxdev) { 201416572522SSrinivas Kandagatla dev_err(dev, "could not find slave with matching of node\n"); 201516572522SSrinivas Kandagatla return -EINVAL; 201616572522SSrinivas Kandagatla } 201716572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); 201816572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; 201916572522SSrinivas Kandagatla 202016572522SSrinivas Kandagatla wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); 202116572522SSrinivas Kandagatla if (!wcd938x->txdev) { 202216572522SSrinivas Kandagatla dev_err(dev, "could not find txslave with matching of node\n"); 202316572522SSrinivas Kandagatla return -EINVAL; 202416572522SSrinivas Kandagatla } 202516572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); 202616572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; 202716572522SSrinivas Kandagatla wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); 202816572522SSrinivas Kandagatla if (!wcd938x->tx_sdw_dev) { 202916572522SSrinivas Kandagatla dev_err(dev, "could not get txslave with matching of dev\n"); 203016572522SSrinivas Kandagatla return -EINVAL; 203116572522SSrinivas Kandagatla } 203216572522SSrinivas Kandagatla 203316572522SSrinivas Kandagatla /* As TX is main CSR reg interface, which should not be suspended first. 203416572522SSrinivas Kandagatla * expicilty add the dependency link */ 203516572522SSrinivas Kandagatla if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | 203616572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 203716572522SSrinivas Kandagatla dev_err(dev, "could not devlink tx and rx\n"); 203816572522SSrinivas Kandagatla return -EINVAL; 203916572522SSrinivas Kandagatla } 204016572522SSrinivas Kandagatla 204116572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | 204216572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 204316572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and tx\n"); 204416572522SSrinivas Kandagatla return -EINVAL; 204516572522SSrinivas Kandagatla } 204616572522SSrinivas Kandagatla 204716572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | 204816572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 204916572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and rx\n"); 205016572522SSrinivas Kandagatla return -EINVAL; 205116572522SSrinivas Kandagatla } 205216572522SSrinivas Kandagatla 205316572522SSrinivas Kandagatla wcd938x->regmap = dev_get_regmap(wcd938x->txdev, NULL); 205416572522SSrinivas Kandagatla if (!wcd938x->regmap) { 205516572522SSrinivas Kandagatla dev_err(dev, "%s: tx csr regmap not found\n", __func__); 205616572522SSrinivas Kandagatla return PTR_ERR(wcd938x->regmap); 205716572522SSrinivas Kandagatla } 205816572522SSrinivas Kandagatla 20598d78602aSSrinivas Kandagatla ret = wcd938x_set_micbias_data(wcd938x); 20608d78602aSSrinivas Kandagatla if (ret < 0) { 20618d78602aSSrinivas Kandagatla dev_err(dev, "%s: bad micbias pdata\n", __func__); 20628d78602aSSrinivas Kandagatla return ret; 20638d78602aSSrinivas Kandagatla } 20648d78602aSSrinivas Kandagatla 20658d78602aSSrinivas Kandagatla ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, 20668d78602aSSrinivas Kandagatla wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); 20678d78602aSSrinivas Kandagatla if (ret) 20688d78602aSSrinivas Kandagatla dev_err(dev, "%s: Codec registration failed\n", 20698d78602aSSrinivas Kandagatla __func__); 20708d78602aSSrinivas Kandagatla 20718d78602aSSrinivas Kandagatla return ret; 20728d78602aSSrinivas Kandagatla 20738d78602aSSrinivas Kandagatla } 20748d78602aSSrinivas Kandagatla 20758d78602aSSrinivas Kandagatla static void wcd938x_unbind(struct device *dev) 20768d78602aSSrinivas Kandagatla { 20778d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 20788d78602aSSrinivas Kandagatla 207916572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->txdev); 208016572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->rxdev); 208116572522SSrinivas Kandagatla device_link_remove(wcd938x->rxdev, wcd938x->txdev); 20828d78602aSSrinivas Kandagatla snd_soc_unregister_component(dev); 20838d78602aSSrinivas Kandagatla component_unbind_all(dev, wcd938x); 20848d78602aSSrinivas Kandagatla } 20858d78602aSSrinivas Kandagatla 20868d78602aSSrinivas Kandagatla static const struct component_master_ops wcd938x_comp_ops = { 20878d78602aSSrinivas Kandagatla .bind = wcd938x_bind, 20888d78602aSSrinivas Kandagatla .unbind = wcd938x_unbind, 20898d78602aSSrinivas Kandagatla }; 20908d78602aSSrinivas Kandagatla 20918d78602aSSrinivas Kandagatla static int wcd938x_compare_of(struct device *dev, void *data) 20928d78602aSSrinivas Kandagatla { 20938d78602aSSrinivas Kandagatla return dev->of_node == data; 20948d78602aSSrinivas Kandagatla } 20958d78602aSSrinivas Kandagatla 20968d78602aSSrinivas Kandagatla static void wcd938x_release_of(struct device *dev, void *data) 20978d78602aSSrinivas Kandagatla { 20988d78602aSSrinivas Kandagatla of_node_put(data); 20998d78602aSSrinivas Kandagatla } 21008d78602aSSrinivas Kandagatla 21018d78602aSSrinivas Kandagatla static int wcd938x_add_slave_components(struct wcd938x_priv *wcd938x, 21028d78602aSSrinivas Kandagatla struct device *dev, 21038d78602aSSrinivas Kandagatla struct component_match **matchptr) 21048d78602aSSrinivas Kandagatla { 21058d78602aSSrinivas Kandagatla struct device_node *np; 21068d78602aSSrinivas Kandagatla 21078d78602aSSrinivas Kandagatla np = dev->of_node; 21088d78602aSSrinivas Kandagatla 21098d78602aSSrinivas Kandagatla wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); 21108d78602aSSrinivas Kandagatla if (!wcd938x->rxnode) { 21118d78602aSSrinivas Kandagatla dev_err(dev, "%s: Rx-device node not defined\n", __func__); 21128d78602aSSrinivas Kandagatla return -ENODEV; 21138d78602aSSrinivas Kandagatla } 21148d78602aSSrinivas Kandagatla 21158d78602aSSrinivas Kandagatla of_node_get(wcd938x->rxnode); 21168d78602aSSrinivas Kandagatla component_match_add_release(dev, matchptr, wcd938x_release_of, 21178d78602aSSrinivas Kandagatla wcd938x_compare_of, wcd938x->rxnode); 21188d78602aSSrinivas Kandagatla 21198d78602aSSrinivas Kandagatla wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); 21208d78602aSSrinivas Kandagatla if (!wcd938x->txnode) { 21218d78602aSSrinivas Kandagatla dev_err(dev, "%s: Tx-device node not defined\n", __func__); 21228d78602aSSrinivas Kandagatla return -ENODEV; 21238d78602aSSrinivas Kandagatla } 21248d78602aSSrinivas Kandagatla of_node_get(wcd938x->txnode); 21258d78602aSSrinivas Kandagatla component_match_add_release(dev, matchptr, wcd938x_release_of, 21268d78602aSSrinivas Kandagatla wcd938x_compare_of, wcd938x->txnode); 21278d78602aSSrinivas Kandagatla return 0; 21288d78602aSSrinivas Kandagatla } 21298d78602aSSrinivas Kandagatla 21308d78602aSSrinivas Kandagatla static int wcd938x_probe(struct platform_device *pdev) 21318d78602aSSrinivas Kandagatla { 21328d78602aSSrinivas Kandagatla struct component_match *match = NULL; 21338d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = NULL; 21348d78602aSSrinivas Kandagatla struct device *dev = &pdev->dev; 21358d78602aSSrinivas Kandagatla int ret; 21368d78602aSSrinivas Kandagatla 21378d78602aSSrinivas Kandagatla wcd938x = devm_kzalloc(dev, sizeof(struct wcd938x_priv), 21388d78602aSSrinivas Kandagatla GFP_KERNEL); 21398d78602aSSrinivas Kandagatla if (!wcd938x) 21408d78602aSSrinivas Kandagatla return -ENOMEM; 21418d78602aSSrinivas Kandagatla 21428d78602aSSrinivas Kandagatla dev_set_drvdata(dev, wcd938x); 21438d78602aSSrinivas Kandagatla 21448d78602aSSrinivas Kandagatla ret = wcd938x_populate_dt_data(wcd938x, dev); 21458d78602aSSrinivas Kandagatla if (ret) { 21468d78602aSSrinivas Kandagatla dev_err(dev, "%s: Fail to obtain platform data\n", __func__); 21478d78602aSSrinivas Kandagatla return -EINVAL; 21488d78602aSSrinivas Kandagatla } 21498d78602aSSrinivas Kandagatla 21508d78602aSSrinivas Kandagatla ret = wcd938x_add_slave_components(wcd938x, dev, &match); 21518d78602aSSrinivas Kandagatla if (ret) 21528d78602aSSrinivas Kandagatla return ret; 21538d78602aSSrinivas Kandagatla 21548d78602aSSrinivas Kandagatla wcd938x_reset(wcd938x); 21558d78602aSSrinivas Kandagatla 21568d78602aSSrinivas Kandagatla ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match); 21578d78602aSSrinivas Kandagatla if (ret) 21588d78602aSSrinivas Kandagatla return ret; 21598d78602aSSrinivas Kandagatla 21608d78602aSSrinivas Kandagatla pm_runtime_set_autosuspend_delay(dev, 1000); 21618d78602aSSrinivas Kandagatla pm_runtime_use_autosuspend(dev); 21628d78602aSSrinivas Kandagatla pm_runtime_mark_last_busy(dev); 21638d78602aSSrinivas Kandagatla pm_runtime_set_active(dev); 21648d78602aSSrinivas Kandagatla pm_runtime_enable(dev); 21658d78602aSSrinivas Kandagatla pm_runtime_idle(dev); 21668d78602aSSrinivas Kandagatla 21678d78602aSSrinivas Kandagatla return ret; 21688d78602aSSrinivas Kandagatla } 21698d78602aSSrinivas Kandagatla 21708d78602aSSrinivas Kandagatla static int wcd938x_remove(struct platform_device *pdev) 21718d78602aSSrinivas Kandagatla { 21728d78602aSSrinivas Kandagatla component_master_del(&pdev->dev, &wcd938x_comp_ops); 21738d78602aSSrinivas Kandagatla 21748d78602aSSrinivas Kandagatla return 0; 21758d78602aSSrinivas Kandagatla } 21768d78602aSSrinivas Kandagatla 21778d78602aSSrinivas Kandagatla static const struct of_device_id wcd938x_dt_match[] = { 21788d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9380-codec" }, 21798d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9385-codec" }, 21808d78602aSSrinivas Kandagatla {} 21818d78602aSSrinivas Kandagatla }; 21828d78602aSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wcd938x_dt_match); 21838d78602aSSrinivas Kandagatla 21848d78602aSSrinivas Kandagatla static struct platform_driver wcd938x_codec_driver = { 21858d78602aSSrinivas Kandagatla .probe = wcd938x_probe, 21868d78602aSSrinivas Kandagatla .remove = wcd938x_remove, 21878d78602aSSrinivas Kandagatla .driver = { 21888d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 21898d78602aSSrinivas Kandagatla .of_match_table = of_match_ptr(wcd938x_dt_match), 21908d78602aSSrinivas Kandagatla .suppress_bind_attrs = true, 21918d78602aSSrinivas Kandagatla }, 21928d78602aSSrinivas Kandagatla }; 21938d78602aSSrinivas Kandagatla 21948d78602aSSrinivas Kandagatla module_platform_driver(wcd938x_codec_driver); 21958d78602aSSrinivas Kandagatla MODULE_DESCRIPTION("WCD938X Codec driver"); 21968d78602aSSrinivas Kandagatla MODULE_LICENSE("GPL"); 2197