2
* ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4358 / AK4381
5
* Copyright (c) 2000-2004 Jaroslav Kysela <perex@perex.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
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>
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");
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,
43
ak->ops.lock(ak, chip);
44
ak->ops.write(ak, chip, reg, val);
47
snd_akm4xxx_set(ak, chip, reg, val);
48
ak->ops.unlock(ak, chip);
51
EXPORT_SYMBOL(snd_akm4xxx_write);
53
/* reset procedure for AK4524 and AK4528 */
54
static void ak4524_reset(struct snd_akm4xxx *ak, int state)
59
for (chip = 0; chip < ak->num_dacs/2; chip++) {
60
snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03);
64
for (reg = 0x04; reg < ak->total_regs; reg++)
65
snd_akm4xxx_write(ak, chip, reg,
66
snd_akm4xxx_get(ak, chip, reg));
70
/* reset procedure for AK4355 and AK4358 */
71
static void ak435X_reset(struct snd_akm4xxx *ak, int state)
76
snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
79
for (reg = 0x00; reg < ak->total_regs; reg++)
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 */
86
/* reset procedure for AK4381 */
87
static void ak4381_reset(struct snd_akm4xxx *ak, int state)
91
for (chip = 0; chip < ak->num_dacs/2; chip++) {
92
snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f);
95
for (reg = 0x01; reg < ak->total_regs; reg++)
96
snd_akm4xxx_write(ak, chip, reg,
97
snd_akm4xxx_get(ak, chip, reg));
102
* reset the AKM codecs
103
* @state: 1 = reset codec, 0 = restore the registers
105
* assert the reset operation and restores the register values to the chips.
107
void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
113
ak4524_reset(ak, state);
116
/* FIXME: needed for ak4529? */
119
ak435X_reset(ak, state);
122
ak435X_reset(ak, state);
125
ak4381_reset(ak, state);
132
EXPORT_SYMBOL(snd_akm4xxx_reset);
136
* Volume conversion table for non-linear volumes
137
* from -63.5dB (mute) to 0dB step 0.5dB
139
* Used for AK4524/AK4620 input/ouput attenuation, AK4528, and
140
* AK5365 input attenuation
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,
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);
170
* initialize all the ak4xxx chips
172
void snd_akm4xxx_init(struct snd_akm4xxx *ak)
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 */
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 */
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 */
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 */
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 */
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 */
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 */
275
const unsigned char *ptr, *inits;
276
unsigned char reg, data;
278
memset(ak->images, 0, sizeof(ak->images));
279
memset(ak->volumes, 0, sizeof(ak->volumes));
283
inits = inits_ak4524;
284
ak->num_chips = ak->num_dacs / 2;
286
ak->total_regs = 0x08;
289
inits = inits_ak4528;
290
ak->num_chips = ak->num_dacs / 2;
292
ak->total_regs = 0x06;
295
inits = inits_ak4529;
298
ak->total_regs = 0x0d;
301
inits = inits_ak4355;
304
ak->total_regs = 0x0b;
307
inits = inits_ak4358;
310
ak->total_regs = 0x10;
313
inits = inits_ak4381;
314
ak->num_chips = ak->num_dacs / 2;
316
ak->total_regs = 0x05;
319
/* FIXME: any init sequence? */
322
ak->total_regs = 0x08;
325
inits = inits_ak4620;
326
ak->num_chips = ak->num_dacs / 2;
328
ak->total_regs = 0x08;
335
for (chip = 0; chip < ak->num_chips; chip++) {
337
while (*ptr != 0xff) {
340
snd_akm4xxx_write(ak, chip, reg, data);
346
EXPORT_SYMBOL(snd_akm4xxx_init);
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))
366
static int snd_akm4xxx_volume_info(struct snd_kcontrol *kcontrol,
367
struct snd_ctl_elem_info *uinfo)
369
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
371
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
373
uinfo->value.integer.min = 0;
374
uinfo->value.integer.max = mask;
378
static int snd_akm4xxx_volume_get(struct snd_kcontrol *kcontrol,
379
struct snd_ctl_elem_value *ucontrol)
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);
385
ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
389
static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr,
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);
396
if (snd_akm4xxx_get_vol(ak, chip, addr) == nval)
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))
406
if (AK_GET_NEEDSMSB(kcontrol->private_value))
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);
414
static int snd_akm4xxx_volume_put(struct snd_kcontrol *kcontrol,
415
struct snd_ctl_elem_value *ucontrol)
417
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
418
unsigned int val = ucontrol->value.integer.value[0];
421
return put_ak_reg(kcontrol, AK_GET_ADDR(kcontrol->private_value), val);
424
static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol *kcontrol,
425
struct snd_ctl_elem_info *uinfo)
427
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
429
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
431
uinfo->value.integer.min = 0;
432
uinfo->value.integer.max = mask;
436
static int snd_akm4xxx_stereo_volume_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);
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);
448
static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol *kcontrol,
449
struct snd_ctl_elem_value *ucontrol)
451
int addr = AK_GET_ADDR(kcontrol->private_value);
452
unsigned int mask = AK_GET_MASK(kcontrol->private_value);
456
val[0] = ucontrol->value.integer.value[0];
457
val[1] = ucontrol->value.integer.value[1];
458
if (val[0] > mask || val[1] > mask)
460
change = put_ak_reg(kcontrol, addr, val[0]);
461
change |= put_ak_reg(kcontrol, addr + 1, val[1]);
465
static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol *kcontrol,
466
struct snd_ctl_elem_info *uinfo)
468
static const char * const texts[4] = {
469
"44.1kHz", "Off", "48kHz", "32kHz",
471
return snd_ctl_enum_info(uinfo, 1, 4, texts);
474
static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol,
475
struct snd_ctl_elem_value *ucontrol)
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;
486
static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol,
487
struct snd_ctl_elem_value *ucontrol)
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;
496
nval = (nval << shift) |
497
(snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
498
change = snd_akm4xxx_get(ak, chip, addr) != nval;
500
snd_akm4xxx_write(ak, chip, addr, nval);
504
#define ak4xxx_switch_info snd_ctl_boolean_mono_info
506
static int ak4xxx_switch_get(struct snd_kcontrol *kcontrol,
507
struct snd_ctl_elem_value *ucontrol)
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);
518
ucontrol->value.integer.value[0] = (val & (1<<shift)) != 0;
522
static int ak4xxx_switch_put(struct snd_kcontrol *kcontrol,
523
struct snd_ctl_elem_value *ucontrol)
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;
536
oval = snd_akm4xxx_get(ak, chip, addr);
538
val = oval | (1<<shift);
540
val = oval & ~(1<<shift);
541
change = (oval != val);
543
snd_akm4xxx_write(ak, chip, addr, val);
547
#define AK5365_NUM_INPUTS 5
549
static int ak4xxx_capture_num_inputs(struct snd_akm4xxx *ak, int mixer_ch)
552
const char **input_names;
554
input_names = ak->adc_info[mixer_ch].input_names;
556
while (num_names < AK5365_NUM_INPUTS && input_names[num_names])
561
static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
562
struct snd_ctl_elem_info *uinfo)
564
struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
565
int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
566
unsigned int num_names;
568
num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
571
return snd_ctl_enum_info(uinfo, 1, num_names,
572
ak->adc_info[mixer_ch].input_names);
575
static int ak4xxx_capture_source_get(struct snd_kcontrol *kcontrol,
576
struct snd_ctl_elem_value *ucontrol)
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);
584
val = snd_akm4xxx_get(ak, chip, addr) & mask;
585
ucontrol->value.enumerated.item[0] = val;
589
static int ak4xxx_capture_source_put(struct snd_kcontrol *kcontrol,
590
struct snd_ctl_elem_value *ucontrol)
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);
600
if (ucontrol->value.enumerated.item[0] >= num_names)
603
oval = snd_akm4xxx_get(ak, chip, addr);
605
val |= ucontrol->value.enumerated.item[0] & mask;
607
snd_akm4xxx_write(ak, chip, addr, val);
614
* build AK4xxx controls
617
static int build_dac_controls(struct snd_akm4xxx *ak)
619
int idx, err, mixer_ch, num_stereo;
620
struct snd_kcontrol_new knew;
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;
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;
636
/* register 1, bit 0 (SMUTE): 0 = normal operation,
639
AK_COMPOSE(idx/2, 1, 0, 0) | AK_INVERT;
640
err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
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;
650
knew.name = ak->dac_info[mixer_ch].name;
651
num_stereo = ak->dac_info[mixer_ch].num_channels;
653
knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
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;
662
knew.info = snd_akm4xxx_volume_info;
663
knew.get = snd_akm4xxx_volume_get;
664
knew.put = snd_akm4xxx_volume_put;
670
AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127) |
672
knew.tlv.p = db_scale_vol_datt;
677
AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127) |
679
knew.tlv.p = db_scale_vol_datt;
682
/* registers 2-7 and b,c */
683
int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb;
685
AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
686
knew.tlv.p = db_scale_8bit;
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;
695
/* register 4-9 and 11-12, chip #0 only */
696
int addr = idx < 6 ? idx + 4 : idx + 5;
698
AK_COMPOSE(0, addr, 0, 127) | AK_NEEDSMSB;
699
knew.tlv.p = db_scale_7bit;
705
AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255);
706
knew.tlv.p = db_scale_linear;
711
AK_COMPOSE(idx/2, (idx%2) + 6, 0, 255);
712
knew.tlv.p = db_scale_linear;
718
err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
728
static int build_adc_controls(struct snd_akm4xxx *ak)
730
int idx, err, mixer_ch, num_stereo, max_steps;
731
struct snd_kcontrol_new knew;
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;
743
knew.name = ak->adc_info[mixer_ch].name;
744
num_stereo = ak->adc_info[mixer_ch].num_channels;
746
knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
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;
755
knew.info = snd_akm4xxx_volume_info;
756
knew.get = snd_akm4xxx_volume_get;
757
knew.put = snd_akm4xxx_volume_put;
760
if (ak->type == SND_AK5365)
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));
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;
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;
783
/* register 2, bit 0 (SMUTE): 0 = normal operation,
786
AK_COMPOSE(idx/2, 2, 0, 0) | AK_INVERT;
787
err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
791
memset(&knew, 0, sizeof(knew));
792
knew.name = ak->adc_info[mixer_ch].selector_name;
794
knew.name = "Capture Channel";
795
knew.index = mixer_ch + ak->idx_offset * 2;
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;
803
/* input selector control: reg. 1, bits 0-2.
804
* mis-use 'shift' to pass mixer_ch */
806
= AK_COMPOSE(idx/2, 1, mixer_ch, 0x07);
807
err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
818
static int build_deemphasis(struct snd_akm4xxx *ak, int num_emphs)
821
struct snd_kcontrol_new knew;
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;
829
knew.info = snd_akm4xxx_deemphasis_info;
830
knew.get = snd_akm4xxx_deemphasis_get;
831
knew.put = snd_akm4xxx_deemphasis_put;
837
knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
840
int shift = idx == 3 ? 6 : (2 - idx) * 2;
841
/* register 8 with shift */
842
knew.private_value = AK_COMPOSE(0, 8, shift, 0);
847
knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
850
knew.private_value = AK_COMPOSE(idx, 1, 1, 0);
855
err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
862
static void proc_regs_read(struct snd_info_entry *entry,
863
struct snd_info_buffer *buffer)
865
struct snd_akm4xxx *ak = entry->private_data;
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,
876
static int proc_init(struct snd_akm4xxx *ak)
878
struct snd_info_entry *entry;
880
err = snd_card_proc_new(ak->card, ak->name, &entry);
883
snd_info_set_text_ops(entry, ak, proc_regs_read);
887
int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
891
err = build_dac_controls(ak);
895
err = build_adc_controls(ak);
898
if (ak->type == SND_AK4355 || ak->type == SND_AK4358)
900
else if (ak->type == SND_AK4620)
903
num_emphs = ak->num_dacs / 2;
904
err = build_deemphasis(ak, num_emphs);
913
EXPORT_SYMBOL(snd_akm4xxx_build_controls);