1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2023, Linaro Limited
4 */
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 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 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(bus: &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(p: params);
170 if (wcd->is_tx)
171 wcd->sconfig.direction = SDW_DATA_DIR_TX;
172 else
173 wcd->sconfig.direction = SDW_DATA_DIR_RX;
174
175 wcd->sconfig.type = SDW_STREAM_PCM;
176
177 return sdw_stream_add_slave(slave: wcd->sdev, stream_config: &wcd->sconfig, port_config: &port_config[0],
178 num_ports: wcd->active_ports, stream: 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(slave: wcd->sdev, stream: 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(error: -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(dev: &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(map: wcd->regmap, enable: false);
219 return regcache_sync(map: 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 value: 0x01);
230
231 return 0;
232}
233
234/*
235 * Handle Soundwire out-of-band interrupt event by triggering
236 * the first irq of the slave_irq irq domain, which then will
237 * 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(dev: &slave->dev);
244 struct irq_domain *slave_irq = wcd->slave_irq;
245 u32 sts1, sts2, sts3;
246
247 do {
248 handle_nested_irq(irq: irq_find_mapping(domain: slave_irq, hwirq: 0));
249 regmap_read(map: wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_0, val: &sts1);
250 regmap_read(map: wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_1, val: &sts2);
251 regmap_read(map: wcd->regmap, WCD939X_DIGITAL_INTR_STATUS_2, val: &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, delay: 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, size: 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 codec
1430 * are from index 1
1431 */
1432 if (of_property_read_bool(np: dev->of_node, propname: "qcom,tx-port-mapping")) {
1433 wcd->is_tx = true;
1434 ret = of_property_read_u32_array(np: dev->of_node,
1435 propname: "qcom,tx-port-mapping",
1436 out_values: &pdev->m_port_map[1],
1437 WCD939X_MAX_TX_SWR_PORTS);
1438 } else {
1439 ret = of_property_read_u32_array(np: dev->of_node,
1440 propname: "qcom,rx-port-mapping",
1441 out_values: &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, data: 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, 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, 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() could
1469 * be called by component_unbind() id the aggregate device
1470 * fails to bind.
1471 */
1472 wcd->regmap = regmap_init_sdw(pdev, &wcd939x_regmap_config);
1473 if (IS_ERR(ptr: wcd->regmap))
1474 return dev_err_probe(dev, err: PTR_ERR(ptr: wcd->regmap),
1475 fmt: "Regmap init failed\n");
1476
1477 /* Start in cache-only until device is enumerated */
1478 regcache_cache_only(map: wcd->regmap, enable: 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(map: 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(map: wcd->regmap, enable: true);
1516 regcache_mark_dirty(map: 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(map: wcd->regmap, enable: false);
1528 regcache_sync(map: 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

source code of linux/sound/soc/codecs/wcd939x-sdw.c