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