diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 274 |
1 files changed, 178 insertions, 96 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7327deb6df9f..cffb83fdcff7 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -57,6 +57,7 @@ enum { | |||
57 | enum { | 57 | enum { |
58 | ALC260_BASIC, | 58 | ALC260_BASIC, |
59 | ALC260_HP, | 59 | ALC260_HP, |
60 | ALC260_FUJITSU_S702x, | ||
60 | ALC260_MODEL_LAST /* last tag */ | 61 | ALC260_MODEL_LAST /* last tag */ |
61 | }; | 62 | }; |
62 | 63 | ||
@@ -72,6 +73,7 @@ enum { | |||
72 | #define PIN_VREF50 0x21 | 73 | #define PIN_VREF50 0x21 |
73 | #define PIN_OUT 0x40 | 74 | #define PIN_OUT 0x40 |
74 | #define PIN_HP 0xc0 | 75 | #define PIN_HP 0xc0 |
76 | #define PIN_HP_AMP 0x80 | ||
75 | 77 | ||
76 | struct alc_spec { | 78 | struct alc_spec { |
77 | /* codec parameterization */ | 79 | /* codec parameterization */ |
@@ -113,8 +115,6 @@ struct alc_spec { | |||
113 | /* PCM information */ | 115 | /* PCM information */ |
114 | struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */ | 116 | struct hda_pcm pcm_rec[2]; /* used in alc_build_pcms() */ |
115 | 117 | ||
116 | struct semaphore bind_mutex; /* for bound controls */ | ||
117 | |||
118 | /* dynamic controls, init_verbs and input_mux */ | 118 | /* dynamic controls, init_verbs and input_mux */ |
119 | struct auto_pin_cfg autocfg; | 119 | struct auto_pin_cfg autocfg; |
120 | unsigned int num_kctl_alloc, num_kctl_used; | 120 | unsigned int num_kctl_alloc, num_kctl_used; |
@@ -218,72 +218,53 @@ static int alc880_ch_mode_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *uc | |||
218 | 218 | ||
219 | 219 | ||
220 | /* | 220 | /* |
221 | * bound volume controls | 221 | * Control of pin widget settings via the mixer. Only boolean settings are |
222 | * | 222 | * supported, so VrefEn can't be controlled using these functions as they |
223 | * bind multiple volumes (# indices, from 0) | 223 | * stand. |
224 | */ | 224 | */ |
225 | 225 | static int alc_pinctl_switch_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) | |
226 | #define AMP_VAL_IDX_SHIFT 19 | ||
227 | #define AMP_VAL_IDX_MASK (0x0f<<19) | ||
228 | |||
229 | static int alc_bind_switch_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) | ||
230 | { | 226 | { |
231 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 227 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; |
232 | struct alc_spec *spec = codec->spec; | 228 | uinfo->count = 1; |
233 | unsigned long pval; | 229 | uinfo->value.integer.min = 0; |
234 | 230 | uinfo->value.integer.max = 1; | |
235 | down(&spec->bind_mutex); | ||
236 | pval = kcontrol->private_value; | ||
237 | kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ | ||
238 | snd_hda_mixer_amp_switch_info(kcontrol, uinfo); | ||
239 | kcontrol->private_value = pval; | ||
240 | up(&spec->bind_mutex); | ||
241 | return 0; | 231 | return 0; |
242 | } | 232 | } |
243 | 233 | ||
244 | static int alc_bind_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) | 234 | static int alc_pinctl_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) |
245 | { | 235 | { |
246 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 236 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
247 | struct alc_spec *spec = codec->spec; | 237 | hda_nid_t nid = kcontrol->private_value & 0xffff; |
248 | unsigned long pval; | 238 | long mask = (kcontrol->private_value >> 16) & 0xff; |
249 | 239 | long *valp = ucontrol->value.integer.value; | |
250 | down(&spec->bind_mutex); | 240 | |
251 | pval = kcontrol->private_value; | 241 | *valp = 0; |
252 | kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ | 242 | if (snd_hda_codec_read(codec,nid,0,AC_VERB_GET_PIN_WIDGET_CONTROL,0x00) & mask) |
253 | snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); | 243 | *valp = 1; |
254 | kcontrol->private_value = pval; | ||
255 | up(&spec->bind_mutex); | ||
256 | return 0; | 244 | return 0; |
257 | } | 245 | } |
258 | 246 | ||
259 | static int alc_bind_switch_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) | 247 | static int alc_pinctl_switch_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) |
260 | { | 248 | { |
261 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 249 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
262 | struct alc_spec *spec = codec->spec; | 250 | hda_nid_t nid = kcontrol->private_value & 0xffff; |
263 | unsigned long pval; | 251 | long mask = (kcontrol->private_value >> 16) & 0xff; |
264 | int i, indices, change = 0; | 252 | long *valp = ucontrol->value.integer.value; |
265 | 253 | unsigned int pinctl = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_PIN_WIDGET_CONTROL,0x00); | |
266 | down(&spec->bind_mutex); | 254 | int change = ((pinctl & mask)!=0) != *valp; |
267 | pval = kcontrol->private_value; | 255 | |
268 | indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT; | 256 | if (change) |
269 | for (i = 0; i < indices; i++) { | 257 | snd_hda_codec_write(codec,nid,0,AC_VERB_SET_PIN_WIDGET_CONTROL, |
270 | kcontrol->private_value = (pval & ~AMP_VAL_IDX_MASK) | (i << AMP_VAL_IDX_SHIFT); | 258 | *valp?(pinctl|mask):(pinctl&~mask)); |
271 | change |= snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); | ||
272 | } | ||
273 | kcontrol->private_value = pval; | ||
274 | up(&spec->bind_mutex); | ||
275 | return change; | 259 | return change; |
276 | } | 260 | } |
277 | 261 | ||
278 | #define ALC_BIND_MUTE_MONO(xname, nid, channel, indices, direction) \ | 262 | #define ALC_PINCTL_SWITCH(xname, nid, mask) \ |
279 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ | 263 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ |
280 | .info = alc_bind_switch_info, \ | 264 | .info = alc_pinctl_switch_info, \ |
281 | .get = alc_bind_switch_get, \ | 265 | .get = alc_pinctl_switch_get, \ |
282 | .put = alc_bind_switch_put, \ | 266 | .put = alc_pinctl_switch_put, \ |
283 | .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, indices, direction) } | 267 | .private_value = (nid) | (mask<<16) } |
284 | |||
285 | #define ALC_BIND_MUTE(xname,nid,indices,dir) ALC_BIND_MUTE_MONO(xname,nid,3,indices,dir) | ||
286 | |||
287 | 268 | ||
288 | /* | 269 | /* |
289 | * ALC880 3-stack model | 270 | * ALC880 3-stack model |
@@ -354,13 +335,13 @@ static struct alc_channel_mode alc880_threestack_modes[2] = { | |||
354 | 335 | ||
355 | static snd_kcontrol_new_t alc880_three_stack_mixer[] = { | 336 | static snd_kcontrol_new_t alc880_three_stack_mixer[] = { |
356 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 337 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
357 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 338 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
358 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | 339 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), |
359 | ALC_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), | 340 | HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT), |
360 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), | 341 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), |
361 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 342 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
362 | ALC_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | 343 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), |
363 | ALC_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | 344 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), |
364 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 345 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
365 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 346 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
366 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 347 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
@@ -441,7 +422,7 @@ static snd_kcontrol_new_t alc880_capture_alt_mixer[] = { | |||
441 | /* additional mixers to alc880_three_stack_mixer */ | 422 | /* additional mixers to alc880_three_stack_mixer */ |
442 | static snd_kcontrol_new_t alc880_five_stack_mixer[] = { | 423 | static snd_kcontrol_new_t alc880_five_stack_mixer[] = { |
443 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 424 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
444 | ALC_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT), | 425 | HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT), |
445 | { } /* end */ | 426 | { } /* end */ |
446 | }; | 427 | }; |
447 | 428 | ||
@@ -498,15 +479,15 @@ static struct alc_channel_mode alc880_sixstack_modes[1] = { | |||
498 | 479 | ||
499 | static snd_kcontrol_new_t alc880_six_stack_mixer[] = { | 480 | static snd_kcontrol_new_t alc880_six_stack_mixer[] = { |
500 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 481 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
501 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 482 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
502 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 483 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
503 | ALC_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | 484 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), |
504 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), | 485 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), |
505 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 486 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
506 | ALC_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | 487 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), |
507 | ALC_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | 488 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), |
508 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | 489 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), |
509 | ALC_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), | 490 | HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), |
510 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 491 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
511 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 492 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
512 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 493 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
@@ -566,13 +547,13 @@ static struct alc_channel_mode alc880_w810_modes[1] = { | |||
566 | /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */ | 547 | /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */ |
567 | static snd_kcontrol_new_t alc880_w810_base_mixer[] = { | 548 | static snd_kcontrol_new_t alc880_w810_base_mixer[] = { |
568 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 549 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
569 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 550 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
570 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 551 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
571 | ALC_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | 552 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), |
572 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), | 553 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), |
573 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 554 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
574 | ALC_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | 555 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), |
575 | ALC_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | 556 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), |
576 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 557 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
577 | { } /* end */ | 558 | { } /* end */ |
578 | }; | 559 | }; |
@@ -597,9 +578,9 @@ static struct alc_channel_mode alc880_2_jack_modes[1] = { | |||
597 | 578 | ||
598 | static snd_kcontrol_new_t alc880_z71v_mixer[] = { | 579 | static snd_kcontrol_new_t alc880_z71v_mixer[] = { |
599 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 580 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
600 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 581 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
601 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 582 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
602 | ALC_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), | 583 | HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT), |
603 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 584 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
604 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 585 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
605 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 586 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
@@ -623,9 +604,9 @@ static hda_nid_t alc880_f1734_dac_nids[1] = { | |||
623 | 604 | ||
624 | static snd_kcontrol_new_t alc880_f1734_mixer[] = { | 605 | static snd_kcontrol_new_t alc880_f1734_mixer[] = { |
625 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 606 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
626 | ALC_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), | 607 | HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), |
627 | HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 608 | HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
628 | ALC_BIND_MUTE("Internal Speaker Playback Switch", 0x0d, 2, HDA_INPUT), | 609 | HDA_BIND_MUTE("Internal Speaker Playback Switch", 0x0d, 2, HDA_INPUT), |
629 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 610 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
630 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 611 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
631 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 612 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
@@ -648,13 +629,13 @@ static snd_kcontrol_new_t alc880_f1734_mixer[] = { | |||
648 | 629 | ||
649 | static snd_kcontrol_new_t alc880_asus_mixer[] = { | 630 | static snd_kcontrol_new_t alc880_asus_mixer[] = { |
650 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 631 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
651 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 632 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
652 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 633 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
653 | ALC_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | 634 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), |
654 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), | 635 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), |
655 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 636 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
656 | ALC_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | 637 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), |
657 | ALC_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | 638 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), |
658 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 639 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
659 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 640 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
660 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | 641 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), |
@@ -1383,10 +1364,10 @@ static snd_kcontrol_new_t alc880_test_mixer[] = { | |||
1383 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 1364 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
1384 | HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT), | 1365 | HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT), |
1385 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | 1366 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), |
1386 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 1367 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
1387 | ALC_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | 1368 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), |
1388 | ALC_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT), | 1369 | HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT), |
1389 | ALC_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), | 1370 | HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), |
1390 | PIN_CTL_TEST("Front Pin Mode", 0x14), | 1371 | PIN_CTL_TEST("Front Pin Mode", 0x14), |
1391 | PIN_CTL_TEST("Surround Pin Mode", 0x15), | 1372 | PIN_CTL_TEST("Surround Pin Mode", 0x15), |
1392 | PIN_CTL_TEST("CLFE Pin Mode", 0x16), | 1373 | PIN_CTL_TEST("CLFE Pin Mode", 0x16), |
@@ -1769,7 +1750,7 @@ enum { | |||
1769 | static snd_kcontrol_new_t alc880_control_templates[] = { | 1750 | static snd_kcontrol_new_t alc880_control_templates[] = { |
1770 | HDA_CODEC_VOLUME(NULL, 0, 0, 0), | 1751 | HDA_CODEC_VOLUME(NULL, 0, 0, 0), |
1771 | HDA_CODEC_MUTE(NULL, 0, 0, 0), | 1752 | HDA_CODEC_MUTE(NULL, 0, 0, 0), |
1772 | ALC_BIND_MUTE(NULL, 0, 0, 0), | 1753 | HDA_BIND_MUTE(NULL, 0, 0, 0), |
1773 | }; | 1754 | }; |
1774 | 1755 | ||
1775 | /* add dynamic controls */ | 1756 | /* add dynamic controls */ |
@@ -2087,7 +2068,6 @@ static int patch_alc880(struct hda_codec *codec) | |||
2087 | if (spec == NULL) | 2068 | if (spec == NULL) |
2088 | return -ENOMEM; | 2069 | return -ENOMEM; |
2089 | 2070 | ||
2090 | init_MUTEX(&spec->bind_mutex); | ||
2091 | codec->spec = spec; | 2071 | codec->spec = spec; |
2092 | 2072 | ||
2093 | board_config = snd_hda_check_board_config(codec, alc880_cfg_tbl); | 2073 | board_config = snd_hda_check_board_config(codec, alc880_cfg_tbl); |
@@ -2205,6 +2185,17 @@ static struct hda_input_mux alc260_capture_source = { | |||
2205 | }, | 2185 | }, |
2206 | }; | 2186 | }; |
2207 | 2187 | ||
2188 | /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack | ||
2189 | * and the internal CD lines. | ||
2190 | */ | ||
2191 | static struct hda_input_mux alc260_fujitsu_capture_source = { | ||
2192 | .num_items = 2, | ||
2193 | .items = { | ||
2194 | { "Mic/Line", 0x0 }, | ||
2195 | { "CD", 0x4 }, | ||
2196 | }, | ||
2197 | }; | ||
2198 | |||
2208 | /* | 2199 | /* |
2209 | * This is just place-holder, so there's something for alc_build_pcms to look | 2200 | * This is just place-holder, so there's something for alc_build_pcms to look |
2210 | * at when it calculates the maximum number of channels. ALC260 has no mixer | 2201 | * at when it calculates the maximum number of channels. ALC260 has no mixer |
@@ -2217,7 +2208,7 @@ static struct alc_channel_mode alc260_modes[1] = { | |||
2217 | 2208 | ||
2218 | static snd_kcontrol_new_t alc260_base_mixer[] = { | 2209 | static snd_kcontrol_new_t alc260_base_mixer[] = { |
2219 | HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), | 2210 | HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), |
2220 | ALC_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), | 2211 | HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), |
2221 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | 2212 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), |
2222 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | 2213 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), |
2223 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), | 2214 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), |
@@ -2229,9 +2220,9 @@ static snd_kcontrol_new_t alc260_base_mixer[] = { | |||
2229 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x07, 0x05, HDA_INPUT), | 2220 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x07, 0x05, HDA_INPUT), |
2230 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x07, 0x05, HDA_INPUT), | 2221 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x07, 0x05, HDA_INPUT), |
2231 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), | 2222 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), |
2232 | ALC_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), | 2223 | HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), |
2233 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), | 2224 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), |
2234 | ALC_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), | 2225 | HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), |
2235 | HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT), | 2226 | HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT), |
2236 | HDA_CODEC_MUTE("Capture Switch", 0x04, 0x0, HDA_INPUT), | 2227 | HDA_CODEC_MUTE("Capture Switch", 0x04, 0x0, HDA_INPUT), |
2237 | { | 2228 | { |
@@ -2246,7 +2237,7 @@ static snd_kcontrol_new_t alc260_base_mixer[] = { | |||
2246 | 2237 | ||
2247 | static snd_kcontrol_new_t alc260_hp_mixer[] = { | 2238 | static snd_kcontrol_new_t alc260_hp_mixer[] = { |
2248 | HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), | 2239 | HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), |
2249 | ALC_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), | 2240 | HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), |
2250 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | 2241 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), |
2251 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | 2242 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), |
2252 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), | 2243 | HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), |
@@ -2256,9 +2247,9 @@ static snd_kcontrol_new_t alc260_hp_mixer[] = { | |||
2256 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT), | 2247 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT), |
2257 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT), | 2248 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT), |
2258 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), | 2249 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), |
2259 | ALC_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), | 2250 | HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT), |
2260 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), | 2251 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), |
2261 | ALC_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), | 2252 | HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), |
2262 | HDA_CODEC_VOLUME("Capture Volume", 0x05, 0x0, HDA_INPUT), | 2253 | HDA_CODEC_VOLUME("Capture Volume", 0x05, 0x0, HDA_INPUT), |
2263 | HDA_CODEC_MUTE("Capture Switch", 0x05, 0x0, HDA_INPUT), | 2254 | HDA_CODEC_MUTE("Capture Switch", 0x05, 0x0, HDA_INPUT), |
2264 | { | 2255 | { |
@@ -2271,6 +2262,30 @@ static snd_kcontrol_new_t alc260_hp_mixer[] = { | |||
2271 | { } /* end */ | 2262 | { } /* end */ |
2272 | }; | 2263 | }; |
2273 | 2264 | ||
2265 | static snd_kcontrol_new_t alc260_fujitsu_mixer[] = { | ||
2266 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), | ||
2267 | HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), | ||
2268 | ALC_PINCTL_SWITCH("Headphone Amp Switch", 0x14, PIN_HP_AMP), | ||
2269 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | ||
2270 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | ||
2271 | HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT), | ||
2272 | HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT), | ||
2273 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | ||
2274 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | ||
2275 | HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), | ||
2276 | HDA_BIND_MUTE("Internal Speaker Playback Switch", 0x09, 2, HDA_INPUT), | ||
2277 | HDA_CODEC_VOLUME("Capture Volume", 0x04, 0x0, HDA_INPUT), | ||
2278 | HDA_CODEC_MUTE("Capture Switch", 0x04, 0x0, HDA_INPUT), | ||
2279 | { | ||
2280 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
2281 | .name = "Capture Source", | ||
2282 | .info = alc_mux_enum_info, | ||
2283 | .get = alc_mux_enum_get, | ||
2284 | .put = alc_mux_enum_put, | ||
2285 | }, | ||
2286 | { } /* end */ | ||
2287 | }; | ||
2288 | |||
2274 | static struct hda_verb alc260_init_verbs[] = { | 2289 | static struct hda_verb alc260_init_verbs[] = { |
2275 | /* Line In pin widget for input */ | 2290 | /* Line In pin widget for input */ |
2276 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 2291 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
@@ -2332,6 +2347,60 @@ static struct hda_verb alc260_init_verbs[] = { | |||
2332 | { } | 2347 | { } |
2333 | }; | 2348 | }; |
2334 | 2349 | ||
2350 | /* Initialisation sequence for ALC260 as configured in Fujitsu S702x | ||
2351 | * laptops. | ||
2352 | */ | ||
2353 | static struct hda_verb alc260_fujitsu_init_verbs[] = { | ||
2354 | /* Disable all GPIOs */ | ||
2355 | {0x01, AC_VERB_SET_GPIO_MASK, 0}, | ||
2356 | /* Internal speaker is connected to headphone pin */ | ||
2357 | {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
2358 | /* Headphone/Line-out jack connects to Line1 pin; make it an output */ | ||
2359 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2360 | /* Mic/Line-in jack is connected to mic1 pin, so make it an input */ | ||
2361 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
2362 | /* Ensure all other unused pins are disabled and muted. | ||
2363 | * Note: trying to set widget 0x15 to anything blocks all audio | ||
2364 | * output for some reason, so just leave that at the default. | ||
2365 | */ | ||
2366 | {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2367 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2368 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2369 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2370 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, | ||
2371 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2372 | /* Disable digital (SPDIF) pins */ | ||
2373 | {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0}, | ||
2374 | {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0}, | ||
2375 | |||
2376 | /* Start with mixer outputs muted */ | ||
2377 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2378 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2379 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2380 | |||
2381 | /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */ | ||
2382 | {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2383 | /* Unmute Line1 pin widget amp left and right (no equiv mixer ctrl) */ | ||
2384 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2385 | /* Unmute pin widget used for Line-in (no equiv mixer ctrl) */ | ||
2386 | {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
2387 | |||
2388 | /* Mute capture amp left and right */ | ||
2389 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2390 | /* Set ADC connection select to line in (on mic1 pin) */ | ||
2391 | {0x04, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
2392 | |||
2393 | /* Mute all inputs to mixer widget (even unconnected ones) */ | ||
2394 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */ | ||
2395 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */ | ||
2396 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */ | ||
2397 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */ | ||
2398 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */ | ||
2399 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */ | ||
2400 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */ | ||
2401 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */ | ||
2402 | }; | ||
2403 | |||
2335 | static struct hda_pcm_stream alc260_pcm_analog_playback = { | 2404 | static struct hda_pcm_stream alc260_pcm_analog_playback = { |
2336 | .substreams = 1, | 2405 | .substreams = 1, |
2337 | .channels_min = 2, | 2406 | .channels_min = 2, |
@@ -2347,6 +2416,8 @@ static struct hda_pcm_stream alc260_pcm_analog_capture = { | |||
2347 | static struct hda_board_config alc260_cfg_tbl[] = { | 2416 | static struct hda_board_config alc260_cfg_tbl[] = { |
2348 | { .modelname = "hp", .config = ALC260_HP }, | 2417 | { .modelname = "hp", .config = ALC260_HP }, |
2349 | { .pci_subvendor = 0x103c, .config = ALC260_HP }, | 2418 | { .pci_subvendor = 0x103c, .config = ALC260_HP }, |
2419 | { .modelname = "fujitsu", .config = ALC260_FUJITSU_S702x }, | ||
2420 | { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1326, .config = ALC260_FUJITSU_S702x }, | ||
2350 | {} | 2421 | {} |
2351 | }; | 2422 | }; |
2352 | 2423 | ||
@@ -2359,7 +2430,6 @@ static int patch_alc260(struct hda_codec *codec) | |||
2359 | if (spec == NULL) | 2430 | if (spec == NULL) |
2360 | return -ENOMEM; | 2431 | return -ENOMEM; |
2361 | 2432 | ||
2362 | init_MUTEX(&spec->bind_mutex); | ||
2363 | codec->spec = spec; | 2433 | codec->spec = spec; |
2364 | 2434 | ||
2365 | board_config = snd_hda_check_board_config(codec, alc260_cfg_tbl); | 2435 | board_config = snd_hda_check_board_config(codec, alc260_cfg_tbl); |
@@ -2373,14 +2443,23 @@ static int patch_alc260(struct hda_codec *codec) | |||
2373 | spec->mixers[spec->num_mixers] = alc260_hp_mixer; | 2443 | spec->mixers[spec->num_mixers] = alc260_hp_mixer; |
2374 | spec->num_mixers++; | 2444 | spec->num_mixers++; |
2375 | break; | 2445 | break; |
2446 | case ALC260_FUJITSU_S702x: | ||
2447 | spec->mixers[spec->num_mixers] = alc260_fujitsu_mixer; | ||
2448 | spec->num_mixers++; | ||
2449 | break; | ||
2376 | default: | 2450 | default: |
2377 | spec->mixers[spec->num_mixers] = alc260_base_mixer; | 2451 | spec->mixers[spec->num_mixers] = alc260_base_mixer; |
2378 | spec->num_mixers++; | 2452 | spec->num_mixers++; |
2379 | break; | 2453 | break; |
2380 | } | 2454 | } |
2381 | 2455 | ||
2382 | spec->init_verbs[0] = alc260_init_verbs; | 2456 | if (board_config != ALC260_FUJITSU_S702x) { |
2383 | spec->num_init_verbs = 1; | 2457 | spec->init_verbs[0] = alc260_init_verbs; |
2458 | spec->num_init_verbs = 1; | ||
2459 | } else { | ||
2460 | spec->init_verbs[0] = alc260_fujitsu_init_verbs; | ||
2461 | spec->num_init_verbs = 1; | ||
2462 | } | ||
2384 | 2463 | ||
2385 | spec->channel_mode = alc260_modes; | 2464 | spec->channel_mode = alc260_modes; |
2386 | spec->num_channel_mode = ARRAY_SIZE(alc260_modes); | 2465 | spec->num_channel_mode = ARRAY_SIZE(alc260_modes); |
@@ -2393,7 +2472,11 @@ static int patch_alc260(struct hda_codec *codec) | |||
2393 | spec->multiout.num_dacs = ARRAY_SIZE(alc260_dac_nids); | 2472 | spec->multiout.num_dacs = ARRAY_SIZE(alc260_dac_nids); |
2394 | spec->multiout.dac_nids = alc260_dac_nids; | 2473 | spec->multiout.dac_nids = alc260_dac_nids; |
2395 | 2474 | ||
2396 | spec->input_mux = &alc260_capture_source; | 2475 | if (board_config != ALC260_FUJITSU_S702x) { |
2476 | spec->input_mux = &alc260_capture_source; | ||
2477 | } else { | ||
2478 | spec->input_mux = &alc260_fujitsu_capture_source; | ||
2479 | } | ||
2397 | switch (board_config) { | 2480 | switch (board_config) { |
2398 | case ALC260_HP: | 2481 | case ALC260_HP: |
2399 | spec->num_adc_nids = ARRAY_SIZE(alc260_hp_adc_nids); | 2482 | spec->num_adc_nids = ARRAY_SIZE(alc260_hp_adc_nids); |
@@ -2483,15 +2566,15 @@ static int alc882_mux_enum_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *u | |||
2483 | */ | 2566 | */ |
2484 | static snd_kcontrol_new_t alc882_base_mixer[] = { | 2567 | static snd_kcontrol_new_t alc882_base_mixer[] = { |
2485 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 2568 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
2486 | ALC_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 2569 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
2487 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | 2570 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
2488 | ALC_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | 2571 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), |
2489 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), | 2572 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), |
2490 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 2573 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
2491 | ALC_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), | 2574 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), |
2492 | ALC_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), | 2575 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), |
2493 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), | 2576 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), |
2494 | ALC_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), | 2577 | HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), |
2495 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 2578 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
2496 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | 2579 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), |
2497 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | 2580 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
@@ -2609,7 +2692,6 @@ static int patch_alc882(struct hda_codec *codec) | |||
2609 | if (spec == NULL) | 2692 | if (spec == NULL) |
2610 | return -ENOMEM; | 2693 | return -ENOMEM; |
2611 | 2694 | ||
2612 | init_MUTEX(&spec->bind_mutex); | ||
2613 | codec->spec = spec; | 2695 | codec->spec = spec; |
2614 | 2696 | ||
2615 | spec->mixers[spec->num_mixers] = alc882_base_mixer; | 2697 | spec->mixers[spec->num_mixers] = alc882_base_mixer; |