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