Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/pci/ac97/ac97_codec.c
26439 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* Copyright (c) by Jaroslav Kysela <[email protected]>
4
* Universal interface for Audio Codec '97
5
*
6
* For more details look to AC '97 component specification revision 2.2
7
* by Intel Corporation (http://developer.intel.com).
8
*/
9
10
#include <linux/delay.h>
11
#include <linux/init.h>
12
#include <linux/slab.h>
13
#include <linux/pci.h>
14
#include <linux/module.h>
15
#include <linux/mutex.h>
16
#include <sound/core.h>
17
#include <sound/pcm.h>
18
#include <sound/tlv.h>
19
#include <sound/ac97_codec.h>
20
#include <sound/asoundef.h>
21
#include <sound/initval.h>
22
#include "ac97_id.h"
23
24
#include "ac97_patch.c"
25
26
MODULE_AUTHOR("Jaroslav Kysela <[email protected]>");
27
MODULE_DESCRIPTION("Universal interface for Audio Codec '97");
28
MODULE_LICENSE("GPL");
29
30
static bool enable_loopback;
31
32
module_param(enable_loopback, bool, 0444);
33
MODULE_PARM_DESC(enable_loopback, "Enable AC97 ADC/DAC Loopback Control");
34
35
#ifdef CONFIG_SND_AC97_POWER_SAVE
36
static int power_save = CONFIG_SND_AC97_POWER_SAVE_DEFAULT;
37
module_param(power_save, int, 0644);
38
MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
39
"(in second, 0 = disable).");
40
#endif
41
/*
42
43
*/
44
45
struct ac97_codec_id {
46
unsigned int id;
47
unsigned int mask;
48
const char *name;
49
int (*patch)(struct snd_ac97 *ac97);
50
int (*mpatch)(struct snd_ac97 *ac97);
51
unsigned int flags;
52
};
53
54
static const struct ac97_codec_id snd_ac97_codec_id_vendors[] = {
55
{ 0x41445300, 0xffffff00, "Analog Devices", NULL, NULL },
56
{ 0x414b4d00, 0xffffff00, "Asahi Kasei", NULL, NULL },
57
{ 0x414c4300, 0xffffff00, "Realtek", NULL, NULL },
58
{ 0x414c4700, 0xffffff00, "Realtek", NULL, NULL },
59
/*
60
* This is an _inofficial_ Aztech Labs entry
61
* (value might differ from unknown official Aztech ID),
62
* currently used by the AC97 emulation of the almost-AC97 PCI168 card.
63
*/
64
{ 0x415a5400, 0xffffff00, "Aztech Labs (emulated)", NULL, NULL },
65
{ 0x434d4900, 0xffffff00, "C-Media Electronics", NULL, NULL },
66
{ 0x43525900, 0xffffff00, "Cirrus Logic", NULL, NULL },
67
{ 0x43585400, 0xffffff00, "Conexant", NULL, NULL },
68
{ 0x44543000, 0xffffff00, "Diamond Technology", NULL, NULL },
69
{ 0x454d4300, 0xffffff00, "eMicro", NULL, NULL },
70
{ 0x45838300, 0xffffff00, "ESS Technology", NULL, NULL },
71
{ 0x48525300, 0xffffff00, "Intersil", NULL, NULL },
72
{ 0x49434500, 0xffffff00, "ICEnsemble", NULL, NULL },
73
{ 0x49544500, 0xffffff00, "ITE Tech.Inc", NULL, NULL },
74
{ 0x4e534300, 0xffffff00, "National Semiconductor", NULL, NULL },
75
{ 0x50534300, 0xffffff00, "Philips", NULL, NULL },
76
{ 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL, NULL },
77
{ 0x53544d00, 0xffffff00, "STMicroelectronics", NULL, NULL },
78
{ 0x54524100, 0xffffff00, "TriTech", NULL, NULL },
79
{ 0x54584e00, 0xffffff00, "Texas Instruments", NULL, NULL },
80
{ 0x56494100, 0xffffff00, "VIA Technologies", NULL, NULL },
81
{ 0x57454300, 0xffffff00, "Winbond", NULL, NULL },
82
{ 0x574d4c00, 0xffffff00, "Wolfson", NULL, NULL },
83
{ 0x594d4800, 0xffffff00, "Yamaha", NULL, NULL },
84
{ 0x83847600, 0xffffff00, "SigmaTel", NULL, NULL },
85
{ 0, 0, NULL, NULL, NULL }
86
};
87
88
static const struct ac97_codec_id snd_ac97_codec_ids[] = {
89
{ 0x41445303, 0xffffffff, "AD1819", patch_ad1819, NULL },
90
{ 0x41445340, 0xffffffff, "AD1881", patch_ad1881, NULL },
91
{ 0x41445348, 0xffffffff, "AD1881A", patch_ad1881, NULL },
92
{ 0x41445360, 0xffffffff, "AD1885", patch_ad1885, NULL },
93
{ 0x41445361, 0xffffffff, "AD1886", patch_ad1886, NULL },
94
{ 0x41445362, 0xffffffff, "AD1887", patch_ad1881, NULL },
95
{ 0x41445363, 0xffffffff, "AD1886A", patch_ad1881, NULL },
96
{ 0x41445368, 0xffffffff, "AD1888", patch_ad1888, NULL },
97
{ 0x41445370, 0xffffffff, "AD1980", patch_ad1980, NULL },
98
{ 0x41445372, 0xffffffff, "AD1981A", patch_ad1981a, NULL },
99
{ 0x41445374, 0xffffffff, "AD1981B", patch_ad1981b, NULL },
100
{ 0x41445375, 0xffffffff, "AD1985", patch_ad1985, NULL },
101
{ 0x41445378, 0xffffffff, "AD1986", patch_ad1986, NULL },
102
{ 0x414b4d00, 0xffffffff, "AK4540", NULL, NULL },
103
{ 0x414b4d01, 0xffffffff, "AK4542", NULL, NULL },
104
{ 0x414b4d02, 0xffffffff, "AK4543", NULL, NULL },
105
{ 0x414b4d06, 0xffffffff, "AK4544A", NULL, NULL },
106
{ 0x414b4d07, 0xffffffff, "AK4545", NULL, NULL },
107
{ 0x414c4300, 0xffffff00, "ALC100,100P", NULL, NULL },
108
{ 0x414c4710, 0xfffffff0, "ALC200,200P", NULL, NULL },
109
{ 0x414c4721, 0xffffffff, "ALC650D", NULL, NULL }, /* already patched */
110
{ 0x414c4722, 0xffffffff, "ALC650E", NULL, NULL }, /* already patched */
111
{ 0x414c4723, 0xffffffff, "ALC650F", NULL, NULL }, /* already patched */
112
{ 0x414c4720, 0xfffffff0, "ALC650", patch_alc650, NULL },
113
{ 0x414c4730, 0xffffffff, "ALC101", NULL, NULL },
114
{ 0x414c4740, 0xfffffff0, "ALC202", NULL, NULL },
115
{ 0x414c4750, 0xfffffff0, "ALC250", NULL, NULL },
116
{ 0x414c4760, 0xfffffff0, "ALC655", patch_alc655, NULL },
117
{ 0x414c4770, 0xfffffff0, "ALC203", patch_alc203, NULL },
118
{ 0x414c4781, 0xffffffff, "ALC658D", NULL, NULL }, /* already patched */
119
{ 0x414c4780, 0xfffffff0, "ALC658", patch_alc655, NULL },
120
{ 0x414c4790, 0xfffffff0, "ALC850", patch_alc850, NULL },
121
{ 0x415a5401, 0xffffffff, "AZF3328", patch_aztech_azf3328, NULL },
122
{ 0x434d4941, 0xffffffff, "CMI9738", patch_cm9738, NULL },
123
{ 0x434d4961, 0xffffffff, "CMI9739", patch_cm9739, NULL },
124
{ 0x434d4969, 0xffffffff, "CMI9780", patch_cm9780, NULL },
125
{ 0x434d4978, 0xffffffff, "CMI9761A", patch_cm9761, NULL },
126
{ 0x434d4982, 0xffffffff, "CMI9761B", patch_cm9761, NULL },
127
{ 0x434d4983, 0xffffffff, "CMI9761A+", patch_cm9761, NULL },
128
{ 0x43525900, 0xfffffff8, "CS4297", NULL, NULL },
129
{ 0x43525910, 0xfffffff8, "CS4297A", patch_cirrus_spdif, NULL },
130
{ 0x43525920, 0xfffffff8, "CS4298", patch_cirrus_spdif, NULL },
131
{ 0x43525928, 0xfffffff8, "CS4294", NULL, NULL },
132
{ 0x43525930, 0xfffffff8, "CS4299", patch_cirrus_cs4299, NULL },
133
{ 0x43525948, 0xfffffff8, "CS4201", NULL, NULL },
134
{ 0x43525958, 0xfffffff8, "CS4205", patch_cirrus_spdif, NULL },
135
{ 0x43525960, 0xfffffff8, "CS4291", NULL, NULL },
136
{ 0x43525970, 0xfffffff8, "CS4202", NULL, NULL },
137
{ 0x43585421, 0xffffffff, "HSD11246", NULL, NULL }, // SmartMC II
138
{ 0x43585428, 0xfffffff8, "Cx20468", patch_conexant, NULL }, // SmartAMC fixme: the mask might be different
139
{ 0x43585430, 0xffffffff, "Cx20468-31", patch_conexant, NULL },
140
{ 0x43585431, 0xffffffff, "Cx20551", patch_cx20551, NULL },
141
{ 0x44543031, 0xfffffff0, "DT0398", NULL, NULL },
142
{ 0x454d4328, 0xffffffff, "EM28028", NULL, NULL }, // same as TR28028?
143
{ 0x45838308, 0xffffffff, "ESS1988", NULL, NULL },
144
{ 0x48525300, 0xffffff00, "HMP9701", NULL, NULL },
145
{ 0x49434501, 0xffffffff, "ICE1230", NULL, NULL },
146
{ 0x49434511, 0xffffffff, "ICE1232", NULL, NULL }, // alias VIA VT1611A?
147
{ 0x49434514, 0xffffffff, "ICE1232A", NULL, NULL },
148
{ 0x49434551, 0xffffffff, "VT1616", patch_vt1616, NULL },
149
{ 0x49434552, 0xffffffff, "VT1616i", patch_vt1616, NULL }, // VT1616 compatible (chipset integrated)
150
{ 0x49544520, 0xffffffff, "IT2226E", NULL, NULL },
151
{ 0x49544561, 0xffffffff, "IT2646E", patch_it2646, NULL },
152
{ 0x4e534300, 0xffffffff, "LM4540,43,45,46,48", NULL, NULL }, // only guess --jk
153
{ 0x4e534331, 0xffffffff, "LM4549", NULL, NULL },
154
{ 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix
155
{ 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH },
156
{ 0x53544d02, 0xffffffff, "ST7597", NULL, NULL },
157
{ 0x54524102, 0xffffffff, "TR28022", NULL, NULL },
158
{ 0x54524103, 0xffffffff, "TR28023", NULL, NULL },
159
{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
160
{ 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99]
161
{ 0x54524123, 0xffffffff, "TR28602", NULL, NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)]
162
{ 0x54584e03, 0xffffffff, "TLV320AIC27", NULL, NULL },
163
{ 0x54584e20, 0xffffffff, "TLC320AD9xC", NULL, NULL },
164
{ 0x56494120, 0xfffffff0, "VIA1613", patch_vt1613, NULL },
165
{ 0x56494161, 0xffffffff, "VIA1612A", NULL, NULL }, // modified ICE1232 with S/PDIF
166
{ 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF
167
{ 0x56494182, 0xffffffff, "VIA1618", patch_vt1618, NULL },
168
{ 0x57454301, 0xffffffff, "W83971D", NULL, NULL },
169
{ 0x574d4c00, 0xffffffff, "WM9701,WM9701A", NULL, NULL },
170
{ 0x574d4C03, 0xffffffff, "WM9703,WM9707,WM9708,WM9717", patch_wolfson03, NULL},
171
{ 0x574d4C04, 0xffffffff, "WM9704M,WM9704Q", patch_wolfson04, NULL},
172
{ 0x574d4C05, 0xffffffff, "WM9705,WM9710", patch_wolfson05, NULL},
173
{ 0x574d4C09, 0xffffffff, "WM9709", NULL, NULL},
174
{ 0x574d4C12, 0xffffffff, "WM9711,WM9712,WM9715", patch_wolfson11, NULL},
175
{ 0x574d4c13, 0xffffffff, "WM9713,WM9714", patch_wolfson13, NULL, AC97_DEFAULT_POWER_OFF},
176
{ 0x594d4800, 0xffffffff, "YMF743", patch_yamaha_ymf743, NULL },
177
{ 0x594d4802, 0xffffffff, "YMF752", NULL, NULL },
178
{ 0x594d4803, 0xffffffff, "YMF753", patch_yamaha_ymf753, NULL },
179
{ 0x83847600, 0xffffffff, "STAC9700,83,84", patch_sigmatel_stac9700, NULL },
180
{ 0x83847604, 0xffffffff, "STAC9701,3,4,5", NULL, NULL },
181
{ 0x83847605, 0xffffffff, "STAC9704", NULL, NULL },
182
{ 0x83847608, 0xffffffff, "STAC9708,11", patch_sigmatel_stac9708, NULL },
183
{ 0x83847609, 0xffffffff, "STAC9721,23", patch_sigmatel_stac9721, NULL },
184
{ 0x83847644, 0xffffffff, "STAC9744", patch_sigmatel_stac9744, NULL },
185
{ 0x83847650, 0xffffffff, "STAC9750,51", NULL, NULL }, // patch?
186
{ 0x83847652, 0xffffffff, "STAC9752,53", NULL, NULL }, // patch?
187
{ 0x83847656, 0xffffffff, "STAC9756,57", patch_sigmatel_stac9756, NULL },
188
{ 0x83847658, 0xffffffff, "STAC9758,59", patch_sigmatel_stac9758, NULL },
189
{ 0x83847666, 0xffffffff, "STAC9766,67", NULL, NULL }, // patch?
190
{ 0, 0, NULL, NULL, NULL }
191
};
192
193
194
static void update_power_regs(struct snd_ac97 *ac97);
195
#ifdef CONFIG_SND_AC97_POWER_SAVE
196
#define ac97_is_power_save_mode(ac97) \
197
((ac97->scaps & AC97_SCAP_POWER_SAVE) && power_save)
198
#else
199
#define ac97_is_power_save_mode(ac97) 0
200
#endif
201
202
#define ac97_err(ac97, fmt, args...) \
203
dev_err((ac97)->bus->card->dev, fmt, ##args)
204
#define ac97_warn(ac97, fmt, args...) \
205
dev_warn((ac97)->bus->card->dev, fmt, ##args)
206
#define ac97_dbg(ac97, fmt, args...) \
207
dev_dbg((ac97)->bus->card->dev, fmt, ##args)
208
209
/*
210
* I/O routines
211
*/
212
213
static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg)
214
{
215
/* filter some registers for buggy codecs */
216
switch (ac97->id) {
217
case AC97_ID_ST_AC97_ID4:
218
if (reg == 0x08)
219
return 0;
220
fallthrough;
221
case AC97_ID_ST7597:
222
if (reg == 0x22 || reg == 0x7a)
223
return 1;
224
fallthrough;
225
case AC97_ID_AK4540:
226
case AC97_ID_AK4542:
227
if (reg <= 0x1c || reg == 0x20 || reg == 0x26 || reg >= 0x7c)
228
return 1;
229
return 0;
230
case AC97_ID_AD1819: /* AD1819 */
231
case AC97_ID_AD1881: /* AD1881 */
232
case AC97_ID_AD1881A: /* AD1881A */
233
if (reg >= 0x3a && reg <= 0x6e) /* 0x59 */
234
return 0;
235
return 1;
236
case AC97_ID_AD1885: /* AD1885 */
237
case AC97_ID_AD1886: /* AD1886 */
238
case AC97_ID_AD1886A: /* AD1886A - !!verify!! --jk */
239
case AC97_ID_AD1887: /* AD1887 - !!verify!! --jk */
240
if (reg == 0x5a)
241
return 1;
242
if (reg >= 0x3c && reg <= 0x6e) /* 0x59 */
243
return 0;
244
return 1;
245
case AC97_ID_STAC9700:
246
case AC97_ID_STAC9704:
247
case AC97_ID_STAC9705:
248
case AC97_ID_STAC9708:
249
case AC97_ID_STAC9721:
250
case AC97_ID_STAC9744:
251
case AC97_ID_STAC9756:
252
if (reg <= 0x3a || reg >= 0x5a)
253
return 1;
254
return 0;
255
}
256
return 1;
257
}
258
259
/**
260
* snd_ac97_write - write a value on the given register
261
* @ac97: the ac97 instance
262
* @reg: the register to change
263
* @value: the value to set
264
*
265
* Writes a value on the given register. This will invoke the write
266
* callback directly after the register check.
267
* This function doesn't change the register cache unlike
268
* #snd_ca97_write_cache(), so use this only when you don't want to
269
* reflect the change to the suspend/resume state.
270
*/
271
void snd_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short value)
272
{
273
if (!snd_ac97_valid_reg(ac97, reg))
274
return;
275
if ((ac97->id & 0xffffff00) == AC97_ID_ALC100) {
276
/* Fix H/W bug of ALC100/100P */
277
if (reg == AC97_MASTER || reg == AC97_HEADPHONE)
278
ac97->bus->ops->write(ac97, AC97_RESET, 0); /* reset audio codec */
279
}
280
ac97->bus->ops->write(ac97, reg, value);
281
}
282
283
EXPORT_SYMBOL(snd_ac97_write);
284
285
/**
286
* snd_ac97_read - read a value from the given register
287
*
288
* @ac97: the ac97 instance
289
* @reg: the register to read
290
*
291
* Reads a value from the given register. This will invoke the read
292
* callback directly after the register check.
293
*
294
* Return: The read value.
295
*/
296
unsigned short snd_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
297
{
298
if (!snd_ac97_valid_reg(ac97, reg))
299
return 0;
300
return ac97->bus->ops->read(ac97, reg);
301
}
302
303
/* read a register - return the cached value if already read */
304
static inline unsigned short snd_ac97_read_cache(struct snd_ac97 *ac97, unsigned short reg)
305
{
306
if (! test_bit(reg, ac97->reg_accessed)) {
307
ac97->regs[reg] = ac97->bus->ops->read(ac97, reg);
308
// set_bit(reg, ac97->reg_accessed);
309
}
310
return ac97->regs[reg];
311
}
312
313
EXPORT_SYMBOL(snd_ac97_read);
314
315
/**
316
* snd_ac97_write_cache - write a value on the given register and update the cache
317
* @ac97: the ac97 instance
318
* @reg: the register to change
319
* @value: the value to set
320
*
321
* Writes a value on the given register and updates the register
322
* cache. The cached values are used for the cached-read and the
323
* suspend/resume.
324
*/
325
void snd_ac97_write_cache(struct snd_ac97 *ac97, unsigned short reg, unsigned short value)
326
{
327
if (!snd_ac97_valid_reg(ac97, reg))
328
return;
329
mutex_lock(&ac97->reg_mutex);
330
ac97->regs[reg] = value;
331
ac97->bus->ops->write(ac97, reg, value);
332
set_bit(reg, ac97->reg_accessed);
333
mutex_unlock(&ac97->reg_mutex);
334
}
335
336
EXPORT_SYMBOL(snd_ac97_write_cache);
337
338
/**
339
* snd_ac97_update - update the value on the given register
340
* @ac97: the ac97 instance
341
* @reg: the register to change
342
* @value: the value to set
343
*
344
* Compares the value with the register cache and updates the value
345
* only when the value is changed.
346
*
347
* Return: 1 if the value is changed, 0 if no change, or a negative
348
* code on failure.
349
*/
350
int snd_ac97_update(struct snd_ac97 *ac97, unsigned short reg, unsigned short value)
351
{
352
int change;
353
354
if (!snd_ac97_valid_reg(ac97, reg))
355
return -EINVAL;
356
mutex_lock(&ac97->reg_mutex);
357
change = ac97->regs[reg] != value;
358
if (change) {
359
ac97->regs[reg] = value;
360
ac97->bus->ops->write(ac97, reg, value);
361
}
362
set_bit(reg, ac97->reg_accessed);
363
mutex_unlock(&ac97->reg_mutex);
364
return change;
365
}
366
367
EXPORT_SYMBOL(snd_ac97_update);
368
369
/**
370
* snd_ac97_update_bits - update the bits on the given register
371
* @ac97: the ac97 instance
372
* @reg: the register to change
373
* @mask: the bit-mask to change
374
* @value: the value to set
375
*
376
* Updates the masked-bits on the given register only when the value
377
* is changed.
378
*
379
* Return: 1 if the bits are changed, 0 if no change, or a negative
380
* code on failure.
381
*/
382
int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned short mask, unsigned short value)
383
{
384
int change;
385
386
if (!snd_ac97_valid_reg(ac97, reg))
387
return -EINVAL;
388
mutex_lock(&ac97->reg_mutex);
389
change = snd_ac97_update_bits_nolock(ac97, reg, mask, value);
390
mutex_unlock(&ac97->reg_mutex);
391
return change;
392
}
393
394
EXPORT_SYMBOL(snd_ac97_update_bits);
395
396
/* no lock version - see snd_ac97_update_bits() */
397
int snd_ac97_update_bits_nolock(struct snd_ac97 *ac97, unsigned short reg,
398
unsigned short mask, unsigned short value)
399
{
400
int change;
401
unsigned short old, new;
402
403
old = snd_ac97_read_cache(ac97, reg);
404
new = (old & ~mask) | (value & mask);
405
change = old != new;
406
if (change) {
407
ac97->regs[reg] = new;
408
ac97->bus->ops->write(ac97, reg, new);
409
}
410
set_bit(reg, ac97->reg_accessed);
411
return change;
412
}
413
414
static int snd_ac97_ad18xx_update_pcm_bits(struct snd_ac97 *ac97, int codec, unsigned short mask, unsigned short value)
415
{
416
int change;
417
unsigned short old, new, cfg;
418
419
mutex_lock(&ac97->page_mutex);
420
old = ac97->spec.ad18xx.pcmreg[codec];
421
new = (old & ~mask) | (value & mask);
422
change = old != new;
423
if (change) {
424
mutex_lock(&ac97->reg_mutex);
425
cfg = snd_ac97_read_cache(ac97, AC97_AD_SERIAL_CFG);
426
ac97->spec.ad18xx.pcmreg[codec] = new;
427
/* select single codec */
428
ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG,
429
(cfg & ~0x7000) |
430
ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]);
431
/* update PCM bits */
432
ac97->bus->ops->write(ac97, AC97_PCM, new);
433
/* select all codecs */
434
ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG,
435
cfg | 0x7000);
436
mutex_unlock(&ac97->reg_mutex);
437
}
438
mutex_unlock(&ac97->page_mutex);
439
return change;
440
}
441
442
/*
443
* Controls
444
*/
445
446
static int snd_ac97_info_enum_double(struct snd_kcontrol *kcontrol,
447
struct snd_ctl_elem_info *uinfo)
448
{
449
struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
450
451
return snd_ctl_enum_info(uinfo, e->shift_l == e->shift_r ? 1 : 2,
452
e->mask, e->texts);
453
}
454
455
static int snd_ac97_get_enum_double(struct snd_kcontrol *kcontrol,
456
struct snd_ctl_elem_value *ucontrol)
457
{
458
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
459
struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
460
unsigned short val, bitmask;
461
462
for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
463
;
464
val = snd_ac97_read_cache(ac97, e->reg);
465
ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
466
if (e->shift_l != e->shift_r)
467
ucontrol->value.enumerated.item[1] = (val >> e->shift_r) & (bitmask - 1);
468
469
return 0;
470
}
471
472
static int snd_ac97_put_enum_double(struct snd_kcontrol *kcontrol,
473
struct snd_ctl_elem_value *ucontrol)
474
{
475
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
476
struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
477
unsigned short val;
478
unsigned short mask, bitmask;
479
480
for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
481
;
482
if (ucontrol->value.enumerated.item[0] > e->mask - 1)
483
return -EINVAL;
484
val = ucontrol->value.enumerated.item[0] << e->shift_l;
485
mask = (bitmask - 1) << e->shift_l;
486
if (e->shift_l != e->shift_r) {
487
if (ucontrol->value.enumerated.item[1] > e->mask - 1)
488
return -EINVAL;
489
val |= ucontrol->value.enumerated.item[1] << e->shift_r;
490
mask |= (bitmask - 1) << e->shift_r;
491
}
492
return snd_ac97_update_bits(ac97, e->reg, mask, val);
493
}
494
495
/* save/restore ac97 v2.3 paging */
496
static int snd_ac97_page_save(struct snd_ac97 *ac97, int reg, struct snd_kcontrol *kcontrol)
497
{
498
int page_save = -1;
499
if ((kcontrol->private_value & (1<<25)) &&
500
(ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23 &&
501
(reg >= 0x60 && reg < 0x70)) {
502
unsigned short page = (kcontrol->private_value >> 26) & 0x0f;
503
mutex_lock(&ac97->page_mutex); /* lock paging */
504
page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK;
505
snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page);
506
}
507
return page_save;
508
}
509
510
static void snd_ac97_page_restore(struct snd_ac97 *ac97, int page_save)
511
{
512
if (page_save >= 0) {
513
snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save);
514
mutex_unlock(&ac97->page_mutex); /* unlock paging */
515
}
516
}
517
518
/* volume and switch controls */
519
static int snd_ac97_info_volsw(struct snd_kcontrol *kcontrol,
520
struct snd_ctl_elem_info *uinfo)
521
{
522
int mask = (kcontrol->private_value >> 16) & 0xff;
523
int shift = (kcontrol->private_value >> 8) & 0x0f;
524
int rshift = (kcontrol->private_value >> 12) & 0x0f;
525
526
uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
527
uinfo->count = shift == rshift ? 1 : 2;
528
uinfo->value.integer.min = 0;
529
uinfo->value.integer.max = mask;
530
return 0;
531
}
532
533
static int snd_ac97_get_volsw(struct snd_kcontrol *kcontrol,
534
struct snd_ctl_elem_value *ucontrol)
535
{
536
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
537
int reg = kcontrol->private_value & 0xff;
538
int shift = (kcontrol->private_value >> 8) & 0x0f;
539
int rshift = (kcontrol->private_value >> 12) & 0x0f;
540
int mask = (kcontrol->private_value >> 16) & 0xff;
541
int invert = (kcontrol->private_value >> 24) & 0x01;
542
int page_save;
543
544
page_save = snd_ac97_page_save(ac97, reg, kcontrol);
545
ucontrol->value.integer.value[0] = (snd_ac97_read_cache(ac97, reg) >> shift) & mask;
546
if (shift != rshift)
547
ucontrol->value.integer.value[1] = (snd_ac97_read_cache(ac97, reg) >> rshift) & mask;
548
if (invert) {
549
ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
550
if (shift != rshift)
551
ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
552
}
553
snd_ac97_page_restore(ac97, page_save);
554
return 0;
555
}
556
557
static int snd_ac97_put_volsw(struct snd_kcontrol *kcontrol,
558
struct snd_ctl_elem_value *ucontrol)
559
{
560
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
561
int reg = kcontrol->private_value & 0xff;
562
int shift = (kcontrol->private_value >> 8) & 0x0f;
563
int rshift = (kcontrol->private_value >> 12) & 0x0f;
564
int mask = (kcontrol->private_value >> 16) & 0xff;
565
int invert = (kcontrol->private_value >> 24) & 0x01;
566
int err, page_save;
567
unsigned short val, val2, val_mask;
568
569
page_save = snd_ac97_page_save(ac97, reg, kcontrol);
570
val = (ucontrol->value.integer.value[0] & mask);
571
if (invert)
572
val = mask - val;
573
val_mask = mask << shift;
574
val = val << shift;
575
if (shift != rshift) {
576
val2 = (ucontrol->value.integer.value[1] & mask);
577
if (invert)
578
val2 = mask - val2;
579
val_mask |= mask << rshift;
580
val |= val2 << rshift;
581
}
582
err = snd_ac97_update_bits(ac97, reg, val_mask, val);
583
snd_ac97_page_restore(ac97, page_save);
584
#ifdef CONFIG_SND_AC97_POWER_SAVE
585
/* check analog mixer power-down */
586
if ((val_mask & AC97_PD_EAPD) &&
587
(kcontrol->private_value & (1<<30))) {
588
if (val & AC97_PD_EAPD)
589
ac97->power_up &= ~(1 << (reg>>1));
590
else
591
ac97->power_up |= 1 << (reg>>1);
592
update_power_regs(ac97);
593
}
594
#endif
595
return err;
596
}
597
598
static const struct snd_kcontrol_new snd_ac97_controls_tone[2] = {
599
AC97_SINGLE("Tone Control - Bass", AC97_MASTER_TONE, 8, 15, 1),
600
AC97_SINGLE("Tone Control - Treble", AC97_MASTER_TONE, 0, 15, 1)
601
};
602
603
static const struct snd_kcontrol_new snd_ac97_controls_pc_beep[2] = {
604
AC97_SINGLE("Beep Playback Switch", AC97_PC_BEEP, 15, 1, 1),
605
AC97_SINGLE("Beep Playback Volume", AC97_PC_BEEP, 1, 15, 1)
606
};
607
608
static const struct snd_kcontrol_new snd_ac97_controls_mic_boost =
609
AC97_SINGLE("Mic Boost (+20dB)", AC97_MIC, 6, 1, 0);
610
611
612
static const char* std_rec_sel[] = {"Mic", "CD", "Video", "Aux", "Line", "Mix", "Mix Mono", "Phone"};
613
static const char* std_3d_path[] = {"pre 3D", "post 3D"};
614
static const char* std_mix[] = {"Mix", "Mic"};
615
static const char* std_mic[] = {"Mic1", "Mic2"};
616
617
static const struct ac97_enum std_enum[] = {
618
AC97_ENUM_DOUBLE(AC97_REC_SEL, 8, 0, 8, std_rec_sel),
619
AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 15, 2, std_3d_path),
620
AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 9, 2, std_mix),
621
AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 8, 2, std_mic),
622
};
623
624
static const struct snd_kcontrol_new snd_ac97_control_capture_src =
625
AC97_ENUM("Capture Source", std_enum[0]);
626
627
static const struct snd_kcontrol_new snd_ac97_control_capture_vol =
628
AC97_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 15, 0);
629
630
static const struct snd_kcontrol_new snd_ac97_controls_mic_capture[2] = {
631
AC97_SINGLE("Mic Capture Switch", AC97_REC_GAIN_MIC, 15, 1, 1),
632
AC97_SINGLE("Mic Capture Volume", AC97_REC_GAIN_MIC, 0, 15, 0)
633
};
634
635
enum {
636
AC97_GENERAL_PCM_OUT = 0,
637
AC97_GENERAL_STEREO_ENHANCEMENT,
638
AC97_GENERAL_3D,
639
AC97_GENERAL_LOUDNESS,
640
AC97_GENERAL_MONO,
641
AC97_GENERAL_MIC,
642
AC97_GENERAL_LOOPBACK
643
};
644
645
static const struct snd_kcontrol_new snd_ac97_controls_general[7] = {
646
AC97_ENUM("PCM Out Path & Mute", std_enum[1]),
647
AC97_SINGLE("Simulated Stereo Enhancement", AC97_GENERAL_PURPOSE, 14, 1, 0),
648
AC97_SINGLE("3D Control - Switch", AC97_GENERAL_PURPOSE, 13, 1, 0),
649
AC97_SINGLE("Loudness (bass boost)", AC97_GENERAL_PURPOSE, 12, 1, 0),
650
AC97_ENUM("Mono Output Select", std_enum[2]),
651
AC97_ENUM("Mic Select", std_enum[3]),
652
AC97_SINGLE("ADC/DAC Loopback", AC97_GENERAL_PURPOSE, 7, 1, 0)
653
};
654
655
static const struct snd_kcontrol_new snd_ac97_controls_3d[2] = {
656
AC97_SINGLE("3D Control - Center", AC97_3D_CONTROL, 8, 15, 0),
657
AC97_SINGLE("3D Control - Depth", AC97_3D_CONTROL, 0, 15, 0)
658
};
659
660
static const struct snd_kcontrol_new snd_ac97_controls_center[2] = {
661
AC97_SINGLE("Center Playback Switch", AC97_CENTER_LFE_MASTER, 7, 1, 1),
662
AC97_SINGLE("Center Playback Volume", AC97_CENTER_LFE_MASTER, 0, 31, 1)
663
};
664
665
static const struct snd_kcontrol_new snd_ac97_controls_lfe[2] = {
666
AC97_SINGLE("LFE Playback Switch", AC97_CENTER_LFE_MASTER, 15, 1, 1),
667
AC97_SINGLE("LFE Playback Volume", AC97_CENTER_LFE_MASTER, 8, 31, 1)
668
};
669
670
static const struct snd_kcontrol_new snd_ac97_control_eapd =
671
AC97_SINGLE("External Amplifier", AC97_POWERDOWN, 15, 1, 1);
672
673
static const struct snd_kcontrol_new snd_ac97_controls_modem_switches[2] = {
674
AC97_SINGLE("Off-hook Switch", AC97_GPIO_STATUS, 0, 1, 0),
675
AC97_SINGLE("Caller ID Switch", AC97_GPIO_STATUS, 2, 1, 0)
676
};
677
678
/* change the existing EAPD control as inverted */
679
static void set_inv_eapd(struct snd_ac97 *ac97, struct snd_kcontrol *kctl)
680
{
681
kctl->private_value = AC97_SINGLE_VALUE(AC97_POWERDOWN, 15, 1, 0);
682
snd_ac97_update_bits(ac97, AC97_POWERDOWN, (1<<15), (1<<15)); /* EAPD up */
683
ac97->scaps |= AC97_SCAP_INV_EAPD;
684
}
685
686
static int snd_ac97_spdif_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
687
{
688
uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
689
uinfo->count = 1;
690
return 0;
691
}
692
693
static int snd_ac97_spdif_cmask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
694
{
695
ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
696
IEC958_AES0_NONAUDIO |
697
IEC958_AES0_CON_EMPHASIS_5015 |
698
IEC958_AES0_CON_NOT_COPYRIGHT;
699
ucontrol->value.iec958.status[1] = IEC958_AES1_CON_CATEGORY |
700
IEC958_AES1_CON_ORIGINAL;
701
ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS;
702
return 0;
703
}
704
705
static int snd_ac97_spdif_pmask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
706
{
707
/* FIXME: AC'97 spec doesn't say which bits are used for what */
708
ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
709
IEC958_AES0_NONAUDIO |
710
IEC958_AES0_PRO_FS |
711
IEC958_AES0_PRO_EMPHASIS_5015;
712
return 0;
713
}
714
715
static int snd_ac97_spdif_default_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
716
{
717
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
718
719
mutex_lock(&ac97->reg_mutex);
720
ucontrol->value.iec958.status[0] = ac97->spdif_status & 0xff;
721
ucontrol->value.iec958.status[1] = (ac97->spdif_status >> 8) & 0xff;
722
ucontrol->value.iec958.status[2] = (ac97->spdif_status >> 16) & 0xff;
723
ucontrol->value.iec958.status[3] = (ac97->spdif_status >> 24) & 0xff;
724
mutex_unlock(&ac97->reg_mutex);
725
return 0;
726
}
727
728
static int snd_ac97_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
729
{
730
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
731
unsigned int new = 0;
732
unsigned short val = 0;
733
int change;
734
735
new = val = ucontrol->value.iec958.status[0] & (IEC958_AES0_PROFESSIONAL|IEC958_AES0_NONAUDIO);
736
if (ucontrol->value.iec958.status[0] & IEC958_AES0_PROFESSIONAL) {
737
new |= ucontrol->value.iec958.status[0] & (IEC958_AES0_PRO_FS|IEC958_AES0_PRO_EMPHASIS_5015);
738
switch (new & IEC958_AES0_PRO_FS) {
739
case IEC958_AES0_PRO_FS_44100: val |= 0<<12; break;
740
case IEC958_AES0_PRO_FS_48000: val |= 2<<12; break;
741
case IEC958_AES0_PRO_FS_32000: val |= 3<<12; break;
742
default: val |= 1<<12; break;
743
}
744
if ((new & IEC958_AES0_PRO_EMPHASIS) == IEC958_AES0_PRO_EMPHASIS_5015)
745
val |= 1<<3;
746
} else {
747
new |= ucontrol->value.iec958.status[0] & (IEC958_AES0_CON_EMPHASIS_5015|IEC958_AES0_CON_NOT_COPYRIGHT);
748
new |= ((ucontrol->value.iec958.status[1] & (IEC958_AES1_CON_CATEGORY|IEC958_AES1_CON_ORIGINAL)) << 8);
749
new |= ((ucontrol->value.iec958.status[3] & IEC958_AES3_CON_FS) << 24);
750
if ((new & IEC958_AES0_CON_EMPHASIS) == IEC958_AES0_CON_EMPHASIS_5015)
751
val |= 1<<3;
752
if (!(new & IEC958_AES0_CON_NOT_COPYRIGHT))
753
val |= 1<<2;
754
val |= ((new >> 8) & 0xff) << 4; // category + original
755
switch ((new >> 24) & 0xff) {
756
case IEC958_AES3_CON_FS_44100: val |= 0<<12; break;
757
case IEC958_AES3_CON_FS_48000: val |= 2<<12; break;
758
case IEC958_AES3_CON_FS_32000: val |= 3<<12; break;
759
default: val |= 1<<12; break;
760
}
761
}
762
763
mutex_lock(&ac97->reg_mutex);
764
change = ac97->spdif_status != new;
765
ac97->spdif_status = new;
766
767
if (ac97->flags & AC97_CS_SPDIF) {
768
int x = (val >> 12) & 0x03;
769
switch (x) {
770
case 0: x = 1; break; // 44.1
771
case 2: x = 0; break; // 48.0
772
default: x = 0; break; // illegal.
773
}
774
change |= snd_ac97_update_bits_nolock(ac97, AC97_CSR_SPDIF, 0x3fff, ((val & 0xcfff) | (x << 12)));
775
} else if (ac97->flags & AC97_CX_SPDIF) {
776
int v;
777
v = new & (IEC958_AES0_CON_EMPHASIS_5015|IEC958_AES0_CON_NOT_COPYRIGHT) ? 0 : AC97_CXR_COPYRGT;
778
v |= new & IEC958_AES0_NONAUDIO ? AC97_CXR_SPDIF_AC3 : AC97_CXR_SPDIF_PCM;
779
change |= snd_ac97_update_bits_nolock(ac97, AC97_CXR_AUDIO_MISC,
780
AC97_CXR_SPDIF_MASK | AC97_CXR_COPYRGT,
781
v);
782
} else if (ac97->id == AC97_ID_YMF743) {
783
change |= snd_ac97_update_bits_nolock(ac97,
784
AC97_YMF7X3_DIT_CTRL,
785
0xff38,
786
((val << 4) & 0xff00) |
787
((val << 2) & 0x0038));
788
} else {
789
unsigned short extst = snd_ac97_read_cache(ac97, AC97_EXTENDED_STATUS);
790
snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); /* turn off */
791
792
change |= snd_ac97_update_bits_nolock(ac97, AC97_SPDIF, 0x3fff, val);
793
if (extst & AC97_EA_SPDIF) {
794
snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
795
}
796
}
797
mutex_unlock(&ac97->reg_mutex);
798
799
return change;
800
}
801
802
static int snd_ac97_put_spsa(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
803
{
804
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
805
int reg = kcontrol->private_value & 0xff;
806
int shift = (kcontrol->private_value >> 8) & 0x0f;
807
int mask = (kcontrol->private_value >> 16) & 0xff;
808
// int invert = (kcontrol->private_value >> 24) & 0xff;
809
unsigned short value, old, new;
810
int change;
811
812
value = (ucontrol->value.integer.value[0] & mask);
813
814
mutex_lock(&ac97->reg_mutex);
815
mask <<= shift;
816
value <<= shift;
817
old = snd_ac97_read_cache(ac97, reg);
818
new = (old & ~mask) | value;
819
change = old != new;
820
821
if (change) {
822
unsigned short extst = snd_ac97_read_cache(ac97, AC97_EXTENDED_STATUS);
823
snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); /* turn off */
824
change = snd_ac97_update_bits_nolock(ac97, reg, mask, value);
825
if (extst & AC97_EA_SPDIF)
826
snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
827
}
828
mutex_unlock(&ac97->reg_mutex);
829
return change;
830
}
831
832
static const struct snd_kcontrol_new snd_ac97_controls_spdif[5] = {
833
{
834
.access = SNDRV_CTL_ELEM_ACCESS_READ,
835
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
836
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK),
837
.info = snd_ac97_spdif_mask_info,
838
.get = snd_ac97_spdif_cmask_get,
839
},
840
{
841
.access = SNDRV_CTL_ELEM_ACCESS_READ,
842
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
843
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK),
844
.info = snd_ac97_spdif_mask_info,
845
.get = snd_ac97_spdif_pmask_get,
846
},
847
{
848
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
849
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
850
.info = snd_ac97_spdif_mask_info,
851
.get = snd_ac97_spdif_default_get,
852
.put = snd_ac97_spdif_default_put,
853
},
854
855
AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH),AC97_EXTENDED_STATUS, 2, 1, 0),
856
{
857
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
858
.name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "AC97-SPSA",
859
.info = snd_ac97_info_volsw,
860
.get = snd_ac97_get_volsw,
861
.put = snd_ac97_put_spsa,
862
.private_value = AC97_SINGLE_VALUE(AC97_EXTENDED_STATUS, 4, 3, 0)
863
},
864
};
865
866
#define AD18XX_PCM_BITS(xname, codec, lshift, rshift, mask) \
867
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_ac97_ad18xx_pcm_info_bits, \
868
.get = snd_ac97_ad18xx_pcm_get_bits, .put = snd_ac97_ad18xx_pcm_put_bits, \
869
.private_value = (codec) | ((lshift) << 8) | ((rshift) << 12) | ((mask) << 16) }
870
871
static int snd_ac97_ad18xx_pcm_info_bits(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
872
{
873
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
874
int mask = (kcontrol->private_value >> 16) & 0x0f;
875
int lshift = (kcontrol->private_value >> 8) & 0x0f;
876
int rshift = (kcontrol->private_value >> 12) & 0x0f;
877
878
uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
879
if (lshift != rshift && (ac97->flags & AC97_STEREO_MUTES))
880
uinfo->count = 2;
881
else
882
uinfo->count = 1;
883
uinfo->value.integer.min = 0;
884
uinfo->value.integer.max = mask;
885
return 0;
886
}
887
888
static int snd_ac97_ad18xx_pcm_get_bits(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
889
{
890
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
891
int codec = kcontrol->private_value & 3;
892
int lshift = (kcontrol->private_value >> 8) & 0x0f;
893
int rshift = (kcontrol->private_value >> 12) & 0x0f;
894
int mask = (kcontrol->private_value >> 16) & 0xff;
895
896
ucontrol->value.integer.value[0] = mask - ((ac97->spec.ad18xx.pcmreg[codec] >> lshift) & mask);
897
if (lshift != rshift && (ac97->flags & AC97_STEREO_MUTES))
898
ucontrol->value.integer.value[1] = mask - ((ac97->spec.ad18xx.pcmreg[codec] >> rshift) & mask);
899
return 0;
900
}
901
902
static int snd_ac97_ad18xx_pcm_put_bits(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
903
{
904
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
905
int codec = kcontrol->private_value & 3;
906
int lshift = (kcontrol->private_value >> 8) & 0x0f;
907
int rshift = (kcontrol->private_value >> 12) & 0x0f;
908
int mask = (kcontrol->private_value >> 16) & 0xff;
909
unsigned short val, valmask;
910
911
val = (mask - (ucontrol->value.integer.value[0] & mask)) << lshift;
912
valmask = mask << lshift;
913
if (lshift != rshift && (ac97->flags & AC97_STEREO_MUTES)) {
914
val |= (mask - (ucontrol->value.integer.value[1] & mask)) << rshift;
915
valmask |= mask << rshift;
916
}
917
return snd_ac97_ad18xx_update_pcm_bits(ac97, codec, valmask, val);
918
}
919
920
#define AD18XX_PCM_VOLUME(xname, codec) \
921
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_ac97_ad18xx_pcm_info_volume, \
922
.get = snd_ac97_ad18xx_pcm_get_volume, .put = snd_ac97_ad18xx_pcm_put_volume, \
923
.private_value = codec }
924
925
static int snd_ac97_ad18xx_pcm_info_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
926
{
927
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
928
uinfo->count = 2;
929
uinfo->value.integer.min = 0;
930
uinfo->value.integer.max = 31;
931
return 0;
932
}
933
934
static int snd_ac97_ad18xx_pcm_get_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
935
{
936
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
937
int codec = kcontrol->private_value & 3;
938
939
mutex_lock(&ac97->page_mutex);
940
ucontrol->value.integer.value[0] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 8) & 31);
941
ucontrol->value.integer.value[1] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 0) & 31);
942
mutex_unlock(&ac97->page_mutex);
943
return 0;
944
}
945
946
static int snd_ac97_ad18xx_pcm_put_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
947
{
948
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
949
int codec = kcontrol->private_value & 3;
950
unsigned short val1, val2;
951
952
val1 = 31 - (ucontrol->value.integer.value[0] & 31);
953
val2 = 31 - (ucontrol->value.integer.value[1] & 31);
954
return snd_ac97_ad18xx_update_pcm_bits(ac97, codec, 0x1f1f, (val1 << 8) | val2);
955
}
956
957
static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_pcm[2] = {
958
AD18XX_PCM_BITS("PCM Playback Switch", 0, 15, 7, 1),
959
AD18XX_PCM_VOLUME("PCM Playback Volume", 0)
960
};
961
962
static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_surround[2] = {
963
AD18XX_PCM_BITS("Surround Playback Switch", 1, 15, 7, 1),
964
AD18XX_PCM_VOLUME("Surround Playback Volume", 1)
965
};
966
967
static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_center[2] = {
968
AD18XX_PCM_BITS("Center Playback Switch", 2, 15, 15, 1),
969
AD18XX_PCM_BITS("Center Playback Volume", 2, 8, 8, 31)
970
};
971
972
static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_lfe[2] = {
973
AD18XX_PCM_BITS("LFE Playback Switch", 2, 7, 7, 1),
974
AD18XX_PCM_BITS("LFE Playback Volume", 2, 0, 0, 31)
975
};
976
977
/*
978
*
979
*/
980
981
static void snd_ac97_powerdown(struct snd_ac97 *ac97);
982
983
static int snd_ac97_bus_free(struct snd_ac97_bus *bus)
984
{
985
if (bus) {
986
snd_ac97_bus_proc_done(bus);
987
kfree(bus->pcms);
988
if (bus->private_free)
989
bus->private_free(bus);
990
kfree(bus);
991
}
992
return 0;
993
}
994
995
static int snd_ac97_bus_dev_free(struct snd_device *device)
996
{
997
struct snd_ac97_bus *bus = device->device_data;
998
return snd_ac97_bus_free(bus);
999
}
1000
1001
static int snd_ac97_free(struct snd_ac97 *ac97)
1002
{
1003
if (ac97) {
1004
#ifdef CONFIG_SND_AC97_POWER_SAVE
1005
cancel_delayed_work_sync(&ac97->power_work);
1006
#endif
1007
snd_ac97_proc_done(ac97);
1008
if (ac97->bus)
1009
ac97->bus->codec[ac97->num] = NULL;
1010
if (ac97->private_free)
1011
ac97->private_free(ac97);
1012
kfree(ac97);
1013
}
1014
return 0;
1015
}
1016
1017
static int snd_ac97_dev_free(struct snd_device *device)
1018
{
1019
struct snd_ac97 *ac97 = device->device_data;
1020
snd_ac97_powerdown(ac97); /* for avoiding click noises during shut down */
1021
return snd_ac97_free(ac97);
1022
}
1023
1024
static int snd_ac97_try_volume_mix(struct snd_ac97 * ac97, int reg)
1025
{
1026
unsigned short val, mask = AC97_MUTE_MASK_MONO;
1027
1028
if (! snd_ac97_valid_reg(ac97, reg))
1029
return 0;
1030
1031
switch (reg) {
1032
case AC97_MASTER_TONE:
1033
return ac97->caps & AC97_BC_BASS_TREBLE ? 1 : 0;
1034
case AC97_HEADPHONE:
1035
return ac97->caps & AC97_BC_HEADPHONE ? 1 : 0;
1036
case AC97_REC_GAIN_MIC:
1037
return ac97->caps & AC97_BC_DEDICATED_MIC ? 1 : 0;
1038
case AC97_3D_CONTROL:
1039
if (ac97->caps & AC97_BC_3D_TECH_ID_MASK) {
1040
val = snd_ac97_read(ac97, reg);
1041
/* if nonzero - fixed and we can't set it */
1042
return val == 0;
1043
}
1044
return 0;
1045
case AC97_CENTER_LFE_MASTER: /* center */
1046
if ((ac97->ext_id & AC97_EI_CDAC) == 0)
1047
return 0;
1048
break;
1049
case AC97_CENTER_LFE_MASTER+1: /* lfe */
1050
if ((ac97->ext_id & AC97_EI_LDAC) == 0)
1051
return 0;
1052
reg = AC97_CENTER_LFE_MASTER;
1053
mask = 0x0080;
1054
break;
1055
case AC97_SURROUND_MASTER:
1056
if ((ac97->ext_id & AC97_EI_SDAC) == 0)
1057
return 0;
1058
break;
1059
}
1060
1061
val = snd_ac97_read(ac97, reg);
1062
if (!(val & mask)) {
1063
/* nothing seems to be here - mute flag is not set */
1064
/* try another test */
1065
snd_ac97_write_cache(ac97, reg, val | mask);
1066
val = snd_ac97_read(ac97, reg);
1067
val = snd_ac97_read(ac97, reg);
1068
if (!(val & mask))
1069
return 0; /* nothing here */
1070
}
1071
return 1; /* success, useable */
1072
}
1073
1074
static void check_volume_resolution(struct snd_ac97 *ac97, int reg, unsigned char *lo_max, unsigned char *hi_max)
1075
{
1076
unsigned short cbit[3] = { 0x20, 0x10, 0x01 };
1077
unsigned char max[3] = { 63, 31, 15 };
1078
int i;
1079
1080
/* first look up the static resolution table */
1081
if (ac97->res_table) {
1082
const struct snd_ac97_res_table *tbl;
1083
for (tbl = ac97->res_table; tbl->reg; tbl++) {
1084
if (tbl->reg == reg) {
1085
*lo_max = tbl->bits & 0xff;
1086
*hi_max = (tbl->bits >> 8) & 0xff;
1087
return;
1088
}
1089
}
1090
}
1091
1092
*lo_max = *hi_max = 0;
1093
for (i = 0 ; i < ARRAY_SIZE(cbit); i++) {
1094
unsigned short val;
1095
snd_ac97_write(
1096
ac97, reg,
1097
AC97_MUTE_MASK_STEREO | cbit[i] | (cbit[i] << 8)
1098
);
1099
/* Do the read twice due to buffers on some ac97 codecs.
1100
* e.g. The STAC9704 returns exactly what you wrote to the register
1101
* if you read it immediately. This causes the detect routine to fail.
1102
*/
1103
val = snd_ac97_read(ac97, reg);
1104
val = snd_ac97_read(ac97, reg);
1105
if (! *lo_max && (val & 0x7f) == cbit[i])
1106
*lo_max = max[i];
1107
if (! *hi_max && ((val >> 8) & 0x7f) == cbit[i])
1108
*hi_max = max[i];
1109
if (*lo_max && *hi_max)
1110
break;
1111
}
1112
}
1113
1114
static int snd_ac97_try_bit(struct snd_ac97 * ac97, int reg, int bit)
1115
{
1116
unsigned short mask, val, orig, res;
1117
1118
mask = 1 << bit;
1119
orig = snd_ac97_read(ac97, reg);
1120
val = orig ^ mask;
1121
snd_ac97_write(ac97, reg, val);
1122
res = snd_ac97_read(ac97, reg);
1123
snd_ac97_write_cache(ac97, reg, orig);
1124
return res == val;
1125
}
1126
1127
/* check the volume resolution of center/lfe */
1128
static void snd_ac97_change_volume_params2(struct snd_ac97 * ac97, int reg, int shift, unsigned char *max)
1129
{
1130
unsigned short val, val1;
1131
1132
*max = 63;
1133
val = AC97_MUTE_MASK_STEREO | (0x20 << shift);
1134
snd_ac97_write(ac97, reg, val);
1135
val1 = snd_ac97_read(ac97, reg);
1136
if (val != val1) {
1137
*max = 31;
1138
}
1139
/* reset volume to zero */
1140
snd_ac97_write_cache(ac97, reg, AC97_MUTE_MASK_STEREO);
1141
}
1142
1143
static inline int printable(unsigned int x)
1144
{
1145
x &= 0xff;
1146
if (x < ' ' || x >= 0x71) {
1147
if (x <= 0x89)
1148
return x - 0x71 + 'A';
1149
return '?';
1150
}
1151
return x;
1152
}
1153
1154
static struct snd_kcontrol *snd_ac97_cnew(const struct snd_kcontrol_new *_template,
1155
struct snd_ac97 * ac97)
1156
{
1157
struct snd_kcontrol_new template;
1158
memcpy(&template, _template, sizeof(template));
1159
template.index = ac97->num;
1160
return snd_ctl_new1(&template, ac97);
1161
}
1162
1163
/*
1164
* create mute switch(es) for normal stereo controls
1165
*/
1166
static int snd_ac97_cmute_new_stereo(struct snd_card *card, char *name, int reg,
1167
int check_stereo, int check_amix,
1168
struct snd_ac97 *ac97)
1169
{
1170
struct snd_kcontrol *kctl;
1171
int err;
1172
unsigned short val, val1, mute_mask;
1173
1174
if (! snd_ac97_valid_reg(ac97, reg))
1175
return 0;
1176
1177
mute_mask = AC97_MUTE_MASK_MONO;
1178
val = snd_ac97_read(ac97, reg);
1179
if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) {
1180
/* check whether both mute bits work */
1181
val1 = val | AC97_MUTE_MASK_STEREO;
1182
snd_ac97_write(ac97, reg, val1);
1183
if (val1 == snd_ac97_read(ac97, reg))
1184
mute_mask = AC97_MUTE_MASK_STEREO;
1185
}
1186
if (mute_mask == AC97_MUTE_MASK_STEREO) {
1187
struct snd_kcontrol_new tmp = AC97_DOUBLE(name, reg, 15, 7, 1, 1);
1188
if (check_amix)
1189
tmp.private_value |= (1 << 30);
1190
tmp.index = ac97->num;
1191
kctl = snd_ctl_new1(&tmp, ac97);
1192
} else {
1193
struct snd_kcontrol_new tmp = AC97_SINGLE(name, reg, 15, 1, 1);
1194
if (check_amix)
1195
tmp.private_value |= (1 << 30);
1196
tmp.index = ac97->num;
1197
kctl = snd_ctl_new1(&tmp, ac97);
1198
}
1199
err = snd_ctl_add(card, kctl);
1200
if (err < 0)
1201
return err;
1202
/* mute as default */
1203
snd_ac97_write_cache(ac97, reg, val | mute_mask);
1204
return 0;
1205
}
1206
1207
/*
1208
* set dB information
1209
*/
1210
static const DECLARE_TLV_DB_SCALE(db_scale_4bit, -4500, 300, 0);
1211
static const DECLARE_TLV_DB_SCALE(db_scale_5bit, -4650, 150, 0);
1212
static const DECLARE_TLV_DB_SCALE(db_scale_6bit, -9450, 150, 0);
1213
static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0);
1214
static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0);
1215
1216
static const unsigned int *find_db_scale(unsigned int maxval)
1217
{
1218
switch (maxval) {
1219
case 0x0f: return db_scale_4bit;
1220
case 0x1f: return db_scale_5bit;
1221
case 0x3f: return db_scale_6bit;
1222
}
1223
return NULL;
1224
}
1225
1226
static void set_tlv_db_scale(struct snd_kcontrol *kctl, const unsigned int *tlv)
1227
{
1228
kctl->tlv.p = tlv;
1229
if (tlv)
1230
kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1231
}
1232
1233
/*
1234
* create a volume for normal stereo/mono controls
1235
*/
1236
static int snd_ac97_cvol_new(struct snd_card *card, char *name, int reg, unsigned int lo_max,
1237
unsigned int hi_max, struct snd_ac97 *ac97)
1238
{
1239
int err;
1240
struct snd_kcontrol *kctl;
1241
1242
if (! snd_ac97_valid_reg(ac97, reg))
1243
return 0;
1244
if (hi_max) {
1245
/* invert */
1246
struct snd_kcontrol_new tmp = AC97_DOUBLE(name, reg, 8, 0, lo_max, 1);
1247
tmp.index = ac97->num;
1248
kctl = snd_ctl_new1(&tmp, ac97);
1249
} else {
1250
/* invert */
1251
struct snd_kcontrol_new tmp = AC97_SINGLE(name, reg, 0, lo_max, 1);
1252
tmp.index = ac97->num;
1253
kctl = snd_ctl_new1(&tmp, ac97);
1254
}
1255
if (!kctl)
1256
return -ENOMEM;
1257
if (reg >= AC97_PHONE && reg <= AC97_PCM)
1258
set_tlv_db_scale(kctl, db_scale_5bit_12db_max);
1259
else
1260
set_tlv_db_scale(kctl, find_db_scale(lo_max));
1261
err = snd_ctl_add(card, kctl);
1262
if (err < 0)
1263
return err;
1264
snd_ac97_write_cache(
1265
ac97, reg,
1266
(snd_ac97_read(ac97, reg) & AC97_MUTE_MASK_STEREO)
1267
| lo_max | (hi_max << 8)
1268
);
1269
return 0;
1270
}
1271
1272
/*
1273
* create a mute-switch and a volume for normal stereo/mono controls
1274
*/
1275
static int snd_ac97_cmix_new_stereo(struct snd_card *card, const char *pfx,
1276
int reg, int check_stereo, int check_amix,
1277
struct snd_ac97 *ac97)
1278
{
1279
int err;
1280
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1281
unsigned char lo_max, hi_max;
1282
1283
if (! snd_ac97_valid_reg(ac97, reg))
1284
return 0;
1285
1286
if (snd_ac97_try_bit(ac97, reg, 15)) {
1287
sprintf(name, "%s Switch", pfx);
1288
err = snd_ac97_cmute_new_stereo(card, name, reg,
1289
check_stereo, check_amix,
1290
ac97);
1291
if (err < 0)
1292
return err;
1293
}
1294
check_volume_resolution(ac97, reg, &lo_max, &hi_max);
1295
if (lo_max) {
1296
sprintf(name, "%s Volume", pfx);
1297
err = snd_ac97_cvol_new(card, name, reg, lo_max, hi_max, ac97);
1298
if (err < 0)
1299
return err;
1300
}
1301
return 0;
1302
}
1303
1304
#define snd_ac97_cmix_new(card, pfx, reg, acheck, ac97) \
1305
snd_ac97_cmix_new_stereo(card, pfx, reg, 0, acheck, ac97)
1306
#define snd_ac97_cmute_new(card, name, reg, acheck, ac97) \
1307
snd_ac97_cmute_new_stereo(card, name, reg, 0, acheck, ac97)
1308
1309
static unsigned int snd_ac97_determine_spdif_rates(struct snd_ac97 *ac97);
1310
1311
static int snd_ac97_mixer_build(struct snd_ac97 * ac97)
1312
{
1313
struct snd_card *card = ac97->bus->card;
1314
struct snd_kcontrol *kctl;
1315
int err;
1316
unsigned int idx;
1317
unsigned char max;
1318
1319
/* build master controls */
1320
/* AD claims to remove this control from AD1887, although spec v2.2 does not allow this */
1321
if (snd_ac97_try_volume_mix(ac97, AC97_MASTER)) {
1322
if (ac97->flags & AC97_HAS_NO_MASTER_VOL)
1323
err = snd_ac97_cmute_new(card, "Master Playback Switch",
1324
AC97_MASTER, 0, ac97);
1325
else
1326
err = snd_ac97_cmix_new(card, "Master Playback",
1327
AC97_MASTER, 0, ac97);
1328
if (err < 0)
1329
return err;
1330
}
1331
1332
ac97->regs[AC97_CENTER_LFE_MASTER] = AC97_MUTE_MASK_STEREO;
1333
1334
/* build center controls */
1335
if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER))
1336
&& !(ac97->flags & AC97_AD_MULTI)) {
1337
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_center[0], ac97));
1338
if (err < 0)
1339
return err;
1340
err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_center[1], ac97));
1341
if (err < 0)
1342
return err;
1343
snd_ac97_change_volume_params2(ac97, AC97_CENTER_LFE_MASTER, 0, &max);
1344
kctl->private_value &= ~(0xff << 16);
1345
kctl->private_value |= (int)max << 16;
1346
set_tlv_db_scale(kctl, find_db_scale(max));
1347
snd_ac97_write_cache(ac97, AC97_CENTER_LFE_MASTER, ac97->regs[AC97_CENTER_LFE_MASTER] | max);
1348
}
1349
1350
/* build LFE controls */
1351
if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER+1))
1352
&& !(ac97->flags & AC97_AD_MULTI)) {
1353
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_lfe[0], ac97));
1354
if (err < 0)
1355
return err;
1356
err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_lfe[1], ac97));
1357
if (err < 0)
1358
return err;
1359
snd_ac97_change_volume_params2(ac97, AC97_CENTER_LFE_MASTER, 8, &max);
1360
kctl->private_value &= ~(0xff << 16);
1361
kctl->private_value |= (int)max << 16;
1362
set_tlv_db_scale(kctl, find_db_scale(max));
1363
snd_ac97_write_cache(ac97, AC97_CENTER_LFE_MASTER, ac97->regs[AC97_CENTER_LFE_MASTER] | max << 8);
1364
}
1365
1366
/* build surround controls */
1367
if ((snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER))
1368
&& !(ac97->flags & AC97_AD_MULTI)) {
1369
/* Surround Master (0x38) is with stereo mutes */
1370
err = snd_ac97_cmix_new_stereo(card, "Surround Playback",
1371
AC97_SURROUND_MASTER, 1, 0,
1372
ac97);
1373
if (err < 0)
1374
return err;
1375
}
1376
1377
/* build headphone controls */
1378
if (snd_ac97_try_volume_mix(ac97, AC97_HEADPHONE)) {
1379
err = snd_ac97_cmix_new(card, "Headphone Playback",
1380
AC97_HEADPHONE, 0, ac97);
1381
if (err < 0)
1382
return err;
1383
}
1384
1385
/* build master mono controls */
1386
if (snd_ac97_try_volume_mix(ac97, AC97_MASTER_MONO)) {
1387
err = snd_ac97_cmix_new(card, "Master Mono Playback",
1388
AC97_MASTER_MONO, 0, ac97);
1389
if (err < 0)
1390
return err;
1391
}
1392
1393
/* build master tone controls */
1394
if (!(ac97->flags & AC97_HAS_NO_TONE)) {
1395
if (snd_ac97_try_volume_mix(ac97, AC97_MASTER_TONE)) {
1396
for (idx = 0; idx < 2; idx++) {
1397
kctl = snd_ac97_cnew(&snd_ac97_controls_tone[idx], ac97);
1398
err = snd_ctl_add(card, kctl);
1399
if (err < 0)
1400
return err;
1401
if (ac97->id == AC97_ID_YMF743 ||
1402
ac97->id == AC97_ID_YMF753) {
1403
kctl->private_value &= ~(0xff << 16);
1404
kctl->private_value |= 7 << 16;
1405
}
1406
}
1407
snd_ac97_write_cache(ac97, AC97_MASTER_TONE, 0x0f0f);
1408
}
1409
}
1410
1411
/* build Beep controls */
1412
if (!(ac97->flags & AC97_HAS_NO_PC_BEEP) &&
1413
((ac97->flags & AC97_HAS_PC_BEEP) ||
1414
snd_ac97_try_volume_mix(ac97, AC97_PC_BEEP))) {
1415
for (idx = 0; idx < 2; idx++) {
1416
kctl = snd_ac97_cnew(&snd_ac97_controls_pc_beep[idx], ac97);
1417
err = snd_ctl_add(card, kctl);
1418
if (err < 0)
1419
return err;
1420
}
1421
set_tlv_db_scale(kctl, db_scale_4bit);
1422
snd_ac97_write_cache(
1423
ac97,
1424
AC97_PC_BEEP,
1425
(snd_ac97_read(ac97, AC97_PC_BEEP)
1426
| AC97_MUTE_MASK_MONO | 0x001e)
1427
);
1428
}
1429
1430
/* build Phone controls */
1431
if (!(ac97->flags & AC97_HAS_NO_PHONE)) {
1432
if (snd_ac97_try_volume_mix(ac97, AC97_PHONE)) {
1433
err = snd_ac97_cmix_new(card, "Phone Playback",
1434
AC97_PHONE, 1, ac97);
1435
if (err < 0)
1436
return err;
1437
}
1438
}
1439
1440
/* build MIC controls */
1441
if (!(ac97->flags & AC97_HAS_NO_MIC)) {
1442
if (snd_ac97_try_volume_mix(ac97, AC97_MIC)) {
1443
err = snd_ac97_cmix_new(card, "Mic Playback",
1444
AC97_MIC, 1, ac97);
1445
if (err < 0)
1446
return err;
1447
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_mic_boost, ac97));
1448
if (err < 0)
1449
return err;
1450
}
1451
}
1452
1453
/* build Line controls */
1454
if (snd_ac97_try_volume_mix(ac97, AC97_LINE)) {
1455
err = snd_ac97_cmix_new(card, "Line Playback",
1456
AC97_LINE, 1, ac97);
1457
if (err < 0)
1458
return err;
1459
}
1460
1461
/* build CD controls */
1462
if (!(ac97->flags & AC97_HAS_NO_CD)) {
1463
if (snd_ac97_try_volume_mix(ac97, AC97_CD)) {
1464
err = snd_ac97_cmix_new(card, "CD Playback",
1465
AC97_CD, 1, ac97);
1466
if (err < 0)
1467
return err;
1468
}
1469
}
1470
1471
/* build Video controls */
1472
if (!(ac97->flags & AC97_HAS_NO_VIDEO)) {
1473
if (snd_ac97_try_volume_mix(ac97, AC97_VIDEO)) {
1474
err = snd_ac97_cmix_new(card, "Video Playback",
1475
AC97_VIDEO, 1, ac97);
1476
if (err < 0)
1477
return err;
1478
}
1479
}
1480
1481
/* build Aux controls */
1482
if (!(ac97->flags & AC97_HAS_NO_AUX)) {
1483
if (snd_ac97_try_volume_mix(ac97, AC97_AUX)) {
1484
err = snd_ac97_cmix_new(card, "Aux Playback",
1485
AC97_AUX, 1, ac97);
1486
if (err < 0)
1487
return err;
1488
}
1489
}
1490
1491
/* build PCM controls */
1492
if (ac97->flags & AC97_AD_MULTI) {
1493
unsigned short init_val;
1494
if (ac97->flags & AC97_STEREO_MUTES)
1495
init_val = 0x9f9f;
1496
else
1497
init_val = 0x9f1f;
1498
for (idx = 0; idx < 2; idx++) {
1499
kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_pcm[idx], ac97);
1500
err = snd_ctl_add(card, kctl);
1501
if (err < 0)
1502
return err;
1503
}
1504
set_tlv_db_scale(kctl, db_scale_5bit);
1505
ac97->spec.ad18xx.pcmreg[0] = init_val;
1506
if (ac97->scaps & AC97_SCAP_SURROUND_DAC) {
1507
for (idx = 0; idx < 2; idx++) {
1508
kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_surround[idx], ac97);
1509
err = snd_ctl_add(card, kctl);
1510
if (err < 0)
1511
return err;
1512
}
1513
set_tlv_db_scale(kctl, db_scale_5bit);
1514
ac97->spec.ad18xx.pcmreg[1] = init_val;
1515
}
1516
if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC) {
1517
for (idx = 0; idx < 2; idx++) {
1518
kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_center[idx], ac97);
1519
err = snd_ctl_add(card, kctl);
1520
if (err < 0)
1521
return err;
1522
}
1523
set_tlv_db_scale(kctl, db_scale_5bit);
1524
for (idx = 0; idx < 2; idx++) {
1525
kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_lfe[idx], ac97);
1526
err = snd_ctl_add(card, kctl);
1527
if (err < 0)
1528
return err;
1529
}
1530
set_tlv_db_scale(kctl, db_scale_5bit);
1531
ac97->spec.ad18xx.pcmreg[2] = init_val;
1532
}
1533
snd_ac97_write_cache(ac97, AC97_PCM, init_val);
1534
} else {
1535
if (!(ac97->flags & AC97_HAS_NO_STD_PCM)) {
1536
if (ac97->flags & AC97_HAS_NO_PCM_VOL)
1537
err = snd_ac97_cmute_new(card,
1538
"PCM Playback Switch",
1539
AC97_PCM, 0, ac97);
1540
else
1541
err = snd_ac97_cmix_new(card, "PCM Playback",
1542
AC97_PCM, 0, ac97);
1543
if (err < 0)
1544
return err;
1545
}
1546
}
1547
1548
/* build Capture controls */
1549
if (!(ac97->flags & AC97_HAS_NO_REC_GAIN)) {
1550
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_control_capture_src, ac97));
1551
if (err < 0)
1552
return err;
1553
if (snd_ac97_try_bit(ac97, AC97_REC_GAIN, 15)) {
1554
err = snd_ac97_cmute_new(card, "Capture Switch",
1555
AC97_REC_GAIN, 0, ac97);
1556
if (err < 0)
1557
return err;
1558
}
1559
kctl = snd_ac97_cnew(&snd_ac97_control_capture_vol, ac97);
1560
err = snd_ctl_add(card, kctl);
1561
if (err < 0)
1562
return err;
1563
set_tlv_db_scale(kctl, db_scale_rec_gain);
1564
snd_ac97_write_cache(ac97, AC97_REC_SEL, 0x0000);
1565
snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x0000);
1566
}
1567
/* build MIC Capture controls */
1568
if (snd_ac97_try_volume_mix(ac97, AC97_REC_GAIN_MIC)) {
1569
for (idx = 0; idx < 2; idx++) {
1570
kctl = snd_ac97_cnew(&snd_ac97_controls_mic_capture[idx], ac97);
1571
err = snd_ctl_add(card, kctl);
1572
if (err < 0)
1573
return err;
1574
}
1575
set_tlv_db_scale(kctl, db_scale_rec_gain);
1576
snd_ac97_write_cache(ac97, AC97_REC_GAIN_MIC, 0x0000);
1577
}
1578
1579
/* build PCM out path & mute control */
1580
if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 15)) {
1581
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_PCM_OUT], ac97));
1582
if (err < 0)
1583
return err;
1584
}
1585
1586
/* build Simulated Stereo Enhancement control */
1587
if (ac97->caps & AC97_BC_SIM_STEREO) {
1588
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_STEREO_ENHANCEMENT], ac97));
1589
if (err < 0)
1590
return err;
1591
}
1592
1593
/* build 3D Stereo Enhancement control */
1594
if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 13)) {
1595
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_3D], ac97));
1596
if (err < 0)
1597
return err;
1598
}
1599
1600
/* build Loudness control */
1601
if (ac97->caps & AC97_BC_LOUDNESS) {
1602
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_LOUDNESS], ac97));
1603
if (err < 0)
1604
return err;
1605
}
1606
1607
/* build Mono output select control */
1608
if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 9)) {
1609
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_MONO], ac97));
1610
if (err < 0)
1611
return err;
1612
}
1613
1614
/* build Mic select control */
1615
if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 8)) {
1616
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_MIC], ac97));
1617
if (err < 0)
1618
return err;
1619
}
1620
1621
/* build ADC/DAC loopback control */
1622
if (enable_loopback && snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 7)) {
1623
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_LOOPBACK], ac97));
1624
if (err < 0)
1625
return err;
1626
}
1627
1628
snd_ac97_update_bits(ac97, AC97_GENERAL_PURPOSE, ~AC97_GP_DRSS_MASK, 0x0000);
1629
1630
/* build 3D controls */
1631
if (ac97->build_ops->build_3d) {
1632
ac97->build_ops->build_3d(ac97);
1633
} else {
1634
if (snd_ac97_try_volume_mix(ac97, AC97_3D_CONTROL)) {
1635
unsigned short val;
1636
val = 0x0707;
1637
snd_ac97_write(ac97, AC97_3D_CONTROL, val);
1638
val = snd_ac97_read(ac97, AC97_3D_CONTROL);
1639
val = val == 0x0606;
1640
kctl = snd_ac97_cnew(&snd_ac97_controls_3d[0], ac97);
1641
err = snd_ctl_add(card, kctl);
1642
if (err < 0)
1643
return err;
1644
if (val)
1645
kctl->private_value = AC97_3D_CONTROL | (9 << 8) | (7 << 16);
1646
kctl = snd_ac97_cnew(&snd_ac97_controls_3d[1], ac97);
1647
err = snd_ctl_add(card, kctl);
1648
if (err < 0)
1649
return err;
1650
if (val)
1651
kctl->private_value = AC97_3D_CONTROL | (1 << 8) | (7 << 16);
1652
snd_ac97_write_cache(ac97, AC97_3D_CONTROL, 0x0000);
1653
}
1654
}
1655
1656
/* build S/PDIF controls */
1657
1658
/* Hack for ASUS P5P800-VM, which does not indicate S/PDIF capability */
1659
if (ac97->subsystem_vendor == 0x1043 &&
1660
ac97->subsystem_device == 0x810f)
1661
ac97->ext_id |= AC97_EI_SPDIF;
1662
1663
if ((ac97->ext_id & AC97_EI_SPDIF) && !(ac97->scaps & AC97_SCAP_NO_SPDIF)) {
1664
if (ac97->build_ops->build_spdif) {
1665
err = ac97->build_ops->build_spdif(ac97);
1666
if (err < 0)
1667
return err;
1668
} else {
1669
for (idx = 0; idx < 5; idx++) {
1670
err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_spdif[idx], ac97));
1671
if (err < 0)
1672
return err;
1673
}
1674
if (ac97->build_ops->build_post_spdif) {
1675
err = ac97->build_ops->build_post_spdif(ac97);
1676
if (err < 0)
1677
return err;
1678
}
1679
/* set default PCM S/PDIF params */
1680
/* consumer,PCM audio,no copyright,no preemphasis,PCM coder,original,48000Hz */
1681
snd_ac97_write_cache(ac97, AC97_SPDIF, 0x2a20);
1682
ac97->rates[AC97_RATES_SPDIF] = snd_ac97_determine_spdif_rates(ac97);
1683
}
1684
ac97->spdif_status = SNDRV_PCM_DEFAULT_CON_SPDIF;
1685
}
1686
1687
/* build chip specific controls */
1688
if (ac97->build_ops->build_specific) {
1689
err = ac97->build_ops->build_specific(ac97);
1690
if (err < 0)
1691
return err;
1692
}
1693
1694
if (snd_ac97_try_bit(ac97, AC97_POWERDOWN, 15)) {
1695
kctl = snd_ac97_cnew(&snd_ac97_control_eapd, ac97);
1696
if (! kctl)
1697
return -ENOMEM;
1698
if (ac97->scaps & AC97_SCAP_INV_EAPD)
1699
set_inv_eapd(ac97, kctl);
1700
err = snd_ctl_add(card, kctl);
1701
if (err < 0)
1702
return err;
1703
}
1704
1705
return 0;
1706
}
1707
1708
static int snd_ac97_modem_build(struct snd_card *card, struct snd_ac97 * ac97)
1709
{
1710
int err, idx;
1711
1712
/*
1713
ac97_dbg(ac97, "AC97_GPIO_CFG = %x\n",
1714
snd_ac97_read(ac97,AC97_GPIO_CFG));
1715
*/
1716
snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH));
1717
snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH));
1718
snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff);
1719
snd_ac97_write(ac97, AC97_GPIO_WAKEUP, 0x0);
1720
snd_ac97_write(ac97, AC97_MISC_AFE, 0x0);
1721
1722
/* build modem switches */
1723
for (idx = 0; idx < ARRAY_SIZE(snd_ac97_controls_modem_switches); idx++) {
1724
err = snd_ctl_add(card, snd_ctl_new1(&snd_ac97_controls_modem_switches[idx], ac97));
1725
if (err < 0)
1726
return err;
1727
}
1728
1729
/* build chip specific controls */
1730
if (ac97->build_ops->build_specific) {
1731
err = ac97->build_ops->build_specific(ac97);
1732
if (err < 0)
1733
return err;
1734
}
1735
1736
return 0;
1737
}
1738
1739
static int snd_ac97_test_rate(struct snd_ac97 *ac97, int reg, int shadow_reg, int rate)
1740
{
1741
unsigned short val;
1742
unsigned int tmp;
1743
1744
tmp = ((unsigned int)rate * ac97->bus->clock) / 48000;
1745
snd_ac97_write_cache(ac97, reg, tmp & 0xffff);
1746
if (shadow_reg)
1747
snd_ac97_write_cache(ac97, shadow_reg, tmp & 0xffff);
1748
val = snd_ac97_read(ac97, reg);
1749
return val == (tmp & 0xffff);
1750
}
1751
1752
static void snd_ac97_determine_rates(struct snd_ac97 *ac97, int reg, int shadow_reg, unsigned int *r_result)
1753
{
1754
unsigned int result = 0;
1755
unsigned short saved;
1756
1757
if (ac97->bus->no_vra) {
1758
*r_result = SNDRV_PCM_RATE_48000;
1759
if ((ac97->flags & AC97_DOUBLE_RATE) &&
1760
reg == AC97_PCM_FRONT_DAC_RATE)
1761
*r_result |= SNDRV_PCM_RATE_96000;
1762
return;
1763
}
1764
1765
saved = snd_ac97_read(ac97, reg);
1766
if ((ac97->ext_id & AC97_EI_DRA) && reg == AC97_PCM_FRONT_DAC_RATE)
1767
snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS,
1768
AC97_EA_DRA, 0);
1769
/* test a non-standard rate */
1770
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 11000))
1771
result |= SNDRV_PCM_RATE_CONTINUOUS;
1772
/* let's try to obtain standard rates */
1773
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 8000))
1774
result |= SNDRV_PCM_RATE_8000;
1775
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 11025))
1776
result |= SNDRV_PCM_RATE_11025;
1777
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 16000))
1778
result |= SNDRV_PCM_RATE_16000;
1779
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 22050))
1780
result |= SNDRV_PCM_RATE_22050;
1781
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 32000))
1782
result |= SNDRV_PCM_RATE_32000;
1783
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 44100))
1784
result |= SNDRV_PCM_RATE_44100;
1785
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 48000))
1786
result |= SNDRV_PCM_RATE_48000;
1787
if ((ac97->flags & AC97_DOUBLE_RATE) &&
1788
reg == AC97_PCM_FRONT_DAC_RATE) {
1789
/* test standard double rates */
1790
snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS,
1791
AC97_EA_DRA, AC97_EA_DRA);
1792
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 64000 / 2))
1793
result |= SNDRV_PCM_RATE_64000;
1794
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 88200 / 2))
1795
result |= SNDRV_PCM_RATE_88200;
1796
if (snd_ac97_test_rate(ac97, reg, shadow_reg, 96000 / 2))
1797
result |= SNDRV_PCM_RATE_96000;
1798
/* some codecs don't support variable double rates */
1799
if (!snd_ac97_test_rate(ac97, reg, shadow_reg, 76100 / 2))
1800
result &= ~SNDRV_PCM_RATE_CONTINUOUS;
1801
snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS,
1802
AC97_EA_DRA, 0);
1803
}
1804
/* restore the default value */
1805
snd_ac97_write_cache(ac97, reg, saved);
1806
if (shadow_reg)
1807
snd_ac97_write_cache(ac97, shadow_reg, saved);
1808
*r_result = result;
1809
}
1810
1811
/* check AC97_SPDIF register to accept which sample rates */
1812
static unsigned int snd_ac97_determine_spdif_rates(struct snd_ac97 *ac97)
1813
{
1814
unsigned int result = 0;
1815
int i;
1816
static const unsigned short ctl_bits[] = {
1817
AC97_SC_SPSR_44K, AC97_SC_SPSR_32K, AC97_SC_SPSR_48K
1818
};
1819
static const unsigned int rate_bits[] = {
1820
SNDRV_PCM_RATE_44100, SNDRV_PCM_RATE_32000, SNDRV_PCM_RATE_48000
1821
};
1822
1823
for (i = 0; i < (int)ARRAY_SIZE(ctl_bits); i++) {
1824
snd_ac97_update_bits(ac97, AC97_SPDIF, AC97_SC_SPSR_MASK, ctl_bits[i]);
1825
if ((snd_ac97_read(ac97, AC97_SPDIF) & AC97_SC_SPSR_MASK) == ctl_bits[i])
1826
result |= rate_bits[i];
1827
}
1828
return result;
1829
}
1830
1831
/* look for the codec id table matching with the given id */
1832
static const struct ac97_codec_id *look_for_codec_id(const struct ac97_codec_id *table,
1833
unsigned int id)
1834
{
1835
const struct ac97_codec_id *pid;
1836
1837
for (pid = table; pid->id; pid++)
1838
if (pid->id == (id & pid->mask))
1839
return pid;
1840
return NULL;
1841
}
1842
1843
void snd_ac97_get_name(struct snd_ac97 *ac97, unsigned int id, char *name,
1844
size_t maxlen, int modem)
1845
{
1846
const struct ac97_codec_id *pid;
1847
1848
sprintf(name, "0x%x %c%c%c", id,
1849
printable(id >> 24),
1850
printable(id >> 16),
1851
printable(id >> 8));
1852
pid = look_for_codec_id(snd_ac97_codec_id_vendors, id);
1853
if (! pid)
1854
return;
1855
1856
strscpy(name, pid->name, maxlen);
1857
if (ac97 && pid->patch) {
1858
if ((modem && (pid->flags & AC97_MODEM_PATCH)) ||
1859
(! modem && ! (pid->flags & AC97_MODEM_PATCH)))
1860
pid->patch(ac97);
1861
}
1862
1863
pid = look_for_codec_id(snd_ac97_codec_ids, id);
1864
if (pid) {
1865
strlcat(name, " ", maxlen);
1866
strlcat(name, pid->name, maxlen);
1867
if (pid->mask != 0xffffffff)
1868
sprintf(name + strlen(name), " rev %u", id & ~pid->mask);
1869
if (ac97 && pid->patch) {
1870
if ((modem && (pid->flags & AC97_MODEM_PATCH)) ||
1871
(! modem && ! (pid->flags & AC97_MODEM_PATCH)))
1872
pid->patch(ac97);
1873
}
1874
} else {
1875
int l = strlen(name);
1876
snprintf(name + l, maxlen - l, " id %x", id & 0xff);
1877
}
1878
}
1879
1880
/**
1881
* snd_ac97_get_short_name - retrieve codec name
1882
* @ac97: the codec instance
1883
*
1884
* Return: The short identifying name of the codec.
1885
*/
1886
const char *snd_ac97_get_short_name(struct snd_ac97 *ac97)
1887
{
1888
const struct ac97_codec_id *pid;
1889
1890
for (pid = snd_ac97_codec_ids; pid->id; pid++)
1891
if (pid->id == (ac97->id & pid->mask))
1892
return pid->name;
1893
return "unknown codec";
1894
}
1895
1896
EXPORT_SYMBOL(snd_ac97_get_short_name);
1897
1898
/* wait for a while until registers are accessible after RESET
1899
* return 0 if ok, negative not ready
1900
*/
1901
static int ac97_reset_wait(struct snd_ac97 *ac97, int timeout, int with_modem)
1902
{
1903
unsigned long end_time;
1904
unsigned short val;
1905
1906
end_time = jiffies + timeout;
1907
do {
1908
1909
/* use preliminary reads to settle the communication */
1910
snd_ac97_read(ac97, AC97_RESET);
1911
snd_ac97_read(ac97, AC97_VENDOR_ID1);
1912
snd_ac97_read(ac97, AC97_VENDOR_ID2);
1913
/* modem? */
1914
if (with_modem) {
1915
val = snd_ac97_read(ac97, AC97_EXTENDED_MID);
1916
if (val != 0xffff && (val & 1) != 0)
1917
return 0;
1918
}
1919
if (ac97->scaps & AC97_SCAP_DETECT_BY_VENDOR) {
1920
/* probably only Xbox issue - all registers are read as zero */
1921
val = snd_ac97_read(ac97, AC97_VENDOR_ID1);
1922
if (val != 0 && val != 0xffff)
1923
return 0;
1924
} else {
1925
/* because the PCM or MASTER volume registers can be modified,
1926
* the REC_GAIN register is used for tests
1927
*/
1928
/* test if we can write to the record gain volume register */
1929
snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a05);
1930
if ((snd_ac97_read(ac97, AC97_REC_GAIN) & 0x7fff) == 0x0a05)
1931
return 0;
1932
}
1933
schedule_timeout_uninterruptible(1);
1934
} while (time_after_eq(end_time, jiffies));
1935
return -ENODEV;
1936
}
1937
1938
/**
1939
* snd_ac97_bus - create an AC97 bus component
1940
* @card: the card instance
1941
* @num: the bus number
1942
* @ops: the bus callbacks table
1943
* @private_data: private data pointer for the new instance
1944
* @rbus: the pointer to store the new AC97 bus instance.
1945
*
1946
* Creates an AC97 bus component. An struct snd_ac97_bus instance is newly
1947
* allocated and initialized.
1948
*
1949
* The ops table must include valid callbacks (at least read and
1950
* write). The other callbacks, wait and reset, are not mandatory.
1951
*
1952
* The clock is set to 48000. If another clock is needed, set
1953
* ``(*rbus)->clock`` manually.
1954
*
1955
* The AC97 bus instance is registered as a low-level device, so you don't
1956
* have to release it manually.
1957
*
1958
* Return: Zero if successful, or a negative error code on failure.
1959
*/
1960
int snd_ac97_bus(struct snd_card *card, int num,
1961
const struct snd_ac97_bus_ops *ops,
1962
void *private_data, struct snd_ac97_bus **rbus)
1963
{
1964
int err;
1965
struct snd_ac97_bus *bus;
1966
static const struct snd_device_ops dev_ops = {
1967
.dev_free = snd_ac97_bus_dev_free,
1968
};
1969
1970
if (snd_BUG_ON(!card))
1971
return -EINVAL;
1972
bus = kzalloc(sizeof(*bus), GFP_KERNEL);
1973
if (bus == NULL)
1974
return -ENOMEM;
1975
bus->card = card;
1976
bus->num = num;
1977
bus->ops = ops;
1978
bus->private_data = private_data;
1979
bus->clock = 48000;
1980
spin_lock_init(&bus->bus_lock);
1981
snd_ac97_bus_proc_init(bus);
1982
err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops);
1983
if (err < 0) {
1984
snd_ac97_bus_free(bus);
1985
return err;
1986
}
1987
if (rbus)
1988
*rbus = bus;
1989
return 0;
1990
}
1991
1992
EXPORT_SYMBOL(snd_ac97_bus);
1993
1994
/* stop no dev release warning */
1995
static void ac97_device_release(struct device * dev)
1996
{
1997
}
1998
1999
/* register ac97 codec to bus */
2000
static int snd_ac97_dev_register(struct snd_device *device)
2001
{
2002
struct snd_ac97 *ac97 = device->device_data;
2003
int err;
2004
2005
ac97->dev.bus = &ac97_bus_type;
2006
ac97->dev.parent = ac97->bus->card->dev;
2007
ac97->dev.release = ac97_device_release;
2008
dev_set_name(&ac97->dev, "%d-%d:%s",
2009
ac97->bus->card->number, ac97->num,
2010
snd_ac97_get_short_name(ac97));
2011
err = device_register(&ac97->dev);
2012
if (err < 0) {
2013
ac97_err(ac97, "Can't register ac97 bus\n");
2014
put_device(&ac97->dev);
2015
ac97->dev.bus = NULL;
2016
return err;
2017
}
2018
return 0;
2019
}
2020
2021
/* disconnect ac97 codec */
2022
static int snd_ac97_dev_disconnect(struct snd_device *device)
2023
{
2024
struct snd_ac97 *ac97 = device->device_data;
2025
if (ac97->dev.bus)
2026
device_unregister(&ac97->dev);
2027
return 0;
2028
}
2029
2030
/* build_ops to do nothing */
2031
static const struct snd_ac97_build_ops null_build_ops;
2032
2033
#ifdef CONFIG_SND_AC97_POWER_SAVE
2034
static void do_update_power(struct work_struct *work)
2035
{
2036
update_power_regs(
2037
container_of(work, struct snd_ac97, power_work.work));
2038
}
2039
#endif
2040
2041
/**
2042
* snd_ac97_mixer - create an Codec97 component
2043
* @bus: the AC97 bus which codec is attached to
2044
* @template: the template of ac97, including index, callbacks and
2045
* the private data.
2046
* @rac97: the pointer to store the new ac97 instance.
2047
*
2048
* Creates an Codec97 component. An struct snd_ac97 instance is newly
2049
* allocated and initialized from the template. The codec
2050
* is then initialized by the standard procedure.
2051
*
2052
* The template must include the codec number (num) and address (addr),
2053
* and the private data (private_data).
2054
*
2055
* The ac97 instance is registered as a low-level device, so you don't
2056
* have to release it manually.
2057
*
2058
* Return: Zero if successful, or a negative error code on failure.
2059
*/
2060
int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, struct snd_ac97 **rac97)
2061
{
2062
int err;
2063
struct snd_ac97 *ac97;
2064
struct snd_card *card;
2065
char name[64];
2066
unsigned long end_time;
2067
unsigned int reg;
2068
const struct ac97_codec_id *pid;
2069
static const struct snd_device_ops ops = {
2070
.dev_free = snd_ac97_dev_free,
2071
.dev_register = snd_ac97_dev_register,
2072
.dev_disconnect = snd_ac97_dev_disconnect,
2073
};
2074
2075
if (snd_BUG_ON(!bus || !template || !rac97))
2076
return -EINVAL;
2077
*rac97 = NULL;
2078
if (snd_BUG_ON(template->num >= 4))
2079
return -EINVAL;
2080
if (bus->codec[template->num])
2081
return -EBUSY;
2082
2083
card = bus->card;
2084
ac97 = kzalloc(sizeof(*ac97), GFP_KERNEL);
2085
if (ac97 == NULL)
2086
return -ENOMEM;
2087
ac97->private_data = template->private_data;
2088
ac97->private_free = template->private_free;
2089
ac97->bus = bus;
2090
ac97->pci = template->pci;
2091
ac97->num = template->num;
2092
ac97->addr = template->addr;
2093
ac97->scaps = template->scaps;
2094
ac97->res_table = template->res_table;
2095
bus->codec[ac97->num] = ac97;
2096
mutex_init(&ac97->reg_mutex);
2097
mutex_init(&ac97->page_mutex);
2098
#ifdef CONFIG_SND_AC97_POWER_SAVE
2099
INIT_DELAYED_WORK(&ac97->power_work, do_update_power);
2100
#endif
2101
2102
#ifdef CONFIG_PCI
2103
if (ac97->pci) {
2104
pci_read_config_word(ac97->pci, PCI_SUBSYSTEM_VENDOR_ID, &ac97->subsystem_vendor);
2105
pci_read_config_word(ac97->pci, PCI_SUBSYSTEM_ID, &ac97->subsystem_device);
2106
}
2107
#endif
2108
if (bus->ops->reset) {
2109
bus->ops->reset(ac97);
2110
goto __access_ok;
2111
}
2112
2113
ac97->id = snd_ac97_read(ac97, AC97_VENDOR_ID1) << 16;
2114
ac97->id |= snd_ac97_read(ac97, AC97_VENDOR_ID2);
2115
if (ac97->id && ac97->id != (unsigned int)-1) {
2116
pid = look_for_codec_id(snd_ac97_codec_ids, ac97->id);
2117
if (pid && (pid->flags & AC97_DEFAULT_POWER_OFF))
2118
goto __access_ok;
2119
}
2120
2121
/* reset to defaults */
2122
if (!(ac97->scaps & AC97_SCAP_SKIP_AUDIO))
2123
snd_ac97_write(ac97, AC97_RESET, 0);
2124
if (!(ac97->scaps & AC97_SCAP_SKIP_MODEM))
2125
snd_ac97_write(ac97, AC97_EXTENDED_MID, 0);
2126
if (bus->ops->wait)
2127
bus->ops->wait(ac97);
2128
else {
2129
udelay(50);
2130
if (ac97->scaps & AC97_SCAP_SKIP_AUDIO)
2131
err = ac97_reset_wait(ac97, msecs_to_jiffies(500), 1);
2132
else {
2133
err = ac97_reset_wait(ac97, msecs_to_jiffies(500), 0);
2134
if (err < 0)
2135
err = ac97_reset_wait(ac97,
2136
msecs_to_jiffies(500), 1);
2137
}
2138
if (err < 0) {
2139
ac97_warn(ac97, "AC'97 %d does not respond - RESET\n",
2140
ac97->num);
2141
/* proceed anyway - it's often non-critical */
2142
}
2143
}
2144
__access_ok:
2145
ac97->id = snd_ac97_read(ac97, AC97_VENDOR_ID1) << 16;
2146
ac97->id |= snd_ac97_read(ac97, AC97_VENDOR_ID2);
2147
if (! (ac97->scaps & AC97_SCAP_DETECT_BY_VENDOR) &&
2148
(ac97->id == 0x00000000 || ac97->id == 0xffffffff)) {
2149
ac97_err(ac97,
2150
"AC'97 %d access is not valid [0x%x], removing mixer.\n",
2151
ac97->num, ac97->id);
2152
snd_ac97_free(ac97);
2153
return -EIO;
2154
}
2155
pid = look_for_codec_id(snd_ac97_codec_ids, ac97->id);
2156
if (pid)
2157
ac97->flags |= pid->flags;
2158
2159
/* test for AC'97 */
2160
if (!(ac97->scaps & AC97_SCAP_SKIP_AUDIO) && !(ac97->scaps & AC97_SCAP_AUDIO)) {
2161
/* test if we can write to the record gain volume register */
2162
snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a06);
2163
err = snd_ac97_read(ac97, AC97_REC_GAIN);
2164
if ((err & 0x7fff) == 0x0a06)
2165
ac97->scaps |= AC97_SCAP_AUDIO;
2166
}
2167
if (ac97->scaps & AC97_SCAP_AUDIO) {
2168
ac97->caps = snd_ac97_read(ac97, AC97_RESET);
2169
ac97->ext_id = snd_ac97_read(ac97, AC97_EXTENDED_ID);
2170
if (ac97->ext_id == 0xffff) /* invalid combination */
2171
ac97->ext_id = 0;
2172
}
2173
2174
/* test for MC'97 */
2175
if (!(ac97->scaps & AC97_SCAP_SKIP_MODEM) && !(ac97->scaps & AC97_SCAP_MODEM)) {
2176
ac97->ext_mid = snd_ac97_read(ac97, AC97_EXTENDED_MID);
2177
if (ac97->ext_mid == 0xffff) /* invalid combination */
2178
ac97->ext_mid = 0;
2179
if (ac97->ext_mid & 1)
2180
ac97->scaps |= AC97_SCAP_MODEM;
2181
}
2182
2183
if (!ac97_is_audio(ac97) && !ac97_is_modem(ac97)) {
2184
if (!(ac97->scaps & (AC97_SCAP_SKIP_AUDIO|AC97_SCAP_SKIP_MODEM)))
2185
ac97_err(ac97,
2186
"AC'97 %d access error (not audio or modem codec)\n",
2187
ac97->num);
2188
snd_ac97_free(ac97);
2189
return -EACCES;
2190
}
2191
2192
if (bus->ops->reset) // FIXME: always skipping?
2193
goto __ready_ok;
2194
2195
/* FIXME: add powerdown control */
2196
if (ac97_is_audio(ac97)) {
2197
/* nothing should be in powerdown mode */
2198
snd_ac97_write_cache(ac97, AC97_POWERDOWN, 0);
2199
if (! (ac97->flags & AC97_DEFAULT_POWER_OFF)) {
2200
snd_ac97_write_cache(ac97, AC97_RESET, 0); /* reset to defaults */
2201
udelay(100);
2202
snd_ac97_write_cache(ac97, AC97_POWERDOWN, 0);
2203
}
2204
/* nothing should be in powerdown mode */
2205
snd_ac97_write_cache(ac97, AC97_GENERAL_PURPOSE, 0);
2206
end_time = jiffies + msecs_to_jiffies(5000);
2207
do {
2208
if ((snd_ac97_read(ac97, AC97_POWERDOWN) & 0x0f) == 0x0f)
2209
goto __ready_ok;
2210
schedule_timeout_uninterruptible(1);
2211
} while (time_after_eq(end_time, jiffies));
2212
ac97_warn(ac97,
2213
"AC'97 %d analog subsections not ready\n", ac97->num);
2214
}
2215
2216
/* FIXME: add powerdown control */
2217
if (ac97_is_modem(ac97)) {
2218
unsigned char tmp;
2219
2220
/* nothing should be in powerdown mode */
2221
/* note: it's important to set the rate at first */
2222
tmp = AC97_MEA_GPIO;
2223
if (ac97->ext_mid & AC97_MEI_LINE1) {
2224
snd_ac97_write_cache(ac97, AC97_LINE1_RATE, 8000);
2225
tmp |= AC97_MEA_ADC1 | AC97_MEA_DAC1;
2226
}
2227
if (ac97->ext_mid & AC97_MEI_LINE2) {
2228
snd_ac97_write_cache(ac97, AC97_LINE2_RATE, 8000);
2229
tmp |= AC97_MEA_ADC2 | AC97_MEA_DAC2;
2230
}
2231
if (ac97->ext_mid & AC97_MEI_HANDSET) {
2232
snd_ac97_write_cache(ac97, AC97_HANDSET_RATE, 8000);
2233
tmp |= AC97_MEA_HADC | AC97_MEA_HDAC;
2234
}
2235
snd_ac97_write_cache(ac97, AC97_EXTENDED_MSTATUS, 0);
2236
udelay(100);
2237
/* nothing should be in powerdown mode */
2238
snd_ac97_write_cache(ac97, AC97_EXTENDED_MSTATUS, 0);
2239
end_time = jiffies + msecs_to_jiffies(100);
2240
do {
2241
if ((snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS) & tmp) == tmp)
2242
goto __ready_ok;
2243
schedule_timeout_uninterruptible(1);
2244
} while (time_after_eq(end_time, jiffies));
2245
ac97_warn(ac97,
2246
"MC'97 %d converters and GPIO not ready (0x%x)\n",
2247
ac97->num,
2248
snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS));
2249
}
2250
2251
__ready_ok:
2252
if (ac97_is_audio(ac97))
2253
ac97->addr = (ac97->ext_id & AC97_EI_ADDR_MASK) >> AC97_EI_ADDR_SHIFT;
2254
else
2255
ac97->addr = (ac97->ext_mid & AC97_MEI_ADDR_MASK) >> AC97_MEI_ADDR_SHIFT;
2256
if (ac97->ext_id & 0x01c9) { /* L/R, MIC, SDAC, LDAC VRA support */
2257
reg = snd_ac97_read(ac97, AC97_EXTENDED_STATUS);
2258
reg |= ac97->ext_id & 0x01c0; /* LDAC/SDAC/CDAC */
2259
if (! bus->no_vra)
2260
reg |= ac97->ext_id & 0x0009; /* VRA/VRM */
2261
snd_ac97_write_cache(ac97, AC97_EXTENDED_STATUS, reg);
2262
}
2263
if ((ac97->ext_id & AC97_EI_DRA) && bus->dra) {
2264
/* Intel controllers require double rate data to be put in
2265
* slots 7+8, so let's hope the codec supports it. */
2266
snd_ac97_update_bits(ac97, AC97_GENERAL_PURPOSE, AC97_GP_DRSS_MASK, AC97_GP_DRSS_78);
2267
if ((snd_ac97_read(ac97, AC97_GENERAL_PURPOSE) & AC97_GP_DRSS_MASK) == AC97_GP_DRSS_78)
2268
ac97->flags |= AC97_DOUBLE_RATE;
2269
/* restore to slots 10/11 to avoid the confliction with surrounds */
2270
snd_ac97_update_bits(ac97, AC97_GENERAL_PURPOSE, AC97_GP_DRSS_MASK, 0);
2271
}
2272
if (ac97->ext_id & AC97_EI_VRA) { /* VRA support */
2273
snd_ac97_determine_rates(ac97, AC97_PCM_FRONT_DAC_RATE, 0, &ac97->rates[AC97_RATES_FRONT_DAC]);
2274
snd_ac97_determine_rates(ac97, AC97_PCM_LR_ADC_RATE, 0, &ac97->rates[AC97_RATES_ADC]);
2275
} else {
2276
ac97->rates[AC97_RATES_FRONT_DAC] = SNDRV_PCM_RATE_48000;
2277
if (ac97->flags & AC97_DOUBLE_RATE)
2278
ac97->rates[AC97_RATES_FRONT_DAC] |= SNDRV_PCM_RATE_96000;
2279
ac97->rates[AC97_RATES_ADC] = SNDRV_PCM_RATE_48000;
2280
}
2281
if (ac97->ext_id & AC97_EI_SPDIF) {
2282
/* codec specific code (patch) should override these values */
2283
ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_32000;
2284
}
2285
if (ac97->ext_id & AC97_EI_VRM) { /* MIC VRA support */
2286
snd_ac97_determine_rates(ac97, AC97_PCM_MIC_ADC_RATE, 0, &ac97->rates[AC97_RATES_MIC_ADC]);
2287
} else {
2288
ac97->rates[AC97_RATES_MIC_ADC] = SNDRV_PCM_RATE_48000;
2289
}
2290
if (ac97->ext_id & AC97_EI_SDAC) { /* SDAC support */
2291
snd_ac97_determine_rates(ac97, AC97_PCM_SURR_DAC_RATE, AC97_PCM_FRONT_DAC_RATE, &ac97->rates[AC97_RATES_SURR_DAC]);
2292
ac97->scaps |= AC97_SCAP_SURROUND_DAC;
2293
}
2294
if (ac97->ext_id & AC97_EI_LDAC) { /* LDAC support */
2295
snd_ac97_determine_rates(ac97, AC97_PCM_LFE_DAC_RATE, AC97_PCM_FRONT_DAC_RATE, &ac97->rates[AC97_RATES_LFE_DAC]);
2296
ac97->scaps |= AC97_SCAP_CENTER_LFE_DAC;
2297
}
2298
/* additional initializations */
2299
if (bus->ops->init)
2300
bus->ops->init(ac97);
2301
snd_ac97_get_name(ac97, ac97->id, name, sizeof(name), !ac97_is_audio(ac97));
2302
snd_ac97_get_name(NULL, ac97->id, name, sizeof(name), !ac97_is_audio(ac97)); // ac97->id might be changed in the special setup code
2303
if (! ac97->build_ops)
2304
ac97->build_ops = &null_build_ops;
2305
2306
if (ac97_is_audio(ac97)) {
2307
char comp[16];
2308
if (card->mixername[0] == '\0') {
2309
strscpy(card->mixername, name);
2310
} else {
2311
if (strlen(card->mixername) + 1 + strlen(name) + 1 <= sizeof(card->mixername)) {
2312
strcat(card->mixername, ",");
2313
strcat(card->mixername, name);
2314
}
2315
}
2316
sprintf(comp, "AC97a:%08x", ac97->id);
2317
err = snd_component_add(card, comp);
2318
if (err < 0) {
2319
snd_ac97_free(ac97);
2320
return err;
2321
}
2322
if (snd_ac97_mixer_build(ac97) < 0) {
2323
snd_ac97_free(ac97);
2324
return -ENOMEM;
2325
}
2326
}
2327
if (ac97_is_modem(ac97)) {
2328
char comp[16];
2329
if (card->mixername[0] == '\0') {
2330
strscpy(card->mixername, name);
2331
} else {
2332
if (strlen(card->mixername) + 1 + strlen(name) + 1 <= sizeof(card->mixername)) {
2333
strcat(card->mixername, ",");
2334
strcat(card->mixername, name);
2335
}
2336
}
2337
sprintf(comp, "AC97m:%08x", ac97->id);
2338
err = snd_component_add(card, comp);
2339
if (err < 0) {
2340
snd_ac97_free(ac97);
2341
return err;
2342
}
2343
if (snd_ac97_modem_build(card, ac97) < 0) {
2344
snd_ac97_free(ac97);
2345
return -ENOMEM;
2346
}
2347
}
2348
if (ac97_is_audio(ac97))
2349
update_power_regs(ac97);
2350
snd_ac97_proc_init(ac97);
2351
err = snd_device_new(card, SNDRV_DEV_CODEC, ac97, &ops);
2352
if (err < 0) {
2353
snd_ac97_free(ac97);
2354
return err;
2355
}
2356
*rac97 = ac97;
2357
return 0;
2358
}
2359
2360
EXPORT_SYMBOL(snd_ac97_mixer);
2361
2362
/*
2363
* Power down the chip.
2364
*
2365
* MASTER and HEADPHONE registers are muted but the register cache values
2366
* are not changed, so that the values can be restored in snd_ac97_resume().
2367
*/
2368
static void snd_ac97_powerdown(struct snd_ac97 *ac97)
2369
{
2370
unsigned short power;
2371
2372
if (ac97_is_audio(ac97)) {
2373
/* some codecs have stereo mute bits */
2374
snd_ac97_write(ac97, AC97_MASTER, 0x9f9f);
2375
snd_ac97_write(ac97, AC97_HEADPHONE, 0x9f9f);
2376
}
2377
2378
/* surround, CLFE, mic powerdown */
2379
power = ac97->regs[AC97_EXTENDED_STATUS];
2380
if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
2381
power |= AC97_EA_PRJ;
2382
if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
2383
power |= AC97_EA_PRI | AC97_EA_PRK;
2384
power |= AC97_EA_PRL;
2385
snd_ac97_write(ac97, AC97_EXTENDED_STATUS, power);
2386
2387
/* powerdown external amplifier */
2388
if (ac97->scaps & AC97_SCAP_INV_EAPD)
2389
power = ac97->regs[AC97_POWERDOWN] & ~AC97_PD_EAPD;
2390
else if (! (ac97->scaps & AC97_SCAP_EAPD_LED))
2391
power = ac97->regs[AC97_POWERDOWN] | AC97_PD_EAPD;
2392
power |= AC97_PD_PR6; /* Headphone amplifier powerdown */
2393
power |= AC97_PD_PR0 | AC97_PD_PR1; /* ADC & DAC powerdown */
2394
snd_ac97_write(ac97, AC97_POWERDOWN, power);
2395
udelay(100);
2396
power |= AC97_PD_PR2; /* Analog Mixer powerdown (Vref on) */
2397
snd_ac97_write(ac97, AC97_POWERDOWN, power);
2398
if (ac97_is_power_save_mode(ac97)) {
2399
power |= AC97_PD_PR3; /* Analog Mixer powerdown */
2400
snd_ac97_write(ac97, AC97_POWERDOWN, power);
2401
udelay(100);
2402
/* AC-link powerdown, internal Clk disable */
2403
/* FIXME: this may cause click noises on some boards */
2404
power |= AC97_PD_PR4 | AC97_PD_PR5;
2405
snd_ac97_write(ac97, AC97_POWERDOWN, power);
2406
}
2407
}
2408
2409
2410
struct ac97_power_reg {
2411
unsigned short reg;
2412
unsigned short power_reg;
2413
unsigned short mask;
2414
};
2415
2416
enum { PWIDX_ADC, PWIDX_FRONT, PWIDX_CLFE, PWIDX_SURR, PWIDX_MIC, PWIDX_SIZE };
2417
2418
static const struct ac97_power_reg power_regs[PWIDX_SIZE] = {
2419
[PWIDX_ADC] = { AC97_PCM_LR_ADC_RATE, AC97_POWERDOWN, AC97_PD_PR0},
2420
[PWIDX_FRONT] = { AC97_PCM_FRONT_DAC_RATE, AC97_POWERDOWN, AC97_PD_PR1},
2421
[PWIDX_CLFE] = { AC97_PCM_LFE_DAC_RATE, AC97_EXTENDED_STATUS,
2422
AC97_EA_PRI | AC97_EA_PRK},
2423
[PWIDX_SURR] = { AC97_PCM_SURR_DAC_RATE, AC97_EXTENDED_STATUS,
2424
AC97_EA_PRJ},
2425
[PWIDX_MIC] = { AC97_PCM_MIC_ADC_RATE, AC97_EXTENDED_STATUS,
2426
AC97_EA_PRL},
2427
};
2428
2429
#ifdef CONFIG_SND_AC97_POWER_SAVE
2430
/**
2431
* snd_ac97_update_power - update the powerdown register
2432
* @ac97: the codec instance
2433
* @reg: the rate register, e.g. AC97_PCM_FRONT_DAC_RATE
2434
* @powerup: non-zero when power up the part
2435
*
2436
* Update the AC97 powerdown register bits of the given part.
2437
*
2438
* Return: Zero.
2439
*/
2440
int snd_ac97_update_power(struct snd_ac97 *ac97, int reg, int powerup)
2441
{
2442
int i;
2443
2444
if (! ac97)
2445
return 0;
2446
2447
if (reg) {
2448
/* SPDIF requires DAC power, too */
2449
if (reg == AC97_SPDIF)
2450
reg = AC97_PCM_FRONT_DAC_RATE;
2451
for (i = 0; i < PWIDX_SIZE; i++) {
2452
if (power_regs[i].reg == reg) {
2453
if (powerup)
2454
ac97->power_up |= (1 << i);
2455
else
2456
ac97->power_up &= ~(1 << i);
2457
break;
2458
}
2459
}
2460
}
2461
2462
if (ac97_is_power_save_mode(ac97) && !powerup)
2463
/* adjust power-down bits after two seconds delay
2464
* (for avoiding loud click noises for many (OSS) apps
2465
* that open/close frequently)
2466
*/
2467
schedule_delayed_work(&ac97->power_work, secs_to_jiffies(power_save));
2468
else {
2469
cancel_delayed_work(&ac97->power_work);
2470
update_power_regs(ac97);
2471
}
2472
2473
return 0;
2474
}
2475
2476
EXPORT_SYMBOL(snd_ac97_update_power);
2477
#endif /* CONFIG_SND_AC97_POWER_SAVE */
2478
2479
static void update_power_regs(struct snd_ac97 *ac97)
2480
{
2481
unsigned int power_up, bits;
2482
int i;
2483
2484
power_up = (1 << PWIDX_FRONT) | (1 << PWIDX_ADC);
2485
power_up |= (1 << PWIDX_MIC);
2486
if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
2487
power_up |= (1 << PWIDX_SURR);
2488
if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
2489
power_up |= (1 << PWIDX_CLFE);
2490
#ifdef CONFIG_SND_AC97_POWER_SAVE
2491
if (ac97_is_power_save_mode(ac97))
2492
power_up = ac97->power_up;
2493
#endif
2494
if (power_up) {
2495
if (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2) {
2496
/* needs power-up analog mix and vref */
2497
snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2498
AC97_PD_PR3, 0);
2499
msleep(1);
2500
snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2501
AC97_PD_PR2, 0);
2502
}
2503
}
2504
for (i = 0; i < PWIDX_SIZE; i++) {
2505
if (power_up & (1 << i))
2506
bits = 0;
2507
else
2508
bits = power_regs[i].mask;
2509
snd_ac97_update_bits(ac97, power_regs[i].power_reg,
2510
power_regs[i].mask, bits);
2511
}
2512
if (! power_up) {
2513
if (! (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2)) {
2514
/* power down analog mix and vref */
2515
snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2516
AC97_PD_PR2, AC97_PD_PR2);
2517
snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2518
AC97_PD_PR3, AC97_PD_PR3);
2519
}
2520
}
2521
}
2522
2523
2524
#ifdef CONFIG_PM
2525
/**
2526
* snd_ac97_suspend - General suspend function for AC97 codec
2527
* @ac97: the ac97 instance
2528
*
2529
* Suspends the codec, power down the chip.
2530
*/
2531
void snd_ac97_suspend(struct snd_ac97 *ac97)
2532
{
2533
if (! ac97)
2534
return;
2535
if (ac97->build_ops->suspend)
2536
ac97->build_ops->suspend(ac97);
2537
#ifdef CONFIG_SND_AC97_POWER_SAVE
2538
cancel_delayed_work_sync(&ac97->power_work);
2539
#endif
2540
snd_ac97_powerdown(ac97);
2541
}
2542
2543
EXPORT_SYMBOL(snd_ac97_suspend);
2544
2545
/*
2546
* restore ac97 status
2547
*/
2548
static void snd_ac97_restore_status(struct snd_ac97 *ac97)
2549
{
2550
int i;
2551
2552
for (i = 2; i < 0x7c ; i += 2) {
2553
if (i == AC97_POWERDOWN || i == AC97_EXTENDED_ID)
2554
continue;
2555
/* restore only accessible registers
2556
* some chip (e.g. nm256) may hang up when unsupported registers
2557
* are accessed..!
2558
*/
2559
if (test_bit(i, ac97->reg_accessed)) {
2560
snd_ac97_write(ac97, i, ac97->regs[i]);
2561
snd_ac97_read(ac97, i);
2562
}
2563
}
2564
}
2565
2566
/*
2567
* restore IEC958 status
2568
*/
2569
static void snd_ac97_restore_iec958(struct snd_ac97 *ac97)
2570
{
2571
if (ac97->ext_id & AC97_EI_SPDIF) {
2572
if (ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_SPDIF) {
2573
/* reset spdif status */
2574
snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
2575
snd_ac97_write(ac97, AC97_EXTENDED_STATUS, ac97->regs[AC97_EXTENDED_STATUS]);
2576
if (ac97->flags & AC97_CS_SPDIF)
2577
snd_ac97_write(ac97, AC97_CSR_SPDIF, ac97->regs[AC97_CSR_SPDIF]);
2578
else
2579
snd_ac97_write(ac97, AC97_SPDIF, ac97->regs[AC97_SPDIF]);
2580
snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
2581
}
2582
}
2583
}
2584
2585
/**
2586
* snd_ac97_resume - General resume function for AC97 codec
2587
* @ac97: the ac97 instance
2588
*
2589
* Do the standard resume procedure, power up and restoring the
2590
* old register values.
2591
*/
2592
void snd_ac97_resume(struct snd_ac97 *ac97)
2593
{
2594
unsigned long end_time;
2595
2596
if (! ac97)
2597
return;
2598
2599
if (ac97->bus->ops->reset) {
2600
ac97->bus->ops->reset(ac97);
2601
goto __reset_ready;
2602
}
2603
2604
snd_ac97_write(ac97, AC97_POWERDOWN, 0);
2605
if (! (ac97->flags & AC97_DEFAULT_POWER_OFF)) {
2606
if (!(ac97->scaps & AC97_SCAP_SKIP_AUDIO))
2607
snd_ac97_write(ac97, AC97_RESET, 0);
2608
else if (!(ac97->scaps & AC97_SCAP_SKIP_MODEM))
2609
snd_ac97_write(ac97, AC97_EXTENDED_MID, 0);
2610
udelay(100);
2611
snd_ac97_write(ac97, AC97_POWERDOWN, 0);
2612
}
2613
snd_ac97_write(ac97, AC97_GENERAL_PURPOSE, 0);
2614
2615
snd_ac97_write(ac97, AC97_POWERDOWN, ac97->regs[AC97_POWERDOWN]);
2616
if (ac97_is_audio(ac97)) {
2617
ac97->bus->ops->write(ac97, AC97_MASTER, 0x8101);
2618
end_time = jiffies + msecs_to_jiffies(100);
2619
do {
2620
if (snd_ac97_read(ac97, AC97_MASTER) == 0x8101)
2621
break;
2622
schedule_timeout_uninterruptible(1);
2623
} while (time_after_eq(end_time, jiffies));
2624
/* FIXME: extra delay */
2625
ac97->bus->ops->write(ac97, AC97_MASTER, AC97_MUTE_MASK_MONO);
2626
if (snd_ac97_read(ac97, AC97_MASTER) != AC97_MUTE_MASK_MONO)
2627
msleep(250);
2628
} else {
2629
end_time = jiffies + msecs_to_jiffies(100);
2630
do {
2631
unsigned short val = snd_ac97_read(ac97, AC97_EXTENDED_MID);
2632
if (val != 0xffff && (val & 1) != 0)
2633
break;
2634
schedule_timeout_uninterruptible(1);
2635
} while (time_after_eq(end_time, jiffies));
2636
}
2637
__reset_ready:
2638
2639
if (ac97->bus->ops->init)
2640
ac97->bus->ops->init(ac97);
2641
2642
if (ac97->build_ops->resume)
2643
ac97->build_ops->resume(ac97);
2644
else {
2645
snd_ac97_restore_status(ac97);
2646
snd_ac97_restore_iec958(ac97);
2647
}
2648
}
2649
2650
EXPORT_SYMBOL(snd_ac97_resume);
2651
#endif
2652
2653
2654
/*
2655
* Hardware tuning
2656
*/
2657
static void set_ctl_name(char *dst, const char *src, const char *suffix)
2658
{
2659
const size_t msize = SNDRV_CTL_ELEM_ID_NAME_MAXLEN;
2660
2661
if (suffix) {
2662
if (snprintf(dst, msize, "%s %s", src, suffix) >= msize)
2663
pr_warn("ALSA: AC97 control name '%s %s' truncated to '%s'\n",
2664
src, suffix, dst);
2665
} else {
2666
if (strscpy(dst, src, msize) < 0)
2667
pr_warn("ALSA: AC97 control name '%s' truncated to '%s'\n",
2668
src, dst);
2669
}
2670
}
2671
2672
/* remove the control with the given name and optional suffix */
2673
static int snd_ac97_remove_ctl(struct snd_ac97 *ac97, const char *name,
2674
const char *suffix)
2675
{
2676
struct snd_ctl_elem_id id;
2677
memset(&id, 0, sizeof(id));
2678
set_ctl_name(id.name, name, suffix);
2679
id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2680
return snd_ctl_remove_id(ac97->bus->card, &id);
2681
}
2682
2683
static struct snd_kcontrol *ctl_find(struct snd_ac97 *ac97, const char *name, const char *suffix)
2684
{
2685
struct snd_ctl_elem_id sid;
2686
memset(&sid, 0, sizeof(sid));
2687
set_ctl_name(sid.name, name, suffix);
2688
sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2689
return snd_ctl_find_id(ac97->bus->card, &sid);
2690
}
2691
2692
/* rename the control with the given name and optional suffix */
2693
static int snd_ac97_rename_ctl(struct snd_ac97 *ac97, const char *src,
2694
const char *dst, const char *suffix)
2695
{
2696
struct snd_kcontrol *kctl = ctl_find(ac97, src, suffix);
2697
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
2698
2699
if (kctl) {
2700
set_ctl_name(name, dst, suffix);
2701
snd_ctl_rename(ac97->bus->card, kctl, name);
2702
return 0;
2703
}
2704
return -ENOENT;
2705
}
2706
2707
/* rename both Volume and Switch controls - don't check the return value */
2708
static void snd_ac97_rename_vol_ctl(struct snd_ac97 *ac97, const char *src,
2709
const char *dst)
2710
{
2711
snd_ac97_rename_ctl(ac97, src, dst, "Switch");
2712
snd_ac97_rename_ctl(ac97, src, dst, "Volume");
2713
}
2714
2715
/* swap controls */
2716
static int snd_ac97_swap_ctl(struct snd_ac97 *ac97, const char *s1,
2717
const char *s2, const char *suffix)
2718
{
2719
struct snd_kcontrol *kctl1, *kctl2;
2720
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
2721
2722
kctl1 = ctl_find(ac97, s1, suffix);
2723
kctl2 = ctl_find(ac97, s2, suffix);
2724
if (kctl1 && kctl2) {
2725
set_ctl_name(name, s2, suffix);
2726
snd_ctl_rename(ac97->bus->card, kctl1, name);
2727
2728
set_ctl_name(name, s1, suffix);
2729
snd_ctl_rename(ac97->bus->card, kctl2, name);
2730
2731
return 0;
2732
}
2733
return -ENOENT;
2734
}
2735
2736
#if 1
2737
/* bind hp and master controls instead of using only hp control */
2738
static int bind_hp_volsw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2739
{
2740
int err = snd_ac97_put_volsw(kcontrol, ucontrol);
2741
if (err > 0) {
2742
unsigned long priv_saved = kcontrol->private_value;
2743
kcontrol->private_value = (kcontrol->private_value & ~0xff) | AC97_HEADPHONE;
2744
snd_ac97_put_volsw(kcontrol, ucontrol);
2745
kcontrol->private_value = priv_saved;
2746
}
2747
return err;
2748
}
2749
2750
/* ac97 tune: bind Master and Headphone controls */
2751
static int tune_hp_only(struct snd_ac97 *ac97)
2752
{
2753
struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
2754
struct snd_kcontrol *mvol = ctl_find(ac97, "Master Playback Volume", NULL);
2755
if (! msw || ! mvol)
2756
return -ENOENT;
2757
msw->put = bind_hp_volsw_put;
2758
mvol->put = bind_hp_volsw_put;
2759
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch");
2760
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume");
2761
return 0;
2762
}
2763
2764
#else
2765
/* ac97 tune: use Headphone control as master */
2766
static int tune_hp_only(struct snd_ac97 *ac97)
2767
{
2768
if (ctl_find(ac97, "Headphone Playback Switch", NULL) == NULL)
2769
return -ENOENT;
2770
snd_ac97_remove_ctl(ac97, "Master Playback", "Switch");
2771
snd_ac97_remove_ctl(ac97, "Master Playback", "Volume");
2772
snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback");
2773
return 0;
2774
}
2775
#endif
2776
2777
/* ac97 tune: swap Headphone and Master controls */
2778
static int tune_swap_hp(struct snd_ac97 *ac97)
2779
{
2780
if (ctl_find(ac97, "Headphone Playback Switch", NULL) == NULL)
2781
return -ENOENT;
2782
snd_ac97_rename_vol_ctl(ac97, "Master Playback", "Line-Out Playback");
2783
snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback");
2784
return 0;
2785
}
2786
2787
/* ac97 tune: swap Surround and Master controls */
2788
static int tune_swap_surround(struct snd_ac97 *ac97)
2789
{
2790
if (snd_ac97_swap_ctl(ac97, "Master Playback", "Surround Playback", "Switch") ||
2791
snd_ac97_swap_ctl(ac97, "Master Playback", "Surround Playback", "Volume"))
2792
return -ENOENT;
2793
return 0;
2794
}
2795
2796
/* ac97 tune: set up mic sharing for AD codecs */
2797
static int tune_ad_sharing(struct snd_ac97 *ac97)
2798
{
2799
unsigned short scfg;
2800
if ((ac97->id & 0xffffff00) != 0x41445300) {
2801
ac97_err(ac97, "ac97_quirk AD_SHARING is only for AD codecs\n");
2802
return -EINVAL;
2803
}
2804
/* Turn on OMS bit to route microphone to back panel */
2805
scfg = snd_ac97_read(ac97, AC97_AD_SERIAL_CFG);
2806
snd_ac97_write_cache(ac97, AC97_AD_SERIAL_CFG, scfg | 0x0200);
2807
return 0;
2808
}
2809
2810
static const struct snd_kcontrol_new snd_ac97_alc_jack_detect =
2811
AC97_SINGLE("Jack Detect", AC97_ALC650_CLOCK, 5, 1, 0);
2812
2813
/* ac97 tune: set up ALC jack-select */
2814
static int tune_alc_jack(struct snd_ac97 *ac97)
2815
{
2816
if ((ac97->id & 0xffffff00) != 0x414c4700) {
2817
ac97_err(ac97,
2818
"ac97_quirk ALC_JACK is only for Realtek codecs\n");
2819
return -EINVAL;
2820
}
2821
snd_ac97_update_bits(ac97, 0x7a, 0x20, 0x20); /* select jack detect function */
2822
snd_ac97_update_bits(ac97, 0x7a, 0x01, 0x01); /* Line-out auto mute */
2823
if (ac97->id == AC97_ID_ALC658D)
2824
snd_ac97_update_bits(ac97, 0x74, 0x0800, 0x0800);
2825
return snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&snd_ac97_alc_jack_detect, ac97));
2826
}
2827
2828
/* ac97 tune: inversed EAPD bit */
2829
static int tune_inv_eapd(struct snd_ac97 *ac97)
2830
{
2831
struct snd_kcontrol *kctl = ctl_find(ac97, "External Amplifier", NULL);
2832
if (! kctl)
2833
return -ENOENT;
2834
set_inv_eapd(ac97, kctl);
2835
return 0;
2836
}
2837
2838
static int master_mute_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2839
{
2840
int err = snd_ac97_put_volsw(kcontrol, ucontrol);
2841
if (err > 0) {
2842
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
2843
int shift = (kcontrol->private_value >> 8) & 0x0f;
2844
int rshift = (kcontrol->private_value >> 12) & 0x0f;
2845
unsigned short mask;
2846
if (shift != rshift)
2847
mask = AC97_MUTE_MASK_STEREO;
2848
else
2849
mask = AC97_MUTE_MASK_MONO;
2850
snd_ac97_update_bits(ac97, AC97_POWERDOWN, AC97_PD_EAPD,
2851
(ac97->regs[AC97_MASTER] & mask) == mask ?
2852
AC97_PD_EAPD : 0);
2853
}
2854
return err;
2855
}
2856
2857
/* ac97 tune: EAPD controls mute LED bound with the master mute */
2858
static int tune_mute_led(struct snd_ac97 *ac97)
2859
{
2860
struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
2861
if (! msw)
2862
return -ENOENT;
2863
msw->put = master_mute_sw_put;
2864
snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
2865
snd_ac97_update_bits(
2866
ac97, AC97_POWERDOWN,
2867
AC97_PD_EAPD, AC97_PD_EAPD /* mute LED on */
2868
);
2869
ac97->scaps |= AC97_SCAP_EAPD_LED;
2870
return 0;
2871
}
2872
2873
static int hp_master_mute_sw_put(struct snd_kcontrol *kcontrol,
2874
struct snd_ctl_elem_value *ucontrol)
2875
{
2876
int err = bind_hp_volsw_put(kcontrol, ucontrol);
2877
if (err > 0) {
2878
struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
2879
int shift = (kcontrol->private_value >> 8) & 0x0f;
2880
int rshift = (kcontrol->private_value >> 12) & 0x0f;
2881
unsigned short mask;
2882
if (shift != rshift)
2883
mask = AC97_MUTE_MASK_STEREO;
2884
else
2885
mask = AC97_MUTE_MASK_MONO;
2886
snd_ac97_update_bits(ac97, AC97_POWERDOWN, AC97_PD_EAPD,
2887
(ac97->regs[AC97_MASTER] & mask) == mask ?
2888
AC97_PD_EAPD : 0);
2889
}
2890
return err;
2891
}
2892
2893
static int tune_hp_mute_led(struct snd_ac97 *ac97)
2894
{
2895
struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
2896
struct snd_kcontrol *mvol = ctl_find(ac97, "Master Playback Volume", NULL);
2897
if (! msw || ! mvol)
2898
return -ENOENT;
2899
msw->put = hp_master_mute_sw_put;
2900
mvol->put = bind_hp_volsw_put;
2901
snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
2902
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch");
2903
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume");
2904
snd_ac97_update_bits(
2905
ac97, AC97_POWERDOWN,
2906
AC97_PD_EAPD, AC97_PD_EAPD /* mute LED on */
2907
);
2908
return 0;
2909
}
2910
2911
struct quirk_table {
2912
const char *name;
2913
int (*func)(struct snd_ac97 *);
2914
};
2915
2916
static const struct quirk_table applicable_quirks[] = {
2917
{ "none", NULL },
2918
{ "hp_only", tune_hp_only },
2919
{ "swap_hp", tune_swap_hp },
2920
{ "swap_surround", tune_swap_surround },
2921
{ "ad_sharing", tune_ad_sharing },
2922
{ "alc_jack", tune_alc_jack },
2923
{ "inv_eapd", tune_inv_eapd },
2924
{ "mute_led", tune_mute_led },
2925
{ "hp_mute_led", tune_hp_mute_led },
2926
};
2927
2928
/* apply the quirk with the given type */
2929
static int apply_quirk(struct snd_ac97 *ac97, int type)
2930
{
2931
if (type <= 0)
2932
return 0;
2933
else if (type >= ARRAY_SIZE(applicable_quirks))
2934
return -EINVAL;
2935
if (applicable_quirks[type].func)
2936
return applicable_quirks[type].func(ac97);
2937
return 0;
2938
}
2939
2940
/* apply the quirk with the given name */
2941
static int apply_quirk_str(struct snd_ac97 *ac97, const char *typestr)
2942
{
2943
int i;
2944
const struct quirk_table *q;
2945
2946
for (i = 0; i < ARRAY_SIZE(applicable_quirks); i++) {
2947
q = &applicable_quirks[i];
2948
if (q->name && ! strcmp(typestr, q->name))
2949
return apply_quirk(ac97, i);
2950
}
2951
/* for compatibility, accept the numbers, too */
2952
if (*typestr >= '0' && *typestr <= '9')
2953
return apply_quirk(ac97, (int)simple_strtoul(typestr, NULL, 10));
2954
return -EINVAL;
2955
}
2956
2957
/**
2958
* snd_ac97_tune_hardware - tune up the hardware
2959
* @ac97: the ac97 instance
2960
* @quirk: quirk list
2961
* @override: explicit quirk value (overrides the list if non-NULL)
2962
*
2963
* Do some workaround for each pci device, such as renaming of the
2964
* headphone (true line-out) control as "Master".
2965
* The quirk-list must be terminated with a zero-filled entry.
2966
*
2967
* Return: Zero if successful, or a negative error code on failure.
2968
*/
2969
2970
int snd_ac97_tune_hardware(struct snd_ac97 *ac97,
2971
const struct ac97_quirk *quirk, const char *override)
2972
{
2973
int result;
2974
2975
/* quirk overriden? */
2976
if (override && strcmp(override, "-1") && strcmp(override, "default")) {
2977
result = apply_quirk_str(ac97, override);
2978
if (result < 0)
2979
ac97_err(ac97, "applying quirk type %s failed (%d)\n",
2980
override, result);
2981
return result;
2982
}
2983
2984
if (! quirk)
2985
return -EINVAL;
2986
2987
for (; quirk->subvendor; quirk++) {
2988
if (quirk->subvendor != ac97->subsystem_vendor)
2989
continue;
2990
if ((! quirk->mask && quirk->subdevice == ac97->subsystem_device) ||
2991
quirk->subdevice == (quirk->mask & ac97->subsystem_device)) {
2992
if (quirk->codec_id && quirk->codec_id != ac97->id)
2993
continue;
2994
ac97_dbg(ac97, "ac97 quirk for %s (%04x:%04x)\n",
2995
quirk->name, ac97->subsystem_vendor,
2996
ac97->subsystem_device);
2997
result = apply_quirk(ac97, quirk->type);
2998
if (result < 0)
2999
ac97_err(ac97,
3000
"applying quirk type %d for %s failed (%d)\n",
3001
quirk->type, quirk->name, result);
3002
return result;
3003
}
3004
}
3005
return 0;
3006
}
3007
3008
EXPORT_SYMBOL(snd_ac97_tune_hardware);
3009
3010