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 77e8ba1e05SSrinivas Kandagatla #define WCD938X_EAR_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \ 78e8ba1e05SSrinivas Kandagatla { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 79e8ba1e05SSrinivas Kandagatla .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ 80e8ba1e05SSrinivas Kandagatla SNDRV_CTL_ELEM_ACCESS_READWRITE,\ 81e8ba1e05SSrinivas Kandagatla .tlv.p = (tlv_array), \ 82e8ba1e05SSrinivas Kandagatla .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\ 83e8ba1e05SSrinivas Kandagatla .put = wcd938x_ear_pa_put_gain, \ 84e8ba1e05SSrinivas Kandagatla .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } 85e8ba1e05SSrinivas 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 209e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800); 210e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(line_gain, 600, -3000); 211e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(analog_gain, 0, 3000); 212e8ba1e05SSrinivas 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 1298e8ba1e05SSrinivas Kandagatla static int wcd938x_sdw_connect_port(struct wcd938x_sdw_ch_info *ch_info, 1299e8ba1e05SSrinivas Kandagatla struct sdw_port_config *port_config, 1300e8ba1e05SSrinivas Kandagatla u32 mstr_port_num, 1301e8ba1e05SSrinivas Kandagatla u8 enable) 1302e8ba1e05SSrinivas Kandagatla { 1303e8ba1e05SSrinivas Kandagatla u8 ch_mask, port_num; 1304e8ba1e05SSrinivas Kandagatla 1305e8ba1e05SSrinivas Kandagatla port_num = ch_info->port_num; 1306e8ba1e05SSrinivas Kandagatla ch_mask = ch_info->ch_mask; 1307e8ba1e05SSrinivas Kandagatla 1308e8ba1e05SSrinivas Kandagatla port_config->num = port_num; 1309e8ba1e05SSrinivas Kandagatla 1310e8ba1e05SSrinivas Kandagatla if (enable) 1311e8ba1e05SSrinivas Kandagatla port_config->ch_mask |= ch_mask; 1312e8ba1e05SSrinivas Kandagatla else 1313e8ba1e05SSrinivas Kandagatla port_config->ch_mask &= ~ch_mask; 1314e8ba1e05SSrinivas Kandagatla 1315e8ba1e05SSrinivas Kandagatla return 0; 1316e8ba1e05SSrinivas Kandagatla } 1317e8ba1e05SSrinivas Kandagatla 1318e8ba1e05SSrinivas Kandagatla static int wcd938x_connect_port(struct wcd938x_sdw_priv *wcd, u8 ch_id, u8 enable) 1319e8ba1e05SSrinivas Kandagatla { 1320e8ba1e05SSrinivas Kandagatla u8 port_num, mstr_port_num; 1321e8ba1e05SSrinivas Kandagatla 1322e8ba1e05SSrinivas Kandagatla port_num = wcd->ch_info[ch_id].port_num; 1323e8ba1e05SSrinivas Kandagatla mstr_port_num = wcd->port_map[port_num - 1]; 1324e8ba1e05SSrinivas Kandagatla 1325e8ba1e05SSrinivas Kandagatla return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], 1326e8ba1e05SSrinivas Kandagatla &wcd->port_config[port_num], 1327e8ba1e05SSrinivas Kandagatla mstr_port_num, 1328e8ba1e05SSrinivas Kandagatla enable); 1329e8ba1e05SSrinivas Kandagatla } 1330e8ba1e05SSrinivas Kandagatla 1331*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_rxclk(struct snd_soc_dapm_widget *w, 1332*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 1333*8da9db0cSSrinivas Kandagatla int event) 1334*8da9db0cSSrinivas Kandagatla { 1335*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1336*8da9db0cSSrinivas Kandagatla 1337*8da9db0cSSrinivas Kandagatla switch (event) { 1338*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1339*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 1340*8da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_CLK_EN_MASK, 1); 1341*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1342*8da9db0cSSrinivas Kandagatla WCD938X_RX_BIAS_EN_MASK, 1); 1343*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX0_CTL, 1344*8da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 1345*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX1_CTL, 1346*8da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 1347*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX2_CTL, 1348*8da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 1349*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 1350*8da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV2_CLK_EN_MASK, 1); 1351*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_AUX_AUXPA, 1352*8da9db0cSSrinivas Kandagatla WCD938X_AUXPA_CLK_EN_MASK, 1); 1353*8da9db0cSSrinivas Kandagatla break; 1354*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1355*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1356*8da9db0cSSrinivas Kandagatla WCD938X_VNEG_EN_MASK, 0); 1357*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1358*8da9db0cSSrinivas Kandagatla WCD938X_VPOS_EN_MASK, 0); 1359*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1360*8da9db0cSSrinivas Kandagatla WCD938X_RX_BIAS_EN_MASK, 0); 1361*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 1362*8da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV2_CLK_EN_MASK, 0); 1363*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 1364*8da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_CLK_EN_MASK, 0); 1365*8da9db0cSSrinivas Kandagatla break; 1366*8da9db0cSSrinivas Kandagatla } 1367*8da9db0cSSrinivas Kandagatla return 0; 1368*8da9db0cSSrinivas Kandagatla } 1369*8da9db0cSSrinivas Kandagatla 1370*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, 1371*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 1372*8da9db0cSSrinivas Kandagatla int event) 1373*8da9db0cSSrinivas Kandagatla { 1374*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1375*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1376*8da9db0cSSrinivas Kandagatla 1377*8da9db0cSSrinivas Kandagatla switch (event) { 1378*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1379*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1380*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1381*8da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 0x01); 1382*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1383*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 1384*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 1); 1385*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1386*8da9db0cSSrinivas Kandagatla WCD938X_HPH_RDAC_CLK_CTL1, 1387*8da9db0cSSrinivas Kandagatla WCD938X_CHOP_CLK_EN_MASK, 0); 1388*8da9db0cSSrinivas Kandagatla break; 1389*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 1390*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1391*8da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 1392*8da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x02); 1393*8da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) { 1394*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1395*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 1396*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 1); 1397*8da9db0cSSrinivas Kandagatla /* 5msec compander delay as per HW requirement */ 1398*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable || (snd_soc_component_read(component, 1399*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x01)) 1400*8da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 1401*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 1402*8da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 0); 1403*8da9db0cSSrinivas Kandagatla } else { 1404*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1405*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 1406*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 0); 1407*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1408*8da9db0cSSrinivas Kandagatla WCD938X_HPH_L_EN, 1409*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_MASK, 1410*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_REGISTER); 1411*8da9db0cSSrinivas Kandagatla 1412*8da9db0cSSrinivas Kandagatla } 1413*8da9db0cSSrinivas Kandagatla break; 1414*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1415*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1416*8da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 1417*8da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x1); 1418*8da9db0cSSrinivas Kandagatla break; 1419*8da9db0cSSrinivas Kandagatla } 1420*8da9db0cSSrinivas Kandagatla 1421*8da9db0cSSrinivas Kandagatla return 0; 1422*8da9db0cSSrinivas Kandagatla } 1423*8da9db0cSSrinivas Kandagatla 1424*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, 1425*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 1426*8da9db0cSSrinivas Kandagatla int event) 1427*8da9db0cSSrinivas Kandagatla { 1428*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1429*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1430*8da9db0cSSrinivas Kandagatla 1431*8da9db0cSSrinivas Kandagatla switch (event) { 1432*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1433*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1434*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1435*8da9db0cSSrinivas Kandagatla WCD938X_RXD1_CLK_EN_MASK, 1); 1436*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1437*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 1438*8da9db0cSSrinivas Kandagatla WCD938X_HPHR_RX_EN_MASK, 1); 1439*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1440*8da9db0cSSrinivas Kandagatla WCD938X_HPH_RDAC_CLK_CTL1, 1441*8da9db0cSSrinivas Kandagatla WCD938X_CHOP_CLK_EN_MASK, 0); 1442*8da9db0cSSrinivas Kandagatla break; 1443*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 1444*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1445*8da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 1446*8da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x02); 1447*8da9db0cSSrinivas Kandagatla if (wcd938x->comp2_enable) { 1448*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1449*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 1450*8da9db0cSSrinivas Kandagatla WCD938X_HPHR_COMP_EN_MASK, 1); 1451*8da9db0cSSrinivas Kandagatla /* 5msec compander delay as per HW requirement */ 1452*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable || 1453*8da9db0cSSrinivas Kandagatla (snd_soc_component_read(component, 1454*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x02)) 1455*8da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 1456*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 1457*8da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 0); 1458*8da9db0cSSrinivas Kandagatla } else { 1459*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1460*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 1461*8da9db0cSSrinivas Kandagatla WCD938X_HPHR_COMP_EN_MASK, 0); 1462*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1463*8da9db0cSSrinivas Kandagatla WCD938X_HPH_R_EN, 1464*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_MASK, 1465*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_REGISTER); 1466*8da9db0cSSrinivas Kandagatla } 1467*8da9db0cSSrinivas Kandagatla break; 1468*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1469*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1470*8da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 1471*8da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x01); 1472*8da9db0cSSrinivas Kandagatla break; 1473*8da9db0cSSrinivas Kandagatla } 1474*8da9db0cSSrinivas Kandagatla 1475*8da9db0cSSrinivas Kandagatla return 0; 1476*8da9db0cSSrinivas Kandagatla } 1477*8da9db0cSSrinivas Kandagatla 1478*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_ear_dac_event(struct snd_soc_dapm_widget *w, 1479*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 1480*8da9db0cSSrinivas Kandagatla int event) 1481*8da9db0cSSrinivas Kandagatla { 1482*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1483*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1484*8da9db0cSSrinivas Kandagatla 1485*8da9db0cSSrinivas Kandagatla switch (event) { 1486*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1487*8da9db0cSSrinivas Kandagatla wcd938x->ear_rx_path = 1488*8da9db0cSSrinivas Kandagatla snd_soc_component_read( 1489*8da9db0cSSrinivas Kandagatla component, WCD938X_DIGITAL_CDC_EAR_PATH_CTL); 1490*8da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { 1491*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1492*8da9db0cSSrinivas Kandagatla WCD938X_EAR_EAR_DAC_CON, 1493*8da9db0cSSrinivas Kandagatla WCD938X_DAC_SAMPLE_EDGE_SEL_MASK, 0); 1494*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1495*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 1496*8da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 1); 1497*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1498*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1499*8da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 1); 1500*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1501*8da9db0cSSrinivas Kandagatla WCD938X_ANA_EAR_COMPANDER_CTL, 1502*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 1); 1503*8da9db0cSSrinivas Kandagatla } else { 1504*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1505*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 1506*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 1); 1507*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1508*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1509*8da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 1); 1510*8da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) 1511*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1512*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 1513*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 1); 1514*8da9db0cSSrinivas Kandagatla } 1515*8da9db0cSSrinivas Kandagatla /* 5 msec delay as per HW requirement */ 1516*8da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 1517*8da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 1518*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 1519*8da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 0); 1520*8da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable++; 1521*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 1522*8da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_PRE_DAC, 1523*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_EAR, 1524*8da9db0cSSrinivas Kandagatla wcd938x->hph_mode); 1525*8da9db0cSSrinivas Kandagatla break; 1526*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1527*8da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { 1528*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1529*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 1530*8da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 0); 1531*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1532*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1533*8da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 0); 1534*8da9db0cSSrinivas Kandagatla } else { 1535*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1536*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 1537*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 0); 1538*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1539*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1540*8da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 0); 1541*8da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) 1542*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1543*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 1544*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 0); 1545*8da9db0cSSrinivas Kandagatla } 1546*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 1547*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 0); 1548*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1549*8da9db0cSSrinivas Kandagatla WCD938X_EAR_EAR_DAC_CON, 1550*8da9db0cSSrinivas Kandagatla WCD938X_DAC_SAMPLE_EDGE_SEL_MASK, 1); 1551*8da9db0cSSrinivas Kandagatla break; 1552*8da9db0cSSrinivas Kandagatla } 1553*8da9db0cSSrinivas Kandagatla return 0; 1554*8da9db0cSSrinivas Kandagatla 1555*8da9db0cSSrinivas Kandagatla } 1556*8da9db0cSSrinivas Kandagatla 1557*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_aux_dac_event(struct snd_soc_dapm_widget *w, 1558*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 1559*8da9db0cSSrinivas Kandagatla int event) 1560*8da9db0cSSrinivas Kandagatla { 1561*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1562*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1563*8da9db0cSSrinivas Kandagatla int ret = 0; 1564*8da9db0cSSrinivas Kandagatla 1565*8da9db0cSSrinivas Kandagatla switch (event) { 1566*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1567*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1568*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 1569*8da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV4_CLK_EN_MASK, 1); 1570*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1571*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 1572*8da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 1); 1573*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1574*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 1575*8da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 1); 1576*8da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 1577*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 1578*8da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 0); 1579*8da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable++; 1580*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 1581*8da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_PRE_DAC, 1582*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_AUX, 1583*8da9db0cSSrinivas Kandagatla wcd938x->hph_mode); 1584*8da9db0cSSrinivas Kandagatla break; 1585*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1586*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1587*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 1588*8da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV4_CLK_EN_MASK, 0); 1589*8da9db0cSSrinivas Kandagatla break; 1590*8da9db0cSSrinivas Kandagatla } 1591*8da9db0cSSrinivas Kandagatla return ret; 1592*8da9db0cSSrinivas Kandagatla 1593*8da9db0cSSrinivas Kandagatla } 1594*8da9db0cSSrinivas Kandagatla 1595*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, 1596*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 1597*8da9db0cSSrinivas Kandagatla { 1598*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1599*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1600*8da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 1601*8da9db0cSSrinivas Kandagatla 1602*8da9db0cSSrinivas Kandagatla switch (event) { 1603*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1604*8da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 1605*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 1606*8da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 1); 1607*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, 1608*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHR, hph_mode); 1609*8da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); 1610*8da9db0cSSrinivas Kandagatla 1611*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 1612*8da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) { 1613*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1614*8da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 1615*8da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 1); 1616*8da9db0cSSrinivas Kandagatla } 1617*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 1618*8da9db0cSSrinivas Kandagatla WCD938X_HPHR_REF_EN_MASK, 1); 1619*8da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); 1620*8da9db0cSSrinivas Kandagatla /* 100 usec delay as per HW requirement */ 1621*8da9db0cSSrinivas Kandagatla usleep_range(100, 110); 1622*8da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1623*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1624*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL1, 1625*8da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 1626*8da9db0cSSrinivas Kandagatla break; 1627*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 1628*8da9db0cSSrinivas Kandagatla /* 1629*8da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 1630*8da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 1631*8da9db0cSSrinivas Kandagatla * 20ms delay is required. 1632*8da9db0cSSrinivas Kandagatla */ 1633*8da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 1634*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 1635*8da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 1636*8da9db0cSSrinivas Kandagatla else 1637*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 1638*8da9db0cSSrinivas Kandagatla 1639*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 1640*8da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) 1641*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1642*8da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 1643*8da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 0); 1644*8da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1645*8da9db0cSSrinivas Kandagatla } 1646*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 1647*8da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 1); 1648*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 1649*8da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 1650*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1651*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 1652*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 1653*8da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphr_pdm_wd_int); 1654*8da9db0cSSrinivas Kandagatla break; 1655*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 1656*8da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 1657*8da9db0cSSrinivas Kandagatla /* 1658*8da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 1659*8da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 1660*8da9db0cSSrinivas Kandagatla * 20ms delay is required. 1661*8da9db0cSSrinivas Kandagatla */ 1662*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 1663*8da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 1664*8da9db0cSSrinivas Kandagatla else 1665*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 1666*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 1667*8da9db0cSSrinivas Kandagatla WCD938X_HPHR_EN_MASK, 0); 1668*8da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1669*8da9db0cSSrinivas Kandagatla break; 1670*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1671*8da9db0cSSrinivas Kandagatla /* 1672*8da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 1673*8da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 1674*8da9db0cSSrinivas Kandagatla * 20ms delay is required. 1675*8da9db0cSSrinivas Kandagatla */ 1676*8da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 1677*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 1678*8da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 1679*8da9db0cSSrinivas Kandagatla else 1680*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 1681*8da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1682*8da9db0cSSrinivas Kandagatla } 1683*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 1684*8da9db0cSSrinivas Kandagatla WCD938X_HPHR_REF_EN_MASK, 0); 1685*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL1, 1686*8da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 1687*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 1688*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHR, hph_mode); 1689*8da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 1690*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 1691*8da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 0); 1692*8da9db0cSSrinivas Kandagatla break; 1693*8da9db0cSSrinivas Kandagatla } 1694*8da9db0cSSrinivas Kandagatla 1695*8da9db0cSSrinivas Kandagatla return 0; 1696*8da9db0cSSrinivas Kandagatla } 1697*8da9db0cSSrinivas Kandagatla 1698*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, 1699*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 1700*8da9db0cSSrinivas Kandagatla { 1701*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1702*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1703*8da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 1704*8da9db0cSSrinivas Kandagatla 1705*8da9db0cSSrinivas Kandagatla switch (event) { 1706*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1707*8da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 1708*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 1709*8da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 1); 1710*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, 1711*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHL, hph_mode); 1712*8da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); 1713*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 1714*8da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) { 1715*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1716*8da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 1717*8da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 1); 1718*8da9db0cSSrinivas Kandagatla } 1719*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 1720*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_REF_EN_MASK, 1); 1721*8da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); 1722*8da9db0cSSrinivas Kandagatla /* 100 usec delay as per HW requirement */ 1723*8da9db0cSSrinivas Kandagatla usleep_range(100, 110); 1724*8da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1725*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1726*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL0, 1727*8da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 1728*8da9db0cSSrinivas Kandagatla break; 1729*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 1730*8da9db0cSSrinivas Kandagatla /* 1731*8da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 1732*8da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 1733*8da9db0cSSrinivas Kandagatla * 20ms delay is required. 1734*8da9db0cSSrinivas Kandagatla */ 1735*8da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 1736*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 1737*8da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 1738*8da9db0cSSrinivas Kandagatla else 1739*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 1740*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 1741*8da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) 1742*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1743*8da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 1744*8da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 0); 1745*8da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1746*8da9db0cSSrinivas Kandagatla } 1747*8da9db0cSSrinivas Kandagatla 1748*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 1749*8da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 1); 1750*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 1751*8da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 1752*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1753*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 1754*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 1755*8da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphl_pdm_wd_int); 1756*8da9db0cSSrinivas Kandagatla break; 1757*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 1758*8da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 1759*8da9db0cSSrinivas Kandagatla /* 1760*8da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 1761*8da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 1762*8da9db0cSSrinivas Kandagatla * 20ms delay is required. 1763*8da9db0cSSrinivas Kandagatla */ 1764*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 1765*8da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 1766*8da9db0cSSrinivas Kandagatla else 1767*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 1768*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 1769*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_EN_MASK, 0); 1770*8da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1771*8da9db0cSSrinivas Kandagatla break; 1772*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1773*8da9db0cSSrinivas Kandagatla /* 1774*8da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 1775*8da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 1776*8da9db0cSSrinivas Kandagatla * 20ms delay is required. 1777*8da9db0cSSrinivas Kandagatla */ 1778*8da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 1779*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 1780*8da9db0cSSrinivas Kandagatla usleep_range(21000, 21100); 1781*8da9db0cSSrinivas Kandagatla else 1782*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 1783*8da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 1784*8da9db0cSSrinivas Kandagatla } 1785*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 1786*8da9db0cSSrinivas Kandagatla WCD938X_HPHL_REF_EN_MASK, 0); 1787*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL0, 1788*8da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 1789*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 1790*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHL, hph_mode); 1791*8da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 1792*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 1793*8da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 0); 1794*8da9db0cSSrinivas Kandagatla break; 1795*8da9db0cSSrinivas Kandagatla } 1796*8da9db0cSSrinivas Kandagatla 1797*8da9db0cSSrinivas Kandagatla return 0; 1798*8da9db0cSSrinivas Kandagatla } 1799*8da9db0cSSrinivas Kandagatla 1800*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, 1801*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 1802*8da9db0cSSrinivas Kandagatla { 1803*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1804*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1805*8da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 1806*8da9db0cSSrinivas Kandagatla int ret = 0; 1807*8da9db0cSSrinivas Kandagatla 1808*8da9db0cSSrinivas Kandagatla switch (event) { 1809*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1810*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 1811*8da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 1); 1812*8da9db0cSSrinivas Kandagatla break; 1813*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 1814*8da9db0cSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 1815*8da9db0cSSrinivas Kandagatla usleep_range(1000, 1010); 1816*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 1817*8da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 1818*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1819*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 1820*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 1821*8da9db0cSSrinivas Kandagatla enable_irq(wcd938x->aux_pdm_wd_int); 1822*8da9db0cSSrinivas Kandagatla break; 1823*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 1824*8da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 1825*8da9db0cSSrinivas Kandagatla break; 1826*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1827*8da9db0cSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 1828*8da9db0cSSrinivas Kandagatla usleep_range(1000, 1010); 1829*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 1830*8da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 0); 1831*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 1832*8da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_POST_PA, 1833*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_AUX, 1834*8da9db0cSSrinivas Kandagatla hph_mode); 1835*8da9db0cSSrinivas Kandagatla 1836*8da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable--; 1837*8da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 1838*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 1839*8da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 1); 1840*8da9db0cSSrinivas Kandagatla break; 1841*8da9db0cSSrinivas Kandagatla } 1842*8da9db0cSSrinivas Kandagatla return ret; 1843*8da9db0cSSrinivas Kandagatla } 1844*8da9db0cSSrinivas Kandagatla 1845*8da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, 1846*8da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 1847*8da9db0cSSrinivas Kandagatla { 1848*8da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1849*8da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1850*8da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 1851*8da9db0cSSrinivas Kandagatla 1852*8da9db0cSSrinivas Kandagatla switch (event) { 1853*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 1854*8da9db0cSSrinivas Kandagatla /* 1855*8da9db0cSSrinivas Kandagatla * Enable watchdog interrupt for HPHL or AUX 1856*8da9db0cSSrinivas Kandagatla * depending on mux value 1857*8da9db0cSSrinivas Kandagatla */ 1858*8da9db0cSSrinivas Kandagatla wcd938x->ear_rx_path = snd_soc_component_read(component, 1859*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_EAR_PATH_CTL); 1860*8da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 1861*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 1862*8da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 1); 1863*8da9db0cSSrinivas Kandagatla else 1864*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1865*8da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL0, 1866*8da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 1867*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 1868*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 1869*8da9db0cSSrinivas Kandagatla WCD938X_ANA_EAR_COMPANDER_CTL, 1870*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 1); 1871*8da9db0cSSrinivas Kandagatla 1872*8da9db0cSSrinivas Kandagatla break; 1873*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 1874*8da9db0cSSrinivas Kandagatla /* 6 msec delay as per HW requirement */ 1875*8da9db0cSSrinivas Kandagatla usleep_range(6000, 6010); 1876*8da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 1877*8da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 1878*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 1879*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 1880*8da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 1881*8da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 1882*8da9db0cSSrinivas Kandagatla enable_irq(wcd938x->aux_pdm_wd_int); 1883*8da9db0cSSrinivas Kandagatla else 1884*8da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphl_pdm_wd_int); 1885*8da9db0cSSrinivas Kandagatla break; 1886*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 1887*8da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 1888*8da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 1889*8da9db0cSSrinivas Kandagatla else 1890*8da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 1891*8da9db0cSSrinivas Kandagatla break; 1892*8da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 1893*8da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 1894*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 1895*8da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 0); 1896*8da9db0cSSrinivas Kandagatla /* 7 msec delay as per HW requirement */ 1897*8da9db0cSSrinivas Kandagatla usleep_range(7000, 7010); 1898*8da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 1899*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 1900*8da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 0); 1901*8da9db0cSSrinivas Kandagatla else 1902*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL0, 1903*8da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 1904*8da9db0cSSrinivas Kandagatla 1905*8da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 1906*8da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_EAR, hph_mode); 1907*8da9db0cSSrinivas Kandagatla 1908*8da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable--; 1909*8da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 1910*8da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 1911*8da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 1); 1912*8da9db0cSSrinivas Kandagatla break; 1913*8da9db0cSSrinivas Kandagatla } 1914*8da9db0cSSrinivas Kandagatla 1915*8da9db0cSSrinivas Kandagatla return 0; 1916*8da9db0cSSrinivas Kandagatla } 1917*8da9db0cSSrinivas Kandagatla 1918e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_get(struct snd_kcontrol *kcontrol, 1919e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1920e8ba1e05SSrinivas Kandagatla { 1921e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1922e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1923e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1924e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 1925e8ba1e05SSrinivas Kandagatla 1926e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->tx_mode[path]; 1927e8ba1e05SSrinivas Kandagatla 1928e8ba1e05SSrinivas Kandagatla return 0; 1929e8ba1e05SSrinivas Kandagatla } 1930e8ba1e05SSrinivas Kandagatla 1931e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_put(struct snd_kcontrol *kcontrol, 1932e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1933e8ba1e05SSrinivas Kandagatla { 1934e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1935e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1936e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1937e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 1938e8ba1e05SSrinivas Kandagatla 1939e8ba1e05SSrinivas Kandagatla wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0]; 1940e8ba1e05SSrinivas Kandagatla 1941e8ba1e05SSrinivas Kandagatla return 1; 1942e8ba1e05SSrinivas Kandagatla } 1943e8ba1e05SSrinivas Kandagatla 1944e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, 1945e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1946e8ba1e05SSrinivas Kandagatla { 1947e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1948e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1949e8ba1e05SSrinivas Kandagatla 1950e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->hph_mode; 1951e8ba1e05SSrinivas Kandagatla 1952e8ba1e05SSrinivas Kandagatla return 0; 1953e8ba1e05SSrinivas Kandagatla } 1954e8ba1e05SSrinivas Kandagatla 1955e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, 1956e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1957e8ba1e05SSrinivas Kandagatla { 1958e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1959e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1960e8ba1e05SSrinivas Kandagatla 1961e8ba1e05SSrinivas Kandagatla wcd938x->hph_mode = ucontrol->value.enumerated.item[0]; 1962e8ba1e05SSrinivas Kandagatla 1963e8ba1e05SSrinivas Kandagatla return 1; 1964e8ba1e05SSrinivas Kandagatla } 1965e8ba1e05SSrinivas Kandagatla 1966e8ba1e05SSrinivas Kandagatla static int wcd938x_ear_pa_put_gain(struct snd_kcontrol *kcontrol, 1967e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1968e8ba1e05SSrinivas Kandagatla { 1969e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1970e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1971e8ba1e05SSrinivas Kandagatla 1972e8ba1e05SSrinivas Kandagatla if (wcd938x->comp1_enable) { 1973e8ba1e05SSrinivas Kandagatla dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n"); 1974e8ba1e05SSrinivas Kandagatla return -EINVAL; 1975e8ba1e05SSrinivas Kandagatla } 1976e8ba1e05SSrinivas Kandagatla 1977e8ba1e05SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 1978e8ba1e05SSrinivas Kandagatla WCD938X_EAR_GAIN_MASK, 1979e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0]); 1980e8ba1e05SSrinivas Kandagatla 1981e8ba1e05SSrinivas Kandagatla return 0; 1982e8ba1e05SSrinivas Kandagatla } 1983e8ba1e05SSrinivas Kandagatla 1984e8ba1e05SSrinivas Kandagatla static int wcd938x_get_compander(struct snd_kcontrol *kcontrol, 1985e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 1986e8ba1e05SSrinivas Kandagatla { 1987e8ba1e05SSrinivas Kandagatla 1988e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1989e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 1990e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 1991e8ba1e05SSrinivas Kandagatla bool hphr; 1992e8ba1e05SSrinivas Kandagatla 1993e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 1994e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 1995e8ba1e05SSrinivas Kandagatla 1996e8ba1e05SSrinivas Kandagatla if (hphr) 1997e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp2_enable; 1998e8ba1e05SSrinivas Kandagatla else 1999e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp1_enable; 2000e8ba1e05SSrinivas Kandagatla 2001e8ba1e05SSrinivas Kandagatla return 0; 2002e8ba1e05SSrinivas Kandagatla } 2003e8ba1e05SSrinivas Kandagatla 2004e8ba1e05SSrinivas Kandagatla static int wcd938x_set_compander(struct snd_kcontrol *kcontrol, 2005e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2006e8ba1e05SSrinivas Kandagatla { 2007e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2008e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2009e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2010e8ba1e05SSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 2011e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 2012e8ba1e05SSrinivas Kandagatla bool hphr; 2013e8ba1e05SSrinivas Kandagatla 2014e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 2015e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 2016e8ba1e05SSrinivas Kandagatla 2017e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[AIF1_PB]; 2018e8ba1e05SSrinivas Kandagatla 2019e8ba1e05SSrinivas Kandagatla if (hphr) 2020e8ba1e05SSrinivas Kandagatla wcd938x->comp2_enable = value; 2021e8ba1e05SSrinivas Kandagatla else 2022e8ba1e05SSrinivas Kandagatla wcd938x->comp1_enable = value; 2023e8ba1e05SSrinivas Kandagatla 2024e8ba1e05SSrinivas Kandagatla if (value) 2025e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, mc->reg, true); 2026e8ba1e05SSrinivas Kandagatla else 2027e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, mc->reg, false); 2028e8ba1e05SSrinivas Kandagatla 2029e8ba1e05SSrinivas Kandagatla return 0; 2030e8ba1e05SSrinivas Kandagatla } 2031e8ba1e05SSrinivas Kandagatla 2032e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol, 2033e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2034e8ba1e05SSrinivas Kandagatla { 2035e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2036e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2037e8ba1e05SSrinivas Kandagatla 2038e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->ldoh; 2039e8ba1e05SSrinivas Kandagatla 2040e8ba1e05SSrinivas Kandagatla return 0; 2041e8ba1e05SSrinivas Kandagatla } 2042e8ba1e05SSrinivas Kandagatla 2043e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_put(struct snd_kcontrol *kcontrol, 2044e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2045e8ba1e05SSrinivas Kandagatla { 2046e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2047e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2048e8ba1e05SSrinivas Kandagatla 2049e8ba1e05SSrinivas Kandagatla wcd938x->ldoh = ucontrol->value.integer.value[0]; 2050e8ba1e05SSrinivas Kandagatla 2051e8ba1e05SSrinivas Kandagatla return 1; 2052e8ba1e05SSrinivas Kandagatla } 2053e8ba1e05SSrinivas Kandagatla 2054e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_get(struct snd_kcontrol *kcontrol, 2055e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2056e8ba1e05SSrinivas Kandagatla { 2057e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2058e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2059e8ba1e05SSrinivas Kandagatla 2060e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->bcs_dis; 2061e8ba1e05SSrinivas Kandagatla 2062e8ba1e05SSrinivas Kandagatla return 0; 2063e8ba1e05SSrinivas Kandagatla } 2064e8ba1e05SSrinivas Kandagatla 2065e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, 2066e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2067e8ba1e05SSrinivas Kandagatla { 2068e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2069e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2070e8ba1e05SSrinivas Kandagatla 2071e8ba1e05SSrinivas Kandagatla wcd938x->bcs_dis = ucontrol->value.integer.value[0]; 2072e8ba1e05SSrinivas Kandagatla 2073e8ba1e05SSrinivas Kandagatla return 1; 2074e8ba1e05SSrinivas Kandagatla } 2075e8ba1e05SSrinivas Kandagatla 2076e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text_wcd9380[] = { 2077e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 2078e8ba1e05SSrinivas Kandagatla }; 2079e8ba1e05SSrinivas Kandagatla 2080e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text[] = { 2081e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 2082e8ba1e05SSrinivas Kandagatla "ADC_ULP1", "ADC_ULP2", 2083e8ba1e05SSrinivas Kandagatla }; 2084e8ba1e05SSrinivas Kandagatla 2085e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text_wcd9380[] = { 2086e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_INVALID_1", "CLS_H_LP", "CLS_AB", 2087e8ba1e05SSrinivas Kandagatla "CLS_H_LOHIFI", "CLS_H_ULP", "CLS_H_INVALID_2", "CLS_AB_LP", 2088e8ba1e05SSrinivas Kandagatla "CLS_AB_LOHIFI", 2089e8ba1e05SSrinivas Kandagatla }; 2090e8ba1e05SSrinivas Kandagatla 2091e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text[] = { 2092e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", 2093e8ba1e05SSrinivas Kandagatla "CLS_H_ULP", "CLS_AB_HIFI", "CLS_AB_LP", "CLS_AB_LOHIFI", 2094e8ba1e05SSrinivas Kandagatla }; 2095e8ba1e05SSrinivas Kandagatla 2096*8da9db0cSSrinivas Kandagatla static const char * const adc2_mux_text[] = { 2097*8da9db0cSSrinivas Kandagatla "INP2", "INP3" 2098*8da9db0cSSrinivas Kandagatla }; 2099*8da9db0cSSrinivas Kandagatla 2100*8da9db0cSSrinivas Kandagatla static const char * const adc3_mux_text[] = { 2101*8da9db0cSSrinivas Kandagatla "INP4", "INP6" 2102*8da9db0cSSrinivas Kandagatla }; 2103*8da9db0cSSrinivas Kandagatla 2104*8da9db0cSSrinivas Kandagatla static const char * const adc4_mux_text[] = { 2105*8da9db0cSSrinivas Kandagatla "INP5", "INP7" 2106*8da9db0cSSrinivas Kandagatla }; 2107*8da9db0cSSrinivas Kandagatla 2108*8da9db0cSSrinivas Kandagatla static const char * const rdac3_mux_text[] = { 2109*8da9db0cSSrinivas Kandagatla "RX1", "RX3" 2110*8da9db0cSSrinivas Kandagatla }; 2111*8da9db0cSSrinivas Kandagatla 2112*8da9db0cSSrinivas Kandagatla static const char * const hdr12_mux_text[] = { 2113*8da9db0cSSrinivas Kandagatla "NO_HDR12", "HDR12" 2114*8da9db0cSSrinivas Kandagatla }; 2115*8da9db0cSSrinivas Kandagatla 2116*8da9db0cSSrinivas Kandagatla static const char * const hdr34_mux_text[] = { 2117*8da9db0cSSrinivas Kandagatla "NO_HDR34", "HDR34" 2118*8da9db0cSSrinivas Kandagatla }; 2119*8da9db0cSSrinivas Kandagatla 2120e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9380 = 2121e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2122e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2123e8ba1e05SSrinivas Kandagatla 2124e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9380 = 2125e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2126e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2127e8ba1e05SSrinivas Kandagatla 2128e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9380 = 2129e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2130e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2131e8ba1e05SSrinivas Kandagatla 2132e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9380 = 2133e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2134e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2135e8ba1e05SSrinivas Kandagatla 2136e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9385 = 2137e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text), 2138e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2139e8ba1e05SSrinivas Kandagatla 2140e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9385 = 2141e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text), 2142e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2143e8ba1e05SSrinivas Kandagatla 2144e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9385 = 2145e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text), 2146e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2147e8ba1e05SSrinivas Kandagatla 2148e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9385 = 2149e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text), 2150e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2151e8ba1e05SSrinivas Kandagatla 2152e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 = 2153e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380), 2154e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text_wcd9380); 2155e8ba1e05SSrinivas Kandagatla 2156e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum = 2157e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), 2158e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text); 2159e8ba1e05SSrinivas Kandagatla 2160*8da9db0cSSrinivas Kandagatla static const struct soc_enum rdac3_enum = 2161*8da9db0cSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0, 2162*8da9db0cSSrinivas Kandagatla ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text); 2163*8da9db0cSSrinivas Kandagatla 2164*8da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new ear_rdac_switch[] = { 2165*8da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2166*8da9db0cSSrinivas Kandagatla }; 2167*8da9db0cSSrinivas Kandagatla 2168*8da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new aux_rdac_switch[] = { 2169*8da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2170*8da9db0cSSrinivas Kandagatla }; 2171*8da9db0cSSrinivas Kandagatla 2172*8da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new hphl_rdac_switch[] = { 2173*8da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2174*8da9db0cSSrinivas Kandagatla }; 2175*8da9db0cSSrinivas Kandagatla 2176*8da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new hphr_rdac_switch[] = { 2177*8da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2178*8da9db0cSSrinivas Kandagatla }; 2179*8da9db0cSSrinivas Kandagatla 2180*8da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new rx_rdac3_mux = 2181*8da9db0cSSrinivas Kandagatla SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum); 2182*8da9db0cSSrinivas Kandagatla 2183e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9380_snd_controls[] = { 2184e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380, 2185e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 2186e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9380, 2187e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2188e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9380, 2189e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2190e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9380, 2191e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2192e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9380, 2193e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2194e8ba1e05SSrinivas Kandagatla }; 2195e8ba1e05SSrinivas Kandagatla 2196e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9385_snd_controls[] = { 2197e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, 2198e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 2199e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9385, 2200e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2201e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9385, 2202e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2203e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9385, 2204e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2205e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9385, 2206e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2207e8ba1e05SSrinivas Kandagatla }; 2208e8ba1e05SSrinivas Kandagatla 2209e8ba1e05SSrinivas Kandagatla static int wcd938x_get_swr_port(struct snd_kcontrol *kcontrol, 2210e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2211e8ba1e05SSrinivas Kandagatla { 2212e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 2213e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 2214e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2215e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 2216e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 2217e8ba1e05SSrinivas Kandagatla int portidx = mixer->reg; 2218e8ba1e05SSrinivas Kandagatla 2219e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 2220e8ba1e05SSrinivas Kandagatla 2221e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; 2222e8ba1e05SSrinivas Kandagatla 2223e8ba1e05SSrinivas Kandagatla return 0; 2224e8ba1e05SSrinivas Kandagatla } 2225e8ba1e05SSrinivas Kandagatla 2226e8ba1e05SSrinivas Kandagatla static int wcd938x_set_swr_port(struct snd_kcontrol *kcontrol, 2227e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2228e8ba1e05SSrinivas Kandagatla { 2229e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 2230e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 2231e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2232e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = 2233e8ba1e05SSrinivas Kandagatla (struct soc_mixer_control *)kcontrol->private_value; 2234e8ba1e05SSrinivas Kandagatla int portidx = mixer->reg; 2235e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 2236e8ba1e05SSrinivas Kandagatla bool enable; 2237e8ba1e05SSrinivas Kandagatla 2238e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 2239e8ba1e05SSrinivas Kandagatla 2240e8ba1e05SSrinivas Kandagatla if (ucontrol->value.integer.value[0]) 2241e8ba1e05SSrinivas Kandagatla enable = true; 2242e8ba1e05SSrinivas Kandagatla else 2243e8ba1e05SSrinivas Kandagatla enable = false; 2244e8ba1e05SSrinivas Kandagatla 2245e8ba1e05SSrinivas Kandagatla wcd->port_enable[portidx] = enable; 2246e8ba1e05SSrinivas Kandagatla 2247e8ba1e05SSrinivas Kandagatla wcd938x_connect_port(wcd, portidx, enable); 2248e8ba1e05SSrinivas Kandagatla 2249e8ba1e05SSrinivas Kandagatla return 0; 2250e8ba1e05SSrinivas Kandagatla 2251e8ba1e05SSrinivas Kandagatla } 2252e8ba1e05SSrinivas Kandagatla 2253e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd938x_snd_controls[] = { 2254e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL_COMP Switch", WCD938X_COMP_L, 0, 1, 0, 2255e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 2256e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR_COMP Switch", WCD938X_COMP_R, 1, 1, 0, 2257e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 2258e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL Switch", WCD938X_HPH_L, 0, 1, 0, 2259e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2260e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR Switch", WCD938X_HPH_R, 0, 1, 0, 2261e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2262e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("CLSH Switch", WCD938X_CLSH, 0, 1, 0, 2263e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2264e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LO Switch", WCD938X_LO, 0, 1, 0, 2265e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2266e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_L Switch", WCD938X_DSD_L, 0, 1, 0, 2267e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2268e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_R Switch", WCD938X_DSD_R, 0, 1, 0, 2269e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2270e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 0x18, 0, line_gain), 2271e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 0x18, 0, line_gain), 2272e8ba1e05SSrinivas Kandagatla WCD938X_EAR_PA_GAIN_TLV("EAR_PA Volume", WCD938X_ANA_EAR_COMPANDER_CTL, 2273e8ba1e05SSrinivas Kandagatla 2, 0x10, 0, ear_pa_gain), 2274e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC1 Switch", WCD938X_ADC1, 1, 1, 0, 2275e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2276e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2 Switch", WCD938X_ADC2, 1, 1, 0, 2277e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2278e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC3 Switch", WCD938X_ADC3, 1, 1, 0, 2279e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2280e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC4 Switch", WCD938X_ADC4, 1, 1, 0, 2281e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2282e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC0 Switch", WCD938X_DMIC0, 1, 1, 0, 2283e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2284e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC1 Switch", WCD938X_DMIC1, 1, 1, 0, 2285e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2286e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("MBHC Switch", WCD938X_MBHC, 1, 1, 0, 2287e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2288e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC2 Switch", WCD938X_DMIC2, 1, 1, 0, 2289e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2290e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC3 Switch", WCD938X_DMIC3, 1, 1, 0, 2291e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2292e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC4 Switch", WCD938X_DMIC4, 1, 1, 0, 2293e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2294e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC5 Switch", WCD938X_DMIC5, 1, 1, 0, 2295e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2296e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC6 Switch", WCD938X_DMIC6, 1, 1, 0, 2297e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2298e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC7 Switch", WCD938X_DMIC7, 1, 1, 0, 2299e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 2300e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LDOH Enable Switch", SND_SOC_NOPM, 0, 1, 0, 2301e8ba1e05SSrinivas Kandagatla wcd938x_ldoh_get, wcd938x_ldoh_put), 2302e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2_BCS Disable Switch", SND_SOC_NOPM, 0, 1, 0, 2303e8ba1e05SSrinivas Kandagatla wcd938x_bcs_get, wcd938x_bcs_put), 2304e8ba1e05SSrinivas Kandagatla 2305e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC1 Volume", WCD938X_ANA_TX_CH1, 0, 20, 0, analog_gain), 2306e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC2 Volume", WCD938X_ANA_TX_CH2, 0, 20, 0, analog_gain), 2307e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC3 Volume", WCD938X_ANA_TX_CH3, 0, 20, 0, analog_gain), 2308e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC4 Volume", WCD938X_ANA_TX_CH4, 0, 20, 0, analog_gain), 2309e8ba1e05SSrinivas Kandagatla }; 2310e8ba1e05SSrinivas Kandagatla 2311*8da9db0cSSrinivas Kandagatla static const struct snd_soc_dapm_widget wcd938x_dapm_widgets[] = { 2312*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN1_HPHL"), 2313*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN2_HPHR"), 2314*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN3_AUX"), 2315*8da9db0cSSrinivas Kandagatla 2316*8da9db0cSSrinivas Kandagatla /*rx widgets*/ 2317*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("EAR PGA", WCD938X_ANA_EAR, 7, 0, NULL, 0, 2318*8da9db0cSSrinivas Kandagatla wcd938x_codec_enable_ear_pa, 2319*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2320*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2321*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("AUX PGA", WCD938X_AUX_AUXPA, 7, 0, NULL, 0, 2322*8da9db0cSSrinivas Kandagatla wcd938x_codec_enable_aux_pa, 2323*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2324*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2325*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("HPHL PGA", WCD938X_ANA_HPH, 7, 0, NULL, 0, 2326*8da9db0cSSrinivas Kandagatla wcd938x_codec_enable_hphl_pa, 2327*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2328*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2329*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("HPHR PGA", WCD938X_ANA_HPH, 6, 0, NULL, 0, 2330*8da9db0cSSrinivas Kandagatla wcd938x_codec_enable_hphr_pa, 2331*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2332*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2333*8da9db0cSSrinivas Kandagatla 2334*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, 2335*8da9db0cSSrinivas Kandagatla wcd938x_codec_hphl_dac_event, 2336*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2337*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2338*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC2", NULL, SND_SOC_NOPM, 0, 0, 2339*8da9db0cSSrinivas Kandagatla wcd938x_codec_hphr_dac_event, 2340*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2341*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2342*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC3", NULL, SND_SOC_NOPM, 0, 0, 2343*8da9db0cSSrinivas Kandagatla wcd938x_codec_ear_dac_event, 2344*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2345*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2346*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC4", NULL, SND_SOC_NOPM, 0, 0, 2347*8da9db0cSSrinivas Kandagatla wcd938x_codec_aux_dac_event, 2348*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2349*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 2350*8da9db0cSSrinivas Kandagatla 2351*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MUX("RDAC3_MUX", SND_SOC_NOPM, 0, 0, &rx_rdac3_mux), 2352*8da9db0cSSrinivas Kandagatla 2353*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, NULL, 0), 2354*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("RXCLK", SND_SOC_NOPM, 0, 0, 2355*8da9db0cSSrinivas Kandagatla wcd938x_codec_enable_rxclk, 2356*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 2357*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 2358*8da9db0cSSrinivas Kandagatla 2359*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY_S("CLS_H_PORT", 1, SND_SOC_NOPM, 0, 0, NULL, 0), 2360*8da9db0cSSrinivas Kandagatla 2361*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX1", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 2362*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX2", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 2363*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX3", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 2364*8da9db0cSSrinivas Kandagatla 2365*8da9db0cSSrinivas Kandagatla /* rx mixer widgets*/ 2366*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("EAR_RDAC", SND_SOC_NOPM, 0, 0, 2367*8da9db0cSSrinivas Kandagatla ear_rdac_switch, ARRAY_SIZE(ear_rdac_switch)), 2368*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("AUX_RDAC", SND_SOC_NOPM, 0, 0, 2369*8da9db0cSSrinivas Kandagatla aux_rdac_switch, ARRAY_SIZE(aux_rdac_switch)), 2370*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("HPHL_RDAC", SND_SOC_NOPM, 0, 0, 2371*8da9db0cSSrinivas Kandagatla hphl_rdac_switch, ARRAY_SIZE(hphl_rdac_switch)), 2372*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0, 2373*8da9db0cSSrinivas Kandagatla hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)), 2374*8da9db0cSSrinivas Kandagatla 2375*8da9db0cSSrinivas Kandagatla /*output widgets rx*/ 2376*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("EAR"), 2377*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("AUX"), 2378*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("HPHL"), 2379*8da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("HPHR"), 2380*8da9db0cSSrinivas Kandagatla }; 2381*8da9db0cSSrinivas Kandagatla 23828d78602aSSrinivas Kandagatla static int wcd938x_get_micb_vout_ctl_val(u32 micb_mv) 23838d78602aSSrinivas Kandagatla { 23848d78602aSSrinivas Kandagatla /* min micbias voltage is 1V and maximum is 2.85V */ 23858d78602aSSrinivas Kandagatla if (micb_mv < 1000 || micb_mv > 2850) 23868d78602aSSrinivas Kandagatla return -EINVAL; 23878d78602aSSrinivas Kandagatla 23888d78602aSSrinivas Kandagatla return (micb_mv - 1000) / 50; 23898d78602aSSrinivas Kandagatla } 23908d78602aSSrinivas Kandagatla 23918d78602aSSrinivas Kandagatla static int wcd938x_set_micbias_data(struct wcd938x_priv *wcd938x) 23928d78602aSSrinivas Kandagatla { 23938d78602aSSrinivas Kandagatla int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 23948d78602aSSrinivas Kandagatla 23958d78602aSSrinivas Kandagatla /* set micbias voltage */ 23968d78602aSSrinivas Kandagatla vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb1_mv); 23978d78602aSSrinivas Kandagatla vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb2_mv); 23988d78602aSSrinivas Kandagatla vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb3_mv); 23998d78602aSSrinivas Kandagatla vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb4_mv); 24008d78602aSSrinivas Kandagatla if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || vout_ctl_4 < 0) 24018d78602aSSrinivas Kandagatla return -EINVAL; 24028d78602aSSrinivas Kandagatla 24038d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, 24048d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_1); 24058d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, 24068d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_2); 24078d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, 24088d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_3); 24098d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, 24108d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_4); 24118d78602aSSrinivas Kandagatla 24128d78602aSSrinivas Kandagatla return 0; 24138d78602aSSrinivas Kandagatla } 24148d78602aSSrinivas Kandagatla 24158d78602aSSrinivas Kandagatla static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) 24168d78602aSSrinivas Kandagatla { 24178d78602aSSrinivas Kandagatla return IRQ_HANDLED; 24188d78602aSSrinivas Kandagatla } 24198d78602aSSrinivas Kandagatla 24208d78602aSSrinivas Kandagatla static struct irq_chip wcd_irq_chip = { 24218d78602aSSrinivas Kandagatla .name = "WCD938x", 24228d78602aSSrinivas Kandagatla }; 24238d78602aSSrinivas Kandagatla 24248d78602aSSrinivas Kandagatla static int wcd_irq_chip_map(struct irq_domain *irqd, unsigned int virq, 24258d78602aSSrinivas Kandagatla irq_hw_number_t hw) 24268d78602aSSrinivas Kandagatla { 24278d78602aSSrinivas Kandagatla irq_set_chip_and_handler(virq, &wcd_irq_chip, handle_simple_irq); 24288d78602aSSrinivas Kandagatla irq_set_nested_thread(virq, 1); 24298d78602aSSrinivas Kandagatla irq_set_noprobe(virq); 24308d78602aSSrinivas Kandagatla 24318d78602aSSrinivas Kandagatla return 0; 24328d78602aSSrinivas Kandagatla } 24338d78602aSSrinivas Kandagatla 24348d78602aSSrinivas Kandagatla static const struct irq_domain_ops wcd_domain_ops = { 24358d78602aSSrinivas Kandagatla .map = wcd_irq_chip_map, 24368d78602aSSrinivas Kandagatla }; 24378d78602aSSrinivas Kandagatla 24388d78602aSSrinivas Kandagatla static int wcd938x_irq_init(struct wcd938x_priv *wcd, struct device *dev) 24398d78602aSSrinivas Kandagatla { 24408d78602aSSrinivas Kandagatla 24418d78602aSSrinivas Kandagatla wcd->virq = irq_domain_add_linear(NULL, 1, &wcd_domain_ops, NULL); 24428d78602aSSrinivas Kandagatla if (!(wcd->virq)) { 24438d78602aSSrinivas Kandagatla dev_err(dev, "%s: Failed to add IRQ domain\n", __func__); 24448d78602aSSrinivas Kandagatla return -EINVAL; 24458d78602aSSrinivas Kandagatla } 24468d78602aSSrinivas Kandagatla 24478d78602aSSrinivas Kandagatla return devm_regmap_add_irq_chip(dev, wcd->regmap, 24488d78602aSSrinivas Kandagatla irq_create_mapping(wcd->virq, 0), 24498d78602aSSrinivas Kandagatla IRQF_ONESHOT, 0, &wcd938x_regmap_irq_chip, 24508d78602aSSrinivas Kandagatla &wcd->irq_chip); 24518d78602aSSrinivas Kandagatla } 24528d78602aSSrinivas Kandagatla 24538d78602aSSrinivas Kandagatla static int wcd938x_soc_codec_probe(struct snd_soc_component *component) 24548d78602aSSrinivas Kandagatla { 24558d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 24568d78602aSSrinivas Kandagatla struct device *dev = component->dev; 24578d78602aSSrinivas Kandagatla int ret, i; 24588d78602aSSrinivas Kandagatla 24598d78602aSSrinivas Kandagatla snd_soc_component_init_regmap(component, wcd938x->regmap); 24608d78602aSSrinivas Kandagatla 24618d78602aSSrinivas Kandagatla wcd938x->variant = snd_soc_component_read_field(component, 24628d78602aSSrinivas Kandagatla WCD938X_DIGITAL_EFUSE_REG_0, 24638d78602aSSrinivas Kandagatla WCD938X_ID_MASK); 24648d78602aSSrinivas Kandagatla 24658d78602aSSrinivas Kandagatla wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X); 24668d78602aSSrinivas Kandagatla 24678d78602aSSrinivas Kandagatla wcd938x_io_init(wcd938x); 24688d78602aSSrinivas Kandagatla /* Set all interrupts as edge triggered */ 24698d78602aSSrinivas Kandagatla for (i = 0; i < wcd938x_regmap_irq_chip.num_regs; i++) { 24708d78602aSSrinivas Kandagatla regmap_write(wcd938x->regmap, 24718d78602aSSrinivas Kandagatla (WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0); 24728d78602aSSrinivas Kandagatla } 24738d78602aSSrinivas Kandagatla 24748d78602aSSrinivas Kandagatla ret = wcd938x_irq_init(wcd938x, component->dev); 24758d78602aSSrinivas Kandagatla if (ret) { 24768d78602aSSrinivas Kandagatla dev_err(component->dev, "%s: IRQ init failed: %d\n", 24778d78602aSSrinivas Kandagatla __func__, ret); 24788d78602aSSrinivas Kandagatla return ret; 24798d78602aSSrinivas Kandagatla } 24808d78602aSSrinivas Kandagatla 24818d78602aSSrinivas Kandagatla wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 24828d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT); 24838d78602aSSrinivas Kandagatla wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 24848d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT); 24858d78602aSSrinivas Kandagatla wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 24868d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT); 24878d78602aSSrinivas Kandagatla 24888d78602aSSrinivas Kandagatla /* Request for watchdog interrupt */ 24898d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 24908d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 24918d78602aSSrinivas Kandagatla "HPHR PDM WD INT", wcd938x); 24928d78602aSSrinivas Kandagatla if (ret) 24938d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHR WD interrupt (%d)\n", ret); 24948d78602aSSrinivas Kandagatla 24958d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 24968d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 24978d78602aSSrinivas Kandagatla "HPHL PDM WD INT", wcd938x); 24988d78602aSSrinivas Kandagatla if (ret) 24998d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHL WD interrupt (%d)\n", ret); 25008d78602aSSrinivas Kandagatla 25018d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 25028d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 25038d78602aSSrinivas Kandagatla "AUX PDM WD INT", wcd938x); 25048d78602aSSrinivas Kandagatla if (ret) 25058d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request Aux WD interrupt (%d)\n", ret); 25068d78602aSSrinivas Kandagatla 25078d78602aSSrinivas Kandagatla /* Disable watchdog interrupt for HPH and AUX */ 25088d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 25098d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 25108d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 25118d78602aSSrinivas Kandagatla 2512e8ba1e05SSrinivas Kandagatla switch (wcd938x->variant) { 2513e8ba1e05SSrinivas Kandagatla case WCD9380: 2514e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9380_snd_controls, 2515e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9380_snd_controls)); 2516e8ba1e05SSrinivas Kandagatla if (ret < 0) { 2517e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 2518e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 2519e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 2520e8ba1e05SSrinivas Kandagatla goto err; 2521e8ba1e05SSrinivas Kandagatla } 2522e8ba1e05SSrinivas Kandagatla break; 2523e8ba1e05SSrinivas Kandagatla case WCD9385: 2524e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9385_snd_controls, 2525e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9385_snd_controls)); 2526e8ba1e05SSrinivas Kandagatla if (ret < 0) { 2527e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 2528e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 2529e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 2530e8ba1e05SSrinivas Kandagatla goto err; 2531e8ba1e05SSrinivas Kandagatla } 2532e8ba1e05SSrinivas Kandagatla break; 2533e8ba1e05SSrinivas Kandagatla default: 2534e8ba1e05SSrinivas Kandagatla break; 2535e8ba1e05SSrinivas Kandagatla } 2536e8ba1e05SSrinivas Kandagatla err: 25378d78602aSSrinivas Kandagatla return ret; 25388d78602aSSrinivas Kandagatla } 25398d78602aSSrinivas Kandagatla 25408d78602aSSrinivas Kandagatla static const struct snd_soc_component_driver soc_codec_dev_wcd938x = { 25418d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 25428d78602aSSrinivas Kandagatla .probe = wcd938x_soc_codec_probe, 2543e8ba1e05SSrinivas Kandagatla .controls = wcd938x_snd_controls, 2544e8ba1e05SSrinivas Kandagatla .num_controls = ARRAY_SIZE(wcd938x_snd_controls), 2545*8da9db0cSSrinivas Kandagatla .dapm_widgets = wcd938x_dapm_widgets, 2546*8da9db0cSSrinivas Kandagatla .num_dapm_widgets = ARRAY_SIZE(wcd938x_dapm_widgets), 25478d78602aSSrinivas Kandagatla }; 25488d78602aSSrinivas Kandagatla 25498d78602aSSrinivas Kandagatla static void wcd938x_dt_parse_micbias_info(struct device *dev, struct wcd938x_priv *wcd) 25508d78602aSSrinivas Kandagatla { 25518d78602aSSrinivas Kandagatla struct device_node *np = dev->of_node; 25528d78602aSSrinivas Kandagatla u32 prop_val = 0; 25538d78602aSSrinivas Kandagatla int rc = 0; 25548d78602aSSrinivas Kandagatla 25558d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 25568d78602aSSrinivas Kandagatla if (!rc) 25578d78602aSSrinivas Kandagatla wcd->micb1_mv = prop_val/1000; 25588d78602aSSrinivas Kandagatla else 25598d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias1 DT property not found\n", __func__); 25608d78602aSSrinivas Kandagatla 25618d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 25628d78602aSSrinivas Kandagatla if (!rc) 25638d78602aSSrinivas Kandagatla wcd->micb2_mv = prop_val/1000; 25648d78602aSSrinivas Kandagatla else 25658d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias2 DT property not found\n", __func__); 25668d78602aSSrinivas Kandagatla 25678d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 25688d78602aSSrinivas Kandagatla if (!rc) 25698d78602aSSrinivas Kandagatla wcd->micb3_mv = prop_val/1000; 25708d78602aSSrinivas Kandagatla else 25718d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); 25728d78602aSSrinivas Kandagatla 25738d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); 25748d78602aSSrinivas Kandagatla if (!rc) 25758d78602aSSrinivas Kandagatla wcd->micb4_mv = prop_val/1000; 25768d78602aSSrinivas Kandagatla else 25778d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias4 DT property not found\n", __func__); 25788d78602aSSrinivas Kandagatla } 25798d78602aSSrinivas Kandagatla 25808d78602aSSrinivas Kandagatla static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device *dev) 25818d78602aSSrinivas Kandagatla { 25828d78602aSSrinivas Kandagatla int ret; 25838d78602aSSrinivas Kandagatla 25848d78602aSSrinivas Kandagatla wcd938x->reset_gpio = of_get_named_gpio(dev->of_node, "reset-gpios", 0); 25858d78602aSSrinivas Kandagatla if (wcd938x->reset_gpio < 0) { 25868d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get reset gpio: err = %d\n", 25878d78602aSSrinivas Kandagatla wcd938x->reset_gpio); 25888d78602aSSrinivas Kandagatla return wcd938x->reset_gpio; 25898d78602aSSrinivas Kandagatla } 25908d78602aSSrinivas Kandagatla 25918d78602aSSrinivas Kandagatla wcd938x->supplies[0].supply = "vdd-rxtx"; 25928d78602aSSrinivas Kandagatla wcd938x->supplies[1].supply = "vdd-io"; 25938d78602aSSrinivas Kandagatla wcd938x->supplies[2].supply = "vdd-buck"; 25948d78602aSSrinivas Kandagatla wcd938x->supplies[3].supply = "vdd-mic-bias"; 25958d78602aSSrinivas Kandagatla 25968d78602aSSrinivas Kandagatla ret = regulator_bulk_get(dev, WCD938X_MAX_SUPPLY, wcd938x->supplies); 25978d78602aSSrinivas Kandagatla if (ret) { 25988d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get supplies: err = %d\n", ret); 25998d78602aSSrinivas Kandagatla return ret; 26008d78602aSSrinivas Kandagatla } 26018d78602aSSrinivas Kandagatla 26028d78602aSSrinivas Kandagatla ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); 26038d78602aSSrinivas Kandagatla if (ret) { 26048d78602aSSrinivas Kandagatla dev_err(dev, "Failed to enable supplies: err = %d\n", ret); 26058d78602aSSrinivas Kandagatla return ret; 26068d78602aSSrinivas Kandagatla } 26078d78602aSSrinivas Kandagatla 26088d78602aSSrinivas Kandagatla wcd938x_dt_parse_micbias_info(dev, wcd938x); 26098d78602aSSrinivas Kandagatla 26108d78602aSSrinivas Kandagatla return 0; 26118d78602aSSrinivas Kandagatla } 26128d78602aSSrinivas Kandagatla 26138d78602aSSrinivas Kandagatla static int wcd938x_reset(struct wcd938x_priv *wcd938x) 26148d78602aSSrinivas Kandagatla { 26158d78602aSSrinivas Kandagatla gpio_direction_output(wcd938x->reset_gpio, 0); 26168d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to LOW */ 26178d78602aSSrinivas Kandagatla usleep_range(20, 30); 26188d78602aSSrinivas Kandagatla gpio_set_value(wcd938x->reset_gpio, 1); 26198d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to HIGH */ 26208d78602aSSrinivas Kandagatla usleep_range(20, 30); 26218d78602aSSrinivas Kandagatla 26228d78602aSSrinivas Kandagatla return 0; 26238d78602aSSrinivas Kandagatla } 26248d78602aSSrinivas Kandagatla 26258d78602aSSrinivas Kandagatla int wcd938x_handle_sdw_irq(struct wcd938x_sdw_priv *wcd) 26268d78602aSSrinivas Kandagatla { 26278d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = wcd->wcd938x; 26288d78602aSSrinivas Kandagatla struct irq_domain *slave_irq = wcd938x->virq; 26298d78602aSSrinivas Kandagatla u32 sts1, sts2, sts3; 26308d78602aSSrinivas Kandagatla 26318d78602aSSrinivas Kandagatla do { 26328d78602aSSrinivas Kandagatla handle_nested_irq(irq_find_mapping(slave_irq, 0)); 26338d78602aSSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1); 26348d78602aSSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2); 26358d78602aSSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3); 26368d78602aSSrinivas Kandagatla 26378d78602aSSrinivas Kandagatla } while (sts1 || sts2 || sts3); 26388d78602aSSrinivas Kandagatla 26398d78602aSSrinivas Kandagatla return IRQ_HANDLED; 26408d78602aSSrinivas Kandagatla } 26418d78602aSSrinivas Kandagatla EXPORT_SYMBOL_GPL(wcd938x_handle_sdw_irq); 26428d78602aSSrinivas Kandagatla 264316572522SSrinivas Kandagatla static int wcd938x_codec_hw_params(struct snd_pcm_substream *substream, 264416572522SSrinivas Kandagatla struct snd_pcm_hw_params *params, 264516572522SSrinivas Kandagatla struct snd_soc_dai *dai) 264616572522SSrinivas Kandagatla { 264716572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 264816572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 264916572522SSrinivas Kandagatla 265016572522SSrinivas Kandagatla return wcd938x_sdw_hw_params(wcd, substream, params, dai); 265116572522SSrinivas Kandagatla } 265216572522SSrinivas Kandagatla 265316572522SSrinivas Kandagatla static int wcd938x_codec_free(struct snd_pcm_substream *substream, 265416572522SSrinivas Kandagatla struct snd_soc_dai *dai) 265516572522SSrinivas Kandagatla { 265616572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 265716572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 265816572522SSrinivas Kandagatla 265916572522SSrinivas Kandagatla return wcd938x_sdw_free(wcd, substream, dai); 266016572522SSrinivas Kandagatla } 266116572522SSrinivas Kandagatla 266216572522SSrinivas Kandagatla static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai, 266316572522SSrinivas Kandagatla void *stream, int direction) 266416572522SSrinivas Kandagatla { 266516572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 266616572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 266716572522SSrinivas Kandagatla 266816572522SSrinivas Kandagatla return wcd938x_sdw_set_sdw_stream(wcd, dai, stream, direction); 266916572522SSrinivas Kandagatla 267016572522SSrinivas Kandagatla } 267116572522SSrinivas Kandagatla 26728d78602aSSrinivas Kandagatla static struct snd_soc_dai_ops wcd938x_sdw_dai_ops = { 267316572522SSrinivas Kandagatla .hw_params = wcd938x_codec_hw_params, 267416572522SSrinivas Kandagatla .hw_free = wcd938x_codec_free, 267516572522SSrinivas Kandagatla .set_sdw_stream = wcd938x_codec_set_sdw_stream, 26768d78602aSSrinivas Kandagatla }; 26778d78602aSSrinivas Kandagatla 26788d78602aSSrinivas Kandagatla static struct snd_soc_dai_driver wcd938x_dais[] = { 26798d78602aSSrinivas Kandagatla [0] = { 26808d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-rx", 26818d78602aSSrinivas Kandagatla .playback = { 26828d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Playback", 26838d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK | WCD938X_FRAC_RATES_MASK, 26848d78602aSSrinivas Kandagatla .formats = WCD938X_FORMATS_S16_S24_LE, 26858d78602aSSrinivas Kandagatla .rate_max = 192000, 26868d78602aSSrinivas Kandagatla .rate_min = 8000, 26878d78602aSSrinivas Kandagatla .channels_min = 1, 26888d78602aSSrinivas Kandagatla .channels_max = 2, 26898d78602aSSrinivas Kandagatla }, 26908d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 26918d78602aSSrinivas Kandagatla }, 26928d78602aSSrinivas Kandagatla [1] = { 26938d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-tx", 26948d78602aSSrinivas Kandagatla .capture = { 26958d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Capture", 26968d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK, 26978d78602aSSrinivas Kandagatla .formats = SNDRV_PCM_FMTBIT_S16_LE, 26988d78602aSSrinivas Kandagatla .rate_min = 8000, 26998d78602aSSrinivas Kandagatla .rate_max = 192000, 27008d78602aSSrinivas Kandagatla .channels_min = 1, 27018d78602aSSrinivas Kandagatla .channels_max = 4, 27028d78602aSSrinivas Kandagatla }, 27038d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 27048d78602aSSrinivas Kandagatla }, 27058d78602aSSrinivas Kandagatla }; 27068d78602aSSrinivas Kandagatla 27078d78602aSSrinivas Kandagatla static int wcd938x_bind(struct device *dev) 27088d78602aSSrinivas Kandagatla { 27098d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 27108d78602aSSrinivas Kandagatla int ret; 27118d78602aSSrinivas Kandagatla 27128d78602aSSrinivas Kandagatla ret = component_bind_all(dev, wcd938x); 27138d78602aSSrinivas Kandagatla if (ret) { 27148d78602aSSrinivas Kandagatla dev_err(dev, "%s: Slave bind failed, ret = %d\n", 27158d78602aSSrinivas Kandagatla __func__, ret); 27168d78602aSSrinivas Kandagatla return ret; 27178d78602aSSrinivas Kandagatla } 27188d78602aSSrinivas Kandagatla 271916572522SSrinivas Kandagatla wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); 272016572522SSrinivas Kandagatla if (!wcd938x->rxdev) { 272116572522SSrinivas Kandagatla dev_err(dev, "could not find slave with matching of node\n"); 272216572522SSrinivas Kandagatla return -EINVAL; 272316572522SSrinivas Kandagatla } 272416572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); 272516572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; 272616572522SSrinivas Kandagatla 272716572522SSrinivas Kandagatla wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); 272816572522SSrinivas Kandagatla if (!wcd938x->txdev) { 272916572522SSrinivas Kandagatla dev_err(dev, "could not find txslave with matching of node\n"); 273016572522SSrinivas Kandagatla return -EINVAL; 273116572522SSrinivas Kandagatla } 273216572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); 273316572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; 273416572522SSrinivas Kandagatla wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); 273516572522SSrinivas Kandagatla if (!wcd938x->tx_sdw_dev) { 273616572522SSrinivas Kandagatla dev_err(dev, "could not get txslave with matching of dev\n"); 273716572522SSrinivas Kandagatla return -EINVAL; 273816572522SSrinivas Kandagatla } 273916572522SSrinivas Kandagatla 274016572522SSrinivas Kandagatla /* As TX is main CSR reg interface, which should not be suspended first. 274116572522SSrinivas Kandagatla * expicilty add the dependency link */ 274216572522SSrinivas Kandagatla if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | 274316572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 274416572522SSrinivas Kandagatla dev_err(dev, "could not devlink tx and rx\n"); 274516572522SSrinivas Kandagatla return -EINVAL; 274616572522SSrinivas Kandagatla } 274716572522SSrinivas Kandagatla 274816572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | 274916572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 275016572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and tx\n"); 275116572522SSrinivas Kandagatla return -EINVAL; 275216572522SSrinivas Kandagatla } 275316572522SSrinivas Kandagatla 275416572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | 275516572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 275616572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and rx\n"); 275716572522SSrinivas Kandagatla return -EINVAL; 275816572522SSrinivas Kandagatla } 275916572522SSrinivas Kandagatla 276016572522SSrinivas Kandagatla wcd938x->regmap = dev_get_regmap(wcd938x->txdev, NULL); 276116572522SSrinivas Kandagatla if (!wcd938x->regmap) { 276216572522SSrinivas Kandagatla dev_err(dev, "%s: tx csr regmap not found\n", __func__); 276316572522SSrinivas Kandagatla return PTR_ERR(wcd938x->regmap); 276416572522SSrinivas Kandagatla } 276516572522SSrinivas Kandagatla 27668d78602aSSrinivas Kandagatla ret = wcd938x_set_micbias_data(wcd938x); 27678d78602aSSrinivas Kandagatla if (ret < 0) { 27688d78602aSSrinivas Kandagatla dev_err(dev, "%s: bad micbias pdata\n", __func__); 27698d78602aSSrinivas Kandagatla return ret; 27708d78602aSSrinivas Kandagatla } 27718d78602aSSrinivas Kandagatla 27728d78602aSSrinivas Kandagatla ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, 27738d78602aSSrinivas Kandagatla wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); 27748d78602aSSrinivas Kandagatla if (ret) 27758d78602aSSrinivas Kandagatla dev_err(dev, "%s: Codec registration failed\n", 27768d78602aSSrinivas Kandagatla __func__); 27778d78602aSSrinivas Kandagatla 27788d78602aSSrinivas Kandagatla return ret; 27798d78602aSSrinivas Kandagatla 27808d78602aSSrinivas Kandagatla } 27818d78602aSSrinivas Kandagatla 27828d78602aSSrinivas Kandagatla static void wcd938x_unbind(struct device *dev) 27838d78602aSSrinivas Kandagatla { 27848d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 27858d78602aSSrinivas Kandagatla 278616572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->txdev); 278716572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->rxdev); 278816572522SSrinivas Kandagatla device_link_remove(wcd938x->rxdev, wcd938x->txdev); 27898d78602aSSrinivas Kandagatla snd_soc_unregister_component(dev); 27908d78602aSSrinivas Kandagatla component_unbind_all(dev, wcd938x); 27918d78602aSSrinivas Kandagatla } 27928d78602aSSrinivas Kandagatla 27938d78602aSSrinivas Kandagatla static const struct component_master_ops wcd938x_comp_ops = { 27948d78602aSSrinivas Kandagatla .bind = wcd938x_bind, 27958d78602aSSrinivas Kandagatla .unbind = wcd938x_unbind, 27968d78602aSSrinivas Kandagatla }; 27978d78602aSSrinivas Kandagatla 27988d78602aSSrinivas Kandagatla static int wcd938x_compare_of(struct device *dev, void *data) 27998d78602aSSrinivas Kandagatla { 28008d78602aSSrinivas Kandagatla return dev->of_node == data; 28018d78602aSSrinivas Kandagatla } 28028d78602aSSrinivas Kandagatla 28038d78602aSSrinivas Kandagatla static void wcd938x_release_of(struct device *dev, void *data) 28048d78602aSSrinivas Kandagatla { 28058d78602aSSrinivas Kandagatla of_node_put(data); 28068d78602aSSrinivas Kandagatla } 28078d78602aSSrinivas Kandagatla 28088d78602aSSrinivas Kandagatla static int wcd938x_add_slave_components(struct wcd938x_priv *wcd938x, 28098d78602aSSrinivas Kandagatla struct device *dev, 28108d78602aSSrinivas Kandagatla struct component_match **matchptr) 28118d78602aSSrinivas Kandagatla { 28128d78602aSSrinivas Kandagatla struct device_node *np; 28138d78602aSSrinivas Kandagatla 28148d78602aSSrinivas Kandagatla np = dev->of_node; 28158d78602aSSrinivas Kandagatla 28168d78602aSSrinivas Kandagatla wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); 28178d78602aSSrinivas Kandagatla if (!wcd938x->rxnode) { 28188d78602aSSrinivas Kandagatla dev_err(dev, "%s: Rx-device node not defined\n", __func__); 28198d78602aSSrinivas Kandagatla return -ENODEV; 28208d78602aSSrinivas Kandagatla } 28218d78602aSSrinivas Kandagatla 28228d78602aSSrinivas Kandagatla of_node_get(wcd938x->rxnode); 28238d78602aSSrinivas Kandagatla component_match_add_release(dev, matchptr, wcd938x_release_of, 28248d78602aSSrinivas Kandagatla wcd938x_compare_of, wcd938x->rxnode); 28258d78602aSSrinivas Kandagatla 28268d78602aSSrinivas Kandagatla wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); 28278d78602aSSrinivas Kandagatla if (!wcd938x->txnode) { 28288d78602aSSrinivas Kandagatla dev_err(dev, "%s: Tx-device node not defined\n", __func__); 28298d78602aSSrinivas Kandagatla return -ENODEV; 28308d78602aSSrinivas Kandagatla } 28318d78602aSSrinivas Kandagatla of_node_get(wcd938x->txnode); 28328d78602aSSrinivas Kandagatla component_match_add_release(dev, matchptr, wcd938x_release_of, 28338d78602aSSrinivas Kandagatla wcd938x_compare_of, wcd938x->txnode); 28348d78602aSSrinivas Kandagatla return 0; 28358d78602aSSrinivas Kandagatla } 28368d78602aSSrinivas Kandagatla 28378d78602aSSrinivas Kandagatla static int wcd938x_probe(struct platform_device *pdev) 28388d78602aSSrinivas Kandagatla { 28398d78602aSSrinivas Kandagatla struct component_match *match = NULL; 28408d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = NULL; 28418d78602aSSrinivas Kandagatla struct device *dev = &pdev->dev; 28428d78602aSSrinivas Kandagatla int ret; 28438d78602aSSrinivas Kandagatla 28448d78602aSSrinivas Kandagatla wcd938x = devm_kzalloc(dev, sizeof(struct wcd938x_priv), 28458d78602aSSrinivas Kandagatla GFP_KERNEL); 28468d78602aSSrinivas Kandagatla if (!wcd938x) 28478d78602aSSrinivas Kandagatla return -ENOMEM; 28488d78602aSSrinivas Kandagatla 28498d78602aSSrinivas Kandagatla dev_set_drvdata(dev, wcd938x); 28508d78602aSSrinivas Kandagatla 28518d78602aSSrinivas Kandagatla ret = wcd938x_populate_dt_data(wcd938x, dev); 28528d78602aSSrinivas Kandagatla if (ret) { 28538d78602aSSrinivas Kandagatla dev_err(dev, "%s: Fail to obtain platform data\n", __func__); 28548d78602aSSrinivas Kandagatla return -EINVAL; 28558d78602aSSrinivas Kandagatla } 28568d78602aSSrinivas Kandagatla 28578d78602aSSrinivas Kandagatla ret = wcd938x_add_slave_components(wcd938x, dev, &match); 28588d78602aSSrinivas Kandagatla if (ret) 28598d78602aSSrinivas Kandagatla return ret; 28608d78602aSSrinivas Kandagatla 28618d78602aSSrinivas Kandagatla wcd938x_reset(wcd938x); 28628d78602aSSrinivas Kandagatla 28638d78602aSSrinivas Kandagatla ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match); 28648d78602aSSrinivas Kandagatla if (ret) 28658d78602aSSrinivas Kandagatla return ret; 28668d78602aSSrinivas Kandagatla 28678d78602aSSrinivas Kandagatla pm_runtime_set_autosuspend_delay(dev, 1000); 28688d78602aSSrinivas Kandagatla pm_runtime_use_autosuspend(dev); 28698d78602aSSrinivas Kandagatla pm_runtime_mark_last_busy(dev); 28708d78602aSSrinivas Kandagatla pm_runtime_set_active(dev); 28718d78602aSSrinivas Kandagatla pm_runtime_enable(dev); 28728d78602aSSrinivas Kandagatla pm_runtime_idle(dev); 28738d78602aSSrinivas Kandagatla 28748d78602aSSrinivas Kandagatla return ret; 28758d78602aSSrinivas Kandagatla } 28768d78602aSSrinivas Kandagatla 28778d78602aSSrinivas Kandagatla static int wcd938x_remove(struct platform_device *pdev) 28788d78602aSSrinivas Kandagatla { 28798d78602aSSrinivas Kandagatla component_master_del(&pdev->dev, &wcd938x_comp_ops); 28808d78602aSSrinivas Kandagatla 28818d78602aSSrinivas Kandagatla return 0; 28828d78602aSSrinivas Kandagatla } 28838d78602aSSrinivas Kandagatla 28848d78602aSSrinivas Kandagatla static const struct of_device_id wcd938x_dt_match[] = { 28858d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9380-codec" }, 28868d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9385-codec" }, 28878d78602aSSrinivas Kandagatla {} 28888d78602aSSrinivas Kandagatla }; 28898d78602aSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wcd938x_dt_match); 28908d78602aSSrinivas Kandagatla 28918d78602aSSrinivas Kandagatla static struct platform_driver wcd938x_codec_driver = { 28928d78602aSSrinivas Kandagatla .probe = wcd938x_probe, 28938d78602aSSrinivas Kandagatla .remove = wcd938x_remove, 28948d78602aSSrinivas Kandagatla .driver = { 28958d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 28968d78602aSSrinivas Kandagatla .of_match_table = of_match_ptr(wcd938x_dt_match), 28978d78602aSSrinivas Kandagatla .suppress_bind_attrs = true, 28988d78602aSSrinivas Kandagatla }, 28998d78602aSSrinivas Kandagatla }; 29008d78602aSSrinivas Kandagatla 29018d78602aSSrinivas Kandagatla module_platform_driver(wcd938x_codec_driver); 29028d78602aSSrinivas Kandagatla MODULE_DESCRIPTION("WCD938X Codec driver"); 29038d78602aSSrinivas Kandagatla MODULE_LICENSE("GPL"); 2904