xref: /openbmc/linux/sound/i2c/other/ak4xxx-adda.c (revision 0d456bad)
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 <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 char *texts[4] = {
469 		"44.1kHz", "Off", "48kHz", "32kHz",
470 	};
471 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
472 	uinfo->count = 1;
473 	uinfo->value.enumerated.items = 4;
474 	if (uinfo->value.enumerated.item >= 4)
475 		uinfo->value.enumerated.item = 3;
476 	strcpy(uinfo->value.enumerated.name,
477 	       texts[uinfo->value.enumerated.item]);
478 	return 0;
479 }
480 
481 static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol,
482 				      struct snd_ctl_elem_value *ucontrol)
483 {
484 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
485 	int chip = AK_GET_CHIP(kcontrol->private_value);
486 	int addr = AK_GET_ADDR(kcontrol->private_value);
487 	int shift = AK_GET_SHIFT(kcontrol->private_value);
488 	ucontrol->value.enumerated.item[0] =
489 		(snd_akm4xxx_get(ak, chip, addr) >> shift) & 3;
490 	return 0;
491 }
492 
493 static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol,
494 				      struct snd_ctl_elem_value *ucontrol)
495 {
496 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
497 	int chip = AK_GET_CHIP(kcontrol->private_value);
498 	int addr = AK_GET_ADDR(kcontrol->private_value);
499 	int shift = AK_GET_SHIFT(kcontrol->private_value);
500 	unsigned char nval = ucontrol->value.enumerated.item[0] & 3;
501 	int change;
502 
503 	nval = (nval << shift) |
504 		(snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
505 	change = snd_akm4xxx_get(ak, chip, addr) != nval;
506 	if (change)
507 		snd_akm4xxx_write(ak, chip, addr, nval);
508 	return change;
509 }
510 
511 #define ak4xxx_switch_info	snd_ctl_boolean_mono_info
512 
513 static int ak4xxx_switch_get(struct snd_kcontrol *kcontrol,
514 			     struct snd_ctl_elem_value *ucontrol)
515 {
516 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
517 	int chip = AK_GET_CHIP(kcontrol->private_value);
518 	int addr = AK_GET_ADDR(kcontrol->private_value);
519 	int shift = AK_GET_SHIFT(kcontrol->private_value);
520 	int invert = AK_GET_INVERT(kcontrol->private_value);
521 	/* we observe the (1<<shift) bit only */
522 	unsigned char val = snd_akm4xxx_get(ak, chip, addr) & (1<<shift);
523 	if (invert)
524 		val = ! val;
525 	ucontrol->value.integer.value[0] = (val & (1<<shift)) != 0;
526 	return 0;
527 }
528 
529 static int ak4xxx_switch_put(struct snd_kcontrol *kcontrol,
530 			     struct snd_ctl_elem_value *ucontrol)
531 {
532 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
533 	int chip = AK_GET_CHIP(kcontrol->private_value);
534 	int addr = AK_GET_ADDR(kcontrol->private_value);
535 	int shift = AK_GET_SHIFT(kcontrol->private_value);
536 	int invert = AK_GET_INVERT(kcontrol->private_value);
537 	long flag = ucontrol->value.integer.value[0];
538 	unsigned char val, oval;
539 	int change;
540 
541 	if (invert)
542 		flag = ! flag;
543 	oval = snd_akm4xxx_get(ak, chip, addr);
544 	if (flag)
545 		val = oval | (1<<shift);
546 	else
547 		val = oval & ~(1<<shift);
548 	change = (oval != val);
549 	if (change)
550 		snd_akm4xxx_write(ak, chip, addr, val);
551 	return change;
552 }
553 
554 #define AK5365_NUM_INPUTS 5
555 
556 static int ak4xxx_capture_num_inputs(struct snd_akm4xxx *ak, int mixer_ch)
557 {
558 	int num_names;
559 	const char **input_names;
560 
561 	input_names = ak->adc_info[mixer_ch].input_names;
562 	num_names = 0;
563 	while (num_names < AK5365_NUM_INPUTS && input_names[num_names])
564 		++num_names;
565 	return num_names;
566 }
567 
568 static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
569 				      struct snd_ctl_elem_info *uinfo)
570 {
571 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
572 	int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
573 	const char **input_names;
574 	int  num_names, idx;
575 
576 	num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
577 	if (!num_names)
578 		return -EINVAL;
579 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
580 	uinfo->count = 1;
581 	uinfo->value.enumerated.items = num_names;
582 	idx = uinfo->value.enumerated.item;
583 	if (idx >= num_names)
584 		return -EINVAL;
585 	input_names = ak->adc_info[mixer_ch].input_names;
586 	strncpy(uinfo->value.enumerated.name, input_names[idx],
587 		sizeof(uinfo->value.enumerated.name));
588 	return 0;
589 }
590 
591 static int ak4xxx_capture_source_get(struct snd_kcontrol *kcontrol,
592 				     struct snd_ctl_elem_value *ucontrol)
593 {
594 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
595 	int chip = AK_GET_CHIP(kcontrol->private_value);
596 	int addr = AK_GET_ADDR(kcontrol->private_value);
597 	int mask = AK_GET_MASK(kcontrol->private_value);
598 	unsigned char val;
599 
600 	val = snd_akm4xxx_get(ak, chip, addr) & mask;
601 	ucontrol->value.enumerated.item[0] = val;
602 	return 0;
603 }
604 
605 static int ak4xxx_capture_source_put(struct snd_kcontrol *kcontrol,
606 				     struct snd_ctl_elem_value *ucontrol)
607 {
608 	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
609 	int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
610 	int chip = AK_GET_CHIP(kcontrol->private_value);
611 	int addr = AK_GET_ADDR(kcontrol->private_value);
612 	int mask = AK_GET_MASK(kcontrol->private_value);
613 	unsigned char oval, val;
614 	int num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
615 
616 	if (ucontrol->value.enumerated.item[0] >= num_names)
617 		return -EINVAL;
618 
619 	oval = snd_akm4xxx_get(ak, chip, addr);
620 	val = oval & ~mask;
621 	val |= ucontrol->value.enumerated.item[0] & mask;
622 	if (val != oval) {
623 		snd_akm4xxx_write(ak, chip, addr, val);
624 		return 1;
625 	}
626 	return 0;
627 }
628 
629 /*
630  * build AK4xxx controls
631  */
632 
633 static int build_dac_controls(struct snd_akm4xxx *ak)
634 {
635 	int idx, err, mixer_ch, num_stereo;
636 	struct snd_kcontrol_new knew;
637 
638 	mixer_ch = 0;
639 	for (idx = 0; idx < ak->num_dacs; ) {
640 		/* mute control for Revolution 7.1 - AK4381 */
641 		if (ak->type == SND_AK4381
642 				&&  ak->dac_info[mixer_ch].switch_name) {
643 			memset(&knew, 0, sizeof(knew));
644 			knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
645 			knew.count = 1;
646 			knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
647 			knew.name = ak->dac_info[mixer_ch].switch_name;
648 			knew.info = ak4xxx_switch_info;
649 			knew.get = ak4xxx_switch_get;
650 			knew.put = ak4xxx_switch_put;
651 			knew.access = 0;
652 			/* register 1, bit 0 (SMUTE): 0 = normal operation,
653 			   1 = mute */
654 			knew.private_value =
655 				AK_COMPOSE(idx/2, 1, 0, 0) | AK_INVERT;
656 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
657 			if (err < 0)
658 				return err;
659 		}
660 		memset(&knew, 0, sizeof(knew));
661 		if (! ak->dac_info || ! ak->dac_info[mixer_ch].name) {
662 			knew.name = "DAC Volume";
663 			knew.index = mixer_ch + ak->idx_offset * 2;
664 			num_stereo = 1;
665 		} else {
666 			knew.name = ak->dac_info[mixer_ch].name;
667 			num_stereo = ak->dac_info[mixer_ch].num_channels;
668 		}
669 		knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
670 		knew.count = 1;
671 		knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
672 			SNDRV_CTL_ELEM_ACCESS_TLV_READ;
673 		if (num_stereo == 2) {
674 			knew.info = snd_akm4xxx_stereo_volume_info;
675 			knew.get = snd_akm4xxx_stereo_volume_get;
676 			knew.put = snd_akm4xxx_stereo_volume_put;
677 		} else {
678 			knew.info = snd_akm4xxx_volume_info;
679 			knew.get = snd_akm4xxx_volume_get;
680 			knew.put = snd_akm4xxx_volume_put;
681 		}
682 		switch (ak->type) {
683 		case SND_AK4524:
684 			/* register 6 & 7 */
685 			knew.private_value =
686 				AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127) |
687 				AK_VOL_CVT;
688 			knew.tlv.p = db_scale_vol_datt;
689 			break;
690 		case SND_AK4528:
691 			/* register 4 & 5 */
692 			knew.private_value =
693 				AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127) |
694 				AK_VOL_CVT;
695 			knew.tlv.p = db_scale_vol_datt;
696 			break;
697 		case SND_AK4529: {
698 			/* registers 2-7 and b,c */
699 			int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb;
700 			knew.private_value =
701 				AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
702 			knew.tlv.p = db_scale_8bit;
703 			break;
704 		}
705 		case SND_AK4355:
706 			/* register 4-9, chip #0 only */
707 			knew.private_value = AK_COMPOSE(0, idx + 4, 0, 255);
708 			knew.tlv.p = db_scale_8bit;
709 			break;
710 		case SND_AK4358: {
711 			/* register 4-9 and 11-12, chip #0 only */
712 			int  addr = idx < 6 ? idx + 4 : idx + 5;
713 			knew.private_value =
714 				AK_COMPOSE(0, addr, 0, 127) | AK_NEEDSMSB;
715 			knew.tlv.p = db_scale_7bit;
716 			break;
717 		}
718 		case SND_AK4381:
719 			/* register 3 & 4 */
720 			knew.private_value =
721 				AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255);
722 			knew.tlv.p = db_scale_linear;
723 			break;
724 		case SND_AK4620:
725 			/* register 6 & 7 */
726 			knew.private_value =
727 				AK_COMPOSE(idx/2, (idx%2) + 6, 0, 255);
728 			knew.tlv.p = db_scale_linear;
729 			break;
730 		default:
731 			return -EINVAL;
732 		}
733 
734 		err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
735 		if (err < 0)
736 			return err;
737 
738 		idx += num_stereo;
739 		mixer_ch++;
740 	}
741 	return 0;
742 }
743 
744 static int build_adc_controls(struct snd_akm4xxx *ak)
745 {
746 	int idx, err, mixer_ch, num_stereo, max_steps;
747 	struct snd_kcontrol_new knew;
748 
749 	mixer_ch = 0;
750 	if (ak->type == SND_AK4528)
751 		return 0;	/* no controls */
752 	for (idx = 0; idx < ak->num_adcs;) {
753 		memset(&knew, 0, sizeof(knew));
754 		if (! ak->adc_info || ! ak->adc_info[mixer_ch].name) {
755 			knew.name = "ADC Volume";
756 			knew.index = mixer_ch + ak->idx_offset * 2;
757 			num_stereo = 1;
758 		} else {
759 			knew.name = ak->adc_info[mixer_ch].name;
760 			num_stereo = ak->adc_info[mixer_ch].num_channels;
761 		}
762 		knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
763 		knew.count = 1;
764 		knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
765 			SNDRV_CTL_ELEM_ACCESS_TLV_READ;
766 		if (num_stereo == 2) {
767 			knew.info = snd_akm4xxx_stereo_volume_info;
768 			knew.get = snd_akm4xxx_stereo_volume_get;
769 			knew.put = snd_akm4xxx_stereo_volume_put;
770 		} else {
771 			knew.info = snd_akm4xxx_volume_info;
772 			knew.get = snd_akm4xxx_volume_get;
773 			knew.put = snd_akm4xxx_volume_put;
774 		}
775 		/* register 4 & 5 */
776 		if (ak->type == SND_AK5365)
777 			max_steps = 152;
778 		else
779 			max_steps = 164;
780 		knew.private_value =
781 			AK_COMPOSE(idx/2, (idx%2) + 4, 0, max_steps) |
782 			AK_VOL_CVT | AK_IPGA;
783 		knew.tlv.p = db_scale_vol_datt;
784 		err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
785 		if (err < 0)
786 			return err;
787 
788 		if (ak->type == SND_AK5365 && (idx % 2) == 0) {
789 			if (! ak->adc_info ||
790 			    ! ak->adc_info[mixer_ch].switch_name) {
791 				knew.name = "Capture Switch";
792 				knew.index = mixer_ch + ak->idx_offset * 2;
793 			} else
794 				knew.name = ak->adc_info[mixer_ch].switch_name;
795 			knew.info = ak4xxx_switch_info;
796 			knew.get = ak4xxx_switch_get;
797 			knew.put = ak4xxx_switch_put;
798 			knew.access = 0;
799 			/* register 2, bit 0 (SMUTE): 0 = normal operation,
800 			   1 = mute */
801 			knew.private_value =
802 				AK_COMPOSE(idx/2, 2, 0, 0) | AK_INVERT;
803 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
804 			if (err < 0)
805 				return err;
806 
807 			memset(&knew, 0, sizeof(knew));
808 			knew.name = ak->adc_info[mixer_ch].selector_name;
809 			if (!knew.name) {
810 				knew.name = "Capture Channel";
811 				knew.index = mixer_ch + ak->idx_offset * 2;
812 			}
813 
814 			knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
815 			knew.info = ak4xxx_capture_source_info;
816 			knew.get = ak4xxx_capture_source_get;
817 			knew.put = ak4xxx_capture_source_put;
818 			knew.access = 0;
819 			/* input selector control: reg. 1, bits 0-2.
820 			 * mis-use 'shift' to pass mixer_ch */
821 			knew.private_value
822 				= AK_COMPOSE(idx/2, 1, mixer_ch, 0x07);
823 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
824 			if (err < 0)
825 				return err;
826 		}
827 
828 		idx += num_stereo;
829 		mixer_ch++;
830 	}
831 	return 0;
832 }
833 
834 static int build_deemphasis(struct snd_akm4xxx *ak, int num_emphs)
835 {
836 	int idx, err;
837 	struct snd_kcontrol_new knew;
838 
839 	for (idx = 0; idx < num_emphs; idx++) {
840 		memset(&knew, 0, sizeof(knew));
841 		knew.name = "Deemphasis";
842 		knew.index = idx + ak->idx_offset;
843 		knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
844 		knew.count = 1;
845 		knew.info = snd_akm4xxx_deemphasis_info;
846 		knew.get = snd_akm4xxx_deemphasis_get;
847 		knew.put = snd_akm4xxx_deemphasis_put;
848 		switch (ak->type) {
849 		case SND_AK4524:
850 		case SND_AK4528:
851 		case SND_AK4620:
852 			/* register 3 */
853 			knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
854 			break;
855 		case SND_AK4529: {
856 			int shift = idx == 3 ? 6 : (2 - idx) * 2;
857 			/* register 8 with shift */
858 			knew.private_value = AK_COMPOSE(0, 8, shift, 0);
859 			break;
860 		}
861 		case SND_AK4355:
862 		case SND_AK4358:
863 			knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
864 			break;
865 		case SND_AK4381:
866 			knew.private_value = AK_COMPOSE(idx, 1, 1, 0);
867 			break;
868 		default:
869 			return -EINVAL;
870 		}
871 		err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
872 		if (err < 0)
873 			return err;
874 	}
875 	return 0;
876 }
877 
878 #ifdef CONFIG_PROC_FS
879 static void proc_regs_read(struct snd_info_entry *entry,
880 		struct snd_info_buffer *buffer)
881 {
882 	struct snd_akm4xxx *ak = entry->private_data;
883 	int reg, val, chip;
884 	for (chip = 0; chip < ak->num_chips; chip++) {
885 		for (reg = 0; reg < ak->total_regs; reg++) {
886 			val =  snd_akm4xxx_get(ak, chip, reg);
887 			snd_iprintf(buffer, "chip %d: 0x%02x = 0x%02x\n", chip,
888 					reg, val);
889 		}
890 	}
891 }
892 
893 static int proc_init(struct snd_akm4xxx *ak)
894 {
895 	struct snd_info_entry *entry;
896 	int err;
897 	err = snd_card_proc_new(ak->card, ak->name, &entry);
898 	if (err < 0)
899 		return err;
900 	snd_info_set_text_ops(entry, ak, proc_regs_read);
901 	return 0;
902 }
903 #else /* !CONFIG_PROC_FS */
904 static int proc_init(struct snd_akm4xxx *ak) { return 0; }
905 #endif
906 
907 int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
908 {
909 	int err, num_emphs;
910 
911 	err = build_dac_controls(ak);
912 	if (err < 0)
913 		return err;
914 
915 	err = build_adc_controls(ak);
916 	if (err < 0)
917 		return err;
918 	if (ak->type == SND_AK4355 || ak->type == SND_AK4358)
919 		num_emphs = 1;
920 	else if (ak->type == SND_AK4620)
921 		num_emphs = 0;
922 	else
923 		num_emphs = ak->num_dacs / 2;
924 	err = build_deemphasis(ak, num_emphs);
925 	if (err < 0)
926 		return err;
927 	err = proc_init(ak);
928 	if (err < 0)
929 		return err;
930 
931 	return 0;
932 }
933 EXPORT_SYMBOL(snd_akm4xxx_build_controls);
934 
935 static int __init alsa_akm4xxx_module_init(void)
936 {
937 	return 0;
938 }
939 
940 static void __exit alsa_akm4xxx_module_exit(void)
941 {
942 }
943 
944 module_init(alsa_akm4xxx_module_init)
945 module_exit(alsa_akm4xxx_module_exit)
946