xref: /openbmc/linux/sound/i2c/other/ak4xxx-adda.c (revision b627b4ed)
1 /*
2  *   ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4358 / AK4381
3  *   AD and DA converters
4  *
5  *	Copyright (c) 2000-2004 Jaroslav Kysela <perex@perex.cz>,
6  *				Takashi Iwai <tiwai@suse.de>
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 as published by
10  *   the Free Software Foundation; either version 2 of the License, or
11  *   (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, MA  02111-1307 USA
21  *
22  */
23 
24 #include <asm/io.h>
25 #include <linux/delay.h>
26 #include <linux/interrupt.h>
27 #include <linux/init.h>
28 #include <sound/core.h>
29 #include <sound/control.h>
30 #include <sound/tlv.h>
31 #include <sound/ak4xxx-adda.h>
32 
33 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.de>");
34 MODULE_DESCRIPTION("Routines for control of AK452x / AK43xx  AD/DA converters");
35 MODULE_LICENSE("GPL");
36 
37 /* write the given register and save the data to the cache */
38 void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
39 		       unsigned char val)
40 {
41 	ak->ops.lock(ak, chip);
42 	ak->ops.write(ak, chip, reg, val);
43 
44 	/* save the data */
45 	snd_akm4xxx_set(ak, chip, reg, val);
46 	ak->ops.unlock(ak, chip);
47 }
48 
49 EXPORT_SYMBOL(snd_akm4xxx_write);
50 
51 /* reset procedure for AK4524 and AK4528 */
52 static void ak4524_reset(struct snd_akm4xxx *ak, int state)
53 {
54 	unsigned int chip;
55 	unsigned char reg, maxreg;
56 
57 	if (ak->type == SND_AK4528)
58 		maxreg = 0x06;
59 	else
60 		maxreg = 0x08;
61 	for (chip = 0; chip < ak->num_dacs/2; chip++) {
62 		snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03);
63 		if (state)
64 			continue;
65 		/* DAC volumes */
66 		for (reg = 0x04; reg < maxreg; reg++)
67 			snd_akm4xxx_write(ak, chip, reg,
68 					  snd_akm4xxx_get(ak, chip, reg));
69 	}
70 }
71 
72 /* reset procedure for AK4355 and AK4358 */
73 static void ak435X_reset(struct snd_akm4xxx *ak, int state,
74 		unsigned char total_regs)
75 {
76 	unsigned char reg;
77 
78 	if (state) {
79 		snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
80 		return;
81 	}
82 	for (reg = 0x00; reg < total_regs; reg++)
83 		if (reg != 0x01)
84 			snd_akm4xxx_write(ak, 0, reg,
85 					  snd_akm4xxx_get(ak, 0, reg));
86 	snd_akm4xxx_write(ak, 0, 0x01, 0x01); /* un-reset, unmute */
87 }
88 
89 /* reset procedure for AK4381 */
90 static void ak4381_reset(struct snd_akm4xxx *ak, int state)
91 {
92 	unsigned int chip;
93 	unsigned char reg;
94 
95 	for (chip = 0; chip < ak->num_dacs/2; chip++) {
96 		snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f);
97 		if (state)
98 			continue;
99 		for (reg = 0x01; reg < 0x05; reg++)
100 			snd_akm4xxx_write(ak, chip, reg,
101 					  snd_akm4xxx_get(ak, chip, reg));
102 	}
103 }
104 
105 /*
106  * reset the AKM codecs
107  * @state: 1 = reset codec, 0 = restore the registers
108  *
109  * assert the reset operation and restores the register values to the chips.
110  */
111 void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
112 {
113 	switch (ak->type) {
114 	case SND_AK4524:
115 	case SND_AK4528:
116 		ak4524_reset(ak, state);
117 		break;
118 	case SND_AK4529:
119 		/* FIXME: needed for ak4529? */
120 		break;
121 	case SND_AK4355:
122 		ak435X_reset(ak, state, 0x0b);
123 		break;
124 	case SND_AK4358:
125 		ak435X_reset(ak, state, 0x10);
126 		break;
127 	case SND_AK4381:
128 		ak4381_reset(ak, state);
129 		break;
130 	default:
131 		break;
132 	}
133 }
134 
135 EXPORT_SYMBOL(snd_akm4xxx_reset);
136 
137 
138 /*
139  * Volume conversion table for non-linear volumes
140  * from -63.5dB (mute) to 0dB step 0.5dB
141  *
142  * Used for AK4524 input/ouput attenuation, AK4528, and
143  * AK5365 input attenuation
144  */
145 static const unsigned char vol_cvt_datt[128] = {
146 	0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04,
147 	0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06,
148 	0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x0a,
149 	0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f,
150 	0x10, 0x10, 0x11, 0x12, 0x12, 0x13, 0x13, 0x14,
151 	0x15, 0x16, 0x17, 0x17, 0x18, 0x19, 0x1a, 0x1c,
152 	0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x23,
153 	0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2d,
154 	0x2e, 0x30, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
155 	0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3e, 0x3f, 0x40,
156 	0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x4a,
157 	0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54,
158 	0x55, 0x56, 0x58, 0x59, 0x5b, 0x5c, 0x5e, 0x5f,
159 	0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x67, 0x69,
160 	0x6a, 0x6c, 0x6d, 0x6f, 0x70, 0x71, 0x72, 0x73,
161 	0x75, 0x76, 0x77, 0x79, 0x7a, 0x7c, 0x7d, 0x7f,
162 };
163 
164 /*
165  * dB tables
166  */
167 static const DECLARE_TLV_DB_SCALE(db_scale_vol_datt, -6350, 50, 1);
168 static const DECLARE_TLV_DB_SCALE(db_scale_8bit, -12750, 50, 1);
169 static const DECLARE_TLV_DB_SCALE(db_scale_7bit, -6350, 50, 1);
170 static const DECLARE_TLV_DB_LINEAR(db_scale_linear, TLV_DB_GAIN_MUTE, 0);
171 
172 /*
173  * initialize all the ak4xxx chips
174  */
175 void snd_akm4xxx_init(struct snd_akm4xxx *ak)
176 {
177 	static const unsigned char inits_ak4524[] = {
178 		0x00, 0x07, /* 0: all power up */
179 		0x01, 0x00, /* 1: ADC/DAC reset */
180 		0x02, 0x60, /* 2: 24bit I2S */
181 		0x03, 0x19, /* 3: deemphasis off */
182 		0x01, 0x03, /* 1: ADC/DAC enable */
183 		0x04, 0x00, /* 4: ADC left muted */
184 		0x05, 0x00, /* 5: ADC right muted */
185 		0x06, 0x00, /* 6: DAC left muted */
186 		0x07, 0x00, /* 7: DAC right muted */
187 		0xff, 0xff
188 	};
189 	static const unsigned char inits_ak4528[] = {
190 		0x00, 0x07, /* 0: all power up */
191 		0x01, 0x00, /* 1: ADC/DAC reset */
192 		0x02, 0x60, /* 2: 24bit I2S */
193 		0x03, 0x0d, /* 3: deemphasis off, turn LR highpass filters on */
194 		0x01, 0x03, /* 1: ADC/DAC enable */
195 		0x04, 0x00, /* 4: ADC left muted */
196 		0x05, 0x00, /* 5: ADC right muted */
197 		0xff, 0xff
198 	};
199 	static const unsigned char inits_ak4529[] = {
200 		0x09, 0x01, /* 9: ATS=0, RSTN=1 */
201 		0x0a, 0x3f, /* A: all power up, no zero/overflow detection */
202 		0x00, 0x0c, /* 0: TDM=0, 24bit I2S, SMUTE=0 */
203 		0x01, 0x00, /* 1: ACKS=0, ADC, loop off */
204 		0x02, 0xff, /* 2: LOUT1 muted */
205 		0x03, 0xff, /* 3: ROUT1 muted */
206 		0x04, 0xff, /* 4: LOUT2 muted */
207 		0x05, 0xff, /* 5: ROUT2 muted */
208 		0x06, 0xff, /* 6: LOUT3 muted */
209 		0x07, 0xff, /* 7: ROUT3 muted */
210 		0x0b, 0xff, /* B: LOUT4 muted */
211 		0x0c, 0xff, /* C: ROUT4 muted */
212 		0x08, 0x55, /* 8: deemphasis all off */
213 		0xff, 0xff
214 	};
215 	static const unsigned char inits_ak4355[] = {
216 		0x01, 0x02, /* 1: reset and soft-mute */
217 		0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
218 			     * disable DZF, sharp roll-off, RSTN#=0 */
219 		0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */
220 		// 0x02, 0x2e, /* quad speed */
221 		0x03, 0x01, /* 3: de-emphasis off */
222 		0x04, 0x00, /* 4: LOUT1 volume muted */
223 		0x05, 0x00, /* 5: ROUT1 volume muted */
224 		0x06, 0x00, /* 6: LOUT2 volume muted */
225 		0x07, 0x00, /* 7: ROUT2 volume muted */
226 		0x08, 0x00, /* 8: LOUT3 volume muted */
227 		0x09, 0x00, /* 9: ROUT3 volume muted */
228 		0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
229 		0x01, 0x01, /* 1: un-reset, unmute */
230 		0xff, 0xff
231 	};
232 	static const unsigned char inits_ak4358[] = {
233 		0x01, 0x02, /* 1: reset and soft-mute */
234 		0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
235 			     * disable DZF, sharp roll-off, RSTN#=0 */
236 		0x02, 0x4e, /* 2: DA's power up, normal speed, RSTN#=0 */
237 		/* 0x02, 0x6e,*/ /* quad speed */
238 		0x03, 0x01, /* 3: de-emphasis off */
239 		0x04, 0x00, /* 4: LOUT1 volume muted */
240 		0x05, 0x00, /* 5: ROUT1 volume muted */
241 		0x06, 0x00, /* 6: LOUT2 volume muted */
242 		0x07, 0x00, /* 7: ROUT2 volume muted */
243 		0x08, 0x00, /* 8: LOUT3 volume muted */
244 		0x09, 0x00, /* 9: ROUT3 volume muted */
245 		0x0b, 0x00, /* b: LOUT4 volume muted */
246 		0x0c, 0x00, /* c: ROUT4 volume muted */
247 		0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
248 		0x01, 0x01, /* 1: un-reset, unmute */
249 		0xff, 0xff
250 	};
251 	static const unsigned char inits_ak4381[] = {
252 		0x00, 0x0c, /* 0: mode3(i2s), disable auto-clock detect */
253 		0x01, 0x02, /* 1: de-emphasis off, normal speed,
254 			     * sharp roll-off, DZF off */
255 		// 0x01, 0x12, /* quad speed */
256 		0x02, 0x00, /* 2: DZF disabled */
257 		0x03, 0x00, /* 3: LATT 0 */
258 		0x04, 0x00, /* 4: RATT 0 */
259 		0x00, 0x0f, /* 0: power-up, un-reset */
260 		0xff, 0xff
261 	};
262 
263 	int chip, num_chips;
264 	const unsigned char *ptr, *inits;
265 	unsigned char reg, data;
266 
267 	memset(ak->images, 0, sizeof(ak->images));
268 	memset(ak->volumes, 0, sizeof(ak->volumes));
269 
270 	switch (ak->type) {
271 	case SND_AK4524:
272 		inits = inits_ak4524;
273 		num_chips = ak->num_dacs / 2;
274 		break;
275 	case SND_AK4528:
276 		inits = inits_ak4528;
277 		num_chips = ak->num_dacs / 2;
278 		break;
279 	case SND_AK4529:
280 		inits = inits_ak4529;
281 		num_chips = 1;
282 		break;
283 	case SND_AK4355:
284 		inits = inits_ak4355;
285 		num_chips = 1;
286 		break;
287 	case SND_AK4358:
288 		inits = inits_ak4358;
289 		num_chips = 1;
290 		break;
291 	case SND_AK4381:
292 		inits = inits_ak4381;
293 		num_chips = ak->num_dacs / 2;
294 		break;
295 	case SND_AK5365:
296 		/* FIXME: any init sequence? */
297 		return;
298 	default:
299 		snd_BUG();
300 		return;
301 	}
302 
303 	for (chip = 0; chip < num_chips; chip++) {
304 		ptr = inits;
305 		while (*ptr != 0xff) {
306 			reg = *ptr++;
307 			data = *ptr++;
308 			snd_akm4xxx_write(ak, chip, reg, data);
309 		}
310 	}
311 }
312 
313 EXPORT_SYMBOL(snd_akm4xxx_init);
314 
315 /*
316  * Mixer callbacks
317  */
318 #define AK_IPGA 			(1<<20)	/* including IPGA */
319 #define AK_VOL_CVT 			(1<<21)	/* need dB conversion */
320 #define AK_NEEDSMSB 			(1<<22)	/* need MSB update bit */
321 #define AK_INVERT 			(1<<23)	/* data is inverted */
322 #define AK_GET_CHIP(val)		(((val) >> 8) & 0xff)
323 #define AK_GET_ADDR(val)		((val) & 0xff)
324 #define AK_GET_SHIFT(val)		(((val) >> 16) & 0x0f)
325 #define AK_GET_VOL_CVT(val)		(((val) >> 21) & 1)
326 #define AK_GET_IPGA(val)		(((val) >> 20) & 1)
327 #define AK_GET_NEEDSMSB(val)		(((val) >> 22) & 1)
328 #define AK_GET_INVERT(val)		(((val) >> 23) & 1)
329 #define AK_GET_MASK(val)		(((val) >> 24) & 0xff)
330 #define AK_COMPOSE(chip,addr,shift,mask) \
331 	(((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24))
332 
333 static int snd_akm4xxx_volume_info(struct snd_kcontrol *kcontrol,
334 				   struct snd_ctl_elem_info *uinfo)
335 {
336 	unsigned int mask = AK_GET_MASK(kcontrol->private_value);
337 
338 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
339 	uinfo->count = 1;
340 	uinfo->value.integer.min = 0;
341 	uinfo->value.integer.max = mask;
342 	return 0;
343 }
344 
345 static int snd_akm4xxx_volume_get(struct snd_kcontrol *kcontrol,
346 				  struct snd_ctl_elem_value *ucontrol)
347 {
348 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
349 	int chip = AK_GET_CHIP(kcontrol->private_value);
350 	int addr = AK_GET_ADDR(kcontrol->private_value);
351 
352 	ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
353 	return 0;
354 }
355 
356 static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr,
357 		      unsigned char nval)
358 {
359 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
360 	unsigned int mask = AK_GET_MASK(kcontrol->private_value);
361 	int chip = AK_GET_CHIP(kcontrol->private_value);
362 
363 	if (snd_akm4xxx_get_vol(ak, chip, addr) == nval)
364 		return 0;
365 
366 	snd_akm4xxx_set_vol(ak, chip, addr, nval);
367 	if (AK_GET_VOL_CVT(kcontrol->private_value) && nval < 128)
368 		nval = vol_cvt_datt[nval];
369 	if (AK_GET_IPGA(kcontrol->private_value) && nval >= 128)
370 		nval++; /* need to correct + 1 since both 127 and 128 are 0dB */
371 	if (AK_GET_INVERT(kcontrol->private_value))
372 		nval = mask - nval;
373 	if (AK_GET_NEEDSMSB(kcontrol->private_value))
374 		nval |= 0x80;
375 	/* printk(KERN_DEBUG "DEBUG - AK writing reg: chip %x addr %x,
376 	   nval %x\n", chip, addr, nval); */
377 	snd_akm4xxx_write(ak, chip, addr, nval);
378 	return 1;
379 }
380 
381 static int snd_akm4xxx_volume_put(struct snd_kcontrol *kcontrol,
382 				  struct snd_ctl_elem_value *ucontrol)
383 {
384 	unsigned int mask = AK_GET_MASK(kcontrol->private_value);
385 	unsigned int val = ucontrol->value.integer.value[0];
386 	if (val > mask)
387 		return -EINVAL;
388 	return put_ak_reg(kcontrol, AK_GET_ADDR(kcontrol->private_value), val);
389 }
390 
391 static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol *kcontrol,
392 					  struct snd_ctl_elem_info *uinfo)
393 {
394 	unsigned int mask = AK_GET_MASK(kcontrol->private_value);
395 
396 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
397 	uinfo->count = 2;
398 	uinfo->value.integer.min = 0;
399 	uinfo->value.integer.max = mask;
400 	return 0;
401 }
402 
403 static int snd_akm4xxx_stereo_volume_get(struct snd_kcontrol *kcontrol,
404 					 struct snd_ctl_elem_value *ucontrol)
405 {
406 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
407 	int chip = AK_GET_CHIP(kcontrol->private_value);
408 	int addr = AK_GET_ADDR(kcontrol->private_value);
409 
410 	ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
411 	ucontrol->value.integer.value[1] = snd_akm4xxx_get_vol(ak, chip, addr+1);
412 	return 0;
413 }
414 
415 static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol *kcontrol,
416 					 struct snd_ctl_elem_value *ucontrol)
417 {
418 	int addr = AK_GET_ADDR(kcontrol->private_value);
419 	unsigned int mask = AK_GET_MASK(kcontrol->private_value);
420 	unsigned int val[2];
421 	int change;
422 
423 	val[0] = ucontrol->value.integer.value[0];
424 	val[1] = ucontrol->value.integer.value[1];
425 	if (val[0] > mask || val[1] > mask)
426 		return -EINVAL;
427 	change = put_ak_reg(kcontrol, addr, val[0]);
428 	change |= put_ak_reg(kcontrol, addr + 1, val[1]);
429 	return change;
430 }
431 
432 static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol *kcontrol,
433 				       struct snd_ctl_elem_info *uinfo)
434 {
435 	static char *texts[4] = {
436 		"44.1kHz", "Off", "48kHz", "32kHz",
437 	};
438 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
439 	uinfo->count = 1;
440 	uinfo->value.enumerated.items = 4;
441 	if (uinfo->value.enumerated.item >= 4)
442 		uinfo->value.enumerated.item = 3;
443 	strcpy(uinfo->value.enumerated.name,
444 	       texts[uinfo->value.enumerated.item]);
445 	return 0;
446 }
447 
448 static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol,
449 				      struct snd_ctl_elem_value *ucontrol)
450 {
451 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
452 	int chip = AK_GET_CHIP(kcontrol->private_value);
453 	int addr = AK_GET_ADDR(kcontrol->private_value);
454 	int shift = AK_GET_SHIFT(kcontrol->private_value);
455 	ucontrol->value.enumerated.item[0] =
456 		(snd_akm4xxx_get(ak, chip, addr) >> shift) & 3;
457 	return 0;
458 }
459 
460 static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol,
461 				      struct snd_ctl_elem_value *ucontrol)
462 {
463 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
464 	int chip = AK_GET_CHIP(kcontrol->private_value);
465 	int addr = AK_GET_ADDR(kcontrol->private_value);
466 	int shift = AK_GET_SHIFT(kcontrol->private_value);
467 	unsigned char nval = ucontrol->value.enumerated.item[0] & 3;
468 	int change;
469 
470 	nval = (nval << shift) |
471 		(snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
472 	change = snd_akm4xxx_get(ak, chip, addr) != nval;
473 	if (change)
474 		snd_akm4xxx_write(ak, chip, addr, nval);
475 	return change;
476 }
477 
478 #define ak4xxx_switch_info	snd_ctl_boolean_mono_info
479 
480 static int ak4xxx_switch_get(struct snd_kcontrol *kcontrol,
481 			     struct snd_ctl_elem_value *ucontrol)
482 {
483 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
484 	int chip = AK_GET_CHIP(kcontrol->private_value);
485 	int addr = AK_GET_ADDR(kcontrol->private_value);
486 	int shift = AK_GET_SHIFT(kcontrol->private_value);
487 	int invert = AK_GET_INVERT(kcontrol->private_value);
488 	/* we observe the (1<<shift) bit only */
489 	unsigned char val = snd_akm4xxx_get(ak, chip, addr) & (1<<shift);
490 	if (invert)
491 		val = ! val;
492 	ucontrol->value.integer.value[0] = (val & (1<<shift)) != 0;
493 	return 0;
494 }
495 
496 static int ak4xxx_switch_put(struct snd_kcontrol *kcontrol,
497 			     struct snd_ctl_elem_value *ucontrol)
498 {
499 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
500 	int chip = AK_GET_CHIP(kcontrol->private_value);
501 	int addr = AK_GET_ADDR(kcontrol->private_value);
502 	int shift = AK_GET_SHIFT(kcontrol->private_value);
503 	int invert = AK_GET_INVERT(kcontrol->private_value);
504 	long flag = ucontrol->value.integer.value[0];
505 	unsigned char val, oval;
506 	int change;
507 
508 	if (invert)
509 		flag = ! flag;
510 	oval = snd_akm4xxx_get(ak, chip, addr);
511 	if (flag)
512 		val = oval | (1<<shift);
513 	else
514 		val = oval & ~(1<<shift);
515 	change = (oval != val);
516 	if (change)
517 		snd_akm4xxx_write(ak, chip, addr, val);
518 	return change;
519 }
520 
521 #define AK5365_NUM_INPUTS 5
522 
523 static int ak4xxx_capture_num_inputs(struct snd_akm4xxx *ak, int mixer_ch)
524 {
525 	int num_names;
526 	const char **input_names;
527 
528 	input_names = ak->adc_info[mixer_ch].input_names;
529 	num_names = 0;
530 	while (num_names < AK5365_NUM_INPUTS && input_names[num_names])
531 		++num_names;
532 	return num_names;
533 }
534 
535 static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
536 				      struct snd_ctl_elem_info *uinfo)
537 {
538 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
539 	int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
540 	const char **input_names;
541 	int  num_names, idx;
542 
543 	num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
544 	if (!num_names)
545 		return -EINVAL;
546 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
547 	uinfo->count = 1;
548 	uinfo->value.enumerated.items = num_names;
549 	idx = uinfo->value.enumerated.item;
550 	if (idx >= num_names)
551 		return -EINVAL;
552 	input_names = ak->adc_info[mixer_ch].input_names;
553 	strncpy(uinfo->value.enumerated.name, input_names[idx],
554 		sizeof(uinfo->value.enumerated.name));
555 	return 0;
556 }
557 
558 static int ak4xxx_capture_source_get(struct snd_kcontrol *kcontrol,
559 				     struct snd_ctl_elem_value *ucontrol)
560 {
561 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
562 	int chip = AK_GET_CHIP(kcontrol->private_value);
563 	int addr = AK_GET_ADDR(kcontrol->private_value);
564 	int mask = AK_GET_MASK(kcontrol->private_value);
565 	unsigned char val;
566 
567 	val = snd_akm4xxx_get(ak, chip, addr) & mask;
568 	ucontrol->value.enumerated.item[0] = val;
569 	return 0;
570 }
571 
572 static int ak4xxx_capture_source_put(struct snd_kcontrol *kcontrol,
573 				     struct snd_ctl_elem_value *ucontrol)
574 {
575 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
576 	int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
577 	int chip = AK_GET_CHIP(kcontrol->private_value);
578 	int addr = AK_GET_ADDR(kcontrol->private_value);
579 	int mask = AK_GET_MASK(kcontrol->private_value);
580 	unsigned char oval, val;
581 	int num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
582 
583 	if (ucontrol->value.enumerated.item[0] >= num_names)
584 		return -EINVAL;
585 
586 	oval = snd_akm4xxx_get(ak, chip, addr);
587 	val = oval & ~mask;
588 	val |= ucontrol->value.enumerated.item[0] & mask;
589 	if (val != oval) {
590 		snd_akm4xxx_write(ak, chip, addr, val);
591 		return 1;
592 	}
593 	return 0;
594 }
595 
596 /*
597  * build AK4xxx controls
598  */
599 
600 static int build_dac_controls(struct snd_akm4xxx *ak)
601 {
602 	int idx, err, mixer_ch, num_stereo;
603 	struct snd_kcontrol_new knew;
604 
605 	mixer_ch = 0;
606 	for (idx = 0; idx < ak->num_dacs; ) {
607 		/* mute control for Revolution 7.1 - AK4381 */
608 		if (ak->type == SND_AK4381
609 				&&  ak->dac_info[mixer_ch].switch_name) {
610 			memset(&knew, 0, sizeof(knew));
611 			knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
612 			knew.count = 1;
613 			knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
614 			knew.name = ak->dac_info[mixer_ch].switch_name;
615 			knew.info = ak4xxx_switch_info;
616 			knew.get = ak4xxx_switch_get;
617 			knew.put = ak4xxx_switch_put;
618 			knew.access = 0;
619 			/* register 1, bit 0 (SMUTE): 0 = normal operation,
620 			   1 = mute */
621 			knew.private_value =
622 				AK_COMPOSE(idx/2, 1, 0, 0) | AK_INVERT;
623 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
624 			if (err < 0)
625 				return err;
626 		}
627 		memset(&knew, 0, sizeof(knew));
628 		if (! ak->dac_info || ! ak->dac_info[mixer_ch].name) {
629 			knew.name = "DAC Volume";
630 			knew.index = mixer_ch + ak->idx_offset * 2;
631 			num_stereo = 1;
632 		} else {
633 			knew.name = ak->dac_info[mixer_ch].name;
634 			num_stereo = ak->dac_info[mixer_ch].num_channels;
635 		}
636 		knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
637 		knew.count = 1;
638 		knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
639 			SNDRV_CTL_ELEM_ACCESS_TLV_READ;
640 		if (num_stereo == 2) {
641 			knew.info = snd_akm4xxx_stereo_volume_info;
642 			knew.get = snd_akm4xxx_stereo_volume_get;
643 			knew.put = snd_akm4xxx_stereo_volume_put;
644 		} else {
645 			knew.info = snd_akm4xxx_volume_info;
646 			knew.get = snd_akm4xxx_volume_get;
647 			knew.put = snd_akm4xxx_volume_put;
648 		}
649 		switch (ak->type) {
650 		case SND_AK4524:
651 			/* register 6 & 7 */
652 			knew.private_value =
653 				AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127) |
654 				AK_VOL_CVT;
655 			knew.tlv.p = db_scale_vol_datt;
656 			break;
657 		case SND_AK4528:
658 			/* register 4 & 5 */
659 			knew.private_value =
660 				AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127) |
661 				AK_VOL_CVT;
662 			knew.tlv.p = db_scale_vol_datt;
663 			break;
664 		case SND_AK4529: {
665 			/* registers 2-7 and b,c */
666 			int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb;
667 			knew.private_value =
668 				AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
669 			knew.tlv.p = db_scale_8bit;
670 			break;
671 		}
672 		case SND_AK4355:
673 			/* register 4-9, chip #0 only */
674 			knew.private_value = AK_COMPOSE(0, idx + 4, 0, 255);
675 			knew.tlv.p = db_scale_8bit;
676 			break;
677 		case SND_AK4358: {
678 			/* register 4-9 and 11-12, chip #0 only */
679 			int  addr = idx < 6 ? idx + 4 : idx + 5;
680 			knew.private_value =
681 				AK_COMPOSE(0, addr, 0, 127) | AK_NEEDSMSB;
682 			knew.tlv.p = db_scale_7bit;
683 			break;
684 		}
685 		case SND_AK4381:
686 			/* register 3 & 4 */
687 			knew.private_value =
688 				AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255);
689 			knew.tlv.p = db_scale_linear;
690 			break;
691 		default:
692 			return -EINVAL;
693 		}
694 
695 		err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
696 		if (err < 0)
697 			return err;
698 
699 		idx += num_stereo;
700 		mixer_ch++;
701 	}
702 	return 0;
703 }
704 
705 static int build_adc_controls(struct snd_akm4xxx *ak)
706 {
707 	int idx, err, mixer_ch, num_stereo;
708 	struct snd_kcontrol_new knew;
709 
710 	mixer_ch = 0;
711 	for (idx = 0; idx < ak->num_adcs;) {
712 		memset(&knew, 0, sizeof(knew));
713 		if (! ak->adc_info || ! ak->adc_info[mixer_ch].name) {
714 			knew.name = "ADC Volume";
715 			knew.index = mixer_ch + ak->idx_offset * 2;
716 			num_stereo = 1;
717 		} else {
718 			knew.name = ak->adc_info[mixer_ch].name;
719 			num_stereo = ak->adc_info[mixer_ch].num_channels;
720 		}
721 		knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
722 		knew.count = 1;
723 		knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
724 			SNDRV_CTL_ELEM_ACCESS_TLV_READ;
725 		if (num_stereo == 2) {
726 			knew.info = snd_akm4xxx_stereo_volume_info;
727 			knew.get = snd_akm4xxx_stereo_volume_get;
728 			knew.put = snd_akm4xxx_stereo_volume_put;
729 		} else {
730 			knew.info = snd_akm4xxx_volume_info;
731 			knew.get = snd_akm4xxx_volume_get;
732 			knew.put = snd_akm4xxx_volume_put;
733 		}
734 		/* register 4 & 5 */
735 		if (ak->type == SND_AK5365)
736 			knew.private_value =
737 				AK_COMPOSE(idx/2, (idx%2) + 4, 0, 151) |
738 				AK_VOL_CVT | AK_IPGA;
739 		else
740 			knew.private_value =
741 				AK_COMPOSE(idx/2, (idx%2) + 4, 0, 163) |
742 				AK_VOL_CVT | AK_IPGA;
743 		knew.tlv.p = db_scale_vol_datt;
744 		err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
745 		if (err < 0)
746 			return err;
747 
748 		if (ak->type == SND_AK5365 && (idx % 2) == 0) {
749 			if (! ak->adc_info ||
750 			    ! ak->adc_info[mixer_ch].switch_name) {
751 				knew.name = "Capture Switch";
752 				knew.index = mixer_ch + ak->idx_offset * 2;
753 			} else
754 				knew.name = ak->adc_info[mixer_ch].switch_name;
755 			knew.info = ak4xxx_switch_info;
756 			knew.get = ak4xxx_switch_get;
757 			knew.put = ak4xxx_switch_put;
758 			knew.access = 0;
759 			/* register 2, bit 0 (SMUTE): 0 = normal operation,
760 			   1 = mute */
761 			knew.private_value =
762 				AK_COMPOSE(idx/2, 2, 0, 0) | AK_INVERT;
763 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
764 			if (err < 0)
765 				return err;
766 
767 			memset(&knew, 0, sizeof(knew));
768 			knew.name = ak->adc_info[mixer_ch].selector_name;
769 			if (!knew.name) {
770 				knew.name = "Capture Channel";
771 				knew.index = mixer_ch + ak->idx_offset * 2;
772 			}
773 
774 			knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
775 			knew.info = ak4xxx_capture_source_info;
776 			knew.get = ak4xxx_capture_source_get;
777 			knew.put = ak4xxx_capture_source_put;
778 			knew.access = 0;
779 			/* input selector control: reg. 1, bits 0-2.
780 			 * mis-use 'shift' to pass mixer_ch */
781 			knew.private_value
782 				= AK_COMPOSE(idx/2, 1, mixer_ch, 0x07);
783 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
784 			if (err < 0)
785 				return err;
786 		}
787 
788 		idx += num_stereo;
789 		mixer_ch++;
790 	}
791 	return 0;
792 }
793 
794 static int build_deemphasis(struct snd_akm4xxx *ak, int num_emphs)
795 {
796 	int idx, err;
797 	struct snd_kcontrol_new knew;
798 
799 	for (idx = 0; idx < num_emphs; idx++) {
800 		memset(&knew, 0, sizeof(knew));
801 		knew.name = "Deemphasis";
802 		knew.index = idx + ak->idx_offset;
803 		knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
804 		knew.count = 1;
805 		knew.info = snd_akm4xxx_deemphasis_info;
806 		knew.get = snd_akm4xxx_deemphasis_get;
807 		knew.put = snd_akm4xxx_deemphasis_put;
808 		switch (ak->type) {
809 		case SND_AK4524:
810 		case SND_AK4528:
811 			/* register 3 */
812 			knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
813 			break;
814 		case SND_AK4529: {
815 			int shift = idx == 3 ? 6 : (2 - idx) * 2;
816 			/* register 8 with shift */
817 			knew.private_value = AK_COMPOSE(0, 8, shift, 0);
818 			break;
819 		}
820 		case SND_AK4355:
821 		case SND_AK4358:
822 			knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
823 			break;
824 		case SND_AK4381:
825 			knew.private_value = AK_COMPOSE(idx, 1, 1, 0);
826 			break;
827 		default:
828 			return -EINVAL;
829 		}
830 		err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
831 		if (err < 0)
832 			return err;
833 	}
834 	return 0;
835 }
836 
837 int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
838 {
839 	int err, num_emphs;
840 
841 	err = build_dac_controls(ak);
842 	if (err < 0)
843 		return err;
844 
845 	err = build_adc_controls(ak);
846 	if (err < 0)
847 		return err;
848 
849 	if (ak->type == SND_AK4355 || ak->type == SND_AK4358)
850 		num_emphs = 1;
851 	else
852 		num_emphs = ak->num_dacs / 2;
853 	err = build_deemphasis(ak, num_emphs);
854 	if (err < 0)
855 		return err;
856 
857 	return 0;
858 }
859 
860 EXPORT_SYMBOL(snd_akm4xxx_build_controls);
861 
862 static int __init alsa_akm4xxx_module_init(void)
863 {
864 	return 0;
865 }
866 
867 static void __exit alsa_akm4xxx_module_exit(void)
868 {
869 }
870 
871 module_init(alsa_akm4xxx_module_init)
872 module_exit(alsa_akm4xxx_module_exit)
873