Merge branch 'master' of git://git.denx.de/u-boot-spi
[oweals/u-boot.git] / drivers / sound / wm8994.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2012 Samsung Electronics
4  * R. Chandrasekar <rcsekar@samsung.com>
5  */
6 #include <common.h>
7 #include <asm/arch/clk.h>
8 #include <asm/arch/cpu.h>
9 #include <asm/gpio.h>
10 #include <asm/io.h>
11 #include <div64.h>
12 #include <fdtdec.h>
13 #include <i2c.h>
14 #include <i2s.h>
15 #include <sound.h>
16 #include <asm/arch/sound.h>
17 #include "wm8994.h"
18 #include "wm8994_registers.h"
19
20 /* defines for wm8994 system clock selection */
21 #define SEL_MCLK1       0x00
22 #define SEL_MCLK2       0x08
23 #define SEL_FLL1        0x10
24 #define SEL_FLL2        0x18
25
26 /* fll config to configure fll */
27 struct wm8994_fll_config {
28         int src;        /* Source */
29         int in;         /* Input frequency in Hz */
30         int out;        /* output frequency in Hz */
31 };
32
33 /* codec private data */
34 struct wm8994_priv {
35         enum wm8994_type type;          /* codec type of wolfson */
36         int revision;                   /* Revision */
37         int sysclk[WM8994_MAX_AIF];     /* System clock frequency in Hz  */
38         int mclk[WM8994_MAX_AIF];       /* master clock frequency in Hz */
39         int aifclk[WM8994_MAX_AIF];     /* audio interface clock in Hz   */
40         struct wm8994_fll_config fll[2]; /* fll config to configure fll */
41 };
42
43 /* wm 8994 supported sampling rate values */
44 static unsigned int src_rate[] = {
45                          8000, 11025, 12000, 16000, 22050, 24000,
46                          32000, 44100, 48000, 88200, 96000
47 };
48
49 /* op clock divisions */
50 static int opclk_divs[] = { 10, 20, 30, 40, 55, 60, 80, 120, 160 };
51
52 /* lr clock frame size ratio */
53 static int fs_ratios[] = {
54         64, 128, 192, 256, 348, 512, 768, 1024, 1408, 1536
55 };
56
57 /* bit clock divisors */
58 static int bclk_divs[] = {
59         10, 15, 20, 30, 40, 50, 60, 80, 110, 120, 160, 220, 240, 320, 440, 480,
60         640, 880, 960, 1280, 1760, 1920
61 };
62
63 static struct wm8994_priv g_wm8994_info;
64 static unsigned char g_wm8994_i2c_dev_addr;
65 static struct sound_codec_info g_codec_info;
66
67 /*
68  * Initialise I2C for wm 8994
69  *
70  * @param bus no        i2c bus number in which wm8994 is connected
71  */
72 static void wm8994_i2c_init(int bus_no)
73 {
74         i2c_set_bus_num(bus_no);
75 }
76
77 /*
78  * Writes value to a device register through i2c
79  *
80  * @param reg   reg number to be write
81  * @param data  data to be writen to the above registor
82  *
83  * @return      int value 1 for change, 0 for no change or negative error code.
84  */
85 static int wm8994_i2c_write(unsigned int reg, unsigned short data)
86 {
87         unsigned char val[2];
88
89         val[0] = (unsigned char)((data >> 8) & 0xff);
90         val[1] = (unsigned char)(data & 0xff);
91         debug("Write Addr : 0x%04X, Data :  0x%04X\n", reg, data);
92
93         return i2c_write(g_wm8994_i2c_dev_addr, reg, 2, val, 2);
94 }
95
96 /*
97  * Read a value from a device register through i2c
98  *
99  * @param reg   reg number to be read
100  * @param data  address of read data to be stored
101  *
102  * @return      int value 0 for success, -1 in case of error.
103  */
104 static unsigned int  wm8994_i2c_read(unsigned int reg , unsigned short *data)
105 {
106         unsigned char val[2];
107         int ret;
108
109         ret = i2c_read(g_wm8994_i2c_dev_addr, reg, 2, val, 2);
110         if (ret != 0) {
111                 debug("%s: Error while reading register %#04x\n",
112                       __func__, reg);
113                 return -1;
114         }
115
116         *data = val[0];
117         *data <<= 8;
118         *data |= val[1];
119
120         return 0;
121 }
122
123 /*
124  * update device register bits through i2c
125  *
126  * @param reg   codec register
127  * @param mask  register mask
128  * @param value new value
129  *
130  * @return int value 1 if change in the register value,
131  * 0 for no change or negative error code.
132  */
133 static int wm8994_update_bits(unsigned int reg, unsigned short mask,
134                                                 unsigned short value)
135 {
136         int change , ret = 0;
137         unsigned short old, new;
138
139         if (wm8994_i2c_read(reg, &old) != 0)
140                 return -1;
141         new = (old & ~mask) | (value & mask);
142         change  = (old != new) ? 1 : 0;
143         if (change)
144                 ret = wm8994_i2c_write(reg, new);
145         if (ret < 0)
146                 return ret;
147
148         return change;
149 }
150
151 /*
152  * Sets i2s set format
153  *
154  * @param aif_id        Interface ID
155  * @param fmt           i2S format
156  *
157  * @return -1 for error and 0  Success.
158  */
159 int wm8994_set_fmt(int aif_id, unsigned int fmt)
160 {
161         int ms_reg;
162         int aif_reg;
163         int ms = 0;
164         int aif = 0;
165         int aif_clk = 0;
166         int error = 0;
167
168         switch (aif_id) {
169         case 1:
170                 ms_reg = WM8994_AIF1_MASTER_SLAVE;
171                 aif_reg = WM8994_AIF1_CONTROL_1;
172                 aif_clk = WM8994_AIF1_CLOCKING_1;
173                 break;
174         case 2:
175                 ms_reg = WM8994_AIF2_MASTER_SLAVE;
176                 aif_reg = WM8994_AIF2_CONTROL_1;
177                 aif_clk = WM8994_AIF2_CLOCKING_1;
178                 break;
179         default:
180                 debug("%s: Invalid audio interface selection\n", __func__);
181                 return -1;
182         }
183
184         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
185         case SND_SOC_DAIFMT_CBS_CFS:
186                 break;
187         case SND_SOC_DAIFMT_CBM_CFM:
188                 ms = WM8994_AIF1_MSTR;
189                 break;
190         default:
191                 debug("%s: Invalid i2s master selection\n", __func__);
192                 return -1;
193         }
194
195         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
196         case SND_SOC_DAIFMT_DSP_B:
197                 aif |= WM8994_AIF1_LRCLK_INV;
198         case SND_SOC_DAIFMT_DSP_A:
199                 aif |= 0x18;
200                 break;
201         case SND_SOC_DAIFMT_I2S:
202                 aif |= 0x10;
203                 break;
204         case SND_SOC_DAIFMT_RIGHT_J:
205                 break;
206         case SND_SOC_DAIFMT_LEFT_J:
207                 aif |= 0x8;
208                 break;
209         default:
210                 debug("%s: Invalid i2s format selection\n", __func__);
211                 return -1;
212         }
213
214         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
215         case SND_SOC_DAIFMT_DSP_A:
216         case SND_SOC_DAIFMT_DSP_B:
217                 /* frame inversion not valid for DSP modes */
218                 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
219                 case SND_SOC_DAIFMT_NB_NF:
220                         break;
221                 case SND_SOC_DAIFMT_IB_NF:
222                         aif |= WM8994_AIF1_BCLK_INV;
223                         break;
224                 default:
225                         debug("%s: Invalid i2s frame inverse selection\n",
226                               __func__);
227                         return -1;
228                 }
229                 break;
230
231         case SND_SOC_DAIFMT_I2S:
232         case SND_SOC_DAIFMT_RIGHT_J:
233         case SND_SOC_DAIFMT_LEFT_J:
234                 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
235                 case SND_SOC_DAIFMT_NB_NF:
236                         break;
237                 case SND_SOC_DAIFMT_IB_IF:
238                         aif |= WM8994_AIF1_BCLK_INV | WM8994_AIF1_LRCLK_INV;
239                         break;
240                 case SND_SOC_DAIFMT_IB_NF:
241                         aif |= WM8994_AIF1_BCLK_INV;
242                         break;
243                 case SND_SOC_DAIFMT_NB_IF:
244                         aif |= WM8994_AIF1_LRCLK_INV;
245                         break;
246                 default:
247                         debug("%s: Invalid i2s clock polarity selection\n",
248                               __func__);
249                         return -1;
250                 }
251                 break;
252         default:
253                 debug("%s: Invalid i2s format selection\n", __func__);
254                 return -1;
255         }
256
257         error = wm8994_update_bits(aif_reg, WM8994_AIF1_BCLK_INV |
258                         WM8994_AIF1_LRCLK_INV_MASK | WM8994_AIF1_FMT_MASK, aif);
259
260         error |= wm8994_update_bits(ms_reg, WM8994_AIF1_MSTR_MASK, ms);
261         error |= wm8994_update_bits(aif_clk, WM8994_AIF1CLK_ENA_MASK,
262                                                 WM8994_AIF1CLK_ENA);
263         if (error < 0) {
264                 debug("%s: codec register access error\n", __func__);
265                 return -1;
266         }
267
268         return 0;
269 }
270
271 /*
272  * Sets hw params FOR WM8994
273  *
274  * @param wm8994                wm8994 information pointer
275  * @param aif_id                Audio interface ID
276  * @param sampling_rate         Sampling rate
277  * @param bits_per_sample       Bits per sample
278  * @param Channels              Channels in the given audio input
279  *
280  * @return -1 for error  and 0  Success.
281  */
282 static int wm8994_hw_params(struct wm8994_priv *wm8994, int aif_id,
283                 unsigned int sampling_rate, unsigned int bits_per_sample,
284                 unsigned int channels)
285 {
286         int aif1_reg;
287         int aif2_reg;
288         int bclk_reg;
289         int bclk = 0;
290         int rate_reg;
291         int aif1 = 0;
292         int aif2 = 0;
293         int rate_val = 0;
294         int id = aif_id - 1;
295         int i, cur_val, best_val, bclk_rate, best;
296         unsigned short reg_data;
297         int ret = 0;
298
299         switch (aif_id) {
300         case 1:
301                 aif1_reg = WM8994_AIF1_CONTROL_1;
302                 aif2_reg = WM8994_AIF1_CONTROL_2;
303                 bclk_reg = WM8994_AIF1_BCLK;
304                 rate_reg = WM8994_AIF1_RATE;
305                 break;
306         case 2:
307                 aif1_reg = WM8994_AIF2_CONTROL_1;
308                 aif2_reg = WM8994_AIF2_CONTROL_2;
309                 bclk_reg = WM8994_AIF2_BCLK;
310                 rate_reg = WM8994_AIF2_RATE;
311                 break;
312         default:
313                 return -1;
314         }
315
316         bclk_rate = sampling_rate * 32;
317         switch (bits_per_sample) {
318         case 16:
319                 bclk_rate *= 16;
320                 break;
321         case 20:
322                 bclk_rate *= 20;
323                 aif1 |= 0x20;
324                 break;
325         case 24:
326                 bclk_rate *= 24;
327                 aif1 |= 0x40;
328                 break;
329         case 32:
330                 bclk_rate *= 32;
331                 aif1 |= 0x60;
332                 break;
333         default:
334                 return -1;
335         }
336
337         /* Try to find an appropriate sample rate; look for an exact match. */
338         for (i = 0; i < ARRAY_SIZE(src_rate); i++)
339                 if (src_rate[i] == sampling_rate)
340                         break;
341
342         if (i == ARRAY_SIZE(src_rate)) {
343                 debug("%s: Could not get the best matching samplingrate\n",
344                       __func__);
345                 return -1;
346         }
347
348         rate_val |= i << WM8994_AIF1_SR_SHIFT;
349
350         /* AIFCLK/fs ratio; look for a close match in either direction */
351         best = 0;
352         best_val = abs((fs_ratios[0] * sampling_rate)
353                                                 - wm8994->aifclk[id]);
354
355         for (i = 1; i < ARRAY_SIZE(fs_ratios); i++) {
356                 cur_val = abs((fs_ratios[i] * sampling_rate)
357                                         - wm8994->aifclk[id]);
358                 if (cur_val >= best_val)
359                         continue;
360                 best = i;
361                 best_val = cur_val;
362         }
363
364         rate_val |= best;
365
366         /*
367          * We may not get quite the right frequency if using
368          * approximate clocks so look for the closest match that is
369          * higher than the target (we need to ensure that there enough
370          * BCLKs to clock out the samples).
371          */
372         best = 0;
373         for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) {
374                 cur_val = (wm8994->aifclk[id] * 10 / bclk_divs[i]) - bclk_rate;
375                 if (cur_val < 0) /* BCLK table is sorted */
376                         break;
377                 best = i;
378         }
379
380         if (i ==  ARRAY_SIZE(bclk_divs)) {
381                 debug("%s: Could not get the best matching bclk division\n",
382                       __func__);
383                 return -1;
384         }
385
386         bclk_rate = wm8994->aifclk[id] * 10 / bclk_divs[best];
387         bclk |= best << WM8994_AIF1_BCLK_DIV_SHIFT;
388
389         if (wm8994_i2c_read(aif1_reg, &reg_data) != 0) {
390                 debug("%s: AIF1 register read Failed\n", __func__);
391                 return -1;
392         }
393
394         if ((channels == 1) && ((reg_data & 0x18) == 0x18))
395                 aif2 |= WM8994_AIF1_MONO;
396
397         if (wm8994->aifclk[id] == 0) {
398                 debug("%s:Audio interface clock not set\n", __func__);
399                 return -1;
400         }
401
402         ret = wm8994_update_bits(aif1_reg, WM8994_AIF1_WL_MASK, aif1);
403         ret |= wm8994_update_bits(aif2_reg, WM8994_AIF1_MONO, aif2);
404         ret |= wm8994_update_bits(bclk_reg, WM8994_AIF1_BCLK_DIV_MASK, bclk);
405         ret |= wm8994_update_bits(rate_reg, WM8994_AIF1_SR_MASK |
406                                 WM8994_AIF1CLK_RATE_MASK, rate_val);
407
408         debug("rate vale = %x , bclk val= %x\n", rate_val, bclk);
409
410         if (ret < 0) {
411                 debug("%s: codec register access error\n", __func__);
412                 return -1;
413         }
414
415         return 0;
416 }
417
418 /*
419  * Configures Audio interface Clock
420  *
421  * @param wm8994        wm8994 information pointer
422  * @param aif           Audio Interface ID
423  *
424  * @return -1 for error  and 0  Success.
425  */
426 static int configure_aif_clock(struct wm8994_priv *wm8994, int aif)
427 {
428         int rate;
429         int reg1 = 0;
430         int offset;
431         int ret;
432
433         /* AIF(1/0) register adress offset calculated */
434         if (aif-1)
435                 offset = 4;
436         else
437                 offset = 0;
438
439         switch (wm8994->sysclk[aif-1]) {
440         case WM8994_SYSCLK_MCLK1:
441                 reg1 |= SEL_MCLK1;
442                 rate = wm8994->mclk[0];
443                 break;
444
445         case WM8994_SYSCLK_MCLK2:
446                 reg1 |= SEL_MCLK2;
447                 rate = wm8994->mclk[1];
448                 break;
449
450         case WM8994_SYSCLK_FLL1:
451                 reg1 |= SEL_FLL1;
452                 rate = wm8994->fll[0].out;
453                 break;
454
455         case WM8994_SYSCLK_FLL2:
456                 reg1 |= SEL_FLL2;
457                 rate = wm8994->fll[1].out;
458                 break;
459
460         default:
461                 debug("%s: Invalid input clock selection [%d]\n",
462                       __func__, wm8994->sysclk[aif-1]);
463                 return -1;
464         }
465
466         /* if input clock frequenct is more than 135Mhz then divide */
467         if (rate >= WM8994_MAX_INPUT_CLK_FREQ) {
468                 rate /= 2;
469                 reg1 |= WM8994_AIF1CLK_DIV;
470         }
471
472         wm8994->aifclk[aif-1] = rate;
473
474         ret = wm8994_update_bits(WM8994_AIF1_CLOCKING_1 + offset,
475                                 WM8994_AIF1CLK_SRC_MASK | WM8994_AIF1CLK_DIV,
476                                 reg1);
477
478         if (aif == WM8994_AIF1)
479                 ret |= wm8994_update_bits(WM8994_CLOCKING_1,
480                         WM8994_AIF1DSPCLK_ENA_MASK | WM8994_SYSDSPCLK_ENA_MASK,
481                         WM8994_AIF1DSPCLK_ENA | WM8994_SYSDSPCLK_ENA);
482         else if (aif == WM8994_AIF2)
483                 ret |= wm8994_update_bits(WM8994_CLOCKING_1,
484                         WM8994_SYSCLK_SRC | WM8994_AIF2DSPCLK_ENA_MASK |
485                         WM8994_SYSDSPCLK_ENA_MASK, WM8994_SYSCLK_SRC |
486                         WM8994_AIF2DSPCLK_ENA | WM8994_SYSDSPCLK_ENA);
487
488         if (ret < 0) {
489                 debug("%s: codec register access error\n", __func__);
490                 return -1;
491         }
492
493         return 0;
494 }
495
496 /*
497  * Configures Audio interface  for the given frequency
498  *
499  * @param wm8994        wm8994 information
500  * @param aif_id        Audio Interface
501  * @param clk_id        Input Clock ID
502  * @param freq          Sampling frequency in Hz
503  *
504  * @return -1 for error and 0 success.
505  */
506 static int wm8994_set_sysclk(struct wm8994_priv *wm8994, int aif_id,
507                                 int clk_id, unsigned int freq)
508 {
509         int i;
510         int ret = 0;
511
512         wm8994->sysclk[aif_id - 1] = clk_id;
513
514         switch (clk_id) {
515         case WM8994_SYSCLK_MCLK1:
516                 wm8994->mclk[0] = freq;
517                 if (aif_id == 2) {
518                         ret = wm8994_update_bits(WM8994_AIF1_CLOCKING_2 ,
519                         WM8994_AIF2DAC_DIV_MASK , 0);
520                 }
521                 break;
522
523         case WM8994_SYSCLK_MCLK2:
524                 /* TODO: Set GPIO AF */
525                 wm8994->mclk[1] = freq;
526                 break;
527
528         case WM8994_SYSCLK_FLL1:
529         case WM8994_SYSCLK_FLL2:
530                 break;
531
532         case WM8994_SYSCLK_OPCLK:
533                 /*
534                  * Special case - a division (times 10) is given and
535                  * no effect on main clocking.
536                  */
537                 if (freq) {
538                         for (i = 0; i < ARRAY_SIZE(opclk_divs); i++)
539                                 if (opclk_divs[i] == freq)
540                                         break;
541                         if (i == ARRAY_SIZE(opclk_divs)) {
542                                 debug("%s frequency divisor not found\n",
543                                       __func__);
544                                 return -1;
545                         }
546                         ret = wm8994_update_bits(WM8994_CLOCKING_2,
547                                             WM8994_OPCLK_DIV_MASK, i);
548                         ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_2,
549                                             WM8994_OPCLK_ENA, WM8994_OPCLK_ENA);
550                 } else {
551                         ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_2,
552                                             WM8994_OPCLK_ENA, 0);
553                 }
554
555         default:
556                 debug("%s Invalid input clock selection [%d]\n",
557                       __func__, clk_id);
558                 return -1;
559         }
560
561         ret |= configure_aif_clock(wm8994, aif_id);
562
563         if (ret < 0) {
564                 debug("%s: codec register access error\n", __func__);
565                 return -1;
566         }
567
568         return 0;
569 }
570
571 /*
572  * Initializes Volume for AIF2 to HP path
573  *
574  * @returns -1 for error  and 0 Success.
575  *
576  */
577 static int wm8994_init_volume_aif2_dac1(void)
578 {
579         int ret;
580
581         /* Unmute AIF2DAC */
582         ret = wm8994_update_bits(WM8994_AIF2_DAC_FILTERS_1,
583                         WM8994_AIF2DAC_MUTE_MASK, 0);
584
585
586         ret |= wm8994_update_bits(WM8994_AIF2_DAC_LEFT_VOLUME,
587                         WM8994_AIF2DAC_VU_MASK | WM8994_AIF2DACL_VOL_MASK,
588                         WM8994_AIF2DAC_VU | 0xff);
589
590         ret |= wm8994_update_bits(WM8994_AIF2_DAC_RIGHT_VOLUME,
591                         WM8994_AIF2DAC_VU_MASK | WM8994_AIF2DACR_VOL_MASK,
592                         WM8994_AIF2DAC_VU | 0xff);
593
594
595         ret |= wm8994_update_bits(WM8994_DAC1_LEFT_VOLUME,
596                         WM8994_DAC1_VU_MASK | WM8994_DAC1L_VOL_MASK |
597                         WM8994_DAC1L_MUTE_MASK, WM8994_DAC1_VU | 0xc0);
598
599         ret |= wm8994_update_bits(WM8994_DAC1_RIGHT_VOLUME,
600                         WM8994_DAC1_VU_MASK | WM8994_DAC1R_VOL_MASK |
601                         WM8994_DAC1R_MUTE_MASK, WM8994_DAC1_VU | 0xc0);
602         /* Head Phone Volume */
603         ret |= wm8994_i2c_write(WM8994_LEFT_OUTPUT_VOLUME, 0x12D);
604         ret |= wm8994_i2c_write(WM8994_RIGHT_OUTPUT_VOLUME, 0x12D);
605
606         if (ret < 0) {
607                 debug("%s: codec register access error\n", __func__);
608                 return -1;
609         }
610
611         return 0;
612 }
613
614 /*
615  * Initializes Volume for AIF1 to HP path
616  *
617  * @returns -1 for error  and 0 Success.
618  *
619  */
620 static int wm8994_init_volume_aif1_dac1(void)
621 {
622         int ret = 0;
623
624         /* Unmute AIF1DAC */
625         ret |= wm8994_i2c_write(WM8994_AIF1_DAC_FILTERS_1, 0x0000);
626
627         ret |= wm8994_update_bits(WM8994_DAC1_LEFT_VOLUME,
628                         WM8994_DAC1_VU_MASK | WM8994_DAC1L_VOL_MASK |
629                         WM8994_DAC1L_MUTE_MASK, WM8994_DAC1_VU | 0xc0);
630
631         ret |= wm8994_update_bits(WM8994_DAC1_RIGHT_VOLUME,
632                         WM8994_DAC1_VU_MASK | WM8994_DAC1R_VOL_MASK |
633                         WM8994_DAC1R_MUTE_MASK, WM8994_DAC1_VU | 0xc0);
634         /* Head Phone Volume */
635         ret |= wm8994_i2c_write(WM8994_LEFT_OUTPUT_VOLUME, 0x12D);
636         ret |= wm8994_i2c_write(WM8994_RIGHT_OUTPUT_VOLUME, 0x12D);
637
638         if (ret < 0) {
639                 debug("%s: codec register access error\n", __func__);
640                 return -1;
641         }
642
643         return 0;
644 }
645
646 /*
647  * Intialise wm8994 codec device
648  *
649  * @param wm8994        wm8994 information
650  *
651  * @returns -1 for error  and 0 Success.
652  */
653 static int wm8994_device_init(struct wm8994_priv *wm8994,
654                               enum en_audio_interface aif_id)
655 {
656         const char *devname;
657         unsigned short reg_data;
658         int ret;
659
660         wm8994_i2c_write(WM8994_SOFTWARE_RESET, WM8994_SW_RESET);/* Reset */
661
662         ret = wm8994_i2c_read(WM8994_SOFTWARE_RESET, &reg_data);
663         if (ret < 0) {
664                 debug("Failed to read ID register\n");
665                 goto err;
666         }
667
668         if (reg_data == WM8994_ID) {
669                 devname = "WM8994";
670                 debug("Device registered as type %d\n", wm8994->type);
671                 wm8994->type = WM8994;
672         } else {
673                 debug("Device is not a WM8994, ID is %x\n", ret);
674                 ret = -1;
675                 goto err;
676         }
677
678         ret = wm8994_i2c_read(WM8994_CHIP_REVISION, &reg_data);
679         if (ret < 0) {
680                 debug("Failed to read revision register: %d\n", ret);
681                 goto err;
682         }
683         wm8994->revision = reg_data;
684         debug("%s revision %c\n", devname, 'A' + wm8994->revision);
685
686         /* VMID Selection */
687         ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_1,
688                         WM8994_VMID_SEL_MASK | WM8994_BIAS_ENA_MASK, 0x3);
689
690         /* Charge Pump Enable */
691         ret |= wm8994_update_bits(WM8994_CHARGE_PUMP_1, WM8994_CP_ENA_MASK,
692                                         WM8994_CP_ENA);
693
694         /* Head Phone Power Enable */
695         ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_1,
696                         WM8994_HPOUT1L_ENA_MASK, WM8994_HPOUT1L_ENA);
697
698         ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_1,
699                                 WM8994_HPOUT1R_ENA_MASK, WM8994_HPOUT1R_ENA);
700
701         if (aif_id == WM8994_AIF1) {
702                 ret |= wm8994_i2c_write(WM8994_POWER_MANAGEMENT_2,
703                                         WM8994_TSHUT_ENA | WM8994_MIXINL_ENA |
704                                         WM8994_MIXINR_ENA | WM8994_IN2L_ENA |
705                                         WM8994_IN2R_ENA);
706
707                 ret |= wm8994_i2c_write(WM8994_POWER_MANAGEMENT_4,
708                                         WM8994_ADCL_ENA | WM8994_ADCR_ENA |
709                                         WM8994_AIF1ADC1R_ENA |
710                                         WM8994_AIF1ADC1L_ENA);
711
712                 /* Power enable for AIF1 and DAC1 */
713                 ret |= wm8994_i2c_write(WM8994_POWER_MANAGEMENT_5,
714                                         WM8994_AIF1DACL_ENA |
715                                         WM8994_AIF1DACR_ENA |
716                                         WM8994_DAC1L_ENA | WM8994_DAC1R_ENA);
717         } else if (aif_id == WM8994_AIF2) {
718                 /* Power enable for AIF2 and DAC1 */
719                 ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_5,
720                         WM8994_AIF2DACL_ENA_MASK | WM8994_AIF2DACR_ENA_MASK |
721                         WM8994_DAC1L_ENA_MASK | WM8994_DAC1R_ENA_MASK,
722                         WM8994_AIF2DACL_ENA | WM8994_AIF2DACR_ENA |
723                         WM8994_DAC1L_ENA | WM8994_DAC1R_ENA);
724         }
725         /* Head Phone Initialisation */
726         ret |= wm8994_update_bits(WM8994_ANALOGUE_HP_1,
727                 WM8994_HPOUT1L_DLY_MASK | WM8994_HPOUT1R_DLY_MASK,
728                 WM8994_HPOUT1L_DLY | WM8994_HPOUT1R_DLY);
729
730         ret |= wm8994_update_bits(WM8994_DC_SERVO_1,
731                         WM8994_DCS_ENA_CHAN_0_MASK |
732                         WM8994_DCS_ENA_CHAN_1_MASK , WM8994_DCS_ENA_CHAN_0 |
733                         WM8994_DCS_ENA_CHAN_1);
734
735         ret |= wm8994_update_bits(WM8994_ANALOGUE_HP_1,
736                         WM8994_HPOUT1L_DLY_MASK |
737                         WM8994_HPOUT1R_DLY_MASK | WM8994_HPOUT1L_OUTP_MASK |
738                         WM8994_HPOUT1R_OUTP_MASK |
739                         WM8994_HPOUT1L_RMV_SHORT_MASK |
740                         WM8994_HPOUT1R_RMV_SHORT_MASK, WM8994_HPOUT1L_DLY |
741                         WM8994_HPOUT1R_DLY | WM8994_HPOUT1L_OUTP |
742                         WM8994_HPOUT1R_OUTP | WM8994_HPOUT1L_RMV_SHORT |
743                         WM8994_HPOUT1R_RMV_SHORT);
744
745         /* MIXER Config DAC1 to HP */
746         ret |= wm8994_update_bits(WM8994_OUTPUT_MIXER_1,
747                         WM8994_DAC1L_TO_HPOUT1L_MASK, WM8994_DAC1L_TO_HPOUT1L);
748
749         ret |= wm8994_update_bits(WM8994_OUTPUT_MIXER_2,
750                         WM8994_DAC1R_TO_HPOUT1R_MASK, WM8994_DAC1R_TO_HPOUT1R);
751
752         if (aif_id == WM8994_AIF1) {
753                 /* Routing AIF1 to DAC1 */
754                 ret |= wm8994_i2c_write(WM8994_DAC1_LEFT_MIXER_ROUTING,
755                                 WM8994_AIF1DAC1L_TO_DAC1L);
756
757                 ret |= wm8994_i2c_write(WM8994_DAC1_RIGHT_MIXER_ROUTING,
758                                         WM8994_AIF1DAC1R_TO_DAC1R);
759
760                 /* GPIO Settings for AIF1 */
761                 ret |=  wm8994_i2c_write(WM8994_GPIO_1, WM8994_GPIO_DIR_OUTPUT
762                                          | WM8994_GPIO_FUNCTION_I2S_CLK
763                                          | WM8994_GPIO_INPUT_DEBOUNCE);
764
765                 ret |= wm8994_init_volume_aif1_dac1();
766         } else if (aif_id == WM8994_AIF2) {
767                 /* Routing AIF2 to DAC1 */
768                 ret |= wm8994_update_bits(WM8994_DAC1_LEFT_MIXER_ROUTING,
769                                 WM8994_AIF2DACL_TO_DAC1L_MASK,
770                                 WM8994_AIF2DACL_TO_DAC1L);
771
772                 ret |= wm8994_update_bits(WM8994_DAC1_RIGHT_MIXER_ROUTING,
773                                 WM8994_AIF2DACR_TO_DAC1R_MASK,
774                                 WM8994_AIF2DACR_TO_DAC1R);
775
776                 /* GPIO Settings for AIF2 */
777                 /* B CLK */
778                 ret |= wm8994_update_bits(WM8994_GPIO_3, WM8994_GPIO_DIR_MASK |
779                                         WM8994_GPIO_FUNCTION_MASK ,
780                                         WM8994_GPIO_DIR_OUTPUT);
781
782                 /* LR CLK */
783                 ret |= wm8994_update_bits(WM8994_GPIO_4, WM8994_GPIO_DIR_MASK |
784                                         WM8994_GPIO_FUNCTION_MASK,
785                                         WM8994_GPIO_DIR_OUTPUT);
786
787                 /* DATA */
788                 ret |= wm8994_update_bits(WM8994_GPIO_5, WM8994_GPIO_DIR_MASK |
789                                         WM8994_GPIO_FUNCTION_MASK,
790                                         WM8994_GPIO_DIR_OUTPUT);
791
792                 ret |= wm8994_init_volume_aif2_dac1();
793         }
794
795         if (ret < 0)
796                 goto err;
797
798         debug("%s: Codec chip init ok\n", __func__);
799         return 0;
800 err:
801         debug("%s: Codec chip init error\n", __func__);
802         return -1;
803 }
804
805 /*
806  * Gets fdt values for wm8994 config parameters
807  *
808  * @param pcodec_info   codec information structure
809  * @param blob          FDT blob
810  * @return              int value, 0 for success
811  */
812 static int get_codec_values(struct sound_codec_info *pcodec_info,
813                         const void *blob)
814 {
815         int error = 0;
816 #if CONFIG_IS_ENABLED(OF_CONTROL)
817         enum fdt_compat_id compat;
818         int node;
819         int parent;
820
821         /* Get the node from FDT for codec */
822         node = fdtdec_next_compatible(blob, 0, COMPAT_WOLFSON_WM8994_CODEC);
823         if (node <= 0) {
824                 debug("EXYNOS_SOUND: No node for codec in device tree\n");
825                 debug("node = %d\n", node);
826                 return -1;
827         }
828
829         parent = fdt_parent_offset(blob, node);
830         if (parent < 0) {
831                 debug("%s: Cannot find node parent\n", __func__);
832                 return -1;
833         }
834
835         compat = fdtdec_lookup(blob, parent);
836         switch (compat) {
837         case COMPAT_SAMSUNG_S3C2440_I2C:
838                 pcodec_info->i2c_bus = i2c_get_bus_num_fdt(parent);
839                 error |= pcodec_info->i2c_bus;
840                 debug("i2c bus = %d\n", pcodec_info->i2c_bus);
841                 pcodec_info->i2c_dev_addr = fdtdec_get_int(blob, node,
842                                                         "reg", 0);
843                 error |= pcodec_info->i2c_dev_addr;
844                 debug("i2c dev addr = %d\n", pcodec_info->i2c_dev_addr);
845                 break;
846         default:
847                 debug("%s: Unknown compat id %d\n", __func__, compat);
848                 return -1;
849         }
850 #else
851         pcodec_info->i2c_bus = AUDIO_I2C_BUS;
852         pcodec_info->i2c_dev_addr = AUDIO_I2C_REG;
853         debug("i2c dev addr = %d\n", pcodec_info->i2c_dev_addr);
854 #endif
855
856         pcodec_info->codec_type = CODEC_WM_8994;
857
858         if (error == -1) {
859                 debug("fail to get wm8994 codec node properties\n");
860                 return -1;
861         }
862
863         return 0;
864 }
865
866 /* WM8994 Device Initialisation */
867 int wm8994_init(const void *blob, enum en_audio_interface aif_id,
868                         int sampling_rate, int mclk_freq,
869                         int bits_per_sample, unsigned int channels)
870 {
871         int ret = 0;
872         struct sound_codec_info *pcodec_info = &g_codec_info;
873
874         /* Get the codec Values */
875         if (get_codec_values(pcodec_info, blob) < 0) {
876                 debug("FDT Codec values failed\n");
877                 return -1;
878         }
879
880         /* shift the device address by 1 for 7 bit addressing */
881         g_wm8994_i2c_dev_addr = pcodec_info->i2c_dev_addr;
882         wm8994_i2c_init(pcodec_info->i2c_bus);
883
884         if (pcodec_info->codec_type == CODEC_WM_8994) {
885                 g_wm8994_info.type = WM8994;
886         } else {
887                 debug("%s: Codec id [%d] not defined\n", __func__,
888                       pcodec_info->codec_type);
889                 return -1;
890         }
891
892         ret = wm8994_device_init(&g_wm8994_info, aif_id);
893         if (ret < 0) {
894                 debug("%s: wm8994 codec chip init failed\n", __func__);
895                 return ret;
896         }
897
898         ret =  wm8994_set_sysclk(&g_wm8994_info, aif_id, WM8994_SYSCLK_MCLK1,
899                                                         mclk_freq);
900         if (ret < 0) {
901                 debug("%s: wm8994 codec set sys clock failed\n", __func__);
902                 return ret;
903         }
904
905         ret = wm8994_hw_params(&g_wm8994_info, aif_id, sampling_rate,
906                                                 bits_per_sample, channels);
907
908         if (ret == 0) {
909                 ret = wm8994_set_fmt(aif_id, SND_SOC_DAIFMT_I2S |
910                                                 SND_SOC_DAIFMT_NB_NF |
911                                                 SND_SOC_DAIFMT_CBS_CFS);
912         }
913         return ret;
914 }