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