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