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