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> 9db0b4aedSSrinivasa Rao Mandadapu #include <linux/gpio/consumer.h> 108d78602aSSrinivas Kandagatla #include <linux/kernel.h> 118d78602aSSrinivas Kandagatla #include <linux/pm_runtime.h> 128d78602aSSrinivas Kandagatla #include <linux/component.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" 25bcee7ed0SSrinivas Kandagatla #include "wcd-mbhc-v2.h" 268d78602aSSrinivas Kandagatla #include "wcd938x.h" 278d78602aSSrinivas Kandagatla 288d78602aSSrinivas Kandagatla #define WCD938X_MAX_MICBIAS (4) 298d78602aSSrinivas Kandagatla #define WCD938X_MAX_SUPPLY (4) 308d78602aSSrinivas Kandagatla #define WCD938X_MBHC_MAX_BUTTONS (8) 318d78602aSSrinivas Kandagatla #define TX_ADC_MAX (4) 328d78602aSSrinivas Kandagatla #define WCD938X_TX_MAX_SWR_PORTS (5) 338d78602aSSrinivas Kandagatla 348d78602aSSrinivas Kandagatla #define WCD938X_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 358d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 368d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 378d78602aSSrinivas Kandagatla /* Fractional Rates */ 388d78602aSSrinivas Kandagatla #define WCD938X_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\ 398d78602aSSrinivas Kandagatla SNDRV_PCM_RATE_176400) 408d78602aSSrinivas Kandagatla #define WCD938X_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \ 418d78602aSSrinivas Kandagatla SNDRV_PCM_FMTBIT_S24_LE) 428d78602aSSrinivas Kandagatla /* Convert from vout ctl to micbias voltage in mV */ 438d78602aSSrinivas Kandagatla #define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) 448d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_0P6MHZ (600000) 458d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_1P2MHZ (1200000) 468d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_2P4MHZ (2400000) 478d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_4P8MHZ (4800000) 488d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_9P6MHZ (9600000) 498d78602aSSrinivas Kandagatla #define SWR_CLK_RATE_11P2896MHZ (1128960) 508d78602aSSrinivas Kandagatla 518d78602aSSrinivas Kandagatla #define WCD938X_DRV_NAME "wcd938x_codec" 528d78602aSSrinivas Kandagatla #define WCD938X_VERSION_1_0 (1) 538d78602aSSrinivas Kandagatla #define EAR_RX_PATH_AUX (1) 548d78602aSSrinivas Kandagatla 558d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_HIFI 0x01 568d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_LO_HIF 0x02 578d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_NORMAL 0x03 588d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_LP 0x05 598d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_ULP1 0x09 608d78602aSSrinivas Kandagatla #define ADC_MODE_VAL_ULP2 0x0B 618d78602aSSrinivas Kandagatla 628d78602aSSrinivas Kandagatla /* Z value defined in milliohm */ 638d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_32 (32000) 648d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_400 (400000) 658d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_1200 (1200000) 668d78602aSSrinivas Kandagatla #define WCD938X_ZDET_VAL_100K (100000000) 678d78602aSSrinivas Kandagatla /* Z floating defined in ohms */ 688d78602aSSrinivas Kandagatla #define WCD938X_ZDET_FLOATING_IMPEDANCE (0x0FFFFFFE) 698d78602aSSrinivas Kandagatla #define WCD938X_ZDET_NUM_MEASUREMENTS (900) 708d78602aSSrinivas Kandagatla #define WCD938X_MBHC_GET_C1(c) ((c & 0xC000) >> 14) 718d78602aSSrinivas Kandagatla #define WCD938X_MBHC_GET_X1(x) (x & 0x3FFF) 728d78602aSSrinivas Kandagatla /* Z value compared in milliOhm */ 738d78602aSSrinivas Kandagatla #define WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000)) 748d78602aSSrinivas Kandagatla #define WCD938X_MBHC_ZDET_CONST (86 * 16384) 758d78602aSSrinivas Kandagatla #define WCD938X_MBHC_MOISTURE_RREF R_24_KOHM 768d78602aSSrinivas Kandagatla #define WCD_MBHC_HS_V_MAX 1600 778d78602aSSrinivas Kandagatla 78e8ba1e05SSrinivas Kandagatla #define WCD938X_EAR_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \ 79e8ba1e05SSrinivas Kandagatla { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 80e8ba1e05SSrinivas Kandagatla .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ 81e8ba1e05SSrinivas Kandagatla SNDRV_CTL_ELEM_ACCESS_READWRITE,\ 82e8ba1e05SSrinivas Kandagatla .tlv.p = (tlv_array), \ 83e8ba1e05SSrinivas Kandagatla .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\ 84e8ba1e05SSrinivas Kandagatla .put = wcd938x_ear_pa_put_gain, \ 85e8ba1e05SSrinivas Kandagatla .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) } 86e8ba1e05SSrinivas Kandagatla 878d78602aSSrinivas Kandagatla enum { 888d78602aSSrinivas Kandagatla WCD9380 = 0, 898d78602aSSrinivas Kandagatla WCD9385 = 5, 908d78602aSSrinivas Kandagatla }; 918d78602aSSrinivas Kandagatla 928d78602aSSrinivas Kandagatla enum { 938d78602aSSrinivas Kandagatla TX_HDR12 = 0, 948d78602aSSrinivas Kandagatla TX_HDR34, 958d78602aSSrinivas Kandagatla TX_HDR_MAX, 968d78602aSSrinivas Kandagatla }; 978d78602aSSrinivas Kandagatla 988d78602aSSrinivas Kandagatla enum { 998d78602aSSrinivas Kandagatla WCD_RX1, 1008d78602aSSrinivas Kandagatla WCD_RX2, 1018d78602aSSrinivas Kandagatla WCD_RX3 1028d78602aSSrinivas Kandagatla }; 1038d78602aSSrinivas Kandagatla 1048d78602aSSrinivas Kandagatla enum { 1058d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_0 */ 1068d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_PRESS_DET = 0, 1078d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 1088d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 1098d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 1108d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_SW_DET, 1118d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_OCP_INT, 1128d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_CNP_INT, 1138d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_OCP_INT, 1148d78602aSSrinivas Kandagatla 1158d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_1 */ 1168d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_CNP_INT, 1178d78602aSSrinivas Kandagatla WCD938X_IRQ_EAR_CNP_INT, 1188d78602aSSrinivas Kandagatla WCD938X_IRQ_EAR_SCD_INT, 1198d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_CNP_INT, 1208d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_SCD_INT, 1218d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT, 1228d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT, 1238d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT, 1248d78602aSSrinivas Kandagatla 1258d78602aSSrinivas Kandagatla /* INTR_CTRL_INT_MASK_2 */ 1268d78602aSSrinivas Kandagatla WCD938X_IRQ_LDORT_SCD_INT, 1278d78602aSSrinivas Kandagatla WCD938X_IRQ_MBHC_MOISTURE_INT, 1288d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_SURGE_DET_INT, 1298d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_SURGE_DET_INT, 1308d78602aSSrinivas Kandagatla WCD938X_NUM_IRQS, 1318d78602aSSrinivas Kandagatla }; 1328d78602aSSrinivas Kandagatla 1338d78602aSSrinivas Kandagatla enum { 1348d78602aSSrinivas Kandagatla WCD_ADC1 = 0, 1358d78602aSSrinivas Kandagatla WCD_ADC2, 1368d78602aSSrinivas Kandagatla WCD_ADC3, 1378d78602aSSrinivas Kandagatla WCD_ADC4, 1388d78602aSSrinivas Kandagatla ALLOW_BUCK_DISABLE, 1398d78602aSSrinivas Kandagatla HPH_COMP_DELAY, 1408d78602aSSrinivas Kandagatla HPH_PA_DELAY, 1418d78602aSSrinivas Kandagatla AMIC2_BCS_ENABLE, 1428d78602aSSrinivas Kandagatla WCD_SUPPLIES_LPM_MODE, 1438d78602aSSrinivas Kandagatla }; 1448d78602aSSrinivas Kandagatla 1458d78602aSSrinivas Kandagatla enum { 1468d78602aSSrinivas Kandagatla ADC_MODE_INVALID = 0, 1478d78602aSSrinivas Kandagatla ADC_MODE_HIFI, 1488d78602aSSrinivas Kandagatla ADC_MODE_LO_HIF, 1498d78602aSSrinivas Kandagatla ADC_MODE_NORMAL, 1508d78602aSSrinivas Kandagatla ADC_MODE_LP, 1518d78602aSSrinivas Kandagatla ADC_MODE_ULP1, 1528d78602aSSrinivas Kandagatla ADC_MODE_ULP2, 1538d78602aSSrinivas Kandagatla }; 1548d78602aSSrinivas Kandagatla 1558d78602aSSrinivas Kandagatla enum { 1568d78602aSSrinivas Kandagatla AIF1_PB = 0, 1578d78602aSSrinivas Kandagatla AIF1_CAP, 1588d78602aSSrinivas Kandagatla NUM_CODEC_DAIS, 1598d78602aSSrinivas Kandagatla }; 1608d78602aSSrinivas Kandagatla 161d5add08fSSrinivas Kandagatla static u8 tx_mode_bit[] = { 162d5add08fSSrinivas Kandagatla [ADC_MODE_INVALID] = 0x00, 163d5add08fSSrinivas Kandagatla [ADC_MODE_HIFI] = 0x01, 164d5add08fSSrinivas Kandagatla [ADC_MODE_LO_HIF] = 0x02, 165d5add08fSSrinivas Kandagatla [ADC_MODE_NORMAL] = 0x04, 166d5add08fSSrinivas Kandagatla [ADC_MODE_LP] = 0x08, 167d5add08fSSrinivas Kandagatla [ADC_MODE_ULP1] = 0x10, 168d5add08fSSrinivas Kandagatla [ADC_MODE_ULP2] = 0x20, 169d5add08fSSrinivas Kandagatla }; 170d5add08fSSrinivas Kandagatla 1718d78602aSSrinivas Kandagatla struct wcd938x_priv { 1728d78602aSSrinivas Kandagatla struct sdw_slave *tx_sdw_dev; 1738d78602aSSrinivas Kandagatla struct wcd938x_sdw_priv *sdw_priv[NUM_CODEC_DAIS]; 1748d78602aSSrinivas Kandagatla struct device *txdev; 1758d78602aSSrinivas Kandagatla struct device *rxdev; 1768d78602aSSrinivas Kandagatla struct device_node *rxnode, *txnode; 1778d78602aSSrinivas Kandagatla struct regmap *regmap; 178bcee7ed0SSrinivas Kandagatla struct mutex micb_lock; 179bcee7ed0SSrinivas Kandagatla /* mbhc module */ 180bcee7ed0SSrinivas Kandagatla struct wcd_mbhc *wcd_mbhc; 181bcee7ed0SSrinivas Kandagatla struct wcd_mbhc_config mbhc_cfg; 182bcee7ed0SSrinivas Kandagatla struct wcd_mbhc_intr intr_ids; 1838d78602aSSrinivas Kandagatla struct wcd_clsh_ctrl *clsh_info; 1848d78602aSSrinivas Kandagatla struct irq_domain *virq; 1858d78602aSSrinivas Kandagatla struct regmap_irq_chip *wcd_regmap_irq_chip; 1868d78602aSSrinivas Kandagatla struct regmap_irq_chip_data *irq_chip; 1878d78602aSSrinivas Kandagatla struct regulator_bulk_data supplies[WCD938X_MAX_SUPPLY]; 1888d78602aSSrinivas Kandagatla struct snd_soc_jack *jack; 1898d78602aSSrinivas Kandagatla unsigned long status_mask; 1908d78602aSSrinivas Kandagatla s32 micb_ref[WCD938X_MAX_MICBIAS]; 1918d78602aSSrinivas Kandagatla s32 pullup_ref[WCD938X_MAX_MICBIAS]; 1928d78602aSSrinivas Kandagatla u32 hph_mode; 1938d78602aSSrinivas Kandagatla u32 tx_mode[TX_ADC_MAX]; 1948d78602aSSrinivas Kandagatla int flyback_cur_det_disable; 1958d78602aSSrinivas Kandagatla int ear_rx_path; 1968d78602aSSrinivas Kandagatla int variant; 1978d78602aSSrinivas Kandagatla int reset_gpio; 198db0b4aedSSrinivasa Rao Mandadapu struct gpio_desc *us_euro_gpio; 1998d78602aSSrinivas Kandagatla u32 micb1_mv; 2008d78602aSSrinivas Kandagatla u32 micb2_mv; 2018d78602aSSrinivas Kandagatla u32 micb3_mv; 2028d78602aSSrinivas Kandagatla u32 micb4_mv; 2038d78602aSSrinivas Kandagatla int hphr_pdm_wd_int; 2048d78602aSSrinivas Kandagatla int hphl_pdm_wd_int; 2058d78602aSSrinivas Kandagatla int aux_pdm_wd_int; 2068d78602aSSrinivas Kandagatla bool comp1_enable; 2078d78602aSSrinivas Kandagatla bool comp2_enable; 2088d78602aSSrinivas Kandagatla bool ldoh; 2098d78602aSSrinivas Kandagatla bool bcs_dis; 2108d78602aSSrinivas Kandagatla }; 2118d78602aSSrinivas Kandagatla 212e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800); 213e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(line_gain, 600, -3000); 214e8ba1e05SSrinivas Kandagatla static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(analog_gain, 0, 3000); 215e8ba1e05SSrinivas Kandagatla 216bcee7ed0SSrinivas Kandagatla struct wcd938x_mbhc_zdet_param { 217bcee7ed0SSrinivas Kandagatla u16 ldo_ctl; 218bcee7ed0SSrinivas Kandagatla u16 noff; 219bcee7ed0SSrinivas Kandagatla u16 nshift; 220bcee7ed0SSrinivas Kandagatla u16 btn5; 221bcee7ed0SSrinivas Kandagatla u16 btn6; 222bcee7ed0SSrinivas Kandagatla u16 btn7; 223bcee7ed0SSrinivas Kandagatla }; 224bcee7ed0SSrinivas Kandagatla 225bcee7ed0SSrinivas Kandagatla static struct wcd_mbhc_field wcd_mbhc_fields[WCD_MBHC_REG_FUNC_MAX] = { 226bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_L_DET_EN, WCD938X_ANA_MBHC_MECH, 0x80), 227bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_GND_DET_EN, WCD938X_ANA_MBHC_MECH, 0x40), 228bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MECH_DETECTION_TYPE, WCD938X_ANA_MBHC_MECH, 0x20), 229bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MIC_CLAMP_CTL, WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0x30), 230bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ELECT_DETECTION_TYPE, WCD938X_ANA_MBHC_ELECT, 0x08), 231bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x1F), 232bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL, WCD938X_ANA_MBHC_MECH, 0x04), 233bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHL_PLUG_TYPE, WCD938X_ANA_MBHC_MECH, 0x10), 234bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_GND_PLUG_TYPE, WCD938X_ANA_MBHC_MECH, 0x08), 235bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_SW_HPH_LP_100K_TO_GND, WCD938X_ANA_MBHC_MECH, 0x01), 236bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ELECT_SCHMT_ISRC, WCD938X_ANA_MBHC_ELECT, 0x06), 237bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_FSM_EN, WCD938X_ANA_MBHC_ELECT, 0x80), 238bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_INSREM_DBNC, WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0x0F), 239bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_BTN_DBNC, WCD938X_MBHC_NEW_CTL_1, 0x03), 240bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HS_VREF, WCD938X_MBHC_NEW_CTL_2, 0x03), 241bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HS_COMP_RESULT, WCD938X_ANA_MBHC_RESULT_3, 0x08), 242bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_IN2P_CLAMP_STATE, WCD938X_ANA_MBHC_RESULT_3, 0x10), 243bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MIC_SCHMT_RESULT, WCD938X_ANA_MBHC_RESULT_3, 0x20), 244bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHL_SCHMT_RESULT, WCD938X_ANA_MBHC_RESULT_3, 0x80), 245bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHR_SCHMT_RESULT, WCD938X_ANA_MBHC_RESULT_3, 0x40), 246bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_OCP_FSM_EN, WCD938X_HPH_OCP_CTL, 0x10), 247bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_BTN_RESULT, WCD938X_ANA_MBHC_RESULT_3, 0x07), 248bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_BTN_ISRC_CTL, WCD938X_ANA_MBHC_ELECT, 0x70), 249bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ELECT_RESULT, WCD938X_ANA_MBHC_RESULT_3, 0xFF), 250bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MICB_CTRL, WCD938X_ANA_MICB2, 0xC0), 251bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPH_CNP_WG_TIME, WCD938X_HPH_CNP_WG_TIME, 0xFF), 252bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHR_PA_EN, WCD938X_ANA_HPH, 0x40), 253bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHL_PA_EN, WCD938X_ANA_HPH, 0x80), 254bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPH_PA_EN, WCD938X_ANA_HPH, 0xC0), 255bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_SWCH_LEVEL_REMOVE, WCD938X_ANA_MBHC_RESULT_3, 0x10), 256bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ANC_DET_EN, WCD938X_MBHC_CTL_BCS, 0x02), 257bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_FSM_STATUS, WCD938X_MBHC_NEW_FSM_STATUS, 0x01), 258bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MUX_CTL, WCD938X_MBHC_NEW_CTL_2, 0x70), 259bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MOISTURE_STATUS, WCD938X_MBHC_NEW_FSM_STATUS, 0x20), 260bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHR_GND, WCD938X_HPH_PA_CTL2, 0x40), 261bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHL_GND, WCD938X_HPH_PA_CTL2, 0x10), 262bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHL_OCP_DET_EN, WCD938X_HPH_L_TEST, 0x01), 263bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHR_OCP_DET_EN, WCD938X_HPH_R_TEST, 0x01), 264bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHL_OCP_STATUS, WCD938X_DIGITAL_INTR_STATUS_0, 0x80), 265bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_HPHR_OCP_STATUS, WCD938X_DIGITAL_INTR_STATUS_0, 0x20), 266bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ADC_EN, WCD938X_MBHC_NEW_CTL_1, 0x08), 267bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ADC_COMPLETE, WCD938X_MBHC_NEW_FSM_STATUS, 0x40), 268bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ADC_TIMEOUT, WCD938X_MBHC_NEW_FSM_STATUS, 0x80), 269bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ADC_RESULT, WCD938X_MBHC_NEW_ADC_RESULT, 0xFF), 270bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_MICB2_VOUT, WCD938X_ANA_MICB2, 0x3F), 271bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ADC_MODE, WCD938X_MBHC_NEW_CTL_1, 0x10), 272bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_DETECTION_DONE, WCD938X_MBHC_NEW_CTL_1, 0x04), 273bcee7ed0SSrinivas Kandagatla WCD_MBHC_FIELD(WCD_MBHC_ELECT_ISRC_EN, WCD938X_ANA_MBHC_ZDET, 0x02), 274bcee7ed0SSrinivas Kandagatla }; 275bcee7ed0SSrinivas Kandagatla 2768d78602aSSrinivas Kandagatla static const struct reg_default wcd938x_defaults[] = { 2778d78602aSSrinivas Kandagatla {WCD938X_ANA_PAGE_REGISTER, 0x00}, 2788d78602aSSrinivas Kandagatla {WCD938X_ANA_BIAS, 0x00}, 2798d78602aSSrinivas Kandagatla {WCD938X_ANA_RX_SUPPLIES, 0x00}, 2808d78602aSSrinivas Kandagatla {WCD938X_ANA_HPH, 0x0C}, 2818d78602aSSrinivas Kandagatla {WCD938X_ANA_EAR, 0x00}, 2828d78602aSSrinivas Kandagatla {WCD938X_ANA_EAR_COMPANDER_CTL, 0x02}, 2838d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH1, 0x20}, 2848d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH2, 0x00}, 2858d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH3, 0x20}, 2868d78602aSSrinivas Kandagatla {WCD938X_ANA_TX_CH4, 0x00}, 2878d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00}, 2888d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB3_DSP_EN_LOGIC, 0x00}, 2898d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_MECH, 0x39}, 2908d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_ELECT, 0x08}, 2918d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_ZDET, 0x00}, 2928d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_1, 0x00}, 2938d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_2, 0x00}, 2948d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_RESULT_3, 0x00}, 2958d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN0, 0x00}, 2968d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN1, 0x10}, 2978d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN2, 0x20}, 2988d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN3, 0x30}, 2998d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN4, 0x40}, 3008d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN5, 0x50}, 3018d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN6, 0x60}, 3028d78602aSSrinivas Kandagatla {WCD938X_ANA_MBHC_BTN7, 0x70}, 3038d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB1, 0x10}, 3048d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB2, 0x10}, 3058d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB2_RAMP, 0x00}, 3068d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB3, 0x10}, 3078d78602aSSrinivas Kandagatla {WCD938X_ANA_MICB4, 0x10}, 3088d78602aSSrinivas Kandagatla {WCD938X_BIAS_CTL, 0x2A}, 3098d78602aSSrinivas Kandagatla {WCD938X_BIAS_VBG_FINE_ADJ, 0x55}, 3108d78602aSSrinivas Kandagatla {WCD938X_LDOL_VDDCX_ADJUST, 0x01}, 3118d78602aSSrinivas Kandagatla {WCD938X_LDOL_DISABLE_LDOL, 0x00}, 3128d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_CLK, 0x00}, 3138d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_ANA, 0x00}, 3148d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_SPARE_1, 0x00}, 3158d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_SPARE_2, 0x00}, 3168d78602aSSrinivas Kandagatla {WCD938X_MBHC_CTL_BCS, 0x00}, 3178d78602aSSrinivas Kandagatla {WCD938X_MBHC_MOISTURE_DET_FSM_STATUS, 0x00}, 3188d78602aSSrinivas Kandagatla {WCD938X_MBHC_TEST_CTL, 0x00}, 3198d78602aSSrinivas Kandagatla {WCD938X_LDOH_MODE, 0x2B}, 3208d78602aSSrinivas Kandagatla {WCD938X_LDOH_BIAS, 0x68}, 3218d78602aSSrinivas Kandagatla {WCD938X_LDOH_STB_LOADS, 0x00}, 3228d78602aSSrinivas Kandagatla {WCD938X_LDOH_SLOWRAMP, 0x50}, 3238d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_1, 0x1A}, 3248d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_2, 0x00}, 3258d78602aSSrinivas Kandagatla {WCD938X_MICB1_TEST_CTL_3, 0xA4}, 3268d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_1, 0x1A}, 3278d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_2, 0x00}, 3288d78602aSSrinivas Kandagatla {WCD938X_MICB2_TEST_CTL_3, 0x24}, 3298d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_1, 0x1A}, 3308d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_2, 0x00}, 3318d78602aSSrinivas Kandagatla {WCD938X_MICB3_TEST_CTL_3, 0xA4}, 3328d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_1, 0x1A}, 3338d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_2, 0x00}, 3348d78602aSSrinivas Kandagatla {WCD938X_MICB4_TEST_CTL_3, 0xA4}, 3358d78602aSSrinivas Kandagatla {WCD938X_TX_COM_ADC_VCM, 0x39}, 3368d78602aSSrinivas Kandagatla {WCD938X_TX_COM_BIAS_ATEST, 0xE0}, 3378d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE1, 0x00}, 3388d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE2, 0x00}, 3398d78602aSSrinivas Kandagatla {WCD938X_TX_COM_TXFE_DIV_CTL, 0x22}, 3408d78602aSSrinivas Kandagatla {WCD938X_TX_COM_TXFE_DIV_START, 0x00}, 3418d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE3, 0x00}, 3428d78602aSSrinivas Kandagatla {WCD938X_TX_COM_SPARE4, 0x00}, 3438d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_EN, 0xCC}, 3448d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_ADC_IB, 0xE9}, 3458d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_ATEST_REFCTL, 0x0A}, 3468d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_CTL, 0x38}, 3478d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TEST_BLK_EN1, 0xFF}, 3488d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_TXFE1_CLKDIV, 0x00}, 3498d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_SAR2_ERR, 0x00}, 3508d78602aSSrinivas Kandagatla {WCD938X_TX_1_2_SAR1_ERR, 0x00}, 3518d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_EN, 0xCC}, 3528d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_ADC_IB, 0xE9}, 3538d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_ATEST_REFCTL, 0x0A}, 3548d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_CTL, 0x38}, 3558d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN3, 0xFF}, 3568d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE3_CLKDIV, 0x00}, 3578d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SAR4_ERR, 0x00}, 3588d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SAR3_ERR, 0x00}, 3598d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN2, 0xFB}, 3608d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE2_CLKDIV, 0x00}, 3618d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SPARE1, 0x00}, 3628d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TEST_BLK_EN4, 0xFB}, 3638d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_TXFE4_CLKDIV, 0x00}, 3648d78602aSSrinivas Kandagatla {WCD938X_TX_3_4_SPARE2, 0x00}, 3658d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_1, 0x40}, 3668d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_2, 0x3A}, 3678d78602aSSrinivas Kandagatla {WCD938X_CLASSH_MODE_3, 0x00}, 3688d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_VCL_1, 0x70}, 3698d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_VCL_2, 0x82}, 3708d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_1, 0x31}, 3718d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_2, 0x80}, 3728d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_3, 0x80}, 3738d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_4, 0x51}, 3748d78602aSSrinivas Kandagatla {WCD938X_CLASSH_CTRL_CCL_5, 0x00}, 3758d78602aSSrinivas Kandagatla {WCD938X_CLASSH_BUCK_TMUX_A_D, 0x00}, 3768d78602aSSrinivas Kandagatla {WCD938X_CLASSH_BUCK_SW_DRV_CNTL, 0x77}, 3778d78602aSSrinivas Kandagatla {WCD938X_CLASSH_SPARE, 0x00}, 3788d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_EN, 0x4E}, 3798d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_1, 0x0B}, 3808d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_2, 0x45}, 3818d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_3, 0x74}, 3828d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_4, 0x7F}, 3838d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_5, 0x83}, 3848d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_6, 0x98}, 3858d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_7, 0xA9}, 3868d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_8, 0x68}, 3878d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEG_CTRL_9, 0x64}, 3888d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_1, 0xED}, 3898d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_2, 0xF0}, 3908d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_VNEGDAC_CTRL_3, 0xA6}, 3918d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_CTRL_1, 0x65}, 3928d78602aSSrinivas Kandagatla {WCD938X_FLYBACK_TEST_CTL, 0x00}, 3938d78602aSSrinivas Kandagatla {WCD938X_RX_AUX_SW_CTL, 0x00}, 3948d78602aSSrinivas Kandagatla {WCD938X_RX_PA_AUX_IN_CONN, 0x01}, 3958d78602aSSrinivas Kandagatla {WCD938X_RX_TIMER_DIV, 0x32}, 3968d78602aSSrinivas Kandagatla {WCD938X_RX_OCP_CTL, 0x1F}, 3978d78602aSSrinivas Kandagatla {WCD938X_RX_OCP_COUNT, 0x77}, 3988d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_EAR_DAC, 0xA0}, 3998d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_EAR_AMP, 0xAA}, 4008d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_LDO, 0xA9}, 4018d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_PA, 0xAA}, 4028d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2, 0x8A}, 4038d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_RDAC_LDO, 0x88}, 4048d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_CNP1, 0x82}, 4058d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_HPH_LOWPOWER, 0x82}, 4068d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_AUX_DAC, 0xA0}, 4078d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_AUX_AMP, 0xAA}, 4088d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_VNEGDAC_BLEEDER, 0x50}, 4098d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_MISC, 0x00}, 4108d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_BUCK_RST, 0x08}, 4118d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44}, 4128d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_ERRAMP, 0x40}, 4138d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_BUFF, 0xAA}, 4148d78602aSSrinivas Kandagatla {WCD938X_RX_BIAS_FLYB_MID_RST, 0x14}, 4158d78602aSSrinivas Kandagatla {WCD938X_HPH_L_STATUS, 0x04}, 4168d78602aSSrinivas Kandagatla {WCD938X_HPH_R_STATUS, 0x04}, 4178d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_EN, 0x80}, 4188d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_WG_CTL, 0x9A}, 4198d78602aSSrinivas Kandagatla {WCD938X_HPH_CNP_WG_TIME, 0x14}, 4208d78602aSSrinivas Kandagatla {WCD938X_HPH_OCP_CTL, 0x28}, 4218d78602aSSrinivas Kandagatla {WCD938X_HPH_AUTO_CHOP, 0x16}, 4228d78602aSSrinivas Kandagatla {WCD938X_HPH_CHOP_CTL, 0x83}, 4238d78602aSSrinivas Kandagatla {WCD938X_HPH_PA_CTL1, 0x46}, 4248d78602aSSrinivas Kandagatla {WCD938X_HPH_PA_CTL2, 0x50}, 4258d78602aSSrinivas Kandagatla {WCD938X_HPH_L_EN, 0x80}, 4268d78602aSSrinivas Kandagatla {WCD938X_HPH_L_TEST, 0xE0}, 4278d78602aSSrinivas Kandagatla {WCD938X_HPH_L_ATEST, 0x50}, 4288d78602aSSrinivas Kandagatla {WCD938X_HPH_R_EN, 0x80}, 4298d78602aSSrinivas Kandagatla {WCD938X_HPH_R_TEST, 0xE0}, 4308d78602aSSrinivas Kandagatla {WCD938X_HPH_R_ATEST, 0x54}, 4318d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CLK_CTL1, 0x99}, 4328d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CLK_CTL2, 0x9B}, 4338d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_LDO_CTL, 0x33}, 4348d78602aSSrinivas Kandagatla {WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00}, 4358d78602aSSrinivas Kandagatla {WCD938X_HPH_REFBUFF_UHQA_CTL, 0x68}, 4368d78602aSSrinivas Kandagatla {WCD938X_HPH_REFBUFF_LP_CTL, 0x0E}, 4378d78602aSSrinivas Kandagatla {WCD938X_HPH_L_DAC_CTL, 0x20}, 4388d78602aSSrinivas Kandagatla {WCD938X_HPH_R_DAC_CTL, 0x20}, 4398d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL, 0x55}, 4408d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0x19}, 4418d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1, 0xA0}, 4428d78602aSSrinivas Kandagatla {WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS, 0x00}, 4438d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_EN_REG, 0x22}, 4448d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_PA_CON, 0x44}, 4458d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_SP_CON, 0xDB}, 4468d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_DAC_CON, 0x80}, 4478d78602aSSrinivas Kandagatla {WCD938X_EAR_EAR_CNP_FSM_CON, 0xB2}, 4488d78602aSSrinivas Kandagatla {WCD938X_EAR_TEST_CTL, 0x00}, 4498d78602aSSrinivas Kandagatla {WCD938X_EAR_STATUS_REG_1, 0x00}, 4508d78602aSSrinivas Kandagatla {WCD938X_EAR_STATUS_REG_2, 0x08}, 4518d78602aSSrinivas Kandagatla {WCD938X_ANA_NEW_PAGE_REGISTER, 0x00}, 4528d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_ANA_HPH2, 0x00}, 4538d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_ANA_HPH3, 0x00}, 4548d78602aSSrinivas Kandagatla {WCD938X_SLEEP_CTL, 0x16}, 4558d78602aSSrinivas Kandagatla {WCD938X_SLEEP_WATCHDOG_CTL, 0x00}, 4568d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00}, 4578d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_CTL_1, 0x02}, 4588d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_CTL_2, 0x05}, 4598d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_PLUG_DETECT_CTL, 0xE9}, 4608d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ZDET_ANA_CTL, 0x0F}, 4618d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ZDET_RAMP_CTL, 0x00}, 4628d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_FSM_STATUS, 0x00}, 4638d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_ADC_RESULT, 0x00}, 4648d78602aSSrinivas Kandagatla {WCD938X_TX_NEW_AMIC_MUX_CFG, 0x00}, 4658d78602aSSrinivas Kandagatla {WCD938X_AUX_AUXPA, 0x00}, 4668d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_MODE, 0x0C}, 4678d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_CONFIG, 0x10}, 4688d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_DIE_CRK_DET_EN, 0x00}, 4698d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_DIE_CRK_DET_OUT, 0x00}, 4708d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x40}, 4718d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0x81}, 4728d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_VREF_CTL, 0x10}, 4738d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00}, 4748d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0x81}, 4758d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_MISC1, 0x22}, 4768d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_MISC2, 0x00}, 4778d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC, 0x00}, 4788d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER1, 0xFE}, 4798d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER2, 0x02}, 4808d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER3, 0x4E}, 4818d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_HPH_TIMER4, 0x54}, 4828d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC2, 0x00}, 4838d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00}, 4848d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 0x90}, 4858d78602aSSrinivas Kandagatla {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 0x90}, 4868d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x62}, 4878d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01}, 4888d78602aSSrinivas Kandagatla {WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11}, 4898d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57}, 4908d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01}, 4918d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00}, 4928d78602aSSrinivas Kandagatla {WCD938X_MBHC_NEW_INT_SPARE_2, 0x00}, 4938d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON, 0xA8}, 4948d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_CNP_VCM_CON1, 0x42}, 4958d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_CNP_VCM_CON2, 0x22}, 4968d78602aSSrinivas Kandagatla {WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS, 0x00}, 4978d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_EN_REG, 0x00}, 4988d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_PA_CTRL, 0x06}, 4998d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_SP_CTRL, 0xD2}, 5008d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_DAC_CTRL, 0x80}, 5018d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_CLK_CTRL, 0x50}, 5028d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_TEST_CTRL, 0x00}, 5038d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_STATUS_REG, 0x00}, 5048d78602aSSrinivas Kandagatla {WCD938X_AUX_INT_MISC, 0x00}, 5058d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_BIAS, 0x6E}, 5068d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STB_LOADS_DTEST, 0x50}, 5078d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_TEST0, 0x1C}, 5088d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STARTUP_TIMER, 0xFF}, 5098d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_TEST1, 0x1F}, 5108d78602aSSrinivas Kandagatla {WCD938X_LDORXTX_INT_STATUS, 0x00}, 5118d78602aSSrinivas Kandagatla {WCD938X_SLEEP_INT_WATCHDOG_CTL_1, 0x0A}, 5128d78602aSSrinivas Kandagatla {WCD938X_SLEEP_INT_WATCHDOG_CTL_2, 0x0A}, 5138d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1, 0x02}, 5148d78602aSSrinivas Kandagatla {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2, 0x60}, 5158d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2, 0xFF}, 5168d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1, 0x7F}, 5178d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0, 0x3F}, 5188d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M, 0x1F}, 5198d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M, 0x0F}, 5208d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1, 0xD7}, 5218d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0, 0xC8}, 5228d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP, 0xC6}, 5238d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1, 0xD5}, 5248d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0, 0xCA}, 5258d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 0x05}, 5268d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0, 0xA5}, 5278d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 0x13}, 5288d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1, 0x88}, 5298d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP, 0x42}, 5308d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L2, 0xFF}, 5318d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L1, 0x64}, 5328d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_L0, 0x64}, 5338d78602aSSrinivas Kandagatla {WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP, 0x77}, 5348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAGE_REGISTER, 0x00}, 5358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID0, 0x00}, 5368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID1, 0x00}, 5378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID2, 0x0D}, 5388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CHIP_ID3, 0x01}, 5398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_TX_CLK_RATE, 0x00}, 5408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RST_CTL, 0x03}, 5418d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TOP_CLK_CFG, 0x00}, 5428d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x00}, 5438d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 0xF0}, 5448d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_RST_EN, 0x00}, 5458d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_PATH_MODE, 0x55}, 5468d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX_RST, 0x00}, 5478d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX0_CTL, 0xFC}, 5488d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX1_CTL, 0xFC}, 5498d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RX2_CTL, 0xFC}, 5508d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x00}, 5518d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x00}, 5528d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_COMP_CTL_0, 0x00}, 5538d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 0x1E}, 5548d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00}, 5558d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01}, 5568d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63}, 5578d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04}, 5588d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A3_0, 0xAC}, 5598d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04}, 5608d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1A}, 5618d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03}, 5628d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A5_0, 0xBC}, 5638d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02}, 5648d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A6_0, 0xC7}, 5658d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_A7_0, 0xF8}, 5668d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_0, 0x47}, 5678d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_1, 0x43}, 5688d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_2, 0xB1}, 5698d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_C_3, 0x17}, 5708d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R1, 0x4D}, 5718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R2, 0x29}, 5728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R3, 0x34}, 5738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R4, 0x59}, 5748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R5, 0x66}, 5758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R6, 0x87}, 5768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_DSM_R7, 0x64}, 5778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A1_0, 0x00}, 5788d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A1_1, 0x01}, 5798d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A2_0, 0x96}, 5808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A2_1, 0x09}, 5818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A3_0, 0xAB}, 5828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A3_1, 0x05}, 5838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A4_0, 0x1C}, 5848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A4_1, 0x02}, 5858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A5_0, 0x17}, 5868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A5_1, 0x02}, 5878d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A6_0, 0xAA}, 5888d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_A7_0, 0xE3}, 5898d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_0, 0x69}, 5908d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_1, 0x54}, 5918d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_2, 0x02}, 5928d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_C_3, 0x15}, 5938d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R1, 0xA4}, 5948d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R2, 0xB5}, 5958d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R3, 0x86}, 5968d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R4, 0x85}, 5978d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R5, 0xAA}, 5988d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R6, 0xE2}, 5998d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_DSM_R7, 0x62}, 6008d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55}, 6018d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xA9}, 6028d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3D}, 6038d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2E}, 6048d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01}, 6058d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0, 0x00}, 6068d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1, 0xFC}, 6078d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2, 0x01}, 6088d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00}, 6098d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 0x00}, 6108d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0x00}, 6118d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_SWR_CLH, 0x00}, 6128d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_CLH_BYP, 0x00}, 6138d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX0_CTL, 0x68}, 6148d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX1_CTL, 0x68}, 6158d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX2_CTL, 0x68}, 6168d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_RST, 0x00}, 6178d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_REQ_CTL, 0x01}, 6188d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_RST, 0x00}, 6198d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_AMIC_CTL, 0x0F}, 6208d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_CTL, 0x04}, 6218d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC1_CTL, 0x01}, 6228d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC2_CTL, 0x01}, 6238d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC3_CTL, 0x01}, 6248d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC4_CTL, 0x01}, 6258d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_PRG_CTL, 0x00}, 6268d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_CTL, 0x2B}, 6278d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_RATE_1_2, 0x11}, 6288d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_DMIC_RATE_3_4, 0x11}, 6298d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL0, 0x00}, 6308d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL1, 0x00}, 6318d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PDM_WD_CTL2, 0x00}, 6328d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MODE, 0x00}, 6338d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_0, 0xFF}, 6348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_1, 0xFF}, 6358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_MASK_2, 0x3F}, 6368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_0, 0x00}, 6378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_1, 0x00}, 6388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_STATUS_2, 0x00}, 6398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_0, 0x00}, 6408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_1, 0x00}, 6418d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_CLEAR_2, 0x00}, 6428d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_0, 0x00}, 6438d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_1, 0x00}, 6448d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_LEVEL_2, 0x00}, 6458d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_0, 0x00}, 6468d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_1, 0x00}, 6478d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_SET_2, 0x00}, 6488d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_0, 0x00}, 6498d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_1, 0x00}, 6508d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_INTR_TEST_2, 0x00}, 6518d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_EN, 0x00}, 6528d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_0_1, 0x00}, 6538d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_MODE_DBG_2_3, 0x00}, 6548d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_LB_IN_SEL_CTL, 0x00}, 6558d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_LOOP_BACK_MODE, 0x00}, 6568d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_DAC_TEST, 0x00}, 6578d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_RX_0, 0x40}, 6588d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_0, 0x40}, 6598d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_RX_1, 0x00}, 6608d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_1, 0x00}, 6618d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_TX_2, 0x00}, 6628d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_0, 0x00}, 6638d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SWR_HM_TEST_1, 0x00}, 6648d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_SWR_0, 0x8F}, 6658d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_SWR_1, 0x06}, 6668d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_I2C_CTL, 0x00}, 6678d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE, 0x00}, 6688d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_TEST_CTL_0, 0x00}, 6698d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_TEST_CTL_1, 0x00}, 6708d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_T_DATA_0, 0x00}, 6718d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_T_DATA_1, 0x00}, 6728d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_RX0, 0xF1}, 6738d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_RX1, 0xF1}, 6748d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX0, 0xF1}, 6758d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX1, 0xF1}, 6768d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_CTL_PDM_TX2, 0xF1}, 6778d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_INP_DIS_0, 0x00}, 6788d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PAD_INP_DIS_1, 0x00}, 6798d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_0, 0x00}, 6808d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_1, 0x00}, 6818d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DRIVE_STRENGTH_2, 0x00}, 6828d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_RX_DATA_EDGE_CTL, 0x1F}, 6838d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_DATA_EDGE_CTL, 0x80}, 6848d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_GPIO_MODE, 0x00}, 6858d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_OE, 0x00}, 6868d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_DATA_0, 0x00}, 6878d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_CTL_DATA_1, 0x00}, 6888d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_STATUS_0, 0x00}, 6898d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_PIN_STATUS_1, 0x00}, 6908d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DIG_DEBUG_CTL, 0x00}, 6918d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DIG_DEBUG_EN, 0x00}, 6928d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_ANA_CSR_DBG_ADD, 0x00}, 6938d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_ANA_CSR_DBG_CTL, 0x48}, 6948d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SSP_DBG, 0x00}, 6958d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_MODE_STATUS_0, 0x00}, 6968d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_MODE_STATUS_1, 0x00}, 6978d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_0, 0x00}, 6988d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_1, 0x00}, 6998d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_SPARE_2, 0x00}, 7008d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_0, 0x00}, 7018d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_1, 0xFF}, 7028d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_2, 0xFF}, 7038d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_3, 0xFF}, 7048d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_4, 0xFF}, 7058d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_5, 0xFF}, 7068d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_6, 0xFF}, 7078d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_7, 0xFF}, 7088d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_8, 0xFF}, 7098d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_9, 0xFF}, 7108d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_10, 0xFF}, 7118d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_11, 0xFF}, 7128d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_12, 0xFF}, 7138d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_13, 0xFF}, 7148d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_14, 0xFF}, 7158d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_15, 0xFF}, 7168d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_16, 0xFF}, 7178d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_17, 0xFF}, 7188d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_18, 0xFF}, 7198d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_19, 0xFF}, 7208d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_20, 0x0E}, 7218d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_21, 0x00}, 7228d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_22, 0x00}, 7238d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_23, 0xF8}, 7248d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_24, 0x16}, 7258d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_25, 0x00}, 7268d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_26, 0x00}, 7278d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_27, 0x00}, 7288d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_28, 0x00}, 7298d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_29, 0x00}, 7308d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_30, 0x00}, 7318d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_EFUSE_REG_31, 0x00}, 7328d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0x88}, 7338d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0x88}, 7348d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0x88}, 7358d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0x88}, 7368d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0x88}, 7378d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA0, 0x55}, 7388d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA1, 0x55}, 7398d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA2, 0x55}, 7408d78602aSSrinivas Kandagatla {WCD938X_DIGITAL_DEM_BYPASS_DATA3, 0x01}, 7418d78602aSSrinivas Kandagatla }; 7428d78602aSSrinivas Kandagatla 7438d78602aSSrinivas Kandagatla static bool wcd938x_rdwr_register(struct device *dev, unsigned int reg) 7448d78602aSSrinivas Kandagatla { 7458d78602aSSrinivas Kandagatla switch (reg) { 7468d78602aSSrinivas Kandagatla case WCD938X_ANA_PAGE_REGISTER: 7478d78602aSSrinivas Kandagatla case WCD938X_ANA_BIAS: 7488d78602aSSrinivas Kandagatla case WCD938X_ANA_RX_SUPPLIES: 7498d78602aSSrinivas Kandagatla case WCD938X_ANA_HPH: 7508d78602aSSrinivas Kandagatla case WCD938X_ANA_EAR: 7518d78602aSSrinivas Kandagatla case WCD938X_ANA_EAR_COMPANDER_CTL: 7528d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH1: 7538d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH2: 7548d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH3: 7558d78602aSSrinivas Kandagatla case WCD938X_ANA_TX_CH4: 7568d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC: 7578d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB3_DSP_EN_LOGIC: 7588d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_MECH: 7598d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_ELECT: 7608d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_ZDET: 7618d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN0: 7628d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN1: 7638d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN2: 7648d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN3: 7658d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN4: 7668d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN5: 7678d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN6: 7688d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_BTN7: 7698d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB1: 7708d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB2: 7718d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB2_RAMP: 7728d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB3: 7738d78602aSSrinivas Kandagatla case WCD938X_ANA_MICB4: 7748d78602aSSrinivas Kandagatla case WCD938X_BIAS_CTL: 7758d78602aSSrinivas Kandagatla case WCD938X_BIAS_VBG_FINE_ADJ: 7768d78602aSSrinivas Kandagatla case WCD938X_LDOL_VDDCX_ADJUST: 7778d78602aSSrinivas Kandagatla case WCD938X_LDOL_DISABLE_LDOL: 7788d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_CLK: 7798d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_ANA: 7808d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_SPARE_1: 7818d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_SPARE_2: 7828d78602aSSrinivas Kandagatla case WCD938X_MBHC_CTL_BCS: 7838d78602aSSrinivas Kandagatla case WCD938X_MBHC_TEST_CTL: 7848d78602aSSrinivas Kandagatla case WCD938X_LDOH_MODE: 7858d78602aSSrinivas Kandagatla case WCD938X_LDOH_BIAS: 7868d78602aSSrinivas Kandagatla case WCD938X_LDOH_STB_LOADS: 7878d78602aSSrinivas Kandagatla case WCD938X_LDOH_SLOWRAMP: 7888d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_1: 7898d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_2: 7908d78602aSSrinivas Kandagatla case WCD938X_MICB1_TEST_CTL_3: 7918d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_1: 7928d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_2: 7938d78602aSSrinivas Kandagatla case WCD938X_MICB2_TEST_CTL_3: 7948d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_1: 7958d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_2: 7968d78602aSSrinivas Kandagatla case WCD938X_MICB3_TEST_CTL_3: 7978d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_1: 7988d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_2: 7998d78602aSSrinivas Kandagatla case WCD938X_MICB4_TEST_CTL_3: 8008d78602aSSrinivas Kandagatla case WCD938X_TX_COM_ADC_VCM: 8018d78602aSSrinivas Kandagatla case WCD938X_TX_COM_BIAS_ATEST: 8028d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE1: 8038d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE2: 8048d78602aSSrinivas Kandagatla case WCD938X_TX_COM_TXFE_DIV_CTL: 8058d78602aSSrinivas Kandagatla case WCD938X_TX_COM_TXFE_DIV_START: 8068d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE3: 8078d78602aSSrinivas Kandagatla case WCD938X_TX_COM_SPARE4: 8088d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_EN: 8098d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_ADC_IB: 8108d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_ATEST_REFCTL: 8118d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_CTL: 8128d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TEST_BLK_EN1: 8138d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_TXFE1_CLKDIV: 8148d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_EN: 8158d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_ADC_IB: 8168d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_ATEST_REFCTL: 8178d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_CTL: 8188d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN3: 8198d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE3_CLKDIV: 8208d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN2: 8218d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE2_CLKDIV: 8228d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SPARE1: 8238d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TEST_BLK_EN4: 8248d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_TXFE4_CLKDIV: 8258d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SPARE2: 8268d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_1: 8278d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_2: 8288d78602aSSrinivas Kandagatla case WCD938X_CLASSH_MODE_3: 8298d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_VCL_1: 8308d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_VCL_2: 8318d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_1: 8328d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_2: 8338d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_3: 8348d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_4: 8358d78602aSSrinivas Kandagatla case WCD938X_CLASSH_CTRL_CCL_5: 8368d78602aSSrinivas Kandagatla case WCD938X_CLASSH_BUCK_TMUX_A_D: 8378d78602aSSrinivas Kandagatla case WCD938X_CLASSH_BUCK_SW_DRV_CNTL: 8388d78602aSSrinivas Kandagatla case WCD938X_CLASSH_SPARE: 8398d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_EN: 8408d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_1: 8418d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_2: 8428d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_3: 8438d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_4: 8448d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_5: 8458d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_6: 8468d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_7: 8478d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_8: 8488d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEG_CTRL_9: 8498d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_1: 8508d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_2: 8518d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_VNEGDAC_CTRL_3: 8528d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_CTRL_1: 8538d78602aSSrinivas Kandagatla case WCD938X_FLYBACK_TEST_CTL: 8548d78602aSSrinivas Kandagatla case WCD938X_RX_AUX_SW_CTL: 8558d78602aSSrinivas Kandagatla case WCD938X_RX_PA_AUX_IN_CONN: 8568d78602aSSrinivas Kandagatla case WCD938X_RX_TIMER_DIV: 8578d78602aSSrinivas Kandagatla case WCD938X_RX_OCP_CTL: 8588d78602aSSrinivas Kandagatla case WCD938X_RX_OCP_COUNT: 8598d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_EAR_DAC: 8608d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_EAR_AMP: 8618d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_LDO: 8628d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_PA: 8638d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2: 8648d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_RDAC_LDO: 8658d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_CNP1: 8668d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_HPH_LOWPOWER: 8678d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_AUX_DAC: 8688d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_AUX_AMP: 8698d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_VNEGDAC_BLEEDER: 8708d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_MISC: 8718d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_BUCK_RST: 8728d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_BUCK_VREF_ERRAMP: 8738d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_ERRAMP: 8748d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_BUFF: 8758d78602aSSrinivas Kandagatla case WCD938X_RX_BIAS_FLYB_MID_RST: 8768d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_EN: 8778d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_WG_CTL: 8788d78602aSSrinivas Kandagatla case WCD938X_HPH_CNP_WG_TIME: 8798d78602aSSrinivas Kandagatla case WCD938X_HPH_OCP_CTL: 8808d78602aSSrinivas Kandagatla case WCD938X_HPH_AUTO_CHOP: 8818d78602aSSrinivas Kandagatla case WCD938X_HPH_CHOP_CTL: 8828d78602aSSrinivas Kandagatla case WCD938X_HPH_PA_CTL1: 8838d78602aSSrinivas Kandagatla case WCD938X_HPH_PA_CTL2: 8848d78602aSSrinivas Kandagatla case WCD938X_HPH_L_EN: 8858d78602aSSrinivas Kandagatla case WCD938X_HPH_L_TEST: 8868d78602aSSrinivas Kandagatla case WCD938X_HPH_L_ATEST: 8878d78602aSSrinivas Kandagatla case WCD938X_HPH_R_EN: 8888d78602aSSrinivas Kandagatla case WCD938X_HPH_R_TEST: 8898d78602aSSrinivas Kandagatla case WCD938X_HPH_R_ATEST: 8908d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CLK_CTL1: 8918d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CLK_CTL2: 8928d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_LDO_CTL: 8938d78602aSSrinivas Kandagatla case WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL: 8948d78602aSSrinivas Kandagatla case WCD938X_HPH_REFBUFF_UHQA_CTL: 8958d78602aSSrinivas Kandagatla case WCD938X_HPH_REFBUFF_LP_CTL: 8968d78602aSSrinivas Kandagatla case WCD938X_HPH_L_DAC_CTL: 8978d78602aSSrinivas Kandagatla case WCD938X_HPH_R_DAC_CTL: 8988d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL: 8998d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_EN: 9008d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1: 9018d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_EN_REG: 9028d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_PA_CON: 9038d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_SP_CON: 9048d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_DAC_CON: 9058d78602aSSrinivas Kandagatla case WCD938X_EAR_EAR_CNP_FSM_CON: 9068d78602aSSrinivas Kandagatla case WCD938X_EAR_TEST_CTL: 9078d78602aSSrinivas Kandagatla case WCD938X_ANA_NEW_PAGE_REGISTER: 9088d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_ANA_HPH2: 9098d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_ANA_HPH3: 9108d78602aSSrinivas Kandagatla case WCD938X_SLEEP_CTL: 9118d78602aSSrinivas Kandagatla case WCD938X_SLEEP_WATCHDOG_CTL: 9128d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL: 9138d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_CTL_1: 9148d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_CTL_2: 9158d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_PLUG_DETECT_CTL: 9168d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ZDET_ANA_CTL: 9178d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ZDET_RAMP_CTL: 9188d78602aSSrinivas Kandagatla case WCD938X_TX_NEW_AMIC_MUX_CFG: 9198d78602aSSrinivas Kandagatla case WCD938X_AUX_AUXPA: 9208d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_MODE: 9218d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_CONFIG: 9228d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_DIE_CRK_DET_EN: 9238d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL: 9248d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L: 9258d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_VREF_CTL: 9268d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL: 9278d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R: 9288d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_MISC1: 9298d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_MISC2: 9308d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC: 9318d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER1: 9328d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER2: 9338d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER3: 9348d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_HPH_TIMER4: 9358d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC2: 9368d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_PA_RDAC_MISC3: 9378d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW: 9388d78602aSSrinivas Kandagatla case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW: 9398d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI: 9408d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP: 9418d78602aSSrinivas Kandagatla case WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP: 9428d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL: 9438d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL: 9448d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT: 9458d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_INT_SPARE_2: 9468d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON: 9478d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_CNP_VCM_CON1: 9488d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_CNP_VCM_CON2: 9498d78602aSSrinivas Kandagatla case WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS: 9508d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_EN_REG: 9518d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_PA_CTRL: 9528d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_SP_CTRL: 9538d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_DAC_CTRL: 9548d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_CLK_CTRL: 9558d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_TEST_CTRL: 9568d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_MISC: 9578d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_BIAS: 9588d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STB_LOADS_DTEST: 9598d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_TEST0: 9608d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STARTUP_TIMER: 9618d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_TEST1: 9628d78602aSSrinivas Kandagatla case WCD938X_SLEEP_INT_WATCHDOG_CTL_1: 9638d78602aSSrinivas Kandagatla case WCD938X_SLEEP_INT_WATCHDOG_CTL_2: 9648d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1: 9658d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2: 9668d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2: 9678d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1: 9688d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0: 9698d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M: 9708d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M: 9718d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1: 9728d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0: 9738d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP: 9748d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1: 9758d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0: 9768d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP: 9778d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0: 9788d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP: 9798d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1: 9808d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP: 9818d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L2: 9828d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L1: 9838d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_L0: 9848d78602aSSrinivas Kandagatla case WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP: 9858d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAGE_REGISTER: 9868d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_TX_CLK_RATE: 9878d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RST_CTL: 9888d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TOP_CLK_CFG: 9898d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_ANA_CLK_CTL: 9908d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DIG_CLK_CTL: 9918d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_RST_EN: 9928d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_PATH_MODE: 9938d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX_RST: 9948d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX0_CTL: 9958d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX1_CTL: 9968d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RX2_CTL: 9978d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1: 9988d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3: 9998d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_COMP_CTL_0: 10008d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL: 10018d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A1_0: 10028d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A1_1: 10038d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A2_0: 10048d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A2_1: 10058d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A3_0: 10068d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A3_1: 10078d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A4_0: 10088d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A4_1: 10098d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A5_0: 10108d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A5_1: 10118d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A6_0: 10128d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_A7_0: 10138d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_0: 10148d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_1: 10158d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_2: 10168d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_C_3: 10178d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R1: 10188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R2: 10198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R3: 10208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R4: 10218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R5: 10228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R6: 10238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_DSM_R7: 10248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A1_0: 10258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A1_1: 10268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A2_0: 10278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A2_1: 10288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A3_0: 10298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A3_1: 10308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A4_0: 10318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A4_1: 10328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A5_0: 10338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A5_1: 10348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A6_0: 10358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_A7_0: 10368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_0: 10378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_1: 10388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_2: 10398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_C_3: 10408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R1: 10418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R2: 10428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R3: 10438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R4: 10448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R5: 10458d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R6: 10468d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_DSM_R7: 10478d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0: 10488d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1: 10498d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0: 10508d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1: 10518d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2: 10528d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0: 10538d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1: 10548d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2: 10558d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_HPH_GAIN_CTL: 10568d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AUX_GAIN_CTL: 10578d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_EAR_PATH_CTL: 10588d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_SWR_CLH: 10598d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_CLH_BYP: 10608d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX0_CTL: 10618d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX1_CTL: 10628d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX2_CTL: 10638d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_RST: 10648d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_REQ_CTL: 10658d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_RST: 10668d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_AMIC_CTL: 10678d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_CTL: 10688d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC1_CTL: 10698d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC2_CTL: 10708d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC3_CTL: 10718d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC4_CTL: 10728d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_PRG_CTL: 10738d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_CTL: 10748d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_RATE_1_2: 10758d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_DMIC_RATE_3_4: 10768d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL0: 10778d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL1: 10788d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PDM_WD_CTL2: 10798d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MODE: 10808d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_0: 10818d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_1: 10828d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_MASK_2: 10838d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_0: 10848d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_1: 10858d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_2: 10868d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_0: 10878d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_1: 10888d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_LEVEL_2: 10898d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_0: 10908d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_1: 10918d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_SET_2: 10928d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_0: 10938d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_1: 10948d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_TEST_2: 10958d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_EN: 10968d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_0_1: 10978d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_MODE_DBG_2_3: 10988d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_LB_IN_SEL_CTL: 10998d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_LOOP_BACK_MODE: 11008d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_DAC_TEST: 11018d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_RX_0: 11028d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_0: 11038d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_RX_1: 11048d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_1: 11058d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_TX_2: 11068d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_SWR_0: 11078d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_SWR_1: 11088d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_I2C_CTL: 11098d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE: 11108d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_TEST_CTL_0: 11118d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_TEST_CTL_1: 11128d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_RX0: 11138d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_RX1: 11148d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX0: 11158d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX1: 11168d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_CTL_PDM_TX2: 11178d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_INP_DIS_0: 11188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PAD_INP_DIS_1: 11198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_0: 11208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_1: 11218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DRIVE_STRENGTH_2: 11228d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_RX_DATA_EDGE_CTL: 11238d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_DATA_EDGE_CTL: 11248d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_GPIO_MODE: 11258d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_OE: 11268d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_DATA_0: 11278d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_CTL_DATA_1: 11288d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DIG_DEBUG_CTL: 11298d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DIG_DEBUG_EN: 11308d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_ANA_CSR_DBG_ADD: 11318d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_ANA_CSR_DBG_CTL: 11328d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SSP_DBG: 11338d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_0: 11348d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_1: 11358d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SPARE_2: 11368d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_0: 11378d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_1: 11388d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_2: 11398d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_3: 11408d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_TX_REQ_FB_CTL_4: 11418d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA0: 11428d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA1: 11438d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA2: 11448d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_DEM_BYPASS_DATA3: 11458d78602aSSrinivas Kandagatla return true; 11468d78602aSSrinivas Kandagatla } 11478d78602aSSrinivas Kandagatla 11488d78602aSSrinivas Kandagatla return false; 11498d78602aSSrinivas Kandagatla } 11508d78602aSSrinivas Kandagatla 11518d78602aSSrinivas Kandagatla static bool wcd938x_readonly_register(struct device *dev, unsigned int reg) 11528d78602aSSrinivas Kandagatla { 11538d78602aSSrinivas Kandagatla switch (reg) { 11548d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_1: 11558d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_2: 11568d78602aSSrinivas Kandagatla case WCD938X_ANA_MBHC_RESULT_3: 11578d78602aSSrinivas Kandagatla case WCD938X_MBHC_MOISTURE_DET_FSM_STATUS: 11588d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_SAR2_ERR: 11598d78602aSSrinivas Kandagatla case WCD938X_TX_1_2_SAR1_ERR: 11608d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SAR4_ERR: 11618d78602aSSrinivas Kandagatla case WCD938X_TX_3_4_SAR3_ERR: 11628d78602aSSrinivas Kandagatla case WCD938X_HPH_L_STATUS: 11638d78602aSSrinivas Kandagatla case WCD938X_HPH_R_STATUS: 11648d78602aSSrinivas Kandagatla case WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS: 11658d78602aSSrinivas Kandagatla case WCD938X_EAR_STATUS_REG_1: 11668d78602aSSrinivas Kandagatla case WCD938X_EAR_STATUS_REG_2: 11678d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_FSM_STATUS: 11688d78602aSSrinivas Kandagatla case WCD938X_MBHC_NEW_ADC_RESULT: 11698d78602aSSrinivas Kandagatla case WCD938X_DIE_CRACK_DIE_CRK_DET_OUT: 11708d78602aSSrinivas Kandagatla case WCD938X_AUX_INT_STATUS_REG: 11718d78602aSSrinivas Kandagatla case WCD938X_LDORXTX_INT_STATUS: 11728d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID0: 11738d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID1: 11748d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID2: 11758d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_CHIP_ID3: 11768d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_0: 11778d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_1: 11788d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_STATUS_2: 1179ea157c2bSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_0: 1180ea157c2bSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_1: 1181ea157c2bSSrinivas Kandagatla case WCD938X_DIGITAL_INTR_CLEAR_2: 11828d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_0: 11838d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_SWR_HM_TEST_1: 11848d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_T_DATA_0: 11858d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_T_DATA_1: 11868d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_STATUS_0: 11878d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_PIN_STATUS_1: 11888d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_MODE_STATUS_0: 11898d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_MODE_STATUS_1: 11908d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_0: 11918d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_1: 11928d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_2: 11938d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_3: 11948d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_4: 11958d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_5: 11968d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_6: 11978d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_7: 11988d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_8: 11998d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_9: 12008d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_10: 12018d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_11: 12028d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_12: 12038d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_13: 12048d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_14: 12058d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_15: 12068d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_16: 12078d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_17: 12088d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_18: 12098d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_19: 12108d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_20: 12118d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_21: 12128d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_22: 12138d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_23: 12148d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_24: 12158d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_25: 12168d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_26: 12178d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_27: 12188d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_28: 12198d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_29: 12208d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_30: 12218d78602aSSrinivas Kandagatla case WCD938X_DIGITAL_EFUSE_REG_31: 12228d78602aSSrinivas Kandagatla return true; 12238d78602aSSrinivas Kandagatla } 12248d78602aSSrinivas Kandagatla return false; 12258d78602aSSrinivas Kandagatla } 12268d78602aSSrinivas Kandagatla 12278d78602aSSrinivas Kandagatla static bool wcd938x_readable_register(struct device *dev, unsigned int reg) 12288d78602aSSrinivas Kandagatla { 12298d78602aSSrinivas Kandagatla bool ret; 12308d78602aSSrinivas Kandagatla 12318d78602aSSrinivas Kandagatla ret = wcd938x_readonly_register(dev, reg); 12328d78602aSSrinivas Kandagatla if (!ret) 12338d78602aSSrinivas Kandagatla return wcd938x_rdwr_register(dev, reg); 12348d78602aSSrinivas Kandagatla 12358d78602aSSrinivas Kandagatla return ret; 12368d78602aSSrinivas Kandagatla } 12378d78602aSSrinivas Kandagatla 12388d78602aSSrinivas Kandagatla static bool wcd938x_writeable_register(struct device *dev, unsigned int reg) 12398d78602aSSrinivas Kandagatla { 12408d78602aSSrinivas Kandagatla return wcd938x_rdwr_register(dev, reg); 12418d78602aSSrinivas Kandagatla } 12428d78602aSSrinivas Kandagatla 12438d78602aSSrinivas Kandagatla static bool wcd938x_volatile_register(struct device *dev, unsigned int reg) 12448d78602aSSrinivas Kandagatla { 12458d78602aSSrinivas Kandagatla if (reg <= WCD938X_BASE_ADDRESS) 124683bd5c53SYang Li return false; 12478d78602aSSrinivas Kandagatla 12488d78602aSSrinivas Kandagatla if (reg == WCD938X_DIGITAL_SWR_TX_CLK_RATE) 12498d78602aSSrinivas Kandagatla return true; 12508d78602aSSrinivas Kandagatla 12518d78602aSSrinivas Kandagatla if (wcd938x_readonly_register(dev, reg)) 12528d78602aSSrinivas Kandagatla return true; 12538d78602aSSrinivas Kandagatla 12548d78602aSSrinivas Kandagatla return false; 12558d78602aSSrinivas Kandagatla } 12568d78602aSSrinivas Kandagatla 1257b90d9398SSrinivas Kandagatla static struct regmap_config wcd938x_regmap_config = { 12588d78602aSSrinivas Kandagatla .name = "wcd938x_csr", 12598d78602aSSrinivas Kandagatla .reg_bits = 32, 12608d78602aSSrinivas Kandagatla .val_bits = 8, 12618d78602aSSrinivas Kandagatla .cache_type = REGCACHE_RBTREE, 12628d78602aSSrinivas Kandagatla .reg_defaults = wcd938x_defaults, 12638d78602aSSrinivas Kandagatla .num_reg_defaults = ARRAY_SIZE(wcd938x_defaults), 12648d78602aSSrinivas Kandagatla .max_register = WCD938X_MAX_REGISTER, 12658d78602aSSrinivas Kandagatla .readable_reg = wcd938x_readable_register, 12668d78602aSSrinivas Kandagatla .writeable_reg = wcd938x_writeable_register, 12678d78602aSSrinivas Kandagatla .volatile_reg = wcd938x_volatile_register, 12688d78602aSSrinivas Kandagatla .can_multi_write = true, 12698d78602aSSrinivas Kandagatla }; 12708d78602aSSrinivas Kandagatla 12718d78602aSSrinivas Kandagatla static const struct regmap_irq wcd938x_irqs[WCD938X_NUM_IRQS] = { 12728d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01), 12738d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02), 12748d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_DET, 0, 0x04), 12758d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET, 0, 0x08), 12768d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_SW_DET, 0, 0x10), 12778d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_OCP_INT, 0, 0x20), 12788d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_CNP_INT, 0, 0x40), 12798d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_OCP_INT, 0, 0x80), 12808d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_CNP_INT, 1, 0x01), 12818d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_EAR_CNP_INT, 1, 0x02), 12828d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_EAR_SCD_INT, 1, 0x04), 12838d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_CNP_INT, 1, 0x08), 12848d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_SCD_INT, 1, 0x10), 12858d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_PDM_WD_INT, 1, 0x20), 12868d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_PDM_WD_INT, 1, 0x40), 12878d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_AUX_PDM_WD_INT, 1, 0x80), 12888d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_LDORT_SCD_INT, 2, 0x01), 12898d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_MOISTURE_INT, 2, 0x02), 12908d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHL_SURGE_DET_INT, 2, 0x04), 12918d78602aSSrinivas Kandagatla REGMAP_IRQ_REG(WCD938X_IRQ_HPHR_SURGE_DET_INT, 2, 0x08), 12928d78602aSSrinivas Kandagatla }; 12938d78602aSSrinivas Kandagatla 12948d78602aSSrinivas Kandagatla static struct regmap_irq_chip wcd938x_regmap_irq_chip = { 12958d78602aSSrinivas Kandagatla .name = "wcd938x", 12968d78602aSSrinivas Kandagatla .irqs = wcd938x_irqs, 12978d78602aSSrinivas Kandagatla .num_irqs = ARRAY_SIZE(wcd938x_irqs), 12988d78602aSSrinivas Kandagatla .num_regs = 3, 12998d78602aSSrinivas Kandagatla .status_base = WCD938X_DIGITAL_INTR_STATUS_0, 13008d78602aSSrinivas Kandagatla .mask_base = WCD938X_DIGITAL_INTR_MASK_0, 13018d78602aSSrinivas Kandagatla .type_base = WCD938X_DIGITAL_INTR_LEVEL_0, 13028d78602aSSrinivas Kandagatla .ack_base = WCD938X_DIGITAL_INTR_CLEAR_0, 13038d78602aSSrinivas Kandagatla .use_ack = 1, 13048d78602aSSrinivas Kandagatla .runtime_pm = true, 13058d78602aSSrinivas Kandagatla .irq_drv_data = NULL, 13068d78602aSSrinivas Kandagatla }; 13078d78602aSSrinivas Kandagatla 1308d5add08fSSrinivas Kandagatla static int wcd938x_get_clk_rate(int mode) 1309d5add08fSSrinivas Kandagatla { 1310d5add08fSSrinivas Kandagatla int rate; 1311d5add08fSSrinivas Kandagatla 1312d5add08fSSrinivas Kandagatla switch (mode) { 1313d5add08fSSrinivas Kandagatla case ADC_MODE_ULP2: 1314d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_0P6MHZ; 1315d5add08fSSrinivas Kandagatla break; 1316d5add08fSSrinivas Kandagatla case ADC_MODE_ULP1: 1317d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_1P2MHZ; 1318d5add08fSSrinivas Kandagatla break; 1319d5add08fSSrinivas Kandagatla case ADC_MODE_LP: 1320d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_4P8MHZ; 1321d5add08fSSrinivas Kandagatla break; 1322d5add08fSSrinivas Kandagatla case ADC_MODE_NORMAL: 1323d5add08fSSrinivas Kandagatla case ADC_MODE_LO_HIF: 1324d5add08fSSrinivas Kandagatla case ADC_MODE_HIFI: 1325d5add08fSSrinivas Kandagatla case ADC_MODE_INVALID: 1326d5add08fSSrinivas Kandagatla default: 1327d5add08fSSrinivas Kandagatla rate = SWR_CLK_RATE_9P6MHZ; 1328d5add08fSSrinivas Kandagatla break; 1329d5add08fSSrinivas Kandagatla } 1330d5add08fSSrinivas Kandagatla 1331d5add08fSSrinivas Kandagatla return rate; 1332d5add08fSSrinivas Kandagatla } 1333d5add08fSSrinivas Kandagatla 1334d5add08fSSrinivas Kandagatla static int wcd938x_set_swr_clk_rate(struct snd_soc_component *component, int rate, int bank) 1335d5add08fSSrinivas Kandagatla { 1336d5add08fSSrinivas Kandagatla u8 mask = (bank ? 0xF0 : 0x0F); 1337d5add08fSSrinivas Kandagatla u8 val = 0; 1338d5add08fSSrinivas Kandagatla 1339d5add08fSSrinivas Kandagatla switch (rate) { 1340d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_0P6MHZ: 1341d5add08fSSrinivas Kandagatla val = (bank ? 0x60 : 0x06); 1342d5add08fSSrinivas Kandagatla break; 1343d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_1P2MHZ: 1344d5add08fSSrinivas Kandagatla val = (bank ? 0x50 : 0x05); 1345d5add08fSSrinivas Kandagatla break; 1346d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_2P4MHZ: 1347d5add08fSSrinivas Kandagatla val = (bank ? 0x30 : 0x03); 1348d5add08fSSrinivas Kandagatla break; 1349d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_4P8MHZ: 1350d5add08fSSrinivas Kandagatla val = (bank ? 0x10 : 0x01); 1351d5add08fSSrinivas Kandagatla break; 1352d5add08fSSrinivas Kandagatla case SWR_CLK_RATE_9P6MHZ: 1353d5add08fSSrinivas Kandagatla default: 1354d5add08fSSrinivas Kandagatla val = 0x00; 1355d5add08fSSrinivas Kandagatla break; 1356d5add08fSSrinivas Kandagatla } 1357d5add08fSSrinivas Kandagatla snd_soc_component_update_bits(component, WCD938X_DIGITAL_SWR_TX_CLK_RATE, 1358d5add08fSSrinivas Kandagatla mask, val); 1359d5add08fSSrinivas Kandagatla 1360d5add08fSSrinivas Kandagatla return 0; 1361d5add08fSSrinivas Kandagatla } 1362d5add08fSSrinivas Kandagatla 13638d78602aSSrinivas Kandagatla static int wcd938x_io_init(struct wcd938x_priv *wcd938x) 13648d78602aSSrinivas Kandagatla { 13658d78602aSSrinivas Kandagatla struct regmap *rm = wcd938x->regmap; 13668d78602aSSrinivas Kandagatla 13678d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x0E, 0x0E); 13688d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x80, 0x80); 13698d78602aSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 13708d78602aSSrinivas Kandagatla usleep_range(1000, 1010); 13718d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_SLEEP_CTL, 0x40, 0x40); 13728d78602aSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 13738d78602aSSrinivas Kandagatla usleep_range(1000, 1010); 13748d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_LDORXTX_CONFIG, 0x10, 0x00); 13758d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_BIAS_VBG_FINE_ADJ, 13768d78602aSSrinivas Kandagatla 0xF0, 0x80); 13778d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x80, 0x80); 13788d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x40, 0x40); 13798d78602aSSrinivas Kandagatla /* 10 msec delay as per HW requirement */ 13808d78602aSSrinivas Kandagatla usleep_range(10000, 10010); 13818d78602aSSrinivas Kandagatla 13828d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_ANA_BIAS, 0x40, 0x00); 13838d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL, 13848d78602aSSrinivas Kandagatla 0xF0, 0x00); 13858d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW, 13868d78602aSSrinivas Kandagatla 0x1F, 0x15); 13878d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW, 13888d78602aSSrinivas Kandagatla 0x1F, 0x15); 13898d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_REFBUFF_UHQA_CTL, 13908d78602aSSrinivas Kandagatla 0xC0, 0x80); 13918d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_CDC_DMIC_CTL, 13928d78602aSSrinivas Kandagatla 0x02, 0x02); 13938d78602aSSrinivas Kandagatla 13948d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP, 13958d78602aSSrinivas Kandagatla 0xFF, 0x14); 13968d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP, 13978d78602aSSrinivas Kandagatla 0x1F, 0x08); 13988d78602aSSrinivas Kandagatla 13998d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_0, 0xFF, 0x55); 14008d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_1, 0xFF, 0x44); 14018d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_2, 0xFF, 0x11); 14028d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_3, 0xFF, 0x00); 14038d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_DIGITAL_TX_REQ_FB_CTL_4, 0xFF, 0x00); 14048d78602aSSrinivas Kandagatla 14058d78602aSSrinivas Kandagatla /* Set Noise Filter Resistor value */ 14068d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB1_TEST_CTL_1, 0xE0, 0xE0); 14078d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB2_TEST_CTL_1, 0xE0, 0xE0); 14088d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB3_TEST_CTL_1, 0xE0, 0xE0); 14098d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_MICB4_TEST_CTL_1, 0xE0, 0xE0); 14108d78602aSSrinivas Kandagatla 14118d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_TX_3_4_TEST_BLK_EN2, 0x01, 0x00); 14128d78602aSSrinivas Kandagatla regmap_update_bits(rm, WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); 14138d78602aSSrinivas Kandagatla 14148d78602aSSrinivas Kandagatla return 0; 14158d78602aSSrinivas Kandagatla 14168d78602aSSrinivas Kandagatla } 14178d78602aSSrinivas Kandagatla 1418e8ba1e05SSrinivas Kandagatla static int wcd938x_sdw_connect_port(struct wcd938x_sdw_ch_info *ch_info, 1419e8ba1e05SSrinivas Kandagatla struct sdw_port_config *port_config, 1420e8ba1e05SSrinivas Kandagatla u8 enable) 1421e8ba1e05SSrinivas Kandagatla { 1422e8ba1e05SSrinivas Kandagatla u8 ch_mask, port_num; 1423e8ba1e05SSrinivas Kandagatla 1424e8ba1e05SSrinivas Kandagatla port_num = ch_info->port_num; 1425e8ba1e05SSrinivas Kandagatla ch_mask = ch_info->ch_mask; 1426e8ba1e05SSrinivas Kandagatla 1427e8ba1e05SSrinivas Kandagatla port_config->num = port_num; 1428e8ba1e05SSrinivas Kandagatla 1429e8ba1e05SSrinivas Kandagatla if (enable) 1430e8ba1e05SSrinivas Kandagatla port_config->ch_mask |= ch_mask; 1431e8ba1e05SSrinivas Kandagatla else 1432e8ba1e05SSrinivas Kandagatla port_config->ch_mask &= ~ch_mask; 1433e8ba1e05SSrinivas Kandagatla 1434e8ba1e05SSrinivas Kandagatla return 0; 1435e8ba1e05SSrinivas Kandagatla } 1436e8ba1e05SSrinivas Kandagatla 1437c5c1546aSSrinivas Kandagatla static int wcd938x_connect_port(struct wcd938x_sdw_priv *wcd, u8 port_num, u8 ch_id, u8 enable) 1438e8ba1e05SSrinivas Kandagatla { 1439e8ba1e05SSrinivas Kandagatla return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], 1440c5c1546aSSrinivas Kandagatla &wcd->port_config[port_num - 1], 1441e8ba1e05SSrinivas Kandagatla enable); 1442e8ba1e05SSrinivas Kandagatla } 1443e8ba1e05SSrinivas Kandagatla 14448da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_rxclk(struct snd_soc_dapm_widget *w, 14458da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 14468da9db0cSSrinivas Kandagatla int event) 14478da9db0cSSrinivas Kandagatla { 14488da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 14498da9db0cSSrinivas Kandagatla 14508da9db0cSSrinivas Kandagatla switch (event) { 14518da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14528da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14538da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_CLK_EN_MASK, 1); 14548da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14558da9db0cSSrinivas Kandagatla WCD938X_RX_BIAS_EN_MASK, 1); 14568da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX0_CTL, 14578da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 14588da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX1_CTL, 14598da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 14608da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_RX2_CTL, 14618da9db0cSSrinivas Kandagatla WCD938X_DEM_DITHER_ENABLE_MASK, 0); 14628da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14638da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV2_CLK_EN_MASK, 1); 14648da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_AUX_AUXPA, 14658da9db0cSSrinivas Kandagatla WCD938X_AUXPA_CLK_EN_MASK, 1); 14668da9db0cSSrinivas Kandagatla break; 14678da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 14688da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14698da9db0cSSrinivas Kandagatla WCD938X_VNEG_EN_MASK, 0); 14708da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14718da9db0cSSrinivas Kandagatla WCD938X_VPOS_EN_MASK, 0); 14728da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 14738da9db0cSSrinivas Kandagatla WCD938X_RX_BIAS_EN_MASK, 0); 14748da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14758da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV2_CLK_EN_MASK, 0); 14768da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 14778da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_CLK_EN_MASK, 0); 14788da9db0cSSrinivas Kandagatla break; 14798da9db0cSSrinivas Kandagatla } 14808da9db0cSSrinivas Kandagatla return 0; 14818da9db0cSSrinivas Kandagatla } 14828da9db0cSSrinivas Kandagatla 14838da9db0cSSrinivas Kandagatla static int wcd938x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w, 14848da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 14858da9db0cSSrinivas Kandagatla int event) 14868da9db0cSSrinivas Kandagatla { 14878da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 14888da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 14898da9db0cSSrinivas Kandagatla 14908da9db0cSSrinivas Kandagatla switch (event) { 14918da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 14928da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14938da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 14948da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 0x01); 14958da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14968da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 14978da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 1); 14988da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 14998da9db0cSSrinivas Kandagatla WCD938X_HPH_RDAC_CLK_CTL1, 15008da9db0cSSrinivas Kandagatla WCD938X_CHOP_CLK_EN_MASK, 0); 15018da9db0cSSrinivas Kandagatla break; 15028da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 15038da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15048da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L, 15058da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x02); 15068da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) { 15078da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15088da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15098da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 1); 15108da9db0cSSrinivas Kandagatla /* 5msec compander delay as per HW requirement */ 15118da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable || (snd_soc_component_read(component, 15128da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x01)) 15138da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 15148da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 15158da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 0); 15168da9db0cSSrinivas Kandagatla } else { 15178da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15188da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15198da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 0); 15208da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15218da9db0cSSrinivas Kandagatla WCD938X_HPH_L_EN, 15228da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_MASK, 15238da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_REGISTER); 15248da9db0cSSrinivas Kandagatla 15258da9db0cSSrinivas Kandagatla } 15268da9db0cSSrinivas Kandagatla break; 15278da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 15288da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15298da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 15308da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x1); 15318da9db0cSSrinivas Kandagatla break; 15328da9db0cSSrinivas Kandagatla } 15338da9db0cSSrinivas Kandagatla 15348da9db0cSSrinivas Kandagatla return 0; 15358da9db0cSSrinivas Kandagatla } 15368da9db0cSSrinivas Kandagatla 15378da9db0cSSrinivas Kandagatla static int wcd938x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w, 15388da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 15398da9db0cSSrinivas Kandagatla int event) 15408da9db0cSSrinivas Kandagatla { 15418da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 15428da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 15438da9db0cSSrinivas Kandagatla 15448da9db0cSSrinivas Kandagatla switch (event) { 15458da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 15468da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15478da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 15488da9db0cSSrinivas Kandagatla WCD938X_RXD1_CLK_EN_MASK, 1); 15498da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15508da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 15518da9db0cSSrinivas Kandagatla WCD938X_HPHR_RX_EN_MASK, 1); 15528da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15538da9db0cSSrinivas Kandagatla WCD938X_HPH_RDAC_CLK_CTL1, 15548da9db0cSSrinivas Kandagatla WCD938X_CHOP_CLK_EN_MASK, 0); 15558da9db0cSSrinivas Kandagatla break; 15568da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 15578da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15588da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 15598da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x02); 15608da9db0cSSrinivas Kandagatla if (wcd938x->comp2_enable) { 15618da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15628da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15638da9db0cSSrinivas Kandagatla WCD938X_HPHR_COMP_EN_MASK, 1); 15648da9db0cSSrinivas Kandagatla /* 5msec compander delay as per HW requirement */ 15658da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable || 15668da9db0cSSrinivas Kandagatla (snd_soc_component_read(component, 15678da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0) & 0x02)) 15688da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 15698da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 15708da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 0); 15718da9db0cSSrinivas Kandagatla } else { 15728da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15738da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 15748da9db0cSSrinivas Kandagatla WCD938X_HPHR_COMP_EN_MASK, 0); 15758da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15768da9db0cSSrinivas Kandagatla WCD938X_HPH_R_EN, 15778da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_MASK, 15788da9db0cSSrinivas Kandagatla WCD938X_GAIN_SRC_SEL_REGISTER); 15798da9db0cSSrinivas Kandagatla } 15808da9db0cSSrinivas Kandagatla break; 15818da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 15828da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 15838da9db0cSSrinivas Kandagatla WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R, 15848da9db0cSSrinivas Kandagatla WCD938X_HPH_RES_DIV_MASK, 0x01); 15858da9db0cSSrinivas Kandagatla break; 15868da9db0cSSrinivas Kandagatla } 15878da9db0cSSrinivas Kandagatla 15888da9db0cSSrinivas Kandagatla return 0; 15898da9db0cSSrinivas Kandagatla } 15908da9db0cSSrinivas Kandagatla 15918da9db0cSSrinivas Kandagatla static int wcd938x_codec_ear_dac_event(struct snd_soc_dapm_widget *w, 15928da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 15938da9db0cSSrinivas Kandagatla int event) 15948da9db0cSSrinivas Kandagatla { 15958da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 15968da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 15978da9db0cSSrinivas Kandagatla 15988da9db0cSSrinivas Kandagatla switch (event) { 15998da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 16008da9db0cSSrinivas Kandagatla wcd938x->ear_rx_path = 16018da9db0cSSrinivas Kandagatla snd_soc_component_read( 16028da9db0cSSrinivas Kandagatla component, WCD938X_DIGITAL_CDC_EAR_PATH_CTL); 16038da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { 16048da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16058da9db0cSSrinivas Kandagatla WCD938X_EAR_EAR_DAC_CON, 16068da9db0cSSrinivas Kandagatla WCD938X_DAC_SAMPLE_EDGE_SEL_MASK, 0); 16078da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16088da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 16098da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 1); 16108da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16118da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16128da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 1); 16138da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16148da9db0cSSrinivas Kandagatla WCD938X_ANA_EAR_COMPANDER_CTL, 16158da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 1); 16168da9db0cSSrinivas Kandagatla } else { 16178da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16188da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 16198da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 1); 16208da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16218da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16228da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 1); 16238da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) 16248da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16258da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 16268da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 1); 16278da9db0cSSrinivas Kandagatla } 16288da9db0cSSrinivas Kandagatla /* 5 msec delay as per HW requirement */ 16298da9db0cSSrinivas Kandagatla usleep_range(5000, 5010); 16308da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 16318da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 16328da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 0); 16338da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable++; 16348da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 16358da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_PRE_DAC, 16368da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_EAR, 16378da9db0cSSrinivas Kandagatla wcd938x->hph_mode); 16388da9db0cSSrinivas Kandagatla break; 16398da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 16408da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { 16418da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16428da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 16438da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 0); 16448da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16458da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16468da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 0); 16478da9db0cSSrinivas Kandagatla } else { 16488da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16498da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_HPH_GAIN_CTL, 16508da9db0cSSrinivas Kandagatla WCD938X_HPHL_RX_EN_MASK, 0); 16518da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16528da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16538da9db0cSSrinivas Kandagatla WCD938X_RXD0_CLK_EN_MASK, 0); 16548da9db0cSSrinivas Kandagatla if (wcd938x->comp1_enable) 16558da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16568da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_COMP_CTL_0, 16578da9db0cSSrinivas Kandagatla WCD938X_HPHL_COMP_EN_MASK, 0); 16588da9db0cSSrinivas Kandagatla } 16598da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 16608da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 0); 16618da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16628da9db0cSSrinivas Kandagatla WCD938X_EAR_EAR_DAC_CON, 16638da9db0cSSrinivas Kandagatla WCD938X_DAC_SAMPLE_EDGE_SEL_MASK, 1); 16648da9db0cSSrinivas Kandagatla break; 16658da9db0cSSrinivas Kandagatla } 16668da9db0cSSrinivas Kandagatla return 0; 16678da9db0cSSrinivas Kandagatla 16688da9db0cSSrinivas Kandagatla } 16698da9db0cSSrinivas Kandagatla 16708da9db0cSSrinivas Kandagatla static int wcd938x_codec_aux_dac_event(struct snd_soc_dapm_widget *w, 16718da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 16728da9db0cSSrinivas Kandagatla int event) 16738da9db0cSSrinivas Kandagatla { 16748da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 16758da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 16768da9db0cSSrinivas Kandagatla 16778da9db0cSSrinivas Kandagatla switch (event) { 16788da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 16798da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16808da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 16818da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV4_CLK_EN_MASK, 1); 16828da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16838da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 16848da9db0cSSrinivas Kandagatla WCD938X_RXD2_CLK_EN_MASK, 1); 16858da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16868da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AUX_GAIN_CTL, 16878da9db0cSSrinivas Kandagatla WCD938X_AUX_EN_MASK, 1); 16888da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 16898da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 16908da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 0); 16918da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable++; 16928da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 16938da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_PRE_DAC, 16948da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_AUX, 16958da9db0cSSrinivas Kandagatla wcd938x->hph_mode); 16968da9db0cSSrinivas Kandagatla break; 16978da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 16988da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 16998da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 17008da9db0cSSrinivas Kandagatla WCD938X_ANA_RX_DIV4_CLK_EN_MASK, 0); 17018da9db0cSSrinivas Kandagatla break; 17028da9db0cSSrinivas Kandagatla } 17034d0b79ecSkernel test robot return 0; 17048da9db0cSSrinivas Kandagatla 17058da9db0cSSrinivas Kandagatla } 17068da9db0cSSrinivas Kandagatla 17078da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, 17088da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 17098da9db0cSSrinivas Kandagatla { 17108da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 17118da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 17128da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 17138da9db0cSSrinivas Kandagatla 17148da9db0cSSrinivas Kandagatla switch (event) { 17158da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 17168da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 17178da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 17188da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 1); 17198da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, 17208da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHR, hph_mode); 17218da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); 17228da9db0cSSrinivas Kandagatla 17238da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 17248da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) { 17258da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 17268da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 17278da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 1); 17288da9db0cSSrinivas Kandagatla } 17298da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 17308da9db0cSSrinivas Kandagatla WCD938X_HPHR_REF_EN_MASK, 1); 17318da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); 17328da9db0cSSrinivas Kandagatla /* 100 usec delay as per HW requirement */ 17338da9db0cSSrinivas Kandagatla usleep_range(100, 110); 17348da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17358da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 17368da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL1, 17378da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 17388da9db0cSSrinivas Kandagatla break; 17398da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 17408da9db0cSSrinivas Kandagatla /* 17418da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 17428da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 17438da9db0cSSrinivas Kandagatla * 20ms delay is required. 17448da9db0cSSrinivas Kandagatla */ 17458da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 17468da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 17478da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 17488da9db0cSSrinivas Kandagatla else 17498da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 17508da9db0cSSrinivas Kandagatla 17518da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 17528da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) 17538da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 17548da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 17558da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 0); 17568da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17578da9db0cSSrinivas Kandagatla } 17588da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 17598da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 1); 17608da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 17618da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 17628da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 17638da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 17648da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 17658da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphr_pdm_wd_int); 17668da9db0cSSrinivas Kandagatla break; 17678da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 17688da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 17698da9db0cSSrinivas Kandagatla /* 17708da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 17718da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 17728da9db0cSSrinivas Kandagatla * 20ms delay is required. 17738da9db0cSSrinivas Kandagatla */ 17748da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 17758da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 17768da9db0cSSrinivas Kandagatla else 17778da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 17788da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 17798da9db0cSSrinivas Kandagatla WCD938X_HPHR_EN_MASK, 0); 1780bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 1781bcee7ed0SSrinivas Kandagatla WCD_EVENT_PRE_HPHR_PA_OFF); 17828da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17838da9db0cSSrinivas Kandagatla break; 17848da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 17858da9db0cSSrinivas Kandagatla /* 17868da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 17878da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 17888da9db0cSSrinivas Kandagatla * 20ms delay is required. 17898da9db0cSSrinivas Kandagatla */ 17908da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 17918da9db0cSSrinivas Kandagatla if (!wcd938x->comp2_enable) 17928da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 17938da9db0cSSrinivas Kandagatla else 17948da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 17958da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 17968da9db0cSSrinivas Kandagatla } 1797bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 1798bcee7ed0SSrinivas Kandagatla WCD_EVENT_POST_HPHR_PA_OFF); 17998da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 18008da9db0cSSrinivas Kandagatla WCD938X_HPHR_REF_EN_MASK, 0); 18018da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL1, 18028da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 18038da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 18048da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHR, hph_mode); 18058da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 18068da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 18078da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 0); 18088da9db0cSSrinivas Kandagatla break; 18098da9db0cSSrinivas Kandagatla } 18108da9db0cSSrinivas Kandagatla 18118da9db0cSSrinivas Kandagatla return 0; 18128da9db0cSSrinivas Kandagatla } 18138da9db0cSSrinivas Kandagatla 18148da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, 18158da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 18168da9db0cSSrinivas Kandagatla { 18178da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 18188da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 18198da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 18208da9db0cSSrinivas Kandagatla 18218da9db0cSSrinivas Kandagatla switch (event) { 18228da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 18238da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 18248da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 18258da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 1); 18268da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, 18278da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHL, hph_mode); 18288da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); 18298da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 18308da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) { 18318da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 18328da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 18338da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 1); 18348da9db0cSSrinivas Kandagatla } 18358da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 18368da9db0cSSrinivas Kandagatla WCD938X_HPHL_REF_EN_MASK, 1); 18378da9db0cSSrinivas Kandagatla wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); 18388da9db0cSSrinivas Kandagatla /* 100 usec delay as per HW requirement */ 18398da9db0cSSrinivas Kandagatla usleep_range(100, 110); 18408da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 18418da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 18428da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL0, 18438da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 18448da9db0cSSrinivas Kandagatla break; 18458da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 18468da9db0cSSrinivas Kandagatla /* 18478da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 18488da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 18498da9db0cSSrinivas Kandagatla * 20ms delay is required. 18508da9db0cSSrinivas Kandagatla */ 18518da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 18528da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 18538da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 18548da9db0cSSrinivas Kandagatla else 18558da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 18568da9db0cSSrinivas Kandagatla if (hph_mode == CLS_H_LP || hph_mode == CLS_H_LOHIFI || 18578da9db0cSSrinivas Kandagatla hph_mode == CLS_H_ULP) 18588da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 18598da9db0cSSrinivas Kandagatla WCD938X_HPH_REFBUFF_LP_CTL, 18608da9db0cSSrinivas Kandagatla WCD938X_PREREF_FLIT_BYPASS_MASK, 0); 18618da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 18628da9db0cSSrinivas Kandagatla } 18638da9db0cSSrinivas Kandagatla 18648da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_NEW_INT_HPH_TIMER1, 18658da9db0cSSrinivas Kandagatla WCD938X_AUTOCHOP_TIMER_EN, 1); 18668da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 18678da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 18688da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 18698da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 18708da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 18718da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphl_pdm_wd_int); 18728da9db0cSSrinivas Kandagatla break; 18738da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 18748da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 18758da9db0cSSrinivas Kandagatla /* 18768da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 18778da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 18788da9db0cSSrinivas Kandagatla * 20ms delay is required. 18798da9db0cSSrinivas Kandagatla */ 18808da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 18818da9db0cSSrinivas Kandagatla usleep_range(20000, 20100); 18828da9db0cSSrinivas Kandagatla else 18838da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 18848da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 18858da9db0cSSrinivas Kandagatla WCD938X_HPHL_EN_MASK, 0); 1886bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF); 18878da9db0cSSrinivas Kandagatla set_bit(HPH_PA_DELAY, &wcd938x->status_mask); 18888da9db0cSSrinivas Kandagatla break; 18898da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 18908da9db0cSSrinivas Kandagatla /* 18918da9db0cSSrinivas Kandagatla * 7ms sleep is required if compander is enabled as per 18928da9db0cSSrinivas Kandagatla * HW requirement. If compander is disabled, then 18938da9db0cSSrinivas Kandagatla * 20ms delay is required. 18948da9db0cSSrinivas Kandagatla */ 18958da9db0cSSrinivas Kandagatla if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { 18968da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 18978da9db0cSSrinivas Kandagatla usleep_range(21000, 21100); 18988da9db0cSSrinivas Kandagatla else 18998da9db0cSSrinivas Kandagatla usleep_range(7000, 7100); 19008da9db0cSSrinivas Kandagatla clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); 19018da9db0cSSrinivas Kandagatla } 1902bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 1903bcee7ed0SSrinivas Kandagatla WCD_EVENT_POST_HPHL_PA_OFF); 19048da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_HPH, 19058da9db0cSSrinivas Kandagatla WCD938X_HPHL_REF_EN_MASK, 0); 19068da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL0, 19078da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 19088da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 19098da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_HPHL, hph_mode); 19108da9db0cSSrinivas Kandagatla if (wcd938x->ldoh) 19118da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_LDOH_MODE, 19128da9db0cSSrinivas Kandagatla WCD938X_LDOH_EN_MASK, 0); 19138da9db0cSSrinivas Kandagatla break; 19148da9db0cSSrinivas Kandagatla } 19158da9db0cSSrinivas Kandagatla 19168da9db0cSSrinivas Kandagatla return 0; 19178da9db0cSSrinivas Kandagatla } 19188da9db0cSSrinivas Kandagatla 19198da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, 19208da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 19218da9db0cSSrinivas Kandagatla { 19228da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 19238da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 19248da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 19258da9db0cSSrinivas Kandagatla 19268da9db0cSSrinivas Kandagatla switch (event) { 19278da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 19288da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 19298da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 1); 19308da9db0cSSrinivas Kandagatla break; 19318da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 19328da9db0cSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 19338da9db0cSSrinivas Kandagatla usleep_range(1000, 1010); 19348da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 19358da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 19368da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 19378da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 19388da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 19398da9db0cSSrinivas Kandagatla enable_irq(wcd938x->aux_pdm_wd_int); 19408da9db0cSSrinivas Kandagatla break; 19418da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 19428da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 19438da9db0cSSrinivas Kandagatla break; 19448da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 19458da9db0cSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 19468da9db0cSSrinivas Kandagatla usleep_range(1000, 1010); 19478da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 19488da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 0); 19498da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, 19508da9db0cSSrinivas Kandagatla WCD_CLSH_EVENT_POST_PA, 19518da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_AUX, 19528da9db0cSSrinivas Kandagatla hph_mode); 19538da9db0cSSrinivas Kandagatla 19548da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable--; 19558da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 19568da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 19578da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 1); 19588da9db0cSSrinivas Kandagatla break; 19598da9db0cSSrinivas Kandagatla } 19604d0b79ecSkernel test robot return 0; 19618da9db0cSSrinivas Kandagatla } 19628da9db0cSSrinivas Kandagatla 19638da9db0cSSrinivas Kandagatla static int wcd938x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, 19648da9db0cSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 19658da9db0cSSrinivas Kandagatla { 19668da9db0cSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 19678da9db0cSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 19688da9db0cSSrinivas Kandagatla int hph_mode = wcd938x->hph_mode; 19698da9db0cSSrinivas Kandagatla 19708da9db0cSSrinivas Kandagatla switch (event) { 19718da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 19728da9db0cSSrinivas Kandagatla /* 19738da9db0cSSrinivas Kandagatla * Enable watchdog interrupt for HPHL or AUX 19748da9db0cSSrinivas Kandagatla * depending on mux value 19758da9db0cSSrinivas Kandagatla */ 19768da9db0cSSrinivas Kandagatla wcd938x->ear_rx_path = snd_soc_component_read(component, 19778da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_CDC_EAR_PATH_CTL); 19788da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 19798da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 19808da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 1); 19818da9db0cSSrinivas Kandagatla else 19828da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 19838da9db0cSSrinivas Kandagatla WCD938X_DIGITAL_PDM_WD_CTL0, 19848da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0x3); 19858da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 19868da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, 19878da9db0cSSrinivas Kandagatla WCD938X_ANA_EAR_COMPANDER_CTL, 19888da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 1); 19898da9db0cSSrinivas Kandagatla 19908da9db0cSSrinivas Kandagatla break; 19918da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 19928da9db0cSSrinivas Kandagatla /* 6 msec delay as per HW requirement */ 19938da9db0cSSrinivas Kandagatla usleep_range(6000, 6010); 19948da9db0cSSrinivas Kandagatla if (hph_mode == CLS_AB || hph_mode == CLS_AB_HIFI || 19958da9db0cSSrinivas Kandagatla hph_mode == CLS_AB_LP || hph_mode == CLS_AB_LOHIFI) 19968da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_RX_SUPPLIES, 19978da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_MASK, 19988da9db0cSSrinivas Kandagatla WCD938X_REGULATOR_MODE_CLASS_AB); 19998da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 20008da9db0cSSrinivas Kandagatla enable_irq(wcd938x->aux_pdm_wd_int); 20018da9db0cSSrinivas Kandagatla else 20028da9db0cSSrinivas Kandagatla enable_irq(wcd938x->hphl_pdm_wd_int); 20038da9db0cSSrinivas Kandagatla break; 20048da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMD: 20058da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 20068da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 20078da9db0cSSrinivas Kandagatla else 20088da9db0cSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 20098da9db0cSSrinivas Kandagatla break; 20108da9db0cSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 20118da9db0cSSrinivas Kandagatla if (!wcd938x->comp1_enable) 20128da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 20138da9db0cSSrinivas Kandagatla WCD938X_GAIN_OVRD_REG_MASK, 0); 20148da9db0cSSrinivas Kandagatla /* 7 msec delay as per HW requirement */ 20158da9db0cSSrinivas Kandagatla usleep_range(7000, 7010); 20168da9db0cSSrinivas Kandagatla if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) 20178da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL2, 20188da9db0cSSrinivas Kandagatla WCD938X_AUX_PDM_WD_EN_MASK, 0); 20198da9db0cSSrinivas Kandagatla else 20208da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_PDM_WD_CTL0, 20218da9db0cSSrinivas Kandagatla WCD938X_PDM_WD_EN_MASK, 0); 20228da9db0cSSrinivas Kandagatla 20238da9db0cSSrinivas Kandagatla wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, 20248da9db0cSSrinivas Kandagatla WCD_CLSH_STATE_EAR, hph_mode); 20258da9db0cSSrinivas Kandagatla 20268da9db0cSSrinivas Kandagatla wcd938x->flyback_cur_det_disable--; 20278da9db0cSSrinivas Kandagatla if (wcd938x->flyback_cur_det_disable == 0) 20288da9db0cSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_FLYBACK_EN, 20298da9db0cSSrinivas Kandagatla WCD938X_EN_CUR_DET_MASK, 1); 20308da9db0cSSrinivas Kandagatla break; 20318da9db0cSSrinivas Kandagatla } 20328da9db0cSSrinivas Kandagatla 20338da9db0cSSrinivas Kandagatla return 0; 20348da9db0cSSrinivas Kandagatla } 20358da9db0cSSrinivas Kandagatla 2036d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_dmic(struct snd_soc_dapm_widget *w, 2037d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 2038d5add08fSSrinivas Kandagatla int event) 2039d5add08fSSrinivas Kandagatla { 2040d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2041d5add08fSSrinivas Kandagatla u16 dmic_clk_reg, dmic_clk_en_reg; 2042d5add08fSSrinivas Kandagatla u8 dmic_sel_mask, dmic_clk_mask; 2043d5add08fSSrinivas Kandagatla 2044d5add08fSSrinivas Kandagatla switch (w->shift) { 2045d5add08fSSrinivas Kandagatla case 0: 2046d5add08fSSrinivas Kandagatla case 1: 2047d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2; 2048d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC1_CTL; 2049d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC1_RATE_MASK; 2050d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC1_IN_SEL_MASK; 2051d5add08fSSrinivas Kandagatla break; 2052d5add08fSSrinivas Kandagatla case 2: 2053d5add08fSSrinivas Kandagatla case 3: 2054d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_1_2; 2055d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC2_CTL; 2056d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC2_RATE_MASK; 2057d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC3_IN_SEL_MASK; 2058d5add08fSSrinivas Kandagatla break; 2059d5add08fSSrinivas Kandagatla case 4: 2060d5add08fSSrinivas Kandagatla case 5: 2061d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_3_4; 2062d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC3_CTL; 2063d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC3_RATE_MASK; 2064d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC4_IN_SEL_MASK; 2065d5add08fSSrinivas Kandagatla break; 2066d5add08fSSrinivas Kandagatla case 6: 2067d5add08fSSrinivas Kandagatla case 7: 2068d5add08fSSrinivas Kandagatla dmic_clk_reg = WCD938X_DIGITAL_CDC_DMIC_RATE_3_4; 2069d5add08fSSrinivas Kandagatla dmic_clk_en_reg = WCD938X_DIGITAL_CDC_DMIC4_CTL; 2070d5add08fSSrinivas Kandagatla dmic_clk_mask = WCD938X_DMIC4_RATE_MASK; 2071d5add08fSSrinivas Kandagatla dmic_sel_mask = WCD938X_AMIC5_IN_SEL_MASK; 2072d5add08fSSrinivas Kandagatla break; 2073d5add08fSSrinivas Kandagatla default: 2074d5add08fSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid DMIC Selection\n", 2075d5add08fSSrinivas Kandagatla __func__); 2076d5add08fSSrinivas Kandagatla return -EINVAL; 2077d5add08fSSrinivas Kandagatla } 2078d5add08fSSrinivas Kandagatla 2079d5add08fSSrinivas Kandagatla switch (event) { 2080d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2081d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2082d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AMIC_CTL, 2083d5add08fSSrinivas Kandagatla dmic_sel_mask, 2084d5add08fSSrinivas Kandagatla WCD938X_AMIC1_IN_SEL_DMIC); 2085d5add08fSSrinivas Kandagatla /* 250us sleep as per HW requirement */ 2086d5add08fSSrinivas Kandagatla usleep_range(250, 260); 2087d5add08fSSrinivas Kandagatla /* Setting DMIC clock rate to 2.4MHz */ 2088d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, dmic_clk_reg, 2089d5add08fSSrinivas Kandagatla dmic_clk_mask, 2090d5add08fSSrinivas Kandagatla WCD938X_DMIC4_RATE_2P4MHZ); 2091d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, dmic_clk_en_reg, 2092d5add08fSSrinivas Kandagatla WCD938X_DMIC_CLK_EN_MASK, 1); 2093d5add08fSSrinivas Kandagatla /* enable clock scaling */ 2094d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_DMIC_CTL, 2095d5add08fSSrinivas Kandagatla WCD938X_DMIC_CLK_SCALING_EN_MASK, 0x3); 2096d5add08fSSrinivas Kandagatla break; 2097d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2098d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2099d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_AMIC_CTL, 2100d5add08fSSrinivas Kandagatla dmic_sel_mask, WCD938X_AMIC1_IN_SEL_AMIC); 2101d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, dmic_clk_en_reg, 2102d5add08fSSrinivas Kandagatla WCD938X_DMIC_CLK_EN_MASK, 0); 2103d5add08fSSrinivas Kandagatla break; 2104d5add08fSSrinivas Kandagatla } 2105d5add08fSSrinivas Kandagatla return 0; 2106d5add08fSSrinivas Kandagatla } 2107d5add08fSSrinivas Kandagatla 2108d5add08fSSrinivas Kandagatla static int wcd938x_tx_swr_ctrl(struct snd_soc_dapm_widget *w, 2109d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 2110d5add08fSSrinivas Kandagatla { 2111d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2112d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2113d5add08fSSrinivas Kandagatla int bank; 2114d5add08fSSrinivas Kandagatla int rate; 2115d5add08fSSrinivas Kandagatla 2116d5add08fSSrinivas Kandagatla bank = (wcd938x_swr_get_current_bank(wcd938x->sdw_priv[AIF1_CAP]->sdev)) ? 0 : 1; 2117d5add08fSSrinivas Kandagatla bank = bank ? 0 : 1; 2118d5add08fSSrinivas Kandagatla 2119d5add08fSSrinivas Kandagatla switch (event) { 2120d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2121d5add08fSSrinivas Kandagatla if (strnstr(w->name, "ADC", sizeof("ADC"))) { 2122d5add08fSSrinivas Kandagatla int i = 0, mode = 0; 2123d5add08fSSrinivas Kandagatla 2124d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC1, &wcd938x->status_mask)) 2125d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC1]]; 2126d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC2, &wcd938x->status_mask)) 2127d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC2]]; 2128d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC3, &wcd938x->status_mask)) 2129d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC3]]; 2130d5add08fSSrinivas Kandagatla if (test_bit(WCD_ADC4, &wcd938x->status_mask)) 2131d5add08fSSrinivas Kandagatla mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC4]]; 2132d5add08fSSrinivas Kandagatla 2133d5add08fSSrinivas Kandagatla if (mode != 0) { 2134d5add08fSSrinivas Kandagatla for (i = 0; i < ADC_MODE_ULP2; i++) { 2135d5add08fSSrinivas Kandagatla if (mode & (1 << i)) { 2136d5add08fSSrinivas Kandagatla i++; 2137d5add08fSSrinivas Kandagatla break; 2138d5add08fSSrinivas Kandagatla } 2139d5add08fSSrinivas Kandagatla } 2140d5add08fSSrinivas Kandagatla } 2141d5add08fSSrinivas Kandagatla rate = wcd938x_get_clk_rate(i); 2142d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, bank); 2143d5add08fSSrinivas Kandagatla /* Copy clk settings to active bank */ 2144d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, !bank); 2145d245fff1SSrinivas Kandagatla } 2146d5add08fSSrinivas Kandagatla break; 2147d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2148d5add08fSSrinivas Kandagatla if (strnstr(w->name, "ADC", sizeof("ADC"))) { 2149d5add08fSSrinivas Kandagatla rate = wcd938x_get_clk_rate(ADC_MODE_INVALID); 2150d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, !bank); 2151d5add08fSSrinivas Kandagatla wcd938x_set_swr_clk_rate(component, rate, bank); 2152d5add08fSSrinivas Kandagatla } 2153d5add08fSSrinivas Kandagatla break; 2154d5add08fSSrinivas Kandagatla } 2155d5add08fSSrinivas Kandagatla 2156d5add08fSSrinivas Kandagatla return 0; 2157d5add08fSSrinivas Kandagatla } 2158d5add08fSSrinivas Kandagatla 2159d5add08fSSrinivas Kandagatla static int wcd938x_get_adc_mode(int val) 2160d5add08fSSrinivas Kandagatla { 2161d5add08fSSrinivas Kandagatla int ret = 0; 2162d5add08fSSrinivas Kandagatla 2163d5add08fSSrinivas Kandagatla switch (val) { 2164d5add08fSSrinivas Kandagatla case ADC_MODE_INVALID: 2165d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_NORMAL; 2166d5add08fSSrinivas Kandagatla break; 2167d5add08fSSrinivas Kandagatla case ADC_MODE_HIFI: 2168d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_HIFI; 2169d5add08fSSrinivas Kandagatla break; 2170d5add08fSSrinivas Kandagatla case ADC_MODE_LO_HIF: 2171d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_LO_HIF; 2172d5add08fSSrinivas Kandagatla break; 2173d5add08fSSrinivas Kandagatla case ADC_MODE_NORMAL: 2174d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_NORMAL; 2175d5add08fSSrinivas Kandagatla break; 2176d5add08fSSrinivas Kandagatla case ADC_MODE_LP: 2177d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_LP; 2178d5add08fSSrinivas Kandagatla break; 2179d5add08fSSrinivas Kandagatla case ADC_MODE_ULP1: 2180d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_ULP1; 2181d5add08fSSrinivas Kandagatla break; 2182d5add08fSSrinivas Kandagatla case ADC_MODE_ULP2: 2183d5add08fSSrinivas Kandagatla ret = ADC_MODE_VAL_ULP2; 2184d5add08fSSrinivas Kandagatla break; 2185d5add08fSSrinivas Kandagatla default: 2186d5add08fSSrinivas Kandagatla ret = -EINVAL; 2187d5add08fSSrinivas Kandagatla break; 2188d5add08fSSrinivas Kandagatla } 2189d5add08fSSrinivas Kandagatla return ret; 2190d5add08fSSrinivas Kandagatla } 2191d5add08fSSrinivas Kandagatla 2192d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_adc(struct snd_soc_dapm_widget *w, 2193d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 2194d5add08fSSrinivas Kandagatla { 2195d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2196d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2197d5add08fSSrinivas Kandagatla 2198d5add08fSSrinivas Kandagatla switch (event) { 2199d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2200d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2201d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2202d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_CLK_EN_MASK, 1); 2203d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2204d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2205d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_DIV2_CLK_EN_MASK, 1); 2206d5add08fSSrinivas Kandagatla set_bit(w->shift, &wcd938x->status_mask); 2207d5add08fSSrinivas Kandagatla break; 2208d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2209d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2210d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_CLK_EN_MASK, 0); 2211d5add08fSSrinivas Kandagatla clear_bit(w->shift, &wcd938x->status_mask); 2212d5add08fSSrinivas Kandagatla break; 2213d5add08fSSrinivas Kandagatla } 2214d5add08fSSrinivas Kandagatla 2215d5add08fSSrinivas Kandagatla return 0; 2216d5add08fSSrinivas Kandagatla } 2217d5add08fSSrinivas Kandagatla 2218d5add08fSSrinivas Kandagatla static void wcd938x_tx_channel_config(struct snd_soc_component *component, 2219d5add08fSSrinivas Kandagatla int channel, int mode) 2220d5add08fSSrinivas Kandagatla { 2221d5add08fSSrinivas Kandagatla int reg, mask; 2222d5add08fSSrinivas Kandagatla 2223d5add08fSSrinivas Kandagatla switch (channel) { 2224d5add08fSSrinivas Kandagatla case 0: 2225d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH2; 2226d5add08fSSrinivas Kandagatla mask = WCD938X_HPF1_INIT_MASK; 2227d5add08fSSrinivas Kandagatla break; 2228d5add08fSSrinivas Kandagatla case 1: 2229d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH2; 2230d5add08fSSrinivas Kandagatla mask = WCD938X_HPF2_INIT_MASK; 2231d5add08fSSrinivas Kandagatla break; 2232d5add08fSSrinivas Kandagatla case 2: 2233d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH4; 2234d5add08fSSrinivas Kandagatla mask = WCD938X_HPF3_INIT_MASK; 2235d5add08fSSrinivas Kandagatla break; 2236d5add08fSSrinivas Kandagatla case 3: 2237d5add08fSSrinivas Kandagatla reg = WCD938X_ANA_TX_CH4; 2238d5add08fSSrinivas Kandagatla mask = WCD938X_HPF4_INIT_MASK; 2239d5add08fSSrinivas Kandagatla break; 2240d245fff1SSrinivas Kandagatla default: 2241d245fff1SSrinivas Kandagatla return; 2242d5add08fSSrinivas Kandagatla } 2243d5add08fSSrinivas Kandagatla 2244d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, reg, mask, mode); 2245d5add08fSSrinivas Kandagatla } 2246d5add08fSSrinivas Kandagatla 2247d5add08fSSrinivas Kandagatla static int wcd938x_adc_enable_req(struct snd_soc_dapm_widget *w, 2248d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, int event) 2249d5add08fSSrinivas Kandagatla { 2250d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2251d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2252d5add08fSSrinivas Kandagatla int mode; 2253d5add08fSSrinivas Kandagatla 2254d5add08fSSrinivas Kandagatla switch (event) { 2255d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2256d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2257d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_REQ_CTL, 2258d5add08fSSrinivas Kandagatla WCD938X_FS_RATE_4P8_MASK, 1); 2259d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2260d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_REQ_CTL, 2261d5add08fSSrinivas Kandagatla WCD938X_NO_NOTCH_MASK, 0); 2262d5add08fSSrinivas Kandagatla wcd938x_tx_channel_config(component, w->shift, 1); 2263d5add08fSSrinivas Kandagatla mode = wcd938x_get_adc_mode(wcd938x->tx_mode[w->shift]); 2264d5add08fSSrinivas Kandagatla if (mode < 0) { 2265d5add08fSSrinivas Kandagatla dev_info(component->dev, "Invalid ADC mode\n"); 2266d5add08fSSrinivas Kandagatla return -EINVAL; 2267d5add08fSSrinivas Kandagatla } 2268d5add08fSSrinivas Kandagatla switch (w->shift) { 2269d5add08fSSrinivas Kandagatla case 0: 2270d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2271d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2272d5add08fSSrinivas Kandagatla WCD938X_TXD0_MODE_MASK, mode); 2273d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2274d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2275d5add08fSSrinivas Kandagatla WCD938X_TXD0_CLK_EN_MASK, 1); 2276d5add08fSSrinivas Kandagatla break; 2277d5add08fSSrinivas Kandagatla case 1: 2278d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2279d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2280d5add08fSSrinivas Kandagatla WCD938X_TXD1_MODE_MASK, mode); 2281d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2282d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2283d5add08fSSrinivas Kandagatla WCD938X_TXD1_CLK_EN_MASK, 1); 2284d5add08fSSrinivas Kandagatla break; 2285d5add08fSSrinivas Kandagatla case 2: 2286d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2287d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2288d5add08fSSrinivas Kandagatla WCD938X_TXD2_MODE_MASK, mode); 2289d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2290d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2291d5add08fSSrinivas Kandagatla WCD938X_TXD2_CLK_EN_MASK, 1); 2292d5add08fSSrinivas Kandagatla break; 2293d5add08fSSrinivas Kandagatla case 3: 2294d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2295d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2296d5add08fSSrinivas Kandagatla WCD938X_TXD3_MODE_MASK, mode); 2297d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2298d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2299d5add08fSSrinivas Kandagatla WCD938X_TXD3_CLK_EN_MASK, 1); 2300d5add08fSSrinivas Kandagatla break; 2301d5add08fSSrinivas Kandagatla default: 2302d5add08fSSrinivas Kandagatla break; 2303d5add08fSSrinivas Kandagatla } 2304d5add08fSSrinivas Kandagatla 2305d5add08fSSrinivas Kandagatla wcd938x_tx_channel_config(component, w->shift, 0); 2306d5add08fSSrinivas Kandagatla break; 2307d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2308d5add08fSSrinivas Kandagatla switch (w->shift) { 2309d5add08fSSrinivas Kandagatla case 0: 2310d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2311d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2312d5add08fSSrinivas Kandagatla WCD938X_TXD0_MODE_MASK, 0); 2313d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2314d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2315d5add08fSSrinivas Kandagatla WCD938X_TXD0_CLK_EN_MASK, 0); 2316d5add08fSSrinivas Kandagatla break; 2317d5add08fSSrinivas Kandagatla case 1: 2318d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2319d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1, 2320d5add08fSSrinivas Kandagatla WCD938X_TXD1_MODE_MASK, 0); 2321d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2322d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2323d5add08fSSrinivas Kandagatla WCD938X_TXD1_CLK_EN_MASK, 0); 2324d5add08fSSrinivas Kandagatla break; 2325d5add08fSSrinivas Kandagatla case 2: 2326d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2327d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2328d5add08fSSrinivas Kandagatla WCD938X_TXD2_MODE_MASK, 0); 2329d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2330d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2331d5add08fSSrinivas Kandagatla WCD938X_TXD2_CLK_EN_MASK, 0); 2332d5add08fSSrinivas Kandagatla break; 2333d5add08fSSrinivas Kandagatla case 3: 2334d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2335d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3, 2336d5add08fSSrinivas Kandagatla WCD938X_TXD3_MODE_MASK, 0); 2337d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2338d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2339d5add08fSSrinivas Kandagatla WCD938X_TXD3_CLK_EN_MASK, 0); 2340d5add08fSSrinivas Kandagatla break; 2341d5add08fSSrinivas Kandagatla default: 2342d5add08fSSrinivas Kandagatla break; 2343d5add08fSSrinivas Kandagatla } 2344d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2345d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2346d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_DIV2_CLK_EN_MASK, 0); 2347d5add08fSSrinivas Kandagatla break; 2348d5add08fSSrinivas Kandagatla } 2349d5add08fSSrinivas Kandagatla 2350d5add08fSSrinivas Kandagatla return 0; 2351d5add08fSSrinivas Kandagatla } 2352d5add08fSSrinivas Kandagatla 2353d5add08fSSrinivas Kandagatla static int wcd938x_micbias_control(struct snd_soc_component *component, 2354d5add08fSSrinivas Kandagatla int micb_num, int req, bool is_dapm) 2355d5add08fSSrinivas Kandagatla { 2356d5add08fSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2357d5add08fSSrinivas Kandagatla int micb_index = micb_num - 1; 2358d5add08fSSrinivas Kandagatla u16 micb_reg; 2359d5add08fSSrinivas Kandagatla 2360d5add08fSSrinivas Kandagatla switch (micb_num) { 2361d5add08fSSrinivas Kandagatla case MIC_BIAS_1: 2362d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB1; 2363d5add08fSSrinivas Kandagatla break; 2364d5add08fSSrinivas Kandagatla case MIC_BIAS_2: 2365d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB2; 2366d5add08fSSrinivas Kandagatla break; 2367d5add08fSSrinivas Kandagatla case MIC_BIAS_3: 2368d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB3; 2369d5add08fSSrinivas Kandagatla break; 2370d5add08fSSrinivas Kandagatla case MIC_BIAS_4: 2371d5add08fSSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB4; 2372d5add08fSSrinivas Kandagatla break; 2373d5add08fSSrinivas Kandagatla default: 2374d5add08fSSrinivas Kandagatla dev_err(component->dev, "%s: Invalid micbias number: %d\n", 2375d5add08fSSrinivas Kandagatla __func__, micb_num); 2376d5add08fSSrinivas Kandagatla return -EINVAL; 2377d5add08fSSrinivas Kandagatla } 2378d5add08fSSrinivas Kandagatla 2379d5add08fSSrinivas Kandagatla switch (req) { 2380d5add08fSSrinivas Kandagatla case MICB_PULLUP_ENABLE: 2381d5add08fSSrinivas Kandagatla wcd938x->pullup_ref[micb_index]++; 2382d5add08fSSrinivas Kandagatla if ((wcd938x->pullup_ref[micb_index] == 1) && 2383d5add08fSSrinivas Kandagatla (wcd938x->micb_ref[micb_index] == 0)) 2384d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2385d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 2386d5add08fSSrinivas Kandagatla WCD938X_MICB_PULL_UP); 2387d5add08fSSrinivas Kandagatla break; 2388d5add08fSSrinivas Kandagatla case MICB_PULLUP_DISABLE: 2389d5add08fSSrinivas Kandagatla if (wcd938x->pullup_ref[micb_index] > 0) 2390d5add08fSSrinivas Kandagatla wcd938x->pullup_ref[micb_index]--; 2391d5add08fSSrinivas Kandagatla 2392d5add08fSSrinivas Kandagatla if ((wcd938x->pullup_ref[micb_index] == 0) && 2393d5add08fSSrinivas Kandagatla (wcd938x->micb_ref[micb_index] == 0)) 2394d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2395d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 0); 2396d5add08fSSrinivas Kandagatla break; 2397d5add08fSSrinivas Kandagatla case MICB_ENABLE: 2398d5add08fSSrinivas Kandagatla wcd938x->micb_ref[micb_index]++; 2399d5add08fSSrinivas Kandagatla if (wcd938x->micb_ref[micb_index] == 1) { 2400d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2401d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_DIG_CLK_CTL, 2402d5add08fSSrinivas Kandagatla WCD938X_TX_CLK_EN_MASK, 0xF); 2403d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2404d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 2405d5add08fSSrinivas Kandagatla WCD938X_ANA_TX_DIV2_CLK_EN_MASK, 1); 2406d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, 2407d5add08fSSrinivas Kandagatla WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL, 2408d5add08fSSrinivas Kandagatla WCD938X_TX_SC_CLK_EN_MASK, 1); 2409d5add08fSSrinivas Kandagatla 2410d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2411d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 2412d5add08fSSrinivas Kandagatla WCD938X_MICB_ENABLE); 2413bcee7ed0SSrinivas Kandagatla if (micb_num == MIC_BIAS_2) 2414bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 2415bcee7ed0SSrinivas Kandagatla WCD_EVENT_POST_MICBIAS_2_ON); 2416d5add08fSSrinivas Kandagatla } 2417bcee7ed0SSrinivas Kandagatla if (micb_num == MIC_BIAS_2 && is_dapm) 2418bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 2419bcee7ed0SSrinivas Kandagatla WCD_EVENT_POST_DAPM_MICBIAS_2_ON); 2420bcee7ed0SSrinivas Kandagatla 2421d5add08fSSrinivas Kandagatla 2422d5add08fSSrinivas Kandagatla break; 2423d5add08fSSrinivas Kandagatla case MICB_DISABLE: 2424d5add08fSSrinivas Kandagatla if (wcd938x->micb_ref[micb_index] > 0) 2425d5add08fSSrinivas Kandagatla wcd938x->micb_ref[micb_index]--; 2426d5add08fSSrinivas Kandagatla 2427d5add08fSSrinivas Kandagatla if ((wcd938x->micb_ref[micb_index] == 0) && 2428d5add08fSSrinivas Kandagatla (wcd938x->pullup_ref[micb_index] > 0)) 2429d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2430d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 2431d5add08fSSrinivas Kandagatla WCD938X_MICB_PULL_UP); 2432d5add08fSSrinivas Kandagatla else if ((wcd938x->micb_ref[micb_index] == 0) && 2433d5add08fSSrinivas Kandagatla (wcd938x->pullup_ref[micb_index] == 0)) { 2434bcee7ed0SSrinivas Kandagatla if (micb_num == MIC_BIAS_2) 2435bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 2436bcee7ed0SSrinivas Kandagatla WCD_EVENT_PRE_MICBIAS_2_OFF); 2437d5add08fSSrinivas Kandagatla 2438d5add08fSSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 2439d5add08fSSrinivas Kandagatla WCD938X_MICB_EN_MASK, 0); 2440bcee7ed0SSrinivas Kandagatla if (micb_num == MIC_BIAS_2) 2441bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 2442bcee7ed0SSrinivas Kandagatla WCD_EVENT_POST_MICBIAS_2_OFF); 2443d5add08fSSrinivas Kandagatla } 2444bcee7ed0SSrinivas Kandagatla if (is_dapm && micb_num == MIC_BIAS_2) 2445bcee7ed0SSrinivas Kandagatla wcd_mbhc_event_notify(wcd938x->wcd_mbhc, 2446bcee7ed0SSrinivas Kandagatla WCD_EVENT_POST_DAPM_MICBIAS_2_OFF); 2447d5add08fSSrinivas Kandagatla break; 2448d5add08fSSrinivas Kandagatla } 2449d5add08fSSrinivas Kandagatla 2450d5add08fSSrinivas Kandagatla return 0; 2451d5add08fSSrinivas Kandagatla } 2452d5add08fSSrinivas Kandagatla 2453d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_micbias(struct snd_soc_dapm_widget *w, 2454d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 2455d5add08fSSrinivas Kandagatla int event) 2456d5add08fSSrinivas Kandagatla { 2457d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2458d5add08fSSrinivas Kandagatla int micb_num = w->shift; 2459d5add08fSSrinivas Kandagatla 2460d5add08fSSrinivas Kandagatla switch (event) { 2461d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2462d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, MICB_ENABLE, true); 2463d5add08fSSrinivas Kandagatla break; 2464d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 2465d5add08fSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 2466d5add08fSSrinivas Kandagatla usleep_range(1000, 1100); 2467d5add08fSSrinivas Kandagatla break; 2468d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2469d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, MICB_DISABLE, true); 2470d5add08fSSrinivas Kandagatla break; 2471d5add08fSSrinivas Kandagatla } 2472d5add08fSSrinivas Kandagatla 2473d5add08fSSrinivas Kandagatla return 0; 2474d5add08fSSrinivas Kandagatla } 2475d5add08fSSrinivas Kandagatla 2476d5add08fSSrinivas Kandagatla static int wcd938x_codec_enable_micbias_pullup(struct snd_soc_dapm_widget *w, 2477d5add08fSSrinivas Kandagatla struct snd_kcontrol *kcontrol, 2478d5add08fSSrinivas Kandagatla int event) 2479d5add08fSSrinivas Kandagatla { 2480d5add08fSSrinivas Kandagatla struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 2481d5add08fSSrinivas Kandagatla int micb_num = w->shift; 2482d5add08fSSrinivas Kandagatla 2483d5add08fSSrinivas Kandagatla switch (event) { 2484d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_PRE_PMU: 2485d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, 2486d5add08fSSrinivas Kandagatla MICB_PULLUP_ENABLE, true); 2487d5add08fSSrinivas Kandagatla break; 2488d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMU: 2489d5add08fSSrinivas Kandagatla /* 1 msec delay as per HW requirement */ 2490d5add08fSSrinivas Kandagatla usleep_range(1000, 1100); 2491d5add08fSSrinivas Kandagatla break; 2492d5add08fSSrinivas Kandagatla case SND_SOC_DAPM_POST_PMD: 2493d5add08fSSrinivas Kandagatla wcd938x_micbias_control(component, micb_num, 2494d5add08fSSrinivas Kandagatla MICB_PULLUP_DISABLE, true); 2495d5add08fSSrinivas Kandagatla break; 2496d5add08fSSrinivas Kandagatla } 2497d5add08fSSrinivas Kandagatla 2498d5add08fSSrinivas Kandagatla return 0; 2499d5add08fSSrinivas Kandagatla } 2500d5add08fSSrinivas Kandagatla 2501e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_get(struct snd_kcontrol *kcontrol, 2502e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2503e8ba1e05SSrinivas Kandagatla { 2504e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2505e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2506e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2507e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 2508e8ba1e05SSrinivas Kandagatla 2509cc587b7cSSrinivas Kandagatla ucontrol->value.enumerated.item[0] = wcd938x->tx_mode[path]; 2510e8ba1e05SSrinivas Kandagatla 2511e8ba1e05SSrinivas Kandagatla return 0; 2512e8ba1e05SSrinivas Kandagatla } 2513e8ba1e05SSrinivas Kandagatla 2514e8ba1e05SSrinivas Kandagatla static int wcd938x_tx_mode_put(struct snd_kcontrol *kcontrol, 2515e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2516e8ba1e05SSrinivas Kandagatla { 2517e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2518e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2519e8ba1e05SSrinivas Kandagatla struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 2520e8ba1e05SSrinivas Kandagatla int path = e->shift_l; 2521e8ba1e05SSrinivas Kandagatla 2522*10e7ff00SMark Brown if (wcd938x->tx_mode[path] == ucontrol->value.enumerated.item[0]) 2523*10e7ff00SMark Brown return 0; 2524*10e7ff00SMark Brown 2525e8ba1e05SSrinivas Kandagatla wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0]; 2526e8ba1e05SSrinivas Kandagatla 2527e8ba1e05SSrinivas Kandagatla return 1; 2528e8ba1e05SSrinivas Kandagatla } 2529e8ba1e05SSrinivas Kandagatla 2530e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_get(struct snd_kcontrol *kcontrol, 2531e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2532e8ba1e05SSrinivas Kandagatla { 2533e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2534e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2535e8ba1e05SSrinivas Kandagatla 2536cc587b7cSSrinivas Kandagatla ucontrol->value.enumerated.item[0] = wcd938x->hph_mode; 2537e8ba1e05SSrinivas Kandagatla 2538e8ba1e05SSrinivas Kandagatla return 0; 2539e8ba1e05SSrinivas Kandagatla } 2540e8ba1e05SSrinivas Kandagatla 2541e8ba1e05SSrinivas Kandagatla static int wcd938x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, 2542e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2543e8ba1e05SSrinivas Kandagatla { 2544e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2545e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2546e8ba1e05SSrinivas Kandagatla 2547*10e7ff00SMark Brown if (wcd938x->hph_mode == ucontrol->value.enumerated.item[0]) 2548*10e7ff00SMark Brown return 0; 2549*10e7ff00SMark Brown 2550e8ba1e05SSrinivas Kandagatla wcd938x->hph_mode = ucontrol->value.enumerated.item[0]; 2551e8ba1e05SSrinivas Kandagatla 2552e8ba1e05SSrinivas Kandagatla return 1; 2553e8ba1e05SSrinivas Kandagatla } 2554e8ba1e05SSrinivas Kandagatla 2555e8ba1e05SSrinivas Kandagatla static int wcd938x_ear_pa_put_gain(struct snd_kcontrol *kcontrol, 2556e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2557e8ba1e05SSrinivas Kandagatla { 2558e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2559e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2560e8ba1e05SSrinivas Kandagatla 2561e8ba1e05SSrinivas Kandagatla if (wcd938x->comp1_enable) { 2562e8ba1e05SSrinivas Kandagatla dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n"); 2563e8ba1e05SSrinivas Kandagatla return -EINVAL; 2564e8ba1e05SSrinivas Kandagatla } 2565e8ba1e05SSrinivas Kandagatla 2566e8ba1e05SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_EAR_COMPANDER_CTL, 2567e8ba1e05SSrinivas Kandagatla WCD938X_EAR_GAIN_MASK, 2568e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0]); 2569e8ba1e05SSrinivas Kandagatla 2570bd2347fdSSrinivas Kandagatla return 1; 2571e8ba1e05SSrinivas Kandagatla } 2572e8ba1e05SSrinivas Kandagatla 2573e8ba1e05SSrinivas Kandagatla static int wcd938x_get_compander(struct snd_kcontrol *kcontrol, 2574e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2575e8ba1e05SSrinivas Kandagatla { 2576e8ba1e05SSrinivas Kandagatla 2577e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2578e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2579e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 2580e8ba1e05SSrinivas Kandagatla bool hphr; 2581e8ba1e05SSrinivas Kandagatla 2582e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 2583e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 2584e8ba1e05SSrinivas Kandagatla 2585e8ba1e05SSrinivas Kandagatla if (hphr) 2586e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp2_enable; 2587e8ba1e05SSrinivas Kandagatla else 2588e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->comp1_enable; 2589e8ba1e05SSrinivas Kandagatla 2590e8ba1e05SSrinivas Kandagatla return 0; 2591e8ba1e05SSrinivas Kandagatla } 2592e8ba1e05SSrinivas Kandagatla 2593e8ba1e05SSrinivas Kandagatla static int wcd938x_set_compander(struct snd_kcontrol *kcontrol, 2594e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2595e8ba1e05SSrinivas Kandagatla { 2596e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2597e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2598e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2599e8ba1e05SSrinivas Kandagatla int value = ucontrol->value.integer.value[0]; 2600c5c1546aSSrinivas Kandagatla int portidx; 2601e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mc; 2602e8ba1e05SSrinivas Kandagatla bool hphr; 2603e8ba1e05SSrinivas Kandagatla 2604e8ba1e05SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 2605e8ba1e05SSrinivas Kandagatla hphr = mc->shift; 2606e8ba1e05SSrinivas Kandagatla 2607e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[AIF1_PB]; 2608e8ba1e05SSrinivas Kandagatla 2609e8ba1e05SSrinivas Kandagatla if (hphr) 2610e8ba1e05SSrinivas Kandagatla wcd938x->comp2_enable = value; 2611e8ba1e05SSrinivas Kandagatla else 2612e8ba1e05SSrinivas Kandagatla wcd938x->comp1_enable = value; 2613e8ba1e05SSrinivas Kandagatla 2614c5c1546aSSrinivas Kandagatla portidx = wcd->ch_info[mc->reg].port_num; 2615c5c1546aSSrinivas Kandagatla 2616e8ba1e05SSrinivas Kandagatla if (value) 2617c5c1546aSSrinivas Kandagatla wcd938x_connect_port(wcd, portidx, mc->reg, true); 2618e8ba1e05SSrinivas Kandagatla else 2619c5c1546aSSrinivas Kandagatla wcd938x_connect_port(wcd, portidx, mc->reg, false); 2620e8ba1e05SSrinivas Kandagatla 2621bd2347fdSSrinivas Kandagatla return 1; 2622e8ba1e05SSrinivas Kandagatla } 2623e8ba1e05SSrinivas Kandagatla 2624e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_get(struct snd_kcontrol *kcontrol, 2625e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2626e8ba1e05SSrinivas Kandagatla { 2627e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2628e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2629e8ba1e05SSrinivas Kandagatla 2630e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->ldoh; 2631e8ba1e05SSrinivas Kandagatla 2632e8ba1e05SSrinivas Kandagatla return 0; 2633e8ba1e05SSrinivas Kandagatla } 2634e8ba1e05SSrinivas Kandagatla 2635e8ba1e05SSrinivas Kandagatla static int wcd938x_ldoh_put(struct snd_kcontrol *kcontrol, 2636e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2637e8ba1e05SSrinivas Kandagatla { 2638e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2639e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2640e8ba1e05SSrinivas Kandagatla 2641*10e7ff00SMark Brown if (wcd938x->ldoh == ucontrol->value.integer.value[0]) 2642*10e7ff00SMark Brown return 0; 2643*10e7ff00SMark Brown 2644e8ba1e05SSrinivas Kandagatla wcd938x->ldoh = ucontrol->value.integer.value[0]; 2645e8ba1e05SSrinivas Kandagatla 2646e8ba1e05SSrinivas Kandagatla return 1; 2647e8ba1e05SSrinivas Kandagatla } 2648e8ba1e05SSrinivas Kandagatla 2649e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_get(struct snd_kcontrol *kcontrol, 2650e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2651e8ba1e05SSrinivas Kandagatla { 2652e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2653e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2654e8ba1e05SSrinivas Kandagatla 2655e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd938x->bcs_dis; 2656e8ba1e05SSrinivas Kandagatla 2657e8ba1e05SSrinivas Kandagatla return 0; 2658e8ba1e05SSrinivas Kandagatla } 2659e8ba1e05SSrinivas Kandagatla 2660e8ba1e05SSrinivas Kandagatla static int wcd938x_bcs_put(struct snd_kcontrol *kcontrol, 2661e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2662e8ba1e05SSrinivas Kandagatla { 2663e8ba1e05SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 2664e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 2665e8ba1e05SSrinivas Kandagatla 2666*10e7ff00SMark Brown if (wcd938x->bcs_dis == ucontrol->value.integer.value[0]) 2667*10e7ff00SMark Brown return 0; 2668*10e7ff00SMark Brown 2669e8ba1e05SSrinivas Kandagatla wcd938x->bcs_dis = ucontrol->value.integer.value[0]; 2670e8ba1e05SSrinivas Kandagatla 2671e8ba1e05SSrinivas Kandagatla return 1; 2672e8ba1e05SSrinivas Kandagatla } 2673e8ba1e05SSrinivas Kandagatla 2674e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text_wcd9380[] = { 2675e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 2676e8ba1e05SSrinivas Kandagatla }; 2677e8ba1e05SSrinivas Kandagatla 2678e8ba1e05SSrinivas Kandagatla static const char * const tx_mode_mux_text[] = { 2679e8ba1e05SSrinivas Kandagatla "ADC_INVALID", "ADC_HIFI", "ADC_LO_HIF", "ADC_NORMAL", "ADC_LP", 2680e8ba1e05SSrinivas Kandagatla "ADC_ULP1", "ADC_ULP2", 2681e8ba1e05SSrinivas Kandagatla }; 2682e8ba1e05SSrinivas Kandagatla 2683e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text_wcd9380[] = { 2684e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_INVALID_1", "CLS_H_LP", "CLS_AB", 2685e8ba1e05SSrinivas Kandagatla "CLS_H_LOHIFI", "CLS_H_ULP", "CLS_H_INVALID_2", "CLS_AB_LP", 2686e8ba1e05SSrinivas Kandagatla "CLS_AB_LOHIFI", 2687e8ba1e05SSrinivas Kandagatla }; 2688e8ba1e05SSrinivas Kandagatla 2689e8ba1e05SSrinivas Kandagatla static const char * const rx_hph_mode_mux_text[] = { 2690e8ba1e05SSrinivas Kandagatla "CLS_H_INVALID", "CLS_H_HIFI", "CLS_H_LP", "CLS_AB", "CLS_H_LOHIFI", 2691e8ba1e05SSrinivas Kandagatla "CLS_H_ULP", "CLS_AB_HIFI", "CLS_AB_LP", "CLS_AB_LOHIFI", 2692e8ba1e05SSrinivas Kandagatla }; 2693e8ba1e05SSrinivas Kandagatla 26948da9db0cSSrinivas Kandagatla static const char * const adc2_mux_text[] = { 26958da9db0cSSrinivas Kandagatla "INP2", "INP3" 26968da9db0cSSrinivas Kandagatla }; 26978da9db0cSSrinivas Kandagatla 26988da9db0cSSrinivas Kandagatla static const char * const adc3_mux_text[] = { 26998da9db0cSSrinivas Kandagatla "INP4", "INP6" 27008da9db0cSSrinivas Kandagatla }; 27018da9db0cSSrinivas Kandagatla 27028da9db0cSSrinivas Kandagatla static const char * const adc4_mux_text[] = { 27038da9db0cSSrinivas Kandagatla "INP5", "INP7" 27048da9db0cSSrinivas Kandagatla }; 27058da9db0cSSrinivas Kandagatla 27068da9db0cSSrinivas Kandagatla static const char * const rdac3_mux_text[] = { 27078da9db0cSSrinivas Kandagatla "RX1", "RX3" 27088da9db0cSSrinivas Kandagatla }; 27098da9db0cSSrinivas Kandagatla 27108da9db0cSSrinivas Kandagatla static const char * const hdr12_mux_text[] = { 27118da9db0cSSrinivas Kandagatla "NO_HDR12", "HDR12" 27128da9db0cSSrinivas Kandagatla }; 27138da9db0cSSrinivas Kandagatla 27148da9db0cSSrinivas Kandagatla static const char * const hdr34_mux_text[] = { 27158da9db0cSSrinivas Kandagatla "NO_HDR34", "HDR34" 27168da9db0cSSrinivas Kandagatla }; 27178da9db0cSSrinivas Kandagatla 2718e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9380 = 2719e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2720e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2721e8ba1e05SSrinivas Kandagatla 2722e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9380 = 2723e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2724e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2725e8ba1e05SSrinivas Kandagatla 2726e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9380 = 2727e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2728e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2729e8ba1e05SSrinivas Kandagatla 2730e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9380 = 2731e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text_wcd9380), 2732e8ba1e05SSrinivas Kandagatla tx_mode_mux_text_wcd9380); 2733e8ba1e05SSrinivas Kandagatla 2734e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx0_mode_enum_wcd9385 = 2735e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(tx_mode_mux_text), 2736e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2737e8ba1e05SSrinivas Kandagatla 2738e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx1_mode_enum_wcd9385 = 2739e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 1, ARRAY_SIZE(tx_mode_mux_text), 2740e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2741e8ba1e05SSrinivas Kandagatla 2742e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx2_mode_enum_wcd9385 = 2743e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 2, ARRAY_SIZE(tx_mode_mux_text), 2744e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2745e8ba1e05SSrinivas Kandagatla 2746e8ba1e05SSrinivas Kandagatla static const struct soc_enum tx3_mode_enum_wcd9385 = 2747e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE(SND_SOC_NOPM, 3, ARRAY_SIZE(tx_mode_mux_text), 2748e8ba1e05SSrinivas Kandagatla tx_mode_mux_text); 2749e8ba1e05SSrinivas Kandagatla 2750e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum_wcd9380 = 2751e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text_wcd9380), 2752e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text_wcd9380); 2753e8ba1e05SSrinivas Kandagatla 2754e8ba1e05SSrinivas Kandagatla static const struct soc_enum rx_hph_mode_mux_enum = 2755e8ba1e05SSrinivas Kandagatla SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text), 2756e8ba1e05SSrinivas Kandagatla rx_hph_mode_mux_text); 2757e8ba1e05SSrinivas Kandagatla 2758d5add08fSSrinivas Kandagatla static const struct soc_enum adc2_enum = 2759d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 7, 2760d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc2_mux_text), adc2_mux_text); 2761d5add08fSSrinivas Kandagatla 2762d5add08fSSrinivas Kandagatla static const struct soc_enum adc3_enum = 2763d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 6, 2764d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc3_mux_text), adc3_mux_text); 2765d5add08fSSrinivas Kandagatla 2766d5add08fSSrinivas Kandagatla static const struct soc_enum adc4_enum = 2767d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 5, 2768d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc4_mux_text), adc4_mux_text); 2769d5add08fSSrinivas Kandagatla 2770d5add08fSSrinivas Kandagatla static const struct soc_enum hdr12_enum = 2771d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 4, 2772d5add08fSSrinivas Kandagatla ARRAY_SIZE(hdr12_mux_text), hdr12_mux_text); 2773d5add08fSSrinivas Kandagatla 2774d5add08fSSrinivas Kandagatla static const struct soc_enum hdr34_enum = 2775d5add08fSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_TX_NEW_AMIC_MUX_CFG, 3, 2776d5add08fSSrinivas Kandagatla ARRAY_SIZE(hdr34_mux_text), hdr34_mux_text); 2777d5add08fSSrinivas Kandagatla 27788da9db0cSSrinivas Kandagatla static const struct soc_enum rdac3_enum = 27798da9db0cSSrinivas Kandagatla SOC_ENUM_SINGLE(WCD938X_DIGITAL_CDC_EAR_PATH_CTL, 0, 27808da9db0cSSrinivas Kandagatla ARRAY_SIZE(rdac3_mux_text), rdac3_mux_text); 27818da9db0cSSrinivas Kandagatla 2782d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc1_switch[] = { 2783d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2784d5add08fSSrinivas Kandagatla }; 2785d5add08fSSrinivas Kandagatla 2786d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc2_switch[] = { 2787d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2788d5add08fSSrinivas Kandagatla }; 2789d5add08fSSrinivas Kandagatla 2790d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc3_switch[] = { 2791d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2792d5add08fSSrinivas Kandagatla }; 2793d5add08fSSrinivas Kandagatla 2794d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new adc4_switch[] = { 2795d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2796d5add08fSSrinivas Kandagatla }; 2797d5add08fSSrinivas Kandagatla 2798d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic1_switch[] = { 2799d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2800d5add08fSSrinivas Kandagatla }; 2801d5add08fSSrinivas Kandagatla 2802d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic2_switch[] = { 2803d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2804d5add08fSSrinivas Kandagatla }; 2805d5add08fSSrinivas Kandagatla 2806d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic3_switch[] = { 2807d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2808d5add08fSSrinivas Kandagatla }; 2809d5add08fSSrinivas Kandagatla 2810d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic4_switch[] = { 2811d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2812d5add08fSSrinivas Kandagatla }; 2813d5add08fSSrinivas Kandagatla 2814d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic5_switch[] = { 2815d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2816d5add08fSSrinivas Kandagatla }; 2817d5add08fSSrinivas Kandagatla 2818d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic6_switch[] = { 2819d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2820d5add08fSSrinivas Kandagatla }; 2821d5add08fSSrinivas Kandagatla 2822d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic7_switch[] = { 2823d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2824d5add08fSSrinivas Kandagatla }; 2825d5add08fSSrinivas Kandagatla 2826d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new dmic8_switch[] = { 2827d5add08fSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 2828d5add08fSSrinivas Kandagatla }; 2829d5add08fSSrinivas Kandagatla 28308da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new ear_rdac_switch[] = { 28318da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 28328da9db0cSSrinivas Kandagatla }; 28338da9db0cSSrinivas Kandagatla 28348da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new aux_rdac_switch[] = { 28358da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 28368da9db0cSSrinivas Kandagatla }; 28378da9db0cSSrinivas Kandagatla 28388da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new hphl_rdac_switch[] = { 28398da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 28408da9db0cSSrinivas Kandagatla }; 28418da9db0cSSrinivas Kandagatla 28428da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new hphr_rdac_switch[] = { 28438da9db0cSSrinivas Kandagatla SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0) 28448da9db0cSSrinivas Kandagatla }; 28458da9db0cSSrinivas Kandagatla 2846d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc2_mux = 2847d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum); 2848d5add08fSSrinivas Kandagatla 2849d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc3_mux = 2850d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("ADC3 MUX Mux", adc3_enum); 2851d5add08fSSrinivas Kandagatla 2852d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_adc4_mux = 2853d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("ADC4 MUX Mux", adc4_enum); 2854d5add08fSSrinivas Kandagatla 2855d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_hdr12_mux = 2856d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("HDR12 MUX Mux", hdr12_enum); 2857d5add08fSSrinivas Kandagatla 2858d5add08fSSrinivas Kandagatla static const struct snd_kcontrol_new tx_hdr34_mux = 2859d5add08fSSrinivas Kandagatla SOC_DAPM_ENUM("HDR34 MUX Mux", hdr34_enum); 2860d5add08fSSrinivas Kandagatla 28618da9db0cSSrinivas Kandagatla static const struct snd_kcontrol_new rx_rdac3_mux = 28628da9db0cSSrinivas Kandagatla SOC_DAPM_ENUM("RDAC3_MUX Mux", rdac3_enum); 28638da9db0cSSrinivas Kandagatla 2864e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9380_snd_controls[] = { 2865e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum_wcd9380, 2866e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 2867e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9380, 2868e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2869e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9380, 2870e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2871e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9380, 2872e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2873e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9380, 2874e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2875e8ba1e05SSrinivas Kandagatla }; 2876e8ba1e05SSrinivas Kandagatla 2877e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd9385_snd_controls[] = { 2878e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum, 2879e8ba1e05SSrinivas Kandagatla wcd938x_rx_hph_mode_get, wcd938x_rx_hph_mode_put), 2880e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX0 MODE", tx0_mode_enum_wcd9385, 2881e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2882e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX1 MODE", tx1_mode_enum_wcd9385, 2883e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2884e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX2 MODE", tx2_mode_enum_wcd9385, 2885e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2886e8ba1e05SSrinivas Kandagatla SOC_ENUM_EXT("TX3 MODE", tx3_mode_enum_wcd9385, 2887e8ba1e05SSrinivas Kandagatla wcd938x_tx_mode_get, wcd938x_tx_mode_put), 2888e8ba1e05SSrinivas Kandagatla }; 2889e8ba1e05SSrinivas Kandagatla 2890e8ba1e05SSrinivas Kandagatla static int wcd938x_get_swr_port(struct snd_kcontrol *kcontrol, 2891e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2892e8ba1e05SSrinivas Kandagatla { 2893e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 2894e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 2895e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2896e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; 2897e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 2898c5c1546aSSrinivas Kandagatla int portidx, ch_idx = mixer->reg; 2899c5c1546aSSrinivas Kandagatla 2900e8ba1e05SSrinivas Kandagatla 2901e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 2902c5c1546aSSrinivas Kandagatla portidx = wcd->ch_info[ch_idx].port_num; 2903e8ba1e05SSrinivas Kandagatla 2904e8ba1e05SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; 2905e8ba1e05SSrinivas Kandagatla 2906e8ba1e05SSrinivas Kandagatla return 0; 2907e8ba1e05SSrinivas Kandagatla } 2908e8ba1e05SSrinivas Kandagatla 2909e8ba1e05SSrinivas Kandagatla static int wcd938x_set_swr_port(struct snd_kcontrol *kcontrol, 2910e8ba1e05SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 2911e8ba1e05SSrinivas Kandagatla { 2912e8ba1e05SSrinivas Kandagatla struct snd_soc_component *comp = snd_soc_kcontrol_component(kcontrol); 2913e8ba1e05SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp); 2914e8ba1e05SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd; 2915e8ba1e05SSrinivas Kandagatla struct soc_mixer_control *mixer = 2916e8ba1e05SSrinivas Kandagatla (struct soc_mixer_control *)kcontrol->private_value; 2917c5c1546aSSrinivas Kandagatla int ch_idx = mixer->reg; 2918c5c1546aSSrinivas Kandagatla int portidx; 2919e8ba1e05SSrinivas Kandagatla int dai_id = mixer->shift; 2920e8ba1e05SSrinivas Kandagatla bool enable; 2921e8ba1e05SSrinivas Kandagatla 2922e8ba1e05SSrinivas Kandagatla wcd = wcd938x->sdw_priv[dai_id]; 2923e8ba1e05SSrinivas Kandagatla 2924c5c1546aSSrinivas Kandagatla portidx = wcd->ch_info[ch_idx].port_num; 2925e8ba1e05SSrinivas Kandagatla if (ucontrol->value.integer.value[0]) 2926e8ba1e05SSrinivas Kandagatla enable = true; 2927e8ba1e05SSrinivas Kandagatla else 2928e8ba1e05SSrinivas Kandagatla enable = false; 2929e8ba1e05SSrinivas Kandagatla 2930e8ba1e05SSrinivas Kandagatla wcd->port_enable[portidx] = enable; 2931e8ba1e05SSrinivas Kandagatla 2932c5c1546aSSrinivas Kandagatla wcd938x_connect_port(wcd, portidx, ch_idx, enable); 2933e8ba1e05SSrinivas Kandagatla 2934bd2347fdSSrinivas Kandagatla return 1; 2935e8ba1e05SSrinivas Kandagatla 2936e8ba1e05SSrinivas Kandagatla } 2937e8ba1e05SSrinivas Kandagatla 2938bcee7ed0SSrinivas Kandagatla /* MBHC related */ 2939bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_clk_setup(struct snd_soc_component *component, 2940bcee7ed0SSrinivas Kandagatla bool enable) 2941bcee7ed0SSrinivas Kandagatla { 2942bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_1, 2943bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_CTL_RCO_EN_MASK, enable); 2944bcee7ed0SSrinivas Kandagatla } 2945bcee7ed0SSrinivas Kandagatla 2946bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_mbhc_bias_control(struct snd_soc_component *component, 2947bcee7ed0SSrinivas Kandagatla bool enable) 2948bcee7ed0SSrinivas Kandagatla { 2949bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MBHC_ELECT, 2950bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_BIAS_EN, enable); 2951bcee7ed0SSrinivas Kandagatla } 2952bcee7ed0SSrinivas Kandagatla 2953bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_program_btn_thr(struct snd_soc_component *component, 2954bcee7ed0SSrinivas Kandagatla int *btn_low, int *btn_high, 2955bcee7ed0SSrinivas Kandagatla int num_btn, bool is_micbias) 2956bcee7ed0SSrinivas Kandagatla { 2957bcee7ed0SSrinivas Kandagatla int i, vth; 2958bcee7ed0SSrinivas Kandagatla 2959bcee7ed0SSrinivas Kandagatla if (num_btn > WCD_MBHC_DEF_BUTTONS) { 2960bcee7ed0SSrinivas Kandagatla dev_err(component->dev, "%s: invalid number of buttons: %d\n", 2961bcee7ed0SSrinivas Kandagatla __func__, num_btn); 2962bcee7ed0SSrinivas Kandagatla return; 2963bcee7ed0SSrinivas Kandagatla } 2964bcee7ed0SSrinivas Kandagatla 2965bcee7ed0SSrinivas Kandagatla for (i = 0; i < num_btn; i++) { 2966bcee7ed0SSrinivas Kandagatla vth = ((btn_high[i] * 2) / 25) & 0x3F; 2967bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MBHC_BTN0 + i, 2968bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_BTN_VTH_MASK, vth); 2969bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: btn_high[%d]: %d, vth: %d\n", 2970bcee7ed0SSrinivas Kandagatla __func__, i, btn_high[i], vth); 2971bcee7ed0SSrinivas Kandagatla } 2972bcee7ed0SSrinivas Kandagatla } 2973bcee7ed0SSrinivas Kandagatla 2974bcee7ed0SSrinivas Kandagatla static bool wcd938x_mbhc_micb_en_status(struct snd_soc_component *component, int micb_num) 2975bcee7ed0SSrinivas Kandagatla { 2976bcee7ed0SSrinivas Kandagatla u8 val; 2977bcee7ed0SSrinivas Kandagatla 2978bcee7ed0SSrinivas Kandagatla if (micb_num == MIC_BIAS_2) { 2979bcee7ed0SSrinivas Kandagatla val = snd_soc_component_read_field(component, 2980bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MICB2, 2981bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MICB2_ENABLE_MASK); 2982bcee7ed0SSrinivas Kandagatla if (val == WCD938X_MICB_ENABLE) 2983bcee7ed0SSrinivas Kandagatla return true; 2984bcee7ed0SSrinivas Kandagatla } 2985bcee7ed0SSrinivas Kandagatla return false; 2986bcee7ed0SSrinivas Kandagatla } 2987bcee7ed0SSrinivas Kandagatla 2988bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_hph_l_pull_up_control(struct snd_soc_component *component, 2989bcee7ed0SSrinivas Kandagatla int pull_up_cur) 2990bcee7ed0SSrinivas Kandagatla { 2991bcee7ed0SSrinivas Kandagatla /* Default pull up current to 2uA */ 2992bcee7ed0SSrinivas Kandagatla if (pull_up_cur > HS_PULLUP_I_OFF || pull_up_cur < HS_PULLUP_I_3P0_UA) 2993bcee7ed0SSrinivas Kandagatla pull_up_cur = HS_PULLUP_I_2P0_UA; 2994bcee7ed0SSrinivas Kandagatla 2995bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, 2996bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT, 2997bcee7ed0SSrinivas Kandagatla WCD938X_HSDET_PULLUP_C_MASK, pull_up_cur); 2998bcee7ed0SSrinivas Kandagatla } 2999bcee7ed0SSrinivas Kandagatla 3000bcee7ed0SSrinivas Kandagatla static int wcd938x_mbhc_request_micbias(struct snd_soc_component *component, 3001bcee7ed0SSrinivas Kandagatla int micb_num, int req) 3002bcee7ed0SSrinivas Kandagatla { 3003bcee7ed0SSrinivas Kandagatla return wcd938x_micbias_control(component, micb_num, req, false); 3004bcee7ed0SSrinivas Kandagatla } 3005bcee7ed0SSrinivas Kandagatla 3006bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_micb_ramp_control(struct snd_soc_component *component, 3007bcee7ed0SSrinivas Kandagatla bool enable) 3008bcee7ed0SSrinivas Kandagatla { 3009bcee7ed0SSrinivas Kandagatla if (enable) { 3010bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MICB2_RAMP, 3011bcee7ed0SSrinivas Kandagatla WCD938X_RAMP_SHIFT_CTRL_MASK, 0x0C); 3012bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MICB2_RAMP, 3013bcee7ed0SSrinivas Kandagatla WCD938X_RAMP_EN_MASK, 1); 3014bcee7ed0SSrinivas Kandagatla } else { 3015bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MICB2_RAMP, 3016bcee7ed0SSrinivas Kandagatla WCD938X_RAMP_EN_MASK, 0); 3017bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MICB2_RAMP, 3018bcee7ed0SSrinivas Kandagatla WCD938X_RAMP_SHIFT_CTRL_MASK, 0); 3019bcee7ed0SSrinivas Kandagatla } 3020bcee7ed0SSrinivas Kandagatla } 3021bcee7ed0SSrinivas Kandagatla 3022bcee7ed0SSrinivas Kandagatla static int wcd938x_get_micb_vout_ctl_val(u32 micb_mv) 3023bcee7ed0SSrinivas Kandagatla { 3024bcee7ed0SSrinivas Kandagatla /* min micbias voltage is 1V and maximum is 2.85V */ 3025bcee7ed0SSrinivas Kandagatla if (micb_mv < 1000 || micb_mv > 2850) 3026bcee7ed0SSrinivas Kandagatla return -EINVAL; 3027bcee7ed0SSrinivas Kandagatla 3028bcee7ed0SSrinivas Kandagatla return (micb_mv - 1000) / 50; 3029bcee7ed0SSrinivas Kandagatla } 3030bcee7ed0SSrinivas Kandagatla 3031bcee7ed0SSrinivas Kandagatla static int wcd938x_mbhc_micb_adjust_voltage(struct snd_soc_component *component, 3032bcee7ed0SSrinivas Kandagatla int req_volt, int micb_num) 3033bcee7ed0SSrinivas Kandagatla { 3034bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3035bcee7ed0SSrinivas Kandagatla int cur_vout_ctl, req_vout_ctl, micb_reg, micb_en, ret = 0; 3036bcee7ed0SSrinivas Kandagatla 3037bcee7ed0SSrinivas Kandagatla switch (micb_num) { 3038bcee7ed0SSrinivas Kandagatla case MIC_BIAS_1: 3039bcee7ed0SSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB1; 3040bcee7ed0SSrinivas Kandagatla break; 3041bcee7ed0SSrinivas Kandagatla case MIC_BIAS_2: 3042bcee7ed0SSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB2; 3043bcee7ed0SSrinivas Kandagatla break; 3044bcee7ed0SSrinivas Kandagatla case MIC_BIAS_3: 3045bcee7ed0SSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB3; 3046bcee7ed0SSrinivas Kandagatla break; 3047bcee7ed0SSrinivas Kandagatla case MIC_BIAS_4: 3048bcee7ed0SSrinivas Kandagatla micb_reg = WCD938X_ANA_MICB4; 3049bcee7ed0SSrinivas Kandagatla break; 3050bcee7ed0SSrinivas Kandagatla default: 3051bcee7ed0SSrinivas Kandagatla return -EINVAL; 3052bcee7ed0SSrinivas Kandagatla } 3053bcee7ed0SSrinivas Kandagatla mutex_lock(&wcd938x->micb_lock); 3054bcee7ed0SSrinivas Kandagatla /* 3055bcee7ed0SSrinivas Kandagatla * If requested micbias voltage is same as current micbias 3056bcee7ed0SSrinivas Kandagatla * voltage, then just return. Otherwise, adjust voltage as 3057bcee7ed0SSrinivas Kandagatla * per requested value. If micbias is already enabled, then 3058bcee7ed0SSrinivas Kandagatla * to avoid slow micbias ramp-up or down enable pull-up 3059bcee7ed0SSrinivas Kandagatla * momentarily, change the micbias value and then re-enable 3060bcee7ed0SSrinivas Kandagatla * micbias. 3061bcee7ed0SSrinivas Kandagatla */ 3062bcee7ed0SSrinivas Kandagatla micb_en = snd_soc_component_read_field(component, micb_reg, 3063bcee7ed0SSrinivas Kandagatla WCD938X_MICB_EN_MASK); 3064bcee7ed0SSrinivas Kandagatla cur_vout_ctl = snd_soc_component_read_field(component, micb_reg, 3065bcee7ed0SSrinivas Kandagatla WCD938X_MICB_VOUT_MASK); 3066bcee7ed0SSrinivas Kandagatla 3067bcee7ed0SSrinivas Kandagatla req_vout_ctl = wcd938x_get_micb_vout_ctl_val(req_volt); 3068bcee7ed0SSrinivas Kandagatla if (req_vout_ctl < 0) { 3069bcee7ed0SSrinivas Kandagatla ret = -EINVAL; 3070bcee7ed0SSrinivas Kandagatla goto exit; 3071bcee7ed0SSrinivas Kandagatla } 3072bcee7ed0SSrinivas Kandagatla 3073bcee7ed0SSrinivas Kandagatla if (cur_vout_ctl == req_vout_ctl) { 3074bcee7ed0SSrinivas Kandagatla ret = 0; 3075bcee7ed0SSrinivas Kandagatla goto exit; 3076bcee7ed0SSrinivas Kandagatla } 3077bcee7ed0SSrinivas Kandagatla 3078bcee7ed0SSrinivas Kandagatla if (micb_en == WCD938X_MICB_ENABLE) 3079bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 3080bcee7ed0SSrinivas Kandagatla WCD938X_MICB_EN_MASK, 3081bcee7ed0SSrinivas Kandagatla WCD938X_MICB_PULL_UP); 3082bcee7ed0SSrinivas Kandagatla 3083bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 3084bcee7ed0SSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, 3085bcee7ed0SSrinivas Kandagatla req_vout_ctl); 3086bcee7ed0SSrinivas Kandagatla 3087bcee7ed0SSrinivas Kandagatla if (micb_en == WCD938X_MICB_ENABLE) { 3088bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, micb_reg, 3089bcee7ed0SSrinivas Kandagatla WCD938X_MICB_EN_MASK, 3090bcee7ed0SSrinivas Kandagatla WCD938X_MICB_ENABLE); 3091bcee7ed0SSrinivas Kandagatla /* 3092bcee7ed0SSrinivas Kandagatla * Add 2ms delay as per HW requirement after enabling 3093bcee7ed0SSrinivas Kandagatla * micbias 3094bcee7ed0SSrinivas Kandagatla */ 3095bcee7ed0SSrinivas Kandagatla usleep_range(2000, 2100); 3096bcee7ed0SSrinivas Kandagatla } 3097bcee7ed0SSrinivas Kandagatla exit: 3098bcee7ed0SSrinivas Kandagatla mutex_unlock(&wcd938x->micb_lock); 3099bcee7ed0SSrinivas Kandagatla return ret; 3100bcee7ed0SSrinivas Kandagatla } 3101bcee7ed0SSrinivas Kandagatla 3102bcee7ed0SSrinivas Kandagatla static int wcd938x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_component *component, 3103bcee7ed0SSrinivas Kandagatla int micb_num, bool req_en) 3104bcee7ed0SSrinivas Kandagatla { 3105bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3106b2fde4deSchiminghao int micb_mv; 3107bcee7ed0SSrinivas Kandagatla 3108bcee7ed0SSrinivas Kandagatla if (micb_num != MIC_BIAS_2) 3109bcee7ed0SSrinivas Kandagatla return -EINVAL; 3110bcee7ed0SSrinivas Kandagatla /* 3111bcee7ed0SSrinivas Kandagatla * If device tree micbias level is already above the minimum 3112bcee7ed0SSrinivas Kandagatla * voltage needed to detect threshold microphone, then do 3113bcee7ed0SSrinivas Kandagatla * not change the micbias, just return. 3114bcee7ed0SSrinivas Kandagatla */ 3115bcee7ed0SSrinivas Kandagatla if (wcd938x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) 3116bcee7ed0SSrinivas Kandagatla return 0; 3117bcee7ed0SSrinivas Kandagatla 3118bcee7ed0SSrinivas Kandagatla micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd938x->micb2_mv; 3119bcee7ed0SSrinivas Kandagatla 3120b2fde4deSchiminghao return wcd938x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2); 3121bcee7ed0SSrinivas Kandagatla } 3122bcee7ed0SSrinivas Kandagatla 3123bcee7ed0SSrinivas Kandagatla static inline void wcd938x_mbhc_get_result_params(struct wcd938x_priv *wcd938x, 3124bcee7ed0SSrinivas Kandagatla s16 *d1_a, u16 noff, 3125bcee7ed0SSrinivas Kandagatla int32_t *zdet) 3126bcee7ed0SSrinivas Kandagatla { 3127bcee7ed0SSrinivas Kandagatla int i; 3128bcee7ed0SSrinivas Kandagatla int val, val1; 3129bcee7ed0SSrinivas Kandagatla s16 c1; 3130bcee7ed0SSrinivas Kandagatla s32 x1, d1; 3131bcee7ed0SSrinivas Kandagatla int32_t denom; 3132bcee7ed0SSrinivas Kandagatla int minCode_param[] = { 3133bcee7ed0SSrinivas Kandagatla 3277, 1639, 820, 410, 205, 103, 52, 26 3134bcee7ed0SSrinivas Kandagatla }; 3135bcee7ed0SSrinivas Kandagatla 3136bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x20); 3137bcee7ed0SSrinivas Kandagatla for (i = 0; i < WCD938X_ZDET_NUM_MEASUREMENTS; i++) { 3138bcee7ed0SSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_2, &val); 3139bcee7ed0SSrinivas Kandagatla if (val & 0x80) 3140bcee7ed0SSrinivas Kandagatla break; 3141bcee7ed0SSrinivas Kandagatla } 3142bcee7ed0SSrinivas Kandagatla val = val << 0x8; 3143bcee7ed0SSrinivas Kandagatla regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_1, &val1); 3144bcee7ed0SSrinivas Kandagatla val |= val1; 3145bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x00); 3146bcee7ed0SSrinivas Kandagatla x1 = WCD938X_MBHC_GET_X1(val); 3147bcee7ed0SSrinivas Kandagatla c1 = WCD938X_MBHC_GET_C1(val); 3148bcee7ed0SSrinivas Kandagatla /* If ramp is not complete, give additional 5ms */ 3149bcee7ed0SSrinivas Kandagatla if ((c1 < 2) && x1) 3150bcee7ed0SSrinivas Kandagatla usleep_range(5000, 5050); 3151bcee7ed0SSrinivas Kandagatla 3152bcee7ed0SSrinivas Kandagatla if (!c1 || !x1) { 3153bcee7ed0SSrinivas Kandagatla pr_err("%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", 3154bcee7ed0SSrinivas Kandagatla __func__, c1, x1); 3155bcee7ed0SSrinivas Kandagatla goto ramp_down; 3156bcee7ed0SSrinivas Kandagatla } 3157bcee7ed0SSrinivas Kandagatla d1 = d1_a[c1]; 3158bcee7ed0SSrinivas Kandagatla denom = (x1 * d1) - (1 << (14 - noff)); 3159bcee7ed0SSrinivas Kandagatla if (denom > 0) 3160bcee7ed0SSrinivas Kandagatla *zdet = (WCD938X_MBHC_ZDET_CONST * 1000) / denom; 3161bcee7ed0SSrinivas Kandagatla else if (x1 < minCode_param[noff]) 3162bcee7ed0SSrinivas Kandagatla *zdet = WCD938X_ZDET_FLOATING_IMPEDANCE; 3163bcee7ed0SSrinivas Kandagatla 3164bcee7ed0SSrinivas Kandagatla pr_err("%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", 3165bcee7ed0SSrinivas Kandagatla __func__, d1, c1, x1, *zdet); 3166bcee7ed0SSrinivas Kandagatla ramp_down: 3167bcee7ed0SSrinivas Kandagatla i = 0; 3168bcee7ed0SSrinivas Kandagatla while (x1) { 3169bcee7ed0SSrinivas Kandagatla regmap_read(wcd938x->regmap, 3170bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_RESULT_1, &val); 3171bcee7ed0SSrinivas Kandagatla regmap_read(wcd938x->regmap, 3172bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_RESULT_2, &val1); 3173bcee7ed0SSrinivas Kandagatla val = val << 0x08; 3174bcee7ed0SSrinivas Kandagatla val |= val1; 3175bcee7ed0SSrinivas Kandagatla x1 = WCD938X_MBHC_GET_X1(val); 3176bcee7ed0SSrinivas Kandagatla i++; 3177bcee7ed0SSrinivas Kandagatla if (i == WCD938X_ZDET_NUM_MEASUREMENTS) 3178bcee7ed0SSrinivas Kandagatla break; 3179bcee7ed0SSrinivas Kandagatla } 3180bcee7ed0SSrinivas Kandagatla } 3181bcee7ed0SSrinivas Kandagatla 3182bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_zdet_ramp(struct snd_soc_component *component, 3183bcee7ed0SSrinivas Kandagatla struct wcd938x_mbhc_zdet_param *zdet_param, 3184bcee7ed0SSrinivas Kandagatla int32_t *zl, int32_t *zr, s16 *d1_a) 3185bcee7ed0SSrinivas Kandagatla { 3186bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3187bcee7ed0SSrinivas Kandagatla int32_t zdet = 0; 3188bcee7ed0SSrinivas Kandagatla 3189bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_ZDET_ANA_CTL, 3190bcee7ed0SSrinivas Kandagatla WCD938X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl); 3191bcee7ed0SSrinivas Kandagatla snd_soc_component_update_bits(component, WCD938X_ANA_MBHC_BTN5, 3192bcee7ed0SSrinivas Kandagatla WCD938X_VTH_MASK, zdet_param->btn5); 3193bcee7ed0SSrinivas Kandagatla snd_soc_component_update_bits(component, WCD938X_ANA_MBHC_BTN6, 3194bcee7ed0SSrinivas Kandagatla WCD938X_VTH_MASK, zdet_param->btn6); 3195bcee7ed0SSrinivas Kandagatla snd_soc_component_update_bits(component, WCD938X_ANA_MBHC_BTN7, 3196bcee7ed0SSrinivas Kandagatla WCD938X_VTH_MASK, zdet_param->btn7); 3197bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_ZDET_ANA_CTL, 3198bcee7ed0SSrinivas Kandagatla WCD938X_ZDET_RANGE_CTL_MASK, zdet_param->noff); 3199bcee7ed0SSrinivas Kandagatla snd_soc_component_update_bits(component, WCD938X_MBHC_NEW_ZDET_RAMP_CTL, 3200bcee7ed0SSrinivas Kandagatla 0x0F, zdet_param->nshift); 3201bcee7ed0SSrinivas Kandagatla 3202bcee7ed0SSrinivas Kandagatla if (!zl) 3203bcee7ed0SSrinivas Kandagatla goto z_right; 3204bcee7ed0SSrinivas Kandagatla /* Start impedance measurement for HPH_L */ 3205bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3206bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_ZDET, 0x80, 0x80); 3207bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: ramp for HPH_L, noff = %d\n", 3208bcee7ed0SSrinivas Kandagatla __func__, zdet_param->noff); 3209bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_get_result_params(wcd938x, d1_a, zdet_param->noff, &zdet); 3210bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3211bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_ZDET, 0x80, 0x00); 3212bcee7ed0SSrinivas Kandagatla 3213bcee7ed0SSrinivas Kandagatla *zl = zdet; 3214bcee7ed0SSrinivas Kandagatla 3215bcee7ed0SSrinivas Kandagatla z_right: 3216bcee7ed0SSrinivas Kandagatla if (!zr) 3217bcee7ed0SSrinivas Kandagatla return; 3218bcee7ed0SSrinivas Kandagatla /* Start impedance measurement for HPH_R */ 3219bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3220bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_ZDET, 0x40, 0x40); 3221bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: ramp for HPH_R, noff = %d\n", 3222bcee7ed0SSrinivas Kandagatla __func__, zdet_param->noff); 3223bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_get_result_params(wcd938x, d1_a, zdet_param->noff, &zdet); 3224bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3225bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_ZDET, 0x40, 0x00); 3226bcee7ed0SSrinivas Kandagatla 3227bcee7ed0SSrinivas Kandagatla *zr = zdet; 3228bcee7ed0SSrinivas Kandagatla } 3229bcee7ed0SSrinivas Kandagatla 3230bcee7ed0SSrinivas Kandagatla static inline void wcd938x_wcd_mbhc_qfuse_cal(struct snd_soc_component *component, 3231bcee7ed0SSrinivas Kandagatla int32_t *z_val, int flag_l_r) 3232bcee7ed0SSrinivas Kandagatla { 3233bcee7ed0SSrinivas Kandagatla s16 q1; 3234bcee7ed0SSrinivas Kandagatla int q1_cal; 3235bcee7ed0SSrinivas Kandagatla 3236bcee7ed0SSrinivas Kandagatla if (*z_val < (WCD938X_ZDET_VAL_400/1000)) 3237bcee7ed0SSrinivas Kandagatla q1 = snd_soc_component_read(component, 3238bcee7ed0SSrinivas Kandagatla WCD938X_DIGITAL_EFUSE_REG_23 + (2 * flag_l_r)); 3239bcee7ed0SSrinivas Kandagatla else 3240bcee7ed0SSrinivas Kandagatla q1 = snd_soc_component_read(component, 3241bcee7ed0SSrinivas Kandagatla WCD938X_DIGITAL_EFUSE_REG_24 + (2 * flag_l_r)); 3242bcee7ed0SSrinivas Kandagatla if (q1 & 0x80) 3243bcee7ed0SSrinivas Kandagatla q1_cal = (10000 - ((q1 & 0x7F) * 25)); 3244bcee7ed0SSrinivas Kandagatla else 3245bcee7ed0SSrinivas Kandagatla q1_cal = (10000 + (q1 * 25)); 3246bcee7ed0SSrinivas Kandagatla if (q1_cal > 0) 3247bcee7ed0SSrinivas Kandagatla *z_val = ((*z_val) * 10000) / q1_cal; 3248bcee7ed0SSrinivas Kandagatla } 3249bcee7ed0SSrinivas Kandagatla 3250bcee7ed0SSrinivas Kandagatla static void wcd938x_wcd_mbhc_calc_impedance(struct snd_soc_component *component, 3251bcee7ed0SSrinivas Kandagatla uint32_t *zl, uint32_t *zr) 3252bcee7ed0SSrinivas Kandagatla { 3253bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3254bcee7ed0SSrinivas Kandagatla s16 reg0, reg1, reg2, reg3, reg4; 3255bcee7ed0SSrinivas Kandagatla int32_t z1L, z1R, z1Ls; 3256bcee7ed0SSrinivas Kandagatla int zMono, z_diff1, z_diff2; 3257bcee7ed0SSrinivas Kandagatla bool is_fsm_disable = false; 3258bcee7ed0SSrinivas Kandagatla struct wcd938x_mbhc_zdet_param zdet_param[] = { 3259bcee7ed0SSrinivas Kandagatla {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */ 3260bcee7ed0SSrinivas Kandagatla {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */ 3261bcee7ed0SSrinivas Kandagatla {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */ 3262bcee7ed0SSrinivas Kandagatla {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */ 3263bcee7ed0SSrinivas Kandagatla }; 3264bcee7ed0SSrinivas Kandagatla struct wcd938x_mbhc_zdet_param *zdet_param_ptr = NULL; 3265bcee7ed0SSrinivas Kandagatla s16 d1_a[][4] = { 3266bcee7ed0SSrinivas Kandagatla {0, 30, 90, 30}, 3267bcee7ed0SSrinivas Kandagatla {0, 30, 30, 5}, 3268bcee7ed0SSrinivas Kandagatla {0, 30, 30, 5}, 3269bcee7ed0SSrinivas Kandagatla {0, 30, 30, 5}, 3270bcee7ed0SSrinivas Kandagatla }; 3271bcee7ed0SSrinivas Kandagatla s16 *d1 = NULL; 3272bcee7ed0SSrinivas Kandagatla 3273bcee7ed0SSrinivas Kandagatla reg0 = snd_soc_component_read(component, WCD938X_ANA_MBHC_BTN5); 3274bcee7ed0SSrinivas Kandagatla reg1 = snd_soc_component_read(component, WCD938X_ANA_MBHC_BTN6); 3275bcee7ed0SSrinivas Kandagatla reg2 = snd_soc_component_read(component, WCD938X_ANA_MBHC_BTN7); 3276bcee7ed0SSrinivas Kandagatla reg3 = snd_soc_component_read(component, WCD938X_MBHC_CTL_CLK); 3277bcee7ed0SSrinivas Kandagatla reg4 = snd_soc_component_read(component, WCD938X_MBHC_NEW_ZDET_ANA_CTL); 3278bcee7ed0SSrinivas Kandagatla 3279bcee7ed0SSrinivas Kandagatla if (snd_soc_component_read(component, WCD938X_ANA_MBHC_ELECT) & 0x80) { 3280bcee7ed0SSrinivas Kandagatla is_fsm_disable = true; 3281bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3282bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_ELECT, 0x80, 0x00); 3283bcee7ed0SSrinivas Kandagatla } 3284bcee7ed0SSrinivas Kandagatla 3285bcee7ed0SSrinivas Kandagatla /* For NO-jack, disable L_DET_EN before Z-det measurements */ 3286bcee7ed0SSrinivas Kandagatla if (wcd938x->mbhc_cfg.hphl_swh) 3287bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3288bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_MECH, 0x80, 0x00); 3289bcee7ed0SSrinivas Kandagatla 3290bcee7ed0SSrinivas Kandagatla /* Turn off 100k pull down on HPHL */ 3291bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3292bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_MECH, 0x01, 0x00); 3293bcee7ed0SSrinivas Kandagatla 3294bcee7ed0SSrinivas Kandagatla /* Disable surge protection before impedance detection. 3295bcee7ed0SSrinivas Kandagatla * This is done to give correct value for high impedance. 3296bcee7ed0SSrinivas Kandagatla */ 3297bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3298bcee7ed0SSrinivas Kandagatla WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0x00); 3299bcee7ed0SSrinivas Kandagatla /* 1ms delay needed after disable surge protection */ 3300bcee7ed0SSrinivas Kandagatla usleep_range(1000, 1010); 3301bcee7ed0SSrinivas Kandagatla 3302bcee7ed0SSrinivas Kandagatla /* First get impedance on Left */ 3303bcee7ed0SSrinivas Kandagatla d1 = d1_a[1]; 3304bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[1]; 3305bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_zdet_ramp(component, zdet_param_ptr, &z1L, NULL, d1); 3306bcee7ed0SSrinivas Kandagatla 3307bcee7ed0SSrinivas Kandagatla if (!WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z1L)) 3308bcee7ed0SSrinivas Kandagatla goto left_ch_impedance; 3309bcee7ed0SSrinivas Kandagatla 3310bcee7ed0SSrinivas Kandagatla /* Second ramp for left ch */ 3311bcee7ed0SSrinivas Kandagatla if (z1L < WCD938X_ZDET_VAL_32) { 3312bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[0]; 3313bcee7ed0SSrinivas Kandagatla d1 = d1_a[0]; 3314bcee7ed0SSrinivas Kandagatla } else if ((z1L > WCD938X_ZDET_VAL_400) && 3315bcee7ed0SSrinivas Kandagatla (z1L <= WCD938X_ZDET_VAL_1200)) { 3316bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[2]; 3317bcee7ed0SSrinivas Kandagatla d1 = d1_a[2]; 3318bcee7ed0SSrinivas Kandagatla } else if (z1L > WCD938X_ZDET_VAL_1200) { 3319bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[3]; 3320bcee7ed0SSrinivas Kandagatla d1 = d1_a[3]; 3321bcee7ed0SSrinivas Kandagatla } 3322bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_zdet_ramp(component, zdet_param_ptr, &z1L, NULL, d1); 3323bcee7ed0SSrinivas Kandagatla 3324bcee7ed0SSrinivas Kandagatla left_ch_impedance: 3325bcee7ed0SSrinivas Kandagatla if ((z1L == WCD938X_ZDET_FLOATING_IMPEDANCE) || 3326bcee7ed0SSrinivas Kandagatla (z1L > WCD938X_ZDET_VAL_100K)) { 3327bcee7ed0SSrinivas Kandagatla *zl = WCD938X_ZDET_FLOATING_IMPEDANCE; 3328bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[1]; 3329bcee7ed0SSrinivas Kandagatla d1 = d1_a[1]; 3330bcee7ed0SSrinivas Kandagatla } else { 3331bcee7ed0SSrinivas Kandagatla *zl = z1L/1000; 3332bcee7ed0SSrinivas Kandagatla wcd938x_wcd_mbhc_qfuse_cal(component, zl, 0); 3333bcee7ed0SSrinivas Kandagatla } 3334bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n", 3335bcee7ed0SSrinivas Kandagatla __func__, *zl); 3336bcee7ed0SSrinivas Kandagatla 3337bcee7ed0SSrinivas Kandagatla /* Start of right impedance ramp and calculation */ 3338bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_zdet_ramp(component, zdet_param_ptr, NULL, &z1R, d1); 3339bcee7ed0SSrinivas Kandagatla if (WCD938X_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) { 3340bcee7ed0SSrinivas Kandagatla if (((z1R > WCD938X_ZDET_VAL_1200) && 3341bcee7ed0SSrinivas Kandagatla (zdet_param_ptr->noff == 0x6)) || 3342bcee7ed0SSrinivas Kandagatla ((*zl) != WCD938X_ZDET_FLOATING_IMPEDANCE)) 3343bcee7ed0SSrinivas Kandagatla goto right_ch_impedance; 3344bcee7ed0SSrinivas Kandagatla /* Second ramp for right ch */ 3345bcee7ed0SSrinivas Kandagatla if (z1R < WCD938X_ZDET_VAL_32) { 3346bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[0]; 3347bcee7ed0SSrinivas Kandagatla d1 = d1_a[0]; 3348bcee7ed0SSrinivas Kandagatla } else if ((z1R > WCD938X_ZDET_VAL_400) && 3349bcee7ed0SSrinivas Kandagatla (z1R <= WCD938X_ZDET_VAL_1200)) { 3350bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[2]; 3351bcee7ed0SSrinivas Kandagatla d1 = d1_a[2]; 3352bcee7ed0SSrinivas Kandagatla } else if (z1R > WCD938X_ZDET_VAL_1200) { 3353bcee7ed0SSrinivas Kandagatla zdet_param_ptr = &zdet_param[3]; 3354bcee7ed0SSrinivas Kandagatla d1 = d1_a[3]; 3355bcee7ed0SSrinivas Kandagatla } 3356bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_zdet_ramp(component, zdet_param_ptr, NULL, &z1R, d1); 3357bcee7ed0SSrinivas Kandagatla } 3358bcee7ed0SSrinivas Kandagatla right_ch_impedance: 3359bcee7ed0SSrinivas Kandagatla if ((z1R == WCD938X_ZDET_FLOATING_IMPEDANCE) || 3360bcee7ed0SSrinivas Kandagatla (z1R > WCD938X_ZDET_VAL_100K)) { 3361bcee7ed0SSrinivas Kandagatla *zr = WCD938X_ZDET_FLOATING_IMPEDANCE; 3362bcee7ed0SSrinivas Kandagatla } else { 3363bcee7ed0SSrinivas Kandagatla *zr = z1R/1000; 3364bcee7ed0SSrinivas Kandagatla wcd938x_wcd_mbhc_qfuse_cal(component, zr, 1); 3365bcee7ed0SSrinivas Kandagatla } 3366bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n", 3367bcee7ed0SSrinivas Kandagatla __func__, *zr); 3368bcee7ed0SSrinivas Kandagatla 3369bcee7ed0SSrinivas Kandagatla /* Mono/stereo detection */ 3370bcee7ed0SSrinivas Kandagatla if ((*zl == WCD938X_ZDET_FLOATING_IMPEDANCE) && 3371bcee7ed0SSrinivas Kandagatla (*zr == WCD938X_ZDET_FLOATING_IMPEDANCE)) { 3372bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, 3373bcee7ed0SSrinivas Kandagatla "%s: plug type is invalid or extension cable\n", 3374bcee7ed0SSrinivas Kandagatla __func__); 3375bcee7ed0SSrinivas Kandagatla goto zdet_complete; 3376bcee7ed0SSrinivas Kandagatla } 3377bcee7ed0SSrinivas Kandagatla if ((*zl == WCD938X_ZDET_FLOATING_IMPEDANCE) || 3378bcee7ed0SSrinivas Kandagatla (*zr == WCD938X_ZDET_FLOATING_IMPEDANCE) || 3379bcee7ed0SSrinivas Kandagatla ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) || 3380bcee7ed0SSrinivas Kandagatla ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) { 3381bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, 3382bcee7ed0SSrinivas Kandagatla "%s: Mono plug type with one ch floating or shorted to GND\n", 3383bcee7ed0SSrinivas Kandagatla __func__); 3384bcee7ed0SSrinivas Kandagatla wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO); 3385bcee7ed0SSrinivas Kandagatla goto zdet_complete; 3386bcee7ed0SSrinivas Kandagatla } 3387bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_R_ATEST, 3388bcee7ed0SSrinivas Kandagatla WCD938X_HPHPA_GND_OVR_MASK, 1); 3389bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_PA_CTL2, 3390bcee7ed0SSrinivas Kandagatla WCD938X_HPHPA_GND_R_MASK, 1); 3391bcee7ed0SSrinivas Kandagatla if (*zl < (WCD938X_ZDET_VAL_32/1000)) 3392bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_zdet_ramp(component, &zdet_param[0], &z1Ls, NULL, d1); 3393bcee7ed0SSrinivas Kandagatla else 3394bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_zdet_ramp(component, &zdet_param[1], &z1Ls, NULL, d1); 3395bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_PA_CTL2, 3396bcee7ed0SSrinivas Kandagatla WCD938X_HPHPA_GND_R_MASK, 0); 3397bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_R_ATEST, 3398bcee7ed0SSrinivas Kandagatla WCD938X_HPHPA_GND_OVR_MASK, 0); 3399bcee7ed0SSrinivas Kandagatla z1Ls /= 1000; 3400bcee7ed0SSrinivas Kandagatla wcd938x_wcd_mbhc_qfuse_cal(component, &z1Ls, 0); 3401bcee7ed0SSrinivas Kandagatla /* Parallel of left Z and 9 ohm pull down resistor */ 3402bcee7ed0SSrinivas Kandagatla zMono = ((*zl) * 9) / ((*zl) + 9); 3403bcee7ed0SSrinivas Kandagatla z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); 3404bcee7ed0SSrinivas Kandagatla z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); 3405bcee7ed0SSrinivas Kandagatla if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) { 3406bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: stereo plug type detected\n", 3407bcee7ed0SSrinivas Kandagatla __func__); 3408bcee7ed0SSrinivas Kandagatla wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_STEREO); 3409bcee7ed0SSrinivas Kandagatla } else { 3410bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: MONO plug type detected\n", 3411bcee7ed0SSrinivas Kandagatla __func__); 3412bcee7ed0SSrinivas Kandagatla wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO); 3413bcee7ed0SSrinivas Kandagatla } 3414bcee7ed0SSrinivas Kandagatla 3415bcee7ed0SSrinivas Kandagatla /* Enable surge protection again after impedance detection */ 3416bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3417bcee7ed0SSrinivas Kandagatla WCD938X_HPH_SURGE_HPHLR_SURGE_EN, 0xC0, 0xC0); 3418bcee7ed0SSrinivas Kandagatla zdet_complete: 3419bcee7ed0SSrinivas Kandagatla snd_soc_component_write(component, WCD938X_ANA_MBHC_BTN5, reg0); 3420bcee7ed0SSrinivas Kandagatla snd_soc_component_write(component, WCD938X_ANA_MBHC_BTN6, reg1); 3421bcee7ed0SSrinivas Kandagatla snd_soc_component_write(component, WCD938X_ANA_MBHC_BTN7, reg2); 3422bcee7ed0SSrinivas Kandagatla /* Turn on 100k pull down on HPHL */ 3423bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3424bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_MECH, 0x01, 0x01); 3425bcee7ed0SSrinivas Kandagatla 3426bcee7ed0SSrinivas Kandagatla /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ 3427bcee7ed0SSrinivas Kandagatla if (wcd938x->mbhc_cfg.hphl_swh) 3428bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3429bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_MECH, 0x80, 0x80); 3430bcee7ed0SSrinivas Kandagatla 3431bcee7ed0SSrinivas Kandagatla snd_soc_component_write(component, WCD938X_MBHC_NEW_ZDET_ANA_CTL, reg4); 3432bcee7ed0SSrinivas Kandagatla snd_soc_component_write(component, WCD938X_MBHC_CTL_CLK, reg3); 3433bcee7ed0SSrinivas Kandagatla if (is_fsm_disable) 3434bcee7ed0SSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, 3435bcee7ed0SSrinivas Kandagatla WCD938X_ANA_MBHC_ELECT, 0x80, 0x80); 3436bcee7ed0SSrinivas Kandagatla } 3437bcee7ed0SSrinivas Kandagatla 3438bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_gnd_det_ctrl(struct snd_soc_component *component, 3439bcee7ed0SSrinivas Kandagatla bool enable) 3440bcee7ed0SSrinivas Kandagatla { 3441bcee7ed0SSrinivas Kandagatla if (enable) { 3442bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MBHC_MECH, 3443bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_HSG_PULLUP_COMP_EN, 1); 3444bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MBHC_MECH, 3445bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_GND_DET_EN_MASK, 1); 3446bcee7ed0SSrinivas Kandagatla } else { 3447bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MBHC_MECH, 3448bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_GND_DET_EN_MASK, 0); 3449bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_ANA_MBHC_MECH, 3450bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_HSG_PULLUP_COMP_EN, 0); 3451bcee7ed0SSrinivas Kandagatla } 3452bcee7ed0SSrinivas Kandagatla } 3453bcee7ed0SSrinivas Kandagatla 3454bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_hph_pull_down_ctrl(struct snd_soc_component *component, 3455bcee7ed0SSrinivas Kandagatla bool enable) 3456bcee7ed0SSrinivas Kandagatla { 3457bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_PA_CTL2, 3458bcee7ed0SSrinivas Kandagatla WCD938X_HPHPA_GND_R_MASK, enable); 3459bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_HPH_PA_CTL2, 3460bcee7ed0SSrinivas Kandagatla WCD938X_HPHPA_GND_L_MASK, enable); 3461bcee7ed0SSrinivas Kandagatla } 3462bcee7ed0SSrinivas Kandagatla 3463bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_moisture_config(struct snd_soc_component *component) 3464bcee7ed0SSrinivas Kandagatla { 3465bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3466bcee7ed0SSrinivas Kandagatla 3467bcee7ed0SSrinivas Kandagatla if (wcd938x->mbhc_cfg.moist_rref == R_OFF) { 3468bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3469bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, R_OFF); 3470bcee7ed0SSrinivas Kandagatla return; 3471bcee7ed0SSrinivas Kandagatla } 3472bcee7ed0SSrinivas Kandagatla 3473bcee7ed0SSrinivas Kandagatla /* Do not enable moisture detection if jack type is NC */ 3474bcee7ed0SSrinivas Kandagatla if (!wcd938x->mbhc_cfg.hphl_swh) { 3475bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: disable moisture detection for NC\n", 3476bcee7ed0SSrinivas Kandagatla __func__); 3477bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3478bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, R_OFF); 3479bcee7ed0SSrinivas Kandagatla return; 3480bcee7ed0SSrinivas Kandagatla } 3481bcee7ed0SSrinivas Kandagatla 3482bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3483bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref); 3484bcee7ed0SSrinivas Kandagatla } 3485bcee7ed0SSrinivas Kandagatla 3486bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_moisture_detect_en(struct snd_soc_component *component, bool enable) 3487bcee7ed0SSrinivas Kandagatla { 3488bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3489bcee7ed0SSrinivas Kandagatla 3490bcee7ed0SSrinivas Kandagatla if (enable) 3491bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3492bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref); 3493bcee7ed0SSrinivas Kandagatla else 3494bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3495bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, R_OFF); 3496bcee7ed0SSrinivas Kandagatla } 3497bcee7ed0SSrinivas Kandagatla 3498bcee7ed0SSrinivas Kandagatla static bool wcd938x_mbhc_get_moisture_status(struct snd_soc_component *component) 3499bcee7ed0SSrinivas Kandagatla { 3500bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3501bcee7ed0SSrinivas Kandagatla bool ret = false; 3502bcee7ed0SSrinivas Kandagatla 3503bcee7ed0SSrinivas Kandagatla if (wcd938x->mbhc_cfg.moist_rref == R_OFF) { 3504bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3505bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, R_OFF); 3506bcee7ed0SSrinivas Kandagatla goto done; 3507bcee7ed0SSrinivas Kandagatla } 3508bcee7ed0SSrinivas Kandagatla 3509bcee7ed0SSrinivas Kandagatla /* Do not enable moisture detection if jack type is NC */ 3510bcee7ed0SSrinivas Kandagatla if (!wcd938x->mbhc_cfg.hphl_swh) { 3511bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: disable moisture detection for NC\n", 3512bcee7ed0SSrinivas Kandagatla __func__); 3513bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, WCD938X_MBHC_NEW_CTL_2, 3514bcee7ed0SSrinivas Kandagatla WCD938X_M_RTH_CTL_MASK, R_OFF); 3515bcee7ed0SSrinivas Kandagatla goto done; 3516bcee7ed0SSrinivas Kandagatla } 3517bcee7ed0SSrinivas Kandagatla 3518bcee7ed0SSrinivas Kandagatla /* 3519bcee7ed0SSrinivas Kandagatla * If moisture_en is already enabled, then skip to plug type 3520bcee7ed0SSrinivas Kandagatla * detection. 3521bcee7ed0SSrinivas Kandagatla */ 3522bcee7ed0SSrinivas Kandagatla if (snd_soc_component_read_field(component, WCD938X_MBHC_NEW_CTL_2, WCD938X_M_RTH_CTL_MASK)) 3523bcee7ed0SSrinivas Kandagatla goto done; 3524bcee7ed0SSrinivas Kandagatla 3525bcee7ed0SSrinivas Kandagatla wcd938x_mbhc_moisture_detect_en(component, true); 3526bcee7ed0SSrinivas Kandagatla /* Read moisture comparator status */ 3527bcee7ed0SSrinivas Kandagatla ret = ((snd_soc_component_read(component, WCD938X_MBHC_NEW_FSM_STATUS) 3528bcee7ed0SSrinivas Kandagatla & 0x20) ? 0 : 1); 3529bcee7ed0SSrinivas Kandagatla 3530bcee7ed0SSrinivas Kandagatla done: 3531bcee7ed0SSrinivas Kandagatla return ret; 3532bcee7ed0SSrinivas Kandagatla 3533bcee7ed0SSrinivas Kandagatla } 3534bcee7ed0SSrinivas Kandagatla 3535bcee7ed0SSrinivas Kandagatla static void wcd938x_mbhc_moisture_polling_ctrl(struct snd_soc_component *component, 3536bcee7ed0SSrinivas Kandagatla bool enable) 3537bcee7ed0SSrinivas Kandagatla { 3538bcee7ed0SSrinivas Kandagatla snd_soc_component_write_field(component, 3539bcee7ed0SSrinivas Kandagatla WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 3540bcee7ed0SSrinivas Kandagatla WCD938X_MOISTURE_EN_POLLING_MASK, enable); 3541bcee7ed0SSrinivas Kandagatla } 3542bcee7ed0SSrinivas Kandagatla 3543bcee7ed0SSrinivas Kandagatla static const struct wcd_mbhc_cb mbhc_cb = { 3544bcee7ed0SSrinivas Kandagatla .clk_setup = wcd938x_mbhc_clk_setup, 3545bcee7ed0SSrinivas Kandagatla .mbhc_bias = wcd938x_mbhc_mbhc_bias_control, 3546bcee7ed0SSrinivas Kandagatla .set_btn_thr = wcd938x_mbhc_program_btn_thr, 3547bcee7ed0SSrinivas Kandagatla .micbias_enable_status = wcd938x_mbhc_micb_en_status, 3548bcee7ed0SSrinivas Kandagatla .hph_pull_up_control_v2 = wcd938x_mbhc_hph_l_pull_up_control, 3549bcee7ed0SSrinivas Kandagatla .mbhc_micbias_control = wcd938x_mbhc_request_micbias, 3550bcee7ed0SSrinivas Kandagatla .mbhc_micb_ramp_control = wcd938x_mbhc_micb_ramp_control, 3551bcee7ed0SSrinivas Kandagatla .mbhc_micb_ctrl_thr_mic = wcd938x_mbhc_micb_ctrl_threshold_mic, 3552bcee7ed0SSrinivas Kandagatla .compute_impedance = wcd938x_wcd_mbhc_calc_impedance, 3553bcee7ed0SSrinivas Kandagatla .mbhc_gnd_det_ctrl = wcd938x_mbhc_gnd_det_ctrl, 3554bcee7ed0SSrinivas Kandagatla .hph_pull_down_ctrl = wcd938x_mbhc_hph_pull_down_ctrl, 3555bcee7ed0SSrinivas Kandagatla .mbhc_moisture_config = wcd938x_mbhc_moisture_config, 3556bcee7ed0SSrinivas Kandagatla .mbhc_get_moisture_status = wcd938x_mbhc_get_moisture_status, 3557bcee7ed0SSrinivas Kandagatla .mbhc_moisture_polling_ctrl = wcd938x_mbhc_moisture_polling_ctrl, 3558bcee7ed0SSrinivas Kandagatla .mbhc_moisture_detect_en = wcd938x_mbhc_moisture_detect_en, 3559bcee7ed0SSrinivas Kandagatla }; 3560bcee7ed0SSrinivas Kandagatla 3561bcee7ed0SSrinivas Kandagatla static int wcd938x_get_hph_type(struct snd_kcontrol *kcontrol, 3562bcee7ed0SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 3563bcee7ed0SSrinivas Kandagatla { 3564bcee7ed0SSrinivas Kandagatla struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 3565bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3566bcee7ed0SSrinivas Kandagatla 3567bcee7ed0SSrinivas Kandagatla ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd938x->wcd_mbhc); 3568bcee7ed0SSrinivas Kandagatla 3569bcee7ed0SSrinivas Kandagatla return 0; 3570bcee7ed0SSrinivas Kandagatla } 3571bcee7ed0SSrinivas Kandagatla 3572bcee7ed0SSrinivas Kandagatla static int wcd938x_hph_impedance_get(struct snd_kcontrol *kcontrol, 3573bcee7ed0SSrinivas Kandagatla struct snd_ctl_elem_value *ucontrol) 3574bcee7ed0SSrinivas Kandagatla { 3575bcee7ed0SSrinivas Kandagatla uint32_t zl, zr; 3576bcee7ed0SSrinivas Kandagatla bool hphr; 3577bcee7ed0SSrinivas Kandagatla struct soc_mixer_control *mc; 3578bcee7ed0SSrinivas Kandagatla struct snd_soc_component *component = 3579bcee7ed0SSrinivas Kandagatla snd_soc_kcontrol_component(kcontrol); 3580bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3581bcee7ed0SSrinivas Kandagatla 3582bcee7ed0SSrinivas Kandagatla mc = (struct soc_mixer_control *)(kcontrol->private_value); 3583bcee7ed0SSrinivas Kandagatla hphr = mc->shift; 3584bcee7ed0SSrinivas Kandagatla wcd_mbhc_get_impedance(wcd938x->wcd_mbhc, &zl, &zr); 3585bcee7ed0SSrinivas Kandagatla dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); 3586bcee7ed0SSrinivas Kandagatla ucontrol->value.integer.value[0] = hphr ? zr : zl; 3587bcee7ed0SSrinivas Kandagatla 3588bcee7ed0SSrinivas Kandagatla return 0; 3589bcee7ed0SSrinivas Kandagatla } 3590bcee7ed0SSrinivas Kandagatla 3591bcee7ed0SSrinivas Kandagatla static const struct snd_kcontrol_new hph_type_detect_controls[] = { 3592b0217519SSrinivas Kandagatla SOC_SINGLE_EXT("HPH Type", 0, 0, WCD_MBHC_HPH_STEREO, 0, 3593bcee7ed0SSrinivas Kandagatla wcd938x_get_hph_type, NULL), 3594bcee7ed0SSrinivas Kandagatla }; 3595bcee7ed0SSrinivas Kandagatla 3596bcee7ed0SSrinivas Kandagatla static const struct snd_kcontrol_new impedance_detect_controls[] = { 3597b0217519SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL Impedance", 0, 0, INT_MAX, 0, 3598bcee7ed0SSrinivas Kandagatla wcd938x_hph_impedance_get, NULL), 3599b0217519SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR Impedance", 0, 1, INT_MAX, 0, 3600bcee7ed0SSrinivas Kandagatla wcd938x_hph_impedance_get, NULL), 3601bcee7ed0SSrinivas Kandagatla }; 3602bcee7ed0SSrinivas Kandagatla 3603bcee7ed0SSrinivas Kandagatla static int wcd938x_mbhc_init(struct snd_soc_component *component) 3604bcee7ed0SSrinivas Kandagatla { 3605bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 3606bcee7ed0SSrinivas Kandagatla struct wcd_mbhc_intr *intr_ids = &wcd938x->intr_ids; 3607bcee7ed0SSrinivas Kandagatla 3608bcee7ed0SSrinivas Kandagatla intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd938x->irq_chip, 3609bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_MBHC_SW_DET); 3610bcee7ed0SSrinivas Kandagatla intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd938x->irq_chip, 3611bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_PRESS_DET); 3612bcee7ed0SSrinivas Kandagatla intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd938x->irq_chip, 3613bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET); 3614bcee7ed0SSrinivas Kandagatla intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd938x->irq_chip, 3615bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_LEG_DET); 3616bcee7ed0SSrinivas Kandagatla intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd938x->irq_chip, 3617bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_MBHC_ELECT_INS_REM_DET); 3618bcee7ed0SSrinivas Kandagatla intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd938x->irq_chip, 3619bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_HPHL_OCP_INT); 3620bcee7ed0SSrinivas Kandagatla intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd938x->irq_chip, 3621bcee7ed0SSrinivas Kandagatla WCD938X_IRQ_HPHR_OCP_INT); 3622bcee7ed0SSrinivas Kandagatla 3623bcee7ed0SSrinivas Kandagatla wcd938x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); 3624bcee7ed0SSrinivas Kandagatla 3625bcee7ed0SSrinivas Kandagatla snd_soc_add_component_controls(component, impedance_detect_controls, 3626bcee7ed0SSrinivas Kandagatla ARRAY_SIZE(impedance_detect_controls)); 3627bcee7ed0SSrinivas Kandagatla snd_soc_add_component_controls(component, hph_type_detect_controls, 3628bcee7ed0SSrinivas Kandagatla ARRAY_SIZE(hph_type_detect_controls)); 3629bcee7ed0SSrinivas Kandagatla 3630bcee7ed0SSrinivas Kandagatla return 0; 3631bcee7ed0SSrinivas Kandagatla } 3632bcee7ed0SSrinivas Kandagatla /* END MBHC */ 3633bcee7ed0SSrinivas Kandagatla 3634e8ba1e05SSrinivas Kandagatla static const struct snd_kcontrol_new wcd938x_snd_controls[] = { 3635e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL_COMP Switch", WCD938X_COMP_L, 0, 1, 0, 3636e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 3637e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR_COMP Switch", WCD938X_COMP_R, 1, 1, 0, 3638e8ba1e05SSrinivas Kandagatla wcd938x_get_compander, wcd938x_set_compander), 3639e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHL Switch", WCD938X_HPH_L, 0, 1, 0, 3640e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3641e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("HPHR Switch", WCD938X_HPH_R, 0, 1, 0, 3642e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3643e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("CLSH Switch", WCD938X_CLSH, 0, 1, 0, 3644e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3645e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LO Switch", WCD938X_LO, 0, 1, 0, 3646e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3647e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_L Switch", WCD938X_DSD_L, 0, 1, 0, 3648e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3649e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DSD_R Switch", WCD938X_DSD_R, 0, 1, 0, 3650e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3651e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHL Volume", WCD938X_HPH_L_EN, 0, 0x18, 0, line_gain), 3652e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("HPHR Volume", WCD938X_HPH_R_EN, 0, 0x18, 0, line_gain), 3653e8ba1e05SSrinivas Kandagatla WCD938X_EAR_PA_GAIN_TLV("EAR_PA Volume", WCD938X_ANA_EAR_COMPANDER_CTL, 3654e8ba1e05SSrinivas Kandagatla 2, 0x10, 0, ear_pa_gain), 3655e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC1 Switch", WCD938X_ADC1, 1, 1, 0, 3656e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3657e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2 Switch", WCD938X_ADC2, 1, 1, 0, 3658e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3659e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC3 Switch", WCD938X_ADC3, 1, 1, 0, 3660e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3661e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC4 Switch", WCD938X_ADC4, 1, 1, 0, 3662e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3663e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC0 Switch", WCD938X_DMIC0, 1, 1, 0, 3664e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3665e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC1 Switch", WCD938X_DMIC1, 1, 1, 0, 3666e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3667e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("MBHC Switch", WCD938X_MBHC, 1, 1, 0, 3668e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3669e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC2 Switch", WCD938X_DMIC2, 1, 1, 0, 3670e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3671e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC3 Switch", WCD938X_DMIC3, 1, 1, 0, 3672e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3673e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC4 Switch", WCD938X_DMIC4, 1, 1, 0, 3674e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3675e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC5 Switch", WCD938X_DMIC5, 1, 1, 0, 3676e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3677e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC6 Switch", WCD938X_DMIC6, 1, 1, 0, 3678e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3679e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("DMIC7 Switch", WCD938X_DMIC7, 1, 1, 0, 3680e8ba1e05SSrinivas Kandagatla wcd938x_get_swr_port, wcd938x_set_swr_port), 3681e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("LDOH Enable Switch", SND_SOC_NOPM, 0, 1, 0, 3682e8ba1e05SSrinivas Kandagatla wcd938x_ldoh_get, wcd938x_ldoh_put), 3683e8ba1e05SSrinivas Kandagatla SOC_SINGLE_EXT("ADC2_BCS Disable Switch", SND_SOC_NOPM, 0, 1, 0, 3684e8ba1e05SSrinivas Kandagatla wcd938x_bcs_get, wcd938x_bcs_put), 3685e8ba1e05SSrinivas Kandagatla 3686e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC1 Volume", WCD938X_ANA_TX_CH1, 0, 20, 0, analog_gain), 3687e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC2 Volume", WCD938X_ANA_TX_CH2, 0, 20, 0, analog_gain), 3688e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC3 Volume", WCD938X_ANA_TX_CH3, 0, 20, 0, analog_gain), 3689e8ba1e05SSrinivas Kandagatla SOC_SINGLE_TLV("ADC4 Volume", WCD938X_ANA_TX_CH4, 0, 20, 0, analog_gain), 3690e8ba1e05SSrinivas Kandagatla }; 3691e8ba1e05SSrinivas Kandagatla 36928da9db0cSSrinivas Kandagatla static const struct snd_soc_dapm_widget wcd938x_dapm_widgets[] = { 3693d5add08fSSrinivas Kandagatla 3694d5add08fSSrinivas Kandagatla /*input widgets*/ 3695d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC1"), 3696d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC2"), 3697d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC3"), 3698d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC4"), 3699d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC5"), 3700d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC6"), 3701d5add08fSSrinivas Kandagatla SND_SOC_DAPM_INPUT("AMIC7"), 3702d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic1", NULL), 3703d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic2", NULL), 3704d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic3", NULL), 3705d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic4", NULL), 3706d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIC("Analog Mic5", NULL), 3707d5add08fSSrinivas Kandagatla 3708d5add08fSSrinivas Kandagatla /*tx widgets*/ 3709d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0, 3710d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 3711d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3712d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0, 3713d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 3714d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3715d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0, 3716d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 3717d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3718d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("ADC4", NULL, SND_SOC_NOPM, 3, 0, 3719d5add08fSSrinivas Kandagatla wcd938x_codec_enable_adc, 3720d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3721d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0, 3722d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3723d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3724d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0, 3725d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3726d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3727d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0, 3728d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3729d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3730d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0, 3731d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3732d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3733d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0, 3734d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3735d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3736d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0, 3737d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3738d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3739d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC7", NULL, SND_SOC_NOPM, 6, 0, 3740d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3741d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3742d5add08fSSrinivas Kandagatla SND_SOC_DAPM_ADC_E("DMIC8", NULL, SND_SOC_NOPM, 7, 0, 3743d5add08fSSrinivas Kandagatla wcd938x_codec_enable_dmic, 3744d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3745d5add08fSSrinivas Kandagatla 3746d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC1 REQ", SND_SOC_NOPM, 0, 0, 3747d5add08fSSrinivas Kandagatla NULL, 0, wcd938x_adc_enable_req, 3748d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3749d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 1, 0, 3750d5add08fSSrinivas Kandagatla NULL, 0, wcd938x_adc_enable_req, 3751d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3752d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC3 REQ", SND_SOC_NOPM, 2, 0, 3753d5add08fSSrinivas Kandagatla NULL, 0, wcd938x_adc_enable_req, 3754d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3755d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC4 REQ", SND_SOC_NOPM, 3, 0, NULL, 0, 3756d5add08fSSrinivas Kandagatla wcd938x_adc_enable_req, 3757d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3758d5add08fSSrinivas Kandagatla 3759d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux), 3760d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("ADC3 MUX", SND_SOC_NOPM, 0, 0, &tx_adc3_mux), 3761d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("ADC4 MUX", SND_SOC_NOPM, 0, 0, &tx_adc4_mux), 3762d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("HDR12 MUX", SND_SOC_NOPM, 0, 0, &tx_hdr12_mux), 3763d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MUX("HDR34 MUX", SND_SOC_NOPM, 0, 0, &tx_hdr34_mux), 3764d5add08fSSrinivas Kandagatla 3765d5add08fSSrinivas Kandagatla /*tx mixers*/ 3766d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC1_MIXER", SND_SOC_NOPM, 0, 0, adc1_switch, 3767d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc1_switch), wcd938x_tx_swr_ctrl, 3768d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3769d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC2_MIXER", SND_SOC_NOPM, 0, 0, adc2_switch, 3770d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc2_switch), wcd938x_tx_swr_ctrl, 3771d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3772d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC3_MIXER", SND_SOC_NOPM, 0, 0, adc3_switch, 3773d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc3_switch), wcd938x_tx_swr_ctrl, 3774d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3775d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("ADC4_MIXER", SND_SOC_NOPM, 0, 0, adc4_switch, 3776d5add08fSSrinivas Kandagatla ARRAY_SIZE(adc4_switch), wcd938x_tx_swr_ctrl, 3777d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3778d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC1_MIXER", SND_SOC_NOPM, 0, 0, dmic1_switch, 3779d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic1_switch), wcd938x_tx_swr_ctrl, 3780d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3781d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC2_MIXER", SND_SOC_NOPM, 0, 0, dmic2_switch, 3782d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic2_switch), wcd938x_tx_swr_ctrl, 3783d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3784d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC3_MIXER", SND_SOC_NOPM, 0, 0, dmic3_switch, 3785d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic3_switch), wcd938x_tx_swr_ctrl, 3786d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3787d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC4_MIXER", SND_SOC_NOPM, 0, 0, dmic4_switch, 3788d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic4_switch), wcd938x_tx_swr_ctrl, 3789d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3790d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC5_MIXER", SND_SOC_NOPM, 0, 0, dmic5_switch, 3791d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic5_switch), wcd938x_tx_swr_ctrl, 3792d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3793d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC6_MIXER", SND_SOC_NOPM, 0, 0, dmic6_switch, 3794d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic6_switch), wcd938x_tx_swr_ctrl, 3795d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3796d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC7_MIXER", SND_SOC_NOPM, 0, 0, dmic7_switch, 3797d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic7_switch), wcd938x_tx_swr_ctrl, 3798d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3799d5add08fSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("DMIC8_MIXER", SND_SOC_NOPM, 0, 0, dmic8_switch, 3800d5add08fSSrinivas Kandagatla ARRAY_SIZE(dmic8_switch), wcd938x_tx_swr_ctrl, 3801d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 3802d5add08fSSrinivas Kandagatla /* micbias widgets*/ 3803d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, MIC_BIAS_1, 0, 3804d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3805d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3806d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3807d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, MIC_BIAS_2, 0, 3808d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3809d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3810d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3811d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, MIC_BIAS_3, 0, 3812d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3813d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3814d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3815d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("MIC BIAS4", SND_SOC_NOPM, MIC_BIAS_4, 0, 3816d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias, 3817d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3818d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3819d5add08fSSrinivas Kandagatla 3820d5add08fSSrinivas Kandagatla /* micbias pull up widgets*/ 3821d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS1", SND_SOC_NOPM, MIC_BIAS_1, 0, 3822d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3823d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3824d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3825d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS2", SND_SOC_NOPM, MIC_BIAS_2, 0, 3826d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3827d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3828d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3829d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS3", SND_SOC_NOPM, MIC_BIAS_3, 0, 3830d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3831d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3832d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3833d5add08fSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VA MIC BIAS4", SND_SOC_NOPM, MIC_BIAS_4, 0, 3834d5add08fSSrinivas Kandagatla wcd938x_codec_enable_micbias_pullup, 3835d5add08fSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 3836d5add08fSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 3837d5add08fSSrinivas Kandagatla 3838d5add08fSSrinivas Kandagatla /*output widgets tx*/ 3839d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC1_OUTPUT"), 3840d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC2_OUTPUT"), 3841d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC3_OUTPUT"), 3842d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("ADC4_OUTPUT"), 3843d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC1_OUTPUT"), 3844d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC2_OUTPUT"), 3845d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC3_OUTPUT"), 3846d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC4_OUTPUT"), 3847d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC5_OUTPUT"), 3848d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC6_OUTPUT"), 3849d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC7_OUTPUT"), 3850d5add08fSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("DMIC8_OUTPUT"), 3851d5add08fSSrinivas Kandagatla 38528da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN1_HPHL"), 38538da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN2_HPHR"), 38548da9db0cSSrinivas Kandagatla SND_SOC_DAPM_INPUT("IN3_AUX"), 38558da9db0cSSrinivas Kandagatla 38568da9db0cSSrinivas Kandagatla /*rx widgets*/ 38578da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("EAR PGA", WCD938X_ANA_EAR, 7, 0, NULL, 0, 38588da9db0cSSrinivas Kandagatla wcd938x_codec_enable_ear_pa, 38598da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38608da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38618da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("AUX PGA", WCD938X_AUX_AUXPA, 7, 0, NULL, 0, 38628da9db0cSSrinivas Kandagatla wcd938x_codec_enable_aux_pa, 38638da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38648da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38658da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("HPHL PGA", WCD938X_ANA_HPH, 7, 0, NULL, 0, 38668da9db0cSSrinivas Kandagatla wcd938x_codec_enable_hphl_pa, 38678da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38688da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38698da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PGA_E("HPHR PGA", WCD938X_ANA_HPH, 6, 0, NULL, 0, 38708da9db0cSSrinivas Kandagatla wcd938x_codec_enable_hphr_pa, 38718da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38728da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38738da9db0cSSrinivas Kandagatla 38748da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, 38758da9db0cSSrinivas Kandagatla wcd938x_codec_hphl_dac_event, 38768da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38778da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38788da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC2", NULL, SND_SOC_NOPM, 0, 0, 38798da9db0cSSrinivas Kandagatla wcd938x_codec_hphr_dac_event, 38808da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38818da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38828da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC3", NULL, SND_SOC_NOPM, 0, 0, 38838da9db0cSSrinivas Kandagatla wcd938x_codec_ear_dac_event, 38848da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38858da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38868da9db0cSSrinivas Kandagatla SND_SOC_DAPM_DAC_E("RDAC4", NULL, SND_SOC_NOPM, 0, 0, 38878da9db0cSSrinivas Kandagatla wcd938x_codec_aux_dac_event, 38888da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38898da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), 38908da9db0cSSrinivas Kandagatla 38918da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MUX("RDAC3_MUX", SND_SOC_NOPM, 0, 0, &rx_rdac3_mux), 38928da9db0cSSrinivas Kandagatla 38938da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("VDD_BUCK", SND_SOC_NOPM, 0, 0, NULL, 0), 38948da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY("RXCLK", SND_SOC_NOPM, 0, 0, 38958da9db0cSSrinivas Kandagatla wcd938x_codec_enable_rxclk, 38968da9db0cSSrinivas Kandagatla SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 38978da9db0cSSrinivas Kandagatla SND_SOC_DAPM_POST_PMD), 38988da9db0cSSrinivas Kandagatla 38998da9db0cSSrinivas Kandagatla SND_SOC_DAPM_SUPPLY_S("CLS_H_PORT", 1, SND_SOC_NOPM, 0, 0, NULL, 0), 39008da9db0cSSrinivas Kandagatla 39018da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX1", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 39028da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX2", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 39038da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER_E("RX3", SND_SOC_NOPM, 0, 0, NULL, 0, NULL, 0), 39048da9db0cSSrinivas Kandagatla 39058da9db0cSSrinivas Kandagatla /* rx mixer widgets*/ 39068da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("EAR_RDAC", SND_SOC_NOPM, 0, 0, 39078da9db0cSSrinivas Kandagatla ear_rdac_switch, ARRAY_SIZE(ear_rdac_switch)), 39088da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("AUX_RDAC", SND_SOC_NOPM, 0, 0, 39098da9db0cSSrinivas Kandagatla aux_rdac_switch, ARRAY_SIZE(aux_rdac_switch)), 39108da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("HPHL_RDAC", SND_SOC_NOPM, 0, 0, 39118da9db0cSSrinivas Kandagatla hphl_rdac_switch, ARRAY_SIZE(hphl_rdac_switch)), 39128da9db0cSSrinivas Kandagatla SND_SOC_DAPM_MIXER("HPHR_RDAC", SND_SOC_NOPM, 0, 0, 39138da9db0cSSrinivas Kandagatla hphr_rdac_switch, ARRAY_SIZE(hphr_rdac_switch)), 39148da9db0cSSrinivas Kandagatla 39158da9db0cSSrinivas Kandagatla /*output widgets rx*/ 39168da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("EAR"), 39178da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("AUX"), 39188da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("HPHL"), 39198da9db0cSSrinivas Kandagatla SND_SOC_DAPM_OUTPUT("HPHR"), 392004544222SSrinivas Kandagatla 392104544222SSrinivas Kandagatla }; 392204544222SSrinivas Kandagatla 392304544222SSrinivas Kandagatla static const struct snd_soc_dapm_route wcd938x_audio_map[] = { 392404544222SSrinivas Kandagatla {"ADC1_OUTPUT", NULL, "ADC1_MIXER"}, 392504544222SSrinivas Kandagatla {"ADC1_MIXER", "Switch", "ADC1 REQ"}, 392604544222SSrinivas Kandagatla {"ADC1 REQ", NULL, "ADC1"}, 392704544222SSrinivas Kandagatla {"ADC1", NULL, "AMIC1"}, 392804544222SSrinivas Kandagatla 392904544222SSrinivas Kandagatla {"ADC2_OUTPUT", NULL, "ADC2_MIXER"}, 393004544222SSrinivas Kandagatla {"ADC2_MIXER", "Switch", "ADC2 REQ"}, 393104544222SSrinivas Kandagatla {"ADC2 REQ", NULL, "ADC2"}, 393204544222SSrinivas Kandagatla {"ADC2", NULL, "HDR12 MUX"}, 393304544222SSrinivas Kandagatla {"HDR12 MUX", "NO_HDR12", "ADC2 MUX"}, 393404544222SSrinivas Kandagatla {"HDR12 MUX", "HDR12", "AMIC1"}, 393504544222SSrinivas Kandagatla {"ADC2 MUX", "INP3", "AMIC3"}, 393604544222SSrinivas Kandagatla {"ADC2 MUX", "INP2", "AMIC2"}, 393704544222SSrinivas Kandagatla 393804544222SSrinivas Kandagatla {"ADC3_OUTPUT", NULL, "ADC3_MIXER"}, 393904544222SSrinivas Kandagatla {"ADC3_MIXER", "Switch", "ADC3 REQ"}, 394004544222SSrinivas Kandagatla {"ADC3 REQ", NULL, "ADC3"}, 394104544222SSrinivas Kandagatla {"ADC3", NULL, "HDR34 MUX"}, 394204544222SSrinivas Kandagatla {"HDR34 MUX", "NO_HDR34", "ADC3 MUX"}, 394304544222SSrinivas Kandagatla {"HDR34 MUX", "HDR34", "AMIC5"}, 394404544222SSrinivas Kandagatla {"ADC3 MUX", "INP4", "AMIC4"}, 394504544222SSrinivas Kandagatla {"ADC3 MUX", "INP6", "AMIC6"}, 394604544222SSrinivas Kandagatla 394704544222SSrinivas Kandagatla {"ADC4_OUTPUT", NULL, "ADC4_MIXER"}, 394804544222SSrinivas Kandagatla {"ADC4_MIXER", "Switch", "ADC4 REQ"}, 394904544222SSrinivas Kandagatla {"ADC4 REQ", NULL, "ADC4"}, 395004544222SSrinivas Kandagatla {"ADC4", NULL, "ADC4 MUX"}, 395104544222SSrinivas Kandagatla {"ADC4 MUX", "INP5", "AMIC5"}, 395204544222SSrinivas Kandagatla {"ADC4 MUX", "INP7", "AMIC7"}, 395304544222SSrinivas Kandagatla 395404544222SSrinivas Kandagatla {"DMIC1_OUTPUT", NULL, "DMIC1_MIXER"}, 395504544222SSrinivas Kandagatla {"DMIC1_MIXER", "Switch", "DMIC1"}, 395604544222SSrinivas Kandagatla 395704544222SSrinivas Kandagatla {"DMIC2_OUTPUT", NULL, "DMIC2_MIXER"}, 395804544222SSrinivas Kandagatla {"DMIC2_MIXER", "Switch", "DMIC2"}, 395904544222SSrinivas Kandagatla 396004544222SSrinivas Kandagatla {"DMIC3_OUTPUT", NULL, "DMIC3_MIXER"}, 396104544222SSrinivas Kandagatla {"DMIC3_MIXER", "Switch", "DMIC3"}, 396204544222SSrinivas Kandagatla 396304544222SSrinivas Kandagatla {"DMIC4_OUTPUT", NULL, "DMIC4_MIXER"}, 396404544222SSrinivas Kandagatla {"DMIC4_MIXER", "Switch", "DMIC4"}, 396504544222SSrinivas Kandagatla 396604544222SSrinivas Kandagatla {"DMIC5_OUTPUT", NULL, "DMIC5_MIXER"}, 396704544222SSrinivas Kandagatla {"DMIC5_MIXER", "Switch", "DMIC5"}, 396804544222SSrinivas Kandagatla 396904544222SSrinivas Kandagatla {"DMIC6_OUTPUT", NULL, "DMIC6_MIXER"}, 397004544222SSrinivas Kandagatla {"DMIC6_MIXER", "Switch", "DMIC6"}, 397104544222SSrinivas Kandagatla 397204544222SSrinivas Kandagatla {"DMIC7_OUTPUT", NULL, "DMIC7_MIXER"}, 397304544222SSrinivas Kandagatla {"DMIC7_MIXER", "Switch", "DMIC7"}, 397404544222SSrinivas Kandagatla 397504544222SSrinivas Kandagatla {"DMIC8_OUTPUT", NULL, "DMIC8_MIXER"}, 397604544222SSrinivas Kandagatla {"DMIC8_MIXER", "Switch", "DMIC8"}, 397704544222SSrinivas Kandagatla 397804544222SSrinivas Kandagatla {"IN1_HPHL", NULL, "VDD_BUCK"}, 397904544222SSrinivas Kandagatla {"IN1_HPHL", NULL, "CLS_H_PORT"}, 398004544222SSrinivas Kandagatla 398104544222SSrinivas Kandagatla {"RX1", NULL, "IN1_HPHL"}, 398204544222SSrinivas Kandagatla {"RX1", NULL, "RXCLK"}, 398304544222SSrinivas Kandagatla {"RDAC1", NULL, "RX1"}, 398404544222SSrinivas Kandagatla {"HPHL_RDAC", "Switch", "RDAC1"}, 398504544222SSrinivas Kandagatla {"HPHL PGA", NULL, "HPHL_RDAC"}, 398604544222SSrinivas Kandagatla {"HPHL", NULL, "HPHL PGA"}, 398704544222SSrinivas Kandagatla 398804544222SSrinivas Kandagatla {"IN2_HPHR", NULL, "VDD_BUCK"}, 398904544222SSrinivas Kandagatla {"IN2_HPHR", NULL, "CLS_H_PORT"}, 399004544222SSrinivas Kandagatla {"RX2", NULL, "IN2_HPHR"}, 399104544222SSrinivas Kandagatla {"RDAC2", NULL, "RX2"}, 399204544222SSrinivas Kandagatla {"RX2", NULL, "RXCLK"}, 399304544222SSrinivas Kandagatla {"HPHR_RDAC", "Switch", "RDAC2"}, 399404544222SSrinivas Kandagatla {"HPHR PGA", NULL, "HPHR_RDAC"}, 399504544222SSrinivas Kandagatla {"HPHR", NULL, "HPHR PGA"}, 399604544222SSrinivas Kandagatla 399704544222SSrinivas Kandagatla {"IN3_AUX", NULL, "VDD_BUCK"}, 399804544222SSrinivas Kandagatla {"IN3_AUX", NULL, "CLS_H_PORT"}, 399904544222SSrinivas Kandagatla {"RX3", NULL, "IN3_AUX"}, 400004544222SSrinivas Kandagatla {"RDAC4", NULL, "RX3"}, 400104544222SSrinivas Kandagatla {"RX3", NULL, "RXCLK"}, 400204544222SSrinivas Kandagatla {"AUX_RDAC", "Switch", "RDAC4"}, 400304544222SSrinivas Kandagatla {"AUX PGA", NULL, "AUX_RDAC"}, 400404544222SSrinivas Kandagatla {"AUX", NULL, "AUX PGA"}, 400504544222SSrinivas Kandagatla 400604544222SSrinivas Kandagatla {"RDAC3_MUX", "RX3", "RX3"}, 400704544222SSrinivas Kandagatla {"RDAC3_MUX", "RX1", "RX1"}, 400804544222SSrinivas Kandagatla {"RDAC3", NULL, "RDAC3_MUX"}, 400904544222SSrinivas Kandagatla {"EAR_RDAC", "Switch", "RDAC3"}, 401004544222SSrinivas Kandagatla {"EAR PGA", NULL, "EAR_RDAC"}, 401104544222SSrinivas Kandagatla {"EAR", NULL, "EAR PGA"}, 40128da9db0cSSrinivas Kandagatla }; 40138da9db0cSSrinivas Kandagatla 40148d78602aSSrinivas Kandagatla static int wcd938x_set_micbias_data(struct wcd938x_priv *wcd938x) 40158d78602aSSrinivas Kandagatla { 40168d78602aSSrinivas Kandagatla int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4; 40178d78602aSSrinivas Kandagatla 40188d78602aSSrinivas Kandagatla /* set micbias voltage */ 40198d78602aSSrinivas Kandagatla vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb1_mv); 40208d78602aSSrinivas Kandagatla vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb2_mv); 40218d78602aSSrinivas Kandagatla vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb3_mv); 40228d78602aSSrinivas Kandagatla vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb4_mv); 40238d78602aSSrinivas Kandagatla if (vout_ctl_1 < 0 || vout_ctl_2 < 0 || vout_ctl_3 < 0 || vout_ctl_4 < 0) 40248d78602aSSrinivas Kandagatla return -EINVAL; 40258d78602aSSrinivas Kandagatla 40268d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, 40278d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_1); 40288d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, 40298d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_2); 40308d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, 40318d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_3); 40328d78602aSSrinivas Kandagatla regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, 40338d78602aSSrinivas Kandagatla WCD938X_MICB_VOUT_MASK, vout_ctl_4); 40348d78602aSSrinivas Kandagatla 40358d78602aSSrinivas Kandagatla return 0; 40368d78602aSSrinivas Kandagatla } 40378d78602aSSrinivas Kandagatla 40388d78602aSSrinivas Kandagatla static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data) 40398d78602aSSrinivas Kandagatla { 40408d78602aSSrinivas Kandagatla return IRQ_HANDLED; 40418d78602aSSrinivas Kandagatla } 40428d78602aSSrinivas Kandagatla 40438d78602aSSrinivas Kandagatla static struct irq_chip wcd_irq_chip = { 40448d78602aSSrinivas Kandagatla .name = "WCD938x", 40458d78602aSSrinivas Kandagatla }; 40468d78602aSSrinivas Kandagatla 40478d78602aSSrinivas Kandagatla static int wcd_irq_chip_map(struct irq_domain *irqd, unsigned int virq, 40488d78602aSSrinivas Kandagatla irq_hw_number_t hw) 40498d78602aSSrinivas Kandagatla { 40508d78602aSSrinivas Kandagatla irq_set_chip_and_handler(virq, &wcd_irq_chip, handle_simple_irq); 40518d78602aSSrinivas Kandagatla irq_set_nested_thread(virq, 1); 40528d78602aSSrinivas Kandagatla irq_set_noprobe(virq); 40538d78602aSSrinivas Kandagatla 40548d78602aSSrinivas Kandagatla return 0; 40558d78602aSSrinivas Kandagatla } 40568d78602aSSrinivas Kandagatla 40578d78602aSSrinivas Kandagatla static const struct irq_domain_ops wcd_domain_ops = { 40588d78602aSSrinivas Kandagatla .map = wcd_irq_chip_map, 40598d78602aSSrinivas Kandagatla }; 40608d78602aSSrinivas Kandagatla 40618d78602aSSrinivas Kandagatla static int wcd938x_irq_init(struct wcd938x_priv *wcd, struct device *dev) 40628d78602aSSrinivas Kandagatla { 40638d78602aSSrinivas Kandagatla 40648d78602aSSrinivas Kandagatla wcd->virq = irq_domain_add_linear(NULL, 1, &wcd_domain_ops, NULL); 40658d78602aSSrinivas Kandagatla if (!(wcd->virq)) { 40668d78602aSSrinivas Kandagatla dev_err(dev, "%s: Failed to add IRQ domain\n", __func__); 40678d78602aSSrinivas Kandagatla return -EINVAL; 40688d78602aSSrinivas Kandagatla } 40698d78602aSSrinivas Kandagatla 40708d78602aSSrinivas Kandagatla return devm_regmap_add_irq_chip(dev, wcd->regmap, 40718d78602aSSrinivas Kandagatla irq_create_mapping(wcd->virq, 0), 40728d78602aSSrinivas Kandagatla IRQF_ONESHOT, 0, &wcd938x_regmap_irq_chip, 40738d78602aSSrinivas Kandagatla &wcd->irq_chip); 40748d78602aSSrinivas Kandagatla } 40758d78602aSSrinivas Kandagatla 40768d78602aSSrinivas Kandagatla static int wcd938x_soc_codec_probe(struct snd_soc_component *component) 40778d78602aSSrinivas Kandagatla { 40788d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); 40798d78602aSSrinivas Kandagatla struct device *dev = component->dev; 40808d78602aSSrinivas Kandagatla int ret, i; 40818d78602aSSrinivas Kandagatla 40828d78602aSSrinivas Kandagatla snd_soc_component_init_regmap(component, wcd938x->regmap); 40838d78602aSSrinivas Kandagatla 40848d78602aSSrinivas Kandagatla wcd938x->variant = snd_soc_component_read_field(component, 40858d78602aSSrinivas Kandagatla WCD938X_DIGITAL_EFUSE_REG_0, 40868d78602aSSrinivas Kandagatla WCD938X_ID_MASK); 40878d78602aSSrinivas Kandagatla 40888d78602aSSrinivas Kandagatla wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X); 40898d78602aSSrinivas Kandagatla 40908d78602aSSrinivas Kandagatla wcd938x_io_init(wcd938x); 40918d78602aSSrinivas Kandagatla /* Set all interrupts as edge triggered */ 40928d78602aSSrinivas Kandagatla for (i = 0; i < wcd938x_regmap_irq_chip.num_regs; i++) { 40938d78602aSSrinivas Kandagatla regmap_write(wcd938x->regmap, 40948d78602aSSrinivas Kandagatla (WCD938X_DIGITAL_INTR_LEVEL_0 + i), 0); 40958d78602aSSrinivas Kandagatla } 40968d78602aSSrinivas Kandagatla 40978d78602aSSrinivas Kandagatla wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 40988d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHR_PDM_WD_INT); 40998d78602aSSrinivas Kandagatla wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 41008d78602aSSrinivas Kandagatla WCD938X_IRQ_HPHL_PDM_WD_INT); 41018d78602aSSrinivas Kandagatla wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, 41028d78602aSSrinivas Kandagatla WCD938X_IRQ_AUX_PDM_WD_INT); 41038d78602aSSrinivas Kandagatla 41048d78602aSSrinivas Kandagatla /* Request for watchdog interrupt */ 41058d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 41068d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 41078d78602aSSrinivas Kandagatla "HPHR PDM WD INT", wcd938x); 41088d78602aSSrinivas Kandagatla if (ret) 41098d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHR WD interrupt (%d)\n", ret); 41108d78602aSSrinivas Kandagatla 41118d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 41128d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 41138d78602aSSrinivas Kandagatla "HPHL PDM WD INT", wcd938x); 41148d78602aSSrinivas Kandagatla if (ret) 41158d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request HPHL WD interrupt (%d)\n", ret); 41168d78602aSSrinivas Kandagatla 41178d78602aSSrinivas Kandagatla ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq, 41188d78602aSSrinivas Kandagatla IRQF_ONESHOT | IRQF_TRIGGER_RISING, 41198d78602aSSrinivas Kandagatla "AUX PDM WD INT", wcd938x); 41208d78602aSSrinivas Kandagatla if (ret) 41218d78602aSSrinivas Kandagatla dev_err(dev, "Failed to request Aux WD interrupt (%d)\n", ret); 41228d78602aSSrinivas Kandagatla 41238d78602aSSrinivas Kandagatla /* Disable watchdog interrupt for HPH and AUX */ 41248d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphr_pdm_wd_int); 41258d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->hphl_pdm_wd_int); 41268d78602aSSrinivas Kandagatla disable_irq_nosync(wcd938x->aux_pdm_wd_int); 41278d78602aSSrinivas Kandagatla 4128e8ba1e05SSrinivas Kandagatla switch (wcd938x->variant) { 4129e8ba1e05SSrinivas Kandagatla case WCD9380: 4130e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9380_snd_controls, 4131e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9380_snd_controls)); 4132e8ba1e05SSrinivas Kandagatla if (ret < 0) { 4133e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 4134e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 4135e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 4136e8ba1e05SSrinivas Kandagatla goto err; 4137e8ba1e05SSrinivas Kandagatla } 4138e8ba1e05SSrinivas Kandagatla break; 4139e8ba1e05SSrinivas Kandagatla case WCD9385: 4140e8ba1e05SSrinivas Kandagatla ret = snd_soc_add_component_controls(component, wcd9385_snd_controls, 4141e8ba1e05SSrinivas Kandagatla ARRAY_SIZE(wcd9385_snd_controls)); 4142e8ba1e05SSrinivas Kandagatla if (ret < 0) { 4143e8ba1e05SSrinivas Kandagatla dev_err(component->dev, 4144e8ba1e05SSrinivas Kandagatla "%s: Failed to add snd ctrls for variant: %d\n", 4145e8ba1e05SSrinivas Kandagatla __func__, wcd938x->variant); 4146e8ba1e05SSrinivas Kandagatla goto err; 4147e8ba1e05SSrinivas Kandagatla } 4148e8ba1e05SSrinivas Kandagatla break; 4149e8ba1e05SSrinivas Kandagatla default: 4150e8ba1e05SSrinivas Kandagatla break; 4151e8ba1e05SSrinivas Kandagatla } 4152bcee7ed0SSrinivas Kandagatla 4153bcee7ed0SSrinivas Kandagatla ret = wcd938x_mbhc_init(component); 4154bcee7ed0SSrinivas Kandagatla if (ret) 4155bcee7ed0SSrinivas Kandagatla dev_err(component->dev, "mbhc initialization failed\n"); 4156e8ba1e05SSrinivas Kandagatla err: 41578d78602aSSrinivas Kandagatla return ret; 41588d78602aSSrinivas Kandagatla } 41598d78602aSSrinivas Kandagatla 4160bcee7ed0SSrinivas Kandagatla static int wcd938x_codec_set_jack(struct snd_soc_component *comp, 4161bcee7ed0SSrinivas Kandagatla struct snd_soc_jack *jack, void *data) 4162bcee7ed0SSrinivas Kandagatla { 4163bcee7ed0SSrinivas Kandagatla struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev); 4164bcee7ed0SSrinivas Kandagatla 4165db0767b8SSrinivasa Rao Mandadapu if (jack) 4166bcee7ed0SSrinivas Kandagatla return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); 4167db0767b8SSrinivasa Rao Mandadapu else 4168bcee7ed0SSrinivas Kandagatla wcd_mbhc_stop(wcd->wcd_mbhc); 4169bcee7ed0SSrinivas Kandagatla 4170bcee7ed0SSrinivas Kandagatla return 0; 4171bcee7ed0SSrinivas Kandagatla } 4172bcee7ed0SSrinivas Kandagatla 41738d78602aSSrinivas Kandagatla static const struct snd_soc_component_driver soc_codec_dev_wcd938x = { 41748d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 41758d78602aSSrinivas Kandagatla .probe = wcd938x_soc_codec_probe, 4176e8ba1e05SSrinivas Kandagatla .controls = wcd938x_snd_controls, 4177e8ba1e05SSrinivas Kandagatla .num_controls = ARRAY_SIZE(wcd938x_snd_controls), 41788da9db0cSSrinivas Kandagatla .dapm_widgets = wcd938x_dapm_widgets, 41798da9db0cSSrinivas Kandagatla .num_dapm_widgets = ARRAY_SIZE(wcd938x_dapm_widgets), 418004544222SSrinivas Kandagatla .dapm_routes = wcd938x_audio_map, 418104544222SSrinivas Kandagatla .num_dapm_routes = ARRAY_SIZE(wcd938x_audio_map), 4182bcee7ed0SSrinivas Kandagatla .set_jack = wcd938x_codec_set_jack, 4183ff7f9aa5SCharles Keepax .endianness = 1, 41848d78602aSSrinivas Kandagatla }; 41858d78602aSSrinivas Kandagatla 41868d78602aSSrinivas Kandagatla static void wcd938x_dt_parse_micbias_info(struct device *dev, struct wcd938x_priv *wcd) 41878d78602aSSrinivas Kandagatla { 41888d78602aSSrinivas Kandagatla struct device_node *np = dev->of_node; 41898d78602aSSrinivas Kandagatla u32 prop_val = 0; 41908d78602aSSrinivas Kandagatla int rc = 0; 41918d78602aSSrinivas Kandagatla 41928d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); 41938d78602aSSrinivas Kandagatla if (!rc) 41948d78602aSSrinivas Kandagatla wcd->micb1_mv = prop_val/1000; 41958d78602aSSrinivas Kandagatla else 41968d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias1 DT property not found\n", __func__); 41978d78602aSSrinivas Kandagatla 41988d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); 41998d78602aSSrinivas Kandagatla if (!rc) 42008d78602aSSrinivas Kandagatla wcd->micb2_mv = prop_val/1000; 42018d78602aSSrinivas Kandagatla else 42028d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias2 DT property not found\n", __func__); 42038d78602aSSrinivas Kandagatla 42048d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); 42058d78602aSSrinivas Kandagatla if (!rc) 42068d78602aSSrinivas Kandagatla wcd->micb3_mv = prop_val/1000; 42078d78602aSSrinivas Kandagatla else 42088d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); 42098d78602aSSrinivas Kandagatla 42108d78602aSSrinivas Kandagatla rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); 42118d78602aSSrinivas Kandagatla if (!rc) 42128d78602aSSrinivas Kandagatla wcd->micb4_mv = prop_val/1000; 42138d78602aSSrinivas Kandagatla else 42148d78602aSSrinivas Kandagatla dev_info(dev, "%s: Micbias4 DT property not found\n", __func__); 42158d78602aSSrinivas Kandagatla } 42168d78602aSSrinivas Kandagatla 4217013cc2aeSSrinivasa Rao Mandadapu static bool wcd938x_swap_gnd_mic(struct snd_soc_component *component, bool active) 4218013cc2aeSSrinivasa Rao Mandadapu { 4219013cc2aeSSrinivasa Rao Mandadapu int value; 4220013cc2aeSSrinivasa Rao Mandadapu 4221013cc2aeSSrinivasa Rao Mandadapu struct wcd938x_priv *wcd938x; 4222013cc2aeSSrinivasa Rao Mandadapu 4223013cc2aeSSrinivasa Rao Mandadapu wcd938x = snd_soc_component_get_drvdata(component); 4224013cc2aeSSrinivasa Rao Mandadapu 4225db0b4aedSSrinivasa Rao Mandadapu value = gpiod_get_value(wcd938x->us_euro_gpio); 4226013cc2aeSSrinivasa Rao Mandadapu 4227db0b4aedSSrinivasa Rao Mandadapu gpiod_set_value(wcd938x->us_euro_gpio, !value); 4228013cc2aeSSrinivasa Rao Mandadapu 4229013cc2aeSSrinivasa Rao Mandadapu return true; 4230013cc2aeSSrinivasa Rao Mandadapu } 4231013cc2aeSSrinivasa Rao Mandadapu 4232013cc2aeSSrinivasa Rao Mandadapu 42338d78602aSSrinivas Kandagatla static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device *dev) 42348d78602aSSrinivas Kandagatla { 4235bcee7ed0SSrinivas Kandagatla struct wcd_mbhc_config *cfg = &wcd938x->mbhc_cfg; 42368d78602aSSrinivas Kandagatla int ret; 42378d78602aSSrinivas Kandagatla 42388d78602aSSrinivas Kandagatla wcd938x->reset_gpio = of_get_named_gpio(dev->of_node, "reset-gpios", 0); 42398d78602aSSrinivas Kandagatla if (wcd938x->reset_gpio < 0) { 42408d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get reset gpio: err = %d\n", 42418d78602aSSrinivas Kandagatla wcd938x->reset_gpio); 42428d78602aSSrinivas Kandagatla return wcd938x->reset_gpio; 42438d78602aSSrinivas Kandagatla } 42448d78602aSSrinivas Kandagatla 4245db0b4aedSSrinivasa Rao Mandadapu wcd938x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", 4246db0b4aedSSrinivasa Rao Mandadapu GPIOD_OUT_LOW); 4247db0b4aedSSrinivasa Rao Mandadapu if (IS_ERR(wcd938x->us_euro_gpio)) { 4248db0b4aedSSrinivasa Rao Mandadapu dev_err(dev, "us-euro swap Control GPIO not found\n"); 4249db0b4aedSSrinivasa Rao Mandadapu return PTR_ERR(wcd938x->us_euro_gpio); 4250013cc2aeSSrinivasa Rao Mandadapu } 4251013cc2aeSSrinivasa Rao Mandadapu 4252db0b4aedSSrinivasa Rao Mandadapu cfg->swap_gnd_mic = wcd938x_swap_gnd_mic; 4253db0b4aedSSrinivasa Rao Mandadapu 42548d78602aSSrinivas Kandagatla wcd938x->supplies[0].supply = "vdd-rxtx"; 42558d78602aSSrinivas Kandagatla wcd938x->supplies[1].supply = "vdd-io"; 42568d78602aSSrinivas Kandagatla wcd938x->supplies[2].supply = "vdd-buck"; 42578d78602aSSrinivas Kandagatla wcd938x->supplies[3].supply = "vdd-mic-bias"; 42588d78602aSSrinivas Kandagatla 42598d78602aSSrinivas Kandagatla ret = regulator_bulk_get(dev, WCD938X_MAX_SUPPLY, wcd938x->supplies); 42608d78602aSSrinivas Kandagatla if (ret) { 42618d78602aSSrinivas Kandagatla dev_err(dev, "Failed to get supplies: err = %d\n", ret); 42628d78602aSSrinivas Kandagatla return ret; 42638d78602aSSrinivas Kandagatla } 42648d78602aSSrinivas Kandagatla 42658d78602aSSrinivas Kandagatla ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); 42668d78602aSSrinivas Kandagatla if (ret) { 42678d78602aSSrinivas Kandagatla dev_err(dev, "Failed to enable supplies: err = %d\n", ret); 42688d78602aSSrinivas Kandagatla return ret; 42698d78602aSSrinivas Kandagatla } 42708d78602aSSrinivas Kandagatla 42718d78602aSSrinivas Kandagatla wcd938x_dt_parse_micbias_info(dev, wcd938x); 42728d78602aSSrinivas Kandagatla 4273bcee7ed0SSrinivas Kandagatla cfg->mbhc_micbias = MIC_BIAS_2; 4274bcee7ed0SSrinivas Kandagatla cfg->anc_micbias = MIC_BIAS_2; 4275bcee7ed0SSrinivas Kandagatla cfg->v_hs_max = WCD_MBHC_HS_V_MAX; 4276bcee7ed0SSrinivas Kandagatla cfg->num_btn = WCD938X_MBHC_MAX_BUTTONS; 4277bcee7ed0SSrinivas Kandagatla cfg->micb_mv = wcd938x->micb2_mv; 4278bcee7ed0SSrinivas Kandagatla cfg->linein_th = 5000; 4279bcee7ed0SSrinivas Kandagatla cfg->hs_thr = 1700; 4280bcee7ed0SSrinivas Kandagatla cfg->hph_thr = 50; 4281bcee7ed0SSrinivas Kandagatla 4282bcee7ed0SSrinivas Kandagatla wcd_dt_parse_mbhc_data(dev, cfg); 4283bcee7ed0SSrinivas Kandagatla 42848d78602aSSrinivas Kandagatla return 0; 42858d78602aSSrinivas Kandagatla } 42868d78602aSSrinivas Kandagatla 42878d78602aSSrinivas Kandagatla static int wcd938x_reset(struct wcd938x_priv *wcd938x) 42888d78602aSSrinivas Kandagatla { 42898d78602aSSrinivas Kandagatla gpio_direction_output(wcd938x->reset_gpio, 0); 42908d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to LOW */ 42918d78602aSSrinivas Kandagatla usleep_range(20, 30); 42928d78602aSSrinivas Kandagatla gpio_set_value(wcd938x->reset_gpio, 1); 42938d78602aSSrinivas Kandagatla /* 20us sleep required after pulling the reset gpio to HIGH */ 42948d78602aSSrinivas Kandagatla usleep_range(20, 30); 42958d78602aSSrinivas Kandagatla 42968d78602aSSrinivas Kandagatla return 0; 42978d78602aSSrinivas Kandagatla } 42988d78602aSSrinivas Kandagatla 429916572522SSrinivas Kandagatla static int wcd938x_codec_hw_params(struct snd_pcm_substream *substream, 430016572522SSrinivas Kandagatla struct snd_pcm_hw_params *params, 430116572522SSrinivas Kandagatla struct snd_soc_dai *dai) 430216572522SSrinivas Kandagatla { 430316572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 430416572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 430516572522SSrinivas Kandagatla 430616572522SSrinivas Kandagatla return wcd938x_sdw_hw_params(wcd, substream, params, dai); 430716572522SSrinivas Kandagatla } 430816572522SSrinivas Kandagatla 430916572522SSrinivas Kandagatla static int wcd938x_codec_free(struct snd_pcm_substream *substream, 431016572522SSrinivas Kandagatla struct snd_soc_dai *dai) 431116572522SSrinivas Kandagatla { 431216572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 431316572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 431416572522SSrinivas Kandagatla 431516572522SSrinivas Kandagatla return wcd938x_sdw_free(wcd, substream, dai); 431616572522SSrinivas Kandagatla } 431716572522SSrinivas Kandagatla 431816572522SSrinivas Kandagatla static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai, 431916572522SSrinivas Kandagatla void *stream, int direction) 432016572522SSrinivas Kandagatla { 432116572522SSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); 432216572522SSrinivas Kandagatla struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; 432316572522SSrinivas Kandagatla 432416572522SSrinivas Kandagatla return wcd938x_sdw_set_sdw_stream(wcd, dai, stream, direction); 432516572522SSrinivas Kandagatla 432616572522SSrinivas Kandagatla } 432716572522SSrinivas Kandagatla 4328355af6c0SPu Lehui static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = { 432916572522SSrinivas Kandagatla .hw_params = wcd938x_codec_hw_params, 433016572522SSrinivas Kandagatla .hw_free = wcd938x_codec_free, 4331e8444560SPierre-Louis Bossart .set_stream = wcd938x_codec_set_sdw_stream, 43328d78602aSSrinivas Kandagatla }; 43338d78602aSSrinivas Kandagatla 43348d78602aSSrinivas Kandagatla static struct snd_soc_dai_driver wcd938x_dais[] = { 43358d78602aSSrinivas Kandagatla [0] = { 43368d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-rx", 43378d78602aSSrinivas Kandagatla .playback = { 43388d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Playback", 43398d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK | WCD938X_FRAC_RATES_MASK, 43408d78602aSSrinivas Kandagatla .formats = WCD938X_FORMATS_S16_S24_LE, 43418d78602aSSrinivas Kandagatla .rate_max = 192000, 43428d78602aSSrinivas Kandagatla .rate_min = 8000, 43438d78602aSSrinivas Kandagatla .channels_min = 1, 43448d78602aSSrinivas Kandagatla .channels_max = 2, 43458d78602aSSrinivas Kandagatla }, 43468d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 43478d78602aSSrinivas Kandagatla }, 43488d78602aSSrinivas Kandagatla [1] = { 43498d78602aSSrinivas Kandagatla .name = "wcd938x-sdw-tx", 43508d78602aSSrinivas Kandagatla .capture = { 43518d78602aSSrinivas Kandagatla .stream_name = "WCD AIF1 Capture", 43528d78602aSSrinivas Kandagatla .rates = WCD938X_RATES_MASK, 43538d78602aSSrinivas Kandagatla .formats = SNDRV_PCM_FMTBIT_S16_LE, 43548d78602aSSrinivas Kandagatla .rate_min = 8000, 43558d78602aSSrinivas Kandagatla .rate_max = 192000, 43568d78602aSSrinivas Kandagatla .channels_min = 1, 43578d78602aSSrinivas Kandagatla .channels_max = 4, 43588d78602aSSrinivas Kandagatla }, 43598d78602aSSrinivas Kandagatla .ops = &wcd938x_sdw_dai_ops, 43608d78602aSSrinivas Kandagatla }, 43618d78602aSSrinivas Kandagatla }; 43628d78602aSSrinivas Kandagatla 43638d78602aSSrinivas Kandagatla static int wcd938x_bind(struct device *dev) 43648d78602aSSrinivas Kandagatla { 43658d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 43668d78602aSSrinivas Kandagatla int ret; 43678d78602aSSrinivas Kandagatla 43688d78602aSSrinivas Kandagatla ret = component_bind_all(dev, wcd938x); 43698d78602aSSrinivas Kandagatla if (ret) { 43708d78602aSSrinivas Kandagatla dev_err(dev, "%s: Slave bind failed, ret = %d\n", 43718d78602aSSrinivas Kandagatla __func__, ret); 43728d78602aSSrinivas Kandagatla return ret; 43738d78602aSSrinivas Kandagatla } 43748d78602aSSrinivas Kandagatla 437516572522SSrinivas Kandagatla wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); 437616572522SSrinivas Kandagatla if (!wcd938x->rxdev) { 437716572522SSrinivas Kandagatla dev_err(dev, "could not find slave with matching of node\n"); 437816572522SSrinivas Kandagatla return -EINVAL; 437916572522SSrinivas Kandagatla } 438016572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); 438116572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; 438216572522SSrinivas Kandagatla 438316572522SSrinivas Kandagatla wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); 438416572522SSrinivas Kandagatla if (!wcd938x->txdev) { 438516572522SSrinivas Kandagatla dev_err(dev, "could not find txslave with matching of node\n"); 438616572522SSrinivas Kandagatla return -EINVAL; 438716572522SSrinivas Kandagatla } 438816572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); 438916572522SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; 439016572522SSrinivas Kandagatla wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); 439116572522SSrinivas Kandagatla if (!wcd938x->tx_sdw_dev) { 439216572522SSrinivas Kandagatla dev_err(dev, "could not get txslave with matching of dev\n"); 439316572522SSrinivas Kandagatla return -EINVAL; 439416572522SSrinivas Kandagatla } 439516572522SSrinivas Kandagatla 439616572522SSrinivas Kandagatla /* As TX is main CSR reg interface, which should not be suspended first. 439716572522SSrinivas Kandagatla * expicilty add the dependency link */ 439816572522SSrinivas Kandagatla if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | 439916572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 440016572522SSrinivas Kandagatla dev_err(dev, "could not devlink tx and rx\n"); 440116572522SSrinivas Kandagatla return -EINVAL; 440216572522SSrinivas Kandagatla } 440316572522SSrinivas Kandagatla 440416572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | 440516572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 440616572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and tx\n"); 440716572522SSrinivas Kandagatla return -EINVAL; 440816572522SSrinivas Kandagatla } 440916572522SSrinivas Kandagatla 441016572522SSrinivas Kandagatla if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | 441116572522SSrinivas Kandagatla DL_FLAG_PM_RUNTIME)) { 441216572522SSrinivas Kandagatla dev_err(dev, "could not devlink wcd and rx\n"); 441316572522SSrinivas Kandagatla return -EINVAL; 441416572522SSrinivas Kandagatla } 441516572522SSrinivas Kandagatla 4416b90d9398SSrinivas Kandagatla wcd938x->regmap = devm_regmap_init_sdw(wcd938x->tx_sdw_dev, &wcd938x_regmap_config); 4417b90d9398SSrinivas Kandagatla if (IS_ERR(wcd938x->regmap)) { 441816572522SSrinivas Kandagatla dev_err(dev, "%s: tx csr regmap not found\n", __func__); 441916572522SSrinivas Kandagatla return PTR_ERR(wcd938x->regmap); 442016572522SSrinivas Kandagatla } 442116572522SSrinivas Kandagatla 4422f99986c0SSrinivas Kandagatla ret = wcd938x_irq_init(wcd938x, dev); 4423f99986c0SSrinivas Kandagatla if (ret) { 4424f99986c0SSrinivas Kandagatla dev_err(dev, "%s: IRQ init failed: %d\n", __func__, ret); 4425f99986c0SSrinivas Kandagatla return ret; 4426f99986c0SSrinivas Kandagatla } 4427f99986c0SSrinivas Kandagatla 4428f99986c0SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; 4429f99986c0SSrinivas Kandagatla wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq; 4430f99986c0SSrinivas Kandagatla 44318d78602aSSrinivas Kandagatla ret = wcd938x_set_micbias_data(wcd938x); 44328d78602aSSrinivas Kandagatla if (ret < 0) { 44338d78602aSSrinivas Kandagatla dev_err(dev, "%s: bad micbias pdata\n", __func__); 44348d78602aSSrinivas Kandagatla return ret; 44358d78602aSSrinivas Kandagatla } 44368d78602aSSrinivas Kandagatla 44378d78602aSSrinivas Kandagatla ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, 44388d78602aSSrinivas Kandagatla wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); 44398d78602aSSrinivas Kandagatla if (ret) 44408d78602aSSrinivas Kandagatla dev_err(dev, "%s: Codec registration failed\n", 44418d78602aSSrinivas Kandagatla __func__); 44428d78602aSSrinivas Kandagatla 44438d78602aSSrinivas Kandagatla return ret; 44448d78602aSSrinivas Kandagatla 44458d78602aSSrinivas Kandagatla } 44468d78602aSSrinivas Kandagatla 44478d78602aSSrinivas Kandagatla static void wcd938x_unbind(struct device *dev) 44488d78602aSSrinivas Kandagatla { 44498d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); 44508d78602aSSrinivas Kandagatla 445116572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->txdev); 445216572522SSrinivas Kandagatla device_link_remove(dev, wcd938x->rxdev); 445316572522SSrinivas Kandagatla device_link_remove(wcd938x->rxdev, wcd938x->txdev); 44548d78602aSSrinivas Kandagatla snd_soc_unregister_component(dev); 44558d78602aSSrinivas Kandagatla component_unbind_all(dev, wcd938x); 44568d78602aSSrinivas Kandagatla } 44578d78602aSSrinivas Kandagatla 44588d78602aSSrinivas Kandagatla static const struct component_master_ops wcd938x_comp_ops = { 44598d78602aSSrinivas Kandagatla .bind = wcd938x_bind, 44608d78602aSSrinivas Kandagatla .unbind = wcd938x_unbind, 44618d78602aSSrinivas Kandagatla }; 44628d78602aSSrinivas Kandagatla 44638d78602aSSrinivas Kandagatla static int wcd938x_add_slave_components(struct wcd938x_priv *wcd938x, 44648d78602aSSrinivas Kandagatla struct device *dev, 44658d78602aSSrinivas Kandagatla struct component_match **matchptr) 44668d78602aSSrinivas Kandagatla { 44678d78602aSSrinivas Kandagatla struct device_node *np; 44688d78602aSSrinivas Kandagatla 44698d78602aSSrinivas Kandagatla np = dev->of_node; 44708d78602aSSrinivas Kandagatla 44718d78602aSSrinivas Kandagatla wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); 44728d78602aSSrinivas Kandagatla if (!wcd938x->rxnode) { 44738d78602aSSrinivas Kandagatla dev_err(dev, "%s: Rx-device node not defined\n", __func__); 44748d78602aSSrinivas Kandagatla return -ENODEV; 44758d78602aSSrinivas Kandagatla } 44768d78602aSSrinivas Kandagatla 44778d78602aSSrinivas Kandagatla of_node_get(wcd938x->rxnode); 4478a8271d7eSYong Wu component_match_add_release(dev, matchptr, component_release_of, 4479a8271d7eSYong Wu component_compare_of, wcd938x->rxnode); 44808d78602aSSrinivas Kandagatla 44818d78602aSSrinivas Kandagatla wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); 44828d78602aSSrinivas Kandagatla if (!wcd938x->txnode) { 44838d78602aSSrinivas Kandagatla dev_err(dev, "%s: Tx-device node not defined\n", __func__); 44848d78602aSSrinivas Kandagatla return -ENODEV; 44858d78602aSSrinivas Kandagatla } 44868d78602aSSrinivas Kandagatla of_node_get(wcd938x->txnode); 4487a8271d7eSYong Wu component_match_add_release(dev, matchptr, component_release_of, 4488a8271d7eSYong Wu component_compare_of, wcd938x->txnode); 44898d78602aSSrinivas Kandagatla return 0; 44908d78602aSSrinivas Kandagatla } 44918d78602aSSrinivas Kandagatla 44928d78602aSSrinivas Kandagatla static int wcd938x_probe(struct platform_device *pdev) 44938d78602aSSrinivas Kandagatla { 44948d78602aSSrinivas Kandagatla struct component_match *match = NULL; 44958d78602aSSrinivas Kandagatla struct wcd938x_priv *wcd938x = NULL; 44968d78602aSSrinivas Kandagatla struct device *dev = &pdev->dev; 44978d78602aSSrinivas Kandagatla int ret; 44988d78602aSSrinivas Kandagatla 44998d78602aSSrinivas Kandagatla wcd938x = devm_kzalloc(dev, sizeof(struct wcd938x_priv), 45008d78602aSSrinivas Kandagatla GFP_KERNEL); 45018d78602aSSrinivas Kandagatla if (!wcd938x) 45028d78602aSSrinivas Kandagatla return -ENOMEM; 45038d78602aSSrinivas Kandagatla 45048d78602aSSrinivas Kandagatla dev_set_drvdata(dev, wcd938x); 4505bcee7ed0SSrinivas Kandagatla mutex_init(&wcd938x->micb_lock); 45068d78602aSSrinivas Kandagatla 45078d78602aSSrinivas Kandagatla ret = wcd938x_populate_dt_data(wcd938x, dev); 45088d78602aSSrinivas Kandagatla if (ret) { 45098d78602aSSrinivas Kandagatla dev_err(dev, "%s: Fail to obtain platform data\n", __func__); 45108d78602aSSrinivas Kandagatla return -EINVAL; 45118d78602aSSrinivas Kandagatla } 45128d78602aSSrinivas Kandagatla 45138d78602aSSrinivas Kandagatla ret = wcd938x_add_slave_components(wcd938x, dev, &match); 45148d78602aSSrinivas Kandagatla if (ret) 45158d78602aSSrinivas Kandagatla return ret; 45168d78602aSSrinivas Kandagatla 45178d78602aSSrinivas Kandagatla wcd938x_reset(wcd938x); 45188d78602aSSrinivas Kandagatla 45198d78602aSSrinivas Kandagatla ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match); 45208d78602aSSrinivas Kandagatla if (ret) 45218d78602aSSrinivas Kandagatla return ret; 45228d78602aSSrinivas Kandagatla 45238d78602aSSrinivas Kandagatla pm_runtime_set_autosuspend_delay(dev, 1000); 45248d78602aSSrinivas Kandagatla pm_runtime_use_autosuspend(dev); 45258d78602aSSrinivas Kandagatla pm_runtime_mark_last_busy(dev); 45268d78602aSSrinivas Kandagatla pm_runtime_set_active(dev); 45278d78602aSSrinivas Kandagatla pm_runtime_enable(dev); 45288d78602aSSrinivas Kandagatla pm_runtime_idle(dev); 45298d78602aSSrinivas Kandagatla 45308c62dbcbSPierre-Louis Bossart return 0; 45318d78602aSSrinivas Kandagatla } 45328d78602aSSrinivas Kandagatla 45338d78602aSSrinivas Kandagatla static int wcd938x_remove(struct platform_device *pdev) 45348d78602aSSrinivas Kandagatla { 45358d78602aSSrinivas Kandagatla component_master_del(&pdev->dev, &wcd938x_comp_ops); 45368d78602aSSrinivas Kandagatla 45378d78602aSSrinivas Kandagatla return 0; 45388d78602aSSrinivas Kandagatla } 45398d78602aSSrinivas Kandagatla 45408c4863c2SSrinivas Kandagatla #if defined(CONFIG_OF) 45418d78602aSSrinivas Kandagatla static const struct of_device_id wcd938x_dt_match[] = { 45428d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9380-codec" }, 45438d78602aSSrinivas Kandagatla { .compatible = "qcom,wcd9385-codec" }, 45448d78602aSSrinivas Kandagatla {} 45458d78602aSSrinivas Kandagatla }; 45468d78602aSSrinivas Kandagatla MODULE_DEVICE_TABLE(of, wcd938x_dt_match); 45478c4863c2SSrinivas Kandagatla #endif 45488d78602aSSrinivas Kandagatla 45498d78602aSSrinivas Kandagatla static struct platform_driver wcd938x_codec_driver = { 45508d78602aSSrinivas Kandagatla .probe = wcd938x_probe, 45518d78602aSSrinivas Kandagatla .remove = wcd938x_remove, 45528d78602aSSrinivas Kandagatla .driver = { 45538d78602aSSrinivas Kandagatla .name = "wcd938x_codec", 45548d78602aSSrinivas Kandagatla .of_match_table = of_match_ptr(wcd938x_dt_match), 45558d78602aSSrinivas Kandagatla .suppress_bind_attrs = true, 45568d78602aSSrinivas Kandagatla }, 45578d78602aSSrinivas Kandagatla }; 45588d78602aSSrinivas Kandagatla 45598d78602aSSrinivas Kandagatla module_platform_driver(wcd938x_codec_driver); 45608d78602aSSrinivas Kandagatla MODULE_DESCRIPTION("WCD938X Codec driver"); 45618d78602aSSrinivas Kandagatla MODULE_LICENSE("GPL"); 4562