diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-07 10:43:04 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-07 10:43:04 -0400 |
commit | a56e74f546b64be93731e42d83baf5b538cc1b11 (patch) | |
tree | 18f6dee45d801e57ac9db2a31664b0d5c0762c50 /sound/pci | |
parent | d08e2e09042bd3f7ef66a35cb4bb92794ab26bb2 (diff) | |
parent | e4e7f10bfc4069925e99cc4b428c3434e30b6c3f (diff) |
Merge branch 'arm-aesbs' of git://git.linaro.org/people/ardbiesheuvel/linux-arm into devel-stable
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 72 | ||||
-rw-r--r-- | sound/pci/hda/patch_hdmi.c | 47 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 16 |
3 files changed, 111 insertions, 24 deletions
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index b524f89a1f13..18d972501585 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -111,6 +111,9 @@ enum { | |||
111 | /* 0x0009 - 0x0014 -> 12 test regs */ | 111 | /* 0x0009 - 0x0014 -> 12 test regs */ |
112 | /* 0x0015 - visibility reg */ | 112 | /* 0x0015 - visibility reg */ |
113 | 113 | ||
114 | /* Cirrus Logic CS4208 */ | ||
115 | #define CS4208_VENDOR_NID 0x24 | ||
116 | |||
114 | /* | 117 | /* |
115 | * Cirrus Logic CS4210 | 118 | * Cirrus Logic CS4210 |
116 | * | 119 | * |
@@ -223,6 +226,16 @@ static const struct hda_verb cs_coef_init_verbs[] = { | |||
223 | {} /* terminator */ | 226 | {} /* terminator */ |
224 | }; | 227 | }; |
225 | 228 | ||
229 | static const struct hda_verb cs4208_coef_init_verbs[] = { | ||
230 | {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */ | ||
231 | {0x24, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */ | ||
232 | {0x24, AC_VERB_SET_COEF_INDEX, 0x0033}, | ||
233 | {0x24, AC_VERB_SET_PROC_COEF, 0x0001}, /* A1 ICS */ | ||
234 | {0x24, AC_VERB_SET_COEF_INDEX, 0x0034}, | ||
235 | {0x24, AC_VERB_SET_PROC_COEF, 0x1C01}, /* A1 Enable, A Thresh = 300mV */ | ||
236 | {} /* terminator */ | ||
237 | }; | ||
238 | |||
226 | /* Errata: CS4207 rev C0/C1/C2 Silicon | 239 | /* Errata: CS4207 rev C0/C1/C2 Silicon |
227 | * | 240 | * |
228 | * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf | 241 | * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf |
@@ -295,6 +308,8 @@ static int cs_init(struct hda_codec *codec) | |||
295 | /* init_verb sequence for C0/C1/C2 errata*/ | 308 | /* init_verb sequence for C0/C1/C2 errata*/ |
296 | snd_hda_sequence_write(codec, cs_errata_init_verbs); | 309 | snd_hda_sequence_write(codec, cs_errata_init_verbs); |
297 | snd_hda_sequence_write(codec, cs_coef_init_verbs); | 310 | snd_hda_sequence_write(codec, cs_coef_init_verbs); |
311 | } else if (spec->vendor_nid == CS4208_VENDOR_NID) { | ||
312 | snd_hda_sequence_write(codec, cs4208_coef_init_verbs); | ||
298 | } | 313 | } |
299 | 314 | ||
300 | snd_hda_gen_init(codec); | 315 | snd_hda_gen_init(codec); |
@@ -434,6 +449,29 @@ static const struct hda_pintbl mba42_pincfgs[] = { | |||
434 | {} /* terminator */ | 449 | {} /* terminator */ |
435 | }; | 450 | }; |
436 | 451 | ||
452 | static const struct hda_pintbl mba6_pincfgs[] = { | ||
453 | { 0x10, 0x032120f0 }, /* HP */ | ||
454 | { 0x11, 0x500000f0 }, | ||
455 | { 0x12, 0x90100010 }, /* Speaker */ | ||
456 | { 0x13, 0x500000f0 }, | ||
457 | { 0x14, 0x500000f0 }, | ||
458 | { 0x15, 0x770000f0 }, | ||
459 | { 0x16, 0x770000f0 }, | ||
460 | { 0x17, 0x430000f0 }, | ||
461 | { 0x18, 0x43ab9030 }, /* Mic */ | ||
462 | { 0x19, 0x770000f0 }, | ||
463 | { 0x1a, 0x770000f0 }, | ||
464 | { 0x1b, 0x770000f0 }, | ||
465 | { 0x1c, 0x90a00090 }, | ||
466 | { 0x1d, 0x500000f0 }, | ||
467 | { 0x1e, 0x500000f0 }, | ||
468 | { 0x1f, 0x500000f0 }, | ||
469 | { 0x20, 0x500000f0 }, | ||
470 | { 0x21, 0x430000f0 }, | ||
471 | { 0x22, 0x430000f0 }, | ||
472 | {} /* terminator */ | ||
473 | }; | ||
474 | |||
437 | static void cs420x_fixup_gpio_13(struct hda_codec *codec, | 475 | static void cs420x_fixup_gpio_13(struct hda_codec *codec, |
438 | const struct hda_fixup *fix, int action) | 476 | const struct hda_fixup *fix, int action) |
439 | { | 477 | { |
@@ -556,22 +594,23 @@ static int patch_cs420x(struct hda_codec *codec) | |||
556 | 594 | ||
557 | /* | 595 | /* |
558 | * CS4208 support: | 596 | * CS4208 support: |
559 | * Its layout is no longer compatible with CS4206/CS4207, and the generic | 597 | * Its layout is no longer compatible with CS4206/CS4207 |
560 | * parser seems working fairly well, except for trivial fixups. | ||
561 | */ | 598 | */ |
562 | enum { | 599 | enum { |
600 | CS4208_MBA6, | ||
563 | CS4208_GPIO0, | 601 | CS4208_GPIO0, |
564 | }; | 602 | }; |
565 | 603 | ||
566 | static const struct hda_model_fixup cs4208_models[] = { | 604 | static const struct hda_model_fixup cs4208_models[] = { |
567 | { .id = CS4208_GPIO0, .name = "gpio0" }, | 605 | { .id = CS4208_GPIO0, .name = "gpio0" }, |
606 | { .id = CS4208_MBA6, .name = "mba6" }, | ||
568 | {} | 607 | {} |
569 | }; | 608 | }; |
570 | 609 | ||
571 | static const struct snd_pci_quirk cs4208_fixup_tbl[] = { | 610 | static const struct snd_pci_quirk cs4208_fixup_tbl[] = { |
572 | /* codec SSID */ | 611 | /* codec SSID */ |
573 | SND_PCI_QUIRK(0x106b, 0x7100, "MacBookPro 6,1", CS4208_GPIO0), | 612 | SND_PCI_QUIRK(0x106b, 0x7100, "MacBookAir 6,1", CS4208_MBA6), |
574 | SND_PCI_QUIRK(0x106b, 0x7200, "MacBookPro 6,2", CS4208_GPIO0), | 613 | SND_PCI_QUIRK(0x106b, 0x7200, "MacBookAir 6,2", CS4208_MBA6), |
575 | {} /* terminator */ | 614 | {} /* terminator */ |
576 | }; | 615 | }; |
577 | 616 | ||
@@ -588,18 +627,35 @@ static void cs4208_fixup_gpio0(struct hda_codec *codec, | |||
588 | } | 627 | } |
589 | 628 | ||
590 | static const struct hda_fixup cs4208_fixups[] = { | 629 | static const struct hda_fixup cs4208_fixups[] = { |
630 | [CS4208_MBA6] = { | ||
631 | .type = HDA_FIXUP_PINS, | ||
632 | .v.pins = mba6_pincfgs, | ||
633 | .chained = true, | ||
634 | .chain_id = CS4208_GPIO0, | ||
635 | }, | ||
591 | [CS4208_GPIO0] = { | 636 | [CS4208_GPIO0] = { |
592 | .type = HDA_FIXUP_FUNC, | 637 | .type = HDA_FIXUP_FUNC, |
593 | .v.func = cs4208_fixup_gpio0, | 638 | .v.func = cs4208_fixup_gpio0, |
594 | }, | 639 | }, |
595 | }; | 640 | }; |
596 | 641 | ||
642 | /* correct the 0dB offset of input pins */ | ||
643 | static void cs4208_fix_amp_caps(struct hda_codec *codec, hda_nid_t adc) | ||
644 | { | ||
645 | unsigned int caps; | ||
646 | |||
647 | caps = query_amp_caps(codec, adc, HDA_INPUT); | ||
648 | caps &= ~(AC_AMPCAP_OFFSET); | ||
649 | caps |= 0x02; | ||
650 | snd_hda_override_amp_caps(codec, adc, HDA_INPUT, caps); | ||
651 | } | ||
652 | |||
597 | static int patch_cs4208(struct hda_codec *codec) | 653 | static int patch_cs4208(struct hda_codec *codec) |
598 | { | 654 | { |
599 | struct cs_spec *spec; | 655 | struct cs_spec *spec; |
600 | int err; | 656 | int err; |
601 | 657 | ||
602 | spec = cs_alloc_spec(codec, 0); /* no specific w/a */ | 658 | spec = cs_alloc_spec(codec, CS4208_VENDOR_NID); |
603 | if (!spec) | 659 | if (!spec) |
604 | return -ENOMEM; | 660 | return -ENOMEM; |
605 | 661 | ||
@@ -609,6 +665,12 @@ static int patch_cs4208(struct hda_codec *codec) | |||
609 | cs4208_fixups); | 665 | cs4208_fixups); |
610 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); | 666 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); |
611 | 667 | ||
668 | snd_hda_override_wcaps(codec, 0x18, | ||
669 | get_wcaps(codec, 0x18) | AC_WCAP_STEREO); | ||
670 | cs4208_fix_amp_caps(codec, 0x18); | ||
671 | cs4208_fix_amp_caps(codec, 0x1b); | ||
672 | cs4208_fix_amp_caps(codec, 0x1c); | ||
673 | |||
612 | err = cs_parse_auto_config(codec); | 674 | err = cs_parse_auto_config(codec); |
613 | if (err < 0) | 675 | if (err < 0) |
614 | goto error; | 676 | goto error; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 3d8cd04455a6..7ea0245fc6bd 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -1149,32 +1149,43 @@ static int hdmi_choose_cvt(struct hda_codec *codec, | |||
1149 | } | 1149 | } |
1150 | 1150 | ||
1151 | static void haswell_config_cvts(struct hda_codec *codec, | 1151 | static void haswell_config_cvts(struct hda_codec *codec, |
1152 | int pin_id, int mux_id) | 1152 | hda_nid_t pin_nid, int mux_idx) |
1153 | { | 1153 | { |
1154 | struct hdmi_spec *spec = codec->spec; | 1154 | struct hdmi_spec *spec = codec->spec; |
1155 | struct hdmi_spec_per_pin *per_pin; | 1155 | hda_nid_t nid, end_nid; |
1156 | int pin_idx, mux_idx; | 1156 | int cvt_idx, curr; |
1157 | int curr; | 1157 | struct hdmi_spec_per_cvt *per_cvt; |
1158 | int err; | ||
1159 | 1158 | ||
1160 | for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { | 1159 | /* configure all pins, including "no physical connection" ones */ |
1161 | per_pin = get_pin(spec, pin_idx); | 1160 | end_nid = codec->start_nid + codec->num_nodes; |
1161 | for (nid = codec->start_nid; nid < end_nid; nid++) { | ||
1162 | unsigned int wid_caps = get_wcaps(codec, nid); | ||
1163 | unsigned int wid_type = get_wcaps_type(wid_caps); | ||
1162 | 1164 | ||
1163 | if (pin_idx == pin_id) | 1165 | if (wid_type != AC_WID_PIN) |
1164 | continue; | 1166 | continue; |
1165 | 1167 | ||
1166 | curr = snd_hda_codec_read(codec, per_pin->pin_nid, 0, | 1168 | if (nid == pin_nid) |
1169 | continue; | ||
1170 | |||
1171 | curr = snd_hda_codec_read(codec, nid, 0, | ||
1167 | AC_VERB_GET_CONNECT_SEL, 0); | 1172 | AC_VERB_GET_CONNECT_SEL, 0); |
1173 | if (curr != mux_idx) | ||
1174 | continue; | ||
1168 | 1175 | ||
1169 | /* Choose another unused converter */ | 1176 | /* choose an unassigned converter. The conveters in the |
1170 | if (curr == mux_id) { | 1177 | * connection list are in the same order as in the codec. |
1171 | err = hdmi_choose_cvt(codec, pin_idx, NULL, &mux_idx); | 1178 | */ |
1172 | if (err < 0) | 1179 | for (cvt_idx = 0; cvt_idx < spec->num_cvts; cvt_idx++) { |
1173 | return; | 1180 | per_cvt = get_cvt(spec, cvt_idx); |
1174 | snd_printdd("HDMI: choose converter %d for pin %d\n", mux_idx, pin_idx); | 1181 | if (!per_cvt->assigned) { |
1175 | snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, | 1182 | snd_printdd("choose cvt %d for pin nid %d\n", |
1183 | cvt_idx, nid); | ||
1184 | snd_hda_codec_write_cache(codec, nid, 0, | ||
1176 | AC_VERB_SET_CONNECT_SEL, | 1185 | AC_VERB_SET_CONNECT_SEL, |
1177 | mux_idx); | 1186 | cvt_idx); |
1187 | break; | ||
1188 | } | ||
1178 | } | 1189 | } |
1179 | } | 1190 | } |
1180 | } | 1191 | } |
@@ -1216,7 +1227,7 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | |||
1216 | 1227 | ||
1217 | /* configure unused pins to choose other converters */ | 1228 | /* configure unused pins to choose other converters */ |
1218 | if (is_haswell(codec)) | 1229 | if (is_haswell(codec)) |
1219 | haswell_config_cvts(codec, pin_idx, mux_idx); | 1230 | haswell_config_cvts(codec, per_pin->pin_nid, mux_idx); |
1220 | 1231 | ||
1221 | snd_hda_spdif_ctls_assign(codec, pin_idx, per_cvt->cvt_nid); | 1232 | snd_hda_spdif_ctls_assign(codec, pin_idx, per_cvt->cvt_nid); |
1222 | 1233 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index bc07d369fac4..0e303b99a47c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -3439,6 +3439,9 @@ static void alc283_fixup_chromebook(struct hda_codec *codec, | |||
3439 | /* Set to manual mode */ | 3439 | /* Set to manual mode */ |
3440 | val = alc_read_coef_idx(codec, 0x06); | 3440 | val = alc_read_coef_idx(codec, 0x06); |
3441 | alc_write_coef_idx(codec, 0x06, val & ~0x000c); | 3441 | alc_write_coef_idx(codec, 0x06, val & ~0x000c); |
3442 | /* Enable Line1 input control by verb */ | ||
3443 | val = alc_read_coef_idx(codec, 0x1a); | ||
3444 | alc_write_coef_idx(codec, 0x1a, val | (1 << 4)); | ||
3442 | break; | 3445 | break; |
3443 | } | 3446 | } |
3444 | } | 3447 | } |
@@ -3531,6 +3534,7 @@ enum { | |||
3531 | ALC269VB_FIXUP_ORDISSIMO_EVE2, | 3534 | ALC269VB_FIXUP_ORDISSIMO_EVE2, |
3532 | ALC283_FIXUP_CHROME_BOOK, | 3535 | ALC283_FIXUP_CHROME_BOOK, |
3533 | ALC282_FIXUP_ASUS_TX300, | 3536 | ALC282_FIXUP_ASUS_TX300, |
3537 | ALC283_FIXUP_INT_MIC, | ||
3534 | }; | 3538 | }; |
3535 | 3539 | ||
3536 | static const struct hda_fixup alc269_fixups[] = { | 3540 | static const struct hda_fixup alc269_fixups[] = { |
@@ -3790,6 +3794,16 @@ static const struct hda_fixup alc269_fixups[] = { | |||
3790 | .type = HDA_FIXUP_FUNC, | 3794 | .type = HDA_FIXUP_FUNC, |
3791 | .v.func = alc282_fixup_asus_tx300, | 3795 | .v.func = alc282_fixup_asus_tx300, |
3792 | }, | 3796 | }, |
3797 | [ALC283_FIXUP_INT_MIC] = { | ||
3798 | .type = HDA_FIXUP_VERBS, | ||
3799 | .v.verbs = (const struct hda_verb[]) { | ||
3800 | {0x20, AC_VERB_SET_COEF_INDEX, 0x1a}, | ||
3801 | {0x20, AC_VERB_SET_PROC_COEF, 0x0011}, | ||
3802 | { } | ||
3803 | }, | ||
3804 | .chained = true, | ||
3805 | .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST | ||
3806 | }, | ||
3793 | }; | 3807 | }; |
3794 | 3808 | ||
3795 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 3809 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
@@ -3874,7 +3888,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
3874 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3888 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3875 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3889 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3876 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3890 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3877 | SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3891 | SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC), |
3878 | SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3892 | SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3879 | SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 3893 | SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
3880 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), | 3894 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), |