xref: /openbmc/linux/sound/soc/codecs/cs42l43.c (revision 236a9bf2)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // CS42L43 CODEC driver
4 //
5 // Copyright (C) 2022-2023 Cirrus Logic, Inc. and
6 //                         Cirrus Logic International Semiconductor Ltd.
7 
8 #include <linux/bitops.h>
9 #include <linux/err.h>
10 #include <linux/errno.h>
11 #include <linux/gcd.h>
12 #include <linux/irq.h>
13 #include <linux/jiffies.h>
14 #include <linux/mfd/cs42l43.h>
15 #include <linux/mfd/cs42l43-regs.h>
16 #include <linux/module.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/string.h>
19 #include <sound/control.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/soc-component.h>
23 #include <sound/soc-dapm.h>
24 #include <sound/soc-dai.h>
25 #include <sound/soc.h>
26 #include <sound/tlv.h>
27 
28 #include "cs42l43.h"
29 
30 #define CS42L43_DECL_MUX(name, reg) \
31 static SOC_VALUE_ENUM_SINGLE_DECL(cs42l43_##name##_enum, reg, \
32 				  0, CS42L43_MIXER_SRC_MASK, \
33 				  cs42l43_mixer_texts, cs42l43_mixer_values); \
34 static const struct snd_kcontrol_new cs42l43_##name##_mux = \
35 		SOC_DAPM_ENUM("Route", cs42l43_##name##_enum)
36 
37 #define CS42L43_DECL_MIXER(name, reg) \
38 	CS42L43_DECL_MUX(name##_in1, reg); \
39 	CS42L43_DECL_MUX(name##_in2, reg + 0x4); \
40 	CS42L43_DECL_MUX(name##_in3, reg + 0x8); \
41 	CS42L43_DECL_MUX(name##_in4, reg + 0xC)
42 
43 #define CS42L43_DAPM_MUX(name_str, name) \
44 	SND_SOC_DAPM_MUX(name_str " Input", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_mux)
45 
46 #define CS42L43_DAPM_MIXER(name_str, name) \
47 	SND_SOC_DAPM_MUX(name_str " Input 1", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in1_mux), \
48 	SND_SOC_DAPM_MUX(name_str " Input 2", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in2_mux), \
49 	SND_SOC_DAPM_MUX(name_str " Input 3", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in3_mux), \
50 	SND_SOC_DAPM_MUX(name_str " Input 4", SND_SOC_NOPM, 0, 0, &cs42l43_##name##_in4_mux), \
51 	SND_SOC_DAPM_MIXER(name_str " Mixer", SND_SOC_NOPM, 0, 0, NULL, 0)
52 
53 #define CS42L43_BASE_ROUTES(name_str) \
54 	{ name_str,		"Tone Generator 1",	"Tone 1" }, \
55 	{ name_str,		"Tone Generator 2",	"Tone 2" }, \
56 	{ name_str,		"Decimator 1",		"Decimator 1" }, \
57 	{ name_str,		"Decimator 2",		"Decimator 2" }, \
58 	{ name_str,		"Decimator 3",		"Decimator 3" }, \
59 	{ name_str,		"Decimator 4",		"Decimator 4" }, \
60 	{ name_str,		"ASPRX1",		"ASPRX1" }, \
61 	{ name_str,		"ASPRX2",		"ASPRX2" }, \
62 	{ name_str,		"ASPRX3",		"ASPRX3" }, \
63 	{ name_str,		"ASPRX4",		"ASPRX4" }, \
64 	{ name_str,		"ASPRX5",		"ASPRX5" }, \
65 	{ name_str,		"ASPRX6",		"ASPRX6" }, \
66 	{ name_str,		"DP5RX1",		"DP5RX1" }, \
67 	{ name_str,		"DP5RX2",		"DP5RX2" }, \
68 	{ name_str,		"DP6RX1",		"DP6RX1" }, \
69 	{ name_str,		"DP6RX2",		"DP6RX2" }, \
70 	{ name_str,		"DP7RX1",		"DP7RX1" }, \
71 	{ name_str,		"DP7RX2",		"DP7RX2" }, \
72 	{ name_str,		"ASRC INT1",		"ASRC_INT1" }, \
73 	{ name_str,		"ASRC INT2",		"ASRC_INT2" }, \
74 	{ name_str,		"ASRC INT3",		"ASRC_INT3" }, \
75 	{ name_str,		"ASRC INT4",		"ASRC_INT4" }, \
76 	{ name_str,		"ASRC DEC1",		"ASRC_DEC1" }, \
77 	{ name_str,		"ASRC DEC2",		"ASRC_DEC2" }, \
78 	{ name_str,		"ASRC DEC3",		"ASRC_DEC3" }, \
79 	{ name_str,		"ASRC DEC4",		"ASRC_DEC4" }, \
80 	{ name_str,		"ISRC1 INT1",		"ISRC1INT1" }, \
81 	{ name_str,		"ISRC1 INT2",		"ISRC1INT2" }, \
82 	{ name_str,		"ISRC1 DEC1",		"ISRC1DEC1" }, \
83 	{ name_str,		"ISRC1 DEC2",		"ISRC1DEC2" }, \
84 	{ name_str,		"ISRC2 INT1",		"ISRC2INT1" }, \
85 	{ name_str,		"ISRC2 INT2",		"ISRC2INT2" }, \
86 	{ name_str,		"ISRC2 DEC1",		"ISRC2DEC1" }, \
87 	{ name_str,		"ISRC2 DEC2",		"ISRC2DEC2" }, \
88 	{ name_str,		"EQ1",			"EQ" }, \
89 	{ name_str,		"EQ2",			"EQ" }
90 
91 #define CS42L43_MUX_ROUTES(name_str, widget) \
92 	{ widget,		NULL,			name_str " Input" }, \
93 	{ name_str " Input",	NULL,			"Mixer Core" }, \
94 	CS42L43_BASE_ROUTES(name_str " Input")
95 
96 #define CS42L43_MIXER_ROUTES(name_str, widget) \
97 	{ name_str " Mixer",	NULL,			name_str " Input 1" }, \
98 	{ name_str " Mixer",	NULL,			name_str " Input 2" }, \
99 	{ name_str " Mixer",	NULL,			name_str " Input 3" }, \
100 	{ name_str " Mixer",	NULL,			name_str " Input 4" }, \
101 	{ widget,		NULL,			name_str " Mixer" }, \
102 	{ name_str " Mixer",	NULL,			"Mixer Core" }, \
103 	CS42L43_BASE_ROUTES(name_str " Input 1"), \
104 	CS42L43_BASE_ROUTES(name_str " Input 2"), \
105 	CS42L43_BASE_ROUTES(name_str " Input 3"), \
106 	CS42L43_BASE_ROUTES(name_str " Input 4")
107 
108 #define CS42L43_MIXER_VOLUMES(name_str, base) \
109 	SOC_SINGLE_RANGE_TLV(name_str " Input 1 Volume", base, \
110 			     CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
111 			     cs42l43_mixer_tlv), \
112 	SOC_SINGLE_RANGE_TLV(name_str " Input 2 Volume", base + 4, \
113 			     CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
114 			     cs42l43_mixer_tlv), \
115 	SOC_SINGLE_RANGE_TLV(name_str " Input 3 Volume", base + 8, \
116 			     CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
117 			     cs42l43_mixer_tlv), \
118 	SOC_SINGLE_RANGE_TLV(name_str " Input 4 Volume", base + 12, \
119 			     CS42L43_MIXER_VOL_SHIFT, 0x20, 0x50, 0, \
120 			     cs42l43_mixer_tlv)
121 
122 #define CS42L43_IRQ_ERROR(name) \
123 static irqreturn_t cs42l43_##name(int irq, void *data) \
124 { \
125 	struct cs42l43_codec *priv = data; \
126 	dev_err(priv->dev, "Error " #name " IRQ\n"); \
127 	return IRQ_HANDLED; \
128 }
129 
130 CS42L43_IRQ_ERROR(pll_lost_lock)
131 CS42L43_IRQ_ERROR(spkr_clock_stop)
132 CS42L43_IRQ_ERROR(spkl_clock_stop)
133 CS42L43_IRQ_ERROR(spkr_brown_out)
134 CS42L43_IRQ_ERROR(spkl_brown_out)
135 CS42L43_IRQ_ERROR(spkr_therm_shutdown)
136 CS42L43_IRQ_ERROR(spkl_therm_shutdown)
137 CS42L43_IRQ_ERROR(spkr_therm_warm)
138 CS42L43_IRQ_ERROR(spkl_therm_warm)
139 CS42L43_IRQ_ERROR(spkr_sc_detect)
140 CS42L43_IRQ_ERROR(spkl_sc_detect)
141 CS42L43_IRQ_ERROR(hp_ilimit)
142 
143 #define CS42L43_IRQ_COMPLETE(name) \
144 static irqreturn_t cs42l43_##name(int irq, void *data) \
145 { \
146 	struct cs42l43_codec *priv = data; \
147 	dev_dbg(priv->dev, #name " completed\n"); \
148 	complete(&priv->name); \
149 	return IRQ_HANDLED; \
150 }
151 
152 CS42L43_IRQ_COMPLETE(pll_ready)
153 CS42L43_IRQ_COMPLETE(hp_startup)
154 CS42L43_IRQ_COMPLETE(hp_shutdown)
155 CS42L43_IRQ_COMPLETE(type_detect)
156 CS42L43_IRQ_COMPLETE(spkr_shutdown)
157 CS42L43_IRQ_COMPLETE(spkl_shutdown)
158 CS42L43_IRQ_COMPLETE(spkr_startup)
159 CS42L43_IRQ_COMPLETE(spkl_startup)
160 CS42L43_IRQ_COMPLETE(load_detect)
161 
162 static irqreturn_t cs42l43_mic_shutter(int irq, void *data)
163 {
164 	struct cs42l43_codec *priv = data;
165 	const char * const controls[] = {
166 		"Decimator 1 Switch",
167 		"Decimator 2 Switch",
168 		"Decimator 3 Switch",
169 		"Decimator 4 Switch",
170 	};
171 	int i, ret;
172 
173 	dev_dbg(priv->dev, "Microphone shutter changed\n");
174 
175 	if (!priv->component)
176 		return IRQ_NONE;
177 
178 	for (i = 0; i < ARRAY_SIZE(controls); i++) {
179 		ret = snd_soc_component_notify_control(priv->component,
180 						       controls[i]);
181 		if (ret)
182 			return IRQ_NONE;
183 	}
184 
185 	return IRQ_HANDLED;
186 }
187 
188 static irqreturn_t cs42l43_spk_shutter(int irq, void *data)
189 {
190 	struct cs42l43_codec *priv = data;
191 	int ret;
192 
193 	dev_dbg(priv->dev, "Speaker shutter changed\n");
194 
195 	if (!priv->component)
196 		return IRQ_NONE;
197 
198 	ret = snd_soc_component_notify_control(priv->component,
199 					       "Speaker Digital Switch");
200 	if (ret)
201 		return IRQ_NONE;
202 
203 	return IRQ_HANDLED;
204 }
205 
206 static const unsigned int cs42l43_sample_rates[] = {
207 	8000, 16000, 24000, 32000, 44100, 48000, 96000, 192000,
208 };
209 
210 #define CS42L43_CONSUMER_RATE_MASK 0xFF
211 #define CS42L43_PROVIDER_RATE_MASK 0xEF // 44.1k only supported as consumer
212 
213 static const struct snd_pcm_hw_constraint_list cs42l43_constraint = {
214 	.count		= ARRAY_SIZE(cs42l43_sample_rates),
215 	.list		= cs42l43_sample_rates,
216 };
217 
218 static int cs42l43_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
219 {
220 	struct snd_soc_component *component = dai->component;
221 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
222 	struct cs42l43 *cs42l43 = priv->core;
223 	int provider = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
224 					  CS42L43_ASP_MASTER_MODE_MASK);
225 
226 	if (provider)
227 		priv->constraint.mask = CS42L43_PROVIDER_RATE_MASK;
228 	else
229 		priv->constraint.mask = CS42L43_CONSUMER_RATE_MASK;
230 
231 	return snd_pcm_hw_constraint_list(substream->runtime, 0,
232 					  SNDRV_PCM_HW_PARAM_RATE,
233 					  &priv->constraint);
234 }
235 
236 static int cs42l43_convert_sample_rate(unsigned int rate)
237 {
238 	switch (rate) {
239 	case 8000:
240 		return 0x11;
241 	case 16000:
242 		return 0x12;
243 	case 24000:
244 		return 0x02;
245 	case 32000:
246 		return 0x13;
247 	case 44100:
248 		return 0x0B;
249 	case 48000:
250 		return 0x03;
251 	case 96000:
252 		return 0x04;
253 	case 192000:
254 		return 0x05;
255 	default:
256 		return -EINVAL;
257 	}
258 }
259 
260 static int cs42l43_set_sample_rate(struct snd_pcm_substream *substream,
261 				   struct snd_pcm_hw_params *params,
262 				   struct snd_soc_dai *dai)
263 {
264 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(dai->component);
265 	struct cs42l43 *cs42l43 = priv->core;
266 	int ret;
267 
268 	ret = cs42l43_convert_sample_rate(params_rate(params));
269 	if (ret < 0) {
270 		dev_err(priv->dev, "Failed to convert sample rate: %d\n", ret);
271 		return ret;
272 	}
273 
274 	//FIXME: For now lets just set sample rate 1, this needs expanded in the future
275 	regmap_update_bits(cs42l43->regmap, CS42L43_SAMPLE_RATE1,
276 			   CS42L43_SAMPLE_RATE_MASK, ret);
277 
278 	return 0;
279 }
280 
281 static int cs42l43_asp_hw_params(struct snd_pcm_substream *substream,
282 				 struct snd_pcm_hw_params *params,
283 				 struct snd_soc_dai *dai)
284 {
285 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(dai->component);
286 	struct cs42l43 *cs42l43 = priv->core;
287 	int dsp_mode = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CTRL,
288 					  CS42L43_ASP_FSYNC_MODE_MASK);
289 	int provider = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
290 					  CS42L43_ASP_MASTER_MODE_MASK);
291 	int n_chans = params_channels(params);
292 	int data_width = params_width(params);
293 	int n_slots = n_chans;
294 	int slot_width = data_width;
295 	int frame, bclk_target, i;
296 	unsigned int reg;
297 	int *slots;
298 
299 	if (priv->n_slots) {
300 		n_slots = priv->n_slots;
301 		slot_width = priv->slot_width;
302 	}
303 
304 	if (!dsp_mode && (n_slots & 0x1)) {
305 		dev_dbg(priv->dev, "Forcing balanced channels on ASP\n");
306 		n_slots++;
307 	}
308 
309 	frame = n_slots * slot_width;
310 	bclk_target = params_rate(params) * frame;
311 
312 	if (provider) {
313 		unsigned int gcd_nm = gcd(bclk_target, CS42L43_INTERNAL_SYSCLK);
314 		int n = bclk_target / gcd_nm;
315 		int m = CS42L43_INTERNAL_SYSCLK / gcd_nm;
316 
317 		if (n > (CS42L43_ASP_BCLK_N_MASK >> CS42L43_ASP_BCLK_N_SHIFT) ||
318 		    m > CS42L43_ASP_BCLK_M_MASK) {
319 			dev_err(priv->dev, "Can't produce %dHz bclk\n", bclk_target);
320 			return -EINVAL;
321 		}
322 
323 		dev_dbg(priv->dev, "bclk %d/%d = %dHz, with %dx%d frame\n",
324 			n, m, bclk_target, n_slots, slot_width);
325 
326 		regmap_update_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG1,
327 				   CS42L43_ASP_BCLK_N_MASK | CS42L43_ASP_BCLK_M_MASK,
328 				   n << CS42L43_ASP_BCLK_N_SHIFT |
329 				   m << CS42L43_ASP_BCLK_M_SHIFT);
330 		regmap_update_bits(cs42l43->regmap, CS42L43_ASP_FSYNC_CTRL1,
331 				   CS42L43_ASP_FSYNC_M_MASK, frame);
332 	}
333 
334 	regmap_update_bits(cs42l43->regmap, CS42L43_ASP_FSYNC_CTRL4,
335 			   CS42L43_ASP_NUM_BCLKS_PER_FSYNC_MASK,
336 			   frame << CS42L43_ASP_NUM_BCLKS_PER_FSYNC_SHIFT);
337 
338 	if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
339 		reg = CS42L43_ASP_TX_CH1_CTRL;
340 		slots = priv->tx_slots;
341 	} else {
342 		reg = CS42L43_ASP_RX_CH1_CTRL;
343 		slots = priv->rx_slots;
344 	}
345 
346 	for (i = 0; i < n_chans; i++, reg += 4) {
347 		int slot_phase = dsp_mode | (i & CS42L43_ASP_CH_SLOT_PHASE_MASK);
348 		int slot_pos;
349 
350 		if (dsp_mode)
351 			slot_pos = slots[i] * slot_width;
352 		else
353 			slot_pos = (slots[i] / 2) * slot_width;
354 
355 		dev_dbg(priv->dev, "Configure channel %d at slot %d (%d,%d)\n",
356 			i, slots[i], slot_pos, slot_phase);
357 
358 		regmap_update_bits(cs42l43->regmap, reg,
359 				   CS42L43_ASP_CH_WIDTH_MASK |
360 				   CS42L43_ASP_CH_SLOT_MASK |
361 				   CS42L43_ASP_CH_SLOT_PHASE_MASK,
362 				   ((data_width - 1) << CS42L43_ASP_CH_WIDTH_SHIFT) |
363 				   (slot_pos << CS42L43_ASP_CH_SLOT_SHIFT) |
364 				   slot_phase);
365 	}
366 
367 	return cs42l43_set_sample_rate(substream, params, dai);
368 }
369 
370 static int cs42l43_asp_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
371 {
372 	struct snd_soc_component *component = dai->component;
373 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
374 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
375 	struct cs42l43 *cs42l43 = priv->core;
376 	int provider = regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
377 					CS42L43_ASP_MASTER_MODE_MASK);
378 	struct snd_soc_dapm_route routes[] = {
379 		{ "BCLK", NULL, "FSYNC" },
380 	};
381 	unsigned int asp_ctrl = 0;
382 	unsigned int data_ctrl = 0;
383 	unsigned int fsync_ctrl = 0;
384 	unsigned int clk_config = 0;
385 
386 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
387 	case SND_SOC_DAIFMT_DSP_A:
388 		data_ctrl |= 2 << CS42L43_ASP_FSYNC_FRAME_START_DLY_SHIFT;
389 		fallthrough;
390 	case SND_SOC_DAIFMT_DSP_B:
391 		asp_ctrl |= CS42L43_ASP_FSYNC_MODE_MASK;
392 		data_ctrl |= CS42L43_ASP_FSYNC_FRAME_START_PHASE_MASK;
393 		break;
394 	case SND_SOC_DAIFMT_I2S:
395 		data_ctrl |= 2 << CS42L43_ASP_FSYNC_FRAME_START_DLY_SHIFT;
396 		break;
397 	case SND_SOC_DAIFMT_LEFT_J:
398 		data_ctrl |= CS42L43_ASP_FSYNC_FRAME_START_PHASE_MASK;
399 		break;
400 	default:
401 		dev_err(priv->dev, "Unsupported DAI format 0x%x\n",
402 			fmt & SND_SOC_DAIFMT_FORMAT_MASK);
403 		return -EINVAL;
404 	}
405 
406 	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
407 	case SND_SOC_DAIFMT_CBC_CFC:
408 		if (provider)
409 			snd_soc_dapm_del_routes(dapm, routes, ARRAY_SIZE(routes));
410 		break;
411 	case SND_SOC_DAIFMT_CBP_CFP:
412 		if (!provider)
413 			snd_soc_dapm_add_routes(dapm, routes, ARRAY_SIZE(routes));
414 		clk_config |= CS42L43_ASP_MASTER_MODE_MASK;
415 		break;
416 	default:
417 		dev_err(priv->dev, "Unsupported ASP mode 0x%x\n",
418 			fmt & SND_SOC_DAIFMT_MASTER_MASK);
419 		return -EINVAL;
420 	}
421 
422 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
423 	case SND_SOC_DAIFMT_NB_NF:
424 		clk_config |= CS42L43_ASP_BCLK_INV_MASK; /* Yes BCLK_INV = NB */
425 		break;
426 	case SND_SOC_DAIFMT_IB_NF:
427 		break;
428 	case SND_SOC_DAIFMT_NB_IF:
429 		clk_config |= CS42L43_ASP_BCLK_INV_MASK;
430 		fsync_ctrl |= CS42L43_ASP_FSYNC_IN_INV_MASK |
431 			      CS42L43_ASP_FSYNC_OUT_INV_MASK;
432 		break;
433 	case SND_SOC_DAIFMT_IB_IF:
434 		fsync_ctrl |= CS42L43_ASP_FSYNC_IN_INV_MASK |
435 			      CS42L43_ASP_FSYNC_OUT_INV_MASK;
436 		break;
437 	default:
438 		dev_err(priv->dev, "Unsupported invert mode 0x%x\n",
439 			fmt & SND_SOC_DAIFMT_INV_MASK);
440 		return -EINVAL;
441 	}
442 
443 	regmap_update_bits(cs42l43->regmap, CS42L43_ASP_CTRL,
444 			   CS42L43_ASP_FSYNC_MODE_MASK,
445 			   asp_ctrl);
446 	regmap_update_bits(cs42l43->regmap, CS42L43_ASP_DATA_CTRL,
447 			   CS42L43_ASP_FSYNC_FRAME_START_DLY_MASK |
448 			   CS42L43_ASP_FSYNC_FRAME_START_PHASE_MASK,
449 			   data_ctrl);
450 	regmap_update_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
451 			   CS42L43_ASP_MASTER_MODE_MASK |
452 			   CS42L43_ASP_BCLK_INV_MASK,
453 			   clk_config);
454 	regmap_update_bits(cs42l43->regmap, CS42L43_ASP_FSYNC_CTRL3,
455 			   CS42L43_ASP_FSYNC_IN_INV_MASK |
456 			   CS42L43_ASP_FSYNC_OUT_INV_MASK,
457 			   fsync_ctrl);
458 
459 	return 0;
460 }
461 
462 static void cs42l43_mask_to_slots(struct cs42l43_codec *priv, unsigned int mask, int *slots)
463 {
464 	int i;
465 
466 	for (i = 0; i < CS42L43_ASP_MAX_CHANNELS; ++i) {
467 		int slot = ffs(mask) - 1;
468 
469 		if (slot < 0)
470 			return;
471 
472 		slots[i] = slot;
473 
474 		mask &= ~(1 << slot);
475 	}
476 
477 	if (mask)
478 		dev_warn(priv->dev, "Too many channels in TDM mask\n");
479 }
480 
481 static int cs42l43_asp_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
482 				    unsigned int rx_mask, int slots, int slot_width)
483 {
484 	struct snd_soc_component *component = dai->component;
485 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
486 
487 	priv->n_slots = slots;
488 	priv->slot_width = slot_width;
489 
490 	if (!slots) {
491 		tx_mask = CS42L43_DEFAULT_SLOTS;
492 		rx_mask = CS42L43_DEFAULT_SLOTS;
493 	}
494 
495 	cs42l43_mask_to_slots(priv, tx_mask, priv->tx_slots);
496 	cs42l43_mask_to_slots(priv, rx_mask, priv->rx_slots);
497 
498 	return 0;
499 }
500 
501 static const struct snd_soc_dai_ops cs42l43_asp_ops = {
502 	.startup	= cs42l43_startup,
503 	.hw_params	= cs42l43_asp_hw_params,
504 	.set_fmt	= cs42l43_asp_set_fmt,
505 	.set_tdm_slot	= cs42l43_asp_set_tdm_slot,
506 };
507 
508 static int cs42l43_sdw_hw_params(struct snd_pcm_substream *substream,
509 				 struct snd_pcm_hw_params *params,
510 				 struct snd_soc_dai *dai)
511 {
512 	int ret;
513 
514 	ret = cs42l43_sdw_add_peripheral(substream, params, dai);
515 	if (ret)
516 		return ret;
517 
518 	return cs42l43_set_sample_rate(substream, params, dai);
519 };
520 
521 static const struct snd_soc_dai_ops cs42l43_sdw_ops = {
522 	.startup	= cs42l43_startup,
523 	.set_stream	= cs42l43_sdw_set_stream,
524 	.hw_params	= cs42l43_sdw_hw_params,
525 	.hw_free	= cs42l43_sdw_remove_peripheral,
526 };
527 
528 #define CS42L43_ASP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
529 			     SNDRV_PCM_FMTBIT_S32_LE)
530 #define CS42L43_SDW_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
531 
532 static struct snd_soc_dai_driver cs42l43_dais[] = {
533 	{
534 		.name			= "cs42l43-asp",
535 		.ops			= &cs42l43_asp_ops,
536 		.symmetric_rate		= 1,
537 		.capture = {
538 			.stream_name	= "ASP Capture",
539 			.channels_min	= 1,
540 			.channels_max	= CS42L43_ASP_MAX_CHANNELS,
541 			.rates		= SNDRV_PCM_RATE_KNOT,
542 			.formats	= CS42L43_ASP_FORMATS,
543 		},
544 		.playback = {
545 			.stream_name	= "ASP Playback",
546 			.channels_min	= 1,
547 			.channels_max	= CS42L43_ASP_MAX_CHANNELS,
548 			.rates		= SNDRV_PCM_RATE_KNOT,
549 			.formats	= CS42L43_ASP_FORMATS,
550 		},
551 	},
552 	{
553 		.name			= "cs42l43-dp1",
554 		.id			= 1,
555 		.ops			= &cs42l43_sdw_ops,
556 		.capture = {
557 			.stream_name	= "DP1 Capture",
558 			.channels_min	= 1,
559 			.channels_max	= 4,
560 			.rates		= SNDRV_PCM_RATE_KNOT,
561 			.formats	= CS42L43_SDW_FORMATS,
562 		},
563 	},
564 	{
565 		.name			= "cs42l43-dp2",
566 		.id			= 2,
567 		.ops			= &cs42l43_sdw_ops,
568 		.capture = {
569 			.stream_name	= "DP2 Capture",
570 			.channels_min	= 1,
571 			.channels_max	= 2,
572 			.rates		= SNDRV_PCM_RATE_KNOT,
573 			.formats	= CS42L43_SDW_FORMATS,
574 		},
575 	},
576 	{
577 		.name			= "cs42l43-dp3",
578 		.id			= 3,
579 		.ops			= &cs42l43_sdw_ops,
580 		.capture = {
581 			.stream_name	= "DP3 Capture",
582 			.channels_min	= 1,
583 			.channels_max	= 2,
584 			.rates		= SNDRV_PCM_RATE_KNOT,
585 			.formats	= CS42L43_SDW_FORMATS,
586 		},
587 	},
588 	{
589 		.name			= "cs42l43-dp4",
590 		.id			= 4,
591 		.ops			= &cs42l43_sdw_ops,
592 		.capture = {
593 			.stream_name	= "DP4 Capture",
594 			.channels_min	= 1,
595 			.channels_max	= 2,
596 			.rates		= SNDRV_PCM_RATE_KNOT,
597 			.formats	= CS42L43_SDW_FORMATS,
598 		},
599 	},
600 	{
601 		.name			= "cs42l43-dp5",
602 		.id			= 5,
603 		.ops			= &cs42l43_sdw_ops,
604 		.playback = {
605 			.stream_name	= "DP5 Playback",
606 			.channels_min	= 1,
607 			.channels_max	= 2,
608 			.rates		= SNDRV_PCM_RATE_KNOT,
609 			.formats	= CS42L43_SDW_FORMATS,
610 		},
611 	},
612 	{
613 		.name			= "cs42l43-dp6",
614 		.id			= 6,
615 		.ops			= &cs42l43_sdw_ops,
616 		.playback = {
617 			.stream_name	= "DP6 Playback",
618 			.channels_min	= 1,
619 			.channels_max	= 2,
620 			.rates		= SNDRV_PCM_RATE_KNOT,
621 			.formats	= CS42L43_SDW_FORMATS,
622 		},
623 	},
624 	{
625 		.name			= "cs42l43-dp7",
626 		.id			= 7,
627 		.ops			= &cs42l43_sdw_ops,
628 		.playback = {
629 			.stream_name	= "DP7 Playback",
630 			.channels_min	= 1,
631 			.channels_max	= 2,
632 			.rates		= SNDRV_PCM_RATE_KNOT,
633 			.formats	= CS42L43_SDW_FORMATS,
634 		},
635 	},
636 };
637 
638 static const DECLARE_TLV_DB_SCALE(cs42l43_mixer_tlv, -3200, 100, 0);
639 
640 static const char * const cs42l43_ramp_text[] = {
641 	"0ms/6dB", "0.5ms/6dB", "1ms/6dB", "2ms/6dB", "4ms/6dB", "8ms/6dB",
642 	"15ms/6dB", "30ms/6dB",
643 };
644 
645 static const char * const cs42l43_adc1_input_text[] = { "IN1", "IN2" };
646 
647 static SOC_ENUM_SINGLE_DECL(cs42l43_adc1_input, CS42L43_ADC_B_CTRL1,
648 			    CS42L43_ADC_AIN_SEL_SHIFT,
649 			    cs42l43_adc1_input_text);
650 
651 static const struct snd_kcontrol_new cs42l43_adc1_input_ctl =
652 	SOC_DAPM_ENUM("ADC1 Input", cs42l43_adc1_input);
653 
654 static const char * const cs42l43_dec_mode_text[] = { "ADC", "PDM" };
655 
656 static SOC_ENUM_SINGLE_VIRT_DECL(cs42l43_dec1_mode, cs42l43_dec_mode_text);
657 static SOC_ENUM_SINGLE_VIRT_DECL(cs42l43_dec2_mode, cs42l43_dec_mode_text);
658 
659 static const struct snd_kcontrol_new cs42l43_dec_mode_ctl[] = {
660 	SOC_DAPM_ENUM("Decimator 1 Mode", cs42l43_dec1_mode),
661 	SOC_DAPM_ENUM("Decimator 2 Mode", cs42l43_dec2_mode),
662 };
663 
664 static const char * const cs42l43_pdm_clk_text[] = {
665 	"3.072MHz", "1.536MHz", "768kHz",
666 };
667 
668 static SOC_ENUM_SINGLE_DECL(cs42l43_pdm1_clk, CS42L43_PDM_CONTROL,
669 			    CS42L43_PDM1_CLK_DIV_SHIFT, cs42l43_pdm_clk_text);
670 static SOC_ENUM_SINGLE_DECL(cs42l43_pdm2_clk, CS42L43_PDM_CONTROL,
671 			    CS42L43_PDM2_CLK_DIV_SHIFT, cs42l43_pdm_clk_text);
672 
673 static DECLARE_TLV_DB_SCALE(cs42l43_adc_tlv, -600, 600, 0);
674 static DECLARE_TLV_DB_SCALE(cs42l43_dec_tlv, -6400, 50, 0);
675 
676 static const char * const cs42l43_wnf_corner_text[] = {
677 	"160Hz", "180Hz", "200Hz", "220Hz", "240Hz", "260Hz", "280Hz", "300Hz",
678 };
679 
680 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL1,
681 			    CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
682 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL2,
683 			    CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
684 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL3,
685 			    CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
686 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_wnf_corner, CS42L43_DECIM_HPF_WNF_CTRL4,
687 			    CS42L43_DECIM_WNF_CF_SHIFT, cs42l43_wnf_corner_text);
688 
689 static const char * const cs42l43_hpf_corner_text[] = {
690 	"3Hz", "12Hz", "48Hz", "96Hz",
691 };
692 
693 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL1,
694 			    CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
695 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL2,
696 			    CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
697 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL3,
698 			    CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
699 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_hpf_corner, CS42L43_DECIM_HPF_WNF_CTRL4,
700 			    CS42L43_DECIM_HPF_CF_SHIFT, cs42l43_hpf_corner_text);
701 
702 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_ramp_up, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
703 			    CS42L43_DECIM1_VI_RAMP_SHIFT, cs42l43_ramp_text);
704 static SOC_ENUM_SINGLE_DECL(cs42l43_dec1_ramp_down, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
705 			    CS42L43_DECIM1_VD_RAMP_SHIFT, cs42l43_ramp_text);
706 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_ramp_up, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
707 			    CS42L43_DECIM2_VI_RAMP_SHIFT, cs42l43_ramp_text);
708 static SOC_ENUM_SINGLE_DECL(cs42l43_dec2_ramp_down, CS42L43_DECIM_VOL_CTRL_CH1_CH2,
709 			    CS42L43_DECIM2_VD_RAMP_SHIFT, cs42l43_ramp_text);
710 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_ramp_up, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
711 			    CS42L43_DECIM3_VI_RAMP_SHIFT, cs42l43_ramp_text);
712 static SOC_ENUM_SINGLE_DECL(cs42l43_dec3_ramp_down, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
713 			    CS42L43_DECIM3_VD_RAMP_SHIFT, cs42l43_ramp_text);
714 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_ramp_up, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
715 			    CS42L43_DECIM4_VI_RAMP_SHIFT, cs42l43_ramp_text);
716 static SOC_ENUM_SINGLE_DECL(cs42l43_dec4_ramp_down, CS42L43_DECIM_VOL_CTRL_CH3_CH4,
717 			    CS42L43_DECIM4_VD_RAMP_SHIFT, cs42l43_ramp_text);
718 
719 static DECLARE_TLV_DB_SCALE(cs42l43_speaker_tlv, -6400, 50, 0);
720 
721 static SOC_ENUM_SINGLE_DECL(cs42l43_speaker_ramp_up, CS42L43_AMP1_2_VOL_RAMP,
722 			    CS42L43_AMP1_2_VI_RAMP_SHIFT, cs42l43_ramp_text);
723 
724 static SOC_ENUM_SINGLE_DECL(cs42l43_speaker_ramp_down, CS42L43_AMP1_2_VOL_RAMP,
725 			    CS42L43_AMP1_2_VD_RAMP_SHIFT, cs42l43_ramp_text);
726 
727 static DECLARE_TLV_DB_SCALE(cs42l43_headphone_tlv, -11450, 50, 1);
728 
729 static const char * const cs42l43_headphone_ramp_text[] = {
730 	"1", "2", "4", "6", "8", "11", "12", "16", "22", "24", "33", "36", "44",
731 	"48", "66", "72",
732 };
733 
734 static SOC_ENUM_SINGLE_DECL(cs42l43_headphone_ramp, CS42L43_PGAVOL,
735 			    CS42L43_HP_PATH_VOL_RAMP_SHIFT,
736 			    cs42l43_headphone_ramp_text);
737 
738 static const char * const cs42l43_tone_freq_text[] = {
739 	"1kHz", "2kHz", "4kHz", "6kHz", "8kHz",
740 };
741 
742 static SOC_ENUM_SINGLE_DECL(cs42l43_tone1_freq, CS42L43_TONE_CH1_CTRL,
743 			    CS42L43_TONE_FREQ_SHIFT, cs42l43_tone_freq_text);
744 
745 static SOC_ENUM_SINGLE_DECL(cs42l43_tone2_freq, CS42L43_TONE_CH2_CTRL,
746 			    CS42L43_TONE_FREQ_SHIFT, cs42l43_tone_freq_text);
747 
748 static const char * const cs42l43_mixer_texts[] = {
749 	"None",
750 	"Tone Generator 1", "Tone Generator 2",
751 	"Decimator 1", "Decimator 2", "Decimator 3", "Decimator 4",
752 	"ASPRX1", "ASPRX2", "ASPRX3", "ASPRX4", "ASPRX5", "ASPRX6",
753 	"DP5RX1", "DP5RX2", "DP6RX1", "DP6RX2", "DP7RX1", "DP7RX2",
754 	"ASRC INT1", "ASRC INT2", "ASRC INT3", "ASRC INT4",
755 	"ASRC DEC1", "ASRC DEC2", "ASRC DEC3", "ASRC DEC4",
756 	"ISRC1 INT1", "ISRC1 INT2",
757 	"ISRC1 DEC1", "ISRC1 DEC2",
758 	"ISRC2 INT1", "ISRC2 INT2",
759 	"ISRC2 DEC1", "ISRC2 DEC2",
760 	"EQ1", "EQ2",
761 };
762 
763 static const unsigned int cs42l43_mixer_values[] = {
764 	0x00, // None
765 	0x04, 0x05, // Tone Generator 1, 2
766 	0x10, 0x11, 0x12, 0x13, // Decimator 1, 2, 3, 4
767 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, // ASPRX1,2,3,4,5,6
768 	0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, // DP5, 6, 7RX1, 2
769 	0x40, 0x41, 0x42, 0x43, // ASRC INT1, 2, 3, 4
770 	0x44, 0x45, 0x46, 0x47, // ASRC DEC1, 2, 3, 4
771 	0x50, 0x51, // ISRC1 INT1, 2
772 	0x52, 0x53, // ISRC1 DEC1, 2
773 	0x54, 0x55, // ISRC2 INT1, 2
774 	0x56, 0x57, // ISRC2 DEC1, 2
775 	0x58, 0x59, // EQ1, 2
776 };
777 
778 CS42L43_DECL_MUX(asptx1, CS42L43_ASPTX1_INPUT);
779 CS42L43_DECL_MUX(asptx2, CS42L43_ASPTX2_INPUT);
780 CS42L43_DECL_MUX(asptx3, CS42L43_ASPTX3_INPUT);
781 CS42L43_DECL_MUX(asptx4, CS42L43_ASPTX4_INPUT);
782 CS42L43_DECL_MUX(asptx5, CS42L43_ASPTX5_INPUT);
783 CS42L43_DECL_MUX(asptx6, CS42L43_ASPTX6_INPUT);
784 
785 CS42L43_DECL_MUX(dp1tx1, CS42L43_SWIRE_DP1_CH1_INPUT);
786 CS42L43_DECL_MUX(dp1tx2, CS42L43_SWIRE_DP1_CH2_INPUT);
787 CS42L43_DECL_MUX(dp1tx3, CS42L43_SWIRE_DP1_CH3_INPUT);
788 CS42L43_DECL_MUX(dp1tx4, CS42L43_SWIRE_DP1_CH4_INPUT);
789 CS42L43_DECL_MUX(dp2tx1, CS42L43_SWIRE_DP2_CH1_INPUT);
790 CS42L43_DECL_MUX(dp2tx2, CS42L43_SWIRE_DP2_CH2_INPUT);
791 CS42L43_DECL_MUX(dp3tx1, CS42L43_SWIRE_DP3_CH1_INPUT);
792 CS42L43_DECL_MUX(dp3tx2, CS42L43_SWIRE_DP3_CH2_INPUT);
793 CS42L43_DECL_MUX(dp4tx1, CS42L43_SWIRE_DP4_CH1_INPUT);
794 CS42L43_DECL_MUX(dp4tx2, CS42L43_SWIRE_DP4_CH2_INPUT);
795 
796 CS42L43_DECL_MUX(asrcint1, CS42L43_ASRC_INT1_INPUT1);
797 CS42L43_DECL_MUX(asrcint2, CS42L43_ASRC_INT2_INPUT1);
798 CS42L43_DECL_MUX(asrcint3, CS42L43_ASRC_INT3_INPUT1);
799 CS42L43_DECL_MUX(asrcint4, CS42L43_ASRC_INT4_INPUT1);
800 CS42L43_DECL_MUX(asrcdec1, CS42L43_ASRC_DEC1_INPUT1);
801 CS42L43_DECL_MUX(asrcdec2, CS42L43_ASRC_DEC2_INPUT1);
802 CS42L43_DECL_MUX(asrcdec3, CS42L43_ASRC_DEC3_INPUT1);
803 CS42L43_DECL_MUX(asrcdec4, CS42L43_ASRC_DEC4_INPUT1);
804 
805 CS42L43_DECL_MUX(isrc1int1, CS42L43_ISRC1INT1_INPUT1);
806 CS42L43_DECL_MUX(isrc1int2, CS42L43_ISRC1INT2_INPUT1);
807 CS42L43_DECL_MUX(isrc1dec1, CS42L43_ISRC1DEC1_INPUT1);
808 CS42L43_DECL_MUX(isrc1dec2, CS42L43_ISRC1DEC2_INPUT1);
809 CS42L43_DECL_MUX(isrc2int1, CS42L43_ISRC2INT1_INPUT1);
810 CS42L43_DECL_MUX(isrc2int2, CS42L43_ISRC2INT2_INPUT1);
811 CS42L43_DECL_MUX(isrc2dec1, CS42L43_ISRC2DEC1_INPUT1);
812 CS42L43_DECL_MUX(isrc2dec2, CS42L43_ISRC2DEC2_INPUT1);
813 
814 CS42L43_DECL_MUX(spdif1, CS42L43_SPDIF1_INPUT1);
815 CS42L43_DECL_MUX(spdif2, CS42L43_SPDIF2_INPUT1);
816 
817 CS42L43_DECL_MIXER(eq1, CS42L43_EQ1MIX_INPUT1);
818 CS42L43_DECL_MIXER(eq2, CS42L43_EQ2MIX_INPUT1);
819 
820 CS42L43_DECL_MIXER(amp1, CS42L43_AMP1MIX_INPUT1);
821 CS42L43_DECL_MIXER(amp2, CS42L43_AMP2MIX_INPUT1);
822 
823 CS42L43_DECL_MIXER(amp3, CS42L43_AMP3MIX_INPUT1);
824 CS42L43_DECL_MIXER(amp4, CS42L43_AMP4MIX_INPUT1);
825 
826 static int cs42l43_dapm_get_volsw(struct snd_kcontrol *kcontrol,
827 				  struct snd_ctl_elem_value *ucontrol)
828 {
829 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
830 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
831 	int ret;
832 
833 	snd_soc_dapm_mutex_lock(dapm);
834 	ret = snd_soc_get_volsw(kcontrol, ucontrol);
835 	snd_soc_dapm_mutex_unlock(dapm);
836 
837 	return ret;
838 }
839 
840 static int cs42l43_dapm_put_volsw(struct snd_kcontrol *kcontrol,
841 				  struct snd_ctl_elem_value *ucontrol)
842 {
843 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
844 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
845 	int ret;
846 
847 	snd_soc_dapm_mutex_lock(dapm);
848 	ret = snd_soc_put_volsw(kcontrol, ucontrol);
849 	snd_soc_dapm_mutex_unlock(dapm);
850 
851 	return ret;
852 }
853 
854 static int cs42l43_dapm_get_enum(struct snd_kcontrol *kcontrol,
855 				 struct snd_ctl_elem_value *ucontrol)
856 {
857 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
858 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
859 	int ret;
860 
861 	snd_soc_dapm_mutex_lock(dapm);
862 	ret = snd_soc_get_enum_double(kcontrol, ucontrol);
863 	snd_soc_dapm_mutex_unlock(dapm);
864 
865 	return ret;
866 }
867 
868 static int cs42l43_dapm_put_enum(struct snd_kcontrol *kcontrol,
869 				 struct snd_ctl_elem_value *ucontrol)
870 {
871 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
872 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
873 	int ret;
874 
875 	snd_soc_dapm_mutex_lock(dapm);
876 	ret = snd_soc_put_enum_double(kcontrol, ucontrol);
877 	snd_soc_dapm_mutex_unlock(dapm);
878 
879 	return ret;
880 }
881 
882 static int cs42l43_eq_get(struct snd_kcontrol *kcontrol,
883 			  struct snd_ctl_elem_value *ucontrol)
884 {
885 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
886 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
887 
888 	memcpy(ucontrol->value.integer.value, priv->eq_coeffs, sizeof(priv->eq_coeffs));
889 
890 	return 0;
891 }
892 
893 static int cs42l43_eq_put(struct snd_kcontrol *kcontrol,
894 			  struct snd_ctl_elem_value *ucontrol)
895 {
896 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
897 	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
898 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
899 
900 	snd_soc_dapm_mutex_lock(dapm);
901 
902 	memcpy(priv->eq_coeffs, ucontrol->value.integer.value, sizeof(priv->eq_coeffs));
903 
904 	snd_soc_dapm_mutex_unlock(dapm);
905 
906 	return 0;
907 }
908 
909 static void cs42l43_spk_vu_sync(struct cs42l43_codec *priv)
910 {
911 	struct cs42l43 *cs42l43 = priv->core;
912 
913 	mutex_lock(&priv->spk_vu_lock);
914 
915 	regmap_update_bits(cs42l43->regmap, CS42L43_INTP_VOLUME_CTRL1,
916 			   CS42L43_AMP1_2_VU_MASK, CS42L43_AMP1_2_VU_MASK);
917 	regmap_update_bits(cs42l43->regmap, CS42L43_INTP_VOLUME_CTRL1,
918 			   CS42L43_AMP1_2_VU_MASK, 0);
919 
920 	mutex_unlock(&priv->spk_vu_lock);
921 }
922 
923 static int cs42l43_shutter_get(struct cs42l43_codec *priv, unsigned int shift)
924 {
925 	struct cs42l43 *cs42l43 = priv->core;
926 	unsigned int val;
927 	int ret;
928 
929 	ret = pm_runtime_resume_and_get(priv->dev);
930 	if (ret) {
931 		dev_err(priv->dev, "Failed to resume for shutters: %d\n", ret);
932 		return ret;
933 	}
934 
935 	/*
936 	 * SHUTTER_CONTROL is a mix of volatile and non-volatile bits, so must
937 	 * be cached for the non-volatiles, so drop it from the cache here so
938 	 * we force a read.
939 	 */
940 	ret = regcache_drop_region(cs42l43->regmap, CS42L43_SHUTTER_CONTROL,
941 				   CS42L43_SHUTTER_CONTROL);
942 	if (ret) {
943 		dev_err(priv->dev, "Failed to drop shutter from cache: %d\n", ret);
944 		goto error;
945 	}
946 
947 	ret = regmap_read(cs42l43->regmap, CS42L43_SHUTTER_CONTROL, &val);
948 	if (ret) {
949 		dev_err(priv->dev, "Failed to check shutter status: %d\n", ret);
950 		goto error;
951 	}
952 
953 	ret = !(val & BIT(shift));
954 
955 	dev_dbg(priv->dev, "%s shutter is %s\n",
956 		BIT(shift) == CS42L43_STATUS_MIC_SHUTTER_MUTE_MASK ? "Mic" : "Speaker",
957 		ret ? "open" : "closed");
958 
959 error:
960 	pm_runtime_mark_last_busy(priv->dev);
961 	pm_runtime_put_autosuspend(priv->dev);
962 
963 	return ret;
964 }
965 
966 static int cs42l43_decim_get(struct snd_kcontrol *kcontrol,
967 			     struct snd_ctl_elem_value *ucontrol)
968 {
969 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
970 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
971 	int ret;
972 
973 	ret = cs42l43_shutter_get(priv, CS42L43_STATUS_MIC_SHUTTER_MUTE_SHIFT);
974 	if (ret < 0)
975 		return ret;
976 	else if (!ret)
977 		ucontrol->value.integer.value[0] = ret;
978 	else
979 		ret = cs42l43_dapm_get_volsw(kcontrol, ucontrol);
980 
981 	return ret;
982 }
983 
984 static int cs42l43_spk_get(struct snd_kcontrol *kcontrol,
985 			   struct snd_ctl_elem_value *ucontrol)
986 {
987 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
988 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
989 	int ret;
990 
991 	ret = cs42l43_shutter_get(priv, CS42L43_STATUS_SPK_SHUTTER_MUTE_SHIFT);
992 	if (ret < 0)
993 		return ret;
994 	else if (!ret)
995 		ucontrol->value.integer.value[0] = ret;
996 	else
997 		ret = snd_soc_get_volsw(kcontrol, ucontrol);
998 
999 	return ret;
1000 }
1001 
1002 static int cs42l43_spk_put(struct snd_kcontrol *kcontrol,
1003 			   struct snd_ctl_elem_value *ucontrol)
1004 {
1005 	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1006 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1007 	int ret;
1008 
1009 	ret = snd_soc_put_volsw(kcontrol, ucontrol);
1010 	if (ret > 0)
1011 		cs42l43_spk_vu_sync(priv);
1012 
1013 	return ret;
1014 }
1015 
1016 static const struct snd_kcontrol_new cs42l43_controls[] = {
1017 	SOC_ENUM_EXT("Jack Override", cs42l43_jack_enum,
1018 		     cs42l43_jack_get, cs42l43_jack_put),
1019 
1020 	SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L43_ADC_B_CTRL1, CS42L43_ADC_B_CTRL2,
1021 			    CS42L43_ADC_PGA_GAIN_SHIFT,
1022 			    0xF, 5, cs42l43_adc_tlv),
1023 
1024 	SOC_DOUBLE("PDM1 Invert Switch", CS42L43_DMIC_PDM_CTRL,
1025 		   CS42L43_PDM1L_INV_SHIFT, CS42L43_PDM1R_INV_SHIFT, 1, 0),
1026 	SOC_DOUBLE("PDM2 Invert Switch", CS42L43_DMIC_PDM_CTRL,
1027 		   CS42L43_PDM2L_INV_SHIFT, CS42L43_PDM2R_INV_SHIFT, 1, 0),
1028 	SOC_ENUM("PDM1 Clock", cs42l43_pdm1_clk),
1029 	SOC_ENUM("PDM2 Clock", cs42l43_pdm2_clk),
1030 
1031 	SOC_SINGLE("Decimator 1 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL1,
1032 		   CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1033 	SOC_SINGLE("Decimator 2 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL2,
1034 		   CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1035 	SOC_SINGLE("Decimator 3 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL3,
1036 		   CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1037 	SOC_SINGLE("Decimator 4 WNF Switch", CS42L43_DECIM_HPF_WNF_CTRL4,
1038 		   CS42L43_DECIM_WNF_EN_SHIFT, 1, 0),
1039 
1040 	SOC_ENUM("Decimator 1 WNF Corner Frequency", cs42l43_dec1_wnf_corner),
1041 	SOC_ENUM("Decimator 2 WNF Corner Frequency", cs42l43_dec2_wnf_corner),
1042 	SOC_ENUM("Decimator 3 WNF Corner Frequency", cs42l43_dec3_wnf_corner),
1043 	SOC_ENUM("Decimator 4 WNF Corner Frequency", cs42l43_dec4_wnf_corner),
1044 
1045 	SOC_SINGLE("Decimator 1 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL1,
1046 		   CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1047 	SOC_SINGLE("Decimator 2 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL2,
1048 		   CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1049 	SOC_SINGLE("Decimator 3 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL3,
1050 		   CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1051 	SOC_SINGLE("Decimator 4 HPF Switch", CS42L43_DECIM_HPF_WNF_CTRL4,
1052 		   CS42L43_DECIM_HPF_EN_SHIFT, 1, 0),
1053 
1054 	SOC_ENUM("Decimator 1 HPF Corner Frequency", cs42l43_dec1_hpf_corner),
1055 	SOC_ENUM("Decimator 2 HPF Corner Frequency", cs42l43_dec2_hpf_corner),
1056 	SOC_ENUM("Decimator 3 HPF Corner Frequency", cs42l43_dec3_hpf_corner),
1057 	SOC_ENUM("Decimator 4 HPF Corner Frequency", cs42l43_dec4_hpf_corner),
1058 
1059 	SOC_SINGLE_TLV("Decimator 1 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1060 		       CS42L43_DECIM1_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1061 	SOC_SINGLE_EXT("Decimator 1 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1062 		       CS42L43_DECIM1_MUTE_SHIFT, 1, 1,
1063 		       cs42l43_decim_get, cs42l43_dapm_put_volsw),
1064 	SOC_SINGLE_TLV("Decimator 2 Volume", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1065 		       CS42L43_DECIM2_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1066 	SOC_SINGLE_EXT("Decimator 2 Switch", CS42L43_DECIM_VOL_CTRL_CH1_CH2,
1067 		       CS42L43_DECIM2_MUTE_SHIFT, 1, 1,
1068 		       cs42l43_decim_get, cs42l43_dapm_put_volsw),
1069 	SOC_SINGLE_TLV("Decimator 3 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1070 		       CS42L43_DECIM3_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1071 	SOC_SINGLE_EXT("Decimator 3 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1072 		       CS42L43_DECIM3_MUTE_SHIFT, 1, 1,
1073 		       cs42l43_decim_get, cs42l43_dapm_put_volsw),
1074 	SOC_SINGLE_TLV("Decimator 4 Volume", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1075 		       CS42L43_DECIM4_VOL_SHIFT, 0xBF, 0, cs42l43_dec_tlv),
1076 	SOC_SINGLE_EXT("Decimator 4 Switch", CS42L43_DECIM_VOL_CTRL_CH3_CH4,
1077 		       CS42L43_DECIM4_MUTE_SHIFT, 1, 1,
1078 		       cs42l43_decim_get, cs42l43_dapm_put_volsw),
1079 
1080 	SOC_ENUM_EXT("Decimator 1 Ramp Up", cs42l43_dec1_ramp_up,
1081 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1082 	SOC_ENUM_EXT("Decimator 1 Ramp Down", cs42l43_dec1_ramp_down,
1083 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1084 	SOC_ENUM_EXT("Decimator 2 Ramp Up", cs42l43_dec2_ramp_up,
1085 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1086 	SOC_ENUM_EXT("Decimator 2 Ramp Down", cs42l43_dec2_ramp_down,
1087 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1088 	SOC_ENUM_EXT("Decimator 3 Ramp Up", cs42l43_dec3_ramp_up,
1089 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1090 	SOC_ENUM_EXT("Decimator 3 Ramp Down", cs42l43_dec3_ramp_down,
1091 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1092 	SOC_ENUM_EXT("Decimator 4 Ramp Up", cs42l43_dec4_ramp_up,
1093 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1094 	SOC_ENUM_EXT("Decimator 4 Ramp Down", cs42l43_dec4_ramp_down,
1095 		     cs42l43_dapm_get_enum, cs42l43_dapm_put_enum),
1096 
1097 	SOC_DOUBLE_R_EXT("Speaker Digital Switch",
1098 			 CS42L43_INTP_VOLUME_CTRL1, CS42L43_INTP_VOLUME_CTRL2,
1099 			 CS42L43_AMP_MUTE_SHIFT, 1, 1,
1100 			 cs42l43_spk_get, cs42l43_spk_put),
1101 
1102 	SOC_DOUBLE_R_EXT_TLV("Speaker Digital Volume",
1103 			     CS42L43_INTP_VOLUME_CTRL1, CS42L43_INTP_VOLUME_CTRL2,
1104 			     CS42L43_AMP_VOL_SHIFT,
1105 			     0xBF, 0, snd_soc_get_volsw, cs42l43_spk_put,
1106 			     cs42l43_speaker_tlv),
1107 
1108 	SOC_ENUM("Speaker Ramp Up", cs42l43_speaker_ramp_up),
1109 	SOC_ENUM("Speaker Ramp Down", cs42l43_speaker_ramp_down),
1110 
1111 	CS42L43_MIXER_VOLUMES("Speaker L", CS42L43_AMP1MIX_INPUT1),
1112 	CS42L43_MIXER_VOLUMES("Speaker R", CS42L43_AMP2MIX_INPUT1),
1113 
1114 	SOC_DOUBLE_SX_TLV("Headphone Digital Volume", CS42L43_HPPATHVOL,
1115 			  CS42L43_AMP3_PATH_VOL_SHIFT, CS42L43_AMP4_PATH_VOL_SHIFT,
1116 			  0x11B, 229, cs42l43_headphone_tlv),
1117 
1118 	SOC_DOUBLE("Headphone Invert Switch", CS42L43_DACCNFG1,
1119 		   CS42L43_AMP3_INV_SHIFT, CS42L43_AMP4_INV_SHIFT, 1, 0),
1120 
1121 	SOC_SINGLE("Headphone Zero Cross Switch", CS42L43_PGAVOL,
1122 		   CS42L43_HP_PATH_VOL_ZC_SHIFT, 1, 0),
1123 	SOC_SINGLE("Headphone Ramp Switch", CS42L43_PGAVOL,
1124 		   CS42L43_HP_PATH_VOL_SFT_SHIFT, 1, 0),
1125 	SOC_ENUM("Headphone Ramp Rate", cs42l43_headphone_ramp),
1126 
1127 	CS42L43_MIXER_VOLUMES("Headphone L", CS42L43_AMP3MIX_INPUT1),
1128 	CS42L43_MIXER_VOLUMES("Headphone R", CS42L43_AMP4MIX_INPUT1),
1129 
1130 	SOC_ENUM("Tone 1 Frequency", cs42l43_tone1_freq),
1131 	SOC_ENUM("Tone 2 Frequency", cs42l43_tone2_freq),
1132 
1133 	SOC_DOUBLE_EXT("EQ Switch",
1134 		       CS42L43_MUTE_EQ_IN0, CS42L43_MUTE_EQ_CH1_SHIFT,
1135 		       CS42L43_MUTE_EQ_CH2_SHIFT, 1, 1,
1136 		       cs42l43_dapm_get_volsw, cs42l43_dapm_put_volsw),
1137 
1138 	SND_SOC_BYTES_E("EQ Coefficients", 0, CS42L43_N_EQ_COEFFS,
1139 			cs42l43_eq_get, cs42l43_eq_put),
1140 
1141 	CS42L43_MIXER_VOLUMES("EQ1", CS42L43_EQ1MIX_INPUT1),
1142 	CS42L43_MIXER_VOLUMES("EQ2", CS42L43_EQ2MIX_INPUT1),
1143 };
1144 
1145 static int cs42l43_eq_ev(struct snd_soc_dapm_widget *w,
1146 			 struct snd_kcontrol *kcontrol, int event)
1147 {
1148 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1149 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1150 	struct cs42l43 *cs42l43 = priv->core;
1151 	unsigned int val;
1152 	int i, ret;
1153 
1154 	switch (event) {
1155 	case SND_SOC_DAPM_PRE_PMU:
1156 		regmap_update_bits(cs42l43->regmap, CS42L43_MUTE_EQ_IN0,
1157 				   CS42L43_MUTE_EQ_CH1_MASK | CS42L43_MUTE_EQ_CH2_MASK,
1158 				   CS42L43_MUTE_EQ_CH1_MASK | CS42L43_MUTE_EQ_CH2_MASK);
1159 
1160 		regmap_update_bits(cs42l43->regmap, CS42L43_COEFF_RD_WR0,
1161 				   CS42L43_WRITE_MODE_MASK, CS42L43_WRITE_MODE_MASK);
1162 
1163 		for (i = 0; i < CS42L43_N_EQ_COEFFS; i++)
1164 			regmap_write(cs42l43->regmap, CS42L43_COEFF_DATA_IN0,
1165 				     priv->eq_coeffs[i]);
1166 
1167 		regmap_update_bits(cs42l43->regmap, CS42L43_COEFF_RD_WR0,
1168 				   CS42L43_WRITE_MODE_MASK, 0);
1169 
1170 		return 0;
1171 	case SND_SOC_DAPM_POST_PMU:
1172 		ret = regmap_read_poll_timeout(cs42l43->regmap, CS42L43_INIT_DONE0,
1173 					       val, (val & CS42L43_INITIALIZE_DONE_MASK),
1174 					       2000, 10000);
1175 		if (ret)
1176 			dev_err(priv->dev, "Failed to start EQs: %d\n", ret);
1177 
1178 		regmap_update_bits(cs42l43->regmap, CS42L43_MUTE_EQ_IN0,
1179 				   CS42L43_MUTE_EQ_CH1_MASK | CS42L43_MUTE_EQ_CH2_MASK, 0);
1180 		return ret;
1181 	default:
1182 		return 0;
1183 	}
1184 }
1185 
1186 struct cs42l43_pll_config {
1187 	unsigned int freq;
1188 
1189 	unsigned int div;
1190 	unsigned int mode;
1191 	unsigned int cal;
1192 };
1193 
1194 static const struct cs42l43_pll_config cs42l43_pll_configs[] = {
1195 	{ 2400000, 0x50000000, 0x1, 0xA4 },
1196 	{ 3000000, 0x40000000, 0x1, 0x83 },
1197 	{ 3072000, 0x40000000, 0x3, 0x80 },
1198 };
1199 
1200 static int cs42l43_set_pll(struct cs42l43_codec *priv, unsigned int src,
1201 			   unsigned int freq)
1202 {
1203 	struct cs42l43 *cs42l43 = priv->core;
1204 
1205 	lockdep_assert_held(&cs42l43->pll_lock);
1206 
1207 	if (priv->refclk_src == src && priv->refclk_freq == freq)
1208 		return 0;
1209 
1210 	if (regmap_test_bits(cs42l43->regmap, CS42L43_CTRL_REG, CS42L43_PLL_EN_MASK)) {
1211 		dev_err(priv->dev, "PLL active, can't change configuration\n");
1212 		return -EBUSY;
1213 	}
1214 
1215 	switch (src) {
1216 	case CS42L43_SYSCLK_MCLK:
1217 	case CS42L43_SYSCLK_SDW:
1218 		dev_dbg(priv->dev, "Source PLL from %s at %uHz\n",
1219 			src ? "SoundWire" : "MCLK", freq);
1220 
1221 		priv->refclk_src = src;
1222 		priv->refclk_freq = freq;
1223 
1224 		return 0;
1225 	default:
1226 		dev_err(priv->dev, "Invalid PLL source: 0x%x\n", src);
1227 		return -EINVAL;
1228 	}
1229 }
1230 
1231 static int cs42l43_enable_pll(struct cs42l43_codec *priv)
1232 {
1233 	static const struct reg_sequence enable_seq[] = {
1234 		{ CS42L43_OSC_DIV_SEL, 0x0, },
1235 		{ CS42L43_MCLK_SRC_SEL, CS42L43_OSC_PLL_MCLK_SEL_MASK, 5, },
1236 	};
1237 	struct cs42l43 *cs42l43 = priv->core;
1238 	const struct cs42l43_pll_config *config = NULL;
1239 	unsigned int div = 0;
1240 	unsigned int freq = priv->refclk_freq;
1241 	unsigned long time_left;
1242 
1243 	lockdep_assert_held(&cs42l43->pll_lock);
1244 
1245 	if (priv->refclk_src == CS42L43_SYSCLK_SDW) {
1246 		if (!freq)
1247 			freq = cs42l43->sdw_freq;
1248 		else if (!cs42l43->sdw_freq)
1249 			cs42l43->sdw_freq = freq;
1250 	}
1251 
1252 	dev_dbg(priv->dev, "Enabling PLL at %uHz\n", freq);
1253 
1254 	while (freq > cs42l43_pll_configs[ARRAY_SIZE(cs42l43_pll_configs) - 1].freq) {
1255 		div++;
1256 		freq /= 2;
1257 	}
1258 
1259 	if (div <= CS42L43_PLL_REFCLK_DIV_MASK) {
1260 		int i;
1261 
1262 		for (i = 0; i < ARRAY_SIZE(cs42l43_pll_configs); i++) {
1263 			if (freq == cs42l43_pll_configs[i].freq) {
1264 				config = &cs42l43_pll_configs[i];
1265 				break;
1266 			}
1267 		}
1268 	}
1269 
1270 	if (!config) {
1271 		dev_err(priv->dev, "No suitable PLL config: 0x%x, %uHz\n", div, freq);
1272 		return -EINVAL;
1273 	}
1274 
1275 	regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1276 			   CS42L43_PLL_REFCLK_DIV_MASK | CS42L43_PLL_REFCLK_SRC_MASK,
1277 			   div << CS42L43_PLL_REFCLK_DIV_SHIFT |
1278 			   priv->refclk_src << CS42L43_PLL_REFCLK_SRC_SHIFT);
1279 	regmap_write(cs42l43->regmap, CS42L43_FDIV_FRAC, config->div);
1280 	regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG,
1281 			   CS42L43_PLL_MODE_BYPASS_500_MASK |
1282 			   CS42L43_PLL_MODE_BYPASS_1029_MASK,
1283 			   config->mode << CS42L43_PLL_MODE_BYPASS_1029_SHIFT);
1284 	regmap_update_bits(cs42l43->regmap, CS42L43_CAL_RATIO,
1285 			   CS42L43_PLL_CAL_RATIO_MASK, config->cal);
1286 	regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1287 			   CS42L43_PLL_REFCLK_EN_MASK, CS42L43_PLL_REFCLK_EN_MASK);
1288 
1289 	reinit_completion(&priv->pll_ready);
1290 
1291 	regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG,
1292 			   CS42L43_PLL_EN_MASK, CS42L43_PLL_EN_MASK);
1293 
1294 	time_left = wait_for_completion_timeout(&priv->pll_ready,
1295 						msecs_to_jiffies(CS42L43_PLL_TIMEOUT_MS));
1296 	if (!time_left) {
1297 		regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG,
1298 				   CS42L43_PLL_EN_MASK, 0);
1299 		regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1300 				   CS42L43_PLL_REFCLK_EN_MASK, 0);
1301 
1302 		dev_err(priv->dev, "Timeout out waiting for PLL\n");
1303 		return -ETIMEDOUT;
1304 	}
1305 
1306 	if (priv->refclk_src == CS42L43_SYSCLK_SDW)
1307 		cs42l43->sdw_pll_active = true;
1308 
1309 	dev_dbg(priv->dev, "PLL locked in %ums\n", 200 - jiffies_to_msecs(time_left));
1310 
1311 	/*
1312 	 * Reads are not allowed over Soundwire without OSC_DIV2_EN or the PLL,
1313 	 * but you can not change to PLL with OSC_DIV2_EN set. So ensure the whole
1314 	 * change over happens under the regmap lock to prevent any reads.
1315 	 */
1316 	regmap_multi_reg_write(cs42l43->regmap, enable_seq, ARRAY_SIZE(enable_seq));
1317 
1318 	return 0;
1319 }
1320 
1321 static int cs42l43_disable_pll(struct cs42l43_codec *priv)
1322 {
1323 	static const struct reg_sequence disable_seq[] = {
1324 		{ CS42L43_MCLK_SRC_SEL, 0x0, 5, },
1325 		{ CS42L43_OSC_DIV_SEL, CS42L43_OSC_DIV2_EN_MASK, },
1326 	};
1327 	struct cs42l43 *cs42l43 = priv->core;
1328 
1329 	dev_dbg(priv->dev, "Disabling PLL\n");
1330 
1331 	lockdep_assert_held(&cs42l43->pll_lock);
1332 
1333 	regmap_multi_reg_write(cs42l43->regmap, disable_seq, ARRAY_SIZE(disable_seq));
1334 	regmap_update_bits(cs42l43->regmap, CS42L43_CTRL_REG, CS42L43_PLL_EN_MASK, 0);
1335 	regmap_update_bits(cs42l43->regmap, CS42L43_PLL_CONTROL,
1336 			   CS42L43_PLL_REFCLK_EN_MASK, 0);
1337 
1338 	cs42l43->sdw_pll_active = false;
1339 
1340 	return 0;
1341 }
1342 
1343 static int cs42l43_pll_ev(struct snd_soc_dapm_widget *w,
1344 			  struct snd_kcontrol *kcontrol, int event)
1345 {
1346 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1347 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1348 	struct cs42l43 *cs42l43 = priv->core;
1349 	int ret;
1350 
1351 	mutex_lock(&cs42l43->pll_lock);
1352 
1353 	switch (event) {
1354 	case SND_SOC_DAPM_PRE_PMU:
1355 		if (priv->refclk_src == CS42L43_SYSCLK_MCLK) {
1356 			ret = clk_prepare_enable(priv->mclk);
1357 			if (ret) {
1358 				dev_err(priv->dev, "Failed to enable MCLK: %d\n", ret);
1359 				break;
1360 			}
1361 		}
1362 
1363 		ret = cs42l43_enable_pll(priv);
1364 		break;
1365 	case SND_SOC_DAPM_POST_PMD:
1366 		ret = cs42l43_disable_pll(priv);
1367 
1368 		if (priv->refclk_src == CS42L43_SYSCLK_MCLK)
1369 			clk_disable_unprepare(priv->mclk);
1370 		break;
1371 	default:
1372 		ret = 0;
1373 		break;
1374 	}
1375 
1376 	mutex_unlock(&cs42l43->pll_lock);
1377 
1378 	return ret;
1379 }
1380 
1381 static int cs42l43_dapm_wait_completion(struct completion *pmu, struct completion *pmd,
1382 					int event, int timeout_ms)
1383 {
1384 	unsigned long time_left;
1385 
1386 	switch (event) {
1387 	case SND_SOC_DAPM_PRE_PMU:
1388 		reinit_completion(pmu);
1389 		return 0;
1390 	case SND_SOC_DAPM_PRE_PMD:
1391 		reinit_completion(pmd);
1392 		return 0;
1393 	case SND_SOC_DAPM_POST_PMU:
1394 		time_left = wait_for_completion_timeout(pmu, msecs_to_jiffies(timeout_ms));
1395 		break;
1396 	case SND_SOC_DAPM_POST_PMD:
1397 		time_left = wait_for_completion_timeout(pmd, msecs_to_jiffies(timeout_ms));
1398 		break;
1399 	default:
1400 		return 0;
1401 	}
1402 
1403 	if (!time_left)
1404 		return -ETIMEDOUT;
1405 	else
1406 		return 0;
1407 }
1408 
1409 static int cs42l43_spkr_ev(struct snd_soc_dapm_widget *w,
1410 			   struct snd_kcontrol *kcontrol, int event)
1411 {
1412 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1413 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1414 
1415 	return cs42l43_dapm_wait_completion(&priv->spkr_startup,
1416 					    &priv->spkr_shutdown, event,
1417 					    CS42L43_SPK_TIMEOUT_MS);
1418 }
1419 
1420 static int cs42l43_spkl_ev(struct snd_soc_dapm_widget *w,
1421 			   struct snd_kcontrol *kcontrol, int event)
1422 {
1423 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1424 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1425 
1426 	return cs42l43_dapm_wait_completion(&priv->spkl_startup,
1427 					    &priv->spkl_shutdown, event,
1428 					    CS42L43_SPK_TIMEOUT_MS);
1429 }
1430 
1431 static int cs42l43_hp_ev(struct snd_soc_dapm_widget *w,
1432 			 struct snd_kcontrol *kcontrol, int event)
1433 {
1434 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1435 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1436 	struct cs42l43 *cs42l43 = priv->core;
1437 	unsigned int mask = 1 << w->shift;
1438 	unsigned int val = 0;
1439 	int ret;
1440 
1441 	switch (event) {
1442 	case SND_SOC_DAPM_PRE_PMU:
1443 		val = mask;
1444 		fallthrough;
1445 	case SND_SOC_DAPM_PRE_PMD:
1446 		priv->hp_ena &= ~mask;
1447 		priv->hp_ena |= val;
1448 
1449 		ret = cs42l43_dapm_wait_completion(&priv->hp_startup,
1450 						   &priv->hp_shutdown, event,
1451 						   CS42L43_HP_TIMEOUT_MS);
1452 		if (ret)
1453 			return ret;
1454 
1455 		if (!priv->load_detect_running)
1456 			regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN8,
1457 					   mask, val);
1458 		break;
1459 	case SND_SOC_DAPM_POST_PMU:
1460 	case SND_SOC_DAPM_POST_PMD:
1461 		if (priv->load_detect_running)
1462 			break;
1463 
1464 		ret = cs42l43_dapm_wait_completion(&priv->hp_startup,
1465 						   &priv->hp_shutdown, event,
1466 						   CS42L43_HP_TIMEOUT_MS);
1467 		if (ret)
1468 			return ret;
1469 		break;
1470 	default:
1471 		break;
1472 	}
1473 
1474 	return 0;
1475 }
1476 
1477 static int cs42l43_mic_ev(struct snd_soc_dapm_widget *w,
1478 			  struct snd_kcontrol *kcontrol, int event)
1479 {
1480 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1481 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1482 	struct cs42l43 *cs42l43 = priv->core;
1483 	unsigned int reg, ramp, mute;
1484 	unsigned int *val;
1485 	int ret;
1486 
1487 	switch (w->shift) {
1488 	case CS42L43_ADC1_EN_SHIFT:
1489 	case CS42L43_PDM1_DIN_L_EN_SHIFT:
1490 		reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
1491 		ramp = CS42L43_DECIM1_VD_RAMP_MASK;
1492 		mute = CS42L43_DECIM1_MUTE_MASK;
1493 		val = &priv->decim_cache[0];
1494 		break;
1495 	case CS42L43_ADC2_EN_SHIFT:
1496 	case CS42L43_PDM1_DIN_R_EN_SHIFT:
1497 		reg = CS42L43_DECIM_VOL_CTRL_CH1_CH2;
1498 		ramp = CS42L43_DECIM2_VD_RAMP_MASK;
1499 		mute = CS42L43_DECIM2_MUTE_MASK;
1500 		val = &priv->decim_cache[1];
1501 		break;
1502 	case CS42L43_PDM2_DIN_L_EN_SHIFT:
1503 		reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
1504 		ramp  = CS42L43_DECIM3_VD_RAMP_MASK;
1505 		mute = CS42L43_DECIM3_MUTE_MASK;
1506 		val = &priv->decim_cache[2];
1507 		break;
1508 	case CS42L43_PDM2_DIN_R_EN_SHIFT:
1509 		reg = CS42L43_DECIM_VOL_CTRL_CH3_CH4;
1510 		ramp = CS42L43_DECIM4_VD_RAMP_MASK;
1511 		mute = CS42L43_DECIM4_MUTE_MASK;
1512 		val = &priv->decim_cache[3];
1513 		break;
1514 	default:
1515 		dev_err(priv->dev, "Invalid microphone shift: %d\n", w->shift);
1516 		return -EINVAL;
1517 	}
1518 
1519 	switch (event) {
1520 	case SND_SOC_DAPM_PRE_PMU:
1521 		ret = regmap_read(cs42l43->regmap, reg, val);
1522 		if (ret) {
1523 			dev_err(priv->dev,
1524 				"Failed to cache decimator settings: %d\n",
1525 				ret);
1526 			return ret;
1527 		}
1528 
1529 		regmap_update_bits(cs42l43->regmap, reg, mute | ramp, mute);
1530 		break;
1531 	case SND_SOC_DAPM_POST_PMU:
1532 		regmap_update_bits(cs42l43->regmap, reg, mute | ramp, *val);
1533 		break;
1534 	default:
1535 		break;
1536 	}
1537 
1538 	return 0;
1539 }
1540 
1541 static int cs42l43_adc_ev(struct snd_soc_dapm_widget *w,
1542 			  struct snd_kcontrol *kcontrol, int event)
1543 {
1544 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1545 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
1546 	struct cs42l43 *cs42l43 = priv->core;
1547 	unsigned int mask = 1 << w->shift;
1548 	unsigned int val = 0;
1549 	int ret;
1550 
1551 	ret = cs42l43_mic_ev(w, kcontrol, event);
1552 	if (ret)
1553 		return ret;
1554 
1555 	switch (event) {
1556 	case SND_SOC_DAPM_PRE_PMU:
1557 		val = mask;
1558 		fallthrough;
1559 	case SND_SOC_DAPM_PRE_PMD:
1560 		priv->adc_ena &= ~mask;
1561 		priv->adc_ena |= val;
1562 
1563 		if (!priv->load_detect_running)
1564 			regmap_update_bits(cs42l43->regmap, CS42L43_BLOCK_EN3,
1565 					   mask, val);
1566 		fallthrough;
1567 	default:
1568 		return 0;
1569 	}
1570 }
1571 
1572 static const struct snd_soc_dapm_widget cs42l43_widgets[] = {
1573 	SND_SOC_DAPM_SUPPLY("PLL", SND_SOC_NOPM, 0, 0, cs42l43_pll_ev,
1574 			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1575 
1576 	SND_SOC_DAPM_INPUT("ADC1_IN1_P"),
1577 	SND_SOC_DAPM_INPUT("ADC1_IN1_N"),
1578 	SND_SOC_DAPM_INPUT("ADC1_IN2_P"),
1579 	SND_SOC_DAPM_INPUT("ADC1_IN2_N"),
1580 	SND_SOC_DAPM_INPUT("ADC2_IN_P"),
1581 	SND_SOC_DAPM_INPUT("ADC2_IN_N"),
1582 
1583 	SND_SOC_DAPM_INPUT("PDM1_DIN"),
1584 	SND_SOC_DAPM_INPUT("PDM2_DIN"),
1585 
1586 	SND_SOC_DAPM_MUX("ADC1 Input", SND_SOC_NOPM, 0, 0, &cs42l43_adc1_input_ctl),
1587 
1588 	SND_SOC_DAPM_PGA_E("ADC1", SND_SOC_NOPM, CS42L43_ADC1_EN_SHIFT, 0, NULL, 0,
1589 			   cs42l43_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1590 			   SND_SOC_DAPM_PRE_PMD),
1591 	SND_SOC_DAPM_PGA_E("ADC2", SND_SOC_NOPM, CS42L43_ADC2_EN_SHIFT, 0, NULL, 0,
1592 			   cs42l43_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1593 			   SND_SOC_DAPM_PRE_PMD),
1594 
1595 	SND_SOC_DAPM_PGA_E("PDM1L", CS42L43_BLOCK_EN3, CS42L43_PDM1_DIN_L_EN_SHIFT,
1596 			   0, NULL, 0, cs42l43_mic_ev,
1597 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1598 	SND_SOC_DAPM_PGA_E("PDM1R", CS42L43_BLOCK_EN3, CS42L43_PDM1_DIN_R_EN_SHIFT,
1599 			   0, NULL, 0, cs42l43_mic_ev,
1600 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1601 	SND_SOC_DAPM_PGA_E("PDM2L", CS42L43_BLOCK_EN3, CS42L43_PDM2_DIN_L_EN_SHIFT,
1602 			   0, NULL, 0, cs42l43_mic_ev,
1603 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1604 	SND_SOC_DAPM_PGA_E("PDM2R", CS42L43_BLOCK_EN3, CS42L43_PDM2_DIN_R_EN_SHIFT,
1605 			   0, NULL, 0, cs42l43_mic_ev,
1606 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1607 
1608 	SND_SOC_DAPM_MUX("Decimator 1 Mode", SND_SOC_NOPM, 0, 0,
1609 			 &cs42l43_dec_mode_ctl[0]),
1610 	SND_SOC_DAPM_MUX("Decimator 2 Mode", SND_SOC_NOPM, 0, 0,
1611 			 &cs42l43_dec_mode_ctl[1]),
1612 
1613 	SND_SOC_DAPM_PGA("Decimator 1", SND_SOC_NOPM, 0, 0, NULL, 0),
1614 	SND_SOC_DAPM_PGA("Decimator 2", SND_SOC_NOPM, 0, 0, NULL, 0),
1615 	SND_SOC_DAPM_PGA("Decimator 3", SND_SOC_NOPM, 0, 0, NULL, 0),
1616 	SND_SOC_DAPM_PGA("Decimator 4", SND_SOC_NOPM, 0, 0, NULL, 0),
1617 
1618 	SND_SOC_DAPM_SUPPLY_S("FSYNC", 0, CS42L43_ASP_CTRL, CS42L43_ASP_FSYNC_EN_SHIFT,
1619 			      0, NULL, 0),
1620 	SND_SOC_DAPM_SUPPLY_S("BCLK", 1, CS42L43_ASP_CTRL, CS42L43_ASP_BCLK_EN_SHIFT,
1621 			      0, NULL, 0),
1622 
1623 	SND_SOC_DAPM_AIF_OUT("ASPTX1", NULL, 0,
1624 			     CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH1_EN_SHIFT, 0),
1625 	SND_SOC_DAPM_AIF_OUT("ASPTX2", NULL, 1,
1626 			     CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH2_EN_SHIFT, 0),
1627 	SND_SOC_DAPM_AIF_OUT("ASPTX3", NULL, 2,
1628 			     CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH3_EN_SHIFT, 0),
1629 	SND_SOC_DAPM_AIF_OUT("ASPTX4", NULL, 3,
1630 			     CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH4_EN_SHIFT, 0),
1631 	SND_SOC_DAPM_AIF_OUT("ASPTX5", NULL, 4,
1632 			     CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH5_EN_SHIFT, 0),
1633 	SND_SOC_DAPM_AIF_OUT("ASPTX6", NULL, 5,
1634 			     CS42L43_ASP_TX_EN, CS42L43_ASP_TX_CH6_EN_SHIFT, 0),
1635 
1636 	SND_SOC_DAPM_AIF_IN("ASPRX1", NULL, 0,
1637 			    CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH1_EN_SHIFT, 0),
1638 	SND_SOC_DAPM_AIF_IN("ASPRX2", NULL, 1,
1639 			    CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH2_EN_SHIFT, 0),
1640 	SND_SOC_DAPM_AIF_IN("ASPRX3", NULL, 2,
1641 			    CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH3_EN_SHIFT, 0),
1642 	SND_SOC_DAPM_AIF_IN("ASPRX4", NULL, 3,
1643 			    CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH4_EN_SHIFT, 0),
1644 	SND_SOC_DAPM_AIF_IN("ASPRX5", NULL, 4,
1645 			    CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH5_EN_SHIFT, 0),
1646 	SND_SOC_DAPM_AIF_IN("ASPRX6", NULL, 5,
1647 			    CS42L43_ASP_RX_EN, CS42L43_ASP_RX_CH6_EN_SHIFT, 0),
1648 
1649 	SND_SOC_DAPM_AIF_OUT("DP1TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1650 	SND_SOC_DAPM_AIF_OUT("DP1TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1651 	SND_SOC_DAPM_AIF_OUT("DP1TX3", NULL, 2, SND_SOC_NOPM, 0, 0),
1652 	SND_SOC_DAPM_AIF_OUT("DP1TX4", NULL, 3, SND_SOC_NOPM, 0, 0),
1653 
1654 	SND_SOC_DAPM_AIF_OUT("DP2TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1655 	SND_SOC_DAPM_AIF_OUT("DP2TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1656 
1657 	SND_SOC_DAPM_AIF_OUT("DP3TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1658 	SND_SOC_DAPM_AIF_OUT("DP3TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1659 
1660 	SND_SOC_DAPM_AIF_OUT("DP4TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1661 	SND_SOC_DAPM_AIF_OUT("DP4TX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1662 
1663 	SND_SOC_DAPM_AIF_IN("DP5RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1664 	SND_SOC_DAPM_AIF_IN("DP5RX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1665 
1666 	SND_SOC_DAPM_AIF_IN("DP6RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1667 	SND_SOC_DAPM_AIF_IN("DP6RX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1668 
1669 	SND_SOC_DAPM_AIF_IN("DP7RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
1670 	SND_SOC_DAPM_AIF_IN("DP7RX2", NULL, 1, SND_SOC_NOPM, 0, 0),
1671 
1672 	SND_SOC_DAPM_REGULATOR_SUPPLY("vdd-amp", 0, 0),
1673 
1674 	SND_SOC_DAPM_PGA_E("AMP1", CS42L43_BLOCK_EN10, CS42L43_AMP1_EN_SHIFT, 0, NULL, 0,
1675 			   cs42l43_spkl_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1676 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1677 	SND_SOC_DAPM_PGA_E("AMP2", CS42L43_BLOCK_EN10, CS42L43_AMP2_EN_SHIFT, 0, NULL, 0,
1678 			   cs42l43_spkr_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1679 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1680 
1681 	SND_SOC_DAPM_OUTPUT("AMP1_OUT_P"),
1682 	SND_SOC_DAPM_OUTPUT("AMP1_OUT_N"),
1683 	SND_SOC_DAPM_OUTPUT("AMP2_OUT_P"),
1684 	SND_SOC_DAPM_OUTPUT("AMP2_OUT_N"),
1685 
1686 	SND_SOC_DAPM_PGA("SPDIF", CS42L43_BLOCK_EN11, CS42L43_SPDIF_EN_SHIFT,
1687 			 0, NULL, 0),
1688 	SND_SOC_DAPM_OUTPUT("SPDIF_TX"),
1689 
1690 	SND_SOC_DAPM_PGA_E("HP", SND_SOC_NOPM, CS42L43_HP_EN_SHIFT, 0, NULL, 0,
1691 			   cs42l43_hp_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1692 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1693 	SND_SOC_DAPM_OUTPUT("AMP3_OUT"),
1694 	SND_SOC_DAPM_OUTPUT("AMP4_OUT"),
1695 
1696 	SND_SOC_DAPM_SIGGEN("Tone"),
1697 	SND_SOC_DAPM_SUPPLY("Tone Generator", CS42L43_BLOCK_EN9, CS42L43_TONE_EN_SHIFT,
1698 			    0, NULL, 0),
1699 	SND_SOC_DAPM_REG(snd_soc_dapm_pga, "Tone 1", CS42L43_TONE_CH1_CTRL,
1700 			 CS42L43_TONE_SEL_SHIFT, CS42L43_TONE_SEL_MASK, 0xA, 0),
1701 	SND_SOC_DAPM_REG(snd_soc_dapm_pga, "Tone 2", CS42L43_TONE_CH2_CTRL,
1702 			 CS42L43_TONE_SEL_SHIFT, CS42L43_TONE_SEL_MASK, 0xA, 0),
1703 
1704 	SND_SOC_DAPM_SUPPLY("ISRC1", CS42L43_BLOCK_EN5, CS42L43_ISRC1_BANK_EN_SHIFT,
1705 			    0, NULL, 0),
1706 	SND_SOC_DAPM_SUPPLY("ISRC2", CS42L43_BLOCK_EN5, CS42L43_ISRC2_BANK_EN_SHIFT,
1707 			    0, NULL, 0),
1708 
1709 	SND_SOC_DAPM_PGA("ISRC1INT2", CS42L43_ISRC1_CTRL,
1710 			 CS42L43_ISRC_INT2_EN_SHIFT, 0, NULL, 0),
1711 	SND_SOC_DAPM_PGA("ISRC1INT1", CS42L43_ISRC1_CTRL,
1712 			 CS42L43_ISRC_INT1_EN_SHIFT, 0, NULL, 0),
1713 	SND_SOC_DAPM_PGA("ISRC1DEC2", CS42L43_ISRC1_CTRL,
1714 			 CS42L43_ISRC_DEC2_EN_SHIFT, 0, NULL, 0),
1715 	SND_SOC_DAPM_PGA("ISRC1DEC1", CS42L43_ISRC1_CTRL,
1716 			 CS42L43_ISRC_DEC1_EN_SHIFT, 0, NULL, 0),
1717 
1718 	SND_SOC_DAPM_PGA("ISRC2INT2", CS42L43_ISRC2_CTRL,
1719 			 CS42L43_ISRC_INT2_EN_SHIFT, 0, NULL, 0),
1720 	SND_SOC_DAPM_PGA("ISRC2INT1", CS42L43_ISRC2_CTRL,
1721 			 CS42L43_ISRC_INT1_EN_SHIFT, 0, NULL, 0),
1722 	SND_SOC_DAPM_PGA("ISRC2DEC2", CS42L43_ISRC2_CTRL,
1723 			 CS42L43_ISRC_DEC2_EN_SHIFT, 0, NULL, 0),
1724 	SND_SOC_DAPM_PGA("ISRC2DEC1", CS42L43_ISRC2_CTRL,
1725 			 CS42L43_ISRC_DEC1_EN_SHIFT, 0, NULL, 0),
1726 
1727 	SND_SOC_DAPM_SUPPLY("ASRC_INT", CS42L43_BLOCK_EN4,
1728 			    CS42L43_ASRC_INT_BANK_EN_SHIFT, 0, NULL, 0),
1729 	SND_SOC_DAPM_SUPPLY("ASRC_DEC", CS42L43_BLOCK_EN4,
1730 			    CS42L43_ASRC_DEC_BANK_EN_SHIFT, 0, NULL, 0),
1731 
1732 	SND_SOC_DAPM_PGA("ASRC_INT1", CS42L43_ASRC_INT_ENABLES,
1733 			 CS42L43_ASRC_INT1_EN_SHIFT, 0, NULL, 0),
1734 	SND_SOC_DAPM_PGA("ASRC_INT2", CS42L43_ASRC_INT_ENABLES,
1735 			 CS42L43_ASRC_INT2_EN_SHIFT, 0, NULL, 0),
1736 	SND_SOC_DAPM_PGA("ASRC_INT3", CS42L43_ASRC_INT_ENABLES,
1737 			 CS42L43_ASRC_INT3_EN_SHIFT, 0, NULL, 0),
1738 	SND_SOC_DAPM_PGA("ASRC_INT4", CS42L43_ASRC_INT_ENABLES,
1739 			 CS42L43_ASRC_INT4_EN_SHIFT, 0, NULL, 0),
1740 	SND_SOC_DAPM_PGA("ASRC_DEC1", CS42L43_ASRC_DEC_ENABLES,
1741 			 CS42L43_ASRC_DEC1_EN_SHIFT, 0, NULL, 0),
1742 	SND_SOC_DAPM_PGA("ASRC_DEC2", CS42L43_ASRC_DEC_ENABLES,
1743 			 CS42L43_ASRC_DEC2_EN_SHIFT, 0, NULL, 0),
1744 	SND_SOC_DAPM_PGA("ASRC_DEC3", CS42L43_ASRC_DEC_ENABLES,
1745 			 CS42L43_ASRC_DEC3_EN_SHIFT, 0, NULL, 0),
1746 	SND_SOC_DAPM_PGA("ASRC_DEC4", CS42L43_ASRC_DEC_ENABLES,
1747 			 CS42L43_ASRC_DEC4_EN_SHIFT, 0, NULL, 0),
1748 
1749 	SND_SOC_DAPM_SUPPLY("EQ Clock", CS42L43_BLOCK_EN7, CS42L43_EQ_EN_SHIFT,
1750 			    0, NULL, 0),
1751 	SND_SOC_DAPM_PGA_E("EQ", CS42L43_START_EQZ0, CS42L43_START_FILTER_SHIFT,
1752 			   0, NULL, 0, cs42l43_eq_ev,
1753 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
1754 
1755 	SND_SOC_DAPM_SUPPLY("Mixer Core", CS42L43_BLOCK_EN6, CS42L43_MIXER_EN_SHIFT,
1756 			    0, NULL, 0),
1757 	CS42L43_DAPM_MUX("ASPTX1", asptx1),
1758 	CS42L43_DAPM_MUX("ASPTX2", asptx2),
1759 	CS42L43_DAPM_MUX("ASPTX3", asptx3),
1760 	CS42L43_DAPM_MUX("ASPTX4", asptx4),
1761 	CS42L43_DAPM_MUX("ASPTX5", asptx5),
1762 	CS42L43_DAPM_MUX("ASPTX6", asptx6),
1763 
1764 	CS42L43_DAPM_MUX("DP1TX1", dp1tx1),
1765 	CS42L43_DAPM_MUX("DP1TX2", dp1tx2),
1766 	CS42L43_DAPM_MUX("DP1TX3", dp1tx3),
1767 	CS42L43_DAPM_MUX("DP1TX4", dp1tx4),
1768 	CS42L43_DAPM_MUX("DP2TX1", dp2tx1),
1769 	CS42L43_DAPM_MUX("DP2TX2", dp2tx2),
1770 	CS42L43_DAPM_MUX("DP3TX1", dp3tx1),
1771 	CS42L43_DAPM_MUX("DP3TX2", dp3tx2),
1772 	CS42L43_DAPM_MUX("DP4TX1", dp4tx1),
1773 	CS42L43_DAPM_MUX("DP4TX2", dp4tx2),
1774 
1775 	CS42L43_DAPM_MUX("ASRC INT1", asrcint1),
1776 	CS42L43_DAPM_MUX("ASRC INT2", asrcint2),
1777 	CS42L43_DAPM_MUX("ASRC INT3", asrcint3),
1778 	CS42L43_DAPM_MUX("ASRC INT4", asrcint4),
1779 	CS42L43_DAPM_MUX("ASRC DEC1", asrcdec1),
1780 	CS42L43_DAPM_MUX("ASRC DEC2", asrcdec2),
1781 	CS42L43_DAPM_MUX("ASRC DEC3", asrcdec3),
1782 	CS42L43_DAPM_MUX("ASRC DEC4", asrcdec4),
1783 
1784 	CS42L43_DAPM_MUX("ISRC1INT1", isrc1int1),
1785 	CS42L43_DAPM_MUX("ISRC1INT2", isrc1int2),
1786 	CS42L43_DAPM_MUX("ISRC1DEC1", isrc1dec1),
1787 	CS42L43_DAPM_MUX("ISRC1DEC2", isrc1dec2),
1788 	CS42L43_DAPM_MUX("ISRC2INT1", isrc2int1),
1789 	CS42L43_DAPM_MUX("ISRC2INT2", isrc2int2),
1790 	CS42L43_DAPM_MUX("ISRC2DEC1", isrc2dec1),
1791 	CS42L43_DAPM_MUX("ISRC2DEC2", isrc2dec2),
1792 
1793 	CS42L43_DAPM_MUX("SPDIF1", spdif1),
1794 	CS42L43_DAPM_MUX("SPDIF2", spdif2),
1795 
1796 	CS42L43_DAPM_MIXER("EQ1", eq1),
1797 	CS42L43_DAPM_MIXER("EQ2", eq2),
1798 
1799 	CS42L43_DAPM_MIXER("Speaker L", amp1),
1800 	CS42L43_DAPM_MIXER("Speaker R", amp2),
1801 
1802 	CS42L43_DAPM_MIXER("Headphone L", amp3),
1803 	CS42L43_DAPM_MIXER("Headphone R", amp4),
1804 };
1805 
1806 static const struct snd_soc_dapm_route cs42l43_routes[] = {
1807 	{ "ADC1_IN1_P",		NULL,	"PLL" },
1808 	{ "ADC1_IN1_N",		NULL,	"PLL" },
1809 	{ "ADC1_IN2_P",		NULL,	"PLL" },
1810 	{ "ADC1_IN2_N",		NULL,	"PLL" },
1811 	{ "ADC2_IN_P",		NULL,	"PLL" },
1812 	{ "ADC2_IN_N",		NULL,	"PLL" },
1813 	{ "PDM1_DIN",		NULL,	"PLL" },
1814 	{ "PDM2_DIN",		NULL,	"PLL" },
1815 	{ "AMP1_OUT_P",		NULL,	"PLL" },
1816 	{ "AMP1_OUT_N",		NULL,	"PLL" },
1817 	{ "AMP2_OUT_P",		NULL,	"PLL" },
1818 	{ "AMP2_OUT_N",		NULL,	"PLL" },
1819 	{ "SPDIF_TX",		NULL,	"PLL" },
1820 	{ "HP",			NULL,	"PLL" },
1821 	{ "AMP3_OUT",		NULL,	"PLL" },
1822 	{ "AMP4_OUT",		NULL,	"PLL" },
1823 	{ "Tone 1",		NULL,	"PLL" },
1824 	{ "Tone 2",		NULL,	"PLL" },
1825 	{ "ASP Playback",	NULL,	"PLL" },
1826 	{ "ASP Capture",	NULL,	"PLL" },
1827 	{ "DP1 Capture",	NULL,	"PLL" },
1828 	{ "DP2 Capture",	NULL,	"PLL" },
1829 	{ "DP3 Capture",	NULL,	"PLL" },
1830 	{ "DP4 Capture",	NULL,	"PLL" },
1831 	{ "DP5 Playback",	NULL,	"PLL" },
1832 	{ "DP6 Playback",	NULL,	"PLL" },
1833 	{ "DP7 Playback",	NULL,	"PLL" },
1834 
1835 	{ "ADC1 Input",		"IN1",	"ADC1_IN1_P" },
1836 	{ "ADC1 Input",		"IN1",	"ADC1_IN1_N" },
1837 	{ "ADC1 Input",		"IN2",	"ADC1_IN2_P" },
1838 	{ "ADC1 Input",		"IN2",	"ADC1_IN2_N" },
1839 
1840 	{ "ADC1",		NULL,	"ADC1 Input" },
1841 	{ "ADC2",		NULL,	"ADC2_IN_P" },
1842 	{ "ADC2",		NULL,	"ADC2_IN_N" },
1843 
1844 	{ "PDM1L",		NULL,	"PDM1_DIN" },
1845 	{ "PDM1R",		NULL,	"PDM1_DIN" },
1846 	{ "PDM2L",		NULL,	"PDM2_DIN" },
1847 	{ "PDM2R",		NULL,	"PDM2_DIN" },
1848 
1849 	{ "Decimator 1 Mode",	"PDM",	"PDM1L" },
1850 	{ "Decimator 1 Mode",	"ADC",	"ADC1" },
1851 	{ "Decimator 2 Mode",	"PDM",	"PDM1R" },
1852 	{ "Decimator 2 Mode",	"ADC",	"ADC2" },
1853 
1854 	{ "Decimator 1",	NULL,	"Decimator 1 Mode" },
1855 	{ "Decimator 2",	NULL,	"Decimator 2 Mode" },
1856 	{ "Decimator 3",	NULL,	"PDM2L" },
1857 	{ "Decimator 4",	NULL,	"PDM2R" },
1858 
1859 	{ "ASP Capture",	NULL,	"ASPTX1" },
1860 	{ "ASP Capture",	NULL,	"ASPTX2" },
1861 	{ "ASP Capture",	NULL,	"ASPTX3" },
1862 	{ "ASP Capture",	NULL,	"ASPTX4" },
1863 	{ "ASP Capture",	NULL,	"ASPTX5" },
1864 	{ "ASP Capture",	NULL,	"ASPTX6" },
1865 	{ "ASPTX1",		NULL,	"BCLK" },
1866 	{ "ASPTX2",		NULL,	"BCLK" },
1867 	{ "ASPTX3",		NULL,	"BCLK" },
1868 	{ "ASPTX4",		NULL,	"BCLK" },
1869 	{ "ASPTX5",		NULL,	"BCLK" },
1870 	{ "ASPTX6",		NULL,	"BCLK" },
1871 
1872 	{ "ASPRX1",		NULL,	"ASP Playback" },
1873 	{ "ASPRX2",		NULL,	"ASP Playback" },
1874 	{ "ASPRX3",		NULL,	"ASP Playback" },
1875 	{ "ASPRX4",		NULL,	"ASP Playback" },
1876 	{ "ASPRX5",		NULL,	"ASP Playback" },
1877 	{ "ASPRX6",		NULL,	"ASP Playback" },
1878 	{ "ASPRX1",		NULL,	"BCLK" },
1879 	{ "ASPRX2",		NULL,	"BCLK" },
1880 	{ "ASPRX3",		NULL,	"BCLK" },
1881 	{ "ASPRX4",		NULL,	"BCLK" },
1882 	{ "ASPRX5",		NULL,	"BCLK" },
1883 	{ "ASPRX6",		NULL,	"BCLK" },
1884 
1885 	{ "DP1 Capture",	NULL, "DP1TX1" },
1886 	{ "DP1 Capture",	NULL, "DP1TX2" },
1887 	{ "DP1 Capture",	NULL, "DP1TX3" },
1888 	{ "DP1 Capture",	NULL, "DP1TX4" },
1889 
1890 	{ "DP2 Capture",	NULL, "DP2TX1" },
1891 	{ "DP2 Capture",	NULL, "DP2TX2" },
1892 
1893 	{ "DP3 Capture",	NULL, "DP3TX1" },
1894 	{ "DP3 Capture",	NULL, "DP3TX2" },
1895 
1896 	{ "DP4 Capture",	NULL, "DP4TX1" },
1897 	{ "DP4 Capture",	NULL, "DP4TX2" },
1898 
1899 	{ "DP5RX1",		NULL, "DP5 Playback" },
1900 	{ "DP5RX2",		NULL, "DP5 Playback" },
1901 
1902 	{ "DP6RX1",		NULL, "DP6 Playback" },
1903 	{ "DP6RX2",		NULL, "DP6 Playback" },
1904 
1905 	{ "DP7RX1",		NULL, "DP7 Playback" },
1906 	{ "DP7RX2",		NULL, "DP7 Playback" },
1907 
1908 	{ "AMP1",		NULL,	"vdd-amp" },
1909 	{ "AMP2",		NULL,	"vdd-amp" },
1910 
1911 	{ "AMP1_OUT_P",		NULL,	"AMP1" },
1912 	{ "AMP1_OUT_N",		NULL,	"AMP1" },
1913 	{ "AMP2_OUT_P",		NULL,	"AMP2" },
1914 	{ "AMP2_OUT_N",		NULL,	"AMP2" },
1915 
1916 	{ "SPDIF_TX",		NULL,	"SPDIF" },
1917 
1918 	{ "AMP3_OUT",		NULL,	"HP" },
1919 	{ "AMP4_OUT",		NULL,	"HP" },
1920 
1921 	{ "Tone 1",		NULL,	"Tone" },
1922 	{ "Tone 1",		NULL,	"Tone Generator" },
1923 	{ "Tone 2",		NULL,	"Tone" },
1924 	{ "Tone 2",		NULL,	"Tone Generator" },
1925 
1926 	{ "ISRC1INT2",		NULL,	"ISRC1" },
1927 	{ "ISRC1INT1",		NULL,	"ISRC1" },
1928 	{ "ISRC1DEC2",		NULL,	"ISRC1" },
1929 	{ "ISRC1DEC1",		NULL,	"ISRC1" },
1930 
1931 	{ "ISRC2INT2",		NULL,	"ISRC2" },
1932 	{ "ISRC2INT1",		NULL,	"ISRC2" },
1933 	{ "ISRC2DEC2",		NULL,	"ISRC2" },
1934 	{ "ISRC2DEC1",		NULL,	"ISRC2" },
1935 
1936 	{ "ASRC_INT1",		NULL,	"ASRC_INT" },
1937 	{ "ASRC_INT2",		NULL,	"ASRC_INT" },
1938 	{ "ASRC_INT3",		NULL,	"ASRC_INT" },
1939 	{ "ASRC_INT4",		NULL,	"ASRC_INT" },
1940 	{ "ASRC_DEC1",		NULL,	"ASRC_DEC" },
1941 	{ "ASRC_DEC2",		NULL,	"ASRC_DEC" },
1942 	{ "ASRC_DEC3",		NULL,	"ASRC_DEC" },
1943 	{ "ASRC_DEC4",		NULL,	"ASRC_DEC" },
1944 
1945 	{ "EQ",			NULL,	"EQ Clock" },
1946 
1947 	CS42L43_MUX_ROUTES("ASPTX1", "ASPTX1"),
1948 	CS42L43_MUX_ROUTES("ASPTX2", "ASPTX2"),
1949 	CS42L43_MUX_ROUTES("ASPTX3", "ASPTX3"),
1950 	CS42L43_MUX_ROUTES("ASPTX4", "ASPTX4"),
1951 	CS42L43_MUX_ROUTES("ASPTX5", "ASPTX5"),
1952 	CS42L43_MUX_ROUTES("ASPTX6", "ASPTX6"),
1953 
1954 	CS42L43_MUX_ROUTES("DP1TX1", "DP1TX1"),
1955 	CS42L43_MUX_ROUTES("DP1TX2", "DP1TX2"),
1956 	CS42L43_MUX_ROUTES("DP1TX3", "DP1TX3"),
1957 	CS42L43_MUX_ROUTES("DP1TX4", "DP1TX4"),
1958 	CS42L43_MUX_ROUTES("DP2TX1", "DP2TX1"),
1959 	CS42L43_MUX_ROUTES("DP2TX2", "DP2TX2"),
1960 	CS42L43_MUX_ROUTES("DP3TX1", "DP3TX1"),
1961 	CS42L43_MUX_ROUTES("DP3TX2", "DP3TX2"),
1962 	CS42L43_MUX_ROUTES("DP4TX1", "DP4TX1"),
1963 	CS42L43_MUX_ROUTES("DP4TX2", "DP4TX2"),
1964 
1965 	CS42L43_MUX_ROUTES("ASRC INT1", "ASRC_INT1"),
1966 	CS42L43_MUX_ROUTES("ASRC INT2", "ASRC_INT2"),
1967 	CS42L43_MUX_ROUTES("ASRC INT3", "ASRC_INT3"),
1968 	CS42L43_MUX_ROUTES("ASRC INT4", "ASRC_INT4"),
1969 	CS42L43_MUX_ROUTES("ASRC DEC1", "ASRC_DEC1"),
1970 	CS42L43_MUX_ROUTES("ASRC DEC2", "ASRC_DEC2"),
1971 	CS42L43_MUX_ROUTES("ASRC DEC3", "ASRC_DEC3"),
1972 	CS42L43_MUX_ROUTES("ASRC DEC4", "ASRC_DEC4"),
1973 
1974 	CS42L43_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
1975 	CS42L43_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
1976 	CS42L43_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
1977 	CS42L43_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
1978 	CS42L43_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
1979 	CS42L43_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
1980 	CS42L43_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
1981 	CS42L43_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
1982 
1983 	CS42L43_MUX_ROUTES("SPDIF1", "SPDIF"),
1984 	CS42L43_MUX_ROUTES("SPDIF2", "SPDIF"),
1985 
1986 	CS42L43_MIXER_ROUTES("EQ1", "EQ"),
1987 	CS42L43_MIXER_ROUTES("EQ2", "EQ"),
1988 
1989 	CS42L43_MIXER_ROUTES("Speaker L", "AMP1"),
1990 	CS42L43_MIXER_ROUTES("Speaker R", "AMP2"),
1991 
1992 	CS42L43_MIXER_ROUTES("Headphone L", "HP"),
1993 	CS42L43_MIXER_ROUTES("Headphone R", "HP"),
1994 };
1995 
1996 static int cs42l43_set_sysclk(struct snd_soc_component *component, int clk_id,
1997 			      int src, unsigned int freq, int dir)
1998 {
1999 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
2000 	struct cs42l43 *cs42l43 = priv->core;
2001 	int ret;
2002 
2003 	mutex_lock(&cs42l43->pll_lock);
2004 	ret = cs42l43_set_pll(priv, src, freq);
2005 	mutex_unlock(&cs42l43->pll_lock);
2006 
2007 	return ret;
2008 }
2009 
2010 static int cs42l43_component_probe(struct snd_soc_component *component)
2011 {
2012 	struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
2013 	struct cs42l43 *cs42l43 = priv->core;
2014 
2015 	snd_soc_component_init_regmap(component, cs42l43->regmap);
2016 
2017 	cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->tx_slots);
2018 	cs42l43_mask_to_slots(priv, CS42L43_DEFAULT_SLOTS, priv->rx_slots);
2019 
2020 	priv->component = component;
2021 	priv->constraint = cs42l43_constraint;
2022 
2023 	return 0;
2024 }
2025 
2026 static const struct snd_soc_component_driver cs42l43_component_drv = {
2027 	.name			= "cs42l43-codec",
2028 
2029 	.probe			= cs42l43_component_probe,
2030 	.set_sysclk		= cs42l43_set_sysclk,
2031 	.set_jack		= cs42l43_set_jack,
2032 
2033 	.endianness		= 1,
2034 
2035 	.controls		= cs42l43_controls,
2036 	.num_controls		= ARRAY_SIZE(cs42l43_controls),
2037 	.dapm_widgets		= cs42l43_widgets,
2038 	.num_dapm_widgets	= ARRAY_SIZE(cs42l43_widgets),
2039 	.dapm_routes		= cs42l43_routes,
2040 	.num_dapm_routes	= ARRAY_SIZE(cs42l43_routes),
2041 };
2042 
2043 struct cs42l43_irq {
2044 	unsigned int irq;
2045 	const char *name;
2046 	irq_handler_t handler;
2047 };
2048 
2049 static const struct cs42l43_irq cs42l43_irqs[] = {
2050 	{ CS42L43_PLL_LOST_LOCK, "pll lost lock", cs42l43_pll_lost_lock },
2051 	{ CS42L43_PLL_READY, "pll ready", cs42l43_pll_ready },
2052 	{ CS42L43_HP_STARTUP_DONE, "hp startup", cs42l43_hp_startup },
2053 	{ CS42L43_HP_SHUTDOWN_DONE, "hp shutdown", cs42l43_hp_shutdown },
2054 	{ CS42L43_HSDET_DONE, "type detect", cs42l43_type_detect },
2055 	{ CS42L43_TIPSENSE_UNPLUG_PDET, "tip sense unplug", cs42l43_tip_sense },
2056 	{ CS42L43_TIPSENSE_PLUG_PDET, "tip sense plug", cs42l43_tip_sense },
2057 	{ CS42L43_DC_DETECT1_TRUE, "button press", cs42l43_button_press },
2058 	{ CS42L43_DC_DETECT1_FALSE, "button release", cs42l43_button_release },
2059 	{ CS42L43_HSBIAS_CLAMPED, "hsbias detect clamp", cs42l43_bias_detect_clamp },
2060 	{ CS42L43_AMP2_CLK_STOP_FAULT, "spkr clock stop", cs42l43_spkr_clock_stop },
2061 	{ CS42L43_AMP1_CLK_STOP_FAULT, "spkl clock stop", cs42l43_spkl_clock_stop },
2062 	{ CS42L43_AMP2_VDDSPK_FAULT, "spkr brown out", cs42l43_spkr_brown_out },
2063 	{ CS42L43_AMP1_VDDSPK_FAULT, "spkl brown out", cs42l43_spkl_brown_out },
2064 	{ CS42L43_AMP2_SHUTDOWN_DONE, "spkr shutdown", cs42l43_spkr_shutdown },
2065 	{ CS42L43_AMP1_SHUTDOWN_DONE, "spkl shutdown", cs42l43_spkl_shutdown },
2066 	{ CS42L43_AMP2_STARTUP_DONE, "spkr startup", cs42l43_spkr_startup },
2067 	{ CS42L43_AMP1_STARTUP_DONE, "spkl startup", cs42l43_spkl_startup },
2068 	{ CS42L43_AMP2_THERM_SHDN, "spkr thermal shutdown", cs42l43_spkr_therm_shutdown },
2069 	{ CS42L43_AMP1_THERM_SHDN, "spkl thermal shutdown", cs42l43_spkl_therm_shutdown },
2070 	{ CS42L43_AMP2_THERM_WARN, "spkr thermal warning", cs42l43_spkr_therm_warm },
2071 	{ CS42L43_AMP1_THERM_WARN, "spkl thermal warning", cs42l43_spkl_therm_warm },
2072 	{ CS42L43_AMP2_SCDET, "spkr short circuit", cs42l43_spkr_sc_detect },
2073 	{ CS42L43_AMP1_SCDET, "spkl short circuit", cs42l43_spkl_sc_detect },
2074 	{ CS42L43_HP_ILIMIT, "hp ilimit", cs42l43_hp_ilimit },
2075 	{ CS42L43_HP_LOADDET_DONE, "load detect done", cs42l43_load_detect },
2076 };
2077 
2078 static int cs42l43_request_irq(struct cs42l43_codec *priv,
2079 			       struct irq_domain *dom, const char * const name,
2080 			       unsigned int irq, irq_handler_t handler,
2081 			       unsigned long flags)
2082 {
2083 	int ret;
2084 
2085 	ret = irq_create_mapping(dom, irq);
2086 	if (ret < 0)
2087 		return dev_err_probe(priv->dev, ret, "Failed to map IRQ %s\n", name);
2088 
2089 	dev_dbg(priv->dev, "Request IRQ %d for %s\n", ret, name);
2090 
2091 	ret = devm_request_threaded_irq(priv->dev, ret, NULL, handler,
2092 					IRQF_ONESHOT | flags, name, priv);
2093 	if (ret)
2094 		return dev_err_probe(priv->dev, ret, "Failed to request IRQ %s\n", name);
2095 
2096 	return 0;
2097 }
2098 
2099 static int cs42l43_shutter_irq(struct cs42l43_codec *priv,
2100 			       struct irq_domain *dom, unsigned int shutter,
2101 			       const char * const open_name,
2102 			       const char * const close_name,
2103 			       irq_handler_t handler)
2104 {
2105 	unsigned int open_irq, close_irq;
2106 	int ret;
2107 
2108 	switch (shutter) {
2109 	case 0x1:
2110 		dev_warn(priv->dev, "Manual shutters, notifications not available\n");
2111 		return 0;
2112 	case 0x2:
2113 		open_irq = CS42L43_GPIO1_RISE;
2114 		close_irq = CS42L43_GPIO1_FALL;
2115 		break;
2116 	case 0x4:
2117 		open_irq = CS42L43_GPIO2_RISE;
2118 		close_irq = CS42L43_GPIO2_FALL;
2119 		break;
2120 	case 0x8:
2121 		open_irq = CS42L43_GPIO3_RISE;
2122 		close_irq = CS42L43_GPIO3_FALL;
2123 		break;
2124 	default:
2125 		return 0;
2126 	}
2127 
2128 	ret = cs42l43_request_irq(priv, dom, close_name, close_irq, handler, IRQF_SHARED);
2129 	if (ret)
2130 		return ret;
2131 
2132 	return cs42l43_request_irq(priv, dom, open_name, open_irq, handler, IRQF_SHARED);
2133 }
2134 
2135 static int cs42l43_codec_probe(struct platform_device *pdev)
2136 {
2137 	struct cs42l43 *cs42l43 = dev_get_drvdata(pdev->dev.parent);
2138 	struct cs42l43_codec *priv;
2139 	struct irq_domain *dom;
2140 	unsigned int val;
2141 	int i, ret;
2142 
2143 	dom = irq_find_matching_fwnode(dev_fwnode(cs42l43->dev), DOMAIN_BUS_ANY);
2144 	if (!dom)
2145 		return -EPROBE_DEFER;
2146 
2147 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
2148 	if (!priv)
2149 		return -ENOMEM;
2150 
2151 	priv->dev = &pdev->dev;
2152 	priv->core = cs42l43;
2153 
2154 	platform_set_drvdata(pdev, priv);
2155 
2156 	mutex_init(&priv->jack_lock);
2157 	mutex_init(&priv->spk_vu_lock);
2158 
2159 	init_completion(&priv->hp_startup);
2160 	init_completion(&priv->hp_shutdown);
2161 	init_completion(&priv->spkr_shutdown);
2162 	init_completion(&priv->spkl_shutdown);
2163 	init_completion(&priv->spkr_startup);
2164 	init_completion(&priv->spkl_startup);
2165 	init_completion(&priv->pll_ready);
2166 	init_completion(&priv->type_detect);
2167 	init_completion(&priv->load_detect);
2168 
2169 	INIT_DELAYED_WORK(&priv->tip_sense_work, cs42l43_tip_sense_work);
2170 	INIT_DELAYED_WORK(&priv->bias_sense_timeout, cs42l43_bias_sense_timeout);
2171 	INIT_DELAYED_WORK(&priv->button_press_work, cs42l43_button_press_work);
2172 	INIT_WORK(&priv->button_release_work, cs42l43_button_release_work);
2173 
2174 	pm_runtime_set_autosuspend_delay(priv->dev, 100);
2175 	pm_runtime_use_autosuspend(priv->dev);
2176 	pm_runtime_set_active(priv->dev);
2177 	pm_runtime_get_noresume(priv->dev);
2178 	devm_pm_runtime_enable(priv->dev);
2179 
2180 	for (i = 0; i < ARRAY_SIZE(cs42l43_irqs); i++) {
2181 		ret = cs42l43_request_irq(priv, dom, cs42l43_irqs[i].name,
2182 					  cs42l43_irqs[i].irq,
2183 					  cs42l43_irqs[i].handler, 0);
2184 		if (ret)
2185 			goto err_pm;
2186 	}
2187 
2188 	ret = regmap_read(cs42l43->regmap, CS42L43_SHUTTER_CONTROL, &val);
2189 	if (ret) {
2190 		dev_err(priv->dev, "Failed to check shutter source: %d\n", ret);
2191 		goto err_pm;
2192 	}
2193 
2194 	ret = cs42l43_shutter_irq(priv, dom, val & CS42L43_MIC_SHUTTER_CFG_MASK,
2195 				  "mic shutter open", "mic shutter close",
2196 				  cs42l43_mic_shutter);
2197 	if (ret)
2198 		goto err_pm;
2199 
2200 	ret = cs42l43_shutter_irq(priv, dom, (val & CS42L43_SPK_SHUTTER_CFG_MASK) >>
2201 				  CS42L43_SPK_SHUTTER_CFG_SHIFT,
2202 				  "spk shutter open", "spk shutter close",
2203 				  cs42l43_spk_shutter);
2204 	if (ret)
2205 		goto err_pm;
2206 
2207 	// Don't use devm as we need to get against the MFD device
2208 	priv->mclk = clk_get_optional(cs42l43->dev, "mclk");
2209 	if (IS_ERR(priv->mclk)) {
2210 		ret = PTR_ERR(priv->mclk);
2211 		dev_err_probe(priv->dev, ret, "Failed to get mclk\n");
2212 		goto err_pm;
2213 	}
2214 
2215 	ret = devm_snd_soc_register_component(priv->dev, &cs42l43_component_drv,
2216 					      cs42l43_dais, ARRAY_SIZE(cs42l43_dais));
2217 	if (ret) {
2218 		dev_err_probe(priv->dev, ret, "Failed to register component\n");
2219 		goto err_clk;
2220 	}
2221 
2222 	pm_runtime_mark_last_busy(priv->dev);
2223 	pm_runtime_put_autosuspend(priv->dev);
2224 
2225 	return 0;
2226 
2227 err_clk:
2228 	clk_put(priv->mclk);
2229 err_pm:
2230 	pm_runtime_put_sync(priv->dev);
2231 
2232 	return ret;
2233 }
2234 
2235 static int cs42l43_codec_remove(struct platform_device *pdev)
2236 {
2237 	struct cs42l43_codec *priv = platform_get_drvdata(pdev);
2238 
2239 	clk_put(priv->mclk);
2240 
2241 	return 0;
2242 }
2243 
2244 static int cs42l43_codec_runtime_resume(struct device *dev)
2245 {
2246 	struct cs42l43_codec *priv = dev_get_drvdata(dev);
2247 
2248 	dev_dbg(priv->dev, "Runtime resume\n");
2249 
2250 	// Toggle the speaker volume update incase the speaker volume was synced
2251 	cs42l43_spk_vu_sync(priv);
2252 
2253 	return 0;
2254 }
2255 
2256 DEFINE_RUNTIME_DEV_PM_OPS(cs42l43_codec_pm_ops, NULL,
2257 			  cs42l43_codec_runtime_resume, NULL);
2258 
2259 static const struct platform_device_id cs42l43_codec_id_table[] = {
2260 	{ "cs42l43-codec", },
2261 	{}
2262 };
2263 MODULE_DEVICE_TABLE(platform, cs42l43_codec_id_table);
2264 
2265 static struct platform_driver cs42l43_codec_driver = {
2266 	.driver = {
2267 		.name	= "cs42l43-codec",
2268 		.pm	= &cs42l43_codec_pm_ops,
2269 	},
2270 
2271 	.probe		= cs42l43_codec_probe,
2272 	.remove		= cs42l43_codec_remove,
2273 	.id_table	= cs42l43_codec_id_table,
2274 };
2275 module_platform_driver(cs42l43_codec_driver);
2276 
2277 MODULE_IMPORT_NS(SND_SOC_CS42L43);
2278 
2279 MODULE_DESCRIPTION("CS42L43 CODEC Driver");
2280 MODULE_AUTHOR("Charles Keepax <ckeepax@opensource.cirrus.com>");
2281 MODULE_LICENSE("GPL");
2282