xref: /linux/sound/soc/codecs/arizona.c (revision 2aa680df68062e4e0c356ec2aa7100c13654907b)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * arizona.c - Wolfson Arizona class device shared support
4  *
5  * Copyright 2012 Wolfson Microelectronics plc
6  *
7  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
8  */
9 
10 #include <linux/delay.h>
11 #include <linux/gcd.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14 #include <linux/pm_runtime.h>
15 #include <sound/pcm.h>
16 #include <sound/pcm_params.h>
17 #include <sound/tlv.h>
18 
19 #include <linux/mfd/arizona/core.h>
20 #include <linux/mfd/arizona/registers.h>
21 
22 #include "arizona.h"
23 
24 #define ARIZONA_AIF_BCLK_CTRL                   0x00
25 #define ARIZONA_AIF_TX_PIN_CTRL                 0x01
26 #define ARIZONA_AIF_RX_PIN_CTRL                 0x02
27 #define ARIZONA_AIF_RATE_CTRL                   0x03
28 #define ARIZONA_AIF_FORMAT                      0x04
29 #define ARIZONA_AIF_TX_BCLK_RATE                0x05
30 #define ARIZONA_AIF_RX_BCLK_RATE                0x06
31 #define ARIZONA_AIF_FRAME_CTRL_1                0x07
32 #define ARIZONA_AIF_FRAME_CTRL_2                0x08
33 #define ARIZONA_AIF_FRAME_CTRL_3                0x09
34 #define ARIZONA_AIF_FRAME_CTRL_4                0x0A
35 #define ARIZONA_AIF_FRAME_CTRL_5                0x0B
36 #define ARIZONA_AIF_FRAME_CTRL_6                0x0C
37 #define ARIZONA_AIF_FRAME_CTRL_7                0x0D
38 #define ARIZONA_AIF_FRAME_CTRL_8                0x0E
39 #define ARIZONA_AIF_FRAME_CTRL_9                0x0F
40 #define ARIZONA_AIF_FRAME_CTRL_10               0x10
41 #define ARIZONA_AIF_FRAME_CTRL_11               0x11
42 #define ARIZONA_AIF_FRAME_CTRL_12               0x12
43 #define ARIZONA_AIF_FRAME_CTRL_13               0x13
44 #define ARIZONA_AIF_FRAME_CTRL_14               0x14
45 #define ARIZONA_AIF_FRAME_CTRL_15               0x15
46 #define ARIZONA_AIF_FRAME_CTRL_16               0x16
47 #define ARIZONA_AIF_FRAME_CTRL_17               0x17
48 #define ARIZONA_AIF_FRAME_CTRL_18               0x18
49 #define ARIZONA_AIF_TX_ENABLES                  0x19
50 #define ARIZONA_AIF_RX_ENABLES                  0x1A
51 #define ARIZONA_AIF_FORCE_WRITE                 0x1B
52 
53 #define ARIZONA_FLL_VCO_CORNER 141900000
54 #define ARIZONA_FLL_MAX_FREF   13500000
55 #define ARIZONA_FLL_MIN_FVCO   90000000
56 #define ARIZONA_FLL_MAX_FRATIO 16
57 #define ARIZONA_FLL_MAX_REFDIV 8
58 #define ARIZONA_FLL_MIN_OUTDIV 2
59 #define ARIZONA_FLL_MAX_OUTDIV 7
60 
61 #define ARIZONA_FMT_DSP_MODE_A          0
62 #define ARIZONA_FMT_DSP_MODE_B          1
63 #define ARIZONA_FMT_I2S_MODE            2
64 #define ARIZONA_FMT_LEFT_JUSTIFIED_MODE 3
65 
66 #define arizona_fll_err(_fll, fmt, ...) \
67 	dev_err(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
68 #define arizona_fll_warn(_fll, fmt, ...) \
69 	dev_warn(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
70 #define arizona_fll_dbg(_fll, fmt, ...) \
71 	dev_dbg(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
72 
73 #define arizona_aif_err(_dai, fmt, ...) \
74 	dev_err(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
75 #define arizona_aif_warn(_dai, fmt, ...) \
76 	dev_warn(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
77 #define arizona_aif_dbg(_dai, fmt, ...) \
78 	dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
79 
80 static int arizona_spk_ev(struct snd_soc_dapm_widget *w,
81 			  struct snd_kcontrol *kcontrol,
82 			  int event)
83 {
84 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
85 	struct arizona *arizona = dev_get_drvdata(component->dev->parent);
86 	int val;
87 
88 	switch (event) {
89 	case SND_SOC_DAPM_POST_PMU:
90 		val = snd_soc_component_read(component,
91 					       ARIZONA_INTERRUPT_RAW_STATUS_3);
92 		if (val & ARIZONA_SPK_OVERHEAT_STS) {
93 			dev_crit(arizona->dev,
94 				 "Speaker not enabled due to temperature\n");
95 			return -EBUSY;
96 		}
97 
98 		regmap_update_bits_async(arizona->regmap,
99 					 ARIZONA_OUTPUT_ENABLES_1,
100 					 1 << w->shift, 1 << w->shift);
101 		break;
102 	case SND_SOC_DAPM_PRE_PMD:
103 		regmap_update_bits_async(arizona->regmap,
104 					 ARIZONA_OUTPUT_ENABLES_1,
105 					 1 << w->shift, 0);
106 		break;
107 	default:
108 		break;
109 	}
110 
111 	return arizona_out_ev(w, kcontrol, event);
112 }
113 
114 static irqreturn_t arizona_thermal_warn(int irq, void *data)
115 {
116 	struct arizona *arizona = data;
117 	unsigned int val;
118 	int ret;
119 
120 	ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3,
121 			  &val);
122 	if (ret != 0) {
123 		dev_err(arizona->dev, "Failed to read thermal status: %d\n",
124 			ret);
125 	} else if (val & ARIZONA_SPK_OVERHEAT_WARN_STS) {
126 		dev_crit(arizona->dev, "Thermal warning\n");
127 	}
128 
129 	return IRQ_HANDLED;
130 }
131 
132 static irqreturn_t arizona_thermal_shutdown(int irq, void *data)
133 {
134 	struct arizona *arizona = data;
135 	unsigned int val;
136 	int ret;
137 
138 	ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3,
139 			  &val);
140 	if (ret != 0) {
141 		dev_err(arizona->dev, "Failed to read thermal status: %d\n",
142 			ret);
143 	} else if (val & ARIZONA_SPK_OVERHEAT_STS) {
144 		dev_crit(arizona->dev, "Thermal shutdown\n");
145 		ret = regmap_update_bits(arizona->regmap,
146 					 ARIZONA_OUTPUT_ENABLES_1,
147 					 ARIZONA_OUT4L_ENA |
148 					 ARIZONA_OUT4R_ENA, 0);
149 		if (ret != 0)
150 			dev_crit(arizona->dev,
151 				 "Failed to disable speaker outputs: %d\n",
152 				 ret);
153 	}
154 
155 	return IRQ_HANDLED;
156 }
157 
158 static const struct snd_soc_dapm_widget arizona_spkl =
159 	SND_SOC_DAPM_PGA_E("OUT4L", SND_SOC_NOPM,
160 			   ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
161 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
162 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD);
163 
164 static const struct snd_soc_dapm_widget arizona_spkr =
165 	SND_SOC_DAPM_PGA_E("OUT4R", SND_SOC_NOPM,
166 			   ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
167 			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
168 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD);
169 
170 int arizona_init_spk(struct snd_soc_component *component)
171 {
172 	struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
173 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
174 	struct arizona *arizona = priv->arizona;
175 	int ret;
176 
177 	ret = snd_soc_dapm_new_controls(dapm, &arizona_spkl, 1);
178 	if (ret != 0)
179 		return ret;
180 
181 	switch (arizona->type) {
182 	case WM8997:
183 	case CS47L24:
184 	case WM1831:
185 		break;
186 	default:
187 		ret = snd_soc_dapm_new_controls(dapm, &arizona_spkr, 1);
188 		if (ret != 0)
189 			return ret;
190 		break;
191 	}
192 
193 	return 0;
194 }
195 EXPORT_SYMBOL_GPL(arizona_init_spk);
196 
197 int arizona_init_spk_irqs(struct arizona *arizona)
198 {
199 	int ret;
200 
201 	ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
202 				  "Thermal warning", arizona_thermal_warn,
203 				  arizona);
204 	if (ret != 0)
205 		dev_err(arizona->dev,
206 			"Failed to get thermal warning IRQ: %d\n",
207 			ret);
208 
209 	ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT,
210 				  "Thermal shutdown", arizona_thermal_shutdown,
211 				  arizona);
212 	if (ret != 0)
213 		dev_err(arizona->dev,
214 			"Failed to get thermal shutdown IRQ: %d\n",
215 			ret);
216 
217 	return 0;
218 }
219 EXPORT_SYMBOL_GPL(arizona_init_spk_irqs);
220 
221 int arizona_free_spk_irqs(struct arizona *arizona)
222 {
223 	arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN, arizona);
224 	arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT, arizona);
225 
226 	return 0;
227 }
228 EXPORT_SYMBOL_GPL(arizona_free_spk_irqs);
229 
230 static const struct snd_soc_dapm_route arizona_mono_routes[] = {
231 	{ "OUT1R", NULL, "OUT1L" },
232 	{ "OUT2R", NULL, "OUT2L" },
233 	{ "OUT3R", NULL, "OUT3L" },
234 	{ "OUT4R", NULL, "OUT4L" },
235 	{ "OUT5R", NULL, "OUT5L" },
236 	{ "OUT6R", NULL, "OUT6L" },
237 };
238 
239 int arizona_init_mono(struct snd_soc_component *component)
240 {
241 	struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
242 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
243 	struct arizona *arizona = priv->arizona;
244 	int i;
245 
246 	for (i = 0; i < ARIZONA_MAX_OUTPUT; ++i) {
247 		if (arizona->pdata.out_mono[i])
248 			snd_soc_dapm_add_routes(dapm,
249 						&arizona_mono_routes[i], 1);
250 	}
251 
252 	return 0;
253 }
254 EXPORT_SYMBOL_GPL(arizona_init_mono);
255 
256 int arizona_init_gpio(struct snd_soc_component *component)
257 {
258 	struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
259 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
260 	struct arizona *arizona = priv->arizona;
261 	int i;
262 
263 	switch (arizona->type) {
264 	case WM5110:
265 	case WM8280:
266 		snd_soc_dapm_disable_pin(dapm, "DRC2 Signal Activity");
267 		break;
268 	default:
269 		break;
270 	}
271 
272 	snd_soc_dapm_disable_pin(dapm, "DRC1 Signal Activity");
273 
274 	for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
275 		switch (arizona->pdata.gpio_defaults[i] & ARIZONA_GPN_FN_MASK) {
276 		case ARIZONA_GP_FN_DRC1_SIGNAL_DETECT:
277 			snd_soc_dapm_enable_pin(dapm, "DRC1 Signal Activity");
278 			break;
279 		case ARIZONA_GP_FN_DRC2_SIGNAL_DETECT:
280 			snd_soc_dapm_enable_pin(dapm, "DRC2 Signal Activity");
281 			break;
282 		default:
283 			break;
284 		}
285 	}
286 
287 	return 0;
288 }
289 EXPORT_SYMBOL_GPL(arizona_init_gpio);
290 
291 int arizona_init_common(struct arizona *arizona)
292 {
293 	struct arizona_pdata *pdata = &arizona->pdata;
294 	unsigned int val, mask;
295 	int i;
296 
297 	BLOCKING_INIT_NOTIFIER_HEAD(&arizona->notifier);
298 
299 	for (i = 0; i < ARIZONA_MAX_OUTPUT; ++i) {
300 		/* Default is 0 so noop with defaults */
301 		if (pdata->out_mono[i])
302 			val = ARIZONA_OUT1_MONO;
303 		else
304 			val = 0;
305 
306 		regmap_update_bits(arizona->regmap,
307 				   ARIZONA_OUTPUT_PATH_CONFIG_1L + (i * 8),
308 				   ARIZONA_OUT1_MONO, val);
309 	}
310 
311 	for (i = 0; i < ARIZONA_MAX_PDM_SPK; i++) {
312 		if (pdata->spk_mute[i])
313 			regmap_update_bits(arizona->regmap,
314 					   ARIZONA_PDM_SPK1_CTRL_1 + (i * 2),
315 					   ARIZONA_SPK1_MUTE_ENDIAN_MASK |
316 					   ARIZONA_SPK1_MUTE_SEQ1_MASK,
317 					   pdata->spk_mute[i]);
318 
319 		if (pdata->spk_fmt[i])
320 			regmap_update_bits(arizona->regmap,
321 					   ARIZONA_PDM_SPK1_CTRL_2 + (i * 2),
322 					   ARIZONA_SPK1_FMT_MASK,
323 					   pdata->spk_fmt[i]);
324 	}
325 
326 	for (i = 0; i < ARIZONA_MAX_INPUT; i++) {
327 		/* Default for both is 0 so noop with defaults */
328 		val = pdata->dmic_ref[i] << ARIZONA_IN1_DMIC_SUP_SHIFT;
329 		if (pdata->inmode[i] & ARIZONA_INMODE_DMIC)
330 			val |= 1 << ARIZONA_IN1_MODE_SHIFT;
331 
332 		switch (arizona->type) {
333 		case WM8998:
334 		case WM1814:
335 			regmap_update_bits(arizona->regmap,
336 				ARIZONA_ADC_DIGITAL_VOLUME_1L + (i * 8),
337 				ARIZONA_IN1L_SRC_SE_MASK,
338 				(pdata->inmode[i] & ARIZONA_INMODE_SE)
339 					<< ARIZONA_IN1L_SRC_SE_SHIFT);
340 
341 			regmap_update_bits(arizona->regmap,
342 				ARIZONA_ADC_DIGITAL_VOLUME_1R + (i * 8),
343 				ARIZONA_IN1R_SRC_SE_MASK,
344 				(pdata->inmode[i] & ARIZONA_INMODE_SE)
345 					<< ARIZONA_IN1R_SRC_SE_SHIFT);
346 
347 			mask = ARIZONA_IN1_DMIC_SUP_MASK |
348 			       ARIZONA_IN1_MODE_MASK;
349 			break;
350 		default:
351 			if (pdata->inmode[i] & ARIZONA_INMODE_SE)
352 				val |= 1 << ARIZONA_IN1_SINGLE_ENDED_SHIFT;
353 
354 			mask = ARIZONA_IN1_DMIC_SUP_MASK |
355 			       ARIZONA_IN1_MODE_MASK |
356 			       ARIZONA_IN1_SINGLE_ENDED_MASK;
357 			break;
358 		}
359 
360 		regmap_update_bits(arizona->regmap,
361 				   ARIZONA_IN1L_CONTROL + (i * 8),
362 				   mask, val);
363 	}
364 
365 	return 0;
366 }
367 EXPORT_SYMBOL_GPL(arizona_init_common);
368 
369 int arizona_init_vol_limit(struct arizona *arizona)
370 {
371 	int i;
372 
373 	for (i = 0; i < ARRAY_SIZE(arizona->pdata.out_vol_limit); ++i) {
374 		if (arizona->pdata.out_vol_limit[i])
375 			regmap_update_bits(arizona->regmap,
376 					   ARIZONA_DAC_VOLUME_LIMIT_1L + i * 4,
377 					   ARIZONA_OUT1L_VOL_LIM_MASK,
378 					   arizona->pdata.out_vol_limit[i]);
379 	}
380 
381 	return 0;
382 }
383 EXPORT_SYMBOL_GPL(arizona_init_vol_limit);
384 
385 const char * const arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
386 	"None",
387 	"Tone Generator 1",
388 	"Tone Generator 2",
389 	"Haptics",
390 	"AEC",
391 	"AEC2",
392 	"Mic Mute Mixer",
393 	"Noise Generator",
394 	"IN1L",
395 	"IN1R",
396 	"IN2L",
397 	"IN2R",
398 	"IN3L",
399 	"IN3R",
400 	"IN4L",
401 	"IN4R",
402 	"AIF1RX1",
403 	"AIF1RX2",
404 	"AIF1RX3",
405 	"AIF1RX4",
406 	"AIF1RX5",
407 	"AIF1RX6",
408 	"AIF1RX7",
409 	"AIF1RX8",
410 	"AIF2RX1",
411 	"AIF2RX2",
412 	"AIF2RX3",
413 	"AIF2RX4",
414 	"AIF2RX5",
415 	"AIF2RX6",
416 	"AIF3RX1",
417 	"AIF3RX2",
418 	"SLIMRX1",
419 	"SLIMRX2",
420 	"SLIMRX3",
421 	"SLIMRX4",
422 	"SLIMRX5",
423 	"SLIMRX6",
424 	"SLIMRX7",
425 	"SLIMRX8",
426 	"EQ1",
427 	"EQ2",
428 	"EQ3",
429 	"EQ4",
430 	"DRC1L",
431 	"DRC1R",
432 	"DRC2L",
433 	"DRC2R",
434 	"LHPF1",
435 	"LHPF2",
436 	"LHPF3",
437 	"LHPF4",
438 	"DSP1.1",
439 	"DSP1.2",
440 	"DSP1.3",
441 	"DSP1.4",
442 	"DSP1.5",
443 	"DSP1.6",
444 	"DSP2.1",
445 	"DSP2.2",
446 	"DSP2.3",
447 	"DSP2.4",
448 	"DSP2.5",
449 	"DSP2.6",
450 	"DSP3.1",
451 	"DSP3.2",
452 	"DSP3.3",
453 	"DSP3.4",
454 	"DSP3.5",
455 	"DSP3.6",
456 	"DSP4.1",
457 	"DSP4.2",
458 	"DSP4.3",
459 	"DSP4.4",
460 	"DSP4.5",
461 	"DSP4.6",
462 	"ASRC1L",
463 	"ASRC1R",
464 	"ASRC2L",
465 	"ASRC2R",
466 	"ISRC1INT1",
467 	"ISRC1INT2",
468 	"ISRC1INT3",
469 	"ISRC1INT4",
470 	"ISRC1DEC1",
471 	"ISRC1DEC2",
472 	"ISRC1DEC3",
473 	"ISRC1DEC4",
474 	"ISRC2INT1",
475 	"ISRC2INT2",
476 	"ISRC2INT3",
477 	"ISRC2INT4",
478 	"ISRC2DEC1",
479 	"ISRC2DEC2",
480 	"ISRC2DEC3",
481 	"ISRC2DEC4",
482 	"ISRC3INT1",
483 	"ISRC3INT2",
484 	"ISRC3INT3",
485 	"ISRC3INT4",
486 	"ISRC3DEC1",
487 	"ISRC3DEC2",
488 	"ISRC3DEC3",
489 	"ISRC3DEC4",
490 };
491 EXPORT_SYMBOL_GPL(arizona_mixer_texts);
492 
493 unsigned int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS] = {
494 	0x00,  /* None */
495 	0x04,  /* Tone */
496 	0x05,
497 	0x06,  /* Haptics */
498 	0x08,  /* AEC */
499 	0x09,  /* AEC2 */
500 	0x0c,  /* Noise mixer */
501 	0x0d,  /* Comfort noise */
502 	0x10,  /* IN1L */
503 	0x11,
504 	0x12,
505 	0x13,
506 	0x14,
507 	0x15,
508 	0x16,
509 	0x17,
510 	0x20,  /* AIF1RX1 */
511 	0x21,
512 	0x22,
513 	0x23,
514 	0x24,
515 	0x25,
516 	0x26,
517 	0x27,
518 	0x28,  /* AIF2RX1 */
519 	0x29,
520 	0x2a,
521 	0x2b,
522 	0x2c,
523 	0x2d,
524 	0x30,  /* AIF3RX1 */
525 	0x31,
526 	0x38,  /* SLIMRX1 */
527 	0x39,
528 	0x3a,
529 	0x3b,
530 	0x3c,
531 	0x3d,
532 	0x3e,
533 	0x3f,
534 	0x50,  /* EQ1 */
535 	0x51,
536 	0x52,
537 	0x53,
538 	0x58,  /* DRC1L */
539 	0x59,
540 	0x5a,
541 	0x5b,
542 	0x60,  /* LHPF1 */
543 	0x61,
544 	0x62,
545 	0x63,
546 	0x68,  /* DSP1.1 */
547 	0x69,
548 	0x6a,
549 	0x6b,
550 	0x6c,
551 	0x6d,
552 	0x70,  /* DSP2.1 */
553 	0x71,
554 	0x72,
555 	0x73,
556 	0x74,
557 	0x75,
558 	0x78,  /* DSP3.1 */
559 	0x79,
560 	0x7a,
561 	0x7b,
562 	0x7c,
563 	0x7d,
564 	0x80,  /* DSP4.1 */
565 	0x81,
566 	0x82,
567 	0x83,
568 	0x84,
569 	0x85,
570 	0x90,  /* ASRC1L */
571 	0x91,
572 	0x92,
573 	0x93,
574 	0xa0,  /* ISRC1INT1 */
575 	0xa1,
576 	0xa2,
577 	0xa3,
578 	0xa4,  /* ISRC1DEC1 */
579 	0xa5,
580 	0xa6,
581 	0xa7,
582 	0xa8,  /* ISRC2DEC1 */
583 	0xa9,
584 	0xaa,
585 	0xab,
586 	0xac,  /* ISRC2INT1 */
587 	0xad,
588 	0xae,
589 	0xaf,
590 	0xb0,  /* ISRC3DEC1 */
591 	0xb1,
592 	0xb2,
593 	0xb3,
594 	0xb4,  /* ISRC3INT1 */
595 	0xb5,
596 	0xb6,
597 	0xb7,
598 };
599 EXPORT_SYMBOL_GPL(arizona_mixer_values);
600 
601 const DECLARE_TLV_DB_SCALE(arizona_mixer_tlv, -3200, 100, 0);
602 EXPORT_SYMBOL_GPL(arizona_mixer_tlv);
603 
604 const char * const arizona_sample_rate_text[ARIZONA_SAMPLE_RATE_ENUM_SIZE] = {
605 	"12kHz", "24kHz", "48kHz", "96kHz", "192kHz",
606 	"11.025kHz", "22.05kHz", "44.1kHz", "88.2kHz", "176.4kHz",
607 	"4kHz", "8kHz", "16kHz", "32kHz",
608 };
609 EXPORT_SYMBOL_GPL(arizona_sample_rate_text);
610 
611 const unsigned int arizona_sample_rate_val[ARIZONA_SAMPLE_RATE_ENUM_SIZE] = {
612 	0x01, 0x02, 0x03, 0x04, 0x05, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
613 	0x10, 0x11, 0x12, 0x13,
614 };
615 EXPORT_SYMBOL_GPL(arizona_sample_rate_val);
616 
617 const char *arizona_sample_rate_val_to_name(unsigned int rate_val)
618 {
619 	int i;
620 
621 	for (i = 0; i < ARRAY_SIZE(arizona_sample_rate_val); ++i) {
622 		if (arizona_sample_rate_val[i] == rate_val)
623 			return arizona_sample_rate_text[i];
624 	}
625 
626 	return "Illegal";
627 }
628 EXPORT_SYMBOL_GPL(arizona_sample_rate_val_to_name);
629 
630 const char * const arizona_rate_text[ARIZONA_RATE_ENUM_SIZE] = {
631 	"SYNCCLK rate", "8kHz", "16kHz", "ASYNCCLK rate",
632 };
633 EXPORT_SYMBOL_GPL(arizona_rate_text);
634 
635 const unsigned int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE] = {
636 	0, 1, 2, 8,
637 };
638 EXPORT_SYMBOL_GPL(arizona_rate_val);
639 
640 const struct soc_enum arizona_isrc_fsh[] = {
641 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_1_CTRL_1,
642 			      ARIZONA_ISRC1_FSH_SHIFT, 0xf,
643 			      ARIZONA_RATE_ENUM_SIZE,
644 			      arizona_rate_text, arizona_rate_val),
645 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_2_CTRL_1,
646 			      ARIZONA_ISRC2_FSH_SHIFT, 0xf,
647 			      ARIZONA_RATE_ENUM_SIZE,
648 			      arizona_rate_text, arizona_rate_val),
649 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_3_CTRL_1,
650 			      ARIZONA_ISRC3_FSH_SHIFT, 0xf,
651 			      ARIZONA_RATE_ENUM_SIZE,
652 			      arizona_rate_text, arizona_rate_val),
653 };
654 EXPORT_SYMBOL_GPL(arizona_isrc_fsh);
655 
656 const struct soc_enum arizona_isrc_fsl[] = {
657 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_1_CTRL_2,
658 			      ARIZONA_ISRC1_FSL_SHIFT, 0xf,
659 			      ARIZONA_RATE_ENUM_SIZE,
660 			      arizona_rate_text, arizona_rate_val),
661 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_2_CTRL_2,
662 			      ARIZONA_ISRC2_FSL_SHIFT, 0xf,
663 			      ARIZONA_RATE_ENUM_SIZE,
664 			      arizona_rate_text, arizona_rate_val),
665 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_3_CTRL_2,
666 			      ARIZONA_ISRC3_FSL_SHIFT, 0xf,
667 			      ARIZONA_RATE_ENUM_SIZE,
668 			      arizona_rate_text, arizona_rate_val),
669 };
670 EXPORT_SYMBOL_GPL(arizona_isrc_fsl);
671 
672 const struct soc_enum arizona_asrc_rate1 =
673 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ASRC_RATE1,
674 			      ARIZONA_ASRC_RATE1_SHIFT, 0xf,
675 			      ARIZONA_RATE_ENUM_SIZE - 1,
676 			      arizona_rate_text, arizona_rate_val);
677 EXPORT_SYMBOL_GPL(arizona_asrc_rate1);
678 
679 static const char * const arizona_vol_ramp_text[] = {
680 	"0ms/6dB", "0.5ms/6dB", "1ms/6dB", "2ms/6dB", "4ms/6dB", "8ms/6dB",
681 	"15ms/6dB", "30ms/6dB",
682 };
683 
684 SOC_ENUM_SINGLE_DECL(arizona_in_vd_ramp,
685 		     ARIZONA_INPUT_VOLUME_RAMP,
686 		     ARIZONA_IN_VD_RAMP_SHIFT,
687 		     arizona_vol_ramp_text);
688 EXPORT_SYMBOL_GPL(arizona_in_vd_ramp);
689 
690 SOC_ENUM_SINGLE_DECL(arizona_in_vi_ramp,
691 		     ARIZONA_INPUT_VOLUME_RAMP,
692 		     ARIZONA_IN_VI_RAMP_SHIFT,
693 		     arizona_vol_ramp_text);
694 EXPORT_SYMBOL_GPL(arizona_in_vi_ramp);
695 
696 SOC_ENUM_SINGLE_DECL(arizona_out_vd_ramp,
697 		     ARIZONA_OUTPUT_VOLUME_RAMP,
698 		     ARIZONA_OUT_VD_RAMP_SHIFT,
699 		     arizona_vol_ramp_text);
700 EXPORT_SYMBOL_GPL(arizona_out_vd_ramp);
701 
702 SOC_ENUM_SINGLE_DECL(arizona_out_vi_ramp,
703 		     ARIZONA_OUTPUT_VOLUME_RAMP,
704 		     ARIZONA_OUT_VI_RAMP_SHIFT,
705 		     arizona_vol_ramp_text);
706 EXPORT_SYMBOL_GPL(arizona_out_vi_ramp);
707 
708 static const char * const arizona_lhpf_mode_text[] = {
709 	"Low-pass", "High-pass"
710 };
711 
712 SOC_ENUM_SINGLE_DECL(arizona_lhpf1_mode,
713 		     ARIZONA_HPLPF1_1,
714 		     ARIZONA_LHPF1_MODE_SHIFT,
715 		     arizona_lhpf_mode_text);
716 EXPORT_SYMBOL_GPL(arizona_lhpf1_mode);
717 
718 SOC_ENUM_SINGLE_DECL(arizona_lhpf2_mode,
719 		     ARIZONA_HPLPF2_1,
720 		     ARIZONA_LHPF2_MODE_SHIFT,
721 		     arizona_lhpf_mode_text);
722 EXPORT_SYMBOL_GPL(arizona_lhpf2_mode);
723 
724 SOC_ENUM_SINGLE_DECL(arizona_lhpf3_mode,
725 		     ARIZONA_HPLPF3_1,
726 		     ARIZONA_LHPF3_MODE_SHIFT,
727 		     arizona_lhpf_mode_text);
728 EXPORT_SYMBOL_GPL(arizona_lhpf3_mode);
729 
730 SOC_ENUM_SINGLE_DECL(arizona_lhpf4_mode,
731 		     ARIZONA_HPLPF4_1,
732 		     ARIZONA_LHPF4_MODE_SHIFT,
733 		     arizona_lhpf_mode_text);
734 EXPORT_SYMBOL_GPL(arizona_lhpf4_mode);
735 
736 static const char * const arizona_ng_hold_text[] = {
737 	"30ms", "120ms", "250ms", "500ms",
738 };
739 
740 SOC_ENUM_SINGLE_DECL(arizona_ng_hold,
741 		     ARIZONA_NOISE_GATE_CONTROL,
742 		     ARIZONA_NGATE_HOLD_SHIFT,
743 		     arizona_ng_hold_text);
744 EXPORT_SYMBOL_GPL(arizona_ng_hold);
745 
746 static const char * const arizona_in_hpf_cut_text[] = {
747 	"2.5Hz", "5Hz", "10Hz", "20Hz", "40Hz"
748 };
749 
750 SOC_ENUM_SINGLE_DECL(arizona_in_hpf_cut_enum,
751 		     ARIZONA_HPF_CONTROL,
752 		     ARIZONA_IN_HPF_CUT_SHIFT,
753 		     arizona_in_hpf_cut_text);
754 EXPORT_SYMBOL_GPL(arizona_in_hpf_cut_enum);
755 
756 static const char * const arizona_in_dmic_osr_text[] = {
757 	"1.536MHz", "3.072MHz", "6.144MHz", "768kHz",
758 };
759 
760 const struct soc_enum arizona_in_dmic_osr[] = {
761 	SOC_ENUM_SINGLE(ARIZONA_IN1L_CONTROL, ARIZONA_IN1_OSR_SHIFT,
762 			ARRAY_SIZE(arizona_in_dmic_osr_text),
763 			arizona_in_dmic_osr_text),
764 	SOC_ENUM_SINGLE(ARIZONA_IN2L_CONTROL, ARIZONA_IN2_OSR_SHIFT,
765 			ARRAY_SIZE(arizona_in_dmic_osr_text),
766 			arizona_in_dmic_osr_text),
767 	SOC_ENUM_SINGLE(ARIZONA_IN3L_CONTROL, ARIZONA_IN3_OSR_SHIFT,
768 			ARRAY_SIZE(arizona_in_dmic_osr_text),
769 			arizona_in_dmic_osr_text),
770 	SOC_ENUM_SINGLE(ARIZONA_IN4L_CONTROL, ARIZONA_IN4_OSR_SHIFT,
771 			ARRAY_SIZE(arizona_in_dmic_osr_text),
772 			arizona_in_dmic_osr_text),
773 };
774 EXPORT_SYMBOL_GPL(arizona_in_dmic_osr);
775 
776 static const char * const arizona_anc_input_src_text[] = {
777 	"None", "IN1", "IN2", "IN3", "IN4",
778 };
779 
780 static const char * const arizona_anc_channel_src_text[] = {
781 	"None", "Left", "Right", "Combine",
782 };
783 
784 const struct soc_enum arizona_anc_input_src[] = {
785 	SOC_ENUM_SINGLE(ARIZONA_ANC_SRC,
786 			ARIZONA_IN_RXANCL_SEL_SHIFT,
787 			ARRAY_SIZE(arizona_anc_input_src_text),
788 			arizona_anc_input_src_text),
789 	SOC_ENUM_SINGLE(ARIZONA_FCL_ADC_REFORMATTER_CONTROL,
790 			ARIZONA_FCL_MIC_MODE_SEL_SHIFT,
791 			ARRAY_SIZE(arizona_anc_channel_src_text),
792 			arizona_anc_channel_src_text),
793 	SOC_ENUM_SINGLE(ARIZONA_ANC_SRC,
794 			ARIZONA_IN_RXANCR_SEL_SHIFT,
795 			ARRAY_SIZE(arizona_anc_input_src_text),
796 			arizona_anc_input_src_text),
797 	SOC_ENUM_SINGLE(ARIZONA_FCR_ADC_REFORMATTER_CONTROL,
798 			ARIZONA_FCR_MIC_MODE_SEL_SHIFT,
799 			ARRAY_SIZE(arizona_anc_channel_src_text),
800 			arizona_anc_channel_src_text),
801 };
802 EXPORT_SYMBOL_GPL(arizona_anc_input_src);
803 
804 static const char * const arizona_anc_ng_texts[] = {
805 	"None",
806 	"Internal",
807 	"External",
808 };
809 
810 SOC_ENUM_SINGLE_DECL(arizona_anc_ng_enum, SND_SOC_NOPM, 0,
811 		     arizona_anc_ng_texts);
812 EXPORT_SYMBOL_GPL(arizona_anc_ng_enum);
813 
814 static const char * const arizona_output_anc_src_text[] = {
815 	"None", "RXANCL", "RXANCR",
816 };
817 
818 const struct soc_enum arizona_output_anc_src[] = {
819 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_1L,
820 			ARIZONA_OUT1L_ANC_SRC_SHIFT,
821 			ARRAY_SIZE(arizona_output_anc_src_text),
822 			arizona_output_anc_src_text),
823 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_1R,
824 			ARIZONA_OUT1R_ANC_SRC_SHIFT,
825 			ARRAY_SIZE(arizona_output_anc_src_text),
826 			arizona_output_anc_src_text),
827 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_2L,
828 			ARIZONA_OUT2L_ANC_SRC_SHIFT,
829 			ARRAY_SIZE(arizona_output_anc_src_text),
830 			arizona_output_anc_src_text),
831 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_2R,
832 			ARIZONA_OUT2R_ANC_SRC_SHIFT,
833 			ARRAY_SIZE(arizona_output_anc_src_text),
834 			arizona_output_anc_src_text),
835 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_3L,
836 			ARIZONA_OUT3L_ANC_SRC_SHIFT,
837 			ARRAY_SIZE(arizona_output_anc_src_text),
838 			arizona_output_anc_src_text),
839 	SOC_ENUM_SINGLE(ARIZONA_DAC_VOLUME_LIMIT_3R,
840 			ARIZONA_OUT3R_ANC_SRC_SHIFT,
841 			ARRAY_SIZE(arizona_output_anc_src_text),
842 			arizona_output_anc_src_text),
843 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_4L,
844 			ARIZONA_OUT4L_ANC_SRC_SHIFT,
845 			ARRAY_SIZE(arizona_output_anc_src_text),
846 			arizona_output_anc_src_text),
847 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_4R,
848 			ARIZONA_OUT4R_ANC_SRC_SHIFT,
849 			ARRAY_SIZE(arizona_output_anc_src_text),
850 			arizona_output_anc_src_text),
851 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_5L,
852 			ARIZONA_OUT5L_ANC_SRC_SHIFT,
853 			ARRAY_SIZE(arizona_output_anc_src_text),
854 			arizona_output_anc_src_text),
855 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_5R,
856 			ARIZONA_OUT5R_ANC_SRC_SHIFT,
857 			ARRAY_SIZE(arizona_output_anc_src_text),
858 			arizona_output_anc_src_text),
859 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_6L,
860 			ARIZONA_OUT6L_ANC_SRC_SHIFT,
861 			ARRAY_SIZE(arizona_output_anc_src_text),
862 			arizona_output_anc_src_text),
863 	SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_6R,
864 			ARIZONA_OUT6R_ANC_SRC_SHIFT,
865 			ARRAY_SIZE(arizona_output_anc_src_text),
866 			arizona_output_anc_src_text),
867 };
868 EXPORT_SYMBOL_GPL(arizona_output_anc_src);
869 
870 const struct snd_kcontrol_new arizona_voice_trigger_switch[] = {
871 	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0),
872 	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 1, 1, 0),
873 	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 2, 1, 0),
874 	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 3, 1, 0),
875 };
876 EXPORT_SYMBOL_GPL(arizona_voice_trigger_switch);
877 
878 static void arizona_in_set_vu(struct snd_soc_component *component, int ena)
879 {
880 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
881 	unsigned int val;
882 	int i;
883 
884 	if (ena)
885 		val = ARIZONA_IN_VU;
886 	else
887 		val = 0;
888 
889 	for (i = 0; i < priv->num_inputs; i++)
890 		snd_soc_component_update_bits(component,
891 				    ARIZONA_ADC_DIGITAL_VOLUME_1L + (i * 4),
892 				    ARIZONA_IN_VU, val);
893 }
894 
895 bool arizona_input_analog(struct snd_soc_component *component, int shift)
896 {
897 	unsigned int reg = ARIZONA_IN1L_CONTROL + ((shift / 2) * 8);
898 	unsigned int val = snd_soc_component_read(component, reg);
899 
900 	return !(val & ARIZONA_IN1_MODE_MASK);
901 }
902 EXPORT_SYMBOL_GPL(arizona_input_analog);
903 
904 int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
905 		  int event)
906 {
907 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
908 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
909 	unsigned int reg;
910 
911 	if (w->shift % 2)
912 		reg = ARIZONA_ADC_DIGITAL_VOLUME_1L + ((w->shift / 2) * 8);
913 	else
914 		reg = ARIZONA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8);
915 
916 	switch (event) {
917 	case SND_SOC_DAPM_PRE_PMU:
918 		priv->in_pending++;
919 		break;
920 	case SND_SOC_DAPM_POST_PMU:
921 		snd_soc_component_update_bits(component, reg,
922 					      ARIZONA_IN1L_MUTE, 0);
923 
924 		/* If this is the last input pending then allow VU */
925 		priv->in_pending--;
926 		if (priv->in_pending == 0) {
927 			msleep(1);
928 			arizona_in_set_vu(component, 1);
929 		}
930 		break;
931 	case SND_SOC_DAPM_PRE_PMD:
932 		snd_soc_component_update_bits(component, reg,
933 				    ARIZONA_IN1L_MUTE | ARIZONA_IN_VU,
934 				    ARIZONA_IN1L_MUTE | ARIZONA_IN_VU);
935 		break;
936 	case SND_SOC_DAPM_POST_PMD:
937 		/* Disable volume updates if no inputs are enabled */
938 		reg = snd_soc_component_read(component, ARIZONA_INPUT_ENABLES);
939 		if (reg == 0)
940 			arizona_in_set_vu(component, 0);
941 		break;
942 	default:
943 		break;
944 	}
945 
946 	return 0;
947 }
948 EXPORT_SYMBOL_GPL(arizona_in_ev);
949 
950 int arizona_out_ev(struct snd_soc_dapm_widget *w,
951 		   struct snd_kcontrol *kcontrol,
952 		   int event)
953 {
954 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
955 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
956 	struct arizona *arizona = priv->arizona;
957 
958 	switch (event) {
959 	case SND_SOC_DAPM_PRE_PMU:
960 		switch (w->shift) {
961 		case ARIZONA_OUT1L_ENA_SHIFT:
962 		case ARIZONA_OUT1R_ENA_SHIFT:
963 		case ARIZONA_OUT2L_ENA_SHIFT:
964 		case ARIZONA_OUT2R_ENA_SHIFT:
965 		case ARIZONA_OUT3L_ENA_SHIFT:
966 		case ARIZONA_OUT3R_ENA_SHIFT:
967 			priv->out_up_pending++;
968 			priv->out_up_delay += 17000;
969 			break;
970 		case ARIZONA_OUT4L_ENA_SHIFT:
971 		case ARIZONA_OUT4R_ENA_SHIFT:
972 			priv->out_up_pending++;
973 			switch (arizona->type) {
974 			case WM5102:
975 			case WM8997:
976 				break;
977 			default:
978 				priv->out_up_delay += 10000;
979 				break;
980 			}
981 			break;
982 		default:
983 			break;
984 		}
985 		break;
986 	case SND_SOC_DAPM_POST_PMU:
987 		switch (w->shift) {
988 		case ARIZONA_OUT1L_ENA_SHIFT:
989 		case ARIZONA_OUT1R_ENA_SHIFT:
990 		case ARIZONA_OUT2L_ENA_SHIFT:
991 		case ARIZONA_OUT2R_ENA_SHIFT:
992 		case ARIZONA_OUT3L_ENA_SHIFT:
993 		case ARIZONA_OUT3R_ENA_SHIFT:
994 		case ARIZONA_OUT4L_ENA_SHIFT:
995 		case ARIZONA_OUT4R_ENA_SHIFT:
996 			priv->out_up_pending--;
997 			if (!priv->out_up_pending && priv->out_up_delay) {
998 				dev_dbg(component->dev, "Power up delay: %d\n",
999 					priv->out_up_delay);
1000 				fsleep(priv->out_up_delay);
1001 				priv->out_up_delay = 0;
1002 			}
1003 			break;
1004 
1005 		default:
1006 			break;
1007 		}
1008 		break;
1009 	case SND_SOC_DAPM_PRE_PMD:
1010 		switch (w->shift) {
1011 		case ARIZONA_OUT1L_ENA_SHIFT:
1012 		case ARIZONA_OUT1R_ENA_SHIFT:
1013 		case ARIZONA_OUT2L_ENA_SHIFT:
1014 		case ARIZONA_OUT2R_ENA_SHIFT:
1015 		case ARIZONA_OUT3L_ENA_SHIFT:
1016 		case ARIZONA_OUT3R_ENA_SHIFT:
1017 			priv->out_down_pending++;
1018 			priv->out_down_delay += 1000;
1019 			break;
1020 		case ARIZONA_OUT4L_ENA_SHIFT:
1021 		case ARIZONA_OUT4R_ENA_SHIFT:
1022 			priv->out_down_pending++;
1023 			switch (arizona->type) {
1024 			case WM5102:
1025 			case WM8997:
1026 				break;
1027 			case WM8998:
1028 			case WM1814:
1029 				priv->out_down_delay += 5000;
1030 				break;
1031 			default:
1032 				priv->out_down_delay += 1000;
1033 				break;
1034 			}
1035 			break;
1036 		default:
1037 			break;
1038 		}
1039 		break;
1040 	case SND_SOC_DAPM_POST_PMD:
1041 		switch (w->shift) {
1042 		case ARIZONA_OUT1L_ENA_SHIFT:
1043 		case ARIZONA_OUT1R_ENA_SHIFT:
1044 		case ARIZONA_OUT2L_ENA_SHIFT:
1045 		case ARIZONA_OUT2R_ENA_SHIFT:
1046 		case ARIZONA_OUT3L_ENA_SHIFT:
1047 		case ARIZONA_OUT3R_ENA_SHIFT:
1048 		case ARIZONA_OUT4L_ENA_SHIFT:
1049 		case ARIZONA_OUT4R_ENA_SHIFT:
1050 			priv->out_down_pending--;
1051 			if (!priv->out_down_pending && priv->out_down_delay) {
1052 				dev_dbg(component->dev, "Power down delay: %d\n",
1053 					priv->out_down_delay);
1054 				fsleep(priv->out_down_delay);
1055 				priv->out_down_delay = 0;
1056 			}
1057 			break;
1058 		default:
1059 			break;
1060 		}
1061 		break;
1062 	default:
1063 		break;
1064 	}
1065 
1066 	return 0;
1067 }
1068 EXPORT_SYMBOL_GPL(arizona_out_ev);
1069 
1070 int arizona_hp_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
1071 		  int event)
1072 {
1073 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1074 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1075 	struct arizona *arizona = priv->arizona;
1076 	unsigned int mask = 1 << w->shift;
1077 	unsigned int val;
1078 
1079 	switch (event) {
1080 	case SND_SOC_DAPM_POST_PMU:
1081 		val = mask;
1082 		break;
1083 	case SND_SOC_DAPM_PRE_PMD:
1084 		val = 0;
1085 		break;
1086 	case SND_SOC_DAPM_PRE_PMU:
1087 	case SND_SOC_DAPM_POST_PMD:
1088 		return arizona_out_ev(w, kcontrol, event);
1089 	default:
1090 		return -EINVAL;
1091 	}
1092 
1093 	/* Store the desired state for the HP outputs */
1094 	priv->arizona->hp_ena &= ~mask;
1095 	priv->arizona->hp_ena |= val;
1096 
1097 	/* Force off if HPDET clamp is active */
1098 	if (priv->arizona->hpdet_clamp)
1099 		val = 0;
1100 
1101 	regmap_update_bits_async(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1,
1102 				 mask, val);
1103 
1104 	return arizona_out_ev(w, kcontrol, event);
1105 }
1106 EXPORT_SYMBOL_GPL(arizona_hp_ev);
1107 
1108 static int arizona_dvfs_enable(struct snd_soc_component *component)
1109 {
1110 	const struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1111 	struct arizona *arizona = priv->arizona;
1112 	int ret;
1113 
1114 	ret = regulator_set_voltage(arizona->dcvdd, 1800000, 1800000);
1115 	if (ret) {
1116 		dev_err(component->dev, "Failed to boost DCVDD: %d\n", ret);
1117 		return ret;
1118 	}
1119 
1120 	ret = regmap_update_bits(arizona->regmap,
1121 				 ARIZONA_DYNAMIC_FREQUENCY_SCALING_1,
1122 				 ARIZONA_SUBSYS_MAX_FREQ,
1123 				 ARIZONA_SUBSYS_MAX_FREQ);
1124 	if (ret) {
1125 		dev_err(component->dev, "Failed to enable subsys max: %d\n", ret);
1126 		regulator_set_voltage(arizona->dcvdd, 1200000, 1800000);
1127 		return ret;
1128 	}
1129 
1130 	return 0;
1131 }
1132 
1133 static int arizona_dvfs_disable(struct snd_soc_component *component)
1134 {
1135 	const struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1136 	struct arizona *arizona = priv->arizona;
1137 	int ret;
1138 
1139 	ret = regmap_update_bits(arizona->regmap,
1140 				 ARIZONA_DYNAMIC_FREQUENCY_SCALING_1,
1141 				 ARIZONA_SUBSYS_MAX_FREQ, 0);
1142 	if (ret) {
1143 		dev_err(component->dev, "Failed to disable subsys max: %d\n", ret);
1144 		return ret;
1145 	}
1146 
1147 	ret = regulator_set_voltage(arizona->dcvdd, 1200000, 1800000);
1148 	if (ret) {
1149 		dev_err(component->dev, "Failed to unboost DCVDD: %d\n", ret);
1150 		return ret;
1151 	}
1152 
1153 	return 0;
1154 }
1155 
1156 int arizona_dvfs_up(struct snd_soc_component *component, unsigned int flags)
1157 {
1158 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1159 	int ret = 0;
1160 
1161 	mutex_lock(&priv->dvfs_lock);
1162 
1163 	if (!priv->dvfs_cached && !priv->dvfs_reqs) {
1164 		ret = arizona_dvfs_enable(component);
1165 		if (ret)
1166 			goto err;
1167 	}
1168 
1169 	priv->dvfs_reqs |= flags;
1170 err:
1171 	mutex_unlock(&priv->dvfs_lock);
1172 	return ret;
1173 }
1174 EXPORT_SYMBOL_GPL(arizona_dvfs_up);
1175 
1176 int arizona_dvfs_down(struct snd_soc_component *component, unsigned int flags)
1177 {
1178 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1179 	unsigned int old_reqs;
1180 	int ret = 0;
1181 
1182 	mutex_lock(&priv->dvfs_lock);
1183 
1184 	old_reqs = priv->dvfs_reqs;
1185 	priv->dvfs_reqs &= ~flags;
1186 
1187 	if (!priv->dvfs_cached && old_reqs && !priv->dvfs_reqs)
1188 		ret = arizona_dvfs_disable(component);
1189 
1190 	mutex_unlock(&priv->dvfs_lock);
1191 	return ret;
1192 }
1193 EXPORT_SYMBOL_GPL(arizona_dvfs_down);
1194 
1195 int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w,
1196 			   struct snd_kcontrol *kcontrol, int event)
1197 {
1198 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1199 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1200 	int ret = 0;
1201 
1202 	mutex_lock(&priv->dvfs_lock);
1203 
1204 	switch (event) {
1205 	case SND_SOC_DAPM_POST_PMU:
1206 		if (priv->dvfs_reqs)
1207 			ret = arizona_dvfs_enable(component);
1208 
1209 		priv->dvfs_cached = false;
1210 		break;
1211 	case SND_SOC_DAPM_PRE_PMD:
1212 		/* We must ensure DVFS is disabled before the codec goes into
1213 		 * suspend so that we are never in an illegal state of DVFS
1214 		 * enabled without enough DCVDD
1215 		 */
1216 		priv->dvfs_cached = true;
1217 
1218 		if (priv->dvfs_reqs)
1219 			ret = arizona_dvfs_disable(component);
1220 		break;
1221 	default:
1222 		break;
1223 	}
1224 
1225 	mutex_unlock(&priv->dvfs_lock);
1226 	return ret;
1227 }
1228 EXPORT_SYMBOL_GPL(arizona_dvfs_sysclk_ev);
1229 
1230 void arizona_init_dvfs(struct arizona_priv *priv)
1231 {
1232 	mutex_init(&priv->dvfs_lock);
1233 }
1234 EXPORT_SYMBOL_GPL(arizona_init_dvfs);
1235 
1236 int arizona_anc_ev(struct snd_soc_dapm_widget *w,
1237 		   struct snd_kcontrol *kcontrol,
1238 		   int event)
1239 {
1240 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1241 	unsigned int val;
1242 
1243 	switch (event) {
1244 	case SND_SOC_DAPM_POST_PMU:
1245 		val = 1 << w->shift;
1246 		break;
1247 	case SND_SOC_DAPM_PRE_PMD:
1248 		val = 1 << (w->shift + 1);
1249 		break;
1250 	default:
1251 		return 0;
1252 	}
1253 
1254 	snd_soc_component_write(component, ARIZONA_CLOCK_CONTROL, val);
1255 
1256 	return 0;
1257 }
1258 EXPORT_SYMBOL_GPL(arizona_anc_ev);
1259 
1260 static unsigned int arizona_opclk_ref_48k_rates[] = {
1261 	6144000,
1262 	12288000,
1263 	24576000,
1264 	49152000,
1265 };
1266 
1267 static unsigned int arizona_opclk_ref_44k1_rates[] = {
1268 	5644800,
1269 	11289600,
1270 	22579200,
1271 	45158400,
1272 };
1273 
1274 static int arizona_set_opclk(struct snd_soc_component *component,
1275 			     unsigned int clk, unsigned int freq)
1276 {
1277 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1278 	unsigned int reg;
1279 	unsigned int *rates;
1280 	int ref, div, refclk;
1281 
1282 	switch (clk) {
1283 	case ARIZONA_CLK_OPCLK:
1284 		reg = ARIZONA_OUTPUT_SYSTEM_CLOCK;
1285 		refclk = priv->sysclk;
1286 		break;
1287 	case ARIZONA_CLK_ASYNC_OPCLK:
1288 		reg = ARIZONA_OUTPUT_ASYNC_CLOCK;
1289 		refclk = priv->asyncclk;
1290 		break;
1291 	default:
1292 		return -EINVAL;
1293 	}
1294 
1295 	if (refclk % 8000)
1296 		rates = arizona_opclk_ref_44k1_rates;
1297 	else
1298 		rates = arizona_opclk_ref_48k_rates;
1299 
1300 	for (ref = 0; ref < ARRAY_SIZE(arizona_opclk_ref_48k_rates) &&
1301 	     rates[ref] <= refclk; ref++) {
1302 		div = 1;
1303 		while (rates[ref] / div >= freq && div < 32) {
1304 			if (rates[ref] / div == freq) {
1305 				dev_dbg(component->dev, "Configured %dHz OPCLK\n",
1306 					freq);
1307 				snd_soc_component_update_bits(component, reg,
1308 						    ARIZONA_OPCLK_DIV_MASK |
1309 						    ARIZONA_OPCLK_SEL_MASK,
1310 						    (div <<
1311 						     ARIZONA_OPCLK_DIV_SHIFT) |
1312 						    ref);
1313 				return 0;
1314 			}
1315 			div++;
1316 		}
1317 	}
1318 
1319 	dev_err(component->dev, "Unable to generate %dHz OPCLK\n", freq);
1320 	return -EINVAL;
1321 }
1322 
1323 int arizona_clk_ev(struct snd_soc_dapm_widget *w,
1324 		   struct snd_kcontrol *kcontrol, int event)
1325 {
1326 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1327 	struct arizona *arizona = dev_get_drvdata(component->dev->parent);
1328 	unsigned int val;
1329 	int clk_idx;
1330 	int ret;
1331 
1332 	ret = regmap_read(arizona->regmap, w->reg, &val);
1333 	if (ret) {
1334 		dev_err(component->dev, "Failed to check clock source: %d\n", ret);
1335 		return ret;
1336 	}
1337 
1338 	val = (val & ARIZONA_SYSCLK_SRC_MASK) >> ARIZONA_SYSCLK_SRC_SHIFT;
1339 
1340 	switch (val) {
1341 	case ARIZONA_CLK_SRC_MCLK1:
1342 		clk_idx = ARIZONA_MCLK1;
1343 		break;
1344 	case ARIZONA_CLK_SRC_MCLK2:
1345 		clk_idx = ARIZONA_MCLK2;
1346 		break;
1347 	default:
1348 		return 0;
1349 	}
1350 
1351 	switch (event) {
1352 	case SND_SOC_DAPM_PRE_PMU:
1353 		return clk_prepare_enable(arizona->mclk[clk_idx]);
1354 	case SND_SOC_DAPM_POST_PMD:
1355 		clk_disable_unprepare(arizona->mclk[clk_idx]);
1356 		return 0;
1357 	default:
1358 		return 0;
1359 	}
1360 }
1361 EXPORT_SYMBOL_GPL(arizona_clk_ev);
1362 
1363 int arizona_set_sysclk(struct snd_soc_component *component, int clk_id,
1364 		       int source, unsigned int freq, int dir)
1365 {
1366 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1367 	struct arizona *arizona = priv->arizona;
1368 	char *name;
1369 	unsigned int reg;
1370 	unsigned int mask = ARIZONA_SYSCLK_FREQ_MASK | ARIZONA_SYSCLK_SRC_MASK;
1371 	unsigned int val = source << ARIZONA_SYSCLK_SRC_SHIFT;
1372 	int *clk;
1373 
1374 	switch (clk_id) {
1375 	case ARIZONA_CLK_SYSCLK:
1376 		name = "SYSCLK";
1377 		reg = ARIZONA_SYSTEM_CLOCK_1;
1378 		clk = &priv->sysclk;
1379 		mask |= ARIZONA_SYSCLK_FRAC;
1380 		break;
1381 	case ARIZONA_CLK_ASYNCCLK:
1382 		name = "ASYNCCLK";
1383 		reg = ARIZONA_ASYNC_CLOCK_1;
1384 		clk = &priv->asyncclk;
1385 		break;
1386 	case ARIZONA_CLK_OPCLK:
1387 	case ARIZONA_CLK_ASYNC_OPCLK:
1388 		return arizona_set_opclk(component, clk_id, freq);
1389 	default:
1390 		return -EINVAL;
1391 	}
1392 
1393 	switch (freq) {
1394 	case  5644800:
1395 	case  6144000:
1396 		break;
1397 	case 11289600:
1398 	case 12288000:
1399 		val |= ARIZONA_CLK_12MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
1400 		break;
1401 	case 22579200:
1402 	case 24576000:
1403 		val |= ARIZONA_CLK_24MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
1404 		break;
1405 	case 45158400:
1406 	case 49152000:
1407 		val |= ARIZONA_CLK_49MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
1408 		break;
1409 	case 67737600:
1410 	case 73728000:
1411 		val |= ARIZONA_CLK_73MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
1412 		break;
1413 	case 90316800:
1414 	case 98304000:
1415 		val |= ARIZONA_CLK_98MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
1416 		break;
1417 	case 135475200:
1418 	case 147456000:
1419 		val |= ARIZONA_CLK_147MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
1420 		break;
1421 	case 0:
1422 		dev_dbg(arizona->dev, "%s cleared\n", name);
1423 		*clk = freq;
1424 		return 0;
1425 	default:
1426 		return -EINVAL;
1427 	}
1428 
1429 	*clk = freq;
1430 
1431 	if (freq % 6144000)
1432 		val |= ARIZONA_SYSCLK_FRAC;
1433 
1434 	dev_dbg(arizona->dev, "%s set to %uHz", name, freq);
1435 
1436 	return regmap_update_bits(arizona->regmap, reg, mask, val);
1437 }
1438 EXPORT_SYMBOL_GPL(arizona_set_sysclk);
1439 
1440 static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1441 {
1442 	struct snd_soc_component *component = dai->component;
1443 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1444 	struct arizona *arizona = priv->arizona;
1445 	int lrclk, bclk, mode, base;
1446 
1447 	base = dai->driver->base;
1448 
1449 	lrclk = 0;
1450 	bclk = 0;
1451 
1452 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1453 	case SND_SOC_DAIFMT_DSP_A:
1454 		mode = ARIZONA_FMT_DSP_MODE_A;
1455 		break;
1456 	case SND_SOC_DAIFMT_DSP_B:
1457 		if ((fmt & SND_SOC_DAIFMT_MASTER_MASK)
1458 				!= SND_SOC_DAIFMT_CBP_CFP) {
1459 			arizona_aif_err(dai, "DSP_B not valid in slave mode\n");
1460 			return -EINVAL;
1461 		}
1462 		mode = ARIZONA_FMT_DSP_MODE_B;
1463 		break;
1464 	case SND_SOC_DAIFMT_I2S:
1465 		mode = ARIZONA_FMT_I2S_MODE;
1466 		break;
1467 	case SND_SOC_DAIFMT_LEFT_J:
1468 		if ((fmt & SND_SOC_DAIFMT_MASTER_MASK)
1469 				!= SND_SOC_DAIFMT_CBP_CFP) {
1470 			arizona_aif_err(dai, "LEFT_J not valid in slave mode\n");
1471 			return -EINVAL;
1472 		}
1473 		mode = ARIZONA_FMT_LEFT_JUSTIFIED_MODE;
1474 		break;
1475 	default:
1476 		arizona_aif_err(dai, "Unsupported DAI format %d\n",
1477 				fmt & SND_SOC_DAIFMT_FORMAT_MASK);
1478 		return -EINVAL;
1479 	}
1480 
1481 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1482 	case SND_SOC_DAIFMT_CBC_CFC:
1483 		break;
1484 	case SND_SOC_DAIFMT_CBC_CFP:
1485 		lrclk |= ARIZONA_AIF1TX_LRCLK_MSTR;
1486 		break;
1487 	case SND_SOC_DAIFMT_CBP_CFC:
1488 		bclk |= ARIZONA_AIF1_BCLK_MSTR;
1489 		break;
1490 	case SND_SOC_DAIFMT_CBP_CFP:
1491 		bclk |= ARIZONA_AIF1_BCLK_MSTR;
1492 		lrclk |= ARIZONA_AIF1TX_LRCLK_MSTR;
1493 		break;
1494 	default:
1495 		arizona_aif_err(dai, "Unsupported master mode %d\n",
1496 				fmt & SND_SOC_DAIFMT_MASTER_MASK);
1497 		return -EINVAL;
1498 	}
1499 
1500 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1501 	case SND_SOC_DAIFMT_NB_NF:
1502 		break;
1503 	case SND_SOC_DAIFMT_IB_IF:
1504 		bclk |= ARIZONA_AIF1_BCLK_INV;
1505 		lrclk |= ARIZONA_AIF1TX_LRCLK_INV;
1506 		break;
1507 	case SND_SOC_DAIFMT_IB_NF:
1508 		bclk |= ARIZONA_AIF1_BCLK_INV;
1509 		break;
1510 	case SND_SOC_DAIFMT_NB_IF:
1511 		lrclk |= ARIZONA_AIF1TX_LRCLK_INV;
1512 		break;
1513 	default:
1514 		return -EINVAL;
1515 	}
1516 
1517 	regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_BCLK_CTRL,
1518 				 ARIZONA_AIF1_BCLK_INV |
1519 				 ARIZONA_AIF1_BCLK_MSTR,
1520 				 bclk);
1521 	regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_TX_PIN_CTRL,
1522 				 ARIZONA_AIF1TX_LRCLK_INV |
1523 				 ARIZONA_AIF1TX_LRCLK_MSTR, lrclk);
1524 	regmap_update_bits_async(arizona->regmap,
1525 				 base + ARIZONA_AIF_RX_PIN_CTRL,
1526 				 ARIZONA_AIF1RX_LRCLK_INV |
1527 				 ARIZONA_AIF1RX_LRCLK_MSTR, lrclk);
1528 	regmap_update_bits(arizona->regmap, base + ARIZONA_AIF_FORMAT,
1529 			   ARIZONA_AIF1_FMT_MASK, mode);
1530 
1531 	return 0;
1532 }
1533 
1534 static const int arizona_48k_bclk_rates[] = {
1535 	-1,
1536 	48000,
1537 	64000,
1538 	96000,
1539 	128000,
1540 	192000,
1541 	256000,
1542 	384000,
1543 	512000,
1544 	768000,
1545 	1024000,
1546 	1536000,
1547 	2048000,
1548 	3072000,
1549 	4096000,
1550 	6144000,
1551 	8192000,
1552 	12288000,
1553 	24576000,
1554 };
1555 
1556 static const int arizona_44k1_bclk_rates[] = {
1557 	-1,
1558 	44100,
1559 	58800,
1560 	88200,
1561 	117600,
1562 	177640,
1563 	235200,
1564 	352800,
1565 	470400,
1566 	705600,
1567 	940800,
1568 	1411200,
1569 	1881600,
1570 	2822400,
1571 	3763200,
1572 	5644800,
1573 	7526400,
1574 	11289600,
1575 	22579200,
1576 };
1577 
1578 static const unsigned int arizona_sr_vals[] = {
1579 	0,
1580 	12000,
1581 	24000,
1582 	48000,
1583 	96000,
1584 	192000,
1585 	384000,
1586 	768000,
1587 	0,
1588 	11025,
1589 	22050,
1590 	44100,
1591 	88200,
1592 	176400,
1593 	352800,
1594 	705600,
1595 	4000,
1596 	8000,
1597 	16000,
1598 	32000,
1599 	64000,
1600 	128000,
1601 	256000,
1602 	512000,
1603 };
1604 
1605 #define ARIZONA_48K_RATE_MASK	0x0F003E
1606 #define ARIZONA_44K1_RATE_MASK	0x003E00
1607 #define ARIZONA_RATE_MASK	(ARIZONA_48K_RATE_MASK | ARIZONA_44K1_RATE_MASK)
1608 
1609 static const struct snd_pcm_hw_constraint_list arizona_constraint = {
1610 	.count	= ARRAY_SIZE(arizona_sr_vals),
1611 	.list	= arizona_sr_vals,
1612 };
1613 
1614 static int arizona_startup(struct snd_pcm_substream *substream,
1615 			   struct snd_soc_dai *dai)
1616 {
1617 	struct snd_soc_component *component = dai->component;
1618 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1619 	struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1620 	unsigned int base_rate;
1621 
1622 	if (!substream->runtime)
1623 		return 0;
1624 
1625 	switch (dai_priv->clk) {
1626 	case ARIZONA_CLK_SYSCLK:
1627 		base_rate = priv->sysclk;
1628 		break;
1629 	case ARIZONA_CLK_ASYNCCLK:
1630 		base_rate = priv->asyncclk;
1631 		break;
1632 	default:
1633 		return 0;
1634 	}
1635 
1636 	if (base_rate == 0)
1637 		dai_priv->constraint.mask = ARIZONA_RATE_MASK;
1638 	else if (base_rate % 8000)
1639 		dai_priv->constraint.mask = ARIZONA_44K1_RATE_MASK;
1640 	else
1641 		dai_priv->constraint.mask = ARIZONA_48K_RATE_MASK;
1642 
1643 	return snd_pcm_hw_constraint_list(substream->runtime, 0,
1644 					  SNDRV_PCM_HW_PARAM_RATE,
1645 					  &dai_priv->constraint);
1646 }
1647 
1648 static void arizona_wm5102_set_dac_comp(struct snd_soc_component *component,
1649 					unsigned int rate)
1650 {
1651 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1652 	struct arizona *arizona = priv->arizona;
1653 	struct reg_sequence dac_comp[] = {
1654 		{ 0x80, 0x3 },
1655 		{ ARIZONA_DAC_COMP_1, 0 },
1656 		{ ARIZONA_DAC_COMP_2, 0 },
1657 		{ 0x80, 0x0 },
1658 	};
1659 
1660 	mutex_lock(&arizona->dac_comp_lock);
1661 
1662 	dac_comp[1].def = arizona->dac_comp_coeff;
1663 	if (rate >= 176400)
1664 		dac_comp[2].def = arizona->dac_comp_enabled;
1665 
1666 	mutex_unlock(&arizona->dac_comp_lock);
1667 
1668 	regmap_multi_reg_write(arizona->regmap,
1669 			       dac_comp,
1670 			       ARRAY_SIZE(dac_comp));
1671 }
1672 
1673 static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
1674 				  struct snd_pcm_hw_params *params,
1675 				  struct snd_soc_dai *dai)
1676 {
1677 	struct snd_soc_component *component = dai->component;
1678 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1679 	struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1680 	int base = dai->driver->base;
1681 	int i, sr_val, ret;
1682 
1683 	/*
1684 	 * We will need to be more flexible than this in future,
1685 	 * currently we use a single sample rate for SYSCLK.
1686 	 */
1687 	for (i = 0; i < ARRAY_SIZE(arizona_sr_vals); i++)
1688 		if (arizona_sr_vals[i] == params_rate(params))
1689 			break;
1690 	if (i == ARRAY_SIZE(arizona_sr_vals)) {
1691 		arizona_aif_err(dai, "Unsupported sample rate %dHz\n",
1692 				params_rate(params));
1693 		return -EINVAL;
1694 	}
1695 	sr_val = i;
1696 
1697 	switch (priv->arizona->type) {
1698 	case WM5102:
1699 	case WM8997:
1700 		if (arizona_sr_vals[sr_val] >= 88200)
1701 			ret = arizona_dvfs_up(component, ARIZONA_DVFS_SR1_RQ);
1702 		else
1703 			ret = arizona_dvfs_down(component, ARIZONA_DVFS_SR1_RQ);
1704 
1705 		if (ret) {
1706 			arizona_aif_err(dai, "Failed to change DVFS %d\n", ret);
1707 			return ret;
1708 		}
1709 		break;
1710 	default:
1711 		break;
1712 	}
1713 
1714 	switch (dai_priv->clk) {
1715 	case ARIZONA_CLK_SYSCLK:
1716 		switch (priv->arizona->type) {
1717 		case WM5102:
1718 			arizona_wm5102_set_dac_comp(component,
1719 						    params_rate(params));
1720 			break;
1721 		default:
1722 			break;
1723 		}
1724 
1725 		snd_soc_component_update_bits(component, ARIZONA_SAMPLE_RATE_1,
1726 					      ARIZONA_SAMPLE_RATE_1_MASK,
1727 					      sr_val);
1728 		if (base)
1729 			snd_soc_component_update_bits(component,
1730 					base + ARIZONA_AIF_RATE_CTRL,
1731 					ARIZONA_AIF1_RATE_MASK, 0);
1732 		break;
1733 	case ARIZONA_CLK_ASYNCCLK:
1734 		snd_soc_component_update_bits(component,
1735 					      ARIZONA_ASYNC_SAMPLE_RATE_1,
1736 					      ARIZONA_ASYNC_SAMPLE_RATE_1_MASK,
1737 					      sr_val);
1738 		if (base)
1739 			snd_soc_component_update_bits(component,
1740 					base + ARIZONA_AIF_RATE_CTRL,
1741 					ARIZONA_AIF1_RATE_MASK,
1742 					8 << ARIZONA_AIF1_RATE_SHIFT);
1743 		break;
1744 	default:
1745 		arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk);
1746 		return -EINVAL;
1747 	}
1748 
1749 	return 0;
1750 }
1751 
1752 static bool arizona_aif_cfg_changed(struct snd_soc_component *component,
1753 				    int base, int bclk, int lrclk, int frame)
1754 {
1755 	int val;
1756 
1757 	val = snd_soc_component_read(component, base + ARIZONA_AIF_BCLK_CTRL);
1758 	if (bclk != (val & ARIZONA_AIF1_BCLK_FREQ_MASK))
1759 		return true;
1760 
1761 	val = snd_soc_component_read(component, base + ARIZONA_AIF_RX_BCLK_RATE);
1762 	if (lrclk != (val & ARIZONA_AIF1RX_BCPF_MASK))
1763 		return true;
1764 
1765 	val = snd_soc_component_read(component, base + ARIZONA_AIF_FRAME_CTRL_1);
1766 	if (frame != (val & (ARIZONA_AIF1TX_WL_MASK |
1767 			     ARIZONA_AIF1TX_SLOT_LEN_MASK)))
1768 		return true;
1769 
1770 	return false;
1771 }
1772 
1773 static int arizona_hw_params(struct snd_pcm_substream *substream,
1774 			     struct snd_pcm_hw_params *params,
1775 			     struct snd_soc_dai *dai)
1776 {
1777 	struct snd_soc_component *component = dai->component;
1778 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1779 	struct arizona *arizona = priv->arizona;
1780 	int base = dai->driver->base;
1781 	const int *rates;
1782 	int i, ret, val;
1783 	int channels = params_channels(params);
1784 	int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1];
1785 	int tdm_width = arizona->tdm_width[dai->id - 1];
1786 	int tdm_slots = arizona->tdm_slots[dai->id - 1];
1787 	int bclk, lrclk, wl, frame, bclk_target;
1788 	bool reconfig;
1789 	unsigned int aif_tx_state, aif_rx_state;
1790 
1791 	if (params_rate(params) % 4000)
1792 		rates = &arizona_44k1_bclk_rates[0];
1793 	else
1794 		rates = &arizona_48k_bclk_rates[0];
1795 
1796 	wl = params_width(params);
1797 
1798 	if (tdm_slots) {
1799 		arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
1800 				tdm_slots, tdm_width);
1801 		bclk_target = tdm_slots * tdm_width * params_rate(params);
1802 		channels = tdm_slots;
1803 	} else {
1804 		bclk_target = snd_soc_params_to_bclk(params);
1805 		tdm_width = wl;
1806 	}
1807 
1808 	if (chan_limit && chan_limit < channels) {
1809 		arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit);
1810 		bclk_target /= channels;
1811 		bclk_target *= chan_limit;
1812 	}
1813 
1814 	/* Force multiple of 2 channels for I2S mode */
1815 	val = snd_soc_component_read(component, base + ARIZONA_AIF_FORMAT);
1816 	val &= ARIZONA_AIF1_FMT_MASK;
1817 	if ((channels & 1) && (val == ARIZONA_FMT_I2S_MODE)) {
1818 		arizona_aif_dbg(dai, "Forcing stereo mode\n");
1819 		bclk_target /= channels;
1820 		bclk_target *= channels + 1;
1821 	}
1822 
1823 	for (i = 0; i < ARRAY_SIZE(arizona_44k1_bclk_rates); i++) {
1824 		if (rates[i] >= bclk_target &&
1825 		    rates[i] % params_rate(params) == 0) {
1826 			bclk = i;
1827 			break;
1828 		}
1829 	}
1830 	if (i == ARRAY_SIZE(arizona_44k1_bclk_rates)) {
1831 		arizona_aif_err(dai, "Unsupported sample rate %dHz\n",
1832 				params_rate(params));
1833 		return -EINVAL;
1834 	}
1835 
1836 	lrclk = rates[bclk] / params_rate(params);
1837 
1838 	arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n",
1839 			rates[bclk], rates[bclk] / lrclk);
1840 
1841 	frame = wl << ARIZONA_AIF1TX_WL_SHIFT | tdm_width;
1842 
1843 	reconfig = arizona_aif_cfg_changed(component, base, bclk, lrclk, frame);
1844 
1845 	if (reconfig) {
1846 		/* Save AIF TX/RX state */
1847 		aif_tx_state = snd_soc_component_read(component,
1848 					    base + ARIZONA_AIF_TX_ENABLES);
1849 		aif_rx_state = snd_soc_component_read(component,
1850 					    base + ARIZONA_AIF_RX_ENABLES);
1851 		/* Disable AIF TX/RX before reconfiguring it */
1852 		regmap_update_bits_async(arizona->regmap,
1853 					 base + ARIZONA_AIF_TX_ENABLES,
1854 					 0xff, 0x0);
1855 		regmap_update_bits(arizona->regmap,
1856 				   base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0);
1857 	}
1858 
1859 	ret = arizona_hw_params_rate(substream, params, dai);
1860 	if (ret != 0)
1861 		goto restore_aif;
1862 
1863 	if (reconfig) {
1864 		regmap_update_bits_async(arizona->regmap,
1865 					 base + ARIZONA_AIF_BCLK_CTRL,
1866 					 ARIZONA_AIF1_BCLK_FREQ_MASK, bclk);
1867 		regmap_update_bits_async(arizona->regmap,
1868 					 base + ARIZONA_AIF_TX_BCLK_RATE,
1869 					 ARIZONA_AIF1TX_BCPF_MASK, lrclk);
1870 		regmap_update_bits_async(arizona->regmap,
1871 					 base + ARIZONA_AIF_RX_BCLK_RATE,
1872 					 ARIZONA_AIF1RX_BCPF_MASK, lrclk);
1873 		regmap_update_bits_async(arizona->regmap,
1874 					 base + ARIZONA_AIF_FRAME_CTRL_1,
1875 					 ARIZONA_AIF1TX_WL_MASK |
1876 					 ARIZONA_AIF1TX_SLOT_LEN_MASK, frame);
1877 		regmap_update_bits(arizona->regmap,
1878 				   base + ARIZONA_AIF_FRAME_CTRL_2,
1879 				   ARIZONA_AIF1RX_WL_MASK |
1880 				   ARIZONA_AIF1RX_SLOT_LEN_MASK, frame);
1881 	}
1882 
1883 restore_aif:
1884 	if (reconfig) {
1885 		/* Restore AIF TX/RX state */
1886 		regmap_update_bits_async(arizona->regmap,
1887 					 base + ARIZONA_AIF_TX_ENABLES,
1888 					 0xff, aif_tx_state);
1889 		regmap_update_bits(arizona->regmap,
1890 				   base + ARIZONA_AIF_RX_ENABLES,
1891 				   0xff, aif_rx_state);
1892 	}
1893 	return ret;
1894 }
1895 
1896 static const char *arizona_dai_clk_str(int clk_id)
1897 {
1898 	switch (clk_id) {
1899 	case ARIZONA_CLK_SYSCLK:
1900 		return "SYSCLK";
1901 	case ARIZONA_CLK_ASYNCCLK:
1902 		return "ASYNCCLK";
1903 	default:
1904 		return "Unknown clock";
1905 	}
1906 }
1907 
1908 static int arizona_dai_set_sysclk(struct snd_soc_dai *dai,
1909 				  int clk_id, unsigned int freq, int dir)
1910 {
1911 	struct snd_soc_component *component = dai->component;
1912 	struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
1913 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1914 	struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1915 	struct snd_soc_dapm_route routes[2];
1916 
1917 	switch (clk_id) {
1918 	case ARIZONA_CLK_SYSCLK:
1919 	case ARIZONA_CLK_ASYNCCLK:
1920 		break;
1921 	default:
1922 		return -EINVAL;
1923 	}
1924 
1925 	if (clk_id == dai_priv->clk)
1926 		return 0;
1927 
1928 	if (snd_soc_dai_active(dai)) {
1929 		dev_err(component->dev, "Can't change clock on active DAI %d\n",
1930 			dai->id);
1931 		return -EBUSY;
1932 	}
1933 
1934 	dev_dbg(component->dev, "Setting AIF%d to %s\n", dai->id + 1,
1935 		arizona_dai_clk_str(clk_id));
1936 
1937 	memset(&routes, 0, sizeof(routes));
1938 	routes[0].sink = dai->driver->capture.stream_name;
1939 	routes[1].sink = dai->driver->playback.stream_name;
1940 
1941 	routes[0].source = arizona_dai_clk_str(dai_priv->clk);
1942 	routes[1].source = arizona_dai_clk_str(dai_priv->clk);
1943 	snd_soc_dapm_del_routes(dapm, routes, ARRAY_SIZE(routes));
1944 
1945 	routes[0].source = arizona_dai_clk_str(clk_id);
1946 	routes[1].source = arizona_dai_clk_str(clk_id);
1947 	snd_soc_dapm_add_routes(dapm, routes, ARRAY_SIZE(routes));
1948 
1949 	dai_priv->clk = clk_id;
1950 
1951 	return snd_soc_dapm_sync(dapm);
1952 }
1953 
1954 static int arizona_set_tristate(struct snd_soc_dai *dai, int tristate)
1955 {
1956 	struct snd_soc_component *component = dai->component;
1957 	int base = dai->driver->base;
1958 	unsigned int reg;
1959 
1960 	if (tristate)
1961 		reg = ARIZONA_AIF1_TRI;
1962 	else
1963 		reg = 0;
1964 
1965 	return snd_soc_component_update_bits(component,
1966 					     base + ARIZONA_AIF_RATE_CTRL,
1967 					     ARIZONA_AIF1_TRI, reg);
1968 }
1969 
1970 static void arizona_set_channels_to_mask(struct snd_soc_dai *dai,
1971 					 unsigned int base,
1972 					 int channels, unsigned int mask)
1973 {
1974 	struct snd_soc_component *component = dai->component;
1975 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1976 	struct arizona *arizona = priv->arizona;
1977 	int slot, i;
1978 
1979 	for (i = 0; i < channels; ++i) {
1980 		slot = ffs(mask) - 1;
1981 		if (slot < 0)
1982 			return;
1983 
1984 		regmap_write(arizona->regmap, base + i, slot);
1985 
1986 		mask &= ~(1 << slot);
1987 	}
1988 
1989 	if (mask)
1990 		arizona_aif_warn(dai, "Too many channels in TDM mask\n");
1991 }
1992 
1993 static int arizona_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
1994 				unsigned int rx_mask, int slots, int slot_width)
1995 {
1996 	struct snd_soc_component *component = dai->component;
1997 	struct arizona_priv *priv = snd_soc_component_get_drvdata(component);
1998 	struct arizona *arizona = priv->arizona;
1999 	int base = dai->driver->base;
2000 	int rx_max_chan = dai->driver->playback.channels_max;
2001 	int tx_max_chan = dai->driver->capture.channels_max;
2002 
2003 	/* Only support TDM for the physical AIFs */
2004 	if (dai->id > ARIZONA_MAX_AIF)
2005 		return -ENOTSUPP;
2006 
2007 	if (slots == 0) {
2008 		tx_mask = (1 << tx_max_chan) - 1;
2009 		rx_mask = (1 << rx_max_chan) - 1;
2010 	}
2011 
2012 	arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_3,
2013 				     tx_max_chan, tx_mask);
2014 	arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_11,
2015 				     rx_max_chan, rx_mask);
2016 
2017 	arizona->tdm_width[dai->id - 1] = slot_width;
2018 	arizona->tdm_slots[dai->id - 1] = slots;
2019 
2020 	return 0;
2021 }
2022 
2023 const struct snd_soc_dai_ops arizona_dai_ops = {
2024 	.startup = arizona_startup,
2025 	.set_fmt = arizona_set_fmt,
2026 	.set_tdm_slot = arizona_set_tdm_slot,
2027 	.hw_params = arizona_hw_params,
2028 	.set_sysclk = arizona_dai_set_sysclk,
2029 	.set_tristate = arizona_set_tristate,
2030 };
2031 EXPORT_SYMBOL_GPL(arizona_dai_ops);
2032 
2033 const struct snd_soc_dai_ops arizona_simple_dai_ops = {
2034 	.startup = arizona_startup,
2035 	.hw_params = arizona_hw_params_rate,
2036 	.set_sysclk = arizona_dai_set_sysclk,
2037 };
2038 EXPORT_SYMBOL_GPL(arizona_simple_dai_ops);
2039 
2040 int arizona_init_dai(struct arizona_priv *priv, int id)
2041 {
2042 	struct arizona_dai_priv *dai_priv = &priv->dai[id];
2043 
2044 	dai_priv->clk = ARIZONA_CLK_SYSCLK;
2045 	dai_priv->constraint = arizona_constraint;
2046 
2047 	return 0;
2048 }
2049 EXPORT_SYMBOL_GPL(arizona_init_dai);
2050 
2051 static struct {
2052 	unsigned int min;
2053 	unsigned int max;
2054 	u16 fratio;
2055 	int ratio;
2056 } fll_fratios[] = {
2057 	{       0,    64000, 4, 16 },
2058 	{   64000,   128000, 3,  8 },
2059 	{  128000,   256000, 2,  4 },
2060 	{  256000,  1000000, 1,  2 },
2061 	{ 1000000, 13500000, 0,  1 },
2062 };
2063 
2064 static const unsigned int pseudo_fref_max[ARIZONA_FLL_MAX_FRATIO] = {
2065 	13500000,
2066 	 6144000,
2067 	 6144000,
2068 	 3072000,
2069 	 3072000,
2070 	 2822400,
2071 	 2822400,
2072 	 1536000,
2073 	 1536000,
2074 	 1536000,
2075 	 1536000,
2076 	 1536000,
2077 	 1536000,
2078 	 1536000,
2079 	 1536000,
2080 	  768000,
2081 };
2082 
2083 static struct {
2084 	unsigned int min;
2085 	unsigned int max;
2086 	u16 gain;
2087 } fll_gains[] = {
2088 	{       0,   256000, 0 },
2089 	{  256000,  1000000, 2 },
2090 	{ 1000000, 13500000, 4 },
2091 };
2092 
2093 struct arizona_fll_cfg {
2094 	int n;
2095 	unsigned int theta;
2096 	unsigned int lambda;
2097 	int refdiv;
2098 	int outdiv;
2099 	int fratio;
2100 	int gain;
2101 };
2102 
2103 static int arizona_validate_fll(struct arizona_fll *fll,
2104 				unsigned int Fref,
2105 				unsigned int Fout)
2106 {
2107 	unsigned int Fvco_min;
2108 
2109 	if (fll->fout && Fout != fll->fout) {
2110 		arizona_fll_err(fll,
2111 				"Can't change output on active FLL\n");
2112 		return -EINVAL;
2113 	}
2114 
2115 	if (Fref / ARIZONA_FLL_MAX_REFDIV > ARIZONA_FLL_MAX_FREF) {
2116 		arizona_fll_err(fll,
2117 				"Can't scale %dMHz in to <=13.5MHz\n",
2118 				Fref);
2119 		return -EINVAL;
2120 	}
2121 
2122 	Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult;
2123 	if (Fout * ARIZONA_FLL_MAX_OUTDIV < Fvco_min) {
2124 		arizona_fll_err(fll, "No FLL_OUTDIV for Fout=%uHz\n",
2125 				Fout);
2126 		return -EINVAL;
2127 	}
2128 
2129 	return 0;
2130 }
2131 
2132 static int arizona_find_fratio(unsigned int Fref, int *fratio)
2133 {
2134 	int i;
2135 
2136 	/* Find an appropriate FLL_FRATIO */
2137 	for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
2138 		if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
2139 			if (fratio)
2140 				*fratio = fll_fratios[i].fratio;
2141 			return fll_fratios[i].ratio;
2142 		}
2143 	}
2144 
2145 	return -EINVAL;
2146 }
2147 
2148 static int arizona_calc_fratio(struct arizona_fll *fll,
2149 			       struct arizona_fll_cfg *cfg,
2150 			       unsigned int target,
2151 			       unsigned int Fref, bool sync)
2152 {
2153 	int init_ratio, ratio;
2154 	int refdiv, div;
2155 
2156 	/* Fref must be <=13.5MHz, find initial refdiv */
2157 	div = 1;
2158 	cfg->refdiv = 0;
2159 	while (Fref > ARIZONA_FLL_MAX_FREF) {
2160 		div *= 2;
2161 		Fref /= 2;
2162 		cfg->refdiv++;
2163 
2164 		if (div > ARIZONA_FLL_MAX_REFDIV)
2165 			return -EINVAL;
2166 	}
2167 
2168 	/* Find an appropriate FLL_FRATIO */
2169 	init_ratio = arizona_find_fratio(Fref, &cfg->fratio);
2170 	if (init_ratio < 0) {
2171 		arizona_fll_err(fll, "Unable to find FRATIO for Fref=%uHz\n",
2172 				Fref);
2173 		return init_ratio;
2174 	}
2175 
2176 	switch (fll->arizona->type) {
2177 	case WM5102:
2178 	case WM8997:
2179 		return init_ratio;
2180 	case WM5110:
2181 	case WM8280:
2182 		if (fll->arizona->rev < 3 || sync)
2183 			return init_ratio;
2184 		break;
2185 	default:
2186 		if (sync)
2187 			return init_ratio;
2188 		break;
2189 	}
2190 
2191 	cfg->fratio = init_ratio - 1;
2192 
2193 	/* Adjust FRATIO/refdiv to avoid integer mode if possible */
2194 	refdiv = cfg->refdiv;
2195 
2196 	arizona_fll_dbg(fll, "pseudo: initial ratio=%u fref=%u refdiv=%u\n",
2197 			init_ratio, Fref, refdiv);
2198 
2199 	while (div <= ARIZONA_FLL_MAX_REFDIV) {
2200 		/* start from init_ratio because this may already give a
2201 		 * fractional N.K
2202 		 */
2203 		for (ratio = init_ratio; ratio > 0; ratio--) {
2204 			if (target % (ratio * Fref)) {
2205 				cfg->refdiv = refdiv;
2206 				cfg->fratio = ratio - 1;
2207 				arizona_fll_dbg(fll,
2208 					"pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
2209 					Fref, refdiv, div, ratio);
2210 				return ratio;
2211 			}
2212 		}
2213 
2214 		for (ratio = init_ratio + 1; ratio <= ARIZONA_FLL_MAX_FRATIO;
2215 		     ratio++) {
2216 			if ((ARIZONA_FLL_VCO_CORNER / 2) /
2217 			    (fll->vco_mult * ratio) < Fref) {
2218 				arizona_fll_dbg(fll, "pseudo: hit VCO corner\n");
2219 				break;
2220 			}
2221 
2222 			if (Fref > pseudo_fref_max[ratio - 1]) {
2223 				arizona_fll_dbg(fll,
2224 					"pseudo: exceeded max fref(%u) for ratio=%u\n",
2225 					pseudo_fref_max[ratio - 1],
2226 					ratio);
2227 				break;
2228 			}
2229 
2230 			if (target % (ratio * Fref)) {
2231 				cfg->refdiv = refdiv;
2232 				cfg->fratio = ratio - 1;
2233 				arizona_fll_dbg(fll,
2234 					"pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
2235 					Fref, refdiv, div, ratio);
2236 				return ratio;
2237 			}
2238 		}
2239 
2240 		div *= 2;
2241 		Fref /= 2;
2242 		refdiv++;
2243 		init_ratio = arizona_find_fratio(Fref, NULL);
2244 		arizona_fll_dbg(fll,
2245 				"pseudo: change fref=%u refdiv=%d(%d) ratio=%u\n",
2246 				Fref, refdiv, div, init_ratio);
2247 	}
2248 
2249 	arizona_fll_warn(fll, "Falling back to integer mode operation\n");
2250 	return cfg->fratio + 1;
2251 }
2252 
2253 static int arizona_calc_fll(struct arizona_fll *fll,
2254 			    struct arizona_fll_cfg *cfg,
2255 			    unsigned int Fref, bool sync)
2256 {
2257 	unsigned int target, div, gcd_fll;
2258 	int i, ratio;
2259 
2260 	arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout);
2261 
2262 	/* Fvco should be over the targt; don't check the upper bound */
2263 	div = ARIZONA_FLL_MIN_OUTDIV;
2264 	while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) {
2265 		div++;
2266 		if (div > ARIZONA_FLL_MAX_OUTDIV)
2267 			return -EINVAL;
2268 	}
2269 	target = fll->fout * div / fll->vco_mult;
2270 	cfg->outdiv = div;
2271 
2272 	arizona_fll_dbg(fll, "Fvco=%dHz\n", target);
2273 
2274 	/* Find an appropriate FLL_FRATIO and refdiv */
2275 	ratio = arizona_calc_fratio(fll, cfg, target, Fref, sync);
2276 	if (ratio < 0)
2277 		return ratio;
2278 
2279 	/* Apply the division for our remaining calculations */
2280 	Fref = Fref / (1 << cfg->refdiv);
2281 
2282 	cfg->n = target / (ratio * Fref);
2283 
2284 	if (target % (ratio * Fref)) {
2285 		gcd_fll = gcd(target, ratio * Fref);
2286 		arizona_fll_dbg(fll, "GCD=%u\n", gcd_fll);
2287 
2288 		cfg->theta = (target - (cfg->n * ratio * Fref))
2289 			/ gcd_fll;
2290 		cfg->lambda = (ratio * Fref) / gcd_fll;
2291 	} else {
2292 		cfg->theta = 0;
2293 		cfg->lambda = 0;
2294 	}
2295 
2296 	/* Round down to 16bit range with cost of accuracy lost.
2297 	 * Denominator must be bigger than numerator so we only
2298 	 * take care of it.
2299 	 */
2300 	while (cfg->lambda >= (1 << 16)) {
2301 		cfg->theta >>= 1;
2302 		cfg->lambda >>= 1;
2303 	}
2304 
2305 	for (i = 0; i < ARRAY_SIZE(fll_gains); i++) {
2306 		if (fll_gains[i].min <= Fref && Fref <= fll_gains[i].max) {
2307 			cfg->gain = fll_gains[i].gain;
2308 			break;
2309 		}
2310 	}
2311 	if (i == ARRAY_SIZE(fll_gains)) {
2312 		arizona_fll_err(fll, "Unable to find gain for Fref=%uHz\n",
2313 				Fref);
2314 		return -EINVAL;
2315 	}
2316 
2317 	arizona_fll_dbg(fll, "N=%d THETA=%d LAMBDA=%d\n",
2318 			cfg->n, cfg->theta, cfg->lambda);
2319 	arizona_fll_dbg(fll, "FRATIO=0x%x(%d) OUTDIV=%d REFCLK_DIV=0x%x(%d)\n",
2320 			cfg->fratio, ratio, cfg->outdiv,
2321 			cfg->refdiv, 1 << cfg->refdiv);
2322 	arizona_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain);
2323 
2324 	return 0;
2325 }
2326 
2327 static void arizona_apply_fll(struct arizona *arizona, unsigned int base,
2328 			      struct arizona_fll_cfg *cfg, int source,
2329 			      bool sync)
2330 {
2331 	regmap_update_bits_async(arizona->regmap, base + 3,
2332 				 ARIZONA_FLL1_THETA_MASK, cfg->theta);
2333 	regmap_update_bits_async(arizona->regmap, base + 4,
2334 				 ARIZONA_FLL1_LAMBDA_MASK, cfg->lambda);
2335 	regmap_update_bits_async(arizona->regmap, base + 5,
2336 				 ARIZONA_FLL1_FRATIO_MASK,
2337 				 cfg->fratio << ARIZONA_FLL1_FRATIO_SHIFT);
2338 	regmap_update_bits_async(arizona->regmap, base + 6,
2339 				 ARIZONA_FLL1_CLK_REF_DIV_MASK |
2340 				 ARIZONA_FLL1_CLK_REF_SRC_MASK,
2341 				 cfg->refdiv << ARIZONA_FLL1_CLK_REF_DIV_SHIFT |
2342 				 source << ARIZONA_FLL1_CLK_REF_SRC_SHIFT);
2343 
2344 	if (sync) {
2345 		regmap_update_bits(arizona->regmap, base + 0x7,
2346 				   ARIZONA_FLL1_GAIN_MASK,
2347 				   cfg->gain << ARIZONA_FLL1_GAIN_SHIFT);
2348 	} else {
2349 		regmap_update_bits(arizona->regmap, base + 0x5,
2350 				   ARIZONA_FLL1_OUTDIV_MASK,
2351 				   cfg->outdiv << ARIZONA_FLL1_OUTDIV_SHIFT);
2352 		regmap_update_bits(arizona->regmap, base + 0x9,
2353 				   ARIZONA_FLL1_GAIN_MASK,
2354 				   cfg->gain << ARIZONA_FLL1_GAIN_SHIFT);
2355 	}
2356 
2357 	regmap_update_bits_async(arizona->regmap, base + 2,
2358 				 ARIZONA_FLL1_CTRL_UPD | ARIZONA_FLL1_N_MASK,
2359 				 ARIZONA_FLL1_CTRL_UPD | cfg->n);
2360 }
2361 
2362 static int arizona_is_enabled_fll(struct arizona_fll *fll, int base)
2363 {
2364 	struct arizona *arizona = fll->arizona;
2365 	unsigned int reg;
2366 	int ret;
2367 
2368 	ret = regmap_read(arizona->regmap, base + 1, &reg);
2369 	if (ret != 0) {
2370 		arizona_fll_err(fll, "Failed to read current state: %d\n",
2371 				ret);
2372 		return ret;
2373 	}
2374 
2375 	return reg & ARIZONA_FLL1_ENA;
2376 }
2377 
2378 static int arizona_set_fll_clks(struct arizona_fll *fll, int base, bool ena)
2379 {
2380 	struct arizona *arizona = fll->arizona;
2381 	unsigned int val;
2382 	struct clk *clk;
2383 	int ret;
2384 
2385 	ret = regmap_read(arizona->regmap, base + 6, &val);
2386 	if (ret != 0) {
2387 		arizona_fll_err(fll, "Failed to read current source: %d\n",
2388 				ret);
2389 		return ret;
2390 	}
2391 
2392 	val &= ARIZONA_FLL1_CLK_REF_SRC_MASK;
2393 	val >>= ARIZONA_FLL1_CLK_REF_SRC_SHIFT;
2394 
2395 	switch (val) {
2396 	case ARIZONA_FLL_SRC_MCLK1:
2397 		clk = arizona->mclk[ARIZONA_MCLK1];
2398 		break;
2399 	case ARIZONA_FLL_SRC_MCLK2:
2400 		clk = arizona->mclk[ARIZONA_MCLK2];
2401 		break;
2402 	default:
2403 		return 0;
2404 	}
2405 
2406 	if (ena) {
2407 		return clk_prepare_enable(clk);
2408 	} else {
2409 		clk_disable_unprepare(clk);
2410 		return 0;
2411 	}
2412 }
2413 
2414 static int arizona_enable_fll(struct arizona_fll *fll)
2415 {
2416 	struct arizona *arizona = fll->arizona;
2417 	bool use_sync = false;
2418 	int already_enabled = arizona_is_enabled_fll(fll, fll->base);
2419 	int sync_enabled = arizona_is_enabled_fll(fll, fll->base + 0x10);
2420 	struct arizona_fll_cfg cfg;
2421 	int i;
2422 	unsigned int val;
2423 
2424 	if (already_enabled < 0)
2425 		return already_enabled;
2426 	if (sync_enabled < 0)
2427 		return sync_enabled;
2428 
2429 	if (already_enabled) {
2430 		/* Facilitate smooth refclk across the transition */
2431 		regmap_update_bits(fll->arizona->regmap, fll->base + 1,
2432 				   ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
2433 		udelay(32);
2434 		regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
2435 					 ARIZONA_FLL1_GAIN_MASK, 0);
2436 
2437 		if (arizona_is_enabled_fll(fll, fll->base + 0x10) > 0)
2438 			arizona_set_fll_clks(fll, fll->base + 0x10, false);
2439 		arizona_set_fll_clks(fll, fll->base, false);
2440 	}
2441 
2442 	/*
2443 	 * If we have both REFCLK and SYNCCLK then enable both,
2444 	 * otherwise apply the SYNCCLK settings to REFCLK.
2445 	 */
2446 	if (fll->ref_src >= 0 && fll->ref_freq &&
2447 	    fll->ref_src != fll->sync_src) {
2448 		arizona_calc_fll(fll, &cfg, fll->ref_freq, false);
2449 
2450 		/* Ref path hardcodes lambda to 65536 when sync is on */
2451 		if (fll->sync_src >= 0 && cfg.lambda)
2452 			cfg.theta = (cfg.theta * (1 << 16)) / cfg.lambda;
2453 
2454 		arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src,
2455 				  false);
2456 		if (fll->sync_src >= 0) {
2457 			arizona_calc_fll(fll, &cfg, fll->sync_freq, true);
2458 
2459 			arizona_apply_fll(arizona, fll->base + 0x10, &cfg,
2460 					  fll->sync_src, true);
2461 			use_sync = true;
2462 		}
2463 	} else if (fll->sync_src >= 0) {
2464 		arizona_calc_fll(fll, &cfg, fll->sync_freq, false);
2465 
2466 		arizona_apply_fll(arizona, fll->base, &cfg,
2467 				  fll->sync_src, false);
2468 
2469 		regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
2470 					 ARIZONA_FLL1_SYNC_ENA, 0);
2471 	} else {
2472 		arizona_fll_err(fll, "No clocks provided\n");
2473 		return -EINVAL;
2474 	}
2475 
2476 	if (already_enabled && !!sync_enabled != use_sync)
2477 		arizona_fll_warn(fll, "Synchroniser changed on active FLL\n");
2478 
2479 	/*
2480 	 * Increase the bandwidth if we're not using a low frequency
2481 	 * sync source.
2482 	 */
2483 	if (use_sync && fll->sync_freq > 100000)
2484 		regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
2485 					 ARIZONA_FLL1_SYNC_BW, 0);
2486 	else
2487 		regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
2488 					 ARIZONA_FLL1_SYNC_BW,
2489 					 ARIZONA_FLL1_SYNC_BW);
2490 
2491 	if (!already_enabled)
2492 		pm_runtime_get_sync(arizona->dev);
2493 
2494 	if (use_sync) {
2495 		arizona_set_fll_clks(fll, fll->base + 0x10, true);
2496 		regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
2497 					 ARIZONA_FLL1_SYNC_ENA,
2498 					 ARIZONA_FLL1_SYNC_ENA);
2499 	}
2500 	arizona_set_fll_clks(fll, fll->base, true);
2501 	regmap_update_bits_async(arizona->regmap, fll->base + 1,
2502 				 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
2503 
2504 	if (already_enabled)
2505 		regmap_update_bits_async(arizona->regmap, fll->base + 1,
2506 					 ARIZONA_FLL1_FREERUN, 0);
2507 
2508 	arizona_fll_dbg(fll, "Waiting for FLL lock...\n");
2509 	val = 0;
2510 	for (i = 0; i < 15; i++) {
2511 		if (i < 5)
2512 			usleep_range(200, 400);
2513 		else
2514 			msleep(20);
2515 
2516 		regmap_read(arizona->regmap,
2517 			    ARIZONA_INTERRUPT_RAW_STATUS_5,
2518 			    &val);
2519 		if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1)))
2520 			break;
2521 	}
2522 	if (i == 15)
2523 		arizona_fll_warn(fll, "Timed out waiting for lock\n");
2524 	else
2525 		arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i);
2526 
2527 	return 0;
2528 }
2529 
2530 static void arizona_disable_fll(struct arizona_fll *fll)
2531 {
2532 	struct arizona *arizona = fll->arizona;
2533 	bool ref_change, sync_change;
2534 
2535 	regmap_update_bits_async(arizona->regmap, fll->base + 1,
2536 				 ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
2537 	regmap_update_bits_check(arizona->regmap, fll->base + 1,
2538 				 ARIZONA_FLL1_ENA, 0, &ref_change);
2539 	regmap_update_bits_check(arizona->regmap, fll->base + 0x11,
2540 				 ARIZONA_FLL1_SYNC_ENA, 0, &sync_change);
2541 	regmap_update_bits_async(arizona->regmap, fll->base + 1,
2542 				 ARIZONA_FLL1_FREERUN, 0);
2543 
2544 	if (sync_change)
2545 		arizona_set_fll_clks(fll, fll->base + 0x10, false);
2546 
2547 	if (ref_change) {
2548 		arizona_set_fll_clks(fll, fll->base, false);
2549 		pm_runtime_put_autosuspend(arizona->dev);
2550 	}
2551 }
2552 
2553 int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
2554 			   unsigned int Fref, unsigned int Fout)
2555 {
2556 	int ret = 0;
2557 
2558 	if (fll->ref_src == source && fll->ref_freq == Fref)
2559 		return 0;
2560 
2561 	if (fll->fout && Fref > 0) {
2562 		ret = arizona_validate_fll(fll, Fref, fll->fout);
2563 		if (ret != 0)
2564 			return ret;
2565 	}
2566 
2567 	fll->ref_src = source;
2568 	fll->ref_freq = Fref;
2569 
2570 	if (fll->fout && Fref > 0)
2571 		ret = arizona_enable_fll(fll);
2572 
2573 	return ret;
2574 }
2575 EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);
2576 
2577 int arizona_set_fll(struct arizona_fll *fll, int source,
2578 		    unsigned int Fref, unsigned int Fout)
2579 {
2580 	int ret = 0;
2581 
2582 	if (fll->sync_src == source &&
2583 	    fll->sync_freq == Fref && fll->fout == Fout)
2584 		return 0;
2585 
2586 	if (Fout) {
2587 		if (fll->ref_src >= 0) {
2588 			ret = arizona_validate_fll(fll, fll->ref_freq, Fout);
2589 			if (ret != 0)
2590 				return ret;
2591 		}
2592 
2593 		ret = arizona_validate_fll(fll, Fref, Fout);
2594 		if (ret != 0)
2595 			return ret;
2596 	}
2597 
2598 	fll->sync_src = source;
2599 	fll->sync_freq = Fref;
2600 	fll->fout = Fout;
2601 
2602 	if (Fout)
2603 		ret = arizona_enable_fll(fll);
2604 	else
2605 		arizona_disable_fll(fll);
2606 
2607 	return ret;
2608 }
2609 EXPORT_SYMBOL_GPL(arizona_set_fll);
2610 
2611 int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
2612 		     int ok_irq, struct arizona_fll *fll)
2613 {
2614 	unsigned int val;
2615 
2616 	fll->id = id;
2617 	fll->base = base;
2618 	fll->arizona = arizona;
2619 	fll->sync_src = ARIZONA_FLL_SRC_NONE;
2620 
2621 	/* Configure default refclk to 32kHz if we have one */
2622 	regmap_read(arizona->regmap, ARIZONA_CLOCK_32K_1, &val);
2623 	switch (val & ARIZONA_CLK_32K_SRC_MASK) {
2624 	case ARIZONA_CLK_SRC_MCLK1:
2625 	case ARIZONA_CLK_SRC_MCLK2:
2626 		fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK;
2627 		break;
2628 	default:
2629 		fll->ref_src = ARIZONA_FLL_SRC_NONE;
2630 	}
2631 	fll->ref_freq = 32768;
2632 
2633 	snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id);
2634 	snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
2635 		 "FLL%d clock OK", id);
2636 
2637 	regmap_update_bits(arizona->regmap, fll->base + 1,
2638 			   ARIZONA_FLL1_FREERUN, 0);
2639 
2640 	return 0;
2641 }
2642 EXPORT_SYMBOL_GPL(arizona_init_fll);
2643 
2644 /**
2645  * arizona_set_output_mode - Set the mode of the specified output
2646  *
2647  * @component: Device to configure
2648  * @output: Output number
2649  * @diff: True to set the output to differential mode
2650  *
2651  * Some systems use external analogue switches to connect more
2652  * analogue devices to the CODEC than are supported by the device.  In
2653  * some systems this requires changing the switched output from single
2654  * ended to differential mode dynamically at runtime, an operation
2655  * supported using this function.
2656  *
2657  * Most systems have a single static configuration and should use
2658  * platform data instead.
2659  */
2660 int arizona_set_output_mode(struct snd_soc_component *component, int output,
2661 			    bool diff)
2662 {
2663 	unsigned int reg, val;
2664 
2665 	if (output < 1 || output > 6)
2666 		return -EINVAL;
2667 
2668 	reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8;
2669 
2670 	if (diff)
2671 		val = ARIZONA_OUT1_MONO;
2672 	else
2673 		val = 0;
2674 
2675 	return snd_soc_component_update_bits(component, reg,
2676 					     ARIZONA_OUT1_MONO, val);
2677 }
2678 EXPORT_SYMBOL_GPL(arizona_set_output_mode);
2679 
2680 static const struct soc_enum arizona_adsp2_rate_enum[] = {
2681 	SOC_VALUE_ENUM_SINGLE(ARIZONA_DSP1_CONTROL_1,
2682 			      ARIZONA_DSP1_RATE_SHIFT, 0xf,
2683 			      ARIZONA_RATE_ENUM_SIZE,
2684 			      arizona_rate_text, arizona_rate_val),
2685 	SOC_VALUE_ENUM_SINGLE(ARIZONA_DSP2_CONTROL_1,
2686 			      ARIZONA_DSP1_RATE_SHIFT, 0xf,
2687 			      ARIZONA_RATE_ENUM_SIZE,
2688 			      arizona_rate_text, arizona_rate_val),
2689 	SOC_VALUE_ENUM_SINGLE(ARIZONA_DSP3_CONTROL_1,
2690 			      ARIZONA_DSP1_RATE_SHIFT, 0xf,
2691 			      ARIZONA_RATE_ENUM_SIZE,
2692 			      arizona_rate_text, arizona_rate_val),
2693 	SOC_VALUE_ENUM_SINGLE(ARIZONA_DSP4_CONTROL_1,
2694 			      ARIZONA_DSP1_RATE_SHIFT, 0xf,
2695 			      ARIZONA_RATE_ENUM_SIZE,
2696 			      arizona_rate_text, arizona_rate_val),
2697 };
2698 
2699 const struct snd_kcontrol_new arizona_adsp2_rate_controls[] = {
2700 	SOC_ENUM("DSP1 Rate", arizona_adsp2_rate_enum[0]),
2701 	SOC_ENUM("DSP2 Rate", arizona_adsp2_rate_enum[1]),
2702 	SOC_ENUM("DSP3 Rate", arizona_adsp2_rate_enum[2]),
2703 	SOC_ENUM("DSP4 Rate", arizona_adsp2_rate_enum[3]),
2704 };
2705 EXPORT_SYMBOL_GPL(arizona_adsp2_rate_controls);
2706 
2707 static bool arizona_eq_filter_unstable(bool mode, __be16 _a, __be16 _b)
2708 {
2709 	s16 a = be16_to_cpu(_a);
2710 	s16 b = be16_to_cpu(_b);
2711 
2712 	if (!mode) {
2713 		return abs(a) >= 4096;
2714 	} else {
2715 		if (abs(b) >= 4096)
2716 			return true;
2717 
2718 		return (abs((a << 16) / (4096 - b)) >= 4096 << 4);
2719 	}
2720 }
2721 
2722 int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol,
2723 			 struct snd_ctl_elem_value *ucontrol)
2724 {
2725 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
2726 	struct arizona *arizona = dev_get_drvdata(component->dev->parent);
2727 	struct soc_bytes *params = (void *)kcontrol->private_value;
2728 	unsigned int val;
2729 	__be16 *data;
2730 	int len;
2731 	int ret;
2732 
2733 	len = params->num_regs * regmap_get_val_bytes(arizona->regmap);
2734 
2735 	data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA);
2736 	if (!data)
2737 		return -ENOMEM;
2738 
2739 	data[0] &= cpu_to_be16(ARIZONA_EQ1_B1_MODE);
2740 
2741 	if (arizona_eq_filter_unstable(!!data[0], data[1], data[2]) ||
2742 	    arizona_eq_filter_unstable(true, data[4], data[5]) ||
2743 	    arizona_eq_filter_unstable(true, data[8], data[9]) ||
2744 	    arizona_eq_filter_unstable(true, data[12], data[13]) ||
2745 	    arizona_eq_filter_unstable(false, data[16], data[17])) {
2746 		dev_err(arizona->dev, "Rejecting unstable EQ coefficients\n");
2747 		ret = -EINVAL;
2748 		goto out;
2749 	}
2750 
2751 	ret = regmap_read(arizona->regmap, params->base, &val);
2752 	if (ret != 0)
2753 		goto out;
2754 
2755 	val &= ~ARIZONA_EQ1_B1_MODE;
2756 	data[0] |= cpu_to_be16(val);
2757 
2758 	ret = regmap_raw_write(arizona->regmap, params->base, data, len);
2759 
2760 out:
2761 	kfree(data);
2762 	return ret;
2763 }
2764 EXPORT_SYMBOL_GPL(arizona_eq_coeff_put);
2765 
2766 int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol,
2767 			   struct snd_ctl_elem_value *ucontrol)
2768 {
2769 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
2770 	struct arizona *arizona = dev_get_drvdata(component->dev->parent);
2771 	__be16 *data = (__be16 *)ucontrol->value.bytes.data;
2772 	s16 val = be16_to_cpu(*data);
2773 
2774 	if (abs(val) >= 4096) {
2775 		dev_err(arizona->dev, "Rejecting unstable LHPF coefficients\n");
2776 		return -EINVAL;
2777 	}
2778 
2779 	return snd_soc_bytes_put(kcontrol, ucontrol);
2780 }
2781 EXPORT_SYMBOL_GPL(arizona_lhpf_coeff_put);
2782 
2783 int arizona_of_get_audio_pdata(struct arizona *arizona)
2784 {
2785 	struct arizona_pdata *pdata = &arizona->pdata;
2786 	struct device_node *np = arizona->dev->of_node;
2787 	u32 val;
2788 	u32 pdm_val[ARIZONA_MAX_PDM_SPK];
2789 	int ret;
2790 	int count = 0;
2791 
2792 	count = 0;
2793 	of_property_for_each_u32(np, "wlf,inmode", val) {
2794 		if (count == ARRAY_SIZE(pdata->inmode))
2795 			break;
2796 
2797 		pdata->inmode[count] = val;
2798 		count++;
2799 	}
2800 
2801 	count = 0;
2802 	of_property_for_each_u32(np, "wlf,dmic-ref", val) {
2803 		if (count == ARRAY_SIZE(pdata->dmic_ref))
2804 			break;
2805 
2806 		pdata->dmic_ref[count] = val;
2807 		count++;
2808 	}
2809 
2810 	count = 0;
2811 	of_property_for_each_u32(np, "wlf,out-mono", val) {
2812 		if (count == ARRAY_SIZE(pdata->out_mono))
2813 			break;
2814 
2815 		pdata->out_mono[count] = !!val;
2816 		count++;
2817 	}
2818 
2819 	count = 0;
2820 	of_property_for_each_u32(np, "wlf,max-channels-clocked", val) {
2821 		if (count == ARRAY_SIZE(pdata->max_channels_clocked))
2822 			break;
2823 
2824 		pdata->max_channels_clocked[count] = val;
2825 		count++;
2826 	}
2827 
2828 	count = 0;
2829 	of_property_for_each_u32(np, "wlf,out-volume-limit", val) {
2830 		if (count == ARRAY_SIZE(pdata->out_vol_limit))
2831 			break;
2832 
2833 		pdata->out_vol_limit[count] = val;
2834 		count++;
2835 	}
2836 
2837 	ret = of_property_read_u32_array(np, "wlf,spk-fmt",
2838 					 pdm_val, ARRAY_SIZE(pdm_val));
2839 
2840 	if (ret >= 0)
2841 		for (count = 0; count < ARRAY_SIZE(pdata->spk_fmt); ++count)
2842 			pdata->spk_fmt[count] = pdm_val[count];
2843 
2844 	ret = of_property_read_u32_array(np, "wlf,spk-mute",
2845 					 pdm_val, ARRAY_SIZE(pdm_val));
2846 
2847 	if (ret >= 0)
2848 		for (count = 0; count < ARRAY_SIZE(pdata->spk_mute); ++count)
2849 			pdata->spk_mute[count] = pdm_val[count];
2850 
2851 	return 0;
2852 }
2853 EXPORT_SYMBOL_GPL(arizona_of_get_audio_pdata);
2854 
2855 MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support");
2856 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2857 MODULE_LICENSE("GPL");
2858