xref: /openbmc/linux/sound/soc/codecs/cs43130.c (revision 7211ec63)
1 /*
2  * cs43130.c  --  CS43130 ALSA Soc Audio driver
3  *
4  * Copyright 2017 Cirrus Logic, Inc.
5  *
6  * Authors: Li Xu <li.xu@cirrus.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/delay.h>
17 #include <linux/gpio.h>
18 #include <linux/gpio/consumer.h>
19 #include <linux/platform_device.h>
20 #include <linux/pm.h>
21 #include <linux/i2c.h>
22 #include <linux/of_device.h>
23 #include <linux/regmap.h>
24 #include <linux/slab.h>
25 #include <sound/core.h>
26 #include <sound/pcm.h>
27 #include <sound/pcm_params.h>
28 #include <sound/soc.h>
29 #include <sound/soc-dapm.h>
30 #include <sound/initval.h>
31 #include <sound/tlv.h>
32 #include <linux/of_gpio.h>
33 #include <linux/regulator/consumer.h>
34 #include <linux/pm_runtime.h>
35 #include <linux/of_irq.h>
36 #include <linux/completion.h>
37 #include <linux/mutex.h>
38 #include <linux/workqueue.h>
39 #include <sound/jack.h>
40 
41 #include "cs43130.h"
42 
43 static const struct reg_default cs43130_reg_defaults[] = {
44 	{CS43130_SYS_CLK_CTL_1, 0x06},
45 	{CS43130_SP_SRATE, 0x01},
46 	{CS43130_SP_BITSIZE, 0x05},
47 	{CS43130_PAD_INT_CFG, 0x03},
48 	{CS43130_PWDN_CTL, 0xFE},
49 	{CS43130_CRYSTAL_SET, 0x04},
50 	{CS43130_PLL_SET_1, 0x00},
51 	{CS43130_PLL_SET_2, 0x00},
52 	{CS43130_PLL_SET_3, 0x00},
53 	{CS43130_PLL_SET_4, 0x00},
54 	{CS43130_PLL_SET_5, 0x40},
55 	{CS43130_PLL_SET_6, 0x10},
56 	{CS43130_PLL_SET_7, 0x80},
57 	{CS43130_PLL_SET_8, 0x03},
58 	{CS43130_PLL_SET_9, 0x02},
59 	{CS43130_PLL_SET_10, 0x02},
60 	{CS43130_CLKOUT_CTL, 0x00},
61 	{CS43130_ASP_NUM_1, 0x01},
62 	{CS43130_ASP_NUM_2, 0x00},
63 	{CS43130_ASP_DEN_1, 0x08},
64 	{CS43130_ASP_DEN_2, 0x00},
65 	{CS43130_ASP_LRCK_HI_TIME_1, 0x1F},
66 	{CS43130_ASP_LRCK_HI_TIME_2, 0x00},
67 	{CS43130_ASP_LRCK_PERIOD_1, 0x3F},
68 	{CS43130_ASP_LRCK_PERIOD_2, 0x00},
69 	{CS43130_ASP_CLOCK_CONF, 0x0C},
70 	{CS43130_ASP_FRAME_CONF, 0x0A},
71 	{CS43130_XSP_NUM_1, 0x01},
72 	{CS43130_XSP_NUM_2, 0x00},
73 	{CS43130_XSP_DEN_1, 0x02},
74 	{CS43130_XSP_DEN_2, 0x00},
75 	{CS43130_XSP_LRCK_HI_TIME_1, 0x1F},
76 	{CS43130_XSP_LRCK_HI_TIME_2, 0x00},
77 	{CS43130_XSP_LRCK_PERIOD_1, 0x3F},
78 	{CS43130_XSP_LRCK_PERIOD_2, 0x00},
79 	{CS43130_XSP_CLOCK_CONF, 0x0C},
80 	{CS43130_XSP_FRAME_CONF, 0x0A},
81 	{CS43130_ASP_CH_1_LOC, 0x00},
82 	{CS43130_ASP_CH_2_LOC, 0x00},
83 	{CS43130_ASP_CH_1_SZ_EN, 0x06},
84 	{CS43130_ASP_CH_2_SZ_EN, 0x0E},
85 	{CS43130_XSP_CH_1_LOC, 0x00},
86 	{CS43130_XSP_CH_2_LOC, 0x00},
87 	{CS43130_XSP_CH_1_SZ_EN, 0x06},
88 	{CS43130_XSP_CH_2_SZ_EN, 0x0E},
89 	{CS43130_DSD_VOL_B, 0x78},
90 	{CS43130_DSD_VOL_A, 0x78},
91 	{CS43130_DSD_PATH_CTL_1, 0xA8},
92 	{CS43130_DSD_INT_CFG, 0x00},
93 	{CS43130_DSD_PATH_CTL_2, 0x02},
94 	{CS43130_DSD_PCM_MIX_CTL, 0x00},
95 	{CS43130_DSD_PATH_CTL_3, 0x40},
96 	{CS43130_HP_OUT_CTL_1, 0x30},
97 	{CS43130_PCM_FILT_OPT, 0x02},
98 	{CS43130_PCM_VOL_B, 0x78},
99 	{CS43130_PCM_VOL_A, 0x78},
100 	{CS43130_PCM_PATH_CTL_1, 0xA8},
101 	{CS43130_PCM_PATH_CTL_2, 0x00},
102 	{CS43130_CLASS_H_CTL, 0x1E},
103 	{CS43130_HP_DETECT, 0x04},
104 	{CS43130_HP_LOAD_1, 0x00},
105 	{CS43130_HP_MEAS_LOAD_1, 0x00},
106 	{CS43130_HP_MEAS_LOAD_2, 0x00},
107 	{CS43130_INT_MASK_1, 0xFF},
108 	{CS43130_INT_MASK_2, 0xFF},
109 	{CS43130_INT_MASK_3, 0xFF},
110 	{CS43130_INT_MASK_4, 0xFF},
111 	{CS43130_INT_MASK_5, 0xFF},
112 };
113 
114 static bool cs43130_volatile_register(struct device *dev, unsigned int reg)
115 {
116 	switch (reg) {
117 	case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
118 	case CS43130_HP_DC_STAT_1 ... CS43130_HP_DC_STAT_2:
119 	case CS43130_HP_AC_STAT_1 ... CS43130_HP_AC_STAT_2:
120 		return true;
121 	default:
122 		return false;
123 	}
124 }
125 
126 static bool cs43130_readable_register(struct device *dev, unsigned int reg)
127 {
128 	switch (reg) {
129 	case CS43130_DEVID_AB ... CS43130_SYS_CLK_CTL_1:
130 	case CS43130_SP_SRATE ... CS43130_PAD_INT_CFG:
131 	case CS43130_PWDN_CTL:
132 	case CS43130_CRYSTAL_SET:
133 	case CS43130_PLL_SET_1 ... CS43130_PLL_SET_5:
134 	case CS43130_PLL_SET_6:
135 	case CS43130_PLL_SET_7:
136 	case CS43130_PLL_SET_8:
137 	case CS43130_PLL_SET_9:
138 	case CS43130_PLL_SET_10:
139 	case CS43130_CLKOUT_CTL:
140 	case CS43130_ASP_NUM_1 ... CS43130_ASP_FRAME_CONF:
141 	case CS43130_XSP_NUM_1 ... CS43130_XSP_FRAME_CONF:
142 	case CS43130_ASP_CH_1_LOC:
143 	case CS43130_ASP_CH_2_LOC:
144 	case CS43130_ASP_CH_1_SZ_EN:
145 	case CS43130_ASP_CH_2_SZ_EN:
146 	case CS43130_XSP_CH_1_LOC:
147 	case CS43130_XSP_CH_2_LOC:
148 	case CS43130_XSP_CH_1_SZ_EN:
149 	case CS43130_XSP_CH_2_SZ_EN:
150 	case CS43130_DSD_VOL_B ... CS43130_DSD_PATH_CTL_3:
151 	case CS43130_HP_OUT_CTL_1:
152 	case CS43130_PCM_FILT_OPT ... CS43130_PCM_PATH_CTL_2:
153 	case CS43130_CLASS_H_CTL:
154 	case CS43130_HP_DETECT:
155 	case CS43130_HP_STATUS:
156 	case CS43130_HP_LOAD_1:
157 	case CS43130_HP_MEAS_LOAD_1:
158 	case CS43130_HP_MEAS_LOAD_2:
159 	case CS43130_HP_DC_STAT_1:
160 	case CS43130_HP_DC_STAT_2:
161 	case CS43130_HP_AC_STAT_1:
162 	case CS43130_HP_AC_STAT_2:
163 	case CS43130_HP_LOAD_STAT:
164 	case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
165 	case CS43130_INT_MASK_1 ... CS43130_INT_MASK_5:
166 		return true;
167 	default:
168 		return false;
169 	}
170 }
171 
172 static bool cs43130_precious_register(struct device *dev, unsigned int reg)
173 {
174 	switch (reg) {
175 	case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
176 		return true;
177 	default:
178 		return false;
179 	}
180 }
181 
182 struct cs43130_pll_params {
183 	unsigned int pll_in;
184 	u8 sclk_prediv;
185 	u8 pll_div_int;
186 	u32 pll_div_frac;
187 	u8 pll_mode;
188 	u8 pll_divout;
189 	unsigned int pll_out;
190 	u8 pll_cal_ratio;
191 };
192 
193 static const struct cs43130_pll_params pll_ratio_table[] = {
194 	{9600000, 0x02, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
195 	{9600000, 0x02, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
196 
197 	{11289600, 0x02, 0X40, 0, 0x01, 0x08, 22579200, 128},
198 	{11289600, 0x02, 0x44, 0x06F700, 0x0, 0x08, 24576000, 139},
199 
200 	{12000000, 0x02, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
201 	{12000000, 0x02, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
202 
203 	{12288000, 0x02, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
204 	{12288000, 0x02, 0x40, 0x000000, 0x01, 0x08, 24576000, 128},
205 
206 	{13000000, 0x02, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
207 	{13000000, 0x02, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
208 
209 	{19200000, 0x03, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
210 	{19200000, 0x03, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
211 
212 	{22579200, 0, 0, 0, 0, 0, 22579200, 0},
213 	{22579200, 0x03, 0x44, 0x06F700, 0x00, 0x08, 24576000, 139},
214 
215 	{24000000, 0x03, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
216 	{24000000, 0x03, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
217 
218 	{24576000, 0x03, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
219 	{24576000, 0, 0, 0, 0, 0, 24576000, 0},
220 
221 	{26000000, 0x03, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
222 	{26000000, 0x03, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
223 };
224 
225 static const struct cs43130_pll_params *cs43130_get_pll_table(
226 		unsigned int freq_in, unsigned int freq_out)
227 {
228 	int i;
229 
230 	for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
231 		if (pll_ratio_table[i].pll_in == freq_in &&
232 		    pll_ratio_table[i].pll_out == freq_out)
233 			return &pll_ratio_table[i];
234 	}
235 
236 	return NULL;
237 }
238 
239 static int cs43130_pll_config(struct snd_soc_codec *codec)
240 {
241 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
242 	const struct cs43130_pll_params *pll_entry;
243 
244 	dev_dbg(codec->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n",
245 		cs43130->mclk, cs43130->mclk_int);
246 
247 	pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int);
248 	if (!pll_entry)
249 		return -EINVAL;
250 
251 	if (pll_entry->pll_cal_ratio == 0) {
252 		regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
253 				   CS43130_PLL_START_MASK, 0);
254 
255 		cs43130->pll_bypass = true;
256 		return 0;
257 	}
258 
259 	cs43130->pll_bypass = false;
260 
261 	regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_2,
262 			   CS43130_PLL_DIV_DATA_MASK,
263 			   pll_entry->pll_div_frac >>
264 			   CS43130_PLL_DIV_FRAC_0_DATA_SHIFT);
265 	regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_3,
266 			   CS43130_PLL_DIV_DATA_MASK,
267 			   pll_entry->pll_div_frac >>
268 			   CS43130_PLL_DIV_FRAC_1_DATA_SHIFT);
269 	regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_4,
270 			   CS43130_PLL_DIV_DATA_MASK,
271 			   pll_entry->pll_div_frac >>
272 			   CS43130_PLL_DIV_FRAC_2_DATA_SHIFT);
273 	regmap_write(cs43130->regmap, CS43130_PLL_SET_5,
274 		     pll_entry->pll_div_int);
275 	regmap_write(cs43130->regmap, CS43130_PLL_SET_6, pll_entry->pll_divout);
276 	regmap_write(cs43130->regmap, CS43130_PLL_SET_7,
277 		     pll_entry->pll_cal_ratio);
278 	regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_8,
279 			   CS43130_PLL_MODE_MASK,
280 			   pll_entry->pll_mode << CS43130_PLL_MODE_SHIFT);
281 	regmap_write(cs43130->regmap, CS43130_PLL_SET_9,
282 		     pll_entry->sclk_prediv);
283 	regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
284 			   CS43130_PLL_START_MASK, 1);
285 
286 	return 0;
287 }
288 
289 static int cs43130_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
290 			   unsigned int freq_in, unsigned int freq_out)
291 {
292 	int ret = 0;
293 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
294 
295 	switch (freq_in) {
296 	case 9600000:
297 	case 11289600:
298 	case 12000000:
299 	case 12288000:
300 	case 13000000:
301 	case 19200000:
302 	case 22579200:
303 	case 24000000:
304 	case 24576000:
305 	case 26000000:
306 		cs43130->mclk = freq_in;
307 		break;
308 	default:
309 		dev_err(codec->dev,
310 			"unsupported pll input reference clock:%d\n", freq_in);
311 		return -EINVAL;
312 	}
313 
314 	switch (freq_out) {
315 	case 22579200:
316 		cs43130->mclk_int = freq_out;
317 		break;
318 	case 24576000:
319 		cs43130->mclk_int = freq_out;
320 		break;
321 	default:
322 		dev_err(codec->dev,
323 			"unsupported pll output ref clock: %u\n", freq_out);
324 		return -EINVAL;
325 	}
326 
327 	ret = cs43130_pll_config(codec);
328 	dev_dbg(codec->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass);
329 	return ret;
330 }
331 
332 static int cs43130_change_clksrc(struct snd_soc_codec *codec,
333 				 enum cs43130_mclk_src_sel src)
334 {
335 	int ret;
336 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
337 	int mclk_int_decoded;
338 
339 	if (src == cs43130->mclk_int_src) {
340 		/* clk source has not changed */
341 		return 0;
342 	}
343 
344 	switch (cs43130->mclk_int) {
345 	case CS43130_MCLK_22M:
346 		mclk_int_decoded = CS43130_MCLK_22P5;
347 		break;
348 	case CS43130_MCLK_24M:
349 		mclk_int_decoded = CS43130_MCLK_24P5;
350 		break;
351 	default:
352 		dev_err(codec->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int);
353 		return -EINVAL;
354 	}
355 
356 	switch (src) {
357 	case CS43130_MCLK_SRC_EXT:
358 		cs43130->pll_bypass = true;
359 		cs43130->mclk_int_src = CS43130_MCLK_SRC_EXT;
360 		if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
361 			regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
362 					   CS43130_PDN_XTAL_MASK,
363 					   1 << CS43130_PDN_XTAL_SHIFT);
364 		} else {
365 			reinit_completion(&cs43130->xtal_rdy);
366 			regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
367 					   CS43130_XTAL_RDY_INT_MASK, 0);
368 			regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
369 					   CS43130_PDN_XTAL_MASK, 0);
370 			ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
371 							  msecs_to_jiffies(100));
372 			regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
373 					   CS43130_XTAL_RDY_INT_MASK,
374 					   1 << CS43130_XTAL_RDY_INT_SHIFT);
375 			if (ret == 0) {
376 				dev_err(codec->dev, "Timeout waiting for XTAL_READY interrupt\n");
377 				return -ETIMEDOUT;
378 			}
379 		}
380 
381 		regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
382 				   CS43130_MCLK_SRC_SEL_MASK,
383 				   src << CS43130_MCLK_SRC_SEL_SHIFT);
384 		regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
385 				   CS43130_MCLK_INT_MASK,
386 				   mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
387 		usleep_range(150, 200);
388 
389 		regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
390 				   CS43130_PDN_PLL_MASK,
391 				   1 << CS43130_PDN_PLL_SHIFT);
392 		break;
393 	case CS43130_MCLK_SRC_PLL:
394 		cs43130->pll_bypass = false;
395 		cs43130->mclk_int_src = CS43130_MCLK_SRC_PLL;
396 		if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
397 			regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
398 					   CS43130_PDN_XTAL_MASK,
399 					   1 << CS43130_PDN_XTAL_SHIFT);
400 		} else {
401 			reinit_completion(&cs43130->xtal_rdy);
402 			regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
403 					   CS43130_XTAL_RDY_INT_MASK, 0);
404 			regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
405 					   CS43130_PDN_XTAL_MASK, 0);
406 			ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
407 							  msecs_to_jiffies(100));
408 			regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
409 					   CS43130_XTAL_RDY_INT_MASK,
410 					   1 << CS43130_XTAL_RDY_INT_SHIFT);
411 			if (ret == 0) {
412 				dev_err(codec->dev, "Timeout waiting for XTAL_READY interrupt\n");
413 				return -ETIMEDOUT;
414 			}
415 		}
416 
417 		reinit_completion(&cs43130->pll_rdy);
418 		regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
419 				   CS43130_PLL_RDY_INT_MASK, 0);
420 		regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
421 				   CS43130_PDN_PLL_MASK, 0);
422 		ret = wait_for_completion_timeout(&cs43130->pll_rdy,
423 						  msecs_to_jiffies(100));
424 		regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
425 				   CS43130_PLL_RDY_INT_MASK,
426 				   1 << CS43130_PLL_RDY_INT_SHIFT);
427 		if (ret == 0) {
428 			dev_err(codec->dev, "Timeout waiting for PLL_READY interrupt\n");
429 			return -ETIMEDOUT;
430 		}
431 
432 		regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
433 				   CS43130_MCLK_SRC_SEL_MASK,
434 				   src << CS43130_MCLK_SRC_SEL_SHIFT);
435 		regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
436 				   CS43130_MCLK_INT_MASK,
437 				   mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
438 		usleep_range(150, 200);
439 		break;
440 	case CS43130_MCLK_SRC_RCO:
441 		cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
442 
443 		regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
444 				   CS43130_MCLK_SRC_SEL_MASK,
445 				   src << CS43130_MCLK_SRC_SEL_SHIFT);
446 		regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
447 				   CS43130_MCLK_INT_MASK,
448 				   CS43130_MCLK_22P5 << CS43130_MCLK_INT_SHIFT);
449 		usleep_range(150, 200);
450 
451 		regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
452 				   CS43130_PDN_XTAL_MASK,
453 				   1 << CS43130_PDN_XTAL_SHIFT);
454 		regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
455 				   CS43130_PDN_PLL_MASK,
456 				   1 << CS43130_PDN_PLL_SHIFT);
457 		break;
458 	default:
459 		dev_err(codec->dev, "Invalid MCLK source value\n");
460 		return -EINVAL;
461 	}
462 
463 	return 0;
464 }
465 
466 static const struct cs43130_bitwidth_map cs43130_bitwidth_table[] = {
467 	{8,	CS43130_SP_BIT_SIZE_8,	CS43130_CH_BIT_SIZE_8},
468 	{16,	CS43130_SP_BIT_SIZE_16, CS43130_CH_BIT_SIZE_16},
469 	{24,	CS43130_SP_BIT_SIZE_24, CS43130_CH_BIT_SIZE_24},
470 	{32,	CS43130_SP_BIT_SIZE_32, CS43130_CH_BIT_SIZE_32},
471 };
472 
473 static const struct cs43130_bitwidth_map *cs43130_get_bitwidth_table(
474 				unsigned int bitwidth)
475 {
476 	int i;
477 
478 	for (i = 0; i < ARRAY_SIZE(cs43130_bitwidth_table); i++) {
479 		if (cs43130_bitwidth_table[i].bitwidth == bitwidth)
480 			return &cs43130_bitwidth_table[i];
481 	}
482 
483 	return NULL;
484 }
485 
486 static int cs43130_set_bitwidth(int dai_id, unsigned int bitwidth_dai,
487 			  struct regmap *regmap)
488 {
489 	const struct cs43130_bitwidth_map *bw_map;
490 
491 	bw_map = cs43130_get_bitwidth_table(bitwidth_dai);
492 	if (!bw_map)
493 		return -EINVAL;
494 
495 	switch (dai_id) {
496 	case CS43130_ASP_PCM_DAI:
497 	case CS43130_ASP_DOP_DAI:
498 		regmap_update_bits(regmap, CS43130_ASP_CH_1_SZ_EN,
499 				   CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
500 		regmap_update_bits(regmap, CS43130_ASP_CH_2_SZ_EN,
501 				   CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
502 		regmap_update_bits(regmap, CS43130_SP_BITSIZE,
503 				   CS43130_ASP_BITSIZE_MASK, bw_map->sp_bit);
504 		break;
505 	case CS43130_XSP_DOP_DAI:
506 		regmap_update_bits(regmap, CS43130_XSP_CH_1_SZ_EN,
507 				   CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
508 		regmap_update_bits(regmap, CS43130_XSP_CH_2_SZ_EN,
509 				   CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
510 		regmap_update_bits(regmap, CS43130_SP_BITSIZE,
511 				   CS43130_XSP_BITSIZE_MASK, bw_map->sp_bit <<
512 				   CS43130_XSP_BITSIZE_SHIFT);
513 		break;
514 	default:
515 		return -EINVAL;
516 	}
517 
518 	return 0;
519 }
520 
521 static const struct cs43130_rate_map cs43130_rate_table[] = {
522 	{32000,		CS43130_ASP_SPRATE_32K},
523 	{44100,		CS43130_ASP_SPRATE_44_1K},
524 	{48000,		CS43130_ASP_SPRATE_48K},
525 	{88200,		CS43130_ASP_SPRATE_88_2K},
526 	{96000,		CS43130_ASP_SPRATE_96K},
527 	{176400,	CS43130_ASP_SPRATE_176_4K},
528 	{192000,	CS43130_ASP_SPRATE_192K},
529 	{352800,	CS43130_ASP_SPRATE_352_8K},
530 	{384000,	CS43130_ASP_SPRATE_384K},
531 };
532 
533 static const struct cs43130_rate_map *cs43130_get_rate_table(int fs)
534 {
535 	int i;
536 
537 	for (i = 0; i < ARRAY_SIZE(cs43130_rate_table); i++) {
538 		if (cs43130_rate_table[i].fs == fs)
539 			return &cs43130_rate_table[i];
540 	}
541 
542 	return NULL;
543 }
544 
545 static const struct cs43130_clk_gen *cs43130_get_clk_gen(int mclk_int, int fs,
546 		const struct cs43130_clk_gen *clk_gen_table, int len_clk_gen_table)
547 {
548 	int i;
549 
550 	for (i = 0; i < len_clk_gen_table; i++) {
551 		if (clk_gen_table[i].mclk_int == mclk_int &&
552 		    clk_gen_table[i].fs == fs)
553 			return &clk_gen_table[i];
554 	}
555 
556 	return NULL;
557 }
558 
559 static int cs43130_set_sp_fmt(int dai_id, unsigned int bitwidth_sclk,
560 			      struct snd_pcm_hw_params *params,
561 			      struct cs43130_private *cs43130)
562 {
563 	u16 frm_size;
564 	u16 hi_size;
565 	u8 frm_delay;
566 	u8 frm_phase;
567 	u8 frm_data;
568 	u8 sclk_edge;
569 	u8 lrck_edge;
570 	u8 clk_data;
571 	u8 loc_ch1;
572 	u8 loc_ch2;
573 	u8 dai_mode_val;
574 	const struct cs43130_clk_gen *clk_gen;
575 
576 	switch (cs43130->dais[dai_id].dai_format) {
577 	case SND_SOC_DAIFMT_I2S:
578 		hi_size = bitwidth_sclk;
579 		frm_delay = 2;
580 		frm_phase = 0;
581 		break;
582 	case SND_SOC_DAIFMT_LEFT_J:
583 		hi_size = bitwidth_sclk;
584 		frm_delay = 2;
585 		frm_phase = 1;
586 		break;
587 	case SND_SOC_DAIFMT_DSP_A:
588 		hi_size = 1;
589 		frm_delay = 2;
590 		frm_phase = 1;
591 		break;
592 	case SND_SOC_DAIFMT_DSP_B:
593 		hi_size = 1;
594 		frm_delay = 0;
595 		frm_phase = 1;
596 		break;
597 	default:
598 		return -EINVAL;
599 	}
600 
601 	switch (cs43130->dais[dai_id].dai_mode) {
602 	case SND_SOC_DAIFMT_CBS_CFS:
603 		dai_mode_val = 0;
604 		break;
605 	case SND_SOC_DAIFMT_CBM_CFM:
606 		dai_mode_val = 1;
607 		break;
608 	default:
609 		return -EINVAL;
610 	}
611 
612 	frm_size = bitwidth_sclk * params_channels(params);
613 	sclk_edge = 1;
614 	lrck_edge = 0;
615 	loc_ch1 = 0;
616 	loc_ch2 = bitwidth_sclk * (params_channels(params) - 1);
617 
618 	frm_data = frm_delay & CS43130_SP_FSD_MASK;
619 	frm_data |= (frm_phase << CS43130_SP_STP_SHIFT) & CS43130_SP_STP_MASK;
620 
621 	clk_data = lrck_edge & CS43130_SP_LCPOL_IN_MASK;
622 	clk_data |= (lrck_edge << CS43130_SP_LCPOL_OUT_SHIFT) &
623 		    CS43130_SP_LCPOL_OUT_MASK;
624 	clk_data |= (sclk_edge << CS43130_SP_SCPOL_IN_SHIFT) &
625 		    CS43130_SP_SCPOL_IN_MASK;
626 	clk_data |= (sclk_edge << CS43130_SP_SCPOL_OUT_SHIFT) &
627 		    CS43130_SP_SCPOL_OUT_MASK;
628 	clk_data |= (dai_mode_val << CS43130_SP_MODE_SHIFT) &
629 		    CS43130_SP_MODE_MASK;
630 
631 	switch (dai_id) {
632 	case CS43130_ASP_PCM_DAI:
633 	case CS43130_ASP_DOP_DAI:
634 		regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_1,
635 			CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
636 			CS43130_SP_LCPR_LSB_DATA_SHIFT);
637 		regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_2,
638 			CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
639 			CS43130_SP_LCPR_MSB_DATA_SHIFT);
640 		regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_1,
641 			CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
642 			CS43130_SP_LCHI_LSB_DATA_SHIFT);
643 		regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_2,
644 			CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
645 			CS43130_SP_LCHI_MSB_DATA_SHIFT);
646 		regmap_write(cs43130->regmap, CS43130_ASP_FRAME_CONF, frm_data);
647 		regmap_write(cs43130->regmap, CS43130_ASP_CH_1_LOC, loc_ch1);
648 		regmap_write(cs43130->regmap, CS43130_ASP_CH_2_LOC, loc_ch2);
649 		regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_1_SZ_EN,
650 			CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
651 		regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_2_SZ_EN,
652 			CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
653 		regmap_write(cs43130->regmap, CS43130_ASP_CLOCK_CONF, clk_data);
654 		break;
655 	case CS43130_XSP_DOP_DAI:
656 		regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_1,
657 			CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
658 			CS43130_SP_LCPR_LSB_DATA_SHIFT);
659 		regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_2,
660 			CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
661 			CS43130_SP_LCPR_MSB_DATA_SHIFT);
662 		regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_1,
663 			CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
664 			CS43130_SP_LCHI_LSB_DATA_SHIFT);
665 		regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_2,
666 			CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
667 			CS43130_SP_LCHI_MSB_DATA_SHIFT);
668 		regmap_write(cs43130->regmap, CS43130_XSP_FRAME_CONF, frm_data);
669 		regmap_write(cs43130->regmap, CS43130_XSP_CH_1_LOC, loc_ch1);
670 		regmap_write(cs43130->regmap, CS43130_XSP_CH_2_LOC, loc_ch2);
671 		regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_1_SZ_EN,
672 			CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
673 		regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_2_SZ_EN,
674 			CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
675 		regmap_write(cs43130->regmap, CS43130_XSP_CLOCK_CONF, clk_data);
676 		break;
677 	default:
678 		return -EINVAL;
679 	}
680 
681 	switch (frm_size) {
682 	case 16:
683 		clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
684 					      params_rate(params),
685 					      cs43130_16_clk_gen,
686 					      ARRAY_SIZE(cs43130_16_clk_gen));
687 		break;
688 	case 32:
689 		clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
690 					      params_rate(params),
691 					      cs43130_32_clk_gen,
692 					      ARRAY_SIZE(cs43130_32_clk_gen));
693 		break;
694 	case 48:
695 		clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
696 					      params_rate(params),
697 					      cs43130_48_clk_gen,
698 					      ARRAY_SIZE(cs43130_48_clk_gen));
699 		break;
700 	case 64:
701 		clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
702 					      params_rate(params),
703 					      cs43130_64_clk_gen,
704 					      ARRAY_SIZE(cs43130_64_clk_gen));
705 		break;
706 	default:
707 		return -EINVAL;
708 	}
709 
710 	if (!clk_gen)
711 		return -EINVAL;
712 
713 	switch (dai_id) {
714 	case CS43130_ASP_PCM_DAI:
715 	case CS43130_ASP_DOP_DAI:
716 		regmap_write(cs43130->regmap, CS43130_ASP_DEN_1,
717 			     (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >>
718 			     CS43130_SP_M_LSB_DATA_SHIFT);
719 		regmap_write(cs43130->regmap, CS43130_ASP_DEN_2,
720 			     (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >>
721 			     CS43130_SP_M_MSB_DATA_SHIFT);
722 		regmap_write(cs43130->regmap, CS43130_ASP_NUM_1,
723 			     (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >>
724 			     CS43130_SP_N_LSB_DATA_SHIFT);
725 		regmap_write(cs43130->regmap, CS43130_ASP_NUM_2,
726 			     (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >>
727 			     CS43130_SP_N_MSB_DATA_SHIFT);
728 		break;
729 	case CS43130_XSP_DOP_DAI:
730 		regmap_write(cs43130->regmap, CS43130_XSP_DEN_1,
731 			     (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >>
732 			     CS43130_SP_M_LSB_DATA_SHIFT);
733 		regmap_write(cs43130->regmap, CS43130_XSP_DEN_2,
734 			     (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >>
735 			     CS43130_SP_M_MSB_DATA_SHIFT);
736 		regmap_write(cs43130->regmap, CS43130_XSP_NUM_1,
737 			     (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >>
738 			     CS43130_SP_N_LSB_DATA_SHIFT);
739 		regmap_write(cs43130->regmap, CS43130_XSP_NUM_2,
740 			     (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >>
741 			     CS43130_SP_N_MSB_DATA_SHIFT);
742 		break;
743 	default:
744 		return -EINVAL;
745 	}
746 
747 	return 0;
748 }
749 
750 static int cs43130_pcm_dsd_mix(bool en, struct regmap *regmap)
751 {
752 	if (en) {
753 		regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
754 				   CS43130_MIX_PCM_PREP_MASK,
755 				   1 << CS43130_MIX_PCM_PREP_SHIFT);
756 		usleep_range(6000, 6050);
757 		regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
758 				   CS43130_MIX_PCM_DSD_MASK,
759 				   1 << CS43130_MIX_PCM_DSD_SHIFT);
760 	} else {
761 		regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
762 				   CS43130_MIX_PCM_DSD_MASK,
763 				   0 << CS43130_MIX_PCM_DSD_SHIFT);
764 		usleep_range(1600, 1650);
765 		regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
766 				   CS43130_MIX_PCM_PREP_MASK,
767 				   0 << CS43130_MIX_PCM_PREP_SHIFT);
768 	}
769 
770 	return 0;
771 }
772 
773 static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream,
774 				 struct snd_pcm_hw_params *params,
775 				 struct snd_soc_dai *dai)
776 {
777 	struct snd_soc_codec *codec = dai->codec;
778 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
779 	unsigned int required_clk;
780 	u8 dsd_speed;
781 
782 	mutex_lock(&cs43130->clk_mutex);
783 	if (!cs43130->clk_req) {
784 		/* no DAI is currently using clk */
785 		if (!(CS43130_MCLK_22M % params_rate(params)))
786 			required_clk = CS43130_MCLK_22M;
787 		else
788 			required_clk = CS43130_MCLK_24M;
789 
790 		cs43130_set_pll(codec, 0, 0, cs43130->mclk, required_clk);
791 		if (cs43130->pll_bypass)
792 			cs43130_change_clksrc(codec, CS43130_MCLK_SRC_EXT);
793 		else
794 			cs43130_change_clksrc(codec, CS43130_MCLK_SRC_PLL);
795 	}
796 
797 	cs43130->clk_req++;
798 	if (cs43130->clk_req == 2)
799 		cs43130_pcm_dsd_mix(true, cs43130->regmap);
800 	mutex_unlock(&cs43130->clk_mutex);
801 
802 	switch (params_rate(params)) {
803 	case 176400:
804 		dsd_speed = 0;
805 		break;
806 	case 352800:
807 		dsd_speed = 1;
808 		break;
809 	default:
810 		dev_err(codec->dev, "Rate(%u) not supported\n",
811 			params_rate(params));
812 		return -EINVAL;
813 	}
814 
815 	if (cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
816 		regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
817 				   CS43130_DSD_MASTER, CS43130_DSD_MASTER);
818 	else
819 		regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
820 				   CS43130_DSD_MASTER, 0);
821 
822 	regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
823 			   CS43130_DSD_SPEED_MASK,
824 			   dsd_speed << CS43130_DSD_SPEED_SHIFT);
825 	regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
826 			   CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_DSD <<
827 			   CS43130_DSD_SRC_SHIFT);
828 
829 	return 0;
830 }
831 
832 static int cs43130_hw_params(struct snd_pcm_substream *substream,
833 				 struct snd_pcm_hw_params *params,
834 				 struct snd_soc_dai *dai)
835 {
836 	struct snd_soc_codec *codec = dai->codec;
837 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
838 	const struct cs43130_rate_map *rate_map;
839 	unsigned int sclk = cs43130->dais[dai->id].sclk;
840 	unsigned int bitwidth_sclk;
841 	unsigned int bitwidth_dai = (unsigned int)(params_width(params));
842 	unsigned int required_clk;
843 	u8 dsd_speed;
844 
845 	mutex_lock(&cs43130->clk_mutex);
846 	if (!cs43130->clk_req) {
847 		/* no DAI is currently using clk */
848 		if (!(CS43130_MCLK_22M % params_rate(params)))
849 			required_clk = CS43130_MCLK_22M;
850 		else
851 			required_clk = CS43130_MCLK_24M;
852 
853 		cs43130_set_pll(codec, 0, 0, cs43130->mclk, required_clk);
854 		if (cs43130->pll_bypass)
855 			cs43130_change_clksrc(codec, CS43130_MCLK_SRC_EXT);
856 		else
857 			cs43130_change_clksrc(codec, CS43130_MCLK_SRC_PLL);
858 	}
859 
860 	cs43130->clk_req++;
861 	if (cs43130->clk_req == 2)
862 		cs43130_pcm_dsd_mix(true, cs43130->regmap);
863 	mutex_unlock(&cs43130->clk_mutex);
864 
865 	switch (dai->id) {
866 	case CS43130_ASP_DOP_DAI:
867 	case CS43130_XSP_DOP_DAI:
868 		/* DoP bitwidth is always 24-bit */
869 		bitwidth_dai = 24;
870 		sclk = params_rate(params) * bitwidth_dai *
871 		       params_channels(params);
872 
873 		switch (params_rate(params)) {
874 		case 176400:
875 			dsd_speed = 0;
876 			break;
877 		case 352800:
878 			dsd_speed = 1;
879 			break;
880 		default:
881 			dev_err(codec->dev, "Rate(%u) not supported\n",
882 				params_rate(params));
883 			return -EINVAL;
884 		}
885 
886 		regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
887 				   CS43130_DSD_SPEED_MASK,
888 				   dsd_speed << CS43130_DSD_SPEED_SHIFT);
889 		break;
890 	case CS43130_ASP_PCM_DAI:
891 		rate_map = cs43130_get_rate_table(params_rate(params));
892 		if (!rate_map)
893 			return -EINVAL;
894 
895 		regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val);
896 		break;
897 	default:
898 		dev_err(codec->dev, "Invalid DAI (%d)\n", dai->id);
899 		return -EINVAL;
900 	}
901 
902 	switch (dai->id) {
903 	case CS43130_ASP_DOP_DAI:
904 		regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
905 				   CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_ASP <<
906 				   CS43130_DSD_SRC_SHIFT);
907 		break;
908 	case CS43130_XSP_DOP_DAI:
909 		regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
910 				   CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_XSP <<
911 				   CS43130_DSD_SRC_SHIFT);
912 	}
913 
914 	if (!sclk && cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
915 		/* Calculate SCLK in master mode if unassigned */
916 		sclk = params_rate(params) * bitwidth_dai *
917 		       params_channels(params);
918 
919 	if (!sclk) {
920 		/* at this point, SCLK must be set */
921 		dev_err(codec->dev, "SCLK freq is not set\n");
922 		return -EINVAL;
923 	}
924 
925 	bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params);
926 	if (bitwidth_sclk < bitwidth_dai) {
927 		dev_err(codec->dev, "Format not supported: SCLK freq is too low\n");
928 		return -EINVAL;
929 	}
930 
931 	dev_dbg(codec->dev,
932 		"sclk = %u, fs = %d, bitwidth_dai = %u\n",
933 		sclk, params_rate(params), bitwidth_dai);
934 
935 	dev_dbg(codec->dev,
936 		"bitwidth_sclk = %u, num_ch = %u\n",
937 		bitwidth_sclk, params_channels(params));
938 
939 	cs43130_set_bitwidth(dai->id, bitwidth_dai, cs43130->regmap);
940 	cs43130_set_sp_fmt(dai->id, bitwidth_sclk, params, cs43130);
941 
942 	return 0;
943 }
944 
945 static int cs43130_hw_free(struct snd_pcm_substream *substream,
946 			   struct snd_soc_dai *dai)
947 {
948 	struct snd_soc_codec *codec = dai->codec;
949 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
950 
951 	mutex_lock(&cs43130->clk_mutex);
952 	cs43130->clk_req--;
953 	if (!cs43130->clk_req) {
954 		/* no DAI is currently using clk */
955 		cs43130_change_clksrc(codec, CS43130_MCLK_SRC_RCO);
956 		cs43130_pcm_dsd_mix(false, cs43130->regmap);
957 	}
958 	mutex_unlock(&cs43130->clk_mutex);
959 
960 	return 0;
961 }
962 
963 static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1);
964 
965 static const char * const pcm_ch_text[] = {
966 	"Left-Right Ch",
967 	"Left-Left Ch",
968 	"Right-Left Ch",
969 	"Right-Right Ch",
970 };
971 
972 static const struct reg_sequence pcm_ch_en_seq[] = {
973 	{CS43130_DXD1, 0x99},
974 	{0x180005, 0x8C},
975 	{0x180007, 0xAB},
976 	{0x180015, 0x31},
977 	{0x180017, 0xB2},
978 	{0x180025, 0x30},
979 	{0x180027, 0x84},
980 	{0x180035, 0x9C},
981 	{0x180037, 0xAE},
982 	{0x18000D, 0x24},
983 	{0x18000F, 0xA3},
984 	{0x18001D, 0x05},
985 	{0x18001F, 0xD4},
986 	{0x18002D, 0x0B},
987 	{0x18002F, 0xC7},
988 	{0x18003D, 0x71},
989 	{0x18003F, 0xE7},
990 	{CS43130_DXD1, 0},
991 };
992 
993 static const struct reg_sequence pcm_ch_dis_seq[] = {
994 	{CS43130_DXD1, 0x99},
995 	{0x180005, 0x24},
996 	{0x180007, 0xA3},
997 	{0x180015, 0x05},
998 	{0x180017, 0xD4},
999 	{0x180025, 0x0B},
1000 	{0x180027, 0xC7},
1001 	{0x180035, 0x71},
1002 	{0x180037, 0xE7},
1003 	{0x18000D, 0x8C},
1004 	{0x18000F, 0xAB},
1005 	{0x18001D, 0x31},
1006 	{0x18001F, 0xB2},
1007 	{0x18002D, 0x30},
1008 	{0x18002F, 0x84},
1009 	{0x18003D, 0x9C},
1010 	{0x18003F, 0xAE},
1011 	{CS43130_DXD1, 0},
1012 };
1013 
1014 static int cs43130_pcm_ch_get(struct snd_kcontrol *kcontrol,
1015 			      struct snd_ctl_elem_value *ucontrol)
1016 {
1017 	return snd_soc_get_enum_double(kcontrol, ucontrol);
1018 }
1019 
1020 static int cs43130_pcm_ch_put(struct snd_kcontrol *kcontrol,
1021 			      struct snd_ctl_elem_value *ucontrol)
1022 {
1023 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1024 	unsigned int *item = ucontrol->value.enumerated.item;
1025 	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1026 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1027 	unsigned int val;
1028 
1029 	if (item[0] >= e->items)
1030 		return -EINVAL;
1031 	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
1032 
1033 	switch (cs43130->dev_id) {
1034 	case CS43131_CHIP_ID:
1035 	case CS43198_CHIP_ID:
1036 		if (val >= 2)
1037 			regmap_multi_reg_write(cs43130->regmap, pcm_ch_en_seq,
1038 					       ARRAY_SIZE(pcm_ch_en_seq));
1039 		else
1040 			regmap_multi_reg_write(cs43130->regmap, pcm_ch_dis_seq,
1041 					       ARRAY_SIZE(pcm_ch_dis_seq));
1042 	}
1043 
1044 	return snd_soc_put_enum_double(kcontrol, ucontrol);
1045 }
1046 
1047 static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0,
1048 			    pcm_ch_text);
1049 
1050 static const char * const pcm_spd_texts[] = {
1051 	"Fast",
1052 	"Slow",
1053 };
1054 
1055 static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7,
1056 			    pcm_spd_texts);
1057 
1058 static const char * const dsd_texts[] = {
1059 	"Off",
1060 	"BCKA Mode",
1061 	"BCKD Mode",
1062 };
1063 
1064 static const unsigned int dsd_values[] = {
1065 	CS43130_DSD_SRC_DSD,
1066 	CS43130_DSD_SRC_ASP,
1067 	CS43130_DSD_SRC_XSP,
1068 };
1069 
1070 static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03,
1071 				  dsd_texts, dsd_values);
1072 
1073 static const struct snd_kcontrol_new cs43130_snd_controls[] = {
1074 	SOC_DOUBLE_R_TLV("Master Playback Volume",
1075 			 CS43130_PCM_VOL_A, CS43130_PCM_VOL_B, 0, 0xFF, 1,
1076 			 pcm_vol_tlv),
1077 	SOC_DOUBLE_R_TLV("Master DSD Playback Volume",
1078 			 CS43130_DSD_VOL_A, CS43130_DSD_VOL_B, 0, 0xFF, 1,
1079 			 pcm_vol_tlv),
1080 	SOC_ENUM_EXT("PCM Ch Select", pcm_ch_enum, cs43130_pcm_ch_get,
1081 		     cs43130_pcm_ch_put),
1082 	SOC_ENUM("PCM Filter Speed", pcm_spd_enum),
1083 	SOC_SINGLE("PCM Phase Compensation", CS43130_PCM_FILT_OPT, 6, 1, 0),
1084 	SOC_SINGLE("PCM Nonoversample Emulate", CS43130_PCM_FILT_OPT, 5, 1, 0),
1085 	SOC_SINGLE("PCM High-pass Filter", CS43130_PCM_FILT_OPT, 1, 1, 0),
1086 	SOC_SINGLE("PCM De-emphasis Filter", CS43130_PCM_FILT_OPT, 0, 1, 0),
1087 	SOC_ENUM("DSD Phase Modulation", dsd_enum),
1088 };
1089 
1090 static const struct reg_sequence pcm_seq[] = {
1091 	{CS43130_DXD1, 0x99},
1092 	{CS43130_DXD7, 0x01},
1093 	{CS43130_DXD8, 0},
1094 	{CS43130_DXD9, 0x01},
1095 	{CS43130_DXD3, 0x12},
1096 	{CS43130_DXD4, 0},
1097 	{CS43130_DXD10, 0x28},
1098 	{CS43130_DXD11, 0x28},
1099 	{CS43130_DXD1, 0},
1100 };
1101 
1102 static const struct reg_sequence dsd_seq[] = {
1103 	{CS43130_DXD1, 0x99},
1104 	{CS43130_DXD7, 0x01},
1105 	{CS43130_DXD8, 0},
1106 	{CS43130_DXD9, 0x01},
1107 	{CS43130_DXD3, 0x12},
1108 	{CS43130_DXD4, 0},
1109 	{CS43130_DXD10, 0x1E},
1110 	{CS43130_DXD11, 0x20},
1111 	{CS43130_DXD1, 0},
1112 };
1113 
1114 static const struct reg_sequence pop_free_seq[] = {
1115 	{CS43130_DXD1, 0x99},
1116 	{CS43130_DXD12, 0x0A},
1117 	{CS43130_DXD1, 0},
1118 };
1119 
1120 static const struct reg_sequence pop_free_seq2[] = {
1121 	{CS43130_DXD1, 0x99},
1122 	{CS43130_DXD13, 0x20},
1123 	{CS43130_DXD1, 0},
1124 };
1125 
1126 static const struct reg_sequence mute_seq[] = {
1127 	{CS43130_DXD1, 0x99},
1128 	{CS43130_DXD3, 0x12},
1129 	{CS43130_DXD5, 0x02},
1130 	{CS43130_DXD4, 0x12},
1131 	{CS43130_DXD1, 0},
1132 };
1133 
1134 static const struct reg_sequence unmute_seq[] = {
1135 	{CS43130_DXD1, 0x99},
1136 	{CS43130_DXD3, 0x10},
1137 	{CS43130_DXD5, 0},
1138 	{CS43130_DXD4, 0x16},
1139 	{CS43130_DXD1, 0},
1140 };
1141 
1142 static int cs43130_dsd_event(struct snd_soc_dapm_widget *w,
1143 			      struct snd_kcontrol *kcontrol, int event)
1144 {
1145 	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1146 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1147 
1148 	switch (event) {
1149 	case SND_SOC_DAPM_PRE_PMU:
1150 		switch (cs43130->dev_id) {
1151 		case CS43130_CHIP_ID:
1152 		case CS4399_CHIP_ID:
1153 			regmap_multi_reg_write(cs43130->regmap, dsd_seq,
1154 					       ARRAY_SIZE(dsd_seq));
1155 		}
1156 		break;
1157 	case SND_SOC_DAPM_POST_PMU:
1158 		regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_1,
1159 				   CS43130_MUTE_MASK, 0);
1160 		switch (cs43130->dev_id) {
1161 		case CS43130_CHIP_ID:
1162 		case CS4399_CHIP_ID:
1163 			regmap_multi_reg_write(cs43130->regmap, unmute_seq,
1164 					       ARRAY_SIZE(unmute_seq));
1165 		}
1166 		break;
1167 	case SND_SOC_DAPM_PRE_PMD:
1168 		switch (cs43130->dev_id) {
1169 		case CS43130_CHIP_ID:
1170 		case CS4399_CHIP_ID:
1171 			regmap_multi_reg_write(cs43130->regmap, mute_seq,
1172 					       ARRAY_SIZE(mute_seq));
1173 			regmap_update_bits(cs43130->regmap,
1174 					   CS43130_DSD_PATH_CTL_1,
1175 					   CS43130_MUTE_MASK, CS43130_MUTE_EN);
1176 			/*
1177 			 * DSD Power Down Sequence
1178 			 * According to Design, 130ms is preferred.
1179 			 */
1180 			msleep(130);
1181 			break;
1182 		case CS43131_CHIP_ID:
1183 		case CS43198_CHIP_ID:
1184 			regmap_update_bits(cs43130->regmap,
1185 					   CS43130_DSD_PATH_CTL_1,
1186 					   CS43130_MUTE_MASK, CS43130_MUTE_EN);
1187 		}
1188 		break;
1189 	default:
1190 		dev_err(codec->dev, "Invalid event = 0x%x\n", event);
1191 		return -EINVAL;
1192 	}
1193 	return 0;
1194 }
1195 
1196 static int cs43130_pcm_event(struct snd_soc_dapm_widget *w,
1197 			      struct snd_kcontrol *kcontrol, int event)
1198 {
1199 	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1200 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1201 
1202 	switch (event) {
1203 	case SND_SOC_DAPM_PRE_PMU:
1204 		switch (cs43130->dev_id) {
1205 		case CS43130_CHIP_ID:
1206 		case CS4399_CHIP_ID:
1207 			regmap_multi_reg_write(cs43130->regmap, pcm_seq,
1208 					       ARRAY_SIZE(pcm_seq));
1209 		}
1210 		break;
1211 	case SND_SOC_DAPM_POST_PMU:
1212 		regmap_update_bits(cs43130->regmap, CS43130_PCM_PATH_CTL_1,
1213 				   CS43130_MUTE_MASK, 0);
1214 		switch (cs43130->dev_id) {
1215 		case CS43130_CHIP_ID:
1216 		case CS4399_CHIP_ID:
1217 			regmap_multi_reg_write(cs43130->regmap, unmute_seq,
1218 					       ARRAY_SIZE(unmute_seq));
1219 		}
1220 		break;
1221 	case SND_SOC_DAPM_PRE_PMD:
1222 		switch (cs43130->dev_id) {
1223 		case CS43130_CHIP_ID:
1224 		case CS4399_CHIP_ID:
1225 			regmap_multi_reg_write(cs43130->regmap, mute_seq,
1226 					       ARRAY_SIZE(mute_seq));
1227 			regmap_update_bits(cs43130->regmap,
1228 					   CS43130_PCM_PATH_CTL_1,
1229 					   CS43130_MUTE_MASK, CS43130_MUTE_EN);
1230 			/*
1231 			 * PCM Power Down Sequence
1232 			 * According to Design, 130ms is preferred.
1233 			 */
1234 			msleep(130);
1235 			break;
1236 		case CS43131_CHIP_ID:
1237 		case CS43198_CHIP_ID:
1238 			regmap_update_bits(cs43130->regmap,
1239 					   CS43130_PCM_PATH_CTL_1,
1240 					   CS43130_MUTE_MASK, CS43130_MUTE_EN);
1241 		}
1242 		break;
1243 	default:
1244 		dev_err(codec->dev, "Invalid event = 0x%x\n", event);
1245 		return -EINVAL;
1246 	}
1247 	return 0;
1248 }
1249 
1250 static const struct reg_sequence dac_postpmu_seq[] = {
1251 	{CS43130_DXD9, 0x0C},
1252 	{CS43130_DXD3, 0x10},
1253 	{CS43130_DXD4, 0x20},
1254 };
1255 
1256 static const struct reg_sequence dac_postpmd_seq[] = {
1257 	{CS43130_DXD1, 0x99},
1258 	{CS43130_DXD6, 0x01},
1259 	{CS43130_DXD1, 0},
1260 };
1261 
1262 static int cs43130_dac_event(struct snd_soc_dapm_widget *w,
1263 			     struct snd_kcontrol *kcontrol, int event)
1264 {
1265 	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1266 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1267 
1268 	switch (event) {
1269 	case SND_SOC_DAPM_PRE_PMU:
1270 		switch (cs43130->dev_id) {
1271 		case CS43130_CHIP_ID:
1272 		case CS4399_CHIP_ID:
1273 			regmap_multi_reg_write(cs43130->regmap, pop_free_seq,
1274 					       ARRAY_SIZE(pop_free_seq));
1275 			break;
1276 		case CS43131_CHIP_ID:
1277 		case CS43198_CHIP_ID:
1278 			regmap_multi_reg_write(cs43130->regmap, pop_free_seq2,
1279 					       ARRAY_SIZE(pop_free_seq2));
1280 		}
1281 		break;
1282 	case SND_SOC_DAPM_POST_PMU:
1283 		usleep_range(10000, 10050);
1284 
1285 		regmap_write(cs43130->regmap, CS43130_DXD1, 0x99);
1286 
1287 		switch (cs43130->dev_id) {
1288 		case CS43130_CHIP_ID:
1289 		case CS4399_CHIP_ID:
1290 			regmap_multi_reg_write(cs43130->regmap, dac_postpmu_seq,
1291 					       ARRAY_SIZE(dac_postpmu_seq));
1292 			/*
1293 			 * Per datasheet, Sec. PCM Power-Up Sequence.
1294 			 * According to Design, CS43130_DXD12 must be 0 to meet
1295 			 * THDN and Dynamic Range spec.
1296 			 */
1297 			msleep(1000);
1298 			regmap_write(cs43130->regmap, CS43130_DXD12, 0);
1299 			break;
1300 		case CS43131_CHIP_ID:
1301 		case CS43198_CHIP_ID:
1302 			usleep_range(12000, 12010);
1303 			regmap_write(cs43130->regmap, CS43130_DXD13, 0);
1304 		}
1305 
1306 		regmap_write(cs43130->regmap, CS43130_DXD1, 0);
1307 		break;
1308 	case SND_SOC_DAPM_POST_PMD:
1309 		switch (cs43130->dev_id) {
1310 		case CS43130_CHIP_ID:
1311 		case CS4399_CHIP_ID:
1312 			regmap_multi_reg_write(cs43130->regmap, dac_postpmd_seq,
1313 					       ARRAY_SIZE(dac_postpmd_seq));
1314 		}
1315 		break;
1316 	default:
1317 		dev_err(codec->dev, "Invalid DAC event = 0x%x\n", event);
1318 		return -EINVAL;
1319 	}
1320 	return 0;
1321 }
1322 
1323 static const struct reg_sequence hpin_prepmd_seq[] = {
1324 	{CS43130_DXD1, 0x99},
1325 	{CS43130_DXD15, 0x64},
1326 	{CS43130_DXD14, 0},
1327 	{CS43130_DXD2, 0},
1328 	{CS43130_DXD1, 0},
1329 };
1330 
1331 static const struct reg_sequence hpin_postpmu_seq[] = {
1332 	{CS43130_DXD1, 0x99},
1333 	{CS43130_DXD2, 1},
1334 	{CS43130_DXD14, 0xDC},
1335 	{CS43130_DXD15, 0xE4},
1336 	{CS43130_DXD1, 0},
1337 };
1338 
1339 static int cs43130_hpin_event(struct snd_soc_dapm_widget *w,
1340 			      struct snd_kcontrol *kcontrol, int event)
1341 {
1342 	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1343 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1344 
1345 	switch (event) {
1346 	case SND_SOC_DAPM_POST_PMD:
1347 		regmap_multi_reg_write(cs43130->regmap, hpin_prepmd_seq,
1348 				       ARRAY_SIZE(hpin_prepmd_seq));
1349 		break;
1350 	case SND_SOC_DAPM_PRE_PMU:
1351 		regmap_multi_reg_write(cs43130->regmap, hpin_postpmu_seq,
1352 				       ARRAY_SIZE(hpin_postpmu_seq));
1353 		break;
1354 	default:
1355 		dev_err(codec->dev, "Invalid HPIN event = 0x%x\n", event);
1356 		return -EINVAL;
1357 	}
1358 	return 0;
1359 }
1360 
1361 static const struct snd_soc_dapm_widget digital_hp_widgets[] = {
1362 	SND_SOC_DAPM_OUTPUT("HPOUTA"),
1363 	SND_SOC_DAPM_OUTPUT("HPOUTB"),
1364 
1365 	SND_SOC_DAPM_AIF_IN_E("ASPIN PCM", NULL, 0, CS43130_PWDN_CTL,
1366 			      CS43130_PDN_ASP_SHIFT, 1, cs43130_pcm_event,
1367 			      (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1368 			       SND_SOC_DAPM_PRE_PMD)),
1369 
1370 	SND_SOC_DAPM_AIF_IN_E("ASPIN DoP", NULL, 0, CS43130_PWDN_CTL,
1371 			      CS43130_PDN_ASP_SHIFT, 1, cs43130_dsd_event,
1372 			      (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1373 			       SND_SOC_DAPM_PRE_PMD)),
1374 
1375 	SND_SOC_DAPM_AIF_IN_E("XSPIN DoP", NULL, 0, CS43130_PWDN_CTL,
1376 			      CS43130_PDN_XSP_SHIFT, 1, cs43130_dsd_event,
1377 			      (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1378 			       SND_SOC_DAPM_PRE_PMD)),
1379 
1380 	SND_SOC_DAPM_AIF_IN_E("XSPIN DSD", NULL, 0, CS43130_PWDN_CTL,
1381 			      CS43130_PDN_DSDIF_SHIFT, 1, cs43130_dsd_event,
1382 			      (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1383 			       SND_SOC_DAPM_PRE_PMD)),
1384 
1385 	SND_SOC_DAPM_DAC("DSD", NULL, CS43130_DSD_PATH_CTL_2,
1386 			 CS43130_DSD_EN_SHIFT, 0),
1387 
1388 	SND_SOC_DAPM_DAC_E("HiFi DAC", NULL, CS43130_PWDN_CTL,
1389 			   CS43130_PDN_HP_SHIFT, 1, cs43130_dac_event,
1390 			   (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1391 			    SND_SOC_DAPM_POST_PMD)),
1392 };
1393 
1394 static const struct snd_soc_dapm_widget analog_hp_widgets[] = {
1395 	SND_SOC_DAPM_DAC_E("Analog Playback", NULL, CS43130_HP_OUT_CTL_1,
1396 			   CS43130_HP_IN_EN_SHIFT, 0, cs43130_hpin_event,
1397 			   (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD)),
1398 };
1399 
1400 static struct snd_soc_dapm_widget all_hp_widgets[
1401 			ARRAY_SIZE(digital_hp_widgets) +
1402 			ARRAY_SIZE(analog_hp_widgets)];
1403 
1404 static const struct snd_soc_dapm_route digital_hp_routes[] = {
1405 	{"ASPIN PCM", NULL, "ASP PCM Playback"},
1406 	{"ASPIN DoP", NULL, "ASP DoP Playback"},
1407 	{"XSPIN DoP", NULL, "XSP DoP Playback"},
1408 	{"XSPIN DSD", NULL, "XSP DSD Playback"},
1409 	{"DSD", NULL, "ASPIN DoP"},
1410 	{"DSD", NULL, "XSPIN DoP"},
1411 	{"DSD", NULL, "XSPIN DSD"},
1412 	{"HiFi DAC", NULL, "ASPIN PCM"},
1413 	{"HiFi DAC", NULL, "DSD"},
1414 	{"HPOUTA", NULL, "HiFi DAC"},
1415 	{"HPOUTB", NULL, "HiFi DAC"},
1416 };
1417 
1418 static const struct snd_soc_dapm_route analog_hp_routes[] = {
1419 	{"HPOUTA", NULL, "Analog Playback"},
1420 	{"HPOUTB", NULL, "Analog Playback"},
1421 };
1422 
1423 static struct snd_soc_dapm_route all_hp_routes[
1424 			ARRAY_SIZE(digital_hp_routes) +
1425 			ARRAY_SIZE(analog_hp_routes)];
1426 
1427 static const unsigned int cs43130_asp_src_rates[] = {
1428 	32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
1429 };
1430 
1431 static const struct snd_pcm_hw_constraint_list cs43130_asp_constraints = {
1432 	.count	= ARRAY_SIZE(cs43130_asp_src_rates),
1433 	.list	= cs43130_asp_src_rates,
1434 };
1435 
1436 static int cs43130_pcm_startup(struct snd_pcm_substream *substream,
1437 			       struct snd_soc_dai *dai)
1438 {
1439 	return snd_pcm_hw_constraint_list(substream->runtime, 0,
1440 					  SNDRV_PCM_HW_PARAM_RATE,
1441 					  &cs43130_asp_constraints);
1442 }
1443 
1444 static const unsigned int cs43130_dop_src_rates[] = {
1445 	176400, 352800,
1446 };
1447 
1448 static const struct snd_pcm_hw_constraint_list cs43130_dop_constraints = {
1449 	.count	= ARRAY_SIZE(cs43130_dop_src_rates),
1450 	.list	= cs43130_dop_src_rates,
1451 };
1452 
1453 static int cs43130_dop_startup(struct snd_pcm_substream *substream,
1454 			       struct snd_soc_dai *dai)
1455 {
1456 	return snd_pcm_hw_constraint_list(substream->runtime, 0,
1457 					  SNDRV_PCM_HW_PARAM_RATE,
1458 					  &cs43130_dop_constraints);
1459 }
1460 
1461 static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1462 {
1463 	struct snd_soc_codec *codec = codec_dai->codec;
1464 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1465 
1466 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1467 	case SND_SOC_DAIFMT_CBS_CFS:
1468 		cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
1469 		break;
1470 	case SND_SOC_DAIFMT_CBM_CFM:
1471 		cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
1472 		break;
1473 	default:
1474 		dev_err(codec->dev, "unsupported mode\n");
1475 		return -EINVAL;
1476 	}
1477 
1478 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1479 	case SND_SOC_DAIFMT_I2S:
1480 		cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_I2S;
1481 		break;
1482 	case SND_SOC_DAIFMT_LEFT_J:
1483 		cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_LEFT_J;
1484 		break;
1485 	case SND_SOC_DAIFMT_DSP_A:
1486 		cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_A;
1487 		break;
1488 	case SND_SOC_DAIFMT_DSP_B:
1489 		cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_B;
1490 		break;
1491 	default:
1492 		dev_err(codec->dev,
1493 			"unsupported audio format\n");
1494 		return -EINVAL;
1495 	}
1496 
1497 	dev_dbg(codec->dev, "dai_id = %d,  dai_mode = %u, dai_format = %u\n",
1498 		codec_dai->id,
1499 		cs43130->dais[codec_dai->id].dai_mode,
1500 		cs43130->dais[codec_dai->id].dai_format);
1501 
1502 	return 0;
1503 }
1504 
1505 static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1506 {
1507 	struct snd_soc_codec *codec = codec_dai->codec;
1508 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1509 
1510 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1511 	case SND_SOC_DAIFMT_CBS_CFS:
1512 		cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
1513 		break;
1514 	case SND_SOC_DAIFMT_CBM_CFM:
1515 		cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
1516 		break;
1517 	default:
1518 		dev_err(codec->dev, "Unsupported DAI format.\n");
1519 		return -EINVAL;
1520 	}
1521 
1522 	dev_dbg(codec->dev, "dai_mode = 0x%x\n",
1523 		cs43130->dais[codec_dai->id].dai_mode);
1524 
1525 	return 0;
1526 }
1527 
1528 static int cs43130_set_sysclk(struct snd_soc_dai *codec_dai,
1529 				  int clk_id, unsigned int freq, int dir)
1530 {
1531 	struct snd_soc_codec *codec = codec_dai->codec;
1532 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1533 
1534 	cs43130->dais[codec_dai->id].sclk = freq;
1535 	dev_dbg(codec->dev, "dai_id = %d,  sclk = %u\n", codec_dai->id,
1536 		cs43130->dais[codec_dai->id].sclk);
1537 
1538 	return 0;
1539 }
1540 
1541 static const struct snd_soc_dai_ops cs43130_pcm_ops = {
1542 	.startup	= cs43130_pcm_startup,
1543 	.hw_params	= cs43130_hw_params,
1544 	.hw_free	= cs43130_hw_free,
1545 	.set_sysclk	= cs43130_set_sysclk,
1546 	.set_fmt	= cs43130_pcm_set_fmt,
1547 };
1548 
1549 static const struct snd_soc_dai_ops cs43130_dop_ops = {
1550 	.startup	= cs43130_dop_startup,
1551 	.hw_params	= cs43130_hw_params,
1552 	.hw_free	= cs43130_hw_free,
1553 	.set_sysclk	= cs43130_set_sysclk,
1554 	.set_fmt	= cs43130_pcm_set_fmt,
1555 };
1556 
1557 static const struct snd_soc_dai_ops cs43130_dsd_ops = {
1558 	.startup        = cs43130_dop_startup,
1559 	.hw_params	= cs43130_dsd_hw_params,
1560 	.hw_free	= cs43130_hw_free,
1561 	.set_fmt	= cs43130_dsd_set_fmt,
1562 };
1563 
1564 static struct snd_soc_dai_driver cs43130_dai[] = {
1565 	{
1566 		.name = "cs43130-asp-pcm",
1567 		.id = CS43130_ASP_PCM_DAI,
1568 		.playback = {
1569 			.stream_name = "ASP PCM Playback",
1570 			.channels_min = 1,
1571 			.channels_max = 2,
1572 			.rates = SNDRV_PCM_RATE_KNOT,
1573 			.formats = CS43130_PCM_FORMATS,
1574 		},
1575 		.ops = &cs43130_pcm_ops,
1576 		.symmetric_rates = 1,
1577 	},
1578 	{
1579 		.name = "cs43130-asp-dop",
1580 		.id = CS43130_ASP_DOP_DAI,
1581 		.playback = {
1582 			.stream_name = "ASP DoP Playback",
1583 			.channels_min = 1,
1584 			.channels_max = 2,
1585 			.rates = SNDRV_PCM_RATE_KNOT,
1586 			.formats = CS43130_DOP_FORMATS,
1587 		},
1588 		.ops = &cs43130_dop_ops,
1589 		.symmetric_rates = 1,
1590 	},
1591 	{
1592 		.name = "cs43130-xsp-dop",
1593 		.id = CS43130_XSP_DOP_DAI,
1594 		.playback = {
1595 			.stream_name = "XSP DoP Playback",
1596 			.channels_min = 1,
1597 			.channels_max = 2,
1598 			.rates = SNDRV_PCM_RATE_KNOT,
1599 			.formats = CS43130_DOP_FORMATS,
1600 		},
1601 		.ops = &cs43130_dop_ops,
1602 		.symmetric_rates = 1,
1603 	},
1604 	{
1605 		.name = "cs43130-xsp-dsd",
1606 		.id = CS43130_XSP_DSD_DAI,
1607 		.playback = {
1608 			.stream_name = "XSP DSD Playback",
1609 			.channels_min = 1,
1610 			.channels_max = 2,
1611 			.rates = SNDRV_PCM_RATE_KNOT,
1612 			.formats = CS43130_DOP_FORMATS,
1613 		},
1614 		.ops = &cs43130_dsd_ops,
1615 	},
1616 
1617 };
1618 
1619 static int cs43130_codec_set_sysclk(struct snd_soc_codec *codec,
1620 				    int clk_id, int source, unsigned int freq,
1621 				    int dir)
1622 {
1623 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
1624 
1625 	dev_dbg(codec->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n",
1626 		clk_id, source, freq, dir);
1627 
1628 	switch (freq) {
1629 	case CS43130_MCLK_22M:
1630 	case CS43130_MCLK_24M:
1631 		cs43130->mclk = freq;
1632 		break;
1633 	default:
1634 		dev_err(codec->dev, "Invalid MCLK INT freq: %u\n", freq);
1635 		return -EINVAL;
1636 	}
1637 
1638 	if (source == CS43130_MCLK_SRC_EXT) {
1639 		cs43130->pll_bypass = true;
1640 	} else {
1641 		dev_err(codec->dev, "Invalid MCLK source\n");
1642 		return -EINVAL;
1643 	}
1644 
1645 	return 0;
1646 }
1647 
1648 static inline u16 cs43130_get_ac_reg_val(u16 ac_freq)
1649 {
1650 	/* AC freq is counted in 5.94Hz step. */
1651 	return ac_freq / 6;
1652 }
1653 
1654 static int cs43130_show_dc(struct device *dev, char *buf, u8 ch)
1655 {
1656 	struct i2c_client *client = to_i2c_client(dev);
1657 	struct cs43130_private *cs43130 = i2c_get_clientdata(client);
1658 
1659 	if (!cs43130->hpload_done)
1660 		return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n");
1661 	else
1662 		return scnprintf(buf, PAGE_SIZE, "%u\n",
1663 				 cs43130->hpload_dc[ch]);
1664 }
1665 
1666 static ssize_t cs43130_show_dc_l(struct device *dev,
1667 				 struct device_attribute *attr, char *buf)
1668 {
1669 	return cs43130_show_dc(dev, buf, HP_LEFT);
1670 }
1671 
1672 static ssize_t cs43130_show_dc_r(struct device *dev,
1673 				 struct device_attribute *attr, char *buf)
1674 {
1675 	return cs43130_show_dc(dev, buf, HP_RIGHT);
1676 }
1677 
1678 static u16 const cs43130_ac_freq[CS43130_AC_FREQ] = {
1679 	24,
1680 	43,
1681 	93,
1682 	200,
1683 	431,
1684 	928,
1685 	2000,
1686 	4309,
1687 	9283,
1688 	20000,
1689 };
1690 
1691 static int cs43130_show_ac(struct device *dev, char *buf, u8 ch)
1692 {
1693 	int i, j = 0, tmp;
1694 	struct i2c_client *client = to_i2c_client(dev);
1695 	struct cs43130_private *cs43130 = i2c_get_clientdata(client);
1696 
1697 	if (cs43130->hpload_done && cs43130->ac_meas) {
1698 		for (i = 0; i < ARRAY_SIZE(cs43130_ac_freq); i++) {
1699 			tmp = scnprintf(buf + j, PAGE_SIZE - j, "%u\n",
1700 					cs43130->hpload_ac[i][ch]);
1701 			if (!tmp)
1702 				break;
1703 
1704 			j += tmp;
1705 		}
1706 
1707 		return j;
1708 	} else {
1709 		return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n");
1710 	}
1711 }
1712 
1713 static ssize_t cs43130_show_ac_l(struct device *dev,
1714 				 struct device_attribute *attr, char *buf)
1715 {
1716 	return cs43130_show_ac(dev, buf, HP_LEFT);
1717 }
1718 
1719 static ssize_t cs43130_show_ac_r(struct device *dev,
1720 				 struct device_attribute *attr, char *buf)
1721 {
1722 	return cs43130_show_ac(dev, buf, HP_RIGHT);
1723 }
1724 
1725 static DEVICE_ATTR(hpload_dc_l, S_IRUGO, cs43130_show_dc_l, NULL);
1726 static DEVICE_ATTR(hpload_dc_r, S_IRUGO, cs43130_show_dc_r, NULL);
1727 static DEVICE_ATTR(hpload_ac_l, S_IRUGO, cs43130_show_ac_l, NULL);
1728 static DEVICE_ATTR(hpload_ac_r, S_IRUGO, cs43130_show_ac_r, NULL);
1729 
1730 static struct reg_sequence hp_en_cal_seq[] = {
1731 	{CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1732 	{CS43130_HP_MEAS_LOAD_1, 0},
1733 	{CS43130_HP_MEAS_LOAD_2, 0},
1734 	{CS43130_INT_MASK_4, 0},
1735 	{CS43130_DXD1, 0x99},
1736 	{CS43130_DXD16, 0xBB},
1737 	{CS43130_DXD12, 0x01},
1738 	{CS43130_DXD19, 0xCB},
1739 	{CS43130_DXD17, 0x95},
1740 	{CS43130_DXD18, 0x0B},
1741 	{CS43130_DXD1, 0},
1742 	{CS43130_HP_LOAD_1, 0x80},
1743 };
1744 
1745 static struct reg_sequence hp_en_cal_seq2[] = {
1746 	{CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1747 	{CS43130_HP_MEAS_LOAD_1, 0},
1748 	{CS43130_HP_MEAS_LOAD_2, 0},
1749 	{CS43130_INT_MASK_4, 0},
1750 	{CS43130_HP_LOAD_1, 0x80},
1751 };
1752 
1753 static struct reg_sequence hp_dis_cal_seq[] = {
1754 	{CS43130_HP_LOAD_1, 0x80},
1755 	{CS43130_DXD1, 0x99},
1756 	{CS43130_DXD12, 0},
1757 	{CS43130_DXD1, 0},
1758 	{CS43130_HP_LOAD_1, 0},
1759 };
1760 
1761 static struct reg_sequence hp_dis_cal_seq2[] = {
1762 	{CS43130_HP_LOAD_1, 0x80},
1763 	{CS43130_HP_LOAD_1, 0},
1764 };
1765 
1766 static struct reg_sequence hp_dc_ch_l_seq[] = {
1767 	{CS43130_DXD1, 0x99},
1768 	{CS43130_DXD19, 0x0A},
1769 	{CS43130_DXD17, 0x93},
1770 	{CS43130_DXD18, 0x0A},
1771 	{CS43130_DXD1, 0},
1772 	{CS43130_HP_LOAD_1, 0x80},
1773 	{CS43130_HP_LOAD_1, 0x81},
1774 };
1775 
1776 static struct reg_sequence hp_dc_ch_l_seq2[] = {
1777 	{CS43130_HP_LOAD_1, 0x80},
1778 	{CS43130_HP_LOAD_1, 0x81},
1779 };
1780 
1781 static struct reg_sequence hp_dc_ch_r_seq[] = {
1782 	{CS43130_DXD1, 0x99},
1783 	{CS43130_DXD19, 0x8A},
1784 	{CS43130_DXD17, 0x15},
1785 	{CS43130_DXD18, 0x06},
1786 	{CS43130_DXD1, 0},
1787 	{CS43130_HP_LOAD_1, 0x90},
1788 	{CS43130_HP_LOAD_1, 0x91},
1789 };
1790 
1791 static struct reg_sequence hp_dc_ch_r_seq2[] = {
1792 	{CS43130_HP_LOAD_1, 0x90},
1793 	{CS43130_HP_LOAD_1, 0x91},
1794 };
1795 
1796 static struct reg_sequence hp_ac_ch_l_seq[] = {
1797 	{CS43130_DXD1, 0x99},
1798 	{CS43130_DXD19, 0x0A},
1799 	{CS43130_DXD17, 0x93},
1800 	{CS43130_DXD18, 0x0A},
1801 	{CS43130_DXD1, 0},
1802 	{CS43130_HP_LOAD_1, 0x80},
1803 	{CS43130_HP_LOAD_1, 0x82},
1804 };
1805 
1806 static struct reg_sequence hp_ac_ch_l_seq2[] = {
1807 	{CS43130_HP_LOAD_1, 0x80},
1808 	{CS43130_HP_LOAD_1, 0x82},
1809 };
1810 
1811 static struct reg_sequence hp_ac_ch_r_seq[] = {
1812 	{CS43130_DXD1, 0x99},
1813 	{CS43130_DXD19, 0x8A},
1814 	{CS43130_DXD17, 0x15},
1815 	{CS43130_DXD18, 0x06},
1816 	{CS43130_DXD1, 0},
1817 	{CS43130_HP_LOAD_1, 0x90},
1818 	{CS43130_HP_LOAD_1, 0x92},
1819 };
1820 
1821 static struct reg_sequence hp_ac_ch_r_seq2[] = {
1822 	{CS43130_HP_LOAD_1, 0x90},
1823 	{CS43130_HP_LOAD_1, 0x92},
1824 };
1825 
1826 static struct reg_sequence hp_cln_seq[] = {
1827 	{CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
1828 	{CS43130_HP_MEAS_LOAD_1, 0},
1829 	{CS43130_HP_MEAS_LOAD_2, 0},
1830 };
1831 
1832 struct reg_sequences {
1833 	struct reg_sequence	*seq;
1834 	int			size;
1835 	unsigned int		msk;
1836 };
1837 
1838 static struct reg_sequences hpload_seq1[] = {
1839 	{
1840 		.seq	= hp_en_cal_seq,
1841 		.size	= ARRAY_SIZE(hp_en_cal_seq),
1842 		.msk	= CS43130_HPLOAD_ON_INT,
1843 	},
1844 	{
1845 		.seq	= hp_dc_ch_l_seq,
1846 		.size	= ARRAY_SIZE(hp_dc_ch_l_seq),
1847 		.msk	= CS43130_HPLOAD_DC_INT,
1848 	},
1849 	{
1850 		.seq	= hp_ac_ch_l_seq,
1851 		.size	= ARRAY_SIZE(hp_ac_ch_l_seq),
1852 		.msk	= CS43130_HPLOAD_AC_INT,
1853 	},
1854 	{
1855 		.seq	= hp_dis_cal_seq,
1856 		.size	= ARRAY_SIZE(hp_dis_cal_seq),
1857 		.msk	= CS43130_HPLOAD_OFF_INT,
1858 	},
1859 	{
1860 		.seq	= hp_en_cal_seq,
1861 		.size	= ARRAY_SIZE(hp_en_cal_seq),
1862 		.msk	= CS43130_HPLOAD_ON_INT,
1863 	},
1864 	{
1865 		.seq	= hp_dc_ch_r_seq,
1866 		.size	= ARRAY_SIZE(hp_dc_ch_r_seq),
1867 		.msk	= CS43130_HPLOAD_DC_INT,
1868 	},
1869 	{
1870 		.seq	= hp_ac_ch_r_seq,
1871 		.size	= ARRAY_SIZE(hp_ac_ch_r_seq),
1872 		.msk	= CS43130_HPLOAD_AC_INT,
1873 	},
1874 };
1875 
1876 static struct reg_sequences hpload_seq2[] = {
1877 	{
1878 		.seq	= hp_en_cal_seq2,
1879 		.size	= ARRAY_SIZE(hp_en_cal_seq2),
1880 		.msk	= CS43130_HPLOAD_ON_INT,
1881 	},
1882 	{
1883 		.seq	= hp_dc_ch_l_seq2,
1884 		.size	= ARRAY_SIZE(hp_dc_ch_l_seq2),
1885 		.msk	= CS43130_HPLOAD_DC_INT,
1886 	},
1887 	{
1888 		.seq	= hp_ac_ch_l_seq2,
1889 		.size	= ARRAY_SIZE(hp_ac_ch_l_seq2),
1890 		.msk	= CS43130_HPLOAD_AC_INT,
1891 	},
1892 	{
1893 		.seq	= hp_dis_cal_seq2,
1894 		.size	= ARRAY_SIZE(hp_dis_cal_seq2),
1895 		.msk	= CS43130_HPLOAD_OFF_INT,
1896 	},
1897 	{
1898 		.seq	= hp_en_cal_seq2,
1899 		.size	= ARRAY_SIZE(hp_en_cal_seq2),
1900 		.msk	= CS43130_HPLOAD_ON_INT,
1901 	},
1902 	{
1903 		.seq	= hp_dc_ch_r_seq2,
1904 		.size	= ARRAY_SIZE(hp_dc_ch_r_seq2),
1905 		.msk	= CS43130_HPLOAD_DC_INT,
1906 	},
1907 	{
1908 		.seq	= hp_ac_ch_r_seq2,
1909 		.size	= ARRAY_SIZE(hp_ac_ch_r_seq2),
1910 		.msk	= CS43130_HPLOAD_AC_INT,
1911 	},
1912 };
1913 
1914 static int cs43130_update_hpload(unsigned int msk, int ac_idx,
1915 				 struct cs43130_private *cs43130)
1916 {
1917 	bool left_ch = true;
1918 	unsigned int reg;
1919 	u32 addr;
1920 	u16 impedance;
1921 	struct snd_soc_codec *codec = cs43130->codec;
1922 
1923 	switch (msk) {
1924 	case CS43130_HPLOAD_DC_INT:
1925 	case CS43130_HPLOAD_AC_INT:
1926 		break;
1927 	default:
1928 		return 0;
1929 	}
1930 
1931 	regmap_read(cs43130->regmap, CS43130_HP_LOAD_1, &reg);
1932 	if (reg & CS43130_HPLOAD_CHN_SEL)
1933 		left_ch = false;
1934 
1935 	if (msk == CS43130_HPLOAD_DC_INT)
1936 		addr = CS43130_HP_DC_STAT_1;
1937 	else
1938 		addr = CS43130_HP_AC_STAT_1;
1939 
1940 	regmap_read(cs43130->regmap, addr, &reg);
1941 	impedance = reg >> 3;
1942 	regmap_read(cs43130->regmap, addr + 1, &reg);
1943 	impedance |= reg << 5;
1944 
1945 	if (msk == CS43130_HPLOAD_DC_INT) {
1946 		if (left_ch)
1947 			cs43130->hpload_dc[HP_LEFT] = impedance;
1948 		else
1949 			cs43130->hpload_dc[HP_RIGHT] = impedance;
1950 
1951 		dev_dbg(codec->dev, "HP DC impedance (Ch %u): %u\n", !left_ch,
1952 			impedance);
1953 	} else {
1954 		if (left_ch)
1955 			cs43130->hpload_ac[ac_idx][HP_LEFT] = impedance;
1956 		else
1957 			cs43130->hpload_ac[ac_idx][HP_RIGHT] = impedance;
1958 
1959 		dev_dbg(codec->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n",
1960 			cs43130->ac_freq[ac_idx], !left_ch, impedance);
1961 	}
1962 
1963 	return 0;
1964 }
1965 
1966 static int cs43130_hpload_proc(struct cs43130_private *cs43130,
1967 			       struct reg_sequence *seq, int seq_size,
1968 			       unsigned int rslt_msk, int ac_idx)
1969 {
1970 	int ret;
1971 	unsigned int msk;
1972 	u16 ac_reg_val;
1973 	struct snd_soc_codec *codec = cs43130->codec;
1974 
1975 	reinit_completion(&cs43130->hpload_evt);
1976 
1977 	if (rslt_msk == CS43130_HPLOAD_AC_INT) {
1978 		ac_reg_val = cs43130_get_ac_reg_val(cs43130->ac_freq[ac_idx]);
1979 		regmap_update_bits(cs43130->regmap, CS43130_HP_LOAD_1,
1980 				   CS43130_HPLOAD_AC_START, 0);
1981 		regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_1,
1982 				   CS43130_HP_MEAS_LOAD_MASK,
1983 				   ac_reg_val >> CS43130_HP_MEAS_LOAD_1_SHIFT);
1984 		regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_2,
1985 				   CS43130_HP_MEAS_LOAD_MASK,
1986 				   ac_reg_val >> CS43130_HP_MEAS_LOAD_2_SHIFT);
1987 	}
1988 
1989 	regmap_multi_reg_write(cs43130->regmap, seq,
1990 			       seq_size);
1991 
1992 	ret = wait_for_completion_timeout(&cs43130->hpload_evt,
1993 					  msecs_to_jiffies(1000));
1994 	regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk);
1995 	if (!ret) {
1996 		dev_err(codec->dev, "Timeout waiting for HPLOAD interrupt\n");
1997 		return -1;
1998 	}
1999 
2000 	dev_dbg(codec->dev, "HP load stat: %x, INT_MASK_4: %x\n",
2001 		cs43130->hpload_stat, msk);
2002 	if ((cs43130->hpload_stat & (CS43130_HPLOAD_NO_DC_INT |
2003 				     CS43130_HPLOAD_UNPLUG_INT |
2004 				     CS43130_HPLOAD_OOR_INT)) ||
2005 	    !(cs43130->hpload_stat & rslt_msk)) {
2006 		dev_dbg(codec->dev, "HP load measure failed\n");
2007 		return -1;
2008 	}
2009 
2010 	return 0;
2011 }
2012 
2013 static const struct reg_sequence hv_seq[][2] = {
2014 	{
2015 		{CS43130_CLASS_H_CTL, 0x1C},
2016 		{CS43130_HP_OUT_CTL_1, 0x10},
2017 	},
2018 	{
2019 		{CS43130_CLASS_H_CTL, 0x1E},
2020 		{CS43130_HP_OUT_CTL_1, 0x20},
2021 	},
2022 	{
2023 		{CS43130_CLASS_H_CTL, 0x1E},
2024 		{CS43130_HP_OUT_CTL_1, 0x30},
2025 	},
2026 };
2027 
2028 static int cs43130_set_hv(struct regmap *regmap, u16 hpload_dc,
2029 			  const u16 *dc_threshold)
2030 {
2031 	int i;
2032 
2033 	for (i = 0; i < CS43130_DC_THRESHOLD; i++) {
2034 		if (hpload_dc <= dc_threshold[i])
2035 			break;
2036 	}
2037 
2038 	regmap_multi_reg_write(regmap, hv_seq[i], ARRAY_SIZE(hv_seq[i]));
2039 
2040 	return 0;
2041 }
2042 
2043 static void cs43130_imp_meas(struct work_struct *wk)
2044 {
2045 	unsigned int reg, seq_size;
2046 	int i, ret, ac_idx;
2047 	struct cs43130_private *cs43130;
2048 	struct snd_soc_codec *codec;
2049 	struct reg_sequences *hpload_seq;
2050 
2051 	cs43130 = container_of(wk, struct cs43130_private, work);
2052 	codec = cs43130->codec;
2053 
2054 	if (!cs43130->mclk)
2055 		return;
2056 
2057 	cs43130->hpload_done = false;
2058 
2059 	mutex_lock(&cs43130->clk_mutex);
2060 	if (!cs43130->clk_req) {
2061 		/* clk not in use */
2062 		cs43130_set_pll(codec, 0, 0, cs43130->mclk, CS43130_MCLK_22M);
2063 		if (cs43130->pll_bypass)
2064 			cs43130_change_clksrc(codec, CS43130_MCLK_SRC_EXT);
2065 		else
2066 			cs43130_change_clksrc(codec, CS43130_MCLK_SRC_PLL);
2067 	}
2068 
2069 	cs43130->clk_req++;
2070 	mutex_unlock(&cs43130->clk_mutex);
2071 
2072 	regmap_read(cs43130->regmap, CS43130_INT_STATUS_4, &reg);
2073 
2074 	switch (cs43130->dev_id) {
2075 	case CS43130_CHIP_ID:
2076 		hpload_seq = hpload_seq1;
2077 		seq_size = ARRAY_SIZE(hpload_seq1);
2078 		break;
2079 	case CS43131_CHIP_ID:
2080 		hpload_seq = hpload_seq2;
2081 		seq_size = ARRAY_SIZE(hpload_seq2);
2082 		break;
2083 	default:
2084 		WARN(1, "Invalid dev_id for meas: %d", cs43130->dev_id);
2085 		return;
2086 	}
2087 
2088 	i = 0;
2089 	ac_idx = 0;
2090 	while (i < seq_size) {
2091 		ret = cs43130_hpload_proc(cs43130, hpload_seq[i].seq,
2092 					  hpload_seq[i].size,
2093 					  hpload_seq[i].msk, ac_idx);
2094 		if (ret < 0)
2095 			goto exit;
2096 
2097 		cs43130_update_hpload(hpload_seq[i].msk, ac_idx, cs43130);
2098 
2099 		if (cs43130->ac_meas &&
2100 		    hpload_seq[i].msk == CS43130_HPLOAD_AC_INT &&
2101 		    ac_idx < CS43130_AC_FREQ - 1) {
2102 			ac_idx++;
2103 		} else {
2104 			ac_idx = 0;
2105 			i++;
2106 		}
2107 	}
2108 	cs43130->hpload_done = true;
2109 
2110 	if (cs43130->hpload_dc[HP_LEFT] >= CS43130_LINEOUT_LOAD)
2111 		snd_soc_jack_report(&cs43130->jack, CS43130_JACK_LINEOUT,
2112 				    CS43130_JACK_MASK);
2113 	else
2114 		snd_soc_jack_report(&cs43130->jack, CS43130_JACK_HEADPHONE,
2115 				    CS43130_JACK_MASK);
2116 
2117 	dev_dbg(codec->dev, "Set HP output control. DC threshold\n");
2118 	for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2119 		dev_dbg(codec->dev, "DC threshold[%d]: %u.\n", i,
2120 			cs43130->dc_threshold[i]);
2121 
2122 	cs43130_set_hv(cs43130->regmap, cs43130->hpload_dc[HP_LEFT],
2123 		       cs43130->dc_threshold);
2124 
2125 exit:
2126 	switch (cs43130->dev_id) {
2127 	case CS43130_CHIP_ID:
2128 		cs43130_hpload_proc(cs43130, hp_dis_cal_seq,
2129 				    ARRAY_SIZE(hp_dis_cal_seq),
2130 				    CS43130_HPLOAD_OFF_INT, ac_idx);
2131 		break;
2132 	case CS43131_CHIP_ID:
2133 		cs43130_hpload_proc(cs43130, hp_dis_cal_seq2,
2134 				    ARRAY_SIZE(hp_dis_cal_seq2),
2135 				    CS43130_HPLOAD_OFF_INT, ac_idx);
2136 	}
2137 
2138 	regmap_multi_reg_write(cs43130->regmap, hp_cln_seq,
2139 			       ARRAY_SIZE(hp_cln_seq));
2140 
2141 	mutex_lock(&cs43130->clk_mutex);
2142 	cs43130->clk_req--;
2143 	/* clk not in use */
2144 	if (!cs43130->clk_req)
2145 		cs43130_change_clksrc(codec, CS43130_MCLK_SRC_RCO);
2146 	mutex_unlock(&cs43130->clk_mutex);
2147 }
2148 
2149 static irqreturn_t cs43130_irq_thread(int irq, void *data)
2150 {
2151 	struct cs43130_private *cs43130 = (struct cs43130_private *)data;
2152 	struct snd_soc_codec *codec = cs43130->codec;
2153 	unsigned int stickies[CS43130_NUM_INT];
2154 	unsigned int irq_occurrence = 0;
2155 	unsigned int masks[CS43130_NUM_INT];
2156 	int i, j;
2157 
2158 	for (i = 0; i < ARRAY_SIZE(stickies); i++) {
2159 		regmap_read(cs43130->regmap, CS43130_INT_STATUS_1 + i,
2160 			    &stickies[i]);
2161 		regmap_read(cs43130->regmap, CS43130_INT_MASK_1 + i,
2162 			    &masks[i]);
2163 	}
2164 
2165 	for (i = 0; i < ARRAY_SIZE(stickies); i++) {
2166 		stickies[i] = stickies[i] & (~masks[i]);
2167 		for (j = 0; j < 8; j++)
2168 			irq_occurrence += (stickies[i] >> j) & 1;
2169 	}
2170 	dev_dbg(codec->dev, "number of interrupts occurred (%u)\n",
2171 		irq_occurrence);
2172 
2173 	if (!irq_occurrence)
2174 		return IRQ_NONE;
2175 
2176 	if (stickies[0] & CS43130_XTAL_RDY_INT) {
2177 		complete(&cs43130->xtal_rdy);
2178 		return IRQ_HANDLED;
2179 	}
2180 
2181 	if (stickies[0] & CS43130_PLL_RDY_INT) {
2182 		complete(&cs43130->pll_rdy);
2183 		return IRQ_HANDLED;
2184 	}
2185 
2186 	if (stickies[3] & CS43130_HPLOAD_NO_DC_INT) {
2187 		cs43130->hpload_stat = stickies[3];
2188 		dev_err(codec->dev,
2189 			"DC load has not completed before AC load (%x)\n",
2190 			cs43130->hpload_stat);
2191 		complete(&cs43130->hpload_evt);
2192 		return IRQ_HANDLED;
2193 	}
2194 
2195 	if (stickies[3] & CS43130_HPLOAD_UNPLUG_INT) {
2196 		cs43130->hpload_stat = stickies[3];
2197 		dev_err(codec->dev, "HP unplugged during measurement (%x)\n",
2198 			cs43130->hpload_stat);
2199 		complete(&cs43130->hpload_evt);
2200 		return IRQ_HANDLED;
2201 	}
2202 
2203 	if (stickies[3] & CS43130_HPLOAD_OOR_INT) {
2204 		cs43130->hpload_stat = stickies[3];
2205 		dev_err(codec->dev, "HP load out of range (%x)\n",
2206 			cs43130->hpload_stat);
2207 		complete(&cs43130->hpload_evt);
2208 		return IRQ_HANDLED;
2209 	}
2210 
2211 	if (stickies[3] & CS43130_HPLOAD_AC_INT) {
2212 		cs43130->hpload_stat = stickies[3];
2213 		dev_dbg(codec->dev, "HP AC load measurement done (%x)\n",
2214 			cs43130->hpload_stat);
2215 		complete(&cs43130->hpload_evt);
2216 		return IRQ_HANDLED;
2217 	}
2218 
2219 	if (stickies[3] & CS43130_HPLOAD_DC_INT) {
2220 		cs43130->hpload_stat = stickies[3];
2221 		dev_dbg(codec->dev, "HP DC load measurement done (%x)\n",
2222 			cs43130->hpload_stat);
2223 		complete(&cs43130->hpload_evt);
2224 		return IRQ_HANDLED;
2225 	}
2226 
2227 	if (stickies[3] & CS43130_HPLOAD_ON_INT) {
2228 		cs43130->hpload_stat = stickies[3];
2229 		dev_dbg(codec->dev, "HP load state machine on done (%x)\n",
2230 			cs43130->hpload_stat);
2231 		complete(&cs43130->hpload_evt);
2232 		return IRQ_HANDLED;
2233 	}
2234 
2235 	if (stickies[3] & CS43130_HPLOAD_OFF_INT) {
2236 		cs43130->hpload_stat = stickies[3];
2237 		dev_dbg(codec->dev, "HP load state machine off done (%x)\n",
2238 			cs43130->hpload_stat);
2239 		complete(&cs43130->hpload_evt);
2240 		return IRQ_HANDLED;
2241 	}
2242 
2243 	if (stickies[0] & CS43130_XTAL_ERR_INT) {
2244 		dev_err(codec->dev, "Crystal err: clock is not running\n");
2245 		return IRQ_HANDLED;
2246 	}
2247 
2248 	if (stickies[0] & CS43130_HP_UNPLUG_INT) {
2249 		dev_dbg(codec->dev, "HP unplugged\n");
2250 		cs43130->hpload_done = false;
2251 		snd_soc_jack_report(&cs43130->jack, 0, CS43130_JACK_MASK);
2252 		return IRQ_HANDLED;
2253 	}
2254 
2255 	if (stickies[0] & CS43130_HP_PLUG_INT) {
2256 		if (cs43130->dc_meas && !cs43130->hpload_done &&
2257 		    !work_busy(&cs43130->work)) {
2258 			dev_dbg(codec->dev, "HP load queue work\n");
2259 			queue_work(cs43130->wq, &cs43130->work);
2260 		}
2261 
2262 		snd_soc_jack_report(&cs43130->jack, SND_JACK_MECHANICAL,
2263 				    CS43130_JACK_MASK);
2264 		return IRQ_HANDLED;
2265 	}
2266 
2267 	return IRQ_NONE;
2268 }
2269 
2270 static int cs43130_probe(struct snd_soc_codec *codec)
2271 {
2272 	int ret;
2273 	struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec);
2274 	struct snd_soc_card *card = codec->component.card;
2275 	unsigned int reg;
2276 
2277 	cs43130->codec = codec;
2278 
2279 	if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) {
2280 		regmap_update_bits(cs43130->regmap, CS43130_CRYSTAL_SET,
2281 				   CS43130_XTAL_IBIAS_MASK,
2282 				   cs43130->xtal_ibias);
2283 		regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2284 				   CS43130_XTAL_ERR_INT, 0);
2285 	}
2286 
2287 	ret = snd_soc_card_jack_new(card, "Headphone", CS43130_JACK_MASK,
2288 				    &cs43130->jack, NULL, 0);
2289 	if (ret < 0) {
2290 		dev_err(codec->dev, "Cannot create jack\n");
2291 		return ret;
2292 	}
2293 
2294 	cs43130->hpload_done = false;
2295 	if (cs43130->dc_meas) {
2296 		ret = device_create_file(codec->dev, &dev_attr_hpload_dc_l);
2297 		if (ret < 0)
2298 			return ret;
2299 
2300 		ret = device_create_file(codec->dev, &dev_attr_hpload_dc_r);
2301 		if (ret < 0)
2302 			return ret;
2303 
2304 		ret = device_create_file(codec->dev, &dev_attr_hpload_ac_l);
2305 		if (ret < 0)
2306 			return ret;
2307 
2308 		ret = device_create_file(codec->dev, &dev_attr_hpload_ac_r);
2309 		if (ret < 0)
2310 			return ret;
2311 
2312 		cs43130->wq = create_singlethread_workqueue("cs43130_hp");
2313 		INIT_WORK(&cs43130->work, cs43130_imp_meas);
2314 	}
2315 
2316 	regmap_read(cs43130->regmap, CS43130_INT_STATUS_1, &reg);
2317 	regmap_read(cs43130->regmap, CS43130_HP_STATUS, &reg);
2318 	regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2319 			   CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT, 0);
2320 	regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
2321 			   CS43130_HP_DETECT_CTRL_MASK, 0);
2322 	regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
2323 			   CS43130_HP_DETECT_CTRL_MASK,
2324 			   CS43130_HP_DETECT_CTRL_MASK);
2325 
2326 	return 0;
2327 }
2328 
2329 static struct snd_soc_codec_driver soc_codec_dev_cs43130 = {
2330 	.probe			= cs43130_probe,
2331 	.component_driver = {
2332 		.controls		= cs43130_snd_controls,
2333 		.num_controls		= ARRAY_SIZE(cs43130_snd_controls),
2334 	},
2335 	.set_sysclk		= cs43130_codec_set_sysclk,
2336 	.set_pll		= cs43130_set_pll,
2337 };
2338 
2339 static const struct regmap_config cs43130_regmap = {
2340 	.reg_bits		= 24,
2341 	.pad_bits		= 8,
2342 	.val_bits		= 8,
2343 
2344 	.max_register		= CS43130_LASTREG,
2345 	.reg_defaults		= cs43130_reg_defaults,
2346 	.num_reg_defaults	= ARRAY_SIZE(cs43130_reg_defaults),
2347 	.readable_reg		= cs43130_readable_register,
2348 	.precious_reg		= cs43130_precious_register,
2349 	.volatile_reg		= cs43130_volatile_register,
2350 	.cache_type		= REGCACHE_RBTREE,
2351 	.use_single_rw		= true, /* needed for regcache_sync */
2352 };
2353 
2354 static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = {
2355 	50,
2356 	120,
2357 };
2358 
2359 static int cs43130_handle_device_data(struct i2c_client *i2c_client,
2360 				      struct cs43130_private *cs43130)
2361 {
2362 	struct device_node *np = i2c_client->dev.of_node;
2363 	unsigned int val;
2364 	int i;
2365 
2366 	if (of_property_read_u32(np, "cirrus,xtal-ibias", &val) < 0) {
2367 		/* Crystal is unused. System clock is used for external MCLK */
2368 		cs43130->xtal_ibias = CS43130_XTAL_UNUSED;
2369 		return 0;
2370 	}
2371 
2372 	switch (val) {
2373 	case 1:
2374 		cs43130->xtal_ibias = CS43130_XTAL_IBIAS_7_5UA;
2375 		break;
2376 	case 2:
2377 		cs43130->xtal_ibias = CS43130_XTAL_IBIAS_12_5UA;
2378 		break;
2379 	case 3:
2380 		cs43130->xtal_ibias = CS43130_XTAL_IBIAS_15UA;
2381 		break;
2382 	default:
2383 		dev_err(&i2c_client->dev,
2384 			"Invalid cirrus,xtal-ibias value: %d\n", val);
2385 		return -EINVAL;
2386 	}
2387 
2388 	cs43130->dc_meas = of_property_read_bool(np, "cirrus,dc-measure");
2389 	cs43130->ac_meas = of_property_read_bool(np, "cirrus,ac-measure");
2390 
2391 	if (of_property_read_u16_array(np, "cirrus,ac-freq", cs43130->ac_freq,
2392 					CS43130_AC_FREQ) < 0) {
2393 		for (i = 0; i < CS43130_AC_FREQ; i++)
2394 			cs43130->ac_freq[i] = cs43130_ac_freq[i];
2395 	}
2396 
2397 	if (of_property_read_u16_array(np, "cirrus,dc-threshold",
2398 				       cs43130->dc_threshold,
2399 				       CS43130_DC_THRESHOLD) < 0) {
2400 		for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2401 			cs43130->dc_threshold[i] = cs43130_dc_threshold[i];
2402 	}
2403 
2404 	return 0;
2405 }
2406 
2407 static int cs43130_i2c_probe(struct i2c_client *client,
2408 			     const struct i2c_device_id *id)
2409 {
2410 	struct cs43130_private *cs43130;
2411 	int ret;
2412 	unsigned int devid = 0;
2413 	unsigned int reg;
2414 	int i;
2415 
2416 	cs43130 = devm_kzalloc(&client->dev, sizeof(*cs43130), GFP_KERNEL);
2417 	if (!cs43130)
2418 		return -ENOMEM;
2419 
2420 	i2c_set_clientdata(client, cs43130);
2421 
2422 	cs43130->regmap = devm_regmap_init_i2c(client, &cs43130_regmap);
2423 	if (IS_ERR(cs43130->regmap)) {
2424 		ret = PTR_ERR(cs43130->regmap);
2425 		return ret;
2426 	}
2427 
2428 	if (client->dev.of_node) {
2429 		ret = cs43130_handle_device_data(client, cs43130);
2430 		if (ret != 0)
2431 			return ret;
2432 	}
2433 	for (i = 0; i < ARRAY_SIZE(cs43130->supplies); i++)
2434 		cs43130->supplies[i].supply = cs43130_supply_names[i];
2435 
2436 	ret = devm_regulator_bulk_get(&client->dev,
2437 				      ARRAY_SIZE(cs43130->supplies),
2438 				      cs43130->supplies);
2439 	if (ret != 0) {
2440 		dev_err(&client->dev, "Failed to request supplies: %d\n", ret);
2441 		return ret;
2442 	}
2443 	ret = regulator_bulk_enable(ARRAY_SIZE(cs43130->supplies),
2444 				    cs43130->supplies);
2445 	if (ret != 0) {
2446 		dev_err(&client->dev, "Failed to enable supplies: %d\n", ret);
2447 		return ret;
2448 	}
2449 
2450 	cs43130->reset_gpio = devm_gpiod_get_optional(&client->dev,
2451 						      "reset", GPIOD_OUT_LOW);
2452 	if (IS_ERR(cs43130->reset_gpio))
2453 		return PTR_ERR(cs43130->reset_gpio);
2454 
2455 	gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2456 
2457 	usleep_range(2000, 2050);
2458 
2459 	ret = regmap_read(cs43130->regmap, CS43130_DEVID_AB, &reg);
2460 
2461 	devid = (reg & 0xFF) << 12;
2462 	ret = regmap_read(cs43130->regmap, CS43130_DEVID_CD, &reg);
2463 	devid |= (reg & 0xFF) << 4;
2464 	ret = regmap_read(cs43130->regmap, CS43130_DEVID_E, &reg);
2465 	devid |= (reg & 0xF0) >> 4;
2466 
2467 	switch (devid) {
2468 	case CS43130_CHIP_ID:
2469 	case CS4399_CHIP_ID:
2470 	case CS43131_CHIP_ID:
2471 	case CS43198_CHIP_ID:
2472 		break;
2473 	default:
2474 		dev_err(&client->dev,
2475 			"CS43130 Device ID %X. Expected ID %X, %X, %X or %X\n",
2476 			devid, CS43130_CHIP_ID, CS4399_CHIP_ID,
2477 			CS43131_CHIP_ID, CS43198_CHIP_ID);
2478 		ret = -ENODEV;
2479 		goto err;
2480 	}
2481 
2482 	cs43130->dev_id = devid;
2483 	ret = regmap_read(cs43130->regmap, CS43130_REV_ID, &reg);
2484 	if (ret < 0) {
2485 		dev_err(&client->dev, "Get Revision ID failed\n");
2486 		goto err;
2487 	}
2488 
2489 	dev_info(&client->dev,
2490 		 "Cirrus Logic CS43130 (%x), Revision: %02X\n", devid,
2491 		 reg & 0xFF);
2492 
2493 	mutex_init(&cs43130->clk_mutex);
2494 
2495 	init_completion(&cs43130->xtal_rdy);
2496 	init_completion(&cs43130->pll_rdy);
2497 	init_completion(&cs43130->hpload_evt);
2498 
2499 	ret = devm_request_threaded_irq(&client->dev, client->irq,
2500 					NULL, cs43130_irq_thread,
2501 					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
2502 					"cs43130", cs43130);
2503 	if (ret != 0) {
2504 		dev_err(&client->dev, "Failed to request IRQ: %d\n", ret);
2505 		return ret;
2506 	}
2507 
2508 	cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
2509 
2510 	pm_runtime_set_autosuspend_delay(&client->dev, 100);
2511 	pm_runtime_use_autosuspend(&client->dev);
2512 	pm_runtime_set_active(&client->dev);
2513 	pm_runtime_enable(&client->dev);
2514 
2515 	switch (cs43130->dev_id) {
2516 	case CS43130_CHIP_ID:
2517 	case CS43131_CHIP_ID:
2518 		memcpy(all_hp_widgets, digital_hp_widgets,
2519 		       sizeof(digital_hp_widgets));
2520 		memcpy(all_hp_widgets + ARRAY_SIZE(digital_hp_widgets),
2521 		       analog_hp_widgets, sizeof(analog_hp_widgets));
2522 		memcpy(all_hp_routes, digital_hp_routes,
2523 		       sizeof(digital_hp_routes));
2524 		memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes),
2525 		       analog_hp_routes, sizeof(analog_hp_routes));
2526 
2527 		soc_codec_dev_cs43130.component_driver.dapm_widgets =
2528 			all_hp_widgets;
2529 		soc_codec_dev_cs43130.component_driver.num_dapm_widgets =
2530 			ARRAY_SIZE(all_hp_widgets);
2531 		soc_codec_dev_cs43130.component_driver.dapm_routes =
2532 			all_hp_routes;
2533 		soc_codec_dev_cs43130.component_driver.num_dapm_routes =
2534 			ARRAY_SIZE(all_hp_routes);
2535 		break;
2536 	case CS43198_CHIP_ID:
2537 	case CS4399_CHIP_ID:
2538 		soc_codec_dev_cs43130.component_driver.dapm_widgets =
2539 			digital_hp_widgets;
2540 		soc_codec_dev_cs43130.component_driver.num_dapm_widgets =
2541 			ARRAY_SIZE(digital_hp_widgets);
2542 		soc_codec_dev_cs43130.component_driver.dapm_routes =
2543 			digital_hp_routes;
2544 		soc_codec_dev_cs43130.component_driver.num_dapm_routes =
2545 			ARRAY_SIZE(digital_hp_routes);
2546 	}
2547 
2548 	ret = snd_soc_register_codec(&client->dev, &soc_codec_dev_cs43130,
2549 				     cs43130_dai, ARRAY_SIZE(cs43130_dai));
2550 	if (ret < 0) {
2551 		dev_err(&client->dev,
2552 			"snd_soc_register_codec failed with ret = %d\n", ret);
2553 		goto err;
2554 	}
2555 
2556 	regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2557 			   CS43130_ASP_3ST_MASK, 0);
2558 	regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2559 			   CS43130_XSP_3ST_MASK, 0);
2560 
2561 	return 0;
2562 err:
2563 	return ret;
2564 }
2565 
2566 static int cs43130_i2c_remove(struct i2c_client *client)
2567 {
2568 	struct cs43130_private *cs43130 = i2c_get_clientdata(client);
2569 
2570 	if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2571 		regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2572 				   CS43130_XTAL_ERR_INT,
2573 				   1 << CS43130_XTAL_ERR_INT_SHIFT);
2574 
2575 	regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2576 			   CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT,
2577 			   CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT);
2578 
2579 	if (cs43130->dc_meas) {
2580 		cancel_work_sync(&cs43130->work);
2581 		flush_workqueue(cs43130->wq);
2582 
2583 		device_remove_file(&client->dev, &dev_attr_hpload_dc_l);
2584 		device_remove_file(&client->dev, &dev_attr_hpload_dc_r);
2585 		device_remove_file(&client->dev, &dev_attr_hpload_ac_l);
2586 		device_remove_file(&client->dev, &dev_attr_hpload_ac_r);
2587 	}
2588 
2589 	if (cs43130->reset_gpio)
2590 		gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2591 
2592 	pm_runtime_disable(&client->dev);
2593 	regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2594 
2595 	snd_soc_unregister_codec(&client->dev);
2596 
2597 	return 0;
2598 }
2599 
2600 static int __maybe_unused cs43130_runtime_suspend(struct device *dev)
2601 {
2602 	struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2603 
2604 	if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2605 		regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2606 				   CS43130_XTAL_ERR_INT,
2607 				   1 << CS43130_XTAL_ERR_INT_SHIFT);
2608 
2609 	regcache_cache_only(cs43130->regmap, true);
2610 	regcache_mark_dirty(cs43130->regmap);
2611 
2612 	gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2613 
2614 	regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2615 
2616 	return 0;
2617 }
2618 
2619 static int __maybe_unused cs43130_runtime_resume(struct device *dev)
2620 {
2621 	struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2622 	int ret;
2623 
2624 	ret = regulator_bulk_enable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2625 	if (ret != 0) {
2626 		dev_err(dev, "Failed to enable supplies: %d\n", ret);
2627 		return ret;
2628 	}
2629 
2630 	regcache_cache_only(cs43130->regmap, false);
2631 
2632 	gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2633 
2634 	usleep_range(2000, 2050);
2635 
2636 	ret = regcache_sync(cs43130->regmap);
2637 	if (ret != 0) {
2638 		dev_err(dev, "Failed to restore register cache\n");
2639 		goto err;
2640 	}
2641 
2642 	if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2643 		regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2644 				   CS43130_XTAL_ERR_INT, 0);
2645 
2646 	return 0;
2647 err:
2648 	regcache_cache_only(cs43130->regmap, true);
2649 	regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2650 
2651 	return ret;
2652 }
2653 
2654 static const struct dev_pm_ops cs43130_runtime_pm = {
2655 	SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume,
2656 			   NULL)
2657 };
2658 
2659 static const struct of_device_id cs43130_of_match[] = {
2660 	{.compatible = "cirrus,cs43130",},
2661 	{.compatible = "cirrus,cs4399",},
2662 	{.compatible = "cirrus,cs43131",},
2663 	{.compatible = "cirrus,cs43198",},
2664 	{},
2665 };
2666 
2667 MODULE_DEVICE_TABLE(of, cs43130_of_match);
2668 
2669 static const struct i2c_device_id cs43130_i2c_id[] = {
2670 	{"cs43130", 0},
2671 	{"cs4399", 0},
2672 	{"cs43131", 0},
2673 	{"cs43198", 0},
2674 	{}
2675 };
2676 
2677 MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id);
2678 
2679 static struct i2c_driver cs43130_i2c_driver = {
2680 	.driver = {
2681 		.name		= "cs43130",
2682 		.of_match_table	= cs43130_of_match,
2683 		.pm             = &cs43130_runtime_pm,
2684 	},
2685 	.id_table	= cs43130_i2c_id,
2686 	.probe		= cs43130_i2c_probe,
2687 	.remove		= cs43130_i2c_remove,
2688 };
2689 
2690 module_i2c_driver(cs43130_i2c_driver);
2691 
2692 MODULE_AUTHOR("Li Xu <li.xu@cirrus.com>");
2693 MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver");
2694 MODULE_LICENSE("GPL");
2695