Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/hda/codecs/realtek/alc882.c
26530 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
//
3
// Realtek ALC882/883/885/888/889 codec support
4
//
5
// ALC882 is almost identical with ALC880 but has cleaner and more flexible
6
// configuration. Each pin widget can choose any input DACs and a mixer.
7
// Each ADC is connected from a mixer of all inputs. This makes possible
8
// 6-channel independent captures.
9
//
10
// In addition, an independent DAC for the multi-playback (not used in this
11
// driver yet).
12
//
13
14
#include <linux/init.h>
15
#include <linux/module.h>
16
#include "realtek.h"
17
18
/*
19
* Pin config fixes
20
*/
21
enum {
22
ALC882_FIXUP_ABIT_AW9D_MAX,
23
ALC882_FIXUP_LENOVO_Y530,
24
ALC882_FIXUP_PB_M5210,
25
ALC882_FIXUP_ACER_ASPIRE_7736,
26
ALC882_FIXUP_ASUS_W90V,
27
ALC889_FIXUP_CD,
28
ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
29
ALC889_FIXUP_VAIO_TT,
30
ALC888_FIXUP_EEE1601,
31
ALC886_FIXUP_EAPD,
32
ALC882_FIXUP_EAPD,
33
ALC883_FIXUP_EAPD,
34
ALC883_FIXUP_ACER_EAPD,
35
ALC882_FIXUP_GPIO1,
36
ALC882_FIXUP_GPIO2,
37
ALC882_FIXUP_GPIO3,
38
ALC889_FIXUP_COEF,
39
ALC882_FIXUP_ASUS_W2JC,
40
ALC882_FIXUP_ACER_ASPIRE_4930G,
41
ALC882_FIXUP_ACER_ASPIRE_8930G,
42
ALC882_FIXUP_ASPIRE_8930G_VERBS,
43
ALC885_FIXUP_MACPRO_GPIO,
44
ALC889_FIXUP_DAC_ROUTE,
45
ALC889_FIXUP_MBP_VREF,
46
ALC889_FIXUP_IMAC91_VREF,
47
ALC889_FIXUP_MBA11_VREF,
48
ALC889_FIXUP_MBA21_VREF,
49
ALC889_FIXUP_MP11_VREF,
50
ALC889_FIXUP_MP41_VREF,
51
ALC882_FIXUP_INV_DMIC,
52
ALC882_FIXUP_NO_PRIMARY_HP,
53
ALC887_FIXUP_ASUS_BASS,
54
ALC887_FIXUP_BASS_CHMAP,
55
ALC1220_FIXUP_GB_DUAL_CODECS,
56
ALC1220_FIXUP_GB_X570,
57
ALC1220_FIXUP_CLEVO_P950,
58
ALC1220_FIXUP_CLEVO_PB51ED,
59
ALC1220_FIXUP_CLEVO_PB51ED_PINS,
60
ALC887_FIXUP_ASUS_AUDIO,
61
ALC887_FIXUP_ASUS_HMIC,
62
ALCS1200A_FIXUP_MIC_VREF,
63
ALC888VD_FIXUP_MIC_100VREF,
64
};
65
66
static void alc889_fixup_coef(struct hda_codec *codec,
67
const struct hda_fixup *fix, int action)
68
{
69
if (action != HDA_FIXUP_ACT_INIT)
70
return;
71
alc_update_coef_idx(codec, 7, 0, 0x2030);
72
}
73
74
/* set up GPIO at initialization */
75
static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
76
const struct hda_fixup *fix, int action)
77
{
78
struct alc_spec *spec = codec->spec;
79
80
spec->gpio_write_delay = true;
81
alc_fixup_gpio3(codec, fix, action);
82
}
83
84
/* Fix the connection of some pins for ALC889:
85
* At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
86
* work correctly (bko#42740)
87
*/
88
static void alc889_fixup_dac_route(struct hda_codec *codec,
89
const struct hda_fixup *fix, int action)
90
{
91
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
92
/* fake the connections during parsing the tree */
93
static const hda_nid_t conn1[] = { 0x0c, 0x0d };
94
static const hda_nid_t conn2[] = { 0x0e, 0x0f };
95
snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
96
snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
97
snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
98
snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
99
} else if (action == HDA_FIXUP_ACT_PROBE) {
100
/* restore the connections */
101
static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
102
snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
103
snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
104
snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
105
snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
106
}
107
}
108
109
/* Set VREF on HP pin */
110
static void alc889_fixup_mbp_vref(struct hda_codec *codec,
111
const struct hda_fixup *fix, int action)
112
{
113
static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
114
struct alc_spec *spec = codec->spec;
115
int i;
116
117
if (action != HDA_FIXUP_ACT_INIT)
118
return;
119
for (i = 0; i < ARRAY_SIZE(nids); i++) {
120
unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
121
if (get_defcfg_device(val) != AC_JACK_HP_OUT)
122
continue;
123
val = snd_hda_codec_get_pin_target(codec, nids[i]);
124
val |= AC_PINCTL_VREF_80;
125
snd_hda_set_pin_ctl(codec, nids[i], val);
126
spec->gen.keep_vref_in_automute = 1;
127
break;
128
}
129
}
130
131
static void alc889_fixup_mac_pins(struct hda_codec *codec,
132
const hda_nid_t *nids, int num_nids)
133
{
134
struct alc_spec *spec = codec->spec;
135
int i;
136
137
for (i = 0; i < num_nids; i++) {
138
unsigned int val;
139
val = snd_hda_codec_get_pin_target(codec, nids[i]);
140
val |= AC_PINCTL_VREF_50;
141
snd_hda_set_pin_ctl(codec, nids[i], val);
142
}
143
spec->gen.keep_vref_in_automute = 1;
144
}
145
146
/* Set VREF on speaker pins on imac91 */
147
static void alc889_fixup_imac91_vref(struct hda_codec *codec,
148
const struct hda_fixup *fix, int action)
149
{
150
static const hda_nid_t nids[] = { 0x18, 0x1a };
151
152
if (action == HDA_FIXUP_ACT_INIT)
153
alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
154
}
155
156
/* Set VREF on speaker pins on mba11 */
157
static void alc889_fixup_mba11_vref(struct hda_codec *codec,
158
const struct hda_fixup *fix, int action)
159
{
160
static const hda_nid_t nids[] = { 0x18 };
161
162
if (action == HDA_FIXUP_ACT_INIT)
163
alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
164
}
165
166
/* Set VREF on speaker pins on mba21 */
167
static void alc889_fixup_mba21_vref(struct hda_codec *codec,
168
const struct hda_fixup *fix, int action)
169
{
170
static const hda_nid_t nids[] = { 0x18, 0x19 };
171
172
if (action == HDA_FIXUP_ACT_INIT)
173
alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
174
}
175
176
/* Don't take HP output as primary
177
* Strangely, the speaker output doesn't work on Vaio Z and some Vaio
178
* all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
179
*/
180
static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
181
const struct hda_fixup *fix, int action)
182
{
183
struct alc_spec *spec = codec->spec;
184
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
185
spec->gen.no_primary_hp = 1;
186
spec->gen.no_multi_io = 1;
187
}
188
}
189
190
static void alc1220_fixup_gb_x570(struct hda_codec *codec,
191
const struct hda_fixup *fix,
192
int action)
193
{
194
static const hda_nid_t conn1[] = { 0x0c };
195
static const struct coef_fw gb_x570_coefs[] = {
196
WRITE_COEF(0x07, 0x03c0),
197
WRITE_COEF(0x1a, 0x01c1),
198
WRITE_COEF(0x1b, 0x0202),
199
WRITE_COEF(0x43, 0x3005),
200
{}
201
};
202
203
switch (action) {
204
case HDA_FIXUP_ACT_PRE_PROBE:
205
snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
206
snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
207
break;
208
case HDA_FIXUP_ACT_INIT:
209
alc_process_coef_fw(codec, gb_x570_coefs);
210
break;
211
}
212
}
213
214
static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
215
const struct hda_fixup *fix,
216
int action)
217
{
218
static const hda_nid_t conn1[] = { 0x0c };
219
220
if (action != HDA_FIXUP_ACT_PRE_PROBE)
221
return;
222
223
alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
224
/* We therefore want to make sure 0x14 (front headphone) and
225
* 0x1b (speakers) use the stereo DAC 0x02
226
*/
227
snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
228
snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
229
}
230
231
static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
232
const struct hda_fixup *fix,
233
int action)
234
{
235
alc1220_fixup_clevo_p950(codec, fix, action);
236
alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
237
}
238
239
static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
240
struct hda_jack_callback *jack)
241
{
242
struct alc_spec *spec = codec->spec;
243
unsigned int vref;
244
245
snd_hda_gen_hp_automute(codec, jack);
246
247
if (spec->gen.hp_jack_present)
248
vref = AC_PINCTL_VREF_80;
249
else
250
vref = AC_PINCTL_VREF_HIZ;
251
snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
252
}
253
254
static void alc887_fixup_asus_jack(struct hda_codec *codec,
255
const struct hda_fixup *fix, int action)
256
{
257
struct alc_spec *spec = codec->spec;
258
if (action != HDA_FIXUP_ACT_PROBE)
259
return;
260
snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
261
spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
262
}
263
264
static const struct hda_fixup alc882_fixups[] = {
265
[ALC882_FIXUP_ABIT_AW9D_MAX] = {
266
.type = HDA_FIXUP_PINS,
267
.v.pins = (const struct hda_pintbl[]) {
268
{ 0x15, 0x01080104 }, /* side */
269
{ 0x16, 0x01011012 }, /* rear */
270
{ 0x17, 0x01016011 }, /* clfe */
271
{ }
272
}
273
},
274
[ALC882_FIXUP_LENOVO_Y530] = {
275
.type = HDA_FIXUP_PINS,
276
.v.pins = (const struct hda_pintbl[]) {
277
{ 0x15, 0x99130112 }, /* rear int speakers */
278
{ 0x16, 0x99130111 }, /* subwoofer */
279
{ }
280
}
281
},
282
[ALC882_FIXUP_PB_M5210] = {
283
.type = HDA_FIXUP_PINCTLS,
284
.v.pins = (const struct hda_pintbl[]) {
285
{ 0x19, PIN_VREF50 },
286
{}
287
}
288
},
289
[ALC882_FIXUP_ACER_ASPIRE_7736] = {
290
.type = HDA_FIXUP_FUNC,
291
.v.func = alc_fixup_sku_ignore,
292
},
293
[ALC882_FIXUP_ASUS_W90V] = {
294
.type = HDA_FIXUP_PINS,
295
.v.pins = (const struct hda_pintbl[]) {
296
{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
297
{ }
298
}
299
},
300
[ALC889_FIXUP_CD] = {
301
.type = HDA_FIXUP_PINS,
302
.v.pins = (const struct hda_pintbl[]) {
303
{ 0x1c, 0x993301f0 }, /* CD */
304
{ }
305
}
306
},
307
[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
308
.type = HDA_FIXUP_PINS,
309
.v.pins = (const struct hda_pintbl[]) {
310
{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
311
{ }
312
},
313
.chained = true,
314
.chain_id = ALC889_FIXUP_CD,
315
},
316
[ALC889_FIXUP_VAIO_TT] = {
317
.type = HDA_FIXUP_PINS,
318
.v.pins = (const struct hda_pintbl[]) {
319
{ 0x17, 0x90170111 }, /* hidden surround speaker */
320
{ }
321
}
322
},
323
[ALC888_FIXUP_EEE1601] = {
324
.type = HDA_FIXUP_VERBS,
325
.v.verbs = (const struct hda_verb[]) {
326
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
327
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
328
{ }
329
}
330
},
331
[ALC886_FIXUP_EAPD] = {
332
.type = HDA_FIXUP_VERBS,
333
.v.verbs = (const struct hda_verb[]) {
334
/* change to EAPD mode */
335
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
336
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
337
{ }
338
}
339
},
340
[ALC882_FIXUP_EAPD] = {
341
.type = HDA_FIXUP_VERBS,
342
.v.verbs = (const struct hda_verb[]) {
343
/* change to EAPD mode */
344
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
345
{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
346
{ }
347
}
348
},
349
[ALC883_FIXUP_EAPD] = {
350
.type = HDA_FIXUP_VERBS,
351
.v.verbs = (const struct hda_verb[]) {
352
/* change to EAPD mode */
353
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
354
{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
355
{ }
356
}
357
},
358
[ALC883_FIXUP_ACER_EAPD] = {
359
.type = HDA_FIXUP_VERBS,
360
.v.verbs = (const struct hda_verb[]) {
361
/* eanable EAPD on Acer laptops */
362
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
363
{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
364
{ }
365
}
366
},
367
[ALC882_FIXUP_GPIO1] = {
368
.type = HDA_FIXUP_FUNC,
369
.v.func = alc_fixup_gpio1,
370
},
371
[ALC882_FIXUP_GPIO2] = {
372
.type = HDA_FIXUP_FUNC,
373
.v.func = alc_fixup_gpio2,
374
},
375
[ALC882_FIXUP_GPIO3] = {
376
.type = HDA_FIXUP_FUNC,
377
.v.func = alc_fixup_gpio3,
378
},
379
[ALC882_FIXUP_ASUS_W2JC] = {
380
.type = HDA_FIXUP_FUNC,
381
.v.func = alc_fixup_gpio1,
382
.chained = true,
383
.chain_id = ALC882_FIXUP_EAPD,
384
},
385
[ALC889_FIXUP_COEF] = {
386
.type = HDA_FIXUP_FUNC,
387
.v.func = alc889_fixup_coef,
388
},
389
[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
390
.type = HDA_FIXUP_PINS,
391
.v.pins = (const struct hda_pintbl[]) {
392
{ 0x16, 0x99130111 }, /* CLFE speaker */
393
{ 0x17, 0x99130112 }, /* surround speaker */
394
{ }
395
},
396
.chained = true,
397
.chain_id = ALC882_FIXUP_GPIO1,
398
},
399
[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
400
.type = HDA_FIXUP_PINS,
401
.v.pins = (const struct hda_pintbl[]) {
402
{ 0x16, 0x99130111 }, /* CLFE speaker */
403
{ 0x1b, 0x99130112 }, /* surround speaker */
404
{ }
405
},
406
.chained = true,
407
.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
408
},
409
[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
410
/* additional init verbs for Acer Aspire 8930G */
411
.type = HDA_FIXUP_VERBS,
412
.v.verbs = (const struct hda_verb[]) {
413
/* Enable all DACs */
414
/* DAC DISABLE/MUTE 1? */
415
/* setting bits 1-5 disables DAC nids 0x02-0x06
416
* apparently. Init=0x38 */
417
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
418
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
419
/* DAC DISABLE/MUTE 2? */
420
/* some bit here disables the other DACs.
421
* Init=0x4900 */
422
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
423
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
424
/* DMIC fix
425
* This laptop has a stereo digital microphone.
426
* The mics are only 1cm apart which makes the stereo
427
* useless. However, either the mic or the ALC889
428
* makes the signal become a difference/sum signal
429
* instead of standard stereo, which is annoying.
430
* So instead we flip this bit which makes the
431
* codec replicate the sum signal to both channels,
432
* turning it into a normal mono mic.
433
*/
434
/* DMIC_CONTROL? Init value = 0x0001 */
435
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
436
{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
437
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
438
{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
439
{ }
440
},
441
.chained = true,
442
.chain_id = ALC882_FIXUP_GPIO1,
443
},
444
[ALC885_FIXUP_MACPRO_GPIO] = {
445
.type = HDA_FIXUP_FUNC,
446
.v.func = alc885_fixup_macpro_gpio,
447
},
448
[ALC889_FIXUP_DAC_ROUTE] = {
449
.type = HDA_FIXUP_FUNC,
450
.v.func = alc889_fixup_dac_route,
451
},
452
[ALC889_FIXUP_MBP_VREF] = {
453
.type = HDA_FIXUP_FUNC,
454
.v.func = alc889_fixup_mbp_vref,
455
.chained = true,
456
.chain_id = ALC882_FIXUP_GPIO1,
457
},
458
[ALC889_FIXUP_IMAC91_VREF] = {
459
.type = HDA_FIXUP_FUNC,
460
.v.func = alc889_fixup_imac91_vref,
461
.chained = true,
462
.chain_id = ALC882_FIXUP_GPIO1,
463
},
464
[ALC889_FIXUP_MBA11_VREF] = {
465
.type = HDA_FIXUP_FUNC,
466
.v.func = alc889_fixup_mba11_vref,
467
.chained = true,
468
.chain_id = ALC889_FIXUP_MBP_VREF,
469
},
470
[ALC889_FIXUP_MBA21_VREF] = {
471
.type = HDA_FIXUP_FUNC,
472
.v.func = alc889_fixup_mba21_vref,
473
.chained = true,
474
.chain_id = ALC889_FIXUP_MBP_VREF,
475
},
476
[ALC889_FIXUP_MP11_VREF] = {
477
.type = HDA_FIXUP_FUNC,
478
.v.func = alc889_fixup_mba11_vref,
479
.chained = true,
480
.chain_id = ALC885_FIXUP_MACPRO_GPIO,
481
},
482
[ALC889_FIXUP_MP41_VREF] = {
483
.type = HDA_FIXUP_FUNC,
484
.v.func = alc889_fixup_mbp_vref,
485
.chained = true,
486
.chain_id = ALC885_FIXUP_MACPRO_GPIO,
487
},
488
[ALC882_FIXUP_INV_DMIC] = {
489
.type = HDA_FIXUP_FUNC,
490
.v.func = alc_fixup_inv_dmic,
491
},
492
[ALC882_FIXUP_NO_PRIMARY_HP] = {
493
.type = HDA_FIXUP_FUNC,
494
.v.func = alc882_fixup_no_primary_hp,
495
},
496
[ALC887_FIXUP_ASUS_BASS] = {
497
.type = HDA_FIXUP_PINS,
498
.v.pins = (const struct hda_pintbl[]) {
499
{0x16, 0x99130130}, /* bass speaker */
500
{}
501
},
502
.chained = true,
503
.chain_id = ALC887_FIXUP_BASS_CHMAP,
504
},
505
[ALC887_FIXUP_BASS_CHMAP] = {
506
.type = HDA_FIXUP_FUNC,
507
.v.func = alc_fixup_bass_chmap,
508
},
509
[ALC1220_FIXUP_GB_DUAL_CODECS] = {
510
.type = HDA_FIXUP_FUNC,
511
.v.func = alc1220_fixup_gb_dual_codecs,
512
},
513
[ALC1220_FIXUP_GB_X570] = {
514
.type = HDA_FIXUP_FUNC,
515
.v.func = alc1220_fixup_gb_x570,
516
},
517
[ALC1220_FIXUP_CLEVO_P950] = {
518
.type = HDA_FIXUP_FUNC,
519
.v.func = alc1220_fixup_clevo_p950,
520
},
521
[ALC1220_FIXUP_CLEVO_PB51ED] = {
522
.type = HDA_FIXUP_FUNC,
523
.v.func = alc1220_fixup_clevo_pb51ed,
524
},
525
[ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
526
.type = HDA_FIXUP_PINS,
527
.v.pins = (const struct hda_pintbl[]) {
528
{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
529
{}
530
},
531
.chained = true,
532
.chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
533
},
534
[ALC887_FIXUP_ASUS_AUDIO] = {
535
.type = HDA_FIXUP_PINS,
536
.v.pins = (const struct hda_pintbl[]) {
537
{ 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
538
{ 0x19, 0x22219420 },
539
{}
540
},
541
},
542
[ALC887_FIXUP_ASUS_HMIC] = {
543
.type = HDA_FIXUP_FUNC,
544
.v.func = alc887_fixup_asus_jack,
545
.chained = true,
546
.chain_id = ALC887_FIXUP_ASUS_AUDIO,
547
},
548
[ALCS1200A_FIXUP_MIC_VREF] = {
549
.type = HDA_FIXUP_PINCTLS,
550
.v.pins = (const struct hda_pintbl[]) {
551
{ 0x18, PIN_VREF50 }, /* rear mic */
552
{ 0x19, PIN_VREF50 }, /* front mic */
553
{}
554
}
555
},
556
[ALC888VD_FIXUP_MIC_100VREF] = {
557
.type = HDA_FIXUP_PINCTLS,
558
.v.pins = (const struct hda_pintbl[]) {
559
{ 0x18, PIN_VREF100 }, /* headset mic */
560
{}
561
}
562
},
563
};
564
565
static const struct hda_quirk alc882_fixup_tbl[] = {
566
SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
567
SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
568
SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
569
SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
570
SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
571
SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
572
SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
573
SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
574
ALC882_FIXUP_ACER_ASPIRE_4930G),
575
SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
576
ALC882_FIXUP_ACER_ASPIRE_4930G),
577
SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
578
ALC882_FIXUP_ACER_ASPIRE_8930G),
579
SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
580
ALC882_FIXUP_ACER_ASPIRE_8930G),
581
SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
582
ALC882_FIXUP_ACER_ASPIRE_4930G),
583
SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
584
SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
585
ALC882_FIXUP_ACER_ASPIRE_4930G),
586
SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
587
ALC882_FIXUP_ACER_ASPIRE_4930G),
588
SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
589
ALC882_FIXUP_ACER_ASPIRE_4930G),
590
SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
591
SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
592
SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
593
SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
594
SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
595
SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
596
SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
597
SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
598
SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
599
SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
600
SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
601
SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
602
SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
603
SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
604
SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
605
SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
606
607
/* All Apple entries are in codec SSIDs */
608
SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
609
SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
610
SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
611
SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
612
SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
613
SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
614
SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
615
SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
616
SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
617
SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
618
SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
619
SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
620
SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
621
SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
622
SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
623
SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
624
SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
625
SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
626
SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
627
SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
628
SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
629
SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
630
631
SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
632
SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
633
SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
634
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
635
SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
636
SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
637
SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
638
SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
639
SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
640
SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
641
SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
642
SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
643
SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
644
SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
645
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
646
SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
647
SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
648
SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
649
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
650
SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
651
SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
652
SND_PCI_QUIRK(0x1558, 0x5802, "Clevo X58[05]WN[RST]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
653
SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
654
SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
655
SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
656
SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
657
SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
658
SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
659
SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
660
SND_PCI_QUIRK(0x1558, 0x66a6, "Clevo PE60SN[CDE]-[GS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
661
SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
662
SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
663
SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
664
SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
665
SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
666
SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
667
SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
668
SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
669
SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
670
SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
671
SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
672
SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
673
SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
674
SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
675
SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
676
SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
677
SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
678
SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
679
SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
680
SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
681
SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
682
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
683
SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
684
SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
685
SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
686
{}
687
};
688
689
static const struct hda_model_fixup alc882_fixup_models[] = {
690
{.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
691
{.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
692
{.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
693
{.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
694
{.id = ALC889_FIXUP_CD, .name = "cd"},
695
{.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
696
{.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
697
{.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
698
{.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
699
{.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
700
{.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
701
{.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
702
{.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
703
{.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
704
{.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
705
{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
706
{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
707
{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
708
{.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
709
{.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
710
{.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
711
{.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
712
{.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
713
{.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
714
{.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
715
{.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
716
{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
717
{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
718
{.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
719
{.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
720
{.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
721
{.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
722
{}
723
};
724
725
static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
726
SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
727
{0x14, 0x01014010},
728
{0x15, 0x01011012},
729
{0x16, 0x01016011},
730
{0x18, 0x01a19040},
731
{0x19, 0x02a19050},
732
{0x1a, 0x0181304f},
733
{0x1b, 0x0221401f},
734
{0x1e, 0x01456130}),
735
SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
736
{0x14, 0x01015010},
737
{0x15, 0x01011012},
738
{0x16, 0x01011011},
739
{0x18, 0x01a11040},
740
{0x19, 0x02a19050},
741
{0x1a, 0x0181104f},
742
{0x1b, 0x0221401f},
743
{0x1e, 0x01451130}),
744
{}
745
};
746
747
/*
748
* BIOS auto configuration
749
*/
750
/* almost identical with ALC880 parser... */
751
static int alc882_parse_auto_config(struct hda_codec *codec)
752
{
753
static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
754
static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
755
return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
756
}
757
758
/*
759
*/
760
static int alc882_probe(struct hda_codec *codec, const struct hda_device_id *id)
761
{
762
struct alc_spec *spec;
763
int err;
764
765
err = alc_alloc_spec(codec, 0x0b);
766
if (err < 0)
767
return err;
768
769
spec = codec->spec;
770
771
switch (codec->core.vendor_id) {
772
case 0x10ec0882:
773
case 0x10ec0885:
774
case 0x10ec0900:
775
case 0x10ec0b00:
776
case 0x10ec1220:
777
break;
778
default:
779
/* ALC883 and variants */
780
alc_fix_pll_init(codec, 0x20, 0x0a, 10);
781
break;
782
}
783
784
alc_pre_init(codec);
785
786
snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
787
alc882_fixups);
788
snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
789
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
790
791
alc_auto_parse_customize_define(codec);
792
793
if (has_cdefine_beep(codec))
794
spec->gen.beep_nid = 0x01;
795
796
/* automatic parse from the BIOS config */
797
err = alc882_parse_auto_config(codec);
798
if (err < 0)
799
goto error;
800
801
if (!spec->gen.no_analog && spec->gen.beep_nid) {
802
err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
803
if (err < 0)
804
goto error;
805
}
806
807
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
808
809
return 0;
810
811
error:
812
snd_hda_gen_remove(codec);
813
return err;
814
}
815
816
static const struct hda_codec_ops alc882_codec_ops = {
817
.probe = alc882_probe,
818
.remove = snd_hda_gen_remove,
819
.build_controls = alc_build_controls,
820
.build_pcms = snd_hda_gen_build_pcms,
821
.init = alc_init,
822
.unsol_event = snd_hda_jack_unsol_event,
823
.resume = alc_resume,
824
.suspend = alc_suspend,
825
.check_power_status = snd_hda_gen_check_power_status,
826
.stream_pm = snd_hda_gen_stream_pm,
827
};
828
829
/*
830
* driver entries
831
*/
832
static const struct hda_device_id snd_hda_id_alc882[] = {
833
HDA_CODEC_ID_REV(0x10ec0662, 0x100002, "ALC662 rev2"),
834
HDA_CODEC_ID(0x10ec0882, "ALC882"),
835
HDA_CODEC_ID(0x10ec0883, "ALC883"),
836
HDA_CODEC_ID_REV(0x10ec0885, 0x100101, "ALC889A"),
837
HDA_CODEC_ID_REV(0x10ec0885, 0x100103, "ALC889A"),
838
HDA_CODEC_ID(0x10ec0885, "ALC885"),
839
HDA_CODEC_ID(0x10ec0887, "ALC887"),
840
HDA_CODEC_ID_REV(0x10ec0888, 0x100101, "ALC1200"),
841
HDA_CODEC_ID(0x10ec0888, "ALC888"),
842
HDA_CODEC_ID(0x10ec0889, "ALC889"),
843
HDA_CODEC_ID(0x10ec0899, "ALC898"),
844
HDA_CODEC_ID(0x10ec0900, "ALC1150"),
845
HDA_CODEC_ID(0x10ec0b00, "ALCS1200A"),
846
HDA_CODEC_ID(0x10ec1168, "ALC1220"),
847
HDA_CODEC_ID(0x10ec1220, "ALC1220"),
848
{} /* terminator */
849
};
850
MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_alc882);
851
852
MODULE_LICENSE("GPL");
853
MODULE_DESCRIPTION("Realtek ALC882 and compatible HD-audio codecs");
854
MODULE_IMPORT_NS("SND_HDA_CODEC_REALTEK");
855
856
static struct hda_codec_driver alc882_driver = {
857
.id = snd_hda_id_alc882,
858
.ops = &alc882_codec_ops,
859
};
860
861
module_hda_codec_driver(alc882_driver);
862
863