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