blob: aaaa3241aa186ee40678f7ea3be21da7b10ec14d [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +00002/*
3 * Copyright (C) 2012 Samsung Electronics
4 * R. Chandrasekar <rcsekar@samsung.com>
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +00005 */
Simon Glass150c5af2017-05-30 21:47:09 -06006#include <common.h>
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +00007#include <asm/arch/clk.h>
8#include <asm/arch/cpu.h>
9#include <asm/gpio.h>
10#include <asm/io.h>
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +000011#include <div64.h>
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +000012#include <fdtdec.h>
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +000013#include <i2c.h>
14#include <i2s.h>
15#include <sound.h>
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +000016#include <asm/arch/sound.h>
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +000017#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 */
27struct 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 */
34struct 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 */
44static unsigned int src_rate[] = {
45 8000, 11025, 12000, 16000, 22050, 24000,
46 32000, 44100, 48000, 88200, 96000
47};
48
49/* op clock divisions */
50static int opclk_divs[] = { 10, 20, 30, 40, 55, 60, 80, 120, 160 };
51
52/* lr clock frame size ratio */
53static int fs_ratios[] = {
54 64, 128, 192, 256, 348, 512, 768, 1024, 1408, 1536
55};
56
57/* bit clock divisors */
58static 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
63static struct wm8994_priv g_wm8994_info;
64static unsigned char g_wm8994_i2c_dev_addr;
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +000065static struct sound_codec_info g_codec_info;
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +000066
67/*
68 * Initialise I2C for wm 8994
69 *
70 * @param bus no i2c bus number in which wm8994 is connected
71 */
72static 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 */
85static 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 */
104static 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 */
133static 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 */
159int 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 */
282static 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 */
426static 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 */
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530434 if (aif-1)
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000435 offset = 4;
436 else
437 offset = 0;
438
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530439 switch (wm8994->sysclk[aif-1]) {
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000440 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",
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530462 __func__, wm8994->sysclk[aif-1]);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000463 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
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530472 wm8994->aifclk[aif-1] = rate;
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000473
474 ret = wm8994_update_bits(WM8994_AIF1_CLOCKING_1 + offset,
475 WM8994_AIF1CLK_SRC_MASK | WM8994_AIF1CLK_DIV,
476 reg1);
477
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530478 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,
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000484 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 */
506static 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",
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530543 __func__);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000544 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
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530561 ret |= configure_aif_clock(wm8994, aif_id);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000562
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 */
577static 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/*
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530615 * Initializes Volume for AIF1 to HP path
616 *
617 * @returns -1 for error and 0 Success.
618 *
619 */
620static 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/*
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000647 * Intialise wm8994 codec device
648 *
649 * @param wm8994 wm8994 information
650 *
651 * @returns -1 for error and 0 Success.
652 */
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530653static int wm8994_device_init(struct wm8994_priv *wm8994,
654 enum en_audio_interface aif_id)
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000655{
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
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530701 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);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000706
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530707 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 }
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000725 /* 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
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530752 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);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000756
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530757 ret |= wm8994_i2c_write(WM8994_DAC1_RIGHT_MIXER_ROUTING,
758 WM8994_AIF1DAC1R_TO_DAC1R);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000759
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530760 /* 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);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000764
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530765 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);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000771
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530772 ret |= wm8994_update_bits(WM8994_DAC1_RIGHT_MIXER_ROUTING,
773 WM8994_AIF2DACR_TO_DAC1R_MASK,
774 WM8994_AIF2DACR_TO_DAC1R);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000775
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530776 /* 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
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000795 if (ret < 0)
796 goto err;
797
798 debug("%s: Codec chip init ok\n", __func__);
799 return 0;
800err:
801 debug("%s: Codec chip init error\n", __func__);
802 return -1;
803}
804
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +0000805/*
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 */
812static int get_codec_values(struct sound_codec_info *pcodec_info,
813 const void *blob)
814{
815 int error = 0;
Masahiro Yamada0f925822015-08-12 07:31:55 +0900816#if CONFIG_IS_ENABLED(OF_CONTROL)
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +0000817 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
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530866/* WM8994 Device Initialisation */
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +0000867int wm8994_init(const void *blob, enum en_audio_interface aif_id,
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000868 int sampling_rate, int mclk_freq,
869 int bits_per_sample, unsigned int channels)
870{
871 int ret = 0;
Rajeshwari Shinde6647c7a2012-12-26 20:03:18 +0000872 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 }
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000879
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
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530884 if (pcodec_info->codec_type == CODEC_WM_8994) {
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000885 g_wm8994_info.type = WM8994;
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530886 } else {
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000887 debug("%s: Codec id [%d] not defined\n", __func__,
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530888 pcodec_info->codec_type);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000889 return -1;
890 }
891
Dani Krishna Mohand981d802013-09-11 16:38:46 +0530892 ret = wm8994_device_init(&g_wm8994_info, aif_id);
Rajeshwari Shindea2d8e0a2012-10-25 19:49:23 +0000893 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}