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