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(&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	else
173		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 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(&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 codec
1430	 * are from index 1
1431	 */
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, 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(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