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 const 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 const DECLARE_TLV_DB_SCALE(db_scale_vol_datt
, -6350, 50, 1);
166 static const DECLARE_TLV_DB_SCALE(db_scale_8bit
, -12750, 50, 1);
167 static const DECLARE_TLV_DB_SCALE(db_scale_7bit
, -6350, 50, 1);
168 static const 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 const 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 const 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 const 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 const 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 const 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 const 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 const unsigned char *ptr
, *inits
;
263 unsigned char reg
, data
;
265 memset(ak
->images
, 0, sizeof(ak
->images
));
266 memset(ak
->volumes
, 0, sizeof(ak
->volumes
));
270 inits
= inits_ak4524
;
271 num_chips
= ak
->num_dacs
/ 2;
274 inits
= inits_ak4528
;
275 num_chips
= ak
->num_dacs
/ 2;
278 inits
= inits_ak4529
;
282 inits
= inits_ak4355
;
286 inits
= inits_ak4358
;
290 inits
= inits_ak4381
;
291 num_chips
= ak
->num_dacs
/ 2;
294 /* FIXME: any init sequence? */
301 for (chip
= 0; chip
< num_chips
; chip
++) {
303 while (*ptr
!= 0xff) {
306 snd_akm4xxx_write(ak
, chip
, reg
, data
);
311 EXPORT_SYMBOL(snd_akm4xxx_init
);
316 #define AK_IPGA (1<<20) /* including IPGA */
317 #define AK_VOL_CVT (1<<21) /* need dB conversion */
318 #define AK_NEEDSMSB (1<<22) /* need MSB update bit */
319 #define AK_INVERT (1<<23) /* data is inverted */
320 #define AK_GET_CHIP(val) (((val) >> 8) & 0xff)
321 #define AK_GET_ADDR(val) ((val) & 0xff)
322 #define AK_GET_SHIFT(val) (((val) >> 16) & 0x0f)
323 #define AK_GET_VOL_CVT(val) (((val) >> 21) & 1)
324 #define AK_GET_IPGA(val) (((val) >> 20) & 1)
325 #define AK_GET_NEEDSMSB(val) (((val) >> 22) & 1)
326 #define AK_GET_INVERT(val) (((val) >> 23) & 1)
327 #define AK_GET_MASK(val) (((val) >> 24) & 0xff)
328 #define AK_COMPOSE(chip,addr,shift,mask) \
329 (((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24))
331 static int snd_akm4xxx_volume_info(struct snd_kcontrol
*kcontrol
,
332 struct snd_ctl_elem_info
*uinfo
)
334 unsigned int mask
= AK_GET_MASK(kcontrol
->private_value
);
336 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
338 uinfo
->value
.integer
.min
= 0;
339 uinfo
->value
.integer
.max
= mask
;
343 static int snd_akm4xxx_volume_get(struct snd_kcontrol
*kcontrol
,
344 struct snd_ctl_elem_value
*ucontrol
)
346 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
347 int chip
= AK_GET_CHIP(kcontrol
->private_value
);
348 int addr
= AK_GET_ADDR(kcontrol
->private_value
);
350 ucontrol
->value
.integer
.value
[0] = snd_akm4xxx_get_vol(ak
, chip
, addr
);
354 static int put_ak_reg(struct snd_kcontrol
*kcontrol
, int addr
,
357 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
358 unsigned int mask
= AK_GET_MASK(kcontrol
->private_value
);
359 int chip
= AK_GET_CHIP(kcontrol
->private_value
);
361 if (snd_akm4xxx_get_vol(ak
, chip
, addr
) == nval
)
364 snd_akm4xxx_set_vol(ak
, chip
, addr
, nval
);
365 if (AK_GET_VOL_CVT(kcontrol
->private_value
) && nval
< 128)
366 nval
= vol_cvt_datt
[nval
];
367 if (AK_GET_IPGA(kcontrol
->private_value
) && nval
>= 128)
368 nval
++; /* need to correct + 1 since both 127 and 128 are 0dB */
369 if (AK_GET_INVERT(kcontrol
->private_value
))
371 if (AK_GET_NEEDSMSB(kcontrol
->private_value
))
373 snd_akm4xxx_write(ak
, chip
, addr
, nval
);
377 static int snd_akm4xxx_volume_put(struct snd_kcontrol
*kcontrol
,
378 struct snd_ctl_elem_value
*ucontrol
)
380 return put_ak_reg(kcontrol
, AK_GET_ADDR(kcontrol
->private_value
),
381 ucontrol
->value
.integer
.value
[0]);
384 static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol
*kcontrol
,
385 struct snd_ctl_elem_info
*uinfo
)
387 unsigned int mask
= AK_GET_MASK(kcontrol
->private_value
);
389 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
391 uinfo
->value
.integer
.min
= 0;
392 uinfo
->value
.integer
.max
= mask
;
396 static int snd_akm4xxx_stereo_volume_get(struct snd_kcontrol
*kcontrol
,
397 struct snd_ctl_elem_value
*ucontrol
)
399 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
400 int chip
= AK_GET_CHIP(kcontrol
->private_value
);
401 int addr
= AK_GET_ADDR(kcontrol
->private_value
);
403 ucontrol
->value
.integer
.value
[0] = snd_akm4xxx_get_vol(ak
, chip
, addr
);
404 ucontrol
->value
.integer
.value
[1] = snd_akm4xxx_get_vol(ak
, chip
, addr
+1);
408 static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol
*kcontrol
,
409 struct snd_ctl_elem_value
*ucontrol
)
411 int addr
= AK_GET_ADDR(kcontrol
->private_value
);
414 change
= put_ak_reg(kcontrol
, addr
, ucontrol
->value
.integer
.value
[0]);
415 change
|= put_ak_reg(kcontrol
, addr
+ 1,
416 ucontrol
->value
.integer
.value
[1]);
420 static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol
*kcontrol
,
421 struct snd_ctl_elem_info
*uinfo
)
423 static char *texts
[4] = {
424 "44.1kHz", "Off", "48kHz", "32kHz",
426 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
428 uinfo
->value
.enumerated
.items
= 4;
429 if (uinfo
->value
.enumerated
.item
>= 4)
430 uinfo
->value
.enumerated
.item
= 3;
431 strcpy(uinfo
->value
.enumerated
.name
,
432 texts
[uinfo
->value
.enumerated
.item
]);
436 static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol
*kcontrol
,
437 struct snd_ctl_elem_value
*ucontrol
)
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 int shift
= AK_GET_SHIFT(kcontrol
->private_value
);
443 ucontrol
->value
.enumerated
.item
[0] =
444 (snd_akm4xxx_get(ak
, chip
, addr
) >> shift
) & 3;
448 static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol
*kcontrol
,
449 struct snd_ctl_elem_value
*ucontrol
)
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 unsigned char nval
= ucontrol
->value
.enumerated
.item
[0] & 3;
458 nval
= (nval
<< shift
) |
459 (snd_akm4xxx_get(ak
, chip
, addr
) & ~(3 << shift
));
460 change
= snd_akm4xxx_get(ak
, chip
, addr
) != nval
;
462 snd_akm4xxx_write(ak
, chip
, addr
, nval
);
466 static int ak4xxx_switch_info(struct snd_kcontrol
*kcontrol
,
467 struct snd_ctl_elem_info
*uinfo
)
469 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
471 uinfo
->value
.integer
.min
= 0;
472 uinfo
->value
.integer
.max
= 1;
476 static int ak4xxx_switch_get(struct snd_kcontrol
*kcontrol
,
477 struct snd_ctl_elem_value
*ucontrol
)
479 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
480 int chip
= AK_GET_CHIP(kcontrol
->private_value
);
481 int addr
= AK_GET_ADDR(kcontrol
->private_value
);
482 int shift
= AK_GET_SHIFT(kcontrol
->private_value
);
483 int invert
= AK_GET_INVERT(kcontrol
->private_value
);
484 unsigned char val
= snd_akm4xxx_get(ak
, chip
, addr
);
488 ucontrol
->value
.integer
.value
[0] = (val
& (1<<shift
)) != 0;
492 static int ak4xxx_switch_put(struct snd_kcontrol
*kcontrol
,
493 struct snd_ctl_elem_value
*ucontrol
)
495 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
496 int chip
= AK_GET_CHIP(kcontrol
->private_value
);
497 int addr
= AK_GET_ADDR(kcontrol
->private_value
);
498 int shift
= AK_GET_SHIFT(kcontrol
->private_value
);
499 int invert
= AK_GET_INVERT(kcontrol
->private_value
);
500 long flag
= ucontrol
->value
.integer
.value
[0];
501 unsigned char val
, oval
;
506 oval
= snd_akm4xxx_get(ak
, chip
, addr
);
508 val
= oval
| (1<<shift
);
510 val
= oval
& ~(1<<shift
);
511 change
= (oval
!= val
);
513 snd_akm4xxx_write(ak
, chip
, addr
, val
);
517 #define AK5365_NUM_INPUTS 5
519 static int ak4xxx_capture_source_info(struct snd_kcontrol
*kcontrol
,
520 struct snd_ctl_elem_info
*uinfo
)
522 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
523 int mixer_ch
= AK_GET_SHIFT(kcontrol
->private_value
);
524 const char **input_names
;
527 input_names
= ak
->adc_info
[mixer_ch
].input_names
;
530 while (num_names
< AK5365_NUM_INPUTS
&& input_names
[num_names
])
533 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
535 uinfo
->value
.enumerated
.items
= num_names
;
536 idx
= uinfo
->value
.enumerated
.item
;
537 if (idx
>= num_names
)
539 strncpy(uinfo
->value
.enumerated
.name
, input_names
[idx
],
540 sizeof(uinfo
->value
.enumerated
.name
));
544 static int ak4xxx_capture_source_get(struct snd_kcontrol
*kcontrol
,
545 struct snd_ctl_elem_value
*ucontrol
)
547 struct snd_akm4xxx
*ak
= snd_kcontrol_chip(kcontrol
);
548 int chip
= AK_GET_CHIP(kcontrol
->private_value
);
549 int addr
= AK_GET_ADDR(kcontrol
->private_value
);
550 int mask
= AK_GET_MASK(kcontrol
->private_value
);
553 val
= snd_akm4xxx_get(ak
, chip
, addr
) & mask
;
554 ucontrol
->value
.enumerated
.item
[0] = val
;
558 static int ak4xxx_capture_source_put(struct snd_kcontrol
*kcontrol
,
559 struct snd_ctl_elem_value
*ucontrol
)
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 oval
, val
;
567 oval
= snd_akm4xxx_get(ak
, chip
, addr
);
569 val
|= ucontrol
->value
.enumerated
.item
[0] & mask
;
571 snd_akm4xxx_write(ak
, chip
, addr
, val
);
578 * build AK4xxx controls
581 static int build_dac_controls(struct snd_akm4xxx
*ak
)
583 int idx
, err
, mixer_ch
, num_stereo
;
584 struct snd_kcontrol_new knew
;
587 for (idx
= 0; idx
< ak
->num_dacs
; ) {
588 memset(&knew
, 0, sizeof(knew
));
589 if (! ak
->dac_info
|| ! ak
->dac_info
[mixer_ch
].name
) {
590 knew
.name
= "DAC Volume";
591 knew
.index
= mixer_ch
+ ak
->idx_offset
* 2;
594 knew
.name
= ak
->dac_info
[mixer_ch
].name
;
595 num_stereo
= ak
->dac_info
[mixer_ch
].num_channels
;
597 knew
.iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
599 knew
.access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
|
600 SNDRV_CTL_ELEM_ACCESS_TLV_READ
;
601 if (num_stereo
== 2) {
602 knew
.info
= snd_akm4xxx_stereo_volume_info
;
603 knew
.get
= snd_akm4xxx_stereo_volume_get
;
604 knew
.put
= snd_akm4xxx_stereo_volume_put
;
606 knew
.info
= snd_akm4xxx_volume_info
;
607 knew
.get
= snd_akm4xxx_volume_get
;
608 knew
.put
= snd_akm4xxx_volume_put
;
614 AK_COMPOSE(idx
/2, (idx
%2) + 6, 0, 127) |
616 knew
.tlv
.p
= db_scale_vol_datt
;
621 AK_COMPOSE(idx
/2, (idx
%2) + 4, 0, 127) |
623 knew
.tlv
.p
= db_scale_vol_datt
;
626 /* registers 2-7 and b,c */
627 int val
= idx
< 6 ? idx
+ 2 : (idx
- 6) + 0xb;
629 AK_COMPOSE(0, val
, 0, 255) | AK_INVERT
;
630 knew
.tlv
.p
= db_scale_8bit
;
634 /* register 4-9, chip #0 only */
635 knew
.private_value
= AK_COMPOSE(0, idx
+ 4, 0, 255);
636 knew
.tlv
.p
= db_scale_8bit
;
639 /* register 4-9 and 11-12, chip #0 only */
640 int addr
= idx
< 6 ? idx
+ 4 : idx
+ 5;
642 AK_COMPOSE(0, addr
, 0, 127) | AK_NEEDSMSB
;
643 knew
.tlv
.p
= db_scale_7bit
;
649 AK_COMPOSE(idx
/2, (idx
%2) + 3, 0, 255);
650 knew
.tlv
.p
= db_scale_linear
;
656 err
= snd_ctl_add(ak
->card
, snd_ctl_new1(&knew
, ak
));
666 static int build_adc_controls(struct snd_akm4xxx
*ak
)
668 int idx
, err
, mixer_ch
, num_stereo
;
669 struct snd_kcontrol_new knew
;
672 for (idx
= 0; idx
< ak
->num_adcs
;) {
673 memset(&knew
, 0, sizeof(knew
));
674 if (! ak
->adc_info
|| ! ak
->adc_info
[mixer_ch
].name
) {
675 knew
.name
= "ADC Volume";
676 knew
.index
= mixer_ch
+ ak
->idx_offset
* 2;
679 knew
.name
= ak
->adc_info
[mixer_ch
].name
;
680 num_stereo
= ak
->adc_info
[mixer_ch
].num_channels
;
682 knew
.iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
684 knew
.access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
|
685 SNDRV_CTL_ELEM_ACCESS_TLV_READ
;
686 if (num_stereo
== 2) {
687 knew
.info
= snd_akm4xxx_stereo_volume_info
;
688 knew
.get
= snd_akm4xxx_stereo_volume_get
;
689 knew
.put
= snd_akm4xxx_stereo_volume_put
;
691 knew
.info
= snd_akm4xxx_volume_info
;
692 knew
.get
= snd_akm4xxx_volume_get
;
693 knew
.put
= snd_akm4xxx_volume_put
;
696 if (ak
->type
== SND_AK5365
)
698 AK_COMPOSE(idx
/2, (idx
%2) + 4, 0, 151) |
699 AK_VOL_CVT
| AK_IPGA
;
702 AK_COMPOSE(idx
/2, (idx
%2) + 4, 0, 163) |
703 AK_VOL_CVT
| AK_IPGA
;
704 knew
.tlv
.p
= db_scale_vol_datt
;
705 err
= snd_ctl_add(ak
->card
, snd_ctl_new1(&knew
, ak
));
709 if (ak
->type
== SND_AK5365
&& (idx
% 2) == 0) {
710 if (! ak
->adc_info
||
711 ! ak
->adc_info
[mixer_ch
].switch_name
) {
712 knew
.name
= "Capture Switch";
713 knew
.index
= mixer_ch
+ ak
->idx_offset
* 2;
715 knew
.name
= ak
->adc_info
[mixer_ch
].switch_name
;
716 knew
.info
= ak4xxx_switch_info
;
717 knew
.get
= ak4xxx_switch_get
;
718 knew
.put
= ak4xxx_switch_put
;
720 /* register 2, bit 0 (SMUTE): 0 = normal operation,
723 AK_COMPOSE(idx
/2, 2, 0, 0) | AK_INVERT
;
724 err
= snd_ctl_add(ak
->card
, snd_ctl_new1(&knew
, ak
));
728 memset(&knew
, 0, sizeof(knew
));
729 knew
.name
= ak
->adc_info
[mixer_ch
].selector_name
;
731 knew
.name
= "Capture Channel";
732 knew
.index
= mixer_ch
+ ak
->idx_offset
* 2;
735 knew
.iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
736 knew
.info
= ak4xxx_capture_source_info
;
737 knew
.get
= ak4xxx_capture_source_get
;
738 knew
.put
= ak4xxx_capture_source_put
;
740 /* input selector control: reg. 1, bits 0-2.
741 * mis-use 'shift' to pass mixer_ch */
743 = AK_COMPOSE(idx
/2, 1, mixer_ch
, 0x07);
744 err
= snd_ctl_add(ak
->card
, snd_ctl_new1(&knew
, ak
));
755 static int build_deemphasis(struct snd_akm4xxx
*ak
, int num_emphs
)
758 struct snd_kcontrol_new knew
;
760 for (idx
= 0; idx
< num_emphs
; idx
++) {
761 memset(&knew
, 0, sizeof(knew
));
762 knew
.name
= "Deemphasis";
763 knew
.index
= idx
+ ak
->idx_offset
;
764 knew
.iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
766 knew
.info
= snd_akm4xxx_deemphasis_info
;
767 knew
.get
= snd_akm4xxx_deemphasis_get
;
768 knew
.put
= snd_akm4xxx_deemphasis_put
;
773 knew
.private_value
= AK_COMPOSE(idx
, 3, 0, 0);
776 int shift
= idx
== 3 ? 6 : (2 - idx
) * 2;
777 /* register 8 with shift */
778 knew
.private_value
= AK_COMPOSE(0, 8, shift
, 0);
783 knew
.private_value
= AK_COMPOSE(idx
, 3, 0, 0);
786 knew
.private_value
= AK_COMPOSE(idx
, 1, 1, 0);
791 err
= snd_ctl_add(ak
->card
, snd_ctl_new1(&knew
, ak
));
798 int snd_akm4xxx_build_controls(struct snd_akm4xxx
*ak
)
802 err
= build_dac_controls(ak
);
806 err
= build_adc_controls(ak
);
810 if (ak
->type
== SND_AK4355
|| ak
->type
== SND_AK4358
)
813 num_emphs
= ak
->num_dacs
/ 2;
814 err
= build_deemphasis(ak
, num_emphs
);
821 EXPORT_SYMBOL(snd_akm4xxx_build_controls
);
823 static int __init
alsa_akm4xxx_module_init(void)
828 static void __exit
alsa_akm4xxx_module_exit(void)
832 module_init(alsa_akm4xxx_module_init
)
833 module_exit(alsa_akm4xxx_module_exit
)