1552 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2023, Linaro Limited4 */5 6#include <linux/module.h>7#include <linux/slab.h>8#include <linux/platform_device.h>9#include <linux/device.h>10#include <linux/kernel.h>11#include <linux/component.h>12#include <linux/pm_runtime.h>13#include <linux/irq.h>14#include <linux/irqdomain.h>15#include <linux/of.h>16#include <linux/soundwire/sdw.h>17#include <linux/soundwire/sdw_type.h>18#include <linux/soundwire/sdw_registers.h>19#include <linux/regmap.h>20#include <sound/soc.h>21#include <sound/soc-dapm.h>22#include "wcd939x.h"23 24#define SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(m) (0xE0 + 0x10 * (m))25 26static const struct wcd939x_sdw_ch_info wcd939x_sdw_rx_ch_info[] = {27 WCD_SDW_CH(WCD939X_HPH_L, WCD939X_HPH_PORT, BIT(0)),28 WCD_SDW_CH(WCD939X_HPH_R, WCD939X_HPH_PORT, BIT(1)),29 WCD_SDW_CH(WCD939X_CLSH, WCD939X_CLSH_PORT, BIT(0)),30 WCD_SDW_CH(WCD939X_COMP_L, WCD939X_COMP_PORT, BIT(0)),31 WCD_SDW_CH(WCD939X_COMP_R, WCD939X_COMP_PORT, BIT(1)),32 WCD_SDW_CH(WCD939X_LO, WCD939X_LO_PORT, BIT(0)),33 WCD_SDW_CH(WCD939X_DSD_L, WCD939X_DSD_PORT, BIT(0)),34 WCD_SDW_CH(WCD939X_DSD_R, WCD939X_DSD_PORT, BIT(1)),35 WCD_SDW_CH(WCD939X_HIFI_PCM_L, WCD939X_HIFI_PCM_PORT, BIT(0)),36 WCD_SDW_CH(WCD939X_HIFI_PCM_R, WCD939X_HIFI_PCM_PORT, BIT(1)),37};38 39static const struct wcd939x_sdw_ch_info wcd939x_sdw_tx_ch_info[] = {40 WCD_SDW_CH(WCD939X_ADC1, WCD939X_ADC_1_4_PORT, BIT(0)),41 WCD_SDW_CH(WCD939X_ADC2, WCD939X_ADC_1_4_PORT, BIT(1)),42 WCD_SDW_CH(WCD939X_ADC3, WCD939X_ADC_1_4_PORT, BIT(2)),43 WCD_SDW_CH(WCD939X_ADC4, WCD939X_ADC_1_4_PORT, BIT(3)),44 WCD_SDW_CH(WCD939X_DMIC0, WCD939X_DMIC_0_3_MBHC_PORT, BIT(0)),45 WCD_SDW_CH(WCD939X_DMIC1, WCD939X_DMIC_0_3_MBHC_PORT, BIT(1)),46 WCD_SDW_CH(WCD939X_MBHC, WCD939X_DMIC_0_3_MBHC_PORT, BIT(2)),47 WCD_SDW_CH(WCD939X_DMIC2, WCD939X_DMIC_0_3_MBHC_PORT, BIT(2)),48 WCD_SDW_CH(WCD939X_DMIC3, WCD939X_DMIC_0_3_MBHC_PORT, BIT(3)),49 WCD_SDW_CH(WCD939X_DMIC4, WCD939X_DMIC_3_7_PORT, BIT(0)),50 WCD_SDW_CH(WCD939X_DMIC5, WCD939X_DMIC_3_7_PORT, BIT(1)),51 WCD_SDW_CH(WCD939X_DMIC6, WCD939X_DMIC_3_7_PORT, BIT(2)),52 WCD_SDW_CH(WCD939X_DMIC7, WCD939X_DMIC_3_7_PORT, BIT(3)),53};54 55static struct sdw_dpn_prop wcd939x_rx_dpn_prop[WCD939X_MAX_RX_SWR_PORTS] = {56 {57 .num = WCD939X_HPH_PORT,58 .type = SDW_DPN_SIMPLE,59 .min_ch = 1,60 .max_ch = 2,61 .simple_ch_prep_sm = true,62 },63 {64 .num = WCD939X_CLSH_PORT,65 .type = SDW_DPN_SIMPLE,66 .min_ch = 1,67 .max_ch = 1,68 .simple_ch_prep_sm = true,69 },70 {71 .num = WCD939X_COMP_PORT,72 .type = SDW_DPN_SIMPLE,73 .min_ch = 1,74 .max_ch = 2,75 .simple_ch_prep_sm = true,76 },77 {78 .num = WCD939X_LO_PORT,79 .type = SDW_DPN_SIMPLE,80 .min_ch = 1,81 .max_ch = 1,82 .simple_ch_prep_sm = true,83 },84 {85 .num = WCD939X_DSD_PORT,86 .type = SDW_DPN_SIMPLE,87 .min_ch = 1,88 .max_ch = 2,89 .simple_ch_prep_sm = true,90 },91 {92 .num = WCD939X_HIFI_PCM_PORT,93 .type = SDW_DPN_SIMPLE,94 .min_ch = 1,95 .max_ch = 2,96 .simple_ch_prep_sm = true,97 }98};99 100static struct sdw_dpn_prop wcd939x_tx_dpn_prop[WCD939X_MAX_TX_SWR_PORTS] = {101 {102 .num = WCD939X_ADC_1_4_PORT,103 .type = SDW_DPN_SIMPLE,104 .min_ch = 1,105 .max_ch = 4,106 .simple_ch_prep_sm = true,107 },108 {109 .num = WCD939X_ADC_DMIC_1_2_PORT,110 .type = SDW_DPN_SIMPLE,111 .min_ch = 1,112 .max_ch = 4,113 .simple_ch_prep_sm = true,114 },115 {116 .num = WCD939X_DMIC_0_3_MBHC_PORT,117 .type = SDW_DPN_SIMPLE,118 .min_ch = 1,119 .max_ch = 4,120 .simple_ch_prep_sm = true,121 },122 {123 .num = WCD939X_DMIC_3_7_PORT,124 .type = SDW_DPN_SIMPLE,125 .min_ch = 1,126 .max_ch = 4,127 .simple_ch_prep_sm = true,128 }129};130 131struct device *wcd939x_sdw_device_get(struct device_node *np)132{133 return bus_find_device_by_of_node(&sdw_bus_type, np);134}135EXPORT_SYMBOL_GPL(wcd939x_sdw_device_get);136 137unsigned int wcd939x_swr_get_current_bank(struct sdw_slave *sdev)138{139 return FIELD_GET(SDW_SCP_STAT_CURR_BANK,140 sdw_read(sdev, SDW_SCP_CTRL));141}142EXPORT_SYMBOL_GPL(wcd939x_swr_get_current_bank);143 144int wcd939x_sdw_hw_params(struct wcd939x_sdw_priv *wcd,145 struct snd_pcm_substream *substream,146 struct snd_pcm_hw_params *params,147 struct snd_soc_dai *dai)148{149 struct sdw_port_config port_config[WCD939X_MAX_SWR_PORTS];150 unsigned long ch_mask;151 int i, j;152 153 wcd->sconfig.ch_count = 1;154 wcd->active_ports = 0;155 for (i = 0; i < WCD939X_MAX_SWR_PORTS; i++) {156 ch_mask = wcd->port_config[i].ch_mask;157 158 if (!ch_mask)159 continue;160 161 for_each_set_bit(j, &ch_mask, 4)162 wcd->sconfig.ch_count++;163 164 port_config[wcd->active_ports] = wcd->port_config[i];165 wcd->active_ports++;166 }167 168 wcd->sconfig.bps = 1;169 wcd->sconfig.frame_rate = params_rate(params);170 if (wcd->is_tx)171 wcd->sconfig.direction = SDW_DATA_DIR_TX;172 else173 wcd->sconfig.direction = SDW_DATA_DIR_RX;174 175 wcd->sconfig.type = SDW_STREAM_PCM;176 177 return sdw_stream_add_slave(wcd->sdev, &wcd->sconfig, &port_config[0],178 wcd->active_ports, wcd->sruntime);179}180EXPORT_SYMBOL_GPL(wcd939x_sdw_hw_params);181 182int wcd939x_sdw_free(struct wcd939x_sdw_priv *wcd,183 struct snd_pcm_substream *substream,184 struct snd_soc_dai *dai)185{186 sdw_stream_remove_slave(wcd->sdev, wcd->sruntime);187 188 return 0;189}190EXPORT_SYMBOL_GPL(wcd939x_sdw_free);191 192int wcd939x_sdw_set_sdw_stream(struct wcd939x_sdw_priv *wcd,193 struct snd_soc_dai *dai, void *stream,194 int direction)195{196 wcd->sruntime = stream;197 198 return 0;199}200EXPORT_SYMBOL_GPL(wcd939x_sdw_set_sdw_stream);201 202struct regmap *wcd939x_swr_get_regmap(struct wcd939x_sdw_priv *wcd)203{204 if (wcd->regmap)205 return wcd->regmap;206 207 return ERR_PTR(-EINVAL);208}209EXPORT_SYMBOL_GPL(wcd939x_swr_get_regmap);210 211static int wcd9390_update_status(struct sdw_slave *slave,212 enum sdw_slave_status status)213{214 struct wcd939x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);215 216 if (wcd->regmap && status == SDW_SLAVE_ATTACHED) {217 /* Write out any cached changes that happened between probe and attach */218 regcache_cache_only(wcd->regmap, false);219 return regcache_sync(wcd->regmap);220 }221 222 return 0;223}224 225static int wcd9390_bus_config(struct sdw_slave *slave,226 struct sdw_bus_params *params)227{228 sdw_write(slave, SWRS_SCP_HOST_CLK_DIV2_CTL_BANK(params->next_bank),229 0x01);230 231 return 0;232}233 234/*235 * Handle Soundwire out-of-band interrupt event by triggering236 * the first irq of the slave_irq irq domain, which then will237 * be handled by the regmap_irq threaded irq.238 * Looping is to ensure no interrupts were missed in the process.239 */240static int wcd9390_interrupt_callback(struct sdw_slave *slave,241 struct sdw_slave_intr_status *status)242{243 struct wcd939x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);244 struct irq_domain *slave_irq = wcd->slave_irq;245 u32 sts1, sts2, sts3;246 247 do {248 handle_nested_irq(irq_find_mapping(slave_irq, 0));249 regmap_read(wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_0, &sts1);250 regmap_read(wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_1, &sts2);251 regmap_read(wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_2, &sts3);252 253 } while (sts1 || sts2 || sts3);254 255 return IRQ_HANDLED;256}257 258static const struct reg_default wcd939x_defaults[] = {259 /* Default values except for Read-Only & Volatile registers */260 { WCD939X_ANA_PAGE, 0x00 },261 { WCD939X_ANA_BIAS, 0x00 },262 { WCD939X_ANA_RX_SUPPLIES, 0x00 },263 { WCD939X_ANA_HPH, 0x0c },264 { WCD939X_ANA_EAR, 0x00 },265 { WCD939X_ANA_EAR_COMPANDER_CTL, 0x02 },266 { WCD939X_ANA_TX_CH1, 0x20 },267 { WCD939X_ANA_TX_CH2, 0x00 },268 { WCD939X_ANA_TX_CH3, 0x20 },269 { WCD939X_ANA_TX_CH4, 0x00 },270 { WCD939X_ANA_MICB1_MICB2_DSP_EN_LOGIC, 0x00 },271 { WCD939X_ANA_MICB3_DSP_EN_LOGIC, 0x00 },272 { WCD939X_ANA_MBHC_MECH, 0x39 },273 { WCD939X_ANA_MBHC_ELECT, 0x08 },274 { WCD939X_ANA_MBHC_ZDET, 0x00 },275 { WCD939X_ANA_MBHC_BTN0, 0x00 },276 { WCD939X_ANA_MBHC_BTN1, 0x10 },277 { WCD939X_ANA_MBHC_BTN2, 0x20 },278 { WCD939X_ANA_MBHC_BTN3, 0x30 },279 { WCD939X_ANA_MBHC_BTN4, 0x40 },280 { WCD939X_ANA_MBHC_BTN5, 0x50 },281 { WCD939X_ANA_MBHC_BTN6, 0x60 },282 { WCD939X_ANA_MBHC_BTN7, 0x70 },283 { WCD939X_ANA_MICB1, 0x10 },284 { WCD939X_ANA_MICB2, 0x10 },285 { WCD939X_ANA_MICB2_RAMP, 0x00 },286 { WCD939X_ANA_MICB3, 0x00 },287 { WCD939X_ANA_MICB4, 0x00 },288 { WCD939X_BIAS_CTL, 0x2a },289 { WCD939X_BIAS_VBG_FINE_ADJ, 0x55 },290 { WCD939X_LDOL_VDDCX_ADJUST, 0x01 },291 { WCD939X_LDOL_DISABLE_LDOL, 0x00 },292 { WCD939X_MBHC_CTL_CLK, 0x00 },293 { WCD939X_MBHC_CTL_ANA, 0x00 },294 { WCD939X_MBHC_ZDET_VNEG_CTL, 0x00 },295 { WCD939X_MBHC_ZDET_BIAS_CTL, 0x46 },296 { WCD939X_MBHC_CTL_BCS, 0x00 },297 { WCD939X_MBHC_TEST_CTL, 0x00 },298 { WCD939X_LDOH_MODE, 0x2b },299 { WCD939X_LDOH_BIAS, 0x68 },300 { WCD939X_LDOH_STB_LOADS, 0x00 },301 { WCD939X_LDOH_SLOWRAMP, 0x50 },302 { WCD939X_MICB1_TEST_CTL_1, 0x1a },303 { WCD939X_MICB1_TEST_CTL_2, 0x00 },304 { WCD939X_MICB1_TEST_CTL_3, 0xa4 },305 { WCD939X_MICB2_TEST_CTL_1, 0x1a },306 { WCD939X_MICB2_TEST_CTL_2, 0x00 },307 { WCD939X_MICB2_TEST_CTL_3, 0x24 },308 { WCD939X_MICB3_TEST_CTL_1, 0x9a },309 { WCD939X_MICB3_TEST_CTL_2, 0x80 },310 { WCD939X_MICB3_TEST_CTL_3, 0x24 },311 { WCD939X_MICB4_TEST_CTL_1, 0x1a },312 { WCD939X_MICB4_TEST_CTL_2, 0x80 },313 { WCD939X_MICB4_TEST_CTL_3, 0x24 },314 { WCD939X_TX_COM_ADC_VCM, 0x39 },315 { WCD939X_TX_COM_BIAS_ATEST, 0xe0 },316 { WCD939X_TX_COM_SPARE1, 0x00 },317 { WCD939X_TX_COM_SPARE2, 0x00 },318 { WCD939X_TX_COM_TXFE_DIV_CTL, 0x22 },319 { WCD939X_TX_COM_TXFE_DIV_START, 0x00 },320 { WCD939X_TX_COM_SPARE3, 0x00 },321 { WCD939X_TX_COM_SPARE4, 0x00 },322 { WCD939X_TX_1_2_TEST_EN, 0xcc },323 { WCD939X_TX_1_2_ADC_IB, 0xe9 },324 { WCD939X_TX_1_2_ATEST_REFCTL, 0x0b },325 { WCD939X_TX_1_2_TEST_CTL, 0x38 },326 { WCD939X_TX_1_2_TEST_BLK_EN1, 0xff },327 { WCD939X_TX_1_2_TXFE1_CLKDIV, 0x00 },328 { WCD939X_TX_3_4_TEST_EN, 0xcc },329 { WCD939X_TX_3_4_ADC_IB, 0xe9 },330 { WCD939X_TX_3_4_ATEST_REFCTL, 0x0b },331 { WCD939X_TX_3_4_TEST_CTL, 0x38 },332 { WCD939X_TX_3_4_TEST_BLK_EN3, 0xff },333 { WCD939X_TX_3_4_TXFE3_CLKDIV, 0x00 },334 { WCD939X_TX_3_4_TEST_BLK_EN2, 0xfb },335 { WCD939X_TX_3_4_TXFE2_CLKDIV, 0x00 },336 { WCD939X_TX_3_4_SPARE1, 0x00 },337 { WCD939X_TX_3_4_TEST_BLK_EN4, 0xfb },338 { WCD939X_TX_3_4_TXFE4_CLKDIV, 0x00 },339 { WCD939X_TX_3_4_SPARE2, 0x00 },340 { WCD939X_CLASSH_MODE_1, 0x40 },341 { WCD939X_CLASSH_MODE_2, 0x3a },342 { WCD939X_CLASSH_MODE_3, 0xf0 },343 { WCD939X_CLASSH_CTRL_VCL_1, 0x7c },344 { WCD939X_CLASSH_CTRL_VCL_2, 0x82 },345 { WCD939X_CLASSH_CTRL_CCL_1, 0x31 },346 { WCD939X_CLASSH_CTRL_CCL_2, 0x80 },347 { WCD939X_CLASSH_CTRL_CCL_3, 0x80 },348 { WCD939X_CLASSH_CTRL_CCL_4, 0x51 },349 { WCD939X_CLASSH_CTRL_CCL_5, 0x00 },350 { WCD939X_CLASSH_BUCK_TMUX_A_D, 0x00 },351 { WCD939X_CLASSH_BUCK_SW_DRV_CNTL, 0x77 },352 { WCD939X_CLASSH_SPARE, 0x80 },353 { WCD939X_FLYBACK_EN, 0x4e },354 { WCD939X_FLYBACK_VNEG_CTRL_1, 0x0b },355 { WCD939X_FLYBACK_VNEG_CTRL_2, 0x45 },356 { WCD939X_FLYBACK_VNEG_CTRL_3, 0x14 },357 { WCD939X_FLYBACK_VNEG_CTRL_4, 0xdb },358 { WCD939X_FLYBACK_VNEG_CTRL_5, 0x83 },359 { WCD939X_FLYBACK_VNEG_CTRL_6, 0x98 },360 { WCD939X_FLYBACK_VNEG_CTRL_7, 0xa9 },361 { WCD939X_FLYBACK_VNEG_CTRL_8, 0x68 },362 { WCD939X_FLYBACK_VNEG_CTRL_9, 0x66 },363 { WCD939X_FLYBACK_VNEGDAC_CTRL_1, 0xed },364 { WCD939X_FLYBACK_VNEGDAC_CTRL_2, 0xf8 },365 { WCD939X_FLYBACK_VNEGDAC_CTRL_3, 0xa6 },366 { WCD939X_FLYBACK_CTRL_1, 0x65 },367 { WCD939X_FLYBACK_TEST_CTL, 0x02 },368 { WCD939X_RX_AUX_SW_CTL, 0x00 },369 { WCD939X_RX_PA_AUX_IN_CONN, 0x01 },370 { WCD939X_RX_TIMER_DIV, 0x32 },371 { WCD939X_RX_OCP_CTL, 0x1f },372 { WCD939X_RX_OCP_COUNT, 0x77 },373 { WCD939X_RX_BIAS_EAR_DAC, 0xa0 },374 { WCD939X_RX_BIAS_EAR_AMP, 0xaa },375 { WCD939X_RX_BIAS_HPH_LDO, 0xa9 },376 { WCD939X_RX_BIAS_HPH_PA, 0xaa },377 { WCD939X_RX_BIAS_HPH_RDACBUFF_CNP2, 0xca },378 { WCD939X_RX_BIAS_HPH_RDAC_LDO, 0x88 },379 { WCD939X_RX_BIAS_HPH_CNP1, 0x82 },380 { WCD939X_RX_BIAS_HPH_LOWPOWER, 0x82 },381 { WCD939X_RX_BIAS_AUX_DAC, 0xa0 },382 { WCD939X_RX_BIAS_AUX_AMP, 0xaa },383 { WCD939X_RX_BIAS_VNEGDAC_BLEEDER, 0x50 },384 { WCD939X_RX_BIAS_MISC, 0x00 },385 { WCD939X_RX_BIAS_BUCK_RST, 0x08 },386 { WCD939X_RX_BIAS_BUCK_VREF_ERRAMP, 0x44 },387 { WCD939X_RX_BIAS_FLYB_ERRAMP, 0x40 },388 { WCD939X_RX_BIAS_FLYB_BUFF, 0xaa },389 { WCD939X_RX_BIAS_FLYB_MID_RST, 0x14 },390 { WCD939X_HPH_CNP_EN, 0x80 },391 { WCD939X_HPH_CNP_WG_CTL, 0x9a },392 { WCD939X_HPH_CNP_WG_TIME, 0x14 },393 { WCD939X_HPH_OCP_CTL, 0x28 },394 { WCD939X_HPH_AUTO_CHOP, 0x56 },395 { WCD939X_HPH_CHOP_CTL, 0x83 },396 { WCD939X_HPH_PA_CTL1, 0x46 },397 { WCD939X_HPH_PA_CTL2, 0x50 },398 { WCD939X_HPH_L_EN, 0x80 },399 { WCD939X_HPH_L_TEST, 0xe0 },400 { WCD939X_HPH_L_ATEST, 0x50 },401 { WCD939X_HPH_R_EN, 0x80 },402 { WCD939X_HPH_R_TEST, 0xe0 },403 { WCD939X_HPH_R_ATEST, 0x50 },404 { WCD939X_HPH_RDAC_CLK_CTL1, 0x80 },405 { WCD939X_HPH_RDAC_CLK_CTL2, 0x0b },406 { WCD939X_HPH_RDAC_LDO_CTL, 0x33 },407 { WCD939X_HPH_RDAC_CHOP_CLK_LP_CTL, 0x00 },408 { WCD939X_HPH_REFBUFF_UHQA_CTL, 0x00 },409 { WCD939X_HPH_REFBUFF_LP_CTL, 0x8e },410 { WCD939X_HPH_L_DAC_CTL, 0x20 },411 { WCD939X_HPH_R_DAC_CTL, 0x20 },412 { WCD939X_HPH_SURGE_COMP_SEL, 0x55 },413 { WCD939X_HPH_SURGE_EN, 0x19 },414 { WCD939X_HPH_SURGE_MISC1, 0xa0 },415 { WCD939X_EAR_EN, 0x22 },416 { WCD939X_EAR_PA_CON, 0x44 },417 { WCD939X_EAR_SP_CON, 0xdb },418 { WCD939X_EAR_DAC_CON, 0x80 },419 { WCD939X_EAR_CNP_FSM_CON, 0xb2 },420 { WCD939X_EAR_TEST_CTL, 0x00 },421 { WCD939X_FLYBACK_NEW_CTRL_2, 0x00 },422 { WCD939X_FLYBACK_NEW_CTRL_3, 0x00 },423 { WCD939X_FLYBACK_NEW_CTRL_4, 0x44 },424 { WCD939X_ANA_NEW_PAGE, 0x00 },425 { WCD939X_HPH_NEW_ANA_HPH2, 0x00 },426 { WCD939X_HPH_NEW_ANA_HPH3, 0x00 },427 { WCD939X_SLEEP_CTL, 0x18 },428 { WCD939X_SLEEP_WATCHDOG_CTL, 0x00 },429 { WCD939X_MBHC_NEW_ELECT_REM_CLAMP_CTL, 0x00 },430 { WCD939X_MBHC_NEW_CTL_1, 0x02 },431 { WCD939X_MBHC_NEW_CTL_2, 0x05 },432 { WCD939X_MBHC_NEW_PLUG_DETECT_CTL, 0xe9 },433 { WCD939X_MBHC_NEW_ZDET_ANA_CTL, 0x0f },434 { WCD939X_MBHC_NEW_ZDET_RAMP_CTL, 0x00 },435 { WCD939X_TX_NEW_CH12_MUX, 0x11 },436 { WCD939X_TX_NEW_CH34_MUX, 0x23 },437 { WCD939X_DIE_CRACK_DET_EN, 0x00 },438 { WCD939X_HPH_NEW_INT_RDAC_GAIN_CTL, 0x00 },439 { WCD939X_HPH_NEW_INT_PA_GAIN_CTL_L, 0x00 },440 { WCD939X_HPH_NEW_INT_RDAC_VREF_CTL, 0x08 },441 { WCD939X_HPH_NEW_INT_RDAC_OVERRIDE_CTL, 0x00 },442 { WCD939X_HPH_NEW_INT_PA_GAIN_CTL_R, 0x00 },443 { WCD939X_HPH_NEW_INT_PA_MISC1, 0x32 },444 { WCD939X_HPH_NEW_INT_PA_MISC2, 0x00 },445 { WCD939X_HPH_NEW_INT_PA_RDAC_MISC, 0x00 },446 { WCD939X_HPH_NEW_INT_TIMER1, 0xfe },447 { WCD939X_HPH_NEW_INT_TIMER2, 0x02 },448 { WCD939X_HPH_NEW_INT_TIMER3, 0x4e },449 { WCD939X_HPH_NEW_INT_TIMER4, 0x54 },450 { WCD939X_HPH_NEW_INT_PA_RDAC_MISC2, 0x0b },451 { WCD939X_HPH_NEW_INT_PA_RDAC_MISC3, 0x00 },452 { WCD939X_HPH_NEW_INT_RDAC_HD2_CTL_L, 0xa0 },453 { WCD939X_HPH_NEW_INT_RDAC_HD2_CTL_R, 0xa0 },454 { WCD939X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI, 0x64 },455 { WCD939X_RX_NEW_INT_HPH_RDAC_BIAS_ULP, 0x01 },456 { WCD939X_RX_NEW_INT_HPH_RDAC_LDO_LP, 0x11 },457 { WCD939X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL, 0x57 },458 { WCD939X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL, 0x01 },459 { WCD939X_MBHC_NEW_INT_MECH_DET_CURRENT, 0x00 },460 { WCD939X_MBHC_NEW_INT_ZDET_CLK_AND_MOISTURE_CTL_NEW, 0x47 },461 { WCD939X_EAR_INT_NEW_CHOPPER_CON, 0xa8 },462 { WCD939X_EAR_INT_NEW_CNP_VCM_CON1, 0x42 },463 { WCD939X_EAR_INT_NEW_CNP_VCM_CON2, 0x22 },464 { WCD939X_EAR_INT_NEW_DYNAMIC_BIAS, 0x00 },465 { WCD939X_SLEEP_INT_WATCHDOG_CTL_1, 0x0a },466 { WCD939X_SLEEP_INT_WATCHDOG_CTL_2, 0x0a },467 { WCD939X_DIE_CRACK_INT_DET_INT1, 0x02 },468 { WCD939X_DIE_CRACK_INT_DET_INT2, 0x60 },469 { WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_L2, 0xff },470 { WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_L1, 0x7f },471 { WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_L0, 0x3f },472 { WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_ULP1P2M, 0x1f },473 { WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_ULP0P6M, 0x0f },474 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG1_L2L1, 0xd7 },475 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG1_L0, 0xc8 },476 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG1_ULP, 0xc6 },477 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2MAIN_L2L1, 0x95 },478 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2MAIN_L0, 0x6a },479 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2MAIN_ULP, 0x05 },480 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2CASC_L2L1L0, 0xa5 },481 { WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2CASC_ULP, 0x13 },482 { WCD939X_TX_COM_NEW_INT_ADC_SCBIAS_L2L1, 0x88 },483 { WCD939X_TX_COM_NEW_INT_ADC_SCBIAS_L0ULP, 0x42 },484 { WCD939X_TX_COM_NEW_INT_ADC_INT_L2, 0xff },485 { WCD939X_TX_COM_NEW_INT_ADC_INT_L1, 0x64 },486 { WCD939X_TX_COM_NEW_INT_ADC_INT_L0, 0x64 },487 { WCD939X_TX_COM_NEW_INT_ADC_INT_ULP, 0x77 },488 { WCD939X_DIGITAL_PAGE, 0x00 },489 { WCD939X_DIGITAL_SWR_TX_CLK_RATE, 0x00 },490 { WCD939X_DIGITAL_CDC_RST_CTL, 0x03 },491 { WCD939X_DIGITAL_TOP_CLK_CFG, 0x00 },492 { WCD939X_DIGITAL_CDC_ANA_CLK_CTL, 0x00 },493 { WCD939X_DIGITAL_CDC_DIG_CLK_CTL, 0xf0 },494 { WCD939X_DIGITAL_SWR_RST_EN, 0x00 },495 { WCD939X_DIGITAL_CDC_PATH_MODE, 0x55 },496 { WCD939X_DIGITAL_CDC_RX_RST, 0x00 },497 { WCD939X_DIGITAL_CDC_RX0_CTL, 0xfc },498 { WCD939X_DIGITAL_CDC_RX1_CTL, 0xfc },499 { WCD939X_DIGITAL_CDC_RX2_CTL, 0xfc },500 { WCD939X_DIGITAL_CDC_TX_ANA_MODE_0_1, 0x00 },501 { WCD939X_DIGITAL_CDC_TX_ANA_MODE_2_3, 0x00 },502 { WCD939X_DIGITAL_CDC_COMP_CTL_0, 0x00 },503 { WCD939X_DIGITAL_CDC_ANA_TX_CLK_CTL, 0x1e },504 { WCD939X_DIGITAL_CDC_HPH_DSM_A1_0, 0x00 },505 { WCD939X_DIGITAL_CDC_HPH_DSM_A1_1, 0x01 },506 { WCD939X_DIGITAL_CDC_HPH_DSM_A2_0, 0x63 },507 { WCD939X_DIGITAL_CDC_HPH_DSM_A2_1, 0x04 },508 { WCD939X_DIGITAL_CDC_HPH_DSM_A3_0, 0xac },509 { WCD939X_DIGITAL_CDC_HPH_DSM_A3_1, 0x04 },510 { WCD939X_DIGITAL_CDC_HPH_DSM_A4_0, 0x1a },511 { WCD939X_DIGITAL_CDC_HPH_DSM_A4_1, 0x03 },512 { WCD939X_DIGITAL_CDC_HPH_DSM_A5_0, 0xbc },513 { WCD939X_DIGITAL_CDC_HPH_DSM_A5_1, 0x02 },514 { WCD939X_DIGITAL_CDC_HPH_DSM_A6_0, 0xc7 },515 { WCD939X_DIGITAL_CDC_HPH_DSM_A7_0, 0xf8 },516 { WCD939X_DIGITAL_CDC_HPH_DSM_C_0, 0x47 },517 { WCD939X_DIGITAL_CDC_HPH_DSM_C_1, 0x43 },518 { WCD939X_DIGITAL_CDC_HPH_DSM_C_2, 0xb1 },519 { WCD939X_DIGITAL_CDC_HPH_DSM_C_3, 0x17 },520 { WCD939X_DIGITAL_CDC_HPH_DSM_R1, 0x4d },521 { WCD939X_DIGITAL_CDC_HPH_DSM_R2, 0x29 },522 { WCD939X_DIGITAL_CDC_HPH_DSM_R3, 0x34 },523 { WCD939X_DIGITAL_CDC_HPH_DSM_R4, 0x59 },524 { WCD939X_DIGITAL_CDC_HPH_DSM_R5, 0x66 },525 { WCD939X_DIGITAL_CDC_HPH_DSM_R6, 0x87 },526 { WCD939X_DIGITAL_CDC_HPH_DSM_R7, 0x64 },527 { WCD939X_DIGITAL_CDC_EAR_DSM_A1_0, 0x00 },528 { WCD939X_DIGITAL_CDC_EAR_DSM_A1_1, 0x01 },529 { WCD939X_DIGITAL_CDC_EAR_DSM_A2_0, 0x96 },530 { WCD939X_DIGITAL_CDC_EAR_DSM_A2_1, 0x09 },531 { WCD939X_DIGITAL_CDC_EAR_DSM_A3_0, 0xab },532 { WCD939X_DIGITAL_CDC_EAR_DSM_A3_1, 0x05 },533 { WCD939X_DIGITAL_CDC_EAR_DSM_A4_0, 0x1c },534 { WCD939X_DIGITAL_CDC_EAR_DSM_A4_1, 0x02 },535 { WCD939X_DIGITAL_CDC_EAR_DSM_A5_0, 0x17 },536 { WCD939X_DIGITAL_CDC_EAR_DSM_A5_1, 0x02 },537 { WCD939X_DIGITAL_CDC_EAR_DSM_A6_0, 0xaa },538 { WCD939X_DIGITAL_CDC_EAR_DSM_A7_0, 0xe3 },539 { WCD939X_DIGITAL_CDC_EAR_DSM_C_0, 0x69 },540 { WCD939X_DIGITAL_CDC_EAR_DSM_C_1, 0x54 },541 { WCD939X_DIGITAL_CDC_EAR_DSM_C_2, 0x02 },542 { WCD939X_DIGITAL_CDC_EAR_DSM_C_3, 0x15 },543 { WCD939X_DIGITAL_CDC_EAR_DSM_R1, 0xa4 },544 { WCD939X_DIGITAL_CDC_EAR_DSM_R2, 0xb5 },545 { WCD939X_DIGITAL_CDC_EAR_DSM_R3, 0x86 },546 { WCD939X_DIGITAL_CDC_EAR_DSM_R4, 0x85 },547 { WCD939X_DIGITAL_CDC_EAR_DSM_R5, 0xaa },548 { WCD939X_DIGITAL_CDC_EAR_DSM_R6, 0xe2 },549 { WCD939X_DIGITAL_CDC_EAR_DSM_R7, 0x62 },550 { WCD939X_DIGITAL_CDC_HPH_GAIN_RX_0, 0x55 },551 { WCD939X_DIGITAL_CDC_HPH_GAIN_RX_1, 0xa9 },552 { WCD939X_DIGITAL_CDC_HPH_GAIN_DSD_0, 0x3d },553 { WCD939X_DIGITAL_CDC_HPH_GAIN_DSD_1, 0x2e },554 { WCD939X_DIGITAL_CDC_HPH_GAIN_DSD_2, 0x01 },555 { WCD939X_DIGITAL_CDC_EAR_GAIN_DSD_0, 0x00 },556 { WCD939X_DIGITAL_CDC_EAR_GAIN_DSD_1, 0xfc },557 { WCD939X_DIGITAL_CDC_EAR_GAIN_DSD_2, 0x01 },558 { WCD939X_DIGITAL_CDC_HPH_GAIN_CTL, 0x00 },559 { WCD939X_DIGITAL_CDC_EAR_GAIN_CTL, 0x00 },560 { WCD939X_DIGITAL_CDC_EAR_PATH_CTL, 0x00 },561 { WCD939X_DIGITAL_CDC_SWR_CLH, 0x00 },562 { WCD939X_DIGITAL_SWR_CLH_BYP, 0x00 },563 { WCD939X_DIGITAL_CDC_TX0_CTL, 0x68 },564 { WCD939X_DIGITAL_CDC_TX1_CTL, 0x68 },565 { WCD939X_DIGITAL_CDC_TX2_CTL, 0x68 },566 { WCD939X_DIGITAL_CDC_TX_RST, 0x00 },567 { WCD939X_DIGITAL_CDC_REQ_CTL, 0x01 },568 { WCD939X_DIGITAL_CDC_RST, 0x00 },569 { WCD939X_DIGITAL_CDC_AMIC_CTL, 0x0f },570 { WCD939X_DIGITAL_CDC_DMIC_CTL, 0x04 },571 { WCD939X_DIGITAL_CDC_DMIC1_CTL, 0x01 },572 { WCD939X_DIGITAL_CDC_DMIC2_CTL, 0x01 },573 { WCD939X_DIGITAL_CDC_DMIC3_CTL, 0x01 },574 { WCD939X_DIGITAL_CDC_DMIC4_CTL, 0x01 },575 { WCD939X_DIGITAL_EFUSE_PRG_CTL, 0x00 },576 { WCD939X_DIGITAL_EFUSE_CTL, 0x2b },577 { WCD939X_DIGITAL_CDC_DMIC_RATE_1_2, 0x11 },578 { WCD939X_DIGITAL_CDC_DMIC_RATE_3_4, 0x11 },579 { WCD939X_DIGITAL_PDM_WD_CTL0, 0x00 },580 { WCD939X_DIGITAL_PDM_WD_CTL1, 0x00 },581 { WCD939X_DIGITAL_PDM_WD_CTL2, 0x00 },582 { WCD939X_DIGITAL_INTR_MODE, 0x00 },583 { WCD939X_DIGITAL_INTR_MASK_0, 0xff },584 { WCD939X_DIGITAL_INTR_MASK_1, 0xe7 },585 { WCD939X_DIGITAL_INTR_MASK_2, 0x0e },586 { WCD939X_DIGITAL_INTR_CLEAR_0, 0x00 },587 { WCD939X_DIGITAL_INTR_CLEAR_1, 0x00 },588 { WCD939X_DIGITAL_INTR_CLEAR_2, 0x00 },589 { WCD939X_DIGITAL_INTR_LEVEL_0, 0x00 },590 { WCD939X_DIGITAL_INTR_LEVEL_1, 0x00 },591 { WCD939X_DIGITAL_INTR_LEVEL_2, 0x00 },592 { WCD939X_DIGITAL_INTR_SET_0, 0x00 },593 { WCD939X_DIGITAL_INTR_SET_1, 0x00 },594 { WCD939X_DIGITAL_INTR_SET_2, 0x00 },595 { WCD939X_DIGITAL_INTR_TEST_0, 0x00 },596 { WCD939X_DIGITAL_INTR_TEST_1, 0x00 },597 { WCD939X_DIGITAL_INTR_TEST_2, 0x00 },598 { WCD939X_DIGITAL_TX_MODE_DBG_EN, 0x00 },599 { WCD939X_DIGITAL_TX_MODE_DBG_0_1, 0x00 },600 { WCD939X_DIGITAL_TX_MODE_DBG_2_3, 0x00 },601 { WCD939X_DIGITAL_LB_IN_SEL_CTL, 0x00 },602 { WCD939X_DIGITAL_LOOP_BACK_MODE, 0x00 },603 { WCD939X_DIGITAL_SWR_DAC_TEST, 0x00 },604 { WCD939X_DIGITAL_SWR_HM_TEST_RX_0, 0x40 },605 { WCD939X_DIGITAL_SWR_HM_TEST_TX_0, 0x40 },606 { WCD939X_DIGITAL_SWR_HM_TEST_RX_1, 0x00 },607 { WCD939X_DIGITAL_SWR_HM_TEST_TX_1, 0x00 },608 { WCD939X_DIGITAL_SWR_HM_TEST_TX_2, 0x00 },609 { WCD939X_DIGITAL_PAD_CTL_SWR_0, 0x8f },610 { WCD939X_DIGITAL_PAD_CTL_SWR_1, 0x06 },611 { WCD939X_DIGITAL_I2C_CTL, 0x00 },612 { WCD939X_DIGITAL_CDC_TX_TANGGU_SW_MODE, 0x00 },613 { WCD939X_DIGITAL_EFUSE_TEST_CTL_0, 0x00 },614 { WCD939X_DIGITAL_EFUSE_TEST_CTL_1, 0x00 },615 { WCD939X_DIGITAL_PAD_CTL_PDM_RX0, 0xf1 },616 { WCD939X_DIGITAL_PAD_CTL_PDM_RX1, 0xf1 },617 { WCD939X_DIGITAL_PAD_CTL_PDM_TX0, 0xf1 },618 { WCD939X_DIGITAL_PAD_CTL_PDM_TX1, 0xf1 },619 { WCD939X_DIGITAL_PAD_CTL_PDM_TX2, 0xf1 },620 { WCD939X_DIGITAL_PAD_INP_DIS_0, 0x00 },621 { WCD939X_DIGITAL_PAD_INP_DIS_1, 0x00 },622 { WCD939X_DIGITAL_DRIVE_STRENGTH_0, 0x00 },623 { WCD939X_DIGITAL_DRIVE_STRENGTH_1, 0x00 },624 { WCD939X_DIGITAL_DRIVE_STRENGTH_2, 0x00 },625 { WCD939X_DIGITAL_RX_DATA_EDGE_CTL, 0x1f },626 { WCD939X_DIGITAL_TX_DATA_EDGE_CTL, 0x80 },627 { WCD939X_DIGITAL_GPIO_MODE, 0x00 },628 { WCD939X_DIGITAL_PIN_CTL_OE, 0x00 },629 { WCD939X_DIGITAL_PIN_CTL_DATA_0, 0x00 },630 { WCD939X_DIGITAL_PIN_CTL_DATA_1, 0x00 },631 { WCD939X_DIGITAL_DIG_DEBUG_CTL, 0x00 },632 { WCD939X_DIGITAL_DIG_DEBUG_EN, 0x00 },633 { WCD939X_DIGITAL_ANA_CSR_DBG_ADD, 0x00 },634 { WCD939X_DIGITAL_ANA_CSR_DBG_CTL, 0x48 },635 { WCD939X_DIGITAL_SSP_DBG, 0x00 },636 { WCD939X_DIGITAL_SPARE_0, 0x00 },637 { WCD939X_DIGITAL_SPARE_1, 0x00 },638 { WCD939X_DIGITAL_SPARE_2, 0x00 },639 { WCD939X_DIGITAL_TX_REQ_FB_CTL_0, 0x88 },640 { WCD939X_DIGITAL_TX_REQ_FB_CTL_1, 0x88 },641 { WCD939X_DIGITAL_TX_REQ_FB_CTL_2, 0x88 },642 { WCD939X_DIGITAL_TX_REQ_FB_CTL_3, 0x88 },643 { WCD939X_DIGITAL_TX_REQ_FB_CTL_4, 0x88 },644 { WCD939X_DIGITAL_DEM_BYPASS_DATA0, 0x55 },645 { WCD939X_DIGITAL_DEM_BYPASS_DATA1, 0x55 },646 { WCD939X_DIGITAL_DEM_BYPASS_DATA2, 0x55 },647 { WCD939X_DIGITAL_DEM_BYPASS_DATA3, 0x01 },648 { WCD939X_DIGITAL_DEM_SECOND_ORDER, 0x03 },649 { WCD939X_DIGITAL_DSM_CTRL, 0x00 },650 { WCD939X_DIGITAL_DSM_0_STATIC_DATA_0, 0x00 },651 { WCD939X_DIGITAL_DSM_0_STATIC_DATA_1, 0x00 },652 { WCD939X_DIGITAL_DSM_0_STATIC_DATA_2, 0x00 },653 { WCD939X_DIGITAL_DSM_0_STATIC_DATA_3, 0x00 },654 { WCD939X_DIGITAL_DSM_1_STATIC_DATA_0, 0x00 },655 { WCD939X_DIGITAL_DSM_1_STATIC_DATA_1, 0x00 },656 { WCD939X_DIGITAL_DSM_1_STATIC_DATA_2, 0x00 },657 { WCD939X_DIGITAL_DSM_1_STATIC_DATA_3, 0x00 },658 { WCD939X_RX_TOP_PAGE, 0x00 },659 { WCD939X_RX_TOP_TOP_CFG0, 0x00 },660 { WCD939X_RX_TOP_HPHL_COMP_WR_LSB, 0x00 },661 { WCD939X_RX_TOP_HPHL_COMP_WR_MSB, 0x00 },662 { WCD939X_RX_TOP_HPHL_COMP_LUT, 0x00 },663 { WCD939X_RX_TOP_HPHR_COMP_WR_LSB, 0x00 },664 { WCD939X_RX_TOP_HPHR_COMP_WR_MSB, 0x00 },665 { WCD939X_RX_TOP_HPHR_COMP_LUT, 0x00 },666 { WCD939X_RX_TOP_DSD0_DEBUG_CFG1, 0x05 },667 { WCD939X_RX_TOP_DSD0_DEBUG_CFG2, 0x08 },668 { WCD939X_RX_TOP_DSD0_DEBUG_CFG3, 0x00 },669 { WCD939X_RX_TOP_DSD0_DEBUG_CFG4, 0x00 },670 { WCD939X_RX_TOP_DSD1_DEBUG_CFG1, 0x03 },671 { WCD939X_RX_TOP_DSD1_DEBUG_CFG2, 0x08 },672 { WCD939X_RX_TOP_DSD1_DEBUG_CFG3, 0x00 },673 { WCD939X_RX_TOP_DSD1_DEBUG_CFG4, 0x00 },674 { WCD939X_RX_TOP_HPHL_PATH_CFG0, 0x00 },675 { WCD939X_RX_TOP_HPHL_PATH_CFG1, 0x00 },676 { WCD939X_RX_TOP_HPHR_PATH_CFG0, 0x00 },677 { WCD939X_RX_TOP_HPHR_PATH_CFG1, 0x00 },678 { WCD939X_RX_TOP_PATH_CFG2, 0x00 },679 { WCD939X_RX_TOP_HPHL_PATH_SEC0, 0x00 },680 { WCD939X_RX_TOP_HPHL_PATH_SEC1, 0x00 },681 { WCD939X_RX_TOP_HPHL_PATH_SEC2, 0x00 },682 { WCD939X_RX_TOP_HPHL_PATH_SEC3, 0x00 },683 { WCD939X_RX_TOP_HPHR_PATH_SEC0, 0x00 },684 { WCD939X_RX_TOP_HPHR_PATH_SEC1, 0x00 },685 { WCD939X_RX_TOP_HPHR_PATH_SEC2, 0x00 },686 { WCD939X_RX_TOP_HPHR_PATH_SEC3, 0x00 },687 { WCD939X_RX_TOP_PATH_SEC4, 0x00 },688 { WCD939X_RX_TOP_PATH_SEC5, 0x00 },689 { WCD939X_COMPANDER_HPHL_CTL0, 0x60 },690 { WCD939X_COMPANDER_HPHL_CTL1, 0xdb },691 { WCD939X_COMPANDER_HPHL_CTL2, 0xff },692 { WCD939X_COMPANDER_HPHL_CTL3, 0x35 },693 { WCD939X_COMPANDER_HPHL_CTL4, 0xff },694 { WCD939X_COMPANDER_HPHL_CTL5, 0x00 },695 { WCD939X_COMPANDER_HPHL_CTL7, 0x08 },696 { WCD939X_COMPANDER_HPHL_CTL8, 0x00 },697 { WCD939X_COMPANDER_HPHL_CTL9, 0x00 },698 { WCD939X_COMPANDER_HPHL_CTL10, 0x06 },699 { WCD939X_COMPANDER_HPHL_CTL11, 0x12 },700 { WCD939X_COMPANDER_HPHL_CTL12, 0x1e },701 { WCD939X_COMPANDER_HPHL_CTL13, 0x2a },702 { WCD939X_COMPANDER_HPHL_CTL14, 0x36 },703 { WCD939X_COMPANDER_HPHL_CTL15, 0x3c },704 { WCD939X_COMPANDER_HPHL_CTL16, 0xc4 },705 { WCD939X_COMPANDER_HPHL_CTL17, 0x00 },706 { WCD939X_COMPANDER_HPHL_CTL18, 0x0c },707 { WCD939X_COMPANDER_HPHL_CTL19, 0x16 },708 { WCD939X_R_CTL0, 0x60 },709 { WCD939X_R_CTL1, 0xdb },710 { WCD939X_R_CTL2, 0xff },711 { WCD939X_R_CTL3, 0x35 },712 { WCD939X_R_CTL4, 0xff },713 { WCD939X_R_CTL5, 0x00 },714 { WCD939X_R_CTL7, 0x08 },715 { WCD939X_R_CTL8, 0x00 },716 { WCD939X_R_CTL9, 0x00 },717 { WCD939X_R_CTL10, 0x06 },718 { WCD939X_R_CTL11, 0x12 },719 { WCD939X_R_CTL12, 0x1e },720 { WCD939X_R_CTL13, 0x2a },721 { WCD939X_R_CTL14, 0x36 },722 { WCD939X_R_CTL15, 0x3c },723 { WCD939X_R_CTL16, 0xc4 },724 { WCD939X_R_CTL17, 0x00 },725 { WCD939X_R_CTL18, 0x0c },726 { WCD939X_R_CTL19, 0x16 },727 { WCD939X_E_PATH_CTL, 0x00 },728 { WCD939X_E_CFG0, 0x07 },729 { WCD939X_E_CFG1, 0x3c },730 { WCD939X_E_CFG2, 0x00 },731 { WCD939X_E_CFG3, 0x00 },732 { WCD939X_DSD_HPHL_PATH_CTL, 0x00 },733 { WCD939X_DSD_HPHL_CFG0, 0x00 },734 { WCD939X_DSD_HPHL_CFG1, 0x00 },735 { WCD939X_DSD_HPHL_CFG2, 0x22 },736 { WCD939X_DSD_HPHL_CFG3, 0x00 },737 { WCD939X_DSD_HPHL_CFG4, 0x1a },738 { WCD939X_DSD_HPHL_CFG5, 0x00 },739 { WCD939X_DSD_HPHR_PATH_CTL, 0x00 },740 { WCD939X_DSD_HPHR_CFG0, 0x00 },741 { WCD939X_DSD_HPHR_CFG1, 0x00 },742 { WCD939X_DSD_HPHR_CFG2, 0x22 },743 { WCD939X_DSD_HPHR_CFG3, 0x00 },744 { WCD939X_DSD_HPHR_CFG4, 0x1a },745 { WCD939X_DSD_HPHR_CFG5, 0x00 },746};747 748static bool wcd939x_rdwr_register(struct device *dev, unsigned int reg)749{750 switch (reg) {751 case WCD939X_ANA_PAGE:752 case WCD939X_ANA_BIAS:753 case WCD939X_ANA_RX_SUPPLIES:754 case WCD939X_ANA_HPH:755 case WCD939X_ANA_EAR:756 case WCD939X_ANA_EAR_COMPANDER_CTL:757 case WCD939X_ANA_TX_CH1:758 case WCD939X_ANA_TX_CH2:759 case WCD939X_ANA_TX_CH3:760 case WCD939X_ANA_TX_CH4:761 case WCD939X_ANA_MICB1_MICB2_DSP_EN_LOGIC:762 case WCD939X_ANA_MICB3_DSP_EN_LOGIC:763 case WCD939X_ANA_MBHC_MECH:764 case WCD939X_ANA_MBHC_ELECT:765 case WCD939X_ANA_MBHC_ZDET:766 case WCD939X_ANA_MBHC_BTN0:767 case WCD939X_ANA_MBHC_BTN1:768 case WCD939X_ANA_MBHC_BTN2:769 case WCD939X_ANA_MBHC_BTN3:770 case WCD939X_ANA_MBHC_BTN4:771 case WCD939X_ANA_MBHC_BTN5:772 case WCD939X_ANA_MBHC_BTN6:773 case WCD939X_ANA_MBHC_BTN7:774 case WCD939X_ANA_MICB1:775 case WCD939X_ANA_MICB2:776 case WCD939X_ANA_MICB2_RAMP:777 case WCD939X_ANA_MICB3:778 case WCD939X_ANA_MICB4:779 case WCD939X_BIAS_CTL:780 case WCD939X_BIAS_VBG_FINE_ADJ:781 case WCD939X_LDOL_VDDCX_ADJUST:782 case WCD939X_LDOL_DISABLE_LDOL:783 case WCD939X_MBHC_CTL_CLK:784 case WCD939X_MBHC_CTL_ANA:785 case WCD939X_MBHC_ZDET_VNEG_CTL:786 case WCD939X_MBHC_ZDET_BIAS_CTL:787 case WCD939X_MBHC_CTL_BCS:788 case WCD939X_MBHC_TEST_CTL:789 case WCD939X_LDOH_MODE:790 case WCD939X_LDOH_BIAS:791 case WCD939X_LDOH_STB_LOADS:792 case WCD939X_LDOH_SLOWRAMP:793 case WCD939X_MICB1_TEST_CTL_1:794 case WCD939X_MICB1_TEST_CTL_2:795 case WCD939X_MICB1_TEST_CTL_3:796 case WCD939X_MICB2_TEST_CTL_1:797 case WCD939X_MICB2_TEST_CTL_2:798 case WCD939X_MICB2_TEST_CTL_3:799 case WCD939X_MICB3_TEST_CTL_1:800 case WCD939X_MICB3_TEST_CTL_2:801 case WCD939X_MICB3_TEST_CTL_3:802 case WCD939X_MICB4_TEST_CTL_1:803 case WCD939X_MICB4_TEST_CTL_2:804 case WCD939X_MICB4_TEST_CTL_3:805 case WCD939X_TX_COM_ADC_VCM:806 case WCD939X_TX_COM_BIAS_ATEST:807 case WCD939X_TX_COM_SPARE1:808 case WCD939X_TX_COM_SPARE2:809 case WCD939X_TX_COM_TXFE_DIV_CTL:810 case WCD939X_TX_COM_TXFE_DIV_START:811 case WCD939X_TX_COM_SPARE3:812 case WCD939X_TX_COM_SPARE4:813 case WCD939X_TX_1_2_TEST_EN:814 case WCD939X_TX_1_2_ADC_IB:815 case WCD939X_TX_1_2_ATEST_REFCTL:816 case WCD939X_TX_1_2_TEST_CTL:817 case WCD939X_TX_1_2_TEST_BLK_EN1:818 case WCD939X_TX_1_2_TXFE1_CLKDIV:819 case WCD939X_TX_3_4_TEST_EN:820 case WCD939X_TX_3_4_ADC_IB:821 case WCD939X_TX_3_4_ATEST_REFCTL:822 case WCD939X_TX_3_4_TEST_CTL:823 case WCD939X_TX_3_4_TEST_BLK_EN3:824 case WCD939X_TX_3_4_TXFE3_CLKDIV:825 case WCD939X_TX_3_4_TEST_BLK_EN2:826 case WCD939X_TX_3_4_TXFE2_CLKDIV:827 case WCD939X_TX_3_4_SPARE1:828 case WCD939X_TX_3_4_TEST_BLK_EN4:829 case WCD939X_TX_3_4_TXFE4_CLKDIV:830 case WCD939X_TX_3_4_SPARE2:831 case WCD939X_CLASSH_MODE_1:832 case WCD939X_CLASSH_MODE_2:833 case WCD939X_CLASSH_MODE_3:834 case WCD939X_CLASSH_CTRL_VCL_1:835 case WCD939X_CLASSH_CTRL_VCL_2:836 case WCD939X_CLASSH_CTRL_CCL_1:837 case WCD939X_CLASSH_CTRL_CCL_2:838 case WCD939X_CLASSH_CTRL_CCL_3:839 case WCD939X_CLASSH_CTRL_CCL_4:840 case WCD939X_CLASSH_CTRL_CCL_5:841 case WCD939X_CLASSH_BUCK_TMUX_A_D:842 case WCD939X_CLASSH_BUCK_SW_DRV_CNTL:843 case WCD939X_CLASSH_SPARE:844 case WCD939X_FLYBACK_EN:845 case WCD939X_FLYBACK_VNEG_CTRL_1:846 case WCD939X_FLYBACK_VNEG_CTRL_2:847 case WCD939X_FLYBACK_VNEG_CTRL_3:848 case WCD939X_FLYBACK_VNEG_CTRL_4:849 case WCD939X_FLYBACK_VNEG_CTRL_5:850 case WCD939X_FLYBACK_VNEG_CTRL_6:851 case WCD939X_FLYBACK_VNEG_CTRL_7:852 case WCD939X_FLYBACK_VNEG_CTRL_8:853 case WCD939X_FLYBACK_VNEG_CTRL_9:854 case WCD939X_FLYBACK_VNEGDAC_CTRL_1:855 case WCD939X_FLYBACK_VNEGDAC_CTRL_2:856 case WCD939X_FLYBACK_VNEGDAC_CTRL_3:857 case WCD939X_FLYBACK_CTRL_1:858 case WCD939X_FLYBACK_TEST_CTL:859 case WCD939X_RX_AUX_SW_CTL:860 case WCD939X_RX_PA_AUX_IN_CONN:861 case WCD939X_RX_TIMER_DIV:862 case WCD939X_RX_OCP_CTL:863 case WCD939X_RX_OCP_COUNT:864 case WCD939X_RX_BIAS_EAR_DAC:865 case WCD939X_RX_BIAS_EAR_AMP:866 case WCD939X_RX_BIAS_HPH_LDO:867 case WCD939X_RX_BIAS_HPH_PA:868 case WCD939X_RX_BIAS_HPH_RDACBUFF_CNP2:869 case WCD939X_RX_BIAS_HPH_RDAC_LDO:870 case WCD939X_RX_BIAS_HPH_CNP1:871 case WCD939X_RX_BIAS_HPH_LOWPOWER:872 case WCD939X_RX_BIAS_AUX_DAC:873 case WCD939X_RX_BIAS_AUX_AMP:874 case WCD939X_RX_BIAS_VNEGDAC_BLEEDER:875 case WCD939X_RX_BIAS_MISC:876 case WCD939X_RX_BIAS_BUCK_RST:877 case WCD939X_RX_BIAS_BUCK_VREF_ERRAMP:878 case WCD939X_RX_BIAS_FLYB_ERRAMP:879 case WCD939X_RX_BIAS_FLYB_BUFF:880 case WCD939X_RX_BIAS_FLYB_MID_RST:881 case WCD939X_HPH_CNP_EN:882 case WCD939X_HPH_CNP_WG_CTL:883 case WCD939X_HPH_CNP_WG_TIME:884 case WCD939X_HPH_OCP_CTL:885 case WCD939X_HPH_AUTO_CHOP:886 case WCD939X_HPH_CHOP_CTL:887 case WCD939X_HPH_PA_CTL1:888 case WCD939X_HPH_PA_CTL2:889 case WCD939X_HPH_L_EN:890 case WCD939X_HPH_L_TEST:891 case WCD939X_HPH_L_ATEST:892 case WCD939X_HPH_R_EN:893 case WCD939X_HPH_R_TEST:894 case WCD939X_HPH_R_ATEST:895 case WCD939X_HPH_RDAC_CLK_CTL1:896 case WCD939X_HPH_RDAC_CLK_CTL2:897 case WCD939X_HPH_RDAC_LDO_CTL:898 case WCD939X_HPH_RDAC_CHOP_CLK_LP_CTL:899 case WCD939X_HPH_REFBUFF_UHQA_CTL:900 case WCD939X_HPH_REFBUFF_LP_CTL:901 case WCD939X_HPH_L_DAC_CTL:902 case WCD939X_HPH_R_DAC_CTL:903 case WCD939X_HPH_SURGE_COMP_SEL:904 case WCD939X_HPH_SURGE_EN:905 case WCD939X_HPH_SURGE_MISC1:906 case WCD939X_EAR_EN:907 case WCD939X_EAR_PA_CON:908 case WCD939X_EAR_SP_CON:909 case WCD939X_EAR_DAC_CON:910 case WCD939X_EAR_CNP_FSM_CON:911 case WCD939X_EAR_TEST_CTL:912 case WCD939X_FLYBACK_NEW_CTRL_2:913 case WCD939X_FLYBACK_NEW_CTRL_3:914 case WCD939X_FLYBACK_NEW_CTRL_4:915 case WCD939X_ANA_NEW_PAGE:916 case WCD939X_HPH_NEW_ANA_HPH2:917 case WCD939X_HPH_NEW_ANA_HPH3:918 case WCD939X_SLEEP_CTL:919 case WCD939X_SLEEP_WATCHDOG_CTL:920 case WCD939X_MBHC_NEW_ELECT_REM_CLAMP_CTL:921 case WCD939X_MBHC_NEW_CTL_1:922 case WCD939X_MBHC_NEW_CTL_2:923 case WCD939X_MBHC_NEW_PLUG_DETECT_CTL:924 case WCD939X_MBHC_NEW_ZDET_ANA_CTL:925 case WCD939X_MBHC_NEW_ZDET_RAMP_CTL:926 case WCD939X_TX_NEW_CH12_MUX:927 case WCD939X_TX_NEW_CH34_MUX:928 case WCD939X_DIE_CRACK_DET_EN:929 case WCD939X_HPH_NEW_INT_RDAC_GAIN_CTL:930 case WCD939X_HPH_NEW_INT_PA_GAIN_CTL_L:931 case WCD939X_HPH_NEW_INT_RDAC_VREF_CTL:932 case WCD939X_HPH_NEW_INT_RDAC_OVERRIDE_CTL:933 case WCD939X_HPH_NEW_INT_PA_GAIN_CTL_R:934 case WCD939X_HPH_NEW_INT_PA_MISC1:935 case WCD939X_HPH_NEW_INT_PA_MISC2:936 case WCD939X_HPH_NEW_INT_PA_RDAC_MISC:937 case WCD939X_HPH_NEW_INT_TIMER1:938 case WCD939X_HPH_NEW_INT_TIMER2:939 case WCD939X_HPH_NEW_INT_TIMER3:940 case WCD939X_HPH_NEW_INT_TIMER4:941 case WCD939X_HPH_NEW_INT_PA_RDAC_MISC2:942 case WCD939X_HPH_NEW_INT_PA_RDAC_MISC3:943 case WCD939X_HPH_NEW_INT_RDAC_HD2_CTL_L:944 case WCD939X_HPH_NEW_INT_RDAC_HD2_CTL_R:945 case WCD939X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI:946 case WCD939X_RX_NEW_INT_HPH_RDAC_BIAS_ULP:947 case WCD939X_RX_NEW_INT_HPH_RDAC_LDO_LP:948 case WCD939X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL:949 case WCD939X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL:950 case WCD939X_MBHC_NEW_INT_MECH_DET_CURRENT:951 case WCD939X_MBHC_NEW_INT_ZDET_CLK_AND_MOISTURE_CTL_NEW:952 case WCD939X_EAR_INT_NEW_CHOPPER_CON:953 case WCD939X_EAR_INT_NEW_CNP_VCM_CON1:954 case WCD939X_EAR_INT_NEW_CNP_VCM_CON2:955 case WCD939X_EAR_INT_NEW_DYNAMIC_BIAS:956 case WCD939X_SLEEP_INT_WATCHDOG_CTL_1:957 case WCD939X_SLEEP_INT_WATCHDOG_CTL_2:958 case WCD939X_DIE_CRACK_INT_DET_INT1:959 case WCD939X_DIE_CRACK_INT_DET_INT2:960 case WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_L2:961 case WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_L1:962 case WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_L0:963 case WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_ULP1P2M:964 case WCD939X_TX_COM_NEW_INT_FE_DIVSTOP_ULP0P6M:965 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG1_L2L1:966 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG1_L0:967 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG1_ULP:968 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2MAIN_L2L1:969 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2MAIN_L0:970 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2MAIN_ULP:971 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2CASC_L2L1L0:972 case WCD939X_TX_COM_NEW_INT_FE_ICTRL_STG2CASC_ULP:973 case WCD939X_TX_COM_NEW_INT_ADC_SCBIAS_L2L1:974 case WCD939X_TX_COM_NEW_INT_ADC_SCBIAS_L0ULP:975 case WCD939X_TX_COM_NEW_INT_ADC_INT_L2:976 case WCD939X_TX_COM_NEW_INT_ADC_INT_L1:977 case WCD939X_TX_COM_NEW_INT_ADC_INT_L0:978 case WCD939X_TX_COM_NEW_INT_ADC_INT_ULP:979 case WCD939X_DIGITAL_PAGE:980 case WCD939X_DIGITAL_SWR_TX_CLK_RATE:981 case WCD939X_DIGITAL_CDC_RST_CTL:982 case WCD939X_DIGITAL_TOP_CLK_CFG:983 case WCD939X_DIGITAL_CDC_ANA_CLK_CTL:984 case WCD939X_DIGITAL_CDC_DIG_CLK_CTL:985 case WCD939X_DIGITAL_SWR_RST_EN:986 case WCD939X_DIGITAL_CDC_PATH_MODE:987 case WCD939X_DIGITAL_CDC_RX_RST:988 case WCD939X_DIGITAL_CDC_RX0_CTL:989 case WCD939X_DIGITAL_CDC_RX1_CTL:990 case WCD939X_DIGITAL_CDC_RX2_CTL:991 case WCD939X_DIGITAL_CDC_TX_ANA_MODE_0_1:992 case WCD939X_DIGITAL_CDC_TX_ANA_MODE_2_3:993 case WCD939X_DIGITAL_CDC_COMP_CTL_0:994 case WCD939X_DIGITAL_CDC_ANA_TX_CLK_CTL:995 case WCD939X_DIGITAL_CDC_HPH_DSM_A1_0:996 case WCD939X_DIGITAL_CDC_HPH_DSM_A1_1:997 case WCD939X_DIGITAL_CDC_HPH_DSM_A2_0:998 case WCD939X_DIGITAL_CDC_HPH_DSM_A2_1:999 case WCD939X_DIGITAL_CDC_HPH_DSM_A3_0:1000 case WCD939X_DIGITAL_CDC_HPH_DSM_A3_1:1001 case WCD939X_DIGITAL_CDC_HPH_DSM_A4_0:1002 case WCD939X_DIGITAL_CDC_HPH_DSM_A4_1:1003 case WCD939X_DIGITAL_CDC_HPH_DSM_A5_0:1004 case WCD939X_DIGITAL_CDC_HPH_DSM_A5_1:1005 case WCD939X_DIGITAL_CDC_HPH_DSM_A6_0:1006 case WCD939X_DIGITAL_CDC_HPH_DSM_A7_0:1007 case WCD939X_DIGITAL_CDC_HPH_DSM_C_0:1008 case WCD939X_DIGITAL_CDC_HPH_DSM_C_1:1009 case WCD939X_DIGITAL_CDC_HPH_DSM_C_2:1010 case WCD939X_DIGITAL_CDC_HPH_DSM_C_3:1011 case WCD939X_DIGITAL_CDC_HPH_DSM_R1:1012 case WCD939X_DIGITAL_CDC_HPH_DSM_R2:1013 case WCD939X_DIGITAL_CDC_HPH_DSM_R3:1014 case WCD939X_DIGITAL_CDC_HPH_DSM_R4:1015 case WCD939X_DIGITAL_CDC_HPH_DSM_R5:1016 case WCD939X_DIGITAL_CDC_HPH_DSM_R6:1017 case WCD939X_DIGITAL_CDC_HPH_DSM_R7:1018 case WCD939X_DIGITAL_CDC_EAR_DSM_A1_0:1019 case WCD939X_DIGITAL_CDC_EAR_DSM_A1_1:1020 case WCD939X_DIGITAL_CDC_EAR_DSM_A2_0:1021 case WCD939X_DIGITAL_CDC_EAR_DSM_A2_1:1022 case WCD939X_DIGITAL_CDC_EAR_DSM_A3_0:1023 case WCD939X_DIGITAL_CDC_EAR_DSM_A3_1:1024 case WCD939X_DIGITAL_CDC_EAR_DSM_A4_0:1025 case WCD939X_DIGITAL_CDC_EAR_DSM_A4_1:1026 case WCD939X_DIGITAL_CDC_EAR_DSM_A5_0:1027 case WCD939X_DIGITAL_CDC_EAR_DSM_A5_1:1028 case WCD939X_DIGITAL_CDC_EAR_DSM_A6_0:1029 case WCD939X_DIGITAL_CDC_EAR_DSM_A7_0:1030 case WCD939X_DIGITAL_CDC_EAR_DSM_C_0:1031 case WCD939X_DIGITAL_CDC_EAR_DSM_C_1:1032 case WCD939X_DIGITAL_CDC_EAR_DSM_C_2:1033 case WCD939X_DIGITAL_CDC_EAR_DSM_C_3:1034 case WCD939X_DIGITAL_CDC_EAR_DSM_R1:1035 case WCD939X_DIGITAL_CDC_EAR_DSM_R2:1036 case WCD939X_DIGITAL_CDC_EAR_DSM_R3:1037 case WCD939X_DIGITAL_CDC_EAR_DSM_R4:1038 case WCD939X_DIGITAL_CDC_EAR_DSM_R5:1039 case WCD939X_DIGITAL_CDC_EAR_DSM_R6:1040 case WCD939X_DIGITAL_CDC_EAR_DSM_R7:1041 case WCD939X_DIGITAL_CDC_HPH_GAIN_RX_0:1042 case WCD939X_DIGITAL_CDC_HPH_GAIN_RX_1:1043 case WCD939X_DIGITAL_CDC_HPH_GAIN_DSD_0:1044 case WCD939X_DIGITAL_CDC_HPH_GAIN_DSD_1:1045 case WCD939X_DIGITAL_CDC_HPH_GAIN_DSD_2:1046 case WCD939X_DIGITAL_CDC_EAR_GAIN_DSD_0:1047 case WCD939X_DIGITAL_CDC_EAR_GAIN_DSD_1:1048 case WCD939X_DIGITAL_CDC_EAR_GAIN_DSD_2:1049 case WCD939X_DIGITAL_CDC_HPH_GAIN_CTL:1050 case WCD939X_DIGITAL_CDC_EAR_GAIN_CTL:1051 case WCD939X_DIGITAL_CDC_EAR_PATH_CTL:1052 case WCD939X_DIGITAL_CDC_SWR_CLH:1053 case WCD939X_DIGITAL_SWR_CLH_BYP:1054 case WCD939X_DIGITAL_CDC_TX0_CTL:1055 case WCD939X_DIGITAL_CDC_TX1_CTL:1056 case WCD939X_DIGITAL_CDC_TX2_CTL:1057 case WCD939X_DIGITAL_CDC_TX_RST:1058 case WCD939X_DIGITAL_CDC_REQ_CTL:1059 case WCD939X_DIGITAL_CDC_RST:1060 case WCD939X_DIGITAL_CDC_AMIC_CTL:1061 case WCD939X_DIGITAL_CDC_DMIC_CTL:1062 case WCD939X_DIGITAL_CDC_DMIC1_CTL:1063 case WCD939X_DIGITAL_CDC_DMIC2_CTL:1064 case WCD939X_DIGITAL_CDC_DMIC3_CTL:1065 case WCD939X_DIGITAL_CDC_DMIC4_CTL:1066 case WCD939X_DIGITAL_EFUSE_PRG_CTL:1067 case WCD939X_DIGITAL_EFUSE_CTL:1068 case WCD939X_DIGITAL_CDC_DMIC_RATE_1_2:1069 case WCD939X_DIGITAL_CDC_DMIC_RATE_3_4:1070 case WCD939X_DIGITAL_PDM_WD_CTL0:1071 case WCD939X_DIGITAL_PDM_WD_CTL1:1072 case WCD939X_DIGITAL_PDM_WD_CTL2:1073 case WCD939X_DIGITAL_INTR_MODE:1074 case WCD939X_DIGITAL_INTR_MASK_0:1075 case WCD939X_DIGITAL_INTR_MASK_1:1076 case WCD939X_DIGITAL_INTR_MASK_2:1077 case WCD939X_DIGITAL_INTR_CLEAR_0:1078 case WCD939X_DIGITAL_INTR_CLEAR_1:1079 case WCD939X_DIGITAL_INTR_CLEAR_2:1080 case WCD939X_DIGITAL_INTR_LEVEL_0:1081 case WCD939X_DIGITAL_INTR_LEVEL_1:1082 case WCD939X_DIGITAL_INTR_LEVEL_2:1083 case WCD939X_DIGITAL_INTR_SET_0:1084 case WCD939X_DIGITAL_INTR_SET_1:1085 case WCD939X_DIGITAL_INTR_SET_2:1086 case WCD939X_DIGITAL_INTR_TEST_0:1087 case WCD939X_DIGITAL_INTR_TEST_1:1088 case WCD939X_DIGITAL_INTR_TEST_2:1089 case WCD939X_DIGITAL_TX_MODE_DBG_EN:1090 case WCD939X_DIGITAL_TX_MODE_DBG_0_1:1091 case WCD939X_DIGITAL_TX_MODE_DBG_2_3:1092 case WCD939X_DIGITAL_LB_IN_SEL_CTL:1093 case WCD939X_DIGITAL_LOOP_BACK_MODE:1094 case WCD939X_DIGITAL_SWR_DAC_TEST:1095 case WCD939X_DIGITAL_SWR_HM_TEST_RX_0:1096 case WCD939X_DIGITAL_SWR_HM_TEST_TX_0:1097 case WCD939X_DIGITAL_SWR_HM_TEST_RX_1:1098 case WCD939X_DIGITAL_SWR_HM_TEST_TX_1:1099 case WCD939X_DIGITAL_SWR_HM_TEST_TX_2:1100 case WCD939X_DIGITAL_PAD_CTL_SWR_0:1101 case WCD939X_DIGITAL_PAD_CTL_SWR_1:1102 case WCD939X_DIGITAL_I2C_CTL:1103 case WCD939X_DIGITAL_CDC_TX_TANGGU_SW_MODE:1104 case WCD939X_DIGITAL_EFUSE_TEST_CTL_0:1105 case WCD939X_DIGITAL_EFUSE_TEST_CTL_1:1106 case WCD939X_DIGITAL_PAD_CTL_PDM_RX0:1107 case WCD939X_DIGITAL_PAD_CTL_PDM_RX1:1108 case WCD939X_DIGITAL_PAD_CTL_PDM_TX0:1109 case WCD939X_DIGITAL_PAD_CTL_PDM_TX1:1110 case WCD939X_DIGITAL_PAD_CTL_PDM_TX2:1111 case WCD939X_DIGITAL_PAD_INP_DIS_0:1112 case WCD939X_DIGITAL_PAD_INP_DIS_1:1113 case WCD939X_DIGITAL_DRIVE_STRENGTH_0:1114 case WCD939X_DIGITAL_DRIVE_STRENGTH_1:1115 case WCD939X_DIGITAL_DRIVE_STRENGTH_2:1116 case WCD939X_DIGITAL_RX_DATA_EDGE_CTL:1117 case WCD939X_DIGITAL_TX_DATA_EDGE_CTL:1118 case WCD939X_DIGITAL_GPIO_MODE:1119 case WCD939X_DIGITAL_PIN_CTL_OE:1120 case WCD939X_DIGITAL_PIN_CTL_DATA_0:1121 case WCD939X_DIGITAL_PIN_CTL_DATA_1:1122 case WCD939X_DIGITAL_DIG_DEBUG_CTL:1123 case WCD939X_DIGITAL_DIG_DEBUG_EN:1124 case WCD939X_DIGITAL_ANA_CSR_DBG_ADD:1125 case WCD939X_DIGITAL_ANA_CSR_DBG_CTL:1126 case WCD939X_DIGITAL_SSP_DBG:1127 case WCD939X_DIGITAL_SPARE_0:1128 case WCD939X_DIGITAL_SPARE_1:1129 case WCD939X_DIGITAL_SPARE_2:1130 case WCD939X_DIGITAL_TX_REQ_FB_CTL_0:1131 case WCD939X_DIGITAL_TX_REQ_FB_CTL_1:1132 case WCD939X_DIGITAL_TX_REQ_FB_CTL_2:1133 case WCD939X_DIGITAL_TX_REQ_FB_CTL_3:1134 case WCD939X_DIGITAL_TX_REQ_FB_CTL_4:1135 case WCD939X_DIGITAL_DEM_BYPASS_DATA0:1136 case WCD939X_DIGITAL_DEM_BYPASS_DATA1:1137 case WCD939X_DIGITAL_DEM_BYPASS_DATA2:1138 case WCD939X_DIGITAL_DEM_BYPASS_DATA3:1139 case WCD939X_DIGITAL_DEM_SECOND_ORDER:1140 case WCD939X_DIGITAL_DSM_CTRL:1141 case WCD939X_DIGITAL_DSM_0_STATIC_DATA_0:1142 case WCD939X_DIGITAL_DSM_0_STATIC_DATA_1:1143 case WCD939X_DIGITAL_DSM_0_STATIC_DATA_2:1144 case WCD939X_DIGITAL_DSM_0_STATIC_DATA_3:1145 case WCD939X_DIGITAL_DSM_1_STATIC_DATA_0:1146 case WCD939X_DIGITAL_DSM_1_STATIC_DATA_1:1147 case WCD939X_DIGITAL_DSM_1_STATIC_DATA_2:1148 case WCD939X_DIGITAL_DSM_1_STATIC_DATA_3:1149 case WCD939X_RX_TOP_PAGE:1150 case WCD939X_RX_TOP_TOP_CFG0:1151 case WCD939X_RX_TOP_HPHL_COMP_WR_LSB:1152 case WCD939X_RX_TOP_HPHL_COMP_WR_MSB:1153 case WCD939X_RX_TOP_HPHL_COMP_LUT:1154 case WCD939X_RX_TOP_HPHR_COMP_WR_LSB:1155 case WCD939X_RX_TOP_HPHR_COMP_WR_MSB:1156 case WCD939X_RX_TOP_HPHR_COMP_LUT:1157 case WCD939X_RX_TOP_DSD0_DEBUG_CFG1:1158 case WCD939X_RX_TOP_DSD0_DEBUG_CFG2:1159 case WCD939X_RX_TOP_DSD0_DEBUG_CFG3:1160 case WCD939X_RX_TOP_DSD0_DEBUG_CFG4:1161 case WCD939X_RX_TOP_DSD1_DEBUG_CFG1:1162 case WCD939X_RX_TOP_DSD1_DEBUG_CFG2:1163 case WCD939X_RX_TOP_DSD1_DEBUG_CFG3:1164 case WCD939X_RX_TOP_DSD1_DEBUG_CFG4:1165 case WCD939X_RX_TOP_HPHL_PATH_CFG0:1166 case WCD939X_RX_TOP_HPHL_PATH_CFG1:1167 case WCD939X_RX_TOP_HPHR_PATH_CFG0:1168 case WCD939X_RX_TOP_HPHR_PATH_CFG1:1169 case WCD939X_RX_TOP_PATH_CFG2:1170 case WCD939X_RX_TOP_HPHL_PATH_SEC0:1171 case WCD939X_RX_TOP_HPHL_PATH_SEC1:1172 case WCD939X_RX_TOP_HPHL_PATH_SEC2:1173 case WCD939X_RX_TOP_HPHL_PATH_SEC3:1174 case WCD939X_RX_TOP_HPHR_PATH_SEC0:1175 case WCD939X_RX_TOP_HPHR_PATH_SEC1:1176 case WCD939X_RX_TOP_HPHR_PATH_SEC2:1177 case WCD939X_RX_TOP_HPHR_PATH_SEC3:1178 case WCD939X_RX_TOP_PATH_SEC4:1179 case WCD939X_RX_TOP_PATH_SEC5:1180 case WCD939X_COMPANDER_HPHL_CTL0:1181 case WCD939X_COMPANDER_HPHL_CTL1:1182 case WCD939X_COMPANDER_HPHL_CTL2:1183 case WCD939X_COMPANDER_HPHL_CTL3:1184 case WCD939X_COMPANDER_HPHL_CTL4:1185 case WCD939X_COMPANDER_HPHL_CTL5:1186 case WCD939X_COMPANDER_HPHL_CTL7:1187 case WCD939X_COMPANDER_HPHL_CTL8:1188 case WCD939X_COMPANDER_HPHL_CTL9:1189 case WCD939X_COMPANDER_HPHL_CTL10:1190 case WCD939X_COMPANDER_HPHL_CTL11:1191 case WCD939X_COMPANDER_HPHL_CTL12:1192 case WCD939X_COMPANDER_HPHL_CTL13:1193 case WCD939X_COMPANDER_HPHL_CTL14:1194 case WCD939X_COMPANDER_HPHL_CTL15:1195 case WCD939X_COMPANDER_HPHL_CTL16:1196 case WCD939X_COMPANDER_HPHL_CTL17:1197 case WCD939X_COMPANDER_HPHL_CTL18:1198 case WCD939X_COMPANDER_HPHL_CTL19:1199 case WCD939X_R_CTL0:1200 case WCD939X_R_CTL1:1201 case WCD939X_R_CTL2:1202 case WCD939X_R_CTL3:1203 case WCD939X_R_CTL4:1204 case WCD939X_R_CTL5:1205 case WCD939X_R_CTL7:1206 case WCD939X_R_CTL8:1207 case WCD939X_R_CTL9:1208 case WCD939X_R_CTL10:1209 case WCD939X_R_CTL11:1210 case WCD939X_R_CTL12:1211 case WCD939X_R_CTL13:1212 case WCD939X_R_CTL14:1213 case WCD939X_R_CTL15:1214 case WCD939X_R_CTL16:1215 case WCD939X_R_CTL17:1216 case WCD939X_R_CTL18:1217 case WCD939X_R_CTL19:1218 case WCD939X_E_PATH_CTL:1219 case WCD939X_E_CFG0:1220 case WCD939X_E_CFG1:1221 case WCD939X_E_CFG2:1222 case WCD939X_E_CFG3:1223 case WCD939X_DSD_HPHL_PATH_CTL:1224 case WCD939X_DSD_HPHL_CFG0:1225 case WCD939X_DSD_HPHL_CFG1:1226 case WCD939X_DSD_HPHL_CFG2:1227 case WCD939X_DSD_HPHL_CFG3:1228 case WCD939X_DSD_HPHL_CFG4:1229 case WCD939X_DSD_HPHL_CFG5:1230 case WCD939X_DSD_HPHR_PATH_CTL:1231 case WCD939X_DSD_HPHR_CFG0:1232 case WCD939X_DSD_HPHR_CFG1:1233 case WCD939X_DSD_HPHR_CFG2:1234 case WCD939X_DSD_HPHR_CFG3:1235 case WCD939X_DSD_HPHR_CFG4:1236 case WCD939X_DSD_HPHR_CFG5:1237 return true;1238 }1239 1240 return false;1241}1242 1243static bool wcd939x_readable_register(struct device *dev, unsigned int reg)1244{1245 /* Read-Only Registers */1246 switch (reg) {1247 case WCD939X_ANA_MBHC_RESULT_1:1248 case WCD939X_ANA_MBHC_RESULT_2:1249 case WCD939X_ANA_MBHC_RESULT_3:1250 case WCD939X_MBHC_MOISTURE_DET_FSM_STATUS:1251 case WCD939X_TX_1_2_SAR2_ERR:1252 case WCD939X_TX_1_2_SAR1_ERR:1253 case WCD939X_TX_3_4_SAR4_ERR:1254 case WCD939X_TX_3_4_SAR3_ERR:1255 case WCD939X_HPH_L_STATUS:1256 case WCD939X_HPH_R_STATUS:1257 case WCD939X_HPH_SURGE_STATUS:1258 case WCD939X_EAR_STATUS_REG_1:1259 case WCD939X_EAR_STATUS_REG_2:1260 case WCD939X_MBHC_NEW_FSM_STATUS:1261 case WCD939X_MBHC_NEW_ADC_RESULT:1262 case WCD939X_DIE_CRACK_DET_OUT:1263 case WCD939X_DIGITAL_CHIP_ID0:1264 case WCD939X_DIGITAL_CHIP_ID1:1265 case WCD939X_DIGITAL_CHIP_ID2:1266 case WCD939X_DIGITAL_CHIP_ID3:1267 case WCD939X_DIGITAL_INTR_STATUS_0:1268 case WCD939X_DIGITAL_INTR_STATUS_1:1269 case WCD939X_DIGITAL_INTR_STATUS_2:1270 case WCD939X_DIGITAL_SWR_HM_TEST_0:1271 case WCD939X_DIGITAL_SWR_HM_TEST_1:1272 case WCD939X_DIGITAL_EFUSE_T_DATA_0:1273 case WCD939X_DIGITAL_EFUSE_T_DATA_1:1274 case WCD939X_DIGITAL_PIN_STATUS_0:1275 case WCD939X_DIGITAL_PIN_STATUS_1:1276 case WCD939X_DIGITAL_MODE_STATUS_0:1277 case WCD939X_DIGITAL_MODE_STATUS_1:1278 case WCD939X_DIGITAL_EFUSE_REG_0:1279 case WCD939X_DIGITAL_EFUSE_REG_1:1280 case WCD939X_DIGITAL_EFUSE_REG_2:1281 case WCD939X_DIGITAL_EFUSE_REG_3:1282 case WCD939X_DIGITAL_EFUSE_REG_4:1283 case WCD939X_DIGITAL_EFUSE_REG_5:1284 case WCD939X_DIGITAL_EFUSE_REG_6:1285 case WCD939X_DIGITAL_EFUSE_REG_7:1286 case WCD939X_DIGITAL_EFUSE_REG_8:1287 case WCD939X_DIGITAL_EFUSE_REG_9:1288 case WCD939X_DIGITAL_EFUSE_REG_10:1289 case WCD939X_DIGITAL_EFUSE_REG_11:1290 case WCD939X_DIGITAL_EFUSE_REG_12:1291 case WCD939X_DIGITAL_EFUSE_REG_13:1292 case WCD939X_DIGITAL_EFUSE_REG_14:1293 case WCD939X_DIGITAL_EFUSE_REG_15:1294 case WCD939X_DIGITAL_EFUSE_REG_16:1295 case WCD939X_DIGITAL_EFUSE_REG_17:1296 case WCD939X_DIGITAL_EFUSE_REG_18:1297 case WCD939X_DIGITAL_EFUSE_REG_19:1298 case WCD939X_DIGITAL_EFUSE_REG_20:1299 case WCD939X_DIGITAL_EFUSE_REG_21:1300 case WCD939X_DIGITAL_EFUSE_REG_22:1301 case WCD939X_DIGITAL_EFUSE_REG_23:1302 case WCD939X_DIGITAL_EFUSE_REG_24:1303 case WCD939X_DIGITAL_EFUSE_REG_25:1304 case WCD939X_DIGITAL_EFUSE_REG_26:1305 case WCD939X_DIGITAL_EFUSE_REG_27:1306 case WCD939X_DIGITAL_EFUSE_REG_28:1307 case WCD939X_DIGITAL_EFUSE_REG_29:1308 case WCD939X_DIGITAL_EFUSE_REG_30:1309 case WCD939X_DIGITAL_EFUSE_REG_31:1310 case WCD939X_RX_TOP_HPHL_COMP_RD_LSB:1311 case WCD939X_RX_TOP_HPHL_COMP_RD_MSB:1312 case WCD939X_RX_TOP_HPHR_COMP_RD_LSB:1313 case WCD939X_RX_TOP_HPHR_COMP_RD_MSB:1314 case WCD939X_RX_TOP_DSD0_DEBUG_CFG5:1315 case WCD939X_RX_TOP_DSD0_DEBUG_CFG6:1316 case WCD939X_RX_TOP_DSD1_DEBUG_CFG5:1317 case WCD939X_RX_TOP_DSD1_DEBUG_CFG6:1318 case WCD939X_COMPANDER_HPHL_CTL6:1319 case WCD939X_R_CTL6:1320 return true;1321 }1322 1323 return wcd939x_rdwr_register(dev, reg);1324}1325 1326static bool wcd939x_volatile_register(struct device *dev, unsigned int reg)1327{1328 switch (reg) {1329 case WCD939X_ANA_MBHC_RESULT_1:1330 case WCD939X_ANA_MBHC_RESULT_2:1331 case WCD939X_ANA_MBHC_RESULT_3:1332 case WCD939X_MBHC_MOISTURE_DET_FSM_STATUS:1333 case WCD939X_TX_1_2_SAR2_ERR:1334 case WCD939X_TX_1_2_SAR1_ERR:1335 case WCD939X_TX_3_4_SAR4_ERR:1336 case WCD939X_TX_3_4_SAR3_ERR:1337 case WCD939X_HPH_L_STATUS:1338 case WCD939X_HPH_R_STATUS:1339 case WCD939X_HPH_SURGE_STATUS:1340 case WCD939X_EAR_STATUS_REG_1:1341 case WCD939X_EAR_STATUS_REG_2:1342 case WCD939X_MBHC_NEW_FSM_STATUS:1343 case WCD939X_MBHC_NEW_ADC_RESULT:1344 case WCD939X_DIE_CRACK_DET_OUT:1345 case WCD939X_DIGITAL_INTR_STATUS_0:1346 case WCD939X_DIGITAL_INTR_STATUS_1:1347 case WCD939X_DIGITAL_INTR_STATUS_2:1348 case WCD939X_DIGITAL_SWR_HM_TEST_0:1349 case WCD939X_DIGITAL_SWR_HM_TEST_1:1350 case WCD939X_DIGITAL_PIN_STATUS_0:1351 case WCD939X_DIGITAL_PIN_STATUS_1:1352 case WCD939X_DIGITAL_MODE_STATUS_0:1353 case WCD939X_DIGITAL_MODE_STATUS_1:1354 case WCD939X_RX_TOP_HPHL_COMP_RD_LSB:1355 case WCD939X_RX_TOP_HPHL_COMP_RD_MSB:1356 case WCD939X_RX_TOP_HPHR_COMP_RD_LSB:1357 case WCD939X_RX_TOP_HPHR_COMP_RD_MSB:1358 case WCD939X_RX_TOP_DSD0_DEBUG_CFG5:1359 case WCD939X_RX_TOP_DSD0_DEBUG_CFG6:1360 case WCD939X_RX_TOP_DSD1_DEBUG_CFG5:1361 case WCD939X_RX_TOP_DSD1_DEBUG_CFG6:1362 case WCD939X_COMPANDER_HPHL_CTL6:1363 case WCD939X_R_CTL6:1364 return true;1365 }1366 return false;1367}1368 1369static bool wcd939x_writeable_register(struct device *dev, unsigned int reg)1370{1371 return wcd939x_rdwr_register(dev, reg);1372}1373 1374static const struct regmap_config wcd939x_regmap_config = {1375 .name = "wcd939x_csr",1376 .reg_bits = 32,1377 .val_bits = 8,1378 .cache_type = REGCACHE_MAPLE,1379 .reg_defaults = wcd939x_defaults,1380 .num_reg_defaults = ARRAY_SIZE(wcd939x_defaults),1381 .max_register = WCD939X_MAX_REGISTER,1382 .readable_reg = wcd939x_readable_register,1383 .writeable_reg = wcd939x_writeable_register,1384 .volatile_reg = wcd939x_volatile_register,1385};1386 1387static const struct sdw_slave_ops wcd9390_slave_ops = {1388 .update_status = wcd9390_update_status,1389 .interrupt_callback = wcd9390_interrupt_callback,1390 .bus_config = wcd9390_bus_config,1391};1392 1393static int wcd939x_sdw_component_bind(struct device *dev, struct device *master,1394 void *data)1395{1396 pm_runtime_set_autosuspend_delay(dev, 3000);1397 pm_runtime_use_autosuspend(dev);1398 pm_runtime_mark_last_busy(dev);1399 pm_runtime_set_active(dev);1400 pm_runtime_enable(dev);1401 1402 return 0;1403}1404 1405static void wcd939x_sdw_component_unbind(struct device *dev,1406 struct device *master, void *data)1407{1408 pm_runtime_disable(dev);1409 pm_runtime_set_suspended(dev);1410 pm_runtime_dont_use_autosuspend(dev);1411}1412 1413static const struct component_ops wcd939x_sdw_component_ops = {1414 .bind = wcd939x_sdw_component_bind,1415 .unbind = wcd939x_sdw_component_unbind,1416};1417 1418static int wcd9390_probe(struct sdw_slave *pdev, const struct sdw_device_id *id)1419{1420 struct device *dev = &pdev->dev;1421 struct wcd939x_sdw_priv *wcd;1422 int ret;1423 1424 wcd = devm_kzalloc(dev, sizeof(*wcd), GFP_KERNEL);1425 if (!wcd)1426 return -ENOMEM;1427 1428 /*1429 * Port map index starts with 0, however the data port for this codec1430 * are from index 11431 */1432 if (of_property_read_bool(dev->of_node, "qcom,tx-port-mapping")) {1433 wcd->is_tx = true;1434 ret = of_property_read_u32_array(dev->of_node,1435 "qcom,tx-port-mapping",1436 &pdev->m_port_map[1],1437 WCD939X_MAX_TX_SWR_PORTS);1438 } else {1439 ret = of_property_read_u32_array(dev->of_node,1440 "qcom,rx-port-mapping",1441 &pdev->m_port_map[1],1442 WCD939X_MAX_RX_SWR_PORTS);1443 }1444 1445 if (ret < 0)1446 dev_info(dev, "Static Port mapping not specified\n");1447 1448 wcd->sdev = pdev;1449 dev_set_drvdata(dev, wcd);1450 1451 pdev->prop.scp_int1_mask = SDW_SCP_INT1_IMPL_DEF |1452 SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;1453 pdev->prop.lane_control_support = true;1454 pdev->prop.simple_clk_stop_capable = true;1455 if (wcd->is_tx) {1456 pdev->prop.source_ports = GENMASK(WCD939X_MAX_TX_SWR_PORTS - 1, 0);1457 pdev->prop.src_dpn_prop = wcd939x_tx_dpn_prop;1458 wcd->ch_info = &wcd939x_sdw_tx_ch_info[0];1459 pdev->prop.wake_capable = true;1460 } else {1461 pdev->prop.sink_ports = GENMASK(WCD939X_MAX_RX_SWR_PORTS - 1, 0);1462 pdev->prop.sink_dpn_prop = wcd939x_rx_dpn_prop;1463 wcd->ch_info = &wcd939x_sdw_rx_ch_info[0];1464 }1465 1466 if (wcd->is_tx) {1467 /*1468 * Do not use devres here since devres_release_group() could1469 * be called by component_unbind() id the aggregate device1470 * fails to bind.1471 */1472 wcd->regmap = regmap_init_sdw(pdev, &wcd939x_regmap_config);1473 if (IS_ERR(wcd->regmap))1474 return dev_err_probe(dev, PTR_ERR(wcd->regmap),1475 "Regmap init failed\n");1476 1477 /* Start in cache-only until device is enumerated */1478 regcache_cache_only(wcd->regmap, true);1479 }1480 1481 ret = component_add(dev, &wcd939x_sdw_component_ops);1482 if (ret)1483 return ret;1484 1485 /* Set suspended until aggregate device is bind */1486 pm_runtime_set_suspended(dev);1487 1488 return 0;1489}1490 1491static int wcd9390_remove(struct sdw_slave *pdev)1492{1493 struct device *dev = &pdev->dev;1494 struct wcd939x_sdw_priv *wcd = dev_get_drvdata(dev);1495 1496 component_del(dev, &wcd939x_sdw_component_ops);1497 1498 if (wcd->regmap)1499 regmap_exit(wcd->regmap);1500 1501 return 0;1502}1503 1504static const struct sdw_device_id wcd9390_slave_id[] = {1505 SDW_SLAVE_ENTRY(0x0217, 0x10e, 0), /* WCD9390 & WCD9390 RX/TX Device ID */1506 {},1507};1508MODULE_DEVICE_TABLE(sdw, wcd9390_slave_id);1509 1510static int __maybe_unused wcd939x_sdw_runtime_suspend(struct device *dev)1511{1512 struct wcd939x_sdw_priv *wcd = dev_get_drvdata(dev);1513 1514 if (wcd->regmap) {1515 regcache_cache_only(wcd->regmap, true);1516 regcache_mark_dirty(wcd->regmap);1517 }1518 1519 return 0;1520}1521 1522static int __maybe_unused wcd939x_sdw_runtime_resume(struct device *dev)1523{1524 struct wcd939x_sdw_priv *wcd = dev_get_drvdata(dev);1525 1526 if (wcd->regmap) {1527 regcache_cache_only(wcd->regmap, false);1528 regcache_sync(wcd->regmap);1529 }1530 1531 return 0;1532}1533 1534static const struct dev_pm_ops wcd939x_sdw_pm_ops = {1535 SET_RUNTIME_PM_OPS(wcd939x_sdw_runtime_suspend, wcd939x_sdw_runtime_resume, NULL)1536};1537 1538static struct sdw_driver wcd9390_codec_driver = {1539 .probe = wcd9390_probe,1540 .remove = wcd9390_remove,1541 .ops = &wcd9390_slave_ops,1542 .id_table = wcd9390_slave_id,1543 .driver = {1544 .name = "wcd9390-codec",1545 .pm = &wcd939x_sdw_pm_ops,1546 }1547};1548module_sdw_driver(wcd9390_codec_driver);1549 1550MODULE_DESCRIPTION("WCD939X SDW codec driver");1551MODULE_LICENSE("GPL");1552