xref: /linux/sound/soc/codecs/arizona.c (revision 93d90ad708b8da6efc0e487b66111aa9db7f70c7)
1 /*
2  * arizona.c - Wolfson Arizona class device shared support
3  *
4  * Copyright 2012 Wolfson Microelectronics plc
5  *
6  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #include <linux/delay.h>
14 #include <linux/gcd.h>
15 #include <linux/module.h>
16 #include <linux/pm_runtime.h>
17 #include <sound/pcm.h>
18 #include <sound/pcm_params.h>
19 #include <sound/tlv.h>
20 
21 #include <linux/mfd/arizona/core.h>
22 #include <linux/mfd/arizona/gpio.h>
23 #include <linux/mfd/arizona/registers.h>
24 
25 #include "arizona.h"
26 
27 #define ARIZONA_AIF_BCLK_CTRL                   0x00
28 #define ARIZONA_AIF_TX_PIN_CTRL                 0x01
29 #define ARIZONA_AIF_RX_PIN_CTRL                 0x02
30 #define ARIZONA_AIF_RATE_CTRL                   0x03
31 #define ARIZONA_AIF_FORMAT                      0x04
32 #define ARIZONA_AIF_TX_BCLK_RATE                0x05
33 #define ARIZONA_AIF_RX_BCLK_RATE                0x06
34 #define ARIZONA_AIF_FRAME_CTRL_1                0x07
35 #define ARIZONA_AIF_FRAME_CTRL_2                0x08
36 #define ARIZONA_AIF_FRAME_CTRL_3                0x09
37 #define ARIZONA_AIF_FRAME_CTRL_4                0x0A
38 #define ARIZONA_AIF_FRAME_CTRL_5                0x0B
39 #define ARIZONA_AIF_FRAME_CTRL_6                0x0C
40 #define ARIZONA_AIF_FRAME_CTRL_7                0x0D
41 #define ARIZONA_AIF_FRAME_CTRL_8                0x0E
42 #define ARIZONA_AIF_FRAME_CTRL_9                0x0F
43 #define ARIZONA_AIF_FRAME_CTRL_10               0x10
44 #define ARIZONA_AIF_FRAME_CTRL_11               0x11
45 #define ARIZONA_AIF_FRAME_CTRL_12               0x12
46 #define ARIZONA_AIF_FRAME_CTRL_13               0x13
47 #define ARIZONA_AIF_FRAME_CTRL_14               0x14
48 #define ARIZONA_AIF_FRAME_CTRL_15               0x15
49 #define ARIZONA_AIF_FRAME_CTRL_16               0x16
50 #define ARIZONA_AIF_FRAME_CTRL_17               0x17
51 #define ARIZONA_AIF_FRAME_CTRL_18               0x18
52 #define ARIZONA_AIF_TX_ENABLES                  0x19
53 #define ARIZONA_AIF_RX_ENABLES                  0x1A
54 #define ARIZONA_AIF_FORCE_WRITE                 0x1B
55 
56 #define ARIZONA_FLL_VCO_CORNER 141900000
57 #define ARIZONA_FLL_MAX_FREF   13500000
58 #define ARIZONA_FLL_MIN_FVCO   90000000
59 #define ARIZONA_FLL_MAX_FRATIO 16
60 #define ARIZONA_FLL_MAX_REFDIV 8
61 #define ARIZONA_FLL_MIN_OUTDIV 2
62 #define ARIZONA_FLL_MAX_OUTDIV 7
63 
64 #define ARIZONA_FMT_DSP_MODE_A          0
65 #define ARIZONA_FMT_DSP_MODE_B          1
66 #define ARIZONA_FMT_I2S_MODE            2
67 #define ARIZONA_FMT_LEFT_JUSTIFIED_MODE 3
68 
69 #define arizona_fll_err(_fll, fmt, ...) \
70 	dev_err(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
71 #define arizona_fll_warn(_fll, fmt, ...) \
72 	dev_warn(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
73 #define arizona_fll_dbg(_fll, fmt, ...) \
74 	dev_dbg(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
75 
76 #define arizona_aif_err(_dai, fmt, ...) \
77 	dev_err(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
78 #define arizona_aif_warn(_dai, fmt, ...) \
79 	dev_warn(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
80 #define arizona_aif_dbg(_dai, fmt, ...) \
81 	dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
82 
83 static int arizona_spk_ev(struct snd_soc_dapm_widget *w,
84 			  struct snd_kcontrol *kcontrol,
85 			  int event)
86 {
87 	struct snd_soc_codec *codec = w->codec;
88 	struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
89 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
90 	bool manual_ena = false;
91 	int val;
92 
93 	switch (arizona->type) {
94 	case WM5102:
95 		switch (arizona->rev) {
96 		case 0:
97 			break;
98 		default:
99 			manual_ena = true;
100 			break;
101 		}
102 	default:
103 		break;
104 	}
105 
106 	switch (event) {
107 	case SND_SOC_DAPM_PRE_PMU:
108 		if (!priv->spk_ena && manual_ena) {
109 			regmap_write_async(arizona->regmap, 0x4f5, 0x25a);
110 			priv->spk_ena_pending = true;
111 		}
112 		break;
113 	case SND_SOC_DAPM_POST_PMU:
114 		val = snd_soc_read(codec, ARIZONA_INTERRUPT_RAW_STATUS_3);
115 		if (val & ARIZONA_SPK_OVERHEAT_STS) {
116 			dev_crit(arizona->dev,
117 				 "Speaker not enabled due to temperature\n");
118 			return -EBUSY;
119 		}
120 
121 		regmap_update_bits_async(arizona->regmap,
122 					 ARIZONA_OUTPUT_ENABLES_1,
123 					 1 << w->shift, 1 << w->shift);
124 
125 		if (priv->spk_ena_pending) {
126 			msleep(75);
127 			regmap_write_async(arizona->regmap, 0x4f5, 0xda);
128 			priv->spk_ena_pending = false;
129 			priv->spk_ena++;
130 		}
131 		break;
132 	case SND_SOC_DAPM_PRE_PMD:
133 		if (manual_ena) {
134 			priv->spk_ena--;
135 			if (!priv->spk_ena)
136 				regmap_write_async(arizona->regmap,
137 						   0x4f5, 0x25a);
138 		}
139 
140 		regmap_update_bits_async(arizona->regmap,
141 					 ARIZONA_OUTPUT_ENABLES_1,
142 					 1 << w->shift, 0);
143 		break;
144 	case SND_SOC_DAPM_POST_PMD:
145 		if (manual_ena) {
146 			if (!priv->spk_ena)
147 				regmap_write_async(arizona->regmap,
148 						   0x4f5, 0x0da);
149 		}
150 		break;
151 	}
152 
153 	return 0;
154 }
155 
156 static irqreturn_t arizona_thermal_warn(int irq, void *data)
157 {
158 	struct arizona *arizona = data;
159 	unsigned int val;
160 	int ret;
161 
162 	ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3,
163 			  &val);
164 	if (ret != 0) {
165 		dev_err(arizona->dev, "Failed to read thermal status: %d\n",
166 			ret);
167 	} else if (val & ARIZONA_SPK_OVERHEAT_WARN_STS) {
168 		dev_crit(arizona->dev, "Thermal warning\n");
169 	}
170 
171 	return IRQ_HANDLED;
172 }
173 
174 static irqreturn_t arizona_thermal_shutdown(int irq, void *data)
175 {
176 	struct arizona *arizona = data;
177 	unsigned int val;
178 	int ret;
179 
180 	ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3,
181 			  &val);
182 	if (ret != 0) {
183 		dev_err(arizona->dev, "Failed to read thermal status: %d\n",
184 			ret);
185 	} else if (val & ARIZONA_SPK_OVERHEAT_STS) {
186 		dev_crit(arizona->dev, "Thermal shutdown\n");
187 		ret = regmap_update_bits(arizona->regmap,
188 					 ARIZONA_OUTPUT_ENABLES_1,
189 					 ARIZONA_OUT4L_ENA |
190 					 ARIZONA_OUT4R_ENA, 0);
191 		if (ret != 0)
192 			dev_crit(arizona->dev,
193 				 "Failed to disable speaker outputs: %d\n",
194 				 ret);
195 	}
196 
197 	return IRQ_HANDLED;
198 }
199 
200 static const struct snd_soc_dapm_widget arizona_spkl =
201 	SND_SOC_DAPM_PGA_E("OUT4L", SND_SOC_NOPM,
202 			   ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
203 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU);
204 
205 static const struct snd_soc_dapm_widget arizona_spkr =
206 	SND_SOC_DAPM_PGA_E("OUT4R", SND_SOC_NOPM,
207 			   ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
208 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU);
209 
210 int arizona_init_spk(struct snd_soc_codec *codec)
211 {
212 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
213 	struct arizona *arizona = priv->arizona;
214 	int ret;
215 
216 	ret = snd_soc_dapm_new_controls(&codec->dapm, &arizona_spkl, 1);
217 	if (ret != 0)
218 		return ret;
219 
220 	switch (arizona->type) {
221 	case WM8997:
222 		break;
223 	default:
224 		ret = snd_soc_dapm_new_controls(&codec->dapm,
225 						&arizona_spkr, 1);
226 		if (ret != 0)
227 			return ret;
228 		break;
229 	}
230 
231 	ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
232 				  "Thermal warning", arizona_thermal_warn,
233 				  arizona);
234 	if (ret != 0)
235 		dev_err(arizona->dev,
236 			"Failed to get thermal warning IRQ: %d\n",
237 			ret);
238 
239 	ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT,
240 				  "Thermal shutdown", arizona_thermal_shutdown,
241 				  arizona);
242 	if (ret != 0)
243 		dev_err(arizona->dev,
244 			"Failed to get thermal shutdown IRQ: %d\n",
245 			ret);
246 
247 	return 0;
248 }
249 EXPORT_SYMBOL_GPL(arizona_init_spk);
250 
251 static const struct snd_soc_dapm_route arizona_mono_routes[] = {
252 	{ "OUT1R", NULL, "OUT1L" },
253 	{ "OUT2R", NULL, "OUT2L" },
254 	{ "OUT3R", NULL, "OUT3L" },
255 	{ "OUT4R", NULL, "OUT4L" },
256 	{ "OUT5R", NULL, "OUT5L" },
257 	{ "OUT6R", NULL, "OUT6L" },
258 };
259 
260 int arizona_init_mono(struct snd_soc_codec *codec)
261 {
262 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
263 	struct arizona *arizona = priv->arizona;
264 	int i;
265 
266 	for (i = 0; i < ARIZONA_MAX_OUTPUT; ++i) {
267 		if (arizona->pdata.out_mono[i])
268 			snd_soc_dapm_add_routes(&codec->dapm,
269 						&arizona_mono_routes[i], 1);
270 	}
271 
272 	return 0;
273 }
274 EXPORT_SYMBOL_GPL(arizona_init_mono);
275 
276 int arizona_init_gpio(struct snd_soc_codec *codec)
277 {
278 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
279 	struct arizona *arizona = priv->arizona;
280 	int i;
281 
282 	switch (arizona->type) {
283 	case WM5110:
284 		snd_soc_dapm_disable_pin(&codec->dapm, "DRC2 Signal Activity");
285 		break;
286 	default:
287 		break;
288 	}
289 
290 	snd_soc_dapm_disable_pin(&codec->dapm, "DRC1 Signal Activity");
291 
292 	for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
293 		switch (arizona->pdata.gpio_defaults[i] & ARIZONA_GPN_FN_MASK) {
294 		case ARIZONA_GP_FN_DRC1_SIGNAL_DETECT:
295 			snd_soc_dapm_enable_pin(&codec->dapm,
296 						"DRC1 Signal Activity");
297 			break;
298 		case ARIZONA_GP_FN_DRC2_SIGNAL_DETECT:
299 			snd_soc_dapm_enable_pin(&codec->dapm,
300 						"DRC2 Signal Activity");
301 			break;
302 		default:
303 			break;
304 		}
305 	}
306 
307 	return 0;
308 }
309 EXPORT_SYMBOL_GPL(arizona_init_gpio);
310 
311 const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
312 	"None",
313 	"Tone Generator 1",
314 	"Tone Generator 2",
315 	"Haptics",
316 	"AEC",
317 	"Mic Mute Mixer",
318 	"Noise Generator",
319 	"IN1L",
320 	"IN1R",
321 	"IN2L",
322 	"IN2R",
323 	"IN3L",
324 	"IN3R",
325 	"IN4L",
326 	"IN4R",
327 	"AIF1RX1",
328 	"AIF1RX2",
329 	"AIF1RX3",
330 	"AIF1RX4",
331 	"AIF1RX5",
332 	"AIF1RX6",
333 	"AIF1RX7",
334 	"AIF1RX8",
335 	"AIF2RX1",
336 	"AIF2RX2",
337 	"AIF2RX3",
338 	"AIF2RX4",
339 	"AIF2RX5",
340 	"AIF2RX6",
341 	"AIF3RX1",
342 	"AIF3RX2",
343 	"SLIMRX1",
344 	"SLIMRX2",
345 	"SLIMRX3",
346 	"SLIMRX4",
347 	"SLIMRX5",
348 	"SLIMRX6",
349 	"SLIMRX7",
350 	"SLIMRX8",
351 	"EQ1",
352 	"EQ2",
353 	"EQ3",
354 	"EQ4",
355 	"DRC1L",
356 	"DRC1R",
357 	"DRC2L",
358 	"DRC2R",
359 	"LHPF1",
360 	"LHPF2",
361 	"LHPF3",
362 	"LHPF4",
363 	"DSP1.1",
364 	"DSP1.2",
365 	"DSP1.3",
366 	"DSP1.4",
367 	"DSP1.5",
368 	"DSP1.6",
369 	"DSP2.1",
370 	"DSP2.2",
371 	"DSP2.3",
372 	"DSP2.4",
373 	"DSP2.5",
374 	"DSP2.6",
375 	"DSP3.1",
376 	"DSP3.2",
377 	"DSP3.3",
378 	"DSP3.4",
379 	"DSP3.5",
380 	"DSP3.6",
381 	"DSP4.1",
382 	"DSP4.2",
383 	"DSP4.3",
384 	"DSP4.4",
385 	"DSP4.5",
386 	"DSP4.6",
387 	"ASRC1L",
388 	"ASRC1R",
389 	"ASRC2L",
390 	"ASRC2R",
391 	"ISRC1INT1",
392 	"ISRC1INT2",
393 	"ISRC1INT3",
394 	"ISRC1INT4",
395 	"ISRC1DEC1",
396 	"ISRC1DEC2",
397 	"ISRC1DEC3",
398 	"ISRC1DEC4",
399 	"ISRC2INT1",
400 	"ISRC2INT2",
401 	"ISRC2INT3",
402 	"ISRC2INT4",
403 	"ISRC2DEC1",
404 	"ISRC2DEC2",
405 	"ISRC2DEC3",
406 	"ISRC2DEC4",
407 	"ISRC3INT1",
408 	"ISRC3INT2",
409 	"ISRC3INT3",
410 	"ISRC3INT4",
411 	"ISRC3DEC1",
412 	"ISRC3DEC2",
413 	"ISRC3DEC3",
414 	"ISRC3DEC4",
415 };
416 EXPORT_SYMBOL_GPL(arizona_mixer_texts);
417 
418 int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS] = {
419 	0x00,  /* None */
420 	0x04,  /* Tone */
421 	0x05,
422 	0x06,  /* Haptics */
423 	0x08,  /* AEC */
424 	0x0c,  /* Noise mixer */
425 	0x0d,  /* Comfort noise */
426 	0x10,  /* IN1L */
427 	0x11,
428 	0x12,
429 	0x13,
430 	0x14,
431 	0x15,
432 	0x16,
433 	0x17,
434 	0x20,  /* AIF1RX1 */
435 	0x21,
436 	0x22,
437 	0x23,
438 	0x24,
439 	0x25,
440 	0x26,
441 	0x27,
442 	0x28,  /* AIF2RX1 */
443 	0x29,
444 	0x2a,
445 	0x2b,
446 	0x2c,
447 	0x2d,
448 	0x30,  /* AIF3RX1 */
449 	0x31,
450 	0x38,  /* SLIMRX1 */
451 	0x39,
452 	0x3a,
453 	0x3b,
454 	0x3c,
455 	0x3d,
456 	0x3e,
457 	0x3f,
458 	0x50,  /* EQ1 */
459 	0x51,
460 	0x52,
461 	0x53,
462 	0x58,  /* DRC1L */
463 	0x59,
464 	0x5a,
465 	0x5b,
466 	0x60,  /* LHPF1 */
467 	0x61,
468 	0x62,
469 	0x63,
470 	0x68,  /* DSP1.1 */
471 	0x69,
472 	0x6a,
473 	0x6b,
474 	0x6c,
475 	0x6d,
476 	0x70,  /* DSP2.1 */
477 	0x71,
478 	0x72,
479 	0x73,
480 	0x74,
481 	0x75,
482 	0x78,  /* DSP3.1 */
483 	0x79,
484 	0x7a,
485 	0x7b,
486 	0x7c,
487 	0x7d,
488 	0x80,  /* DSP4.1 */
489 	0x81,
490 	0x82,
491 	0x83,
492 	0x84,
493 	0x85,
494 	0x90,  /* ASRC1L */
495 	0x91,
496 	0x92,
497 	0x93,
498 	0xa0,  /* ISRC1INT1 */
499 	0xa1,
500 	0xa2,
501 	0xa3,
502 	0xa4,  /* ISRC1DEC1 */
503 	0xa5,
504 	0xa6,
505 	0xa7,
506 	0xa8,  /* ISRC2DEC1 */
507 	0xa9,
508 	0xaa,
509 	0xab,
510 	0xac,  /* ISRC2INT1 */
511 	0xad,
512 	0xae,
513 	0xaf,
514 	0xb0,  /* ISRC3DEC1 */
515 	0xb1,
516 	0xb2,
517 	0xb3,
518 	0xb4,  /* ISRC3INT1 */
519 	0xb5,
520 	0xb6,
521 	0xb7,
522 };
523 EXPORT_SYMBOL_GPL(arizona_mixer_values);
524 
525 const DECLARE_TLV_DB_SCALE(arizona_mixer_tlv, -3200, 100, 0);
526 EXPORT_SYMBOL_GPL(arizona_mixer_tlv);
527 
528 const char *arizona_rate_text[ARIZONA_RATE_ENUM_SIZE] = {
529 	"SYNCCLK rate", "8kHz", "16kHz", "ASYNCCLK rate",
530 };
531 EXPORT_SYMBOL_GPL(arizona_rate_text);
532 
533 const int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE] = {
534 	0, 1, 2, 8,
535 };
536 EXPORT_SYMBOL_GPL(arizona_rate_val);
537 
538 
539 const struct soc_enum arizona_isrc_fsh[] = {
540 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_1_CTRL_1,
541 			      ARIZONA_ISRC1_FSH_SHIFT, 0xf,
542 			      ARIZONA_RATE_ENUM_SIZE,
543 			      arizona_rate_text, arizona_rate_val),
544 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_2_CTRL_1,
545 			      ARIZONA_ISRC2_FSH_SHIFT, 0xf,
546 			      ARIZONA_RATE_ENUM_SIZE,
547 			      arizona_rate_text, arizona_rate_val),
548 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_3_CTRL_1,
549 			      ARIZONA_ISRC3_FSH_SHIFT, 0xf,
550 			      ARIZONA_RATE_ENUM_SIZE,
551 			      arizona_rate_text, arizona_rate_val),
552 };
553 EXPORT_SYMBOL_GPL(arizona_isrc_fsh);
554 
555 const struct soc_enum arizona_isrc_fsl[] = {
556 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_1_CTRL_2,
557 			      ARIZONA_ISRC1_FSL_SHIFT, 0xf,
558 			      ARIZONA_RATE_ENUM_SIZE,
559 			      arizona_rate_text, arizona_rate_val),
560 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_2_CTRL_2,
561 			      ARIZONA_ISRC2_FSL_SHIFT, 0xf,
562 			      ARIZONA_RATE_ENUM_SIZE,
563 			      arizona_rate_text, arizona_rate_val),
564 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_3_CTRL_2,
565 			      ARIZONA_ISRC3_FSL_SHIFT, 0xf,
566 			      ARIZONA_RATE_ENUM_SIZE,
567 			      arizona_rate_text, arizona_rate_val),
568 };
569 EXPORT_SYMBOL_GPL(arizona_isrc_fsl);
570 
571 const struct soc_enum arizona_asrc_rate1 =
572 	SOC_VALUE_ENUM_SINGLE(ARIZONA_ASRC_RATE1,
573 			      ARIZONA_ASRC_RATE1_SHIFT, 0xf,
574 			      ARIZONA_RATE_ENUM_SIZE - 1,
575 			      arizona_rate_text, arizona_rate_val);
576 EXPORT_SYMBOL_GPL(arizona_asrc_rate1);
577 
578 static const char *arizona_vol_ramp_text[] = {
579 	"0ms/6dB", "0.5ms/6dB", "1ms/6dB", "2ms/6dB", "4ms/6dB", "8ms/6dB",
580 	"15ms/6dB", "30ms/6dB",
581 };
582 
583 SOC_ENUM_SINGLE_DECL(arizona_in_vd_ramp,
584 		     ARIZONA_INPUT_VOLUME_RAMP,
585 		     ARIZONA_IN_VD_RAMP_SHIFT,
586 		     arizona_vol_ramp_text);
587 EXPORT_SYMBOL_GPL(arizona_in_vd_ramp);
588 
589 SOC_ENUM_SINGLE_DECL(arizona_in_vi_ramp,
590 		     ARIZONA_INPUT_VOLUME_RAMP,
591 		     ARIZONA_IN_VI_RAMP_SHIFT,
592 		     arizona_vol_ramp_text);
593 EXPORT_SYMBOL_GPL(arizona_in_vi_ramp);
594 
595 SOC_ENUM_SINGLE_DECL(arizona_out_vd_ramp,
596 		     ARIZONA_OUTPUT_VOLUME_RAMP,
597 		     ARIZONA_OUT_VD_RAMP_SHIFT,
598 		     arizona_vol_ramp_text);
599 EXPORT_SYMBOL_GPL(arizona_out_vd_ramp);
600 
601 SOC_ENUM_SINGLE_DECL(arizona_out_vi_ramp,
602 		     ARIZONA_OUTPUT_VOLUME_RAMP,
603 		     ARIZONA_OUT_VI_RAMP_SHIFT,
604 		     arizona_vol_ramp_text);
605 EXPORT_SYMBOL_GPL(arizona_out_vi_ramp);
606 
607 static const char *arizona_lhpf_mode_text[] = {
608 	"Low-pass", "High-pass"
609 };
610 
611 SOC_ENUM_SINGLE_DECL(arizona_lhpf1_mode,
612 		     ARIZONA_HPLPF1_1,
613 		     ARIZONA_LHPF1_MODE_SHIFT,
614 		     arizona_lhpf_mode_text);
615 EXPORT_SYMBOL_GPL(arizona_lhpf1_mode);
616 
617 SOC_ENUM_SINGLE_DECL(arizona_lhpf2_mode,
618 		     ARIZONA_HPLPF2_1,
619 		     ARIZONA_LHPF2_MODE_SHIFT,
620 		     arizona_lhpf_mode_text);
621 EXPORT_SYMBOL_GPL(arizona_lhpf2_mode);
622 
623 SOC_ENUM_SINGLE_DECL(arizona_lhpf3_mode,
624 		     ARIZONA_HPLPF3_1,
625 		     ARIZONA_LHPF3_MODE_SHIFT,
626 		     arizona_lhpf_mode_text);
627 EXPORT_SYMBOL_GPL(arizona_lhpf3_mode);
628 
629 SOC_ENUM_SINGLE_DECL(arizona_lhpf4_mode,
630 		     ARIZONA_HPLPF4_1,
631 		     ARIZONA_LHPF4_MODE_SHIFT,
632 		     arizona_lhpf_mode_text);
633 EXPORT_SYMBOL_GPL(arizona_lhpf4_mode);
634 
635 static const char *arizona_ng_hold_text[] = {
636 	"30ms", "120ms", "250ms", "500ms",
637 };
638 
639 SOC_ENUM_SINGLE_DECL(arizona_ng_hold,
640 		     ARIZONA_NOISE_GATE_CONTROL,
641 		     ARIZONA_NGATE_HOLD_SHIFT,
642 		     arizona_ng_hold_text);
643 EXPORT_SYMBOL_GPL(arizona_ng_hold);
644 
645 static const char * const arizona_in_hpf_cut_text[] = {
646 	"2.5Hz", "5Hz", "10Hz", "20Hz", "40Hz"
647 };
648 
649 SOC_ENUM_SINGLE_DECL(arizona_in_hpf_cut_enum,
650 		     ARIZONA_HPF_CONTROL,
651 		     ARIZONA_IN_HPF_CUT_SHIFT,
652 		     arizona_in_hpf_cut_text);
653 EXPORT_SYMBOL_GPL(arizona_in_hpf_cut_enum);
654 
655 static const char * const arizona_in_dmic_osr_text[] = {
656 	"1.536MHz", "3.072MHz", "6.144MHz", "768kHz",
657 };
658 
659 const struct soc_enum arizona_in_dmic_osr[] = {
660 	SOC_ENUM_SINGLE(ARIZONA_IN1L_CONTROL, ARIZONA_IN1_OSR_SHIFT,
661 			ARRAY_SIZE(arizona_in_dmic_osr_text),
662 			arizona_in_dmic_osr_text),
663 	SOC_ENUM_SINGLE(ARIZONA_IN2L_CONTROL, ARIZONA_IN2_OSR_SHIFT,
664 			ARRAY_SIZE(arizona_in_dmic_osr_text),
665 			arizona_in_dmic_osr_text),
666 	SOC_ENUM_SINGLE(ARIZONA_IN3L_CONTROL, ARIZONA_IN3_OSR_SHIFT,
667 			ARRAY_SIZE(arizona_in_dmic_osr_text),
668 			arizona_in_dmic_osr_text),
669 	SOC_ENUM_SINGLE(ARIZONA_IN4L_CONTROL, ARIZONA_IN4_OSR_SHIFT,
670 			ARRAY_SIZE(arizona_in_dmic_osr_text),
671 			arizona_in_dmic_osr_text),
672 };
673 EXPORT_SYMBOL_GPL(arizona_in_dmic_osr);
674 
675 static void arizona_in_set_vu(struct snd_soc_codec *codec, int ena)
676 {
677 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
678 	unsigned int val;
679 	int i;
680 
681 	if (ena)
682 		val = ARIZONA_IN_VU;
683 	else
684 		val = 0;
685 
686 	for (i = 0; i < priv->num_inputs; i++)
687 		snd_soc_update_bits(codec,
688 				    ARIZONA_ADC_DIGITAL_VOLUME_1L + (i * 4),
689 				    ARIZONA_IN_VU, val);
690 }
691 
692 int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
693 		  int event)
694 {
695 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(w->codec);
696 	unsigned int reg;
697 
698 	if (w->shift % 2)
699 		reg = ARIZONA_ADC_DIGITAL_VOLUME_1L + ((w->shift / 2) * 8);
700 	else
701 		reg = ARIZONA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8);
702 
703 	switch (event) {
704 	case SND_SOC_DAPM_PRE_PMU:
705 		priv->in_pending++;
706 		break;
707 	case SND_SOC_DAPM_POST_PMU:
708 		snd_soc_update_bits(w->codec, reg, ARIZONA_IN1L_MUTE, 0);
709 
710 		/* If this is the last input pending then allow VU */
711 		priv->in_pending--;
712 		if (priv->in_pending == 0) {
713 			msleep(1);
714 			arizona_in_set_vu(w->codec, 1);
715 		}
716 		break;
717 	case SND_SOC_DAPM_PRE_PMD:
718 		snd_soc_update_bits(w->codec, reg,
719 				    ARIZONA_IN1L_MUTE | ARIZONA_IN_VU,
720 				    ARIZONA_IN1L_MUTE | ARIZONA_IN_VU);
721 		break;
722 	case SND_SOC_DAPM_POST_PMD:
723 		/* Disable volume updates if no inputs are enabled */
724 		reg = snd_soc_read(w->codec, ARIZONA_INPUT_ENABLES);
725 		if (reg == 0)
726 			arizona_in_set_vu(w->codec, 0);
727 	}
728 
729 	return 0;
730 }
731 EXPORT_SYMBOL_GPL(arizona_in_ev);
732 
733 int arizona_out_ev(struct snd_soc_dapm_widget *w,
734 		   struct snd_kcontrol *kcontrol,
735 		   int event)
736 {
737 	switch (event) {
738 	case SND_SOC_DAPM_POST_PMU:
739 		switch (w->shift) {
740 		case ARIZONA_OUT1L_ENA_SHIFT:
741 		case ARIZONA_OUT1R_ENA_SHIFT:
742 		case ARIZONA_OUT2L_ENA_SHIFT:
743 		case ARIZONA_OUT2R_ENA_SHIFT:
744 		case ARIZONA_OUT3L_ENA_SHIFT:
745 		case ARIZONA_OUT3R_ENA_SHIFT:
746 			msleep(17);
747 			break;
748 
749 		default:
750 			break;
751 		}
752 		break;
753 	}
754 
755 	return 0;
756 }
757 EXPORT_SYMBOL_GPL(arizona_out_ev);
758 
759 int arizona_hp_ev(struct snd_soc_dapm_widget *w,
760 		   struct snd_kcontrol *kcontrol,
761 		   int event)
762 {
763 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(w->codec);
764 	struct arizona *arizona = priv->arizona;
765 	unsigned int mask = 1 << w->shift;
766 	unsigned int val;
767 
768 	switch (event) {
769 	case SND_SOC_DAPM_POST_PMU:
770 		val = mask;
771 		break;
772 	case SND_SOC_DAPM_PRE_PMD:
773 		val = 0;
774 		break;
775 	default:
776 		return -EINVAL;
777 	}
778 
779 	/* Store the desired state for the HP outputs */
780 	priv->arizona->hp_ena &= ~mask;
781 	priv->arizona->hp_ena |= val;
782 
783 	/* Force off if HPDET magic is active */
784 	if (priv->arizona->hpdet_magic)
785 		val = 0;
786 
787 	regmap_update_bits_async(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1,
788 				 mask, val);
789 
790 	return arizona_out_ev(w, kcontrol, event);
791 }
792 EXPORT_SYMBOL_GPL(arizona_hp_ev);
793 
794 static unsigned int arizona_sysclk_48k_rates[] = {
795 	6144000,
796 	12288000,
797 	24576000,
798 	49152000,
799 	73728000,
800 	98304000,
801 	147456000,
802 };
803 
804 static unsigned int arizona_sysclk_44k1_rates[] = {
805 	5644800,
806 	11289600,
807 	22579200,
808 	45158400,
809 	67737600,
810 	90316800,
811 	135475200,
812 };
813 
814 static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk,
815 			     unsigned int freq)
816 {
817 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
818 	unsigned int reg;
819 	unsigned int *rates;
820 	int ref, div, refclk;
821 
822 	switch (clk) {
823 	case ARIZONA_CLK_OPCLK:
824 		reg = ARIZONA_OUTPUT_SYSTEM_CLOCK;
825 		refclk = priv->sysclk;
826 		break;
827 	case ARIZONA_CLK_ASYNC_OPCLK:
828 		reg = ARIZONA_OUTPUT_ASYNC_CLOCK;
829 		refclk = priv->asyncclk;
830 		break;
831 	default:
832 		return -EINVAL;
833 	}
834 
835 	if (refclk % 8000)
836 		rates = arizona_sysclk_44k1_rates;
837 	else
838 		rates = arizona_sysclk_48k_rates;
839 
840 	for (ref = 0; ref < ARRAY_SIZE(arizona_sysclk_48k_rates) &&
841 		     rates[ref] <= refclk; ref++) {
842 		div = 1;
843 		while (rates[ref] / div >= freq && div < 32) {
844 			if (rates[ref] / div == freq) {
845 				dev_dbg(codec->dev, "Configured %dHz OPCLK\n",
846 					freq);
847 				snd_soc_update_bits(codec, reg,
848 						    ARIZONA_OPCLK_DIV_MASK |
849 						    ARIZONA_OPCLK_SEL_MASK,
850 						    (div <<
851 						     ARIZONA_OPCLK_DIV_SHIFT) |
852 						    ref);
853 				return 0;
854 			}
855 			div++;
856 		}
857 	}
858 
859 	dev_err(codec->dev, "Unable to generate %dHz OPCLK\n", freq);
860 	return -EINVAL;
861 }
862 
863 int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
864 		       int source, unsigned int freq, int dir)
865 {
866 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
867 	struct arizona *arizona = priv->arizona;
868 	char *name;
869 	unsigned int reg;
870 	unsigned int mask = ARIZONA_SYSCLK_FREQ_MASK | ARIZONA_SYSCLK_SRC_MASK;
871 	unsigned int val = source << ARIZONA_SYSCLK_SRC_SHIFT;
872 	unsigned int *clk;
873 
874 	switch (clk_id) {
875 	case ARIZONA_CLK_SYSCLK:
876 		name = "SYSCLK";
877 		reg = ARIZONA_SYSTEM_CLOCK_1;
878 		clk = &priv->sysclk;
879 		mask |= ARIZONA_SYSCLK_FRAC;
880 		break;
881 	case ARIZONA_CLK_ASYNCCLK:
882 		name = "ASYNCCLK";
883 		reg = ARIZONA_ASYNC_CLOCK_1;
884 		clk = &priv->asyncclk;
885 		break;
886 	case ARIZONA_CLK_OPCLK:
887 	case ARIZONA_CLK_ASYNC_OPCLK:
888 		return arizona_set_opclk(codec, clk_id, freq);
889 	default:
890 		return -EINVAL;
891 	}
892 
893 	switch (freq) {
894 	case  5644800:
895 	case  6144000:
896 		break;
897 	case 11289600:
898 	case 12288000:
899 		val |= ARIZONA_CLK_12MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
900 		break;
901 	case 22579200:
902 	case 24576000:
903 		val |= ARIZONA_CLK_24MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
904 		break;
905 	case 45158400:
906 	case 49152000:
907 		val |= ARIZONA_CLK_49MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
908 		break;
909 	case 67737600:
910 	case 73728000:
911 		val |= ARIZONA_CLK_73MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
912 		break;
913 	case 90316800:
914 	case 98304000:
915 		val |= ARIZONA_CLK_98MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
916 		break;
917 	case 135475200:
918 	case 147456000:
919 		val |= ARIZONA_CLK_147MHZ << ARIZONA_SYSCLK_FREQ_SHIFT;
920 		break;
921 	case 0:
922 		dev_dbg(arizona->dev, "%s cleared\n", name);
923 		*clk = freq;
924 		return 0;
925 	default:
926 		return -EINVAL;
927 	}
928 
929 	*clk = freq;
930 
931 	if (freq % 6144000)
932 		val |= ARIZONA_SYSCLK_FRAC;
933 
934 	dev_dbg(arizona->dev, "%s set to %uHz", name, freq);
935 
936 	return regmap_update_bits(arizona->regmap, reg, mask, val);
937 }
938 EXPORT_SYMBOL_GPL(arizona_set_sysclk);
939 
940 static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
941 {
942 	struct snd_soc_codec *codec = dai->codec;
943 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
944 	struct arizona *arizona = priv->arizona;
945 	int lrclk, bclk, mode, base;
946 
947 	base = dai->driver->base;
948 
949 	lrclk = 0;
950 	bclk = 0;
951 
952 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
953 	case SND_SOC_DAIFMT_DSP_A:
954 		mode = ARIZONA_FMT_DSP_MODE_A;
955 		break;
956 	case SND_SOC_DAIFMT_DSP_B:
957 		if ((fmt & SND_SOC_DAIFMT_MASTER_MASK)
958 				!= SND_SOC_DAIFMT_CBM_CFM) {
959 			arizona_aif_err(dai, "DSP_B not valid in slave mode\n");
960 			return -EINVAL;
961 		}
962 		mode = ARIZONA_FMT_DSP_MODE_B;
963 		break;
964 	case SND_SOC_DAIFMT_I2S:
965 		mode = ARIZONA_FMT_I2S_MODE;
966 		break;
967 	case SND_SOC_DAIFMT_LEFT_J:
968 		if ((fmt & SND_SOC_DAIFMT_MASTER_MASK)
969 				!= SND_SOC_DAIFMT_CBM_CFM) {
970 			arizona_aif_err(dai, "LEFT_J not valid in slave mode\n");
971 			return -EINVAL;
972 		}
973 		mode = ARIZONA_FMT_LEFT_JUSTIFIED_MODE;
974 		break;
975 	default:
976 		arizona_aif_err(dai, "Unsupported DAI format %d\n",
977 				fmt & SND_SOC_DAIFMT_FORMAT_MASK);
978 		return -EINVAL;
979 	}
980 
981 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
982 	case SND_SOC_DAIFMT_CBS_CFS:
983 		break;
984 	case SND_SOC_DAIFMT_CBS_CFM:
985 		lrclk |= ARIZONA_AIF1TX_LRCLK_MSTR;
986 		break;
987 	case SND_SOC_DAIFMT_CBM_CFS:
988 		bclk |= ARIZONA_AIF1_BCLK_MSTR;
989 		break;
990 	case SND_SOC_DAIFMT_CBM_CFM:
991 		bclk |= ARIZONA_AIF1_BCLK_MSTR;
992 		lrclk |= ARIZONA_AIF1TX_LRCLK_MSTR;
993 		break;
994 	default:
995 		arizona_aif_err(dai, "Unsupported master mode %d\n",
996 				fmt & SND_SOC_DAIFMT_MASTER_MASK);
997 		return -EINVAL;
998 	}
999 
1000 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1001 	case SND_SOC_DAIFMT_NB_NF:
1002 		break;
1003 	case SND_SOC_DAIFMT_IB_IF:
1004 		bclk |= ARIZONA_AIF1_BCLK_INV;
1005 		lrclk |= ARIZONA_AIF1TX_LRCLK_INV;
1006 		break;
1007 	case SND_SOC_DAIFMT_IB_NF:
1008 		bclk |= ARIZONA_AIF1_BCLK_INV;
1009 		break;
1010 	case SND_SOC_DAIFMT_NB_IF:
1011 		lrclk |= ARIZONA_AIF1TX_LRCLK_INV;
1012 		break;
1013 	default:
1014 		return -EINVAL;
1015 	}
1016 
1017 	regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_BCLK_CTRL,
1018 				 ARIZONA_AIF1_BCLK_INV |
1019 				 ARIZONA_AIF1_BCLK_MSTR,
1020 				 bclk);
1021 	regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_TX_PIN_CTRL,
1022 				 ARIZONA_AIF1TX_LRCLK_INV |
1023 				 ARIZONA_AIF1TX_LRCLK_MSTR, lrclk);
1024 	regmap_update_bits_async(arizona->regmap,
1025 				 base + ARIZONA_AIF_RX_PIN_CTRL,
1026 				 ARIZONA_AIF1RX_LRCLK_INV |
1027 				 ARIZONA_AIF1RX_LRCLK_MSTR, lrclk);
1028 	regmap_update_bits(arizona->regmap, base + ARIZONA_AIF_FORMAT,
1029 			   ARIZONA_AIF1_FMT_MASK, mode);
1030 
1031 	return 0;
1032 }
1033 
1034 static const int arizona_48k_bclk_rates[] = {
1035 	-1,
1036 	48000,
1037 	64000,
1038 	96000,
1039 	128000,
1040 	192000,
1041 	256000,
1042 	384000,
1043 	512000,
1044 	768000,
1045 	1024000,
1046 	1536000,
1047 	2048000,
1048 	3072000,
1049 	4096000,
1050 	6144000,
1051 	8192000,
1052 	12288000,
1053 	24576000,
1054 };
1055 
1056 static const unsigned int arizona_48k_rates[] = {
1057 	12000,
1058 	24000,
1059 	48000,
1060 	96000,
1061 	192000,
1062 	384000,
1063 	768000,
1064 	4000,
1065 	8000,
1066 	16000,
1067 	32000,
1068 	64000,
1069 	128000,
1070 	256000,
1071 	512000,
1072 };
1073 
1074 static const struct snd_pcm_hw_constraint_list arizona_48k_constraint = {
1075 	.count	= ARRAY_SIZE(arizona_48k_rates),
1076 	.list	= arizona_48k_rates,
1077 };
1078 
1079 static const int arizona_44k1_bclk_rates[] = {
1080 	-1,
1081 	44100,
1082 	58800,
1083 	88200,
1084 	117600,
1085 	177640,
1086 	235200,
1087 	352800,
1088 	470400,
1089 	705600,
1090 	940800,
1091 	1411200,
1092 	1881600,
1093 	2822400,
1094 	3763200,
1095 	5644800,
1096 	7526400,
1097 	11289600,
1098 	22579200,
1099 };
1100 
1101 static const unsigned int arizona_44k1_rates[] = {
1102 	11025,
1103 	22050,
1104 	44100,
1105 	88200,
1106 	176400,
1107 	352800,
1108 	705600,
1109 };
1110 
1111 static const struct snd_pcm_hw_constraint_list arizona_44k1_constraint = {
1112 	.count	= ARRAY_SIZE(arizona_44k1_rates),
1113 	.list	= arizona_44k1_rates,
1114 };
1115 
1116 static int arizona_sr_vals[] = {
1117 	0,
1118 	12000,
1119 	24000,
1120 	48000,
1121 	96000,
1122 	192000,
1123 	384000,
1124 	768000,
1125 	0,
1126 	11025,
1127 	22050,
1128 	44100,
1129 	88200,
1130 	176400,
1131 	352800,
1132 	705600,
1133 	4000,
1134 	8000,
1135 	16000,
1136 	32000,
1137 	64000,
1138 	128000,
1139 	256000,
1140 	512000,
1141 };
1142 
1143 static int arizona_startup(struct snd_pcm_substream *substream,
1144 			   struct snd_soc_dai *dai)
1145 {
1146 	struct snd_soc_codec *codec = dai->codec;
1147 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1148 	struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1149 	const struct snd_pcm_hw_constraint_list *constraint;
1150 	unsigned int base_rate;
1151 
1152 	switch (dai_priv->clk) {
1153 	case ARIZONA_CLK_SYSCLK:
1154 		base_rate = priv->sysclk;
1155 		break;
1156 	case ARIZONA_CLK_ASYNCCLK:
1157 		base_rate = priv->asyncclk;
1158 		break;
1159 	default:
1160 		return 0;
1161 	}
1162 
1163 	if (base_rate == 0)
1164 		return 0;
1165 
1166 	if (base_rate % 8000)
1167 		constraint = &arizona_44k1_constraint;
1168 	else
1169 		constraint = &arizona_48k_constraint;
1170 
1171 	return snd_pcm_hw_constraint_list(substream->runtime, 0,
1172 					  SNDRV_PCM_HW_PARAM_RATE,
1173 					  constraint);
1174 }
1175 
1176 static void arizona_wm5102_set_dac_comp(struct snd_soc_codec *codec,
1177 					unsigned int rate)
1178 {
1179 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1180 	struct arizona *arizona = priv->arizona;
1181 	struct reg_default dac_comp[] = {
1182 		{ 0x80, 0x3 },
1183 		{ ARIZONA_DAC_COMP_1, 0 },
1184 		{ ARIZONA_DAC_COMP_2, 0 },
1185 		{ 0x80, 0x0 },
1186 	};
1187 
1188 	mutex_lock(&arizona->dac_comp_lock);
1189 
1190 	dac_comp[1].def = arizona->dac_comp_coeff;
1191 	if (rate >= 176400)
1192 		dac_comp[2].def = arizona->dac_comp_enabled;
1193 
1194 	mutex_unlock(&arizona->dac_comp_lock);
1195 
1196 	regmap_multi_reg_write(arizona->regmap,
1197 			       dac_comp,
1198 			       ARRAY_SIZE(dac_comp));
1199 }
1200 
1201 static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
1202 				  struct snd_pcm_hw_params *params,
1203 				  struct snd_soc_dai *dai)
1204 {
1205 	struct snd_soc_codec *codec = dai->codec;
1206 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1207 	struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1208 	int base = dai->driver->base;
1209 	int i, sr_val;
1210 
1211 	/*
1212 	 * We will need to be more flexible than this in future,
1213 	 * currently we use a single sample rate for SYSCLK.
1214 	 */
1215 	for (i = 0; i < ARRAY_SIZE(arizona_sr_vals); i++)
1216 		if (arizona_sr_vals[i] == params_rate(params))
1217 			break;
1218 	if (i == ARRAY_SIZE(arizona_sr_vals)) {
1219 		arizona_aif_err(dai, "Unsupported sample rate %dHz\n",
1220 				params_rate(params));
1221 		return -EINVAL;
1222 	}
1223 	sr_val = i;
1224 
1225 	switch (dai_priv->clk) {
1226 	case ARIZONA_CLK_SYSCLK:
1227 		switch (priv->arizona->type) {
1228 		case WM5102:
1229 			arizona_wm5102_set_dac_comp(codec,
1230 						    params_rate(params));
1231 			break;
1232 		default:
1233 			break;
1234 		}
1235 
1236 		snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1,
1237 				    ARIZONA_SAMPLE_RATE_1_MASK, sr_val);
1238 		if (base)
1239 			snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL,
1240 					    ARIZONA_AIF1_RATE_MASK, 0);
1241 		break;
1242 	case ARIZONA_CLK_ASYNCCLK:
1243 		snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1,
1244 				    ARIZONA_ASYNC_SAMPLE_RATE_1_MASK, sr_val);
1245 		if (base)
1246 			snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL,
1247 					    ARIZONA_AIF1_RATE_MASK,
1248 					    8 << ARIZONA_AIF1_RATE_SHIFT);
1249 		break;
1250 	default:
1251 		arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk);
1252 		return -EINVAL;
1253 	}
1254 
1255 	return 0;
1256 }
1257 
1258 static bool arizona_aif_cfg_changed(struct snd_soc_codec *codec,
1259 				    int base, int bclk, int lrclk, int frame)
1260 {
1261 	int val;
1262 
1263 	val = snd_soc_read(codec, base + ARIZONA_AIF_BCLK_CTRL);
1264 	if (bclk != (val & ARIZONA_AIF1_BCLK_FREQ_MASK))
1265 		return true;
1266 
1267 	val = snd_soc_read(codec, base + ARIZONA_AIF_TX_BCLK_RATE);
1268 	if (lrclk != (val & ARIZONA_AIF1TX_BCPF_MASK))
1269 		return true;
1270 
1271 	val = snd_soc_read(codec, base + ARIZONA_AIF_FRAME_CTRL_1);
1272 	if (frame != (val & (ARIZONA_AIF1TX_WL_MASK |
1273 			     ARIZONA_AIF1TX_SLOT_LEN_MASK)))
1274 		return true;
1275 
1276 	return false;
1277 }
1278 
1279 static int arizona_hw_params(struct snd_pcm_substream *substream,
1280 			     struct snd_pcm_hw_params *params,
1281 			     struct snd_soc_dai *dai)
1282 {
1283 	struct snd_soc_codec *codec = dai->codec;
1284 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1285 	struct arizona *arizona = priv->arizona;
1286 	int base = dai->driver->base;
1287 	const int *rates;
1288 	int i, ret, val;
1289 	int channels = params_channels(params);
1290 	int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1];
1291 	int tdm_width = arizona->tdm_width[dai->id - 1];
1292 	int tdm_slots = arizona->tdm_slots[dai->id - 1];
1293 	int bclk, lrclk, wl, frame, bclk_target;
1294 	bool reconfig;
1295 	unsigned int aif_tx_state, aif_rx_state;
1296 
1297 	if (params_rate(params) % 8000)
1298 		rates = &arizona_44k1_bclk_rates[0];
1299 	else
1300 		rates = &arizona_48k_bclk_rates[0];
1301 
1302 	wl = snd_pcm_format_width(params_format(params));
1303 
1304 	if (tdm_slots) {
1305 		arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
1306 				tdm_slots, tdm_width);
1307 		bclk_target = tdm_slots * tdm_width * params_rate(params);
1308 		channels = tdm_slots;
1309 	} else {
1310 		bclk_target = snd_soc_params_to_bclk(params);
1311 		tdm_width = wl;
1312 	}
1313 
1314 	if (chan_limit && chan_limit < channels) {
1315 		arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit);
1316 		bclk_target /= channels;
1317 		bclk_target *= chan_limit;
1318 	}
1319 
1320 	/* Force multiple of 2 channels for I2S mode */
1321 	val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT);
1322 	val &= ARIZONA_AIF1_FMT_MASK;
1323 	if ((channels & 1) && (val == ARIZONA_FMT_I2S_MODE)) {
1324 		arizona_aif_dbg(dai, "Forcing stereo mode\n");
1325 		bclk_target /= channels;
1326 		bclk_target *= channels + 1;
1327 	}
1328 
1329 	for (i = 0; i < ARRAY_SIZE(arizona_44k1_bclk_rates); i++) {
1330 		if (rates[i] >= bclk_target &&
1331 		    rates[i] % params_rate(params) == 0) {
1332 			bclk = i;
1333 			break;
1334 		}
1335 	}
1336 	if (i == ARRAY_SIZE(arizona_44k1_bclk_rates)) {
1337 		arizona_aif_err(dai, "Unsupported sample rate %dHz\n",
1338 				params_rate(params));
1339 		return -EINVAL;
1340 	}
1341 
1342 	lrclk = rates[bclk] / params_rate(params);
1343 
1344 	arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n",
1345 			rates[bclk], rates[bclk] / lrclk);
1346 
1347 	frame = wl << ARIZONA_AIF1TX_WL_SHIFT | tdm_width;
1348 
1349 	reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame);
1350 
1351 	if (reconfig) {
1352 		/* Save AIF TX/RX state */
1353 		aif_tx_state = snd_soc_read(codec,
1354 					    base + ARIZONA_AIF_TX_ENABLES);
1355 		aif_rx_state = snd_soc_read(codec,
1356 					    base + ARIZONA_AIF_RX_ENABLES);
1357 		/* Disable AIF TX/RX before reconfiguring it */
1358 		regmap_update_bits_async(arizona->regmap,
1359 				    base + ARIZONA_AIF_TX_ENABLES, 0xff, 0x0);
1360 		regmap_update_bits(arizona->regmap,
1361 				    base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0);
1362 	}
1363 
1364 	ret = arizona_hw_params_rate(substream, params, dai);
1365 	if (ret != 0)
1366 		goto restore_aif;
1367 
1368 	if (reconfig) {
1369 		regmap_update_bits_async(arizona->regmap,
1370 					 base + ARIZONA_AIF_BCLK_CTRL,
1371 					 ARIZONA_AIF1_BCLK_FREQ_MASK, bclk);
1372 		regmap_update_bits_async(arizona->regmap,
1373 					 base + ARIZONA_AIF_TX_BCLK_RATE,
1374 					 ARIZONA_AIF1TX_BCPF_MASK, lrclk);
1375 		regmap_update_bits_async(arizona->regmap,
1376 					 base + ARIZONA_AIF_RX_BCLK_RATE,
1377 					 ARIZONA_AIF1RX_BCPF_MASK, lrclk);
1378 		regmap_update_bits_async(arizona->regmap,
1379 					 base + ARIZONA_AIF_FRAME_CTRL_1,
1380 					 ARIZONA_AIF1TX_WL_MASK |
1381 					 ARIZONA_AIF1TX_SLOT_LEN_MASK, frame);
1382 		regmap_update_bits(arizona->regmap,
1383 				   base + ARIZONA_AIF_FRAME_CTRL_2,
1384 				   ARIZONA_AIF1RX_WL_MASK |
1385 				   ARIZONA_AIF1RX_SLOT_LEN_MASK, frame);
1386 	}
1387 
1388 restore_aif:
1389 	if (reconfig) {
1390 		/* Restore AIF TX/RX state */
1391 		regmap_update_bits_async(arizona->regmap,
1392 					 base + ARIZONA_AIF_TX_ENABLES,
1393 					 0xff, aif_tx_state);
1394 		regmap_update_bits(arizona->regmap,
1395 				   base + ARIZONA_AIF_RX_ENABLES,
1396 				   0xff, aif_rx_state);
1397 	}
1398 	return ret;
1399 }
1400 
1401 static const char *arizona_dai_clk_str(int clk_id)
1402 {
1403 	switch (clk_id) {
1404 	case ARIZONA_CLK_SYSCLK:
1405 		return "SYSCLK";
1406 	case ARIZONA_CLK_ASYNCCLK:
1407 		return "ASYNCCLK";
1408 	default:
1409 		return "Unknown clock";
1410 	}
1411 }
1412 
1413 static int arizona_dai_set_sysclk(struct snd_soc_dai *dai,
1414 				  int clk_id, unsigned int freq, int dir)
1415 {
1416 	struct snd_soc_codec *codec = dai->codec;
1417 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1418 	struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1419 	struct snd_soc_dapm_route routes[2];
1420 
1421 	switch (clk_id) {
1422 	case ARIZONA_CLK_SYSCLK:
1423 	case ARIZONA_CLK_ASYNCCLK:
1424 		break;
1425 	default:
1426 		return -EINVAL;
1427 	}
1428 
1429 	if (clk_id == dai_priv->clk)
1430 		return 0;
1431 
1432 	if (dai->active) {
1433 		dev_err(codec->dev, "Can't change clock on active DAI %d\n",
1434 			dai->id);
1435 		return -EBUSY;
1436 	}
1437 
1438 	dev_dbg(codec->dev, "Setting AIF%d to %s\n", dai->id + 1,
1439 		arizona_dai_clk_str(clk_id));
1440 
1441 	memset(&routes, 0, sizeof(routes));
1442 	routes[0].sink = dai->driver->capture.stream_name;
1443 	routes[1].sink = dai->driver->playback.stream_name;
1444 
1445 	routes[0].source = arizona_dai_clk_str(dai_priv->clk);
1446 	routes[1].source = arizona_dai_clk_str(dai_priv->clk);
1447 	snd_soc_dapm_del_routes(&codec->dapm, routes, ARRAY_SIZE(routes));
1448 
1449 	routes[0].source = arizona_dai_clk_str(clk_id);
1450 	routes[1].source = arizona_dai_clk_str(clk_id);
1451 	snd_soc_dapm_add_routes(&codec->dapm, routes, ARRAY_SIZE(routes));
1452 
1453 	dai_priv->clk = clk_id;
1454 
1455 	return snd_soc_dapm_sync(&codec->dapm);
1456 }
1457 
1458 static int arizona_set_tristate(struct snd_soc_dai *dai, int tristate)
1459 {
1460 	struct snd_soc_codec *codec = dai->codec;
1461 	int base = dai->driver->base;
1462 	unsigned int reg;
1463 
1464 	if (tristate)
1465 		reg = ARIZONA_AIF1_TRI;
1466 	else
1467 		reg = 0;
1468 
1469 	return snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL,
1470 				   ARIZONA_AIF1_TRI, reg);
1471 }
1472 
1473 static void arizona_set_channels_to_mask(struct snd_soc_dai *dai,
1474 					 unsigned int base,
1475 					 int channels, unsigned int mask)
1476 {
1477 	struct snd_soc_codec *codec = dai->codec;
1478 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1479 	struct arizona *arizona = priv->arizona;
1480 	int slot, i;
1481 
1482 	for (i = 0; i < channels; ++i) {
1483 		slot = ffs(mask) - 1;
1484 		if (slot < 0)
1485 			return;
1486 
1487 		regmap_write(arizona->regmap, base + i, slot);
1488 
1489 		mask &= ~(1 << slot);
1490 	}
1491 
1492 	if (mask)
1493 		arizona_aif_warn(dai, "Too many channels in TDM mask\n");
1494 }
1495 
1496 static int arizona_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
1497 				unsigned int rx_mask, int slots, int slot_width)
1498 {
1499 	struct snd_soc_codec *codec = dai->codec;
1500 	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1501 	struct arizona *arizona = priv->arizona;
1502 	int base = dai->driver->base;
1503 	int rx_max_chan = dai->driver->playback.channels_max;
1504 	int tx_max_chan = dai->driver->capture.channels_max;
1505 
1506 	/* Only support TDM for the physical AIFs */
1507 	if (dai->id > ARIZONA_MAX_AIF)
1508 		return -ENOTSUPP;
1509 
1510 	if (slots == 0) {
1511 		tx_mask = (1 << tx_max_chan) - 1;
1512 		rx_mask = (1 << rx_max_chan) - 1;
1513 	}
1514 
1515 	arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_3,
1516 				     tx_max_chan, tx_mask);
1517 	arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_11,
1518 				     rx_max_chan, rx_mask);
1519 
1520 	arizona->tdm_width[dai->id - 1] = slot_width;
1521 	arizona->tdm_slots[dai->id - 1] = slots;
1522 
1523 	return 0;
1524 }
1525 
1526 const struct snd_soc_dai_ops arizona_dai_ops = {
1527 	.startup = arizona_startup,
1528 	.set_fmt = arizona_set_fmt,
1529 	.set_tdm_slot = arizona_set_tdm_slot,
1530 	.hw_params = arizona_hw_params,
1531 	.set_sysclk = arizona_dai_set_sysclk,
1532 	.set_tristate = arizona_set_tristate,
1533 };
1534 EXPORT_SYMBOL_GPL(arizona_dai_ops);
1535 
1536 const struct snd_soc_dai_ops arizona_simple_dai_ops = {
1537 	.startup = arizona_startup,
1538 	.hw_params = arizona_hw_params_rate,
1539 	.set_sysclk = arizona_dai_set_sysclk,
1540 };
1541 EXPORT_SYMBOL_GPL(arizona_simple_dai_ops);
1542 
1543 int arizona_init_dai(struct arizona_priv *priv, int id)
1544 {
1545 	struct arizona_dai_priv *dai_priv = &priv->dai[id];
1546 
1547 	dai_priv->clk = ARIZONA_CLK_SYSCLK;
1548 
1549 	return 0;
1550 }
1551 EXPORT_SYMBOL_GPL(arizona_init_dai);
1552 
1553 static irqreturn_t arizona_fll_clock_ok(int irq, void *data)
1554 {
1555 	struct arizona_fll *fll = data;
1556 
1557 	arizona_fll_dbg(fll, "clock OK\n");
1558 
1559 	complete(&fll->ok);
1560 
1561 	return IRQ_HANDLED;
1562 }
1563 
1564 static struct {
1565 	unsigned int min;
1566 	unsigned int max;
1567 	u16 fratio;
1568 	int ratio;
1569 } fll_fratios[] = {
1570 	{       0,    64000, 4, 16 },
1571 	{   64000,   128000, 3,  8 },
1572 	{  128000,   256000, 2,  4 },
1573 	{  256000,  1000000, 1,  2 },
1574 	{ 1000000, 13500000, 0,  1 },
1575 };
1576 
1577 static struct {
1578 	unsigned int min;
1579 	unsigned int max;
1580 	u16 gain;
1581 } fll_gains[] = {
1582 	{       0,   256000, 0 },
1583 	{  256000,  1000000, 2 },
1584 	{ 1000000, 13500000, 4 },
1585 };
1586 
1587 struct arizona_fll_cfg {
1588 	int n;
1589 	int theta;
1590 	int lambda;
1591 	int refdiv;
1592 	int outdiv;
1593 	int fratio;
1594 	int gain;
1595 };
1596 
1597 static int arizona_validate_fll(struct arizona_fll *fll,
1598 				unsigned int Fref,
1599 				unsigned int Fout)
1600 {
1601 	unsigned int Fvco_min;
1602 
1603 	if (fll->fout && Fout != fll->fout) {
1604 		arizona_fll_err(fll,
1605 				"Can't change output on active FLL\n");
1606 		return -EINVAL;
1607 	}
1608 
1609 	if (Fref / ARIZONA_FLL_MAX_REFDIV > ARIZONA_FLL_MAX_FREF) {
1610 		arizona_fll_err(fll,
1611 				"Can't scale %dMHz in to <=13.5MHz\n",
1612 				Fref);
1613 		return -EINVAL;
1614 	}
1615 
1616 	Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult;
1617 	if (Fout * ARIZONA_FLL_MAX_OUTDIV < Fvco_min) {
1618 		arizona_fll_err(fll, "No FLL_OUTDIV for Fout=%uHz\n",
1619 				Fout);
1620 		return -EINVAL;
1621 	}
1622 
1623 	return 0;
1624 }
1625 
1626 static int arizona_find_fratio(unsigned int Fref, int *fratio)
1627 {
1628 	int i;
1629 
1630 	/* Find an appropriate FLL_FRATIO */
1631 	for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
1632 		if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
1633 			if (fratio)
1634 				*fratio = fll_fratios[i].fratio;
1635 			return fll_fratios[i].ratio;
1636 		}
1637 	}
1638 
1639 	return -EINVAL;
1640 }
1641 
1642 static int arizona_calc_fratio(struct arizona_fll *fll,
1643 			       struct arizona_fll_cfg *cfg,
1644 			       unsigned int target,
1645 			       unsigned int Fref, bool sync)
1646 {
1647 	int init_ratio, ratio;
1648 	int refdiv, div;
1649 
1650 	/* Fref must be <=13.5MHz, find initial refdiv */
1651 	div = 1;
1652 	cfg->refdiv = 0;
1653 	while (Fref > ARIZONA_FLL_MAX_FREF) {
1654 		div *= 2;
1655 		Fref /= 2;
1656 		cfg->refdiv++;
1657 
1658 		if (div > ARIZONA_FLL_MAX_REFDIV)
1659 			return -EINVAL;
1660 	}
1661 
1662 	/* Find an appropriate FLL_FRATIO */
1663 	init_ratio = arizona_find_fratio(Fref, &cfg->fratio);
1664 	if (init_ratio < 0) {
1665 		arizona_fll_err(fll, "Unable to find FRATIO for Fref=%uHz\n",
1666 				Fref);
1667 		return init_ratio;
1668 	}
1669 
1670 	switch (fll->arizona->type) {
1671 	case WM5110:
1672 		if (fll->arizona->rev < 3 || sync)
1673 			return init_ratio;
1674 		break;
1675 	default:
1676 		return init_ratio;
1677 	}
1678 
1679 	cfg->fratio = init_ratio - 1;
1680 
1681 	/* Adjust FRATIO/refdiv to avoid integer mode if possible */
1682 	refdiv = cfg->refdiv;
1683 
1684 	while (div <= ARIZONA_FLL_MAX_REFDIV) {
1685 		for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
1686 		     ratio++) {
1687 			if ((ARIZONA_FLL_VCO_CORNER / 2) /
1688 			    (fll->vco_mult * ratio) < Fref)
1689 				break;
1690 
1691 			if (target % (ratio * Fref)) {
1692 				cfg->refdiv = refdiv;
1693 				cfg->fratio = ratio - 1;
1694 				return ratio;
1695 			}
1696 		}
1697 
1698 		for (ratio = init_ratio - 1; ratio > 0; ratio--) {
1699 			if (target % (ratio * Fref)) {
1700 				cfg->refdiv = refdiv;
1701 				cfg->fratio = ratio - 1;
1702 				return ratio;
1703 			}
1704 		}
1705 
1706 		div *= 2;
1707 		Fref /= 2;
1708 		refdiv++;
1709 		init_ratio = arizona_find_fratio(Fref, NULL);
1710 	}
1711 
1712 	arizona_fll_warn(fll, "Falling back to integer mode operation\n");
1713 	return cfg->fratio + 1;
1714 }
1715 
1716 static int arizona_calc_fll(struct arizona_fll *fll,
1717 			    struct arizona_fll_cfg *cfg,
1718 			    unsigned int Fref, bool sync)
1719 {
1720 	unsigned int target, div, gcd_fll;
1721 	int i, ratio;
1722 
1723 	arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout);
1724 
1725 	/* Fvco should be over the targt; don't check the upper bound */
1726 	div = ARIZONA_FLL_MIN_OUTDIV;
1727 	while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) {
1728 		div++;
1729 		if (div > ARIZONA_FLL_MAX_OUTDIV)
1730 			return -EINVAL;
1731 	}
1732 	target = fll->fout * div / fll->vco_mult;
1733 	cfg->outdiv = div;
1734 
1735 	arizona_fll_dbg(fll, "Fvco=%dHz\n", target);
1736 
1737 	/* Find an appropriate FLL_FRATIO and refdiv */
1738 	ratio = arizona_calc_fratio(fll, cfg, target, Fref, sync);
1739 	if (ratio < 0)
1740 		return ratio;
1741 
1742 	/* Apply the division for our remaining calculations */
1743 	Fref = Fref / (1 << cfg->refdiv);
1744 
1745 	cfg->n = target / (ratio * Fref);
1746 
1747 	if (target % (ratio * Fref)) {
1748 		gcd_fll = gcd(target, ratio * Fref);
1749 		arizona_fll_dbg(fll, "GCD=%u\n", gcd_fll);
1750 
1751 		cfg->theta = (target - (cfg->n * ratio * Fref))
1752 			/ gcd_fll;
1753 		cfg->lambda = (ratio * Fref) / gcd_fll;
1754 	} else {
1755 		cfg->theta = 0;
1756 		cfg->lambda = 0;
1757 	}
1758 
1759 	/* Round down to 16bit range with cost of accuracy lost.
1760 	 * Denominator must be bigger than numerator so we only
1761 	 * take care of it.
1762 	 */
1763 	while (cfg->lambda >= (1 << 16)) {
1764 		cfg->theta >>= 1;
1765 		cfg->lambda >>= 1;
1766 	}
1767 
1768 	for (i = 0; i < ARRAY_SIZE(fll_gains); i++) {
1769 		if (fll_gains[i].min <= Fref && Fref <= fll_gains[i].max) {
1770 			cfg->gain = fll_gains[i].gain;
1771 			break;
1772 		}
1773 	}
1774 	if (i == ARRAY_SIZE(fll_gains)) {
1775 		arizona_fll_err(fll, "Unable to find gain for Fref=%uHz\n",
1776 				Fref);
1777 		return -EINVAL;
1778 	}
1779 
1780 	arizona_fll_dbg(fll, "N=%x THETA=%x LAMBDA=%x\n",
1781 			cfg->n, cfg->theta, cfg->lambda);
1782 	arizona_fll_dbg(fll, "FRATIO=%x(%d) OUTDIV=%x REFCLK_DIV=%x\n",
1783 			cfg->fratio, cfg->fratio, cfg->outdiv, cfg->refdiv);
1784 	arizona_fll_dbg(fll, "GAIN=%d\n", cfg->gain);
1785 
1786 	return 0;
1787 
1788 }
1789 
1790 static void arizona_apply_fll(struct arizona *arizona, unsigned int base,
1791 			      struct arizona_fll_cfg *cfg, int source,
1792 			      bool sync)
1793 {
1794 	regmap_update_bits_async(arizona->regmap, base + 3,
1795 				 ARIZONA_FLL1_THETA_MASK, cfg->theta);
1796 	regmap_update_bits_async(arizona->regmap, base + 4,
1797 				 ARIZONA_FLL1_LAMBDA_MASK, cfg->lambda);
1798 	regmap_update_bits_async(arizona->regmap, base + 5,
1799 				 ARIZONA_FLL1_FRATIO_MASK,
1800 				 cfg->fratio << ARIZONA_FLL1_FRATIO_SHIFT);
1801 	regmap_update_bits_async(arizona->regmap, base + 6,
1802 				 ARIZONA_FLL1_CLK_REF_DIV_MASK |
1803 				 ARIZONA_FLL1_CLK_REF_SRC_MASK,
1804 				 cfg->refdiv << ARIZONA_FLL1_CLK_REF_DIV_SHIFT |
1805 				 source << ARIZONA_FLL1_CLK_REF_SRC_SHIFT);
1806 
1807 	if (sync) {
1808 		regmap_update_bits(arizona->regmap, base + 0x7,
1809 				   ARIZONA_FLL1_GAIN_MASK,
1810 				   cfg->gain << ARIZONA_FLL1_GAIN_SHIFT);
1811 	} else {
1812 		regmap_update_bits(arizona->regmap, base + 0x5,
1813 				   ARIZONA_FLL1_OUTDIV_MASK,
1814 				   cfg->outdiv << ARIZONA_FLL1_OUTDIV_SHIFT);
1815 		regmap_update_bits(arizona->regmap, base + 0x9,
1816 				   ARIZONA_FLL1_GAIN_MASK,
1817 				   cfg->gain << ARIZONA_FLL1_GAIN_SHIFT);
1818 	}
1819 
1820 	regmap_update_bits_async(arizona->regmap, base + 2,
1821 				 ARIZONA_FLL1_CTRL_UPD | ARIZONA_FLL1_N_MASK,
1822 				 ARIZONA_FLL1_CTRL_UPD | cfg->n);
1823 }
1824 
1825 static int arizona_is_enabled_fll(struct arizona_fll *fll)
1826 {
1827 	struct arizona *arizona = fll->arizona;
1828 	unsigned int reg;
1829 	int ret;
1830 
1831 	ret = regmap_read(arizona->regmap, fll->base + 1, &reg);
1832 	if (ret != 0) {
1833 		arizona_fll_err(fll, "Failed to read current state: %d\n",
1834 				ret);
1835 		return ret;
1836 	}
1837 
1838 	return reg & ARIZONA_FLL1_ENA;
1839 }
1840 
1841 static int arizona_enable_fll(struct arizona_fll *fll)
1842 {
1843 	struct arizona *arizona = fll->arizona;
1844 	int ret;
1845 	bool use_sync = false;
1846 	int already_enabled = arizona_is_enabled_fll(fll);
1847 	struct arizona_fll_cfg cfg;
1848 
1849 	if (already_enabled < 0)
1850 		return already_enabled;
1851 
1852 	if (already_enabled) {
1853 		/* Facilitate smooth refclk across the transition */
1854 		regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
1855 					 ARIZONA_FLL1_GAIN_MASK, 0);
1856 		regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
1857 					 ARIZONA_FLL1_FREERUN,
1858 					 ARIZONA_FLL1_FREERUN);
1859 	}
1860 
1861 	/*
1862 	 * If we have both REFCLK and SYNCCLK then enable both,
1863 	 * otherwise apply the SYNCCLK settings to REFCLK.
1864 	 */
1865 	if (fll->ref_src >= 0 && fll->ref_freq &&
1866 	    fll->ref_src != fll->sync_src) {
1867 		arizona_calc_fll(fll, &cfg, fll->ref_freq, false);
1868 
1869 		arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src,
1870 				  false);
1871 		if (fll->sync_src >= 0) {
1872 			arizona_calc_fll(fll, &cfg, fll->sync_freq, true);
1873 
1874 			arizona_apply_fll(arizona, fll->base + 0x10, &cfg,
1875 					  fll->sync_src, true);
1876 			use_sync = true;
1877 		}
1878 	} else if (fll->sync_src >= 0) {
1879 		arizona_calc_fll(fll, &cfg, fll->sync_freq, false);
1880 
1881 		arizona_apply_fll(arizona, fll->base, &cfg,
1882 				  fll->sync_src, false);
1883 
1884 		regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
1885 					 ARIZONA_FLL1_SYNC_ENA, 0);
1886 	} else {
1887 		arizona_fll_err(fll, "No clocks provided\n");
1888 		return -EINVAL;
1889 	}
1890 
1891 	/*
1892 	 * Increase the bandwidth if we're not using a low frequency
1893 	 * sync source.
1894 	 */
1895 	if (use_sync && fll->sync_freq > 100000)
1896 		regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
1897 					 ARIZONA_FLL1_SYNC_BW, 0);
1898 	else
1899 		regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
1900 					 ARIZONA_FLL1_SYNC_BW,
1901 					 ARIZONA_FLL1_SYNC_BW);
1902 
1903 	if (!already_enabled)
1904 		pm_runtime_get(arizona->dev);
1905 
1906 	/* Clear any pending completions */
1907 	try_wait_for_completion(&fll->ok);
1908 
1909 	regmap_update_bits_async(arizona->regmap, fll->base + 1,
1910 				 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
1911 	if (use_sync)
1912 		regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
1913 					 ARIZONA_FLL1_SYNC_ENA,
1914 					 ARIZONA_FLL1_SYNC_ENA);
1915 
1916 	if (already_enabled)
1917 		regmap_update_bits_async(arizona->regmap, fll->base + 1,
1918 					 ARIZONA_FLL1_FREERUN, 0);
1919 
1920 	ret = wait_for_completion_timeout(&fll->ok,
1921 					  msecs_to_jiffies(250));
1922 	if (ret == 0)
1923 		arizona_fll_warn(fll, "Timed out waiting for lock\n");
1924 
1925 	return 0;
1926 }
1927 
1928 static void arizona_disable_fll(struct arizona_fll *fll)
1929 {
1930 	struct arizona *arizona = fll->arizona;
1931 	bool change;
1932 
1933 	regmap_update_bits_async(arizona->regmap, fll->base + 1,
1934 				 ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
1935 	regmap_update_bits_check(arizona->regmap, fll->base + 1,
1936 				 ARIZONA_FLL1_ENA, 0, &change);
1937 	regmap_update_bits(arizona->regmap, fll->base + 0x11,
1938 			   ARIZONA_FLL1_SYNC_ENA, 0);
1939 	regmap_update_bits_async(arizona->regmap, fll->base + 1,
1940 				 ARIZONA_FLL1_FREERUN, 0);
1941 
1942 	if (change)
1943 		pm_runtime_put_autosuspend(arizona->dev);
1944 }
1945 
1946 int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
1947 			   unsigned int Fref, unsigned int Fout)
1948 {
1949 	int ret = 0;
1950 
1951 	if (fll->ref_src == source && fll->ref_freq == Fref)
1952 		return 0;
1953 
1954 	if (fll->fout && Fref > 0) {
1955 		ret = arizona_validate_fll(fll, Fref, fll->fout);
1956 		if (ret != 0)
1957 			return ret;
1958 	}
1959 
1960 	fll->ref_src = source;
1961 	fll->ref_freq = Fref;
1962 
1963 	if (fll->fout && Fref > 0) {
1964 		ret = arizona_enable_fll(fll);
1965 	}
1966 
1967 	return ret;
1968 }
1969 EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);
1970 
1971 int arizona_set_fll(struct arizona_fll *fll, int source,
1972 		    unsigned int Fref, unsigned int Fout)
1973 {
1974 	int ret = 0;
1975 
1976 	if (fll->sync_src == source &&
1977 	    fll->sync_freq == Fref && fll->fout == Fout)
1978 		return 0;
1979 
1980 	if (Fout) {
1981 		if (fll->ref_src >= 0) {
1982 			ret = arizona_validate_fll(fll, fll->ref_freq, Fout);
1983 			if (ret != 0)
1984 				return ret;
1985 		}
1986 
1987 		ret = arizona_validate_fll(fll, Fref, Fout);
1988 		if (ret != 0)
1989 			return ret;
1990 	}
1991 
1992 	fll->sync_src = source;
1993 	fll->sync_freq = Fref;
1994 	fll->fout = Fout;
1995 
1996 	if (Fout)
1997 		ret = arizona_enable_fll(fll);
1998 	else
1999 		arizona_disable_fll(fll);
2000 
2001 	return ret;
2002 }
2003 EXPORT_SYMBOL_GPL(arizona_set_fll);
2004 
2005 int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
2006 		     int ok_irq, struct arizona_fll *fll)
2007 {
2008 	int ret;
2009 	unsigned int val;
2010 
2011 	init_completion(&fll->ok);
2012 
2013 	fll->id = id;
2014 	fll->base = base;
2015 	fll->arizona = arizona;
2016 	fll->sync_src = ARIZONA_FLL_SRC_NONE;
2017 
2018 	/* Configure default refclk to 32kHz if we have one */
2019 	regmap_read(arizona->regmap, ARIZONA_CLOCK_32K_1, &val);
2020 	switch (val & ARIZONA_CLK_32K_SRC_MASK) {
2021 	case ARIZONA_CLK_SRC_MCLK1:
2022 	case ARIZONA_CLK_SRC_MCLK2:
2023 		fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK;
2024 		break;
2025 	default:
2026 		fll->ref_src = ARIZONA_FLL_SRC_NONE;
2027 	}
2028 	fll->ref_freq = 32768;
2029 
2030 	snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id);
2031 	snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
2032 		 "FLL%d clock OK", id);
2033 
2034 	ret = arizona_request_irq(arizona, ok_irq, fll->clock_ok_name,
2035 				  arizona_fll_clock_ok, fll);
2036 	if (ret != 0) {
2037 		dev_err(arizona->dev, "Failed to get FLL%d clock OK IRQ: %d\n",
2038 			id, ret);
2039 	}
2040 
2041 	regmap_update_bits(arizona->regmap, fll->base + 1,
2042 			   ARIZONA_FLL1_FREERUN, 0);
2043 
2044 	return 0;
2045 }
2046 EXPORT_SYMBOL_GPL(arizona_init_fll);
2047 
2048 /**
2049  * arizona_set_output_mode - Set the mode of the specified output
2050  *
2051  * @codec: Device to configure
2052  * @output: Output number
2053  * @diff: True to set the output to differential mode
2054  *
2055  * Some systems use external analogue switches to connect more
2056  * analogue devices to the CODEC than are supported by the device.  In
2057  * some systems this requires changing the switched output from single
2058  * ended to differential mode dynamically at runtime, an operation
2059  * supported using this function.
2060  *
2061  * Most systems have a single static configuration and should use
2062  * platform data instead.
2063  */
2064 int arizona_set_output_mode(struct snd_soc_codec *codec, int output, bool diff)
2065 {
2066 	unsigned int reg, val;
2067 
2068 	if (output < 1 || output > 6)
2069 		return -EINVAL;
2070 
2071 	reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8;
2072 
2073 	if (diff)
2074 		val = ARIZONA_OUT1_MONO;
2075 	else
2076 		val = 0;
2077 
2078 	return snd_soc_update_bits(codec, reg, ARIZONA_OUT1_MONO, val);
2079 }
2080 EXPORT_SYMBOL_GPL(arizona_set_output_mode);
2081 
2082 MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support");
2083 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2084 MODULE_LICENSE("GPL");
2085