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