2 * ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4358 / AK4381
5 * Copyright (c) 2000-2004 Jaroslav Kysela <perex@suse.cz>,
6 * Takashi Iwai <tiwai@suse.de>
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.
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.
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
24 #include <sound/driver.h>
26 #include <linux/delay.h>
27 #include <linux/interrupt.h>
28 #include <linux/init.h>
29 #include <sound/core.h>
30 #include <sound/control.h>
31 #include <sound/tlv.h>
32 #include <sound/ak4xxx-adda.h>
34 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Takashi Iwai <tiwai@suse.de>");
35 MODULE_DESCRIPTION("Routines for control of AK452x / AK43xx AD/DA converters");
36 MODULE_LICENSE("GPL");
38 /* write the given register and save the data to the cache */
39 void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
42 ak->ops.lock(ak, chip);
43 ak->ops.write(ak, chip, reg, val);
46 snd_akm4xxx_set(ak, chip, reg, val);
47 ak->ops.unlock(ak, chip);
50 EXPORT_SYMBOL(snd_akm4xxx_write);
52 /* reset procedure for AK4524 and AK4528 */
53 static void ak4524_reset(struct snd_akm4xxx *ak, int state)
56 unsigned char reg, maxreg;
58 if (ak->type == SND_AK4528)
62 for (chip = 0; chip < ak->num_dacs/2; chip++) {
63 snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03);
67 for (reg = 0x04; reg < maxreg; reg++)
68 snd_akm4xxx_write(ak, chip, reg,
69 snd_akm4xxx_get(ak, chip, reg));
73 /* reset procedure for AK4355 and AK4358 */
74 static void ak4355_reset(struct snd_akm4xxx *ak, int state)
79 snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
82 for (reg = 0x00; reg < 0x0b; reg++)
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 */
89 /* reset procedure for AK4381 */
90 static void ak4381_reset(struct snd_akm4xxx *ak, int state)
95 for (chip = 0; chip < ak->num_dacs/2; chip++) {
96 snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f);
99 for (reg = 0x01; reg < 0x05; reg++)
100 snd_akm4xxx_write(ak, chip, reg,
101 snd_akm4xxx_get(ak, chip, reg));
106 * reset the AKM codecs
107 * @state: 1 = reset codec, 0 = restore the registers
109 * assert the reset operation and restores the register values to the chips.
111 void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
116 ak4524_reset(ak, state);
119 /* FIXME: needed for ak4529? */
123 ak4355_reset(ak, state);
126 ak4381_reset(ak, state);
133 EXPORT_SYMBOL(snd_akm4xxx_reset);
137 * Volume conversion table for non-linear volumes
138 * from -63.5dB (mute) to 0dB step 0.5dB
140 * Used for AK4524 input/ouput attenuation, AK4528, and
141 * AK5365 input attenuation
143 static unsigned char vol_cvt_datt[128] = {
144 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04,
145 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06,
146 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x0a,
147 0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f,
148 0x10, 0x10, 0x11, 0x12, 0x12, 0x13, 0x13, 0x14,
149 0x15, 0x16, 0x17, 0x17, 0x18, 0x19, 0x1a, 0x1c,
150 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x23,
151 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2d,
152 0x2e, 0x30, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
153 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3e, 0x3f, 0x40,
154 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x4a,
155 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54,
156 0x55, 0x56, 0x58, 0x59, 0x5b, 0x5c, 0x5e, 0x5f,
157 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x67, 0x69,
158 0x6a, 0x6c, 0x6d, 0x6f, 0x70, 0x71, 0x72, 0x73,
159 0x75, 0x76, 0x77, 0x79, 0x7a, 0x7c, 0x7d, 0x7f,
165 static DECLARE_TLV_DB_SCALE(db_scale_vol_datt, -6350, 50, 1);
166 static DECLARE_TLV_DB_SCALE(db_scale_8bit, -12750, 50, 1);
167 static DECLARE_TLV_DB_SCALE(db_scale_7bit, -6350, 50, 1);
168 static DECLARE_TLV_DB_LINEAR(db_scale_linear, TLV_DB_GAIN_MUTE, 0);
171 * initialize all the ak4xxx chips
173 void snd_akm4xxx_init(struct snd_akm4xxx *ak)
175 static unsigned char inits_ak4524[] = {
176 0x00, 0x07, /* 0: all power up */
177 0x01, 0x00, /* 1: ADC/DAC reset */
178 0x02, 0x60, /* 2: 24bit I2S */
179 0x03, 0x19, /* 3: deemphasis off */
180 0x01, 0x03, /* 1: ADC/DAC enable */
181 0x04, 0x00, /* 4: ADC left muted */
182 0x05, 0x00, /* 5: ADC right muted */
183 0x06, 0x00, /* 6: DAC left muted */
184 0x07, 0x00, /* 7: DAC right muted */
187 static unsigned char inits_ak4528[] = {
188 0x00, 0x07, /* 0: all power up */
189 0x01, 0x00, /* 1: ADC/DAC reset */
190 0x02, 0x60, /* 2: 24bit I2S */
191 0x03, 0x0d, /* 3: deemphasis off, turn LR highpass filters on */
192 0x01, 0x03, /* 1: ADC/DAC enable */
193 0x04, 0x00, /* 4: ADC left muted */
194 0x05, 0x00, /* 5: ADC right muted */
197 static unsigned char inits_ak4529[] = {
198 0x09, 0x01, /* 9: ATS=0, RSTN=1 */
199 0x0a, 0x3f, /* A: all power up, no zero/overflow detection */
200 0x00, 0x0c, /* 0: TDM=0, 24bit I2S, SMUTE=0 */
201 0x01, 0x00, /* 1: ACKS=0, ADC, loop off */
202 0x02, 0xff, /* 2: LOUT1 muted */
203 0x03, 0xff, /* 3: ROUT1 muted */
204 0x04, 0xff, /* 4: LOUT2 muted */
205 0x05, 0xff, /* 5: ROUT2 muted */
206 0x06, 0xff, /* 6: LOUT3 muted */
207 0x07, 0xff, /* 7: ROUT3 muted */
208 0x0b, 0xff, /* B: LOUT4 muted */
209 0x0c, 0xff, /* C: ROUT4 muted */
210 0x08, 0x55, /* 8: deemphasis all off */
213 static unsigned char inits_ak4355[] = {
214 0x01, 0x02, /* 1: reset and soft-mute */
215 0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
216 * disable DZF, sharp roll-off, RSTN#=0 */
217 0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */
218 // 0x02, 0x2e, /* quad speed */
219 0x03, 0x01, /* 3: de-emphasis off */
220 0x04, 0x00, /* 4: LOUT1 volume muted */
221 0x05, 0x00, /* 5: ROUT1 volume muted */
222 0x06, 0x00, /* 6: LOUT2 volume muted */
223 0x07, 0x00, /* 7: ROUT2 volume muted */
224 0x08, 0x00, /* 8: LOUT3 volume muted */
225 0x09, 0x00, /* 9: ROUT3 volume muted */
226 0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
227 0x01, 0x01, /* 1: un-reset, unmute */
230 static unsigned char inits_ak4358[] = {
231 0x01, 0x02, /* 1: reset and soft-mute */
232 0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
233 * disable DZF, sharp roll-off, RSTN#=0 */
234 0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */
235 // 0x02, 0x2e, /* quad speed */
236 0x03, 0x01, /* 3: de-emphasis off */
237 0x04, 0x00, /* 4: LOUT1 volume muted */
238 0x05, 0x00, /* 5: ROUT1 volume muted */
239 0x06, 0x00, /* 6: LOUT2 volume muted */
240 0x07, 0x00, /* 7: ROUT2 volume muted */
241 0x08, 0x00, /* 8: LOUT3 volume muted */
242 0x09, 0x00, /* 9: ROUT3 volume muted */
243 0x0b, 0x00, /* b: LOUT4 volume muted */
244 0x0c, 0x00, /* c: ROUT4 volume muted */
245 0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
246 0x01, 0x01, /* 1: un-reset, unmute */
249 static unsigned char inits_ak4381[] = {
250 0x00, 0x0c, /* 0: mode3(i2s), disable auto-clock detect */
251 0x01, 0x02, /* 1: de-emphasis off, normal speed,
252 * sharp roll-off, DZF off */
253 // 0x01, 0x12, /* quad speed */
254 0x02, 0x00, /* 2: DZF disabled */
255 0x03, 0x00, /* 3: LATT 0 */
256 0x04, 0x00, /* 4: RATT 0 */
257 0x00, 0x0f, /* 0: power-up, un-reset */
262 unsigned char *ptr, reg, data, *inits;
264 memset(ak->images, 0, sizeof(ak->images));
265 memset(ak->volumes, 0, sizeof(ak->volumes));
269 inits = inits_ak4524;
270 num_chips = ak->num_dacs / 2;
273 inits = inits_ak4528;
274 num_chips = ak->num_dacs / 2;
277 inits = inits_ak4529;
281 inits = inits_ak4355;
285 inits = inits_ak4358;
289 inits = inits_ak4381;
290 num_chips = ak->num_dacs / 2;
293 /* FIXME: any init sequence? */
300 for (chip = 0; chip < num_chips; chip++) {
302 while (*ptr != 0xff) {
305 snd_akm4xxx_write(ak, chip, reg, data);
310 EXPORT_SYMBOL(snd_akm4xxx_init);
315 #define AK_IPGA (1<<20) /* including IPGA */
316 #define AK_VOL_CVT (1<<21) /* need dB conversion */
317 #define AK_NEEDSMSB (1<<22) /* need MSB update bit */
318 #define AK_INVERT (1<<23) /* data is inverted */
319 #define AK_GET_CHIP(val) (((val) >> 8) & 0xff)
320 #define AK_GET_ADDR(val) ((val) & 0xff)
321 #define AK_GET_SHIFT(val) (((val) >> 16) & 0x0f)
322 #define AK_GET_VOL_CVT(val) (((val) >> 21) & 1)
323 #define AK_GET_IPGA(val) (((val) >> 20) & 1)
324 #define AK_GET_NEEDSMSB(val) (((val) >> 22) & 1)
325 #define AK_GET_INVERT(val) (((val) >> 23) & 1)
326 #define AK_GET_MASK(val) (((val) >> 24) & 0xff)
327 #define AK_COMPOSE(chip,addr,shift,mask) \
328 (((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24))
330 static int snd_akm4xxx_volume_info(struct snd_kcontrol *kcontrol,
331 struct snd_ctl_elem_info *uinfo)
333 unsigned int mask = AK_GET_MASK(kcontrol->private_value);
335 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
337 uinfo->value.integer.min = 0;
338 uinfo->value.integer.max = mask;
342 static int snd_akm4xxx_volume_get(struct snd_kcontrol *kcontrol,
343 struct snd_ctl_elem_value *ucontrol)
345 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
346 int chip = AK_GET_CHIP(kcontrol->private_value);
347 int addr = AK_GET_ADDR(kcontrol->private_value);
349 ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
353 static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr,
356 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
357 unsigned int mask = AK_GET_MASK(kcontrol->private_value);
358 int chip = AK_GET_CHIP(kcontrol->private_value);
360 if (snd_akm4xxx_get_vol(ak, chip, addr) == nval)
363 snd_akm4xxx_set_vol(ak, chip, addr, nval);
364 if (AK_GET_VOL_CVT(kcontrol->private_value) && nval < 128)
365 nval = vol_cvt_datt[nval];
366 if (AK_GET_IPGA(kcontrol->private_value) && nval >= 128)
367 nval++; /* need to correct + 1 since both 127 and 128 are 0dB */
368 if (AK_GET_INVERT(kcontrol->private_value))
370 if (AK_GET_NEEDSMSB(kcontrol->private_value))
372 snd_akm4xxx_write(ak, chip, addr, nval);
376 static int snd_akm4xxx_volume_put(struct snd_kcontrol *kcontrol,
377 struct snd_ctl_elem_value *ucontrol)
379 return put_ak_reg(kcontrol, AK_GET_ADDR(kcontrol->private_value),
380 ucontrol->value.integer.value[0]);
383 static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol *kcontrol,
384 struct snd_ctl_elem_info *uinfo)
386 unsigned int mask = AK_GET_MASK(kcontrol->private_value);
388 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
390 uinfo->value.integer.min = 0;
391 uinfo->value.integer.max = mask;
395 static int snd_akm4xxx_stereo_volume_get(struct snd_kcontrol *kcontrol,
396 struct snd_ctl_elem_value *ucontrol)
398 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
399 int chip = AK_GET_CHIP(kcontrol->private_value);
400 int addr = AK_GET_ADDR(kcontrol->private_value);
402 ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
403 ucontrol->value.integer.value[1] = snd_akm4xxx_get_vol(ak, chip, addr+1);
407 static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol *kcontrol,
408 struct snd_ctl_elem_value *ucontrol)
410 int addr = AK_GET_ADDR(kcontrol->private_value);
413 change = put_ak_reg(kcontrol, addr, ucontrol->value.integer.value[0]);
414 change |= put_ak_reg(kcontrol, addr + 1,
415 ucontrol->value.integer.value[1]);
419 static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol *kcontrol,
420 struct snd_ctl_elem_info *uinfo)
422 static char *texts[4] = {
423 "44.1kHz", "Off", "48kHz", "32kHz",
425 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
427 uinfo->value.enumerated.items = 4;
428 if (uinfo->value.enumerated.item >= 4)
429 uinfo->value.enumerated.item = 3;
430 strcpy(uinfo->value.enumerated.name,
431 texts[uinfo->value.enumerated.item]);
435 static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol,
436 struct snd_ctl_elem_value *ucontrol)
438 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
439 int chip = AK_GET_CHIP(kcontrol->private_value);
440 int addr = AK_GET_ADDR(kcontrol->private_value);
441 int shift = AK_GET_SHIFT(kcontrol->private_value);
442 ucontrol->value.enumerated.item[0] =
443 (snd_akm4xxx_get(ak, chip, addr) >> shift) & 3;
447 static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol,
448 struct snd_ctl_elem_value *ucontrol)
450 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
451 int chip = AK_GET_CHIP(kcontrol->private_value);
452 int addr = AK_GET_ADDR(kcontrol->private_value);
453 int shift = AK_GET_SHIFT(kcontrol->private_value);
454 unsigned char nval = ucontrol->value.enumerated.item[0] & 3;
457 nval = (nval << shift) |
458 (snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
459 change = snd_akm4xxx_get(ak, chip, addr) != nval;
461 snd_akm4xxx_write(ak, chip, addr, nval);
465 static int ak4xxx_switch_info(struct snd_kcontrol *kcontrol,
466 struct snd_ctl_elem_info *uinfo)
468 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
470 uinfo->value.integer.min = 0;
471 uinfo->value.integer.max = 1;
475 static int ak4xxx_switch_get(struct snd_kcontrol *kcontrol,
476 struct snd_ctl_elem_value *ucontrol)
478 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
479 int chip = AK_GET_CHIP(kcontrol->private_value);
480 int addr = AK_GET_ADDR(kcontrol->private_value);
481 int shift = AK_GET_SHIFT(kcontrol->private_value);
482 int invert = AK_GET_INVERT(kcontrol->private_value);
483 unsigned char val = snd_akm4xxx_get(ak, chip, addr);
487 ucontrol->value.integer.value[0] = (val & (1<<shift)) != 0;
491 static int ak4xxx_switch_put(struct snd_kcontrol *kcontrol,
492 struct snd_ctl_elem_value *ucontrol)
494 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
495 int chip = AK_GET_CHIP(kcontrol->private_value);
496 int addr = AK_GET_ADDR(kcontrol->private_value);
497 int shift = AK_GET_SHIFT(kcontrol->private_value);
498 int invert = AK_GET_INVERT(kcontrol->private_value);
499 long flag = ucontrol->value.integer.value[0];
500 unsigned char val, oval;
505 oval = snd_akm4xxx_get(ak, chip, addr);
507 val = oval | (1<<shift);
509 val = oval & ~(1<<shift);
510 change = (oval != val);
512 snd_akm4xxx_write(ak, chip, addr, val);
516 #define AK5365_NUM_INPUTS 5
518 static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
519 struct snd_ctl_elem_info *uinfo)
521 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
522 int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
523 const char **input_names;
526 input_names = ak->adc_info[mixer_ch].input_names;
529 while (num_names < AK5365_NUM_INPUTS && input_names[num_names])
532 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
534 uinfo->value.enumerated.items = num_names;
535 idx = uinfo->value.enumerated.item;
536 if (idx >= num_names)
538 strncpy(uinfo->value.enumerated.name, input_names[idx],
539 sizeof(uinfo->value.enumerated.name));
543 static int ak4xxx_capture_source_get(struct snd_kcontrol *kcontrol,
544 struct snd_ctl_elem_value *ucontrol)
546 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
547 int chip = AK_GET_CHIP(kcontrol->private_value);
548 int addr = AK_GET_ADDR(kcontrol->private_value);
549 int mask = AK_GET_MASK(kcontrol->private_value);
552 val = snd_akm4xxx_get(ak, chip, addr) & mask;
553 ucontrol->value.enumerated.item[0] = val;
557 static int ak4xxx_capture_source_put(struct snd_kcontrol *kcontrol,
558 struct snd_ctl_elem_value *ucontrol)
560 struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
561 int chip = AK_GET_CHIP(kcontrol->private_value);
562 int addr = AK_GET_ADDR(kcontrol->private_value);
563 int mask = AK_GET_MASK(kcontrol->private_value);
564 unsigned char oval, val;
566 oval = snd_akm4xxx_get(ak, chip, addr);
568 val |= ucontrol->value.enumerated.item[0] & mask;
570 snd_akm4xxx_write(ak, chip, addr, val);
577 * build AK4xxx controls
580 static int build_dac_controls(struct snd_akm4xxx *ak)
582 int idx, err, mixer_ch, num_stereo;
583 struct snd_kcontrol_new knew;
586 for (idx = 0; idx < ak->num_dacs; ) {
587 memset(&knew, 0, sizeof(knew));
588 if (! ak->dac_info || ! ak->dac_info[mixer_ch].name) {
589 knew.name = "DAC Volume";
590 knew.index = mixer_ch + ak->idx_offset * 2;
593 knew.name = ak->dac_info[mixer_ch].name;
594 num_stereo = ak->dac_info[mixer_ch].num_channels;
596 knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
598 knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
599 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
600 if (num_stereo == 2) {
601 knew.info = snd_akm4xxx_stereo_volume_info;
602 knew.get = snd_akm4xxx_stereo_volume_get;
603 knew.put = snd_akm4xxx_stereo_volume_put;
605 knew.info = snd_akm4xxx_volume_info;
606 knew.get = snd_akm4xxx_volume_get;
607 knew.put = snd_akm4xxx_volume_put;
613 AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127) |
615 knew.tlv.p = db_scale_vol_datt;
620 AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127) |
622 knew.tlv.p = db_scale_vol_datt;
625 /* registers 2-7 and b,c */
626 int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb;
628 AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
629 knew.tlv.p = db_scale_8bit;
633 /* register 4-9, chip #0 only */
634 knew.private_value = AK_COMPOSE(0, idx + 4, 0, 255);
635 knew.tlv.p = db_scale_8bit;
638 /* register 4-9 and 11-12, chip #0 only */
639 int addr = idx < 6 ? idx + 4 : idx + 5;
641 AK_COMPOSE(0, addr, 0, 127) | AK_NEEDSMSB;
642 knew.tlv.p = db_scale_7bit;
648 AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255);
649 knew.tlv.p = db_scale_linear;
655 err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
665 static int build_adc_controls(struct snd_akm4xxx *ak)
667 int idx, err, mixer_ch, num_stereo;
668 struct snd_kcontrol_new knew;
671 for (idx = 0; idx < ak->num_adcs;) {
672 memset(&knew, 0, sizeof(knew));
673 if (! ak->adc_info || ! ak->adc_info[mixer_ch].name) {
674 knew.name = "ADC Volume";
675 knew.index = mixer_ch + ak->idx_offset * 2;
678 knew.name = ak->adc_info[mixer_ch].name;
679 num_stereo = ak->adc_info[mixer_ch].num_channels;
681 knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
683 knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
684 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
685 if (num_stereo == 2) {
686 knew.info = snd_akm4xxx_stereo_volume_info;
687 knew.get = snd_akm4xxx_stereo_volume_get;
688 knew.put = snd_akm4xxx_stereo_volume_put;
690 knew.info = snd_akm4xxx_volume_info;
691 knew.get = snd_akm4xxx_volume_get;
692 knew.put = snd_akm4xxx_volume_put;
695 if (ak->type == SND_AK5365)
697 AK_COMPOSE(idx/2, (idx%2) + 4, 0, 151) |
698 AK_VOL_CVT | AK_IPGA;
701 AK_COMPOSE(idx/2, (idx%2) + 4, 0, 163) |
702 AK_VOL_CVT | AK_IPGA;
703 knew.tlv.p = db_scale_vol_datt;
704 err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
708 if (ak->type == SND_AK5365 && (idx % 2) == 0) {
709 if (! ak->adc_info ||
710 ! ak->adc_info[mixer_ch].switch_name) {
711 knew.name = "Capture Switch";
712 knew.index = mixer_ch + ak->idx_offset * 2;
714 knew.name = ak->adc_info[mixer_ch].switch_name;
715 knew.info = ak4xxx_switch_info;
716 knew.get = ak4xxx_switch_get;
717 knew.put = ak4xxx_switch_put;
719 /* register 2, bit 0 (SMUTE): 0 = normal operation,
722 AK_COMPOSE(idx/2, 2, 0, 0) | AK_INVERT;
723 err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
727 memset(&knew, 0, sizeof(knew));
728 knew.name = ak->adc_info[mixer_ch].selector_name;
730 knew.name = "Capture Channel";
731 knew.index = mixer_ch + ak->idx_offset * 2;
734 knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
735 knew.info = ak4xxx_capture_source_info;
736 knew.get = ak4xxx_capture_source_get;
737 knew.put = ak4xxx_capture_source_put;
739 /* input selector control: reg. 1, bits 0-2.
740 * mis-use 'shift' to pass mixer_ch */
742 = AK_COMPOSE(idx/2, 1, mixer_ch, 0x07);
743 err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
754 static int build_deemphasis(struct snd_akm4xxx *ak, int num_emphs)
757 struct snd_kcontrol_new knew;
759 for (idx = 0; idx < num_emphs; idx++) {
760 memset(&knew, 0, sizeof(knew));
761 knew.name = "Deemphasis";
762 knew.index = idx + ak->idx_offset;
763 knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
765 knew.info = snd_akm4xxx_deemphasis_info;
766 knew.get = snd_akm4xxx_deemphasis_get;
767 knew.put = snd_akm4xxx_deemphasis_put;
772 knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
775 int shift = idx == 3 ? 6 : (2 - idx) * 2;
776 /* register 8 with shift */
777 knew.private_value = AK_COMPOSE(0, 8, shift, 0);
782 knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
785 knew.private_value = AK_COMPOSE(idx, 1, 1, 0);
790 err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
797 int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
801 err = build_dac_controls(ak);
805 err = build_adc_controls(ak);
809 if (ak->type == SND_AK4355 || ak->type == SND_AK4358)
812 num_emphs = ak->num_dacs / 2;
813 err = build_deemphasis(ak, num_emphs);
820 EXPORT_SYMBOL(snd_akm4xxx_build_controls);
822 static int __init alsa_akm4xxx_module_init(void)
827 static void __exit alsa_akm4xxx_module_exit(void)
831 module_init(alsa_akm4xxx_module_init)
832 module_exit(alsa_akm4xxx_module_exit)