2f2e91ac690f683c6f87347b34d4b9cbe11c8038
[sfrench/cifs-2.6.git] / sound / soc / codecs / arizona.c
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 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
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
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
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
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
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
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
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
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
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
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
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
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_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
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
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         if (tdm_slots) {
1282                 arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
1283                                 tdm_slots, tdm_width);
1284                 bclk_target = tdm_slots * tdm_width * params_rate(params);
1285                 channels = tdm_slots;
1286         } else {
1287                 bclk_target = snd_soc_params_to_bclk(params);
1288         }
1289
1290         if (chan_limit && chan_limit < channels) {
1291                 arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit);
1292                 bclk_target /= channels;
1293                 bclk_target *= chan_limit;
1294         }
1295
1296         /* Force multiple of 2 channels for I2S mode */
1297         val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT);
1298         if ((channels & 1) && (val & ARIZONA_AIF1_FMT_MASK)) {
1299                 arizona_aif_dbg(dai, "Forcing stereo mode\n");
1300                 bclk_target /= channels;
1301                 bclk_target *= channels + 1;
1302         }
1303
1304         for (i = 0; i < ARRAY_SIZE(arizona_44k1_bclk_rates); i++) {
1305                 if (rates[i] >= bclk_target &&
1306                     rates[i] % params_rate(params) == 0) {
1307                         bclk = i;
1308                         break;
1309                 }
1310         }
1311         if (i == ARRAY_SIZE(arizona_44k1_bclk_rates)) {
1312                 arizona_aif_err(dai, "Unsupported sample rate %dHz\n",
1313                                 params_rate(params));
1314                 return -EINVAL;
1315         }
1316
1317         lrclk = rates[bclk] / params_rate(params);
1318
1319         arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n",
1320                         rates[bclk], rates[bclk] / lrclk);
1321
1322         wl = snd_pcm_format_width(params_format(params));
1323         frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl;
1324
1325         reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame);
1326
1327         if (reconfig) {
1328                 /* Save AIF TX/RX state */
1329                 aif_tx_state = snd_soc_read(codec,
1330                                             base + ARIZONA_AIF_TX_ENABLES);
1331                 aif_rx_state = snd_soc_read(codec,
1332                                             base + ARIZONA_AIF_RX_ENABLES);
1333                 /* Disable AIF TX/RX before reconfiguring it */
1334                 regmap_update_bits_async(arizona->regmap,
1335                                     base + ARIZONA_AIF_TX_ENABLES, 0xff, 0x0);
1336                 regmap_update_bits(arizona->regmap,
1337                                     base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0);
1338         }
1339
1340         ret = arizona_hw_params_rate(substream, params, dai);
1341         if (ret != 0)
1342                 goto restore_aif;
1343
1344         if (reconfig) {
1345                 regmap_update_bits_async(arizona->regmap,
1346                                          base + ARIZONA_AIF_BCLK_CTRL,
1347                                          ARIZONA_AIF1_BCLK_FREQ_MASK, bclk);
1348                 regmap_update_bits_async(arizona->regmap,
1349                                          base + ARIZONA_AIF_TX_BCLK_RATE,
1350                                          ARIZONA_AIF1TX_BCPF_MASK, lrclk);
1351                 regmap_update_bits_async(arizona->regmap,
1352                                          base + ARIZONA_AIF_RX_BCLK_RATE,
1353                                          ARIZONA_AIF1RX_BCPF_MASK, lrclk);
1354                 regmap_update_bits_async(arizona->regmap,
1355                                          base + ARIZONA_AIF_FRAME_CTRL_1,
1356                                          ARIZONA_AIF1TX_WL_MASK |
1357                                          ARIZONA_AIF1TX_SLOT_LEN_MASK, frame);
1358                 regmap_update_bits(arizona->regmap,
1359                                    base + ARIZONA_AIF_FRAME_CTRL_2,
1360                                    ARIZONA_AIF1RX_WL_MASK |
1361                                    ARIZONA_AIF1RX_SLOT_LEN_MASK, frame);
1362         }
1363
1364 restore_aif:
1365         if (reconfig) {
1366                 /* Restore AIF TX/RX state */
1367                 regmap_update_bits_async(arizona->regmap,
1368                                          base + ARIZONA_AIF_TX_ENABLES,
1369                                          0xff, aif_tx_state);
1370                 regmap_update_bits(arizona->regmap,
1371                                    base + ARIZONA_AIF_RX_ENABLES,
1372                                    0xff, aif_rx_state);
1373         }
1374         return ret;
1375 }
1376
1377 static const char *arizona_dai_clk_str(int clk_id)
1378 {
1379         switch (clk_id) {
1380         case ARIZONA_CLK_SYSCLK:
1381                 return "SYSCLK";
1382         case ARIZONA_CLK_ASYNCCLK:
1383                 return "ASYNCCLK";
1384         default:
1385                 return "Unknown clock";
1386         }
1387 }
1388
1389 static int arizona_dai_set_sysclk(struct snd_soc_dai *dai,
1390                                   int clk_id, unsigned int freq, int dir)
1391 {
1392         struct snd_soc_codec *codec = dai->codec;
1393         struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1394         struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
1395         struct snd_soc_dapm_route routes[2];
1396
1397         switch (clk_id) {
1398         case ARIZONA_CLK_SYSCLK:
1399         case ARIZONA_CLK_ASYNCCLK:
1400                 break;
1401         default:
1402                 return -EINVAL;
1403         }
1404
1405         if (clk_id == dai_priv->clk)
1406                 return 0;
1407
1408         if (dai->active) {
1409                 dev_err(codec->dev, "Can't change clock on active DAI %d\n",
1410                         dai->id);
1411                 return -EBUSY;
1412         }
1413
1414         dev_dbg(codec->dev, "Setting AIF%d to %s\n", dai->id + 1,
1415                 arizona_dai_clk_str(clk_id));
1416
1417         memset(&routes, 0, sizeof(routes));
1418         routes[0].sink = dai->driver->capture.stream_name;
1419         routes[1].sink = dai->driver->playback.stream_name;
1420
1421         routes[0].source = arizona_dai_clk_str(dai_priv->clk);
1422         routes[1].source = arizona_dai_clk_str(dai_priv->clk);
1423         snd_soc_dapm_del_routes(&codec->dapm, routes, ARRAY_SIZE(routes));
1424
1425         routes[0].source = arizona_dai_clk_str(clk_id);
1426         routes[1].source = arizona_dai_clk_str(clk_id);
1427         snd_soc_dapm_add_routes(&codec->dapm, routes, ARRAY_SIZE(routes));
1428
1429         dai_priv->clk = clk_id;
1430
1431         return snd_soc_dapm_sync(&codec->dapm);
1432 }
1433
1434 static int arizona_set_tristate(struct snd_soc_dai *dai, int tristate)
1435 {
1436         struct snd_soc_codec *codec = dai->codec;
1437         int base = dai->driver->base;
1438         unsigned int reg;
1439
1440         if (tristate)
1441                 reg = ARIZONA_AIF1_TRI;
1442         else
1443                 reg = 0;
1444
1445         return snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL,
1446                                    ARIZONA_AIF1_TRI, reg);
1447 }
1448
1449 static void arizona_set_channels_to_mask(struct snd_soc_dai *dai,
1450                                          unsigned int base,
1451                                          int channels, unsigned int mask)
1452 {
1453         struct snd_soc_codec *codec = dai->codec;
1454         struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1455         struct arizona *arizona = priv->arizona;
1456         int slot, i;
1457
1458         for (i = 0; i < channels; ++i) {
1459                 slot = ffs(mask) - 1;
1460                 if (slot < 0)
1461                         return;
1462
1463                 regmap_write(arizona->regmap, base + i, slot);
1464
1465                 mask &= ~(1 << slot);
1466         }
1467
1468         if (mask)
1469                 arizona_aif_warn(dai, "Too many channels in TDM mask\n");
1470 }
1471
1472 static int arizona_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
1473                                 unsigned int rx_mask, int slots, int slot_width)
1474 {
1475         struct snd_soc_codec *codec = dai->codec;
1476         struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1477         struct arizona *arizona = priv->arizona;
1478         int base = dai->driver->base;
1479         int rx_max_chan = dai->driver->playback.channels_max;
1480         int tx_max_chan = dai->driver->capture.channels_max;
1481
1482         /* Only support TDM for the physical AIFs */
1483         if (dai->id > ARIZONA_MAX_AIF)
1484                 return -ENOTSUPP;
1485
1486         if (slots == 0) {
1487                 tx_mask = (1 << tx_max_chan) - 1;
1488                 rx_mask = (1 << rx_max_chan) - 1;
1489         }
1490
1491         arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_3,
1492                                      tx_max_chan, tx_mask);
1493         arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_11,
1494                                      rx_max_chan, rx_mask);
1495
1496         arizona->tdm_width[dai->id - 1] = slot_width;
1497         arizona->tdm_slots[dai->id - 1] = slots;
1498
1499         return 0;
1500 }
1501
1502 const struct snd_soc_dai_ops arizona_dai_ops = {
1503         .startup = arizona_startup,
1504         .set_fmt = arizona_set_fmt,
1505         .set_tdm_slot = arizona_set_tdm_slot,
1506         .hw_params = arizona_hw_params,
1507         .set_sysclk = arizona_dai_set_sysclk,
1508         .set_tristate = arizona_set_tristate,
1509 };
1510 EXPORT_SYMBOL_GPL(arizona_dai_ops);
1511
1512 const struct snd_soc_dai_ops arizona_simple_dai_ops = {
1513         .startup = arizona_startup,
1514         .hw_params = arizona_hw_params_rate,
1515         .set_sysclk = arizona_dai_set_sysclk,
1516 };
1517 EXPORT_SYMBOL_GPL(arizona_simple_dai_ops);
1518
1519 int arizona_init_dai(struct arizona_priv *priv, int id)
1520 {
1521         struct arizona_dai_priv *dai_priv = &priv->dai[id];
1522
1523         dai_priv->clk = ARIZONA_CLK_SYSCLK;
1524
1525         return 0;
1526 }
1527 EXPORT_SYMBOL_GPL(arizona_init_dai);
1528
1529 static irqreturn_t arizona_fll_clock_ok(int irq, void *data)
1530 {
1531         struct arizona_fll *fll = data;
1532
1533         arizona_fll_dbg(fll, "clock OK\n");
1534
1535         complete(&fll->ok);
1536
1537         return IRQ_HANDLED;
1538 }
1539
1540 static struct {
1541         unsigned int min;
1542         unsigned int max;
1543         u16 fratio;
1544         int ratio;
1545 } fll_fratios[] = {
1546         {       0,    64000, 4, 16 },
1547         {   64000,   128000, 3,  8 },
1548         {  128000,   256000, 2,  4 },
1549         {  256000,  1000000, 1,  2 },
1550         { 1000000, 13500000, 0,  1 },
1551 };
1552
1553 static struct {
1554         unsigned int min;
1555         unsigned int max;
1556         u16 gain;
1557 } fll_gains[] = {
1558         {       0,   256000, 0 },
1559         {  256000,  1000000, 2 },
1560         { 1000000, 13500000, 4 },
1561 };
1562
1563 struct arizona_fll_cfg {
1564         int n;
1565         int theta;
1566         int lambda;
1567         int refdiv;
1568         int outdiv;
1569         int fratio;
1570         int gain;
1571 };
1572
1573 static int arizona_validate_fll(struct arizona_fll *fll,
1574                                 unsigned int Fref,
1575                                 unsigned int Fout)
1576 {
1577         unsigned int Fvco_min;
1578
1579         if (fll->fout && Fout != fll->fout) {
1580                 arizona_fll_err(fll,
1581                                 "Can't change output on active FLL\n");
1582                 return -EINVAL;
1583         }
1584
1585         if (Fref / ARIZONA_FLL_MAX_REFDIV > ARIZONA_FLL_MAX_FREF) {
1586                 arizona_fll_err(fll,
1587                                 "Can't scale %dMHz in to <=13.5MHz\n",
1588                                 Fref);
1589                 return -EINVAL;
1590         }
1591
1592         Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult;
1593         if (Fout * ARIZONA_FLL_MAX_OUTDIV < Fvco_min) {
1594                 arizona_fll_err(fll, "No FLL_OUTDIV for Fout=%uHz\n",
1595                                 Fout);
1596                 return -EINVAL;
1597         }
1598
1599         return 0;
1600 }
1601
1602 static int arizona_find_fratio(unsigned int Fref, int *fratio)
1603 {
1604         int i;
1605
1606         /* Find an appropriate FLL_FRATIO */
1607         for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
1608                 if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
1609                         if (fratio)
1610                                 *fratio = fll_fratios[i].fratio;
1611                         return fll_fratios[i].ratio;
1612                 }
1613         }
1614
1615         return -EINVAL;
1616 }
1617
1618 static int arizona_calc_fratio(struct arizona_fll *fll,
1619                                struct arizona_fll_cfg *cfg,
1620                                unsigned int target,
1621                                unsigned int Fref, bool sync)
1622 {
1623         int init_ratio, ratio;
1624         int refdiv, div;
1625
1626         /* Fref must be <=13.5MHz, find initial refdiv */
1627         div = 1;
1628         cfg->refdiv = 0;
1629         while (Fref > ARIZONA_FLL_MAX_FREF) {
1630                 div *= 2;
1631                 Fref /= 2;
1632                 cfg->refdiv++;
1633
1634                 if (div > ARIZONA_FLL_MAX_REFDIV)
1635                         return -EINVAL;
1636         }
1637
1638         /* Find an appropriate FLL_FRATIO */
1639         init_ratio = arizona_find_fratio(Fref, &cfg->fratio);
1640         if (init_ratio < 0) {
1641                 arizona_fll_err(fll, "Unable to find FRATIO for Fref=%uHz\n",
1642                                 Fref);
1643                 return init_ratio;
1644         }
1645
1646         switch (fll->arizona->type) {
1647         case WM5110:
1648                 if (fll->arizona->rev < 3 || sync)
1649                         return init_ratio;
1650                 break;
1651         default:
1652                 return init_ratio;
1653         }
1654
1655         cfg->fratio = init_ratio - 1;
1656
1657         /* Adjust FRATIO/refdiv to avoid integer mode if possible */
1658         refdiv = cfg->refdiv;
1659
1660         while (div <= ARIZONA_FLL_MAX_REFDIV) {
1661                 for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
1662                      ratio++) {
1663                         if ((ARIZONA_FLL_VCO_CORNER / 2) /
1664                             (fll->vco_mult * ratio) < Fref)
1665                                 break;
1666
1667                         if (target % (ratio * Fref)) {
1668                                 cfg->refdiv = refdiv;
1669                                 cfg->fratio = ratio - 1;
1670                                 return ratio;
1671                         }
1672                 }
1673
1674                 for (ratio = init_ratio - 1; ratio > 0; ratio--) {
1675                         if (target % (ratio * Fref)) {
1676                                 cfg->refdiv = refdiv;
1677                                 cfg->fratio = ratio - 1;
1678                                 return ratio;
1679                         }
1680                 }
1681
1682                 div *= 2;
1683                 Fref /= 2;
1684                 refdiv++;
1685                 init_ratio = arizona_find_fratio(Fref, NULL);
1686         }
1687
1688         arizona_fll_warn(fll, "Falling back to integer mode operation\n");
1689         return cfg->fratio + 1;
1690 }
1691
1692 static int arizona_calc_fll(struct arizona_fll *fll,
1693                             struct arizona_fll_cfg *cfg,
1694                             unsigned int Fref, bool sync)
1695 {
1696         unsigned int target, div, gcd_fll;
1697         int i, ratio;
1698
1699         arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout);
1700
1701         /* Fvco should be over the targt; don't check the upper bound */
1702         div = ARIZONA_FLL_MIN_OUTDIV;
1703         while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) {
1704                 div++;
1705                 if (div > ARIZONA_FLL_MAX_OUTDIV)
1706                         return -EINVAL;
1707         }
1708         target = fll->fout * div / fll->vco_mult;
1709         cfg->outdiv = div;
1710
1711         arizona_fll_dbg(fll, "Fvco=%dHz\n", target);
1712
1713         /* Find an appropriate FLL_FRATIO and refdiv */
1714         ratio = arizona_calc_fratio(fll, cfg, target, Fref, sync);
1715         if (ratio < 0)
1716                 return ratio;
1717
1718         /* Apply the division for our remaining calculations */
1719         Fref = Fref / (1 << cfg->refdiv);
1720
1721         cfg->n = target / (ratio * Fref);
1722
1723         if (target % (ratio * Fref)) {
1724                 gcd_fll = gcd(target, ratio * Fref);
1725                 arizona_fll_dbg(fll, "GCD=%u\n", gcd_fll);
1726
1727                 cfg->theta = (target - (cfg->n * ratio * Fref))
1728                         / gcd_fll;
1729                 cfg->lambda = (ratio * Fref) / gcd_fll;
1730         } else {
1731                 cfg->theta = 0;
1732                 cfg->lambda = 0;
1733         }
1734
1735         /* Round down to 16bit range with cost of accuracy lost.
1736          * Denominator must be bigger than numerator so we only
1737          * take care of it.
1738          */
1739         while (cfg->lambda >= (1 << 16)) {
1740                 cfg->theta >>= 1;
1741                 cfg->lambda >>= 1;
1742         }
1743
1744         for (i = 0; i < ARRAY_SIZE(fll_gains); i++) {
1745                 if (fll_gains[i].min <= Fref && Fref <= fll_gains[i].max) {
1746                         cfg->gain = fll_gains[i].gain;
1747                         break;
1748                 }
1749         }
1750         if (i == ARRAY_SIZE(fll_gains)) {
1751                 arizona_fll_err(fll, "Unable to find gain for Fref=%uHz\n",
1752                                 Fref);
1753                 return -EINVAL;
1754         }
1755
1756         arizona_fll_dbg(fll, "N=%x THETA=%x LAMBDA=%x\n",
1757                         cfg->n, cfg->theta, cfg->lambda);
1758         arizona_fll_dbg(fll, "FRATIO=%x(%d) OUTDIV=%x REFCLK_DIV=%x\n",
1759                         cfg->fratio, cfg->fratio, cfg->outdiv, cfg->refdiv);
1760         arizona_fll_dbg(fll, "GAIN=%d\n", cfg->gain);
1761
1762         return 0;
1763
1764 }
1765
1766 static void arizona_apply_fll(struct arizona *arizona, unsigned int base,
1767                               struct arizona_fll_cfg *cfg, int source,
1768                               bool sync)
1769 {
1770         regmap_update_bits_async(arizona->regmap, base + 3,
1771                                  ARIZONA_FLL1_THETA_MASK, cfg->theta);
1772         regmap_update_bits_async(arizona->regmap, base + 4,
1773                                  ARIZONA_FLL1_LAMBDA_MASK, cfg->lambda);
1774         regmap_update_bits_async(arizona->regmap, base + 5,
1775                                  ARIZONA_FLL1_FRATIO_MASK,
1776                                  cfg->fratio << ARIZONA_FLL1_FRATIO_SHIFT);
1777         regmap_update_bits_async(arizona->regmap, base + 6,
1778                                  ARIZONA_FLL1_CLK_REF_DIV_MASK |
1779                                  ARIZONA_FLL1_CLK_REF_SRC_MASK,
1780                                  cfg->refdiv << ARIZONA_FLL1_CLK_REF_DIV_SHIFT |
1781                                  source << ARIZONA_FLL1_CLK_REF_SRC_SHIFT);
1782
1783         if (sync) {
1784                 regmap_update_bits(arizona->regmap, base + 0x7,
1785                                    ARIZONA_FLL1_GAIN_MASK,
1786                                    cfg->gain << ARIZONA_FLL1_GAIN_SHIFT);
1787         } else {
1788                 regmap_update_bits(arizona->regmap, base + 0x5,
1789                                    ARIZONA_FLL1_OUTDIV_MASK,
1790                                    cfg->outdiv << ARIZONA_FLL1_OUTDIV_SHIFT);
1791                 regmap_update_bits(arizona->regmap, base + 0x9,
1792                                    ARIZONA_FLL1_GAIN_MASK,
1793                                    cfg->gain << ARIZONA_FLL1_GAIN_SHIFT);
1794         }
1795
1796         regmap_update_bits_async(arizona->regmap, base + 2,
1797                                  ARIZONA_FLL1_CTRL_UPD | ARIZONA_FLL1_N_MASK,
1798                                  ARIZONA_FLL1_CTRL_UPD | cfg->n);
1799 }
1800
1801 static int arizona_is_enabled_fll(struct arizona_fll *fll)
1802 {
1803         struct arizona *arizona = fll->arizona;
1804         unsigned int reg;
1805         int ret;
1806
1807         ret = regmap_read(arizona->regmap, fll->base + 1, &reg);
1808         if (ret != 0) {
1809                 arizona_fll_err(fll, "Failed to read current state: %d\n",
1810                                 ret);
1811                 return ret;
1812         }
1813
1814         return reg & ARIZONA_FLL1_ENA;
1815 }
1816
1817 static int arizona_enable_fll(struct arizona_fll *fll)
1818 {
1819         struct arizona *arizona = fll->arizona;
1820         int ret;
1821         bool use_sync = false;
1822         int already_enabled = arizona_is_enabled_fll(fll);
1823         struct arizona_fll_cfg cfg;
1824
1825         if (already_enabled < 0)
1826                 return already_enabled;
1827
1828         if (already_enabled) {
1829                 /* Facilitate smooth refclk across the transition */
1830                 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
1831                                          ARIZONA_FLL1_GAIN_MASK, 0);
1832                 regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
1833                                          ARIZONA_FLL1_FREERUN,
1834                                          ARIZONA_FLL1_FREERUN);
1835         }
1836
1837         /*
1838          * If we have both REFCLK and SYNCCLK then enable both,
1839          * otherwise apply the SYNCCLK settings to REFCLK.
1840          */
1841         if (fll->ref_src >= 0 && fll->ref_freq &&
1842             fll->ref_src != fll->sync_src) {
1843                 arizona_calc_fll(fll, &cfg, fll->ref_freq, false);
1844
1845                 arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src,
1846                                   false);
1847                 if (fll->sync_src >= 0) {
1848                         arizona_calc_fll(fll, &cfg, fll->sync_freq, true);
1849
1850                         arizona_apply_fll(arizona, fll->base + 0x10, &cfg,
1851                                           fll->sync_src, true);
1852                         use_sync = true;
1853                 }
1854         } else if (fll->sync_src >= 0) {
1855                 arizona_calc_fll(fll, &cfg, fll->sync_freq, false);
1856
1857                 arizona_apply_fll(arizona, fll->base, &cfg,
1858                                   fll->sync_src, false);
1859
1860                 regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
1861                                          ARIZONA_FLL1_SYNC_ENA, 0);
1862         } else {
1863                 arizona_fll_err(fll, "No clocks provided\n");
1864                 return -EINVAL;
1865         }
1866
1867         /*
1868          * Increase the bandwidth if we're not using a low frequency
1869          * sync source.
1870          */
1871         if (use_sync && fll->sync_freq > 100000)
1872                 regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
1873                                          ARIZONA_FLL1_SYNC_BW, 0);
1874         else
1875                 regmap_update_bits_async(arizona->regmap, fll->base + 0x17,
1876                                          ARIZONA_FLL1_SYNC_BW,
1877                                          ARIZONA_FLL1_SYNC_BW);
1878
1879         if (!already_enabled)
1880                 pm_runtime_get(arizona->dev);
1881
1882         /* Clear any pending completions */
1883         try_wait_for_completion(&fll->ok);
1884
1885         regmap_update_bits_async(arizona->regmap, fll->base + 1,
1886                                  ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
1887         if (use_sync)
1888                 regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
1889                                          ARIZONA_FLL1_SYNC_ENA,
1890                                          ARIZONA_FLL1_SYNC_ENA);
1891
1892         if (already_enabled)
1893                 regmap_update_bits_async(arizona->regmap, fll->base + 1,
1894                                          ARIZONA_FLL1_FREERUN, 0);
1895
1896         ret = wait_for_completion_timeout(&fll->ok,
1897                                           msecs_to_jiffies(250));
1898         if (ret == 0)
1899                 arizona_fll_warn(fll, "Timed out waiting for lock\n");
1900
1901         return 0;
1902 }
1903
1904 static void arizona_disable_fll(struct arizona_fll *fll)
1905 {
1906         struct arizona *arizona = fll->arizona;
1907         bool change;
1908
1909         regmap_update_bits_async(arizona->regmap, fll->base + 1,
1910                                  ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
1911         regmap_update_bits_check(arizona->regmap, fll->base + 1,
1912                                  ARIZONA_FLL1_ENA, 0, &change);
1913         regmap_update_bits(arizona->regmap, fll->base + 0x11,
1914                            ARIZONA_FLL1_SYNC_ENA, 0);
1915         regmap_update_bits_async(arizona->regmap, fll->base + 1,
1916                                  ARIZONA_FLL1_FREERUN, 0);
1917
1918         if (change)
1919                 pm_runtime_put_autosuspend(arizona->dev);
1920 }
1921
1922 int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
1923                            unsigned int Fref, unsigned int Fout)
1924 {
1925         int ret = 0;
1926
1927         if (fll->ref_src == source && fll->ref_freq == Fref)
1928                 return 0;
1929
1930         if (fll->fout && Fref > 0) {
1931                 ret = arizona_validate_fll(fll, Fref, fll->fout);
1932                 if (ret != 0)
1933                         return ret;
1934         }
1935
1936         fll->ref_src = source;
1937         fll->ref_freq = Fref;
1938
1939         if (fll->fout && Fref > 0) {
1940                 ret = arizona_enable_fll(fll);
1941         }
1942
1943         return ret;
1944 }
1945 EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);
1946
1947 int arizona_set_fll(struct arizona_fll *fll, int source,
1948                     unsigned int Fref, unsigned int Fout)
1949 {
1950         int ret = 0;
1951
1952         if (fll->sync_src == source &&
1953             fll->sync_freq == Fref && fll->fout == Fout)
1954                 return 0;
1955
1956         if (Fout) {
1957                 if (fll->ref_src >= 0) {
1958                         ret = arizona_validate_fll(fll, fll->ref_freq, Fout);
1959                         if (ret != 0)
1960                                 return ret;
1961                 }
1962
1963                 ret = arizona_validate_fll(fll, Fref, Fout);
1964                 if (ret != 0)
1965                         return ret;
1966         }
1967
1968         fll->sync_src = source;
1969         fll->sync_freq = Fref;
1970         fll->fout = Fout;
1971
1972         if (Fout)
1973                 ret = arizona_enable_fll(fll);
1974         else
1975                 arizona_disable_fll(fll);
1976
1977         return ret;
1978 }
1979 EXPORT_SYMBOL_GPL(arizona_set_fll);
1980
1981 int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
1982                      int ok_irq, struct arizona_fll *fll)
1983 {
1984         int ret;
1985         unsigned int val;
1986
1987         init_completion(&fll->ok);
1988
1989         fll->id = id;
1990         fll->base = base;
1991         fll->arizona = arizona;
1992         fll->sync_src = ARIZONA_FLL_SRC_NONE;
1993
1994         /* Configure default refclk to 32kHz if we have one */
1995         regmap_read(arizona->regmap, ARIZONA_CLOCK_32K_1, &val);
1996         switch (val & ARIZONA_CLK_32K_SRC_MASK) {
1997         case ARIZONA_CLK_SRC_MCLK1:
1998         case ARIZONA_CLK_SRC_MCLK2:
1999                 fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK;
2000                 break;
2001         default:
2002                 fll->ref_src = ARIZONA_FLL_SRC_NONE;
2003         }
2004         fll->ref_freq = 32768;
2005
2006         snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id);
2007         snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
2008                  "FLL%d clock OK", id);
2009
2010         ret = arizona_request_irq(arizona, ok_irq, fll->clock_ok_name,
2011                                   arizona_fll_clock_ok, fll);
2012         if (ret != 0) {
2013                 dev_err(arizona->dev, "Failed to get FLL%d clock OK IRQ: %d\n",
2014                         id, ret);
2015         }
2016
2017         regmap_update_bits(arizona->regmap, fll->base + 1,
2018                            ARIZONA_FLL1_FREERUN, 0);
2019
2020         return 0;
2021 }
2022 EXPORT_SYMBOL_GPL(arizona_init_fll);
2023
2024 /**
2025  * arizona_set_output_mode - Set the mode of the specified output
2026  *
2027  * @codec: Device to configure
2028  * @output: Output number
2029  * @diff: True to set the output to differential mode
2030  *
2031  * Some systems use external analogue switches to connect more
2032  * analogue devices to the CODEC than are supported by the device.  In
2033  * some systems this requires changing the switched output from single
2034  * ended to differential mode dynamically at runtime, an operation
2035  * supported using this function.
2036  *
2037  * Most systems have a single static configuration and should use
2038  * platform data instead.
2039  */
2040 int arizona_set_output_mode(struct snd_soc_codec *codec, int output, bool diff)
2041 {
2042         unsigned int reg, val;
2043
2044         if (output < 1 || output > 6)
2045                 return -EINVAL;
2046
2047         reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8;
2048
2049         if (diff)
2050                 val = ARIZONA_OUT1_MONO;
2051         else
2052                 val = 0;
2053
2054         return snd_soc_update_bits(codec, reg, ARIZONA_OUT1_MONO, val);
2055 }
2056 EXPORT_SYMBOL_GPL(arizona_set_output_mode);
2057
2058 MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support");
2059 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2060 MODULE_LICENSE("GPL");