diff options
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/bt87x.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_nvhdmi.c | 31 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 91 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 29 | ||||
-rw-r--r-- | sound/pci/ice1712/amp.c | 8 | ||||
-rw-r--r-- | sound/pci/ice1712/ice1712.c | 2 | ||||
-rw-r--r-- | sound/pci/ice1712/ice1724.c | 8 | ||||
-rw-r--r-- | sound/pci/via82xx.c | 27 |
8 files changed, 151 insertions, 47 deletions
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 24585c6c6d01..4e2b925a94cc 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c | |||
@@ -808,6 +808,8 @@ static struct pci_device_id snd_bt87x_ids[] = { | |||
808 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1002, 0x0001, GENERIC), | 808 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1002, 0x0001, GENERIC), |
809 | /* Leadtek Winfast tv 2000xp delux */ | 809 | /* Leadtek Winfast tv 2000xp delux */ |
810 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x107d, 0x6606, GENERIC), | 810 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x107d, 0x6606, GENERIC), |
811 | /* Pinnacle PCTV */ | ||
812 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x11bd, 0x0012, GENERIC), | ||
811 | /* Voodoo TV 200 */ | 813 | /* Voodoo TV 200 */ |
812 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, GENERIC), | 814 | BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, GENERIC), |
813 | /* Askey Computer Corp. MagicTView'99 */ | 815 | /* Askey Computer Corp. MagicTView'99 */ |
diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index c8435c9a97f9..9fb60276f5c9 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
@@ -29,6 +29,9 @@ | |||
29 | #include "hda_codec.h" | 29 | #include "hda_codec.h" |
30 | #include "hda_local.h" | 30 | #include "hda_local.h" |
31 | 31 | ||
32 | /* define below to restrict the supported rates and formats */ | ||
33 | /* #define LIMITED_RATE_FMT_SUPPORT */ | ||
34 | |||
32 | struct nvhdmi_spec { | 35 | struct nvhdmi_spec { |
33 | struct hda_multi_out multiout; | 36 | struct hda_multi_out multiout; |
34 | 37 | ||
@@ -60,6 +63,22 @@ static struct hda_verb nvhdmi_basic_init[] = { | |||
60 | {} /* terminator */ | 63 | {} /* terminator */ |
61 | }; | 64 | }; |
62 | 65 | ||
66 | #ifdef LIMITED_RATE_FMT_SUPPORT | ||
67 | /* support only the safe format and rate */ | ||
68 | #define SUPPORTED_RATES SNDRV_PCM_RATE_48000 | ||
69 | #define SUPPORTED_MAXBPS 16 | ||
70 | #define SUPPORTED_FORMATS SNDRV_PCM_FMTBIT_S16_LE | ||
71 | #else | ||
72 | /* support all rates and formats */ | ||
73 | #define SUPPORTED_RATES \ | ||
74 | (SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ | ||
75 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ | ||
76 | SNDRV_PCM_RATE_192000) | ||
77 | #define SUPPORTED_MAXBPS 24 | ||
78 | #define SUPPORTED_FORMATS \ | ||
79 | (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE) | ||
80 | #endif | ||
81 | |||
63 | /* | 82 | /* |
64 | * Controls | 83 | * Controls |
65 | */ | 84 | */ |
@@ -258,9 +277,9 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_8ch = { | |||
258 | .channels_min = 2, | 277 | .channels_min = 2, |
259 | .channels_max = 8, | 278 | .channels_max = 8, |
260 | .nid = Nv_Master_Convert_nid, | 279 | .nid = Nv_Master_Convert_nid, |
261 | .rates = SNDRV_PCM_RATE_48000, | 280 | .rates = SUPPORTED_RATES, |
262 | .maxbps = 16, | 281 | .maxbps = SUPPORTED_MAXBPS, |
263 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | 282 | .formats = SUPPORTED_FORMATS, |
264 | .ops = { | 283 | .ops = { |
265 | .open = nvhdmi_dig_playback_pcm_open, | 284 | .open = nvhdmi_dig_playback_pcm_open, |
266 | .close = nvhdmi_dig_playback_pcm_close_8ch, | 285 | .close = nvhdmi_dig_playback_pcm_close_8ch, |
@@ -273,9 +292,9 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_2ch = { | |||
273 | .channels_min = 2, | 292 | .channels_min = 2, |
274 | .channels_max = 2, | 293 | .channels_max = 2, |
275 | .nid = Nv_Master_Convert_nid, | 294 | .nid = Nv_Master_Convert_nid, |
276 | .rates = SNDRV_PCM_RATE_48000, | 295 | .rates = SUPPORTED_RATES, |
277 | .maxbps = 16, | 296 | .maxbps = SUPPORTED_MAXBPS, |
278 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | 297 | .formats = SUPPORTED_FORMATS, |
279 | .ops = { | 298 | .ops = { |
280 | .open = nvhdmi_dig_playback_pcm_open, | 299 | .open = nvhdmi_dig_playback_pcm_open, |
281 | .close = nvhdmi_dig_playback_pcm_close_2ch, | 300 | .close = nvhdmi_dig_playback_pcm_close_2ch, |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7810d3dcad83..c08ca660daba 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -275,7 +275,7 @@ struct alc_spec { | |||
275 | struct snd_kcontrol_new *cap_mixer; /* capture mixer */ | 275 | struct snd_kcontrol_new *cap_mixer; /* capture mixer */ |
276 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ | 276 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ |
277 | 277 | ||
278 | const struct hda_verb *init_verbs[5]; /* initialization verbs | 278 | const struct hda_verb *init_verbs[10]; /* initialization verbs |
279 | * don't forget NULL | 279 | * don't forget NULL |
280 | * termination! | 280 | * termination! |
281 | */ | 281 | */ |
@@ -1332,15 +1332,20 @@ do_sku: | |||
1332 | * when the external headphone out jack is plugged" | 1332 | * when the external headphone out jack is plugged" |
1333 | */ | 1333 | */ |
1334 | if (!spec->autocfg.hp_pins[0]) { | 1334 | if (!spec->autocfg.hp_pins[0]) { |
1335 | hda_nid_t nid; | ||
1335 | tmp = (ass >> 11) & 0x3; /* HP to chassis */ | 1336 | tmp = (ass >> 11) & 0x3; /* HP to chassis */ |
1336 | if (tmp == 0) | 1337 | if (tmp == 0) |
1337 | spec->autocfg.hp_pins[0] = porta; | 1338 | nid = porta; |
1338 | else if (tmp == 1) | 1339 | else if (tmp == 1) |
1339 | spec->autocfg.hp_pins[0] = porte; | 1340 | nid = porte; |
1340 | else if (tmp == 2) | 1341 | else if (tmp == 2) |
1341 | spec->autocfg.hp_pins[0] = portd; | 1342 | nid = portd; |
1342 | else | 1343 | else |
1343 | return 1; | 1344 | return 1; |
1345 | for (i = 0; i < spec->autocfg.line_outs; i++) | ||
1346 | if (spec->autocfg.line_out_pins[i] == nid) | ||
1347 | return 1; | ||
1348 | spec->autocfg.hp_pins[0] = nid; | ||
1344 | } | 1349 | } |
1345 | 1350 | ||
1346 | alc_init_auto_hp(codec); | 1351 | alc_init_auto_hp(codec); |
@@ -1362,7 +1367,7 @@ static void alc_ssid_check(struct hda_codec *codec, | |||
1362 | } | 1367 | } |
1363 | 1368 | ||
1364 | /* | 1369 | /* |
1365 | * Fix-up pin default configurations | 1370 | * Fix-up pin default configurations and add default verbs |
1366 | */ | 1371 | */ |
1367 | 1372 | ||
1368 | struct alc_pincfg { | 1373 | struct alc_pincfg { |
@@ -1370,9 +1375,14 @@ struct alc_pincfg { | |||
1370 | u32 val; | 1375 | u32 val; |
1371 | }; | 1376 | }; |
1372 | 1377 | ||
1373 | static void alc_fix_pincfg(struct hda_codec *codec, | 1378 | struct alc_fixup { |
1379 | const struct alc_pincfg *pins; | ||
1380 | const struct hda_verb *verbs; | ||
1381 | }; | ||
1382 | |||
1383 | static void alc_pick_fixup(struct hda_codec *codec, | ||
1374 | const struct snd_pci_quirk *quirk, | 1384 | const struct snd_pci_quirk *quirk, |
1375 | const struct alc_pincfg **pinfix) | 1385 | const struct alc_fixup *fix) |
1376 | { | 1386 | { |
1377 | const struct alc_pincfg *cfg; | 1387 | const struct alc_pincfg *cfg; |
1378 | 1388 | ||
@@ -1380,9 +1390,14 @@ static void alc_fix_pincfg(struct hda_codec *codec, | |||
1380 | if (!quirk) | 1390 | if (!quirk) |
1381 | return; | 1391 | return; |
1382 | 1392 | ||
1383 | cfg = pinfix[quirk->value]; | 1393 | fix += quirk->value; |
1384 | for (; cfg->nid; cfg++) | 1394 | cfg = fix->pins; |
1385 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | 1395 | if (cfg) { |
1396 | for (; cfg->nid; cfg++) | ||
1397 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | ||
1398 | } | ||
1399 | if (fix->verbs) | ||
1400 | add_verb(codec->spec, fix->verbs); | ||
1386 | } | 1401 | } |
1387 | 1402 | ||
1388 | /* | 1403 | /* |
@@ -9593,11 +9608,13 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { | |||
9593 | { } | 9608 | { } |
9594 | }; | 9609 | }; |
9595 | 9610 | ||
9596 | static const struct alc_pincfg *alc882_pin_fixes[] = { | 9611 | static const struct alc_fixup alc882_fixups[] = { |
9597 | [PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix, | 9612 | [PINFIX_ABIT_AW9D_MAX] = { |
9613 | .pins = alc882_abit_aw9d_pinfix | ||
9614 | }, | ||
9598 | }; | 9615 | }; |
9599 | 9616 | ||
9600 | static struct snd_pci_quirk alc882_pinfix_tbl[] = { | 9617 | static struct snd_pci_quirk alc882_fixup_tbl[] = { |
9601 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), | 9618 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), |
9602 | {} | 9619 | {} |
9603 | }; | 9620 | }; |
@@ -9869,7 +9886,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
9869 | board_config = ALC882_AUTO; | 9886 | board_config = ALC882_AUTO; |
9870 | } | 9887 | } |
9871 | 9888 | ||
9872 | alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes); | 9889 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups); |
9873 | 9890 | ||
9874 | if (board_config == ALC882_AUTO) { | 9891 | if (board_config == ALC882_AUTO) { |
9875 | /* automatic parse from the BIOS config */ | 9892 | /* automatic parse from the BIOS config */ |
@@ -12842,12 +12859,15 @@ static int patch_alc268(struct hda_codec *codec) | |||
12842 | unsigned int wcap = get_wcaps(codec, 0x07); | 12859 | unsigned int wcap = get_wcaps(codec, 0x07); |
12843 | int i; | 12860 | int i; |
12844 | 12861 | ||
12862 | spec->capsrc_nids = alc268_capsrc_nids; | ||
12845 | /* get type */ | 12863 | /* get type */ |
12846 | wcap = get_wcaps_type(wcap); | 12864 | wcap = get_wcaps_type(wcap); |
12847 | if (spec->auto_mic || | 12865 | if (spec->auto_mic || |
12848 | wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { | 12866 | wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { |
12849 | spec->adc_nids = alc268_adc_nids_alt; | 12867 | spec->adc_nids = alc268_adc_nids_alt; |
12850 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); | 12868 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); |
12869 | if (spec->auto_mic) | ||
12870 | fixup_automic_adc(codec); | ||
12851 | if (spec->auto_mic || spec->input_mux->num_items == 1) | 12871 | if (spec->auto_mic || spec->input_mux->num_items == 1) |
12852 | add_mixer(spec, alc268_capture_nosrc_mixer); | 12872 | add_mixer(spec, alc268_capture_nosrc_mixer); |
12853 | else | 12873 | else |
@@ -12857,7 +12877,6 @@ static int patch_alc268(struct hda_codec *codec) | |||
12857 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); | 12877 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); |
12858 | add_mixer(spec, alc268_capture_mixer); | 12878 | add_mixer(spec, alc268_capture_mixer); |
12859 | } | 12879 | } |
12860 | spec->capsrc_nids = alc268_capsrc_nids; | ||
12861 | /* set default input source */ | 12880 | /* set default input source */ |
12862 | for (i = 0; i < spec->num_adc_nids; i++) | 12881 | for (i = 0; i < spec->num_adc_nids; i++) |
12863 | snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], | 12882 | snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], |
@@ -14357,15 +14376,16 @@ static void alc861_auto_init_multi_out(struct hda_codec *codec) | |||
14357 | static void alc861_auto_init_hp_out(struct hda_codec *codec) | 14376 | static void alc861_auto_init_hp_out(struct hda_codec *codec) |
14358 | { | 14377 | { |
14359 | struct alc_spec *spec = codec->spec; | 14378 | struct alc_spec *spec = codec->spec; |
14360 | hda_nid_t pin; | ||
14361 | 14379 | ||
14362 | pin = spec->autocfg.hp_pins[0]; | 14380 | if (spec->autocfg.hp_outs) |
14363 | if (pin) | 14381 | alc861_auto_set_output_and_unmute(codec, |
14364 | alc861_auto_set_output_and_unmute(codec, pin, PIN_HP, | 14382 | spec->autocfg.hp_pins[0], |
14383 | PIN_HP, | ||
14365 | spec->multiout.hp_nid); | 14384 | spec->multiout.hp_nid); |
14366 | pin = spec->autocfg.speaker_pins[0]; | 14385 | if (spec->autocfg.speaker_outs) |
14367 | if (pin) | 14386 | alc861_auto_set_output_and_unmute(codec, |
14368 | alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT, | 14387 | spec->autocfg.speaker_pins[0], |
14388 | PIN_OUT, | ||
14369 | spec->multiout.dac_nids[0]); | 14389 | spec->multiout.dac_nids[0]); |
14370 | } | 14390 | } |
14371 | 14391 | ||
@@ -15158,7 +15178,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = { | |||
15158 | SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), | 15178 | SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), |
15159 | SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), | 15179 | SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), |
15160 | SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), | 15180 | SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), |
15161 | SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST), | 15181 | /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */ |
15162 | SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), | 15182 | SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), |
15163 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), | 15183 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), |
15164 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), | 15184 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), |
@@ -15551,6 +15571,29 @@ static void alc861vd_auto_init(struct hda_codec *codec) | |||
15551 | alc_inithook(codec); | 15571 | alc_inithook(codec); |
15552 | } | 15572 | } |
15553 | 15573 | ||
15574 | enum { | ||
15575 | ALC660VD_FIX_ASUS_GPIO1 | ||
15576 | }; | ||
15577 | |||
15578 | /* reset GPIO1 */ | ||
15579 | static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = { | ||
15580 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, | ||
15581 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, | ||
15582 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, | ||
15583 | { } | ||
15584 | }; | ||
15585 | |||
15586 | static const struct alc_fixup alc861vd_fixups[] = { | ||
15587 | [ALC660VD_FIX_ASUS_GPIO1] = { | ||
15588 | .verbs = alc660vd_fix_asus_gpio1_verbs, | ||
15589 | }, | ||
15590 | }; | ||
15591 | |||
15592 | static struct snd_pci_quirk alc861vd_fixup_tbl[] = { | ||
15593 | SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1), | ||
15594 | {} | ||
15595 | }; | ||
15596 | |||
15554 | static int patch_alc861vd(struct hda_codec *codec) | 15597 | static int patch_alc861vd(struct hda_codec *codec) |
15555 | { | 15598 | { |
15556 | struct alc_spec *spec; | 15599 | struct alc_spec *spec; |
@@ -15572,6 +15615,8 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
15572 | board_config = ALC861VD_AUTO; | 15615 | board_config = ALC861VD_AUTO; |
15573 | } | 15616 | } |
15574 | 15617 | ||
15618 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups); | ||
15619 | |||
15575 | if (board_config == ALC861VD_AUTO) { | 15620 | if (board_config == ALC861VD_AUTO) { |
15576 | /* automatic parse from the BIOS config */ | 15621 | /* automatic parse from the BIOS config */ |
15577 | err = alc861vd_parse_auto_config(codec); | 15622 | err = alc861vd_parse_auto_config(codec); |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index a9b26828a651..66c0876bf734 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -158,6 +158,7 @@ enum { | |||
158 | STAC_D965_5ST_NO_FP, | 158 | STAC_D965_5ST_NO_FP, |
159 | STAC_DELL_3ST, | 159 | STAC_DELL_3ST, |
160 | STAC_DELL_BIOS, | 160 | STAC_DELL_BIOS, |
161 | STAC_927X_VOLKNOB, | ||
161 | STAC_927X_MODELS | 162 | STAC_927X_MODELS |
162 | }; | 163 | }; |
163 | 164 | ||
@@ -907,6 +908,16 @@ static struct hda_verb d965_core_init[] = { | |||
907 | {} | 908 | {} |
908 | }; | 909 | }; |
909 | 910 | ||
911 | static struct hda_verb dell_3st_core_init[] = { | ||
912 | /* don't set delta bit */ | ||
913 | {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f}, | ||
914 | /* unmute node 0x1b */ | ||
915 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | ||
916 | /* select node 0x03 as DAC */ | ||
917 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0x01}, | ||
918 | {} | ||
919 | }; | ||
920 | |||
910 | static struct hda_verb stac927x_core_init[] = { | 921 | static struct hda_verb stac927x_core_init[] = { |
911 | /* set master volume and direct control */ | 922 | /* set master volume and direct control */ |
912 | { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 923 | { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, |
@@ -915,6 +926,14 @@ static struct hda_verb stac927x_core_init[] = { | |||
915 | {} | 926 | {} |
916 | }; | 927 | }; |
917 | 928 | ||
929 | static struct hda_verb stac927x_volknob_core_init[] = { | ||
930 | /* don't set delta bit */ | ||
931 | {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f}, | ||
932 | /* enable analog pc beep path */ | ||
933 | {0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5}, | ||
934 | {} | ||
935 | }; | ||
936 | |||
918 | static struct hda_verb stac9205_core_init[] = { | 937 | static struct hda_verb stac9205_core_init[] = { |
919 | /* set master volume and direct control */ | 938 | /* set master volume and direct control */ |
920 | { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 939 | { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, |
@@ -1999,6 +2018,7 @@ static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = { | |||
1999 | [STAC_D965_5ST_NO_FP] = d965_5st_no_fp_pin_configs, | 2018 | [STAC_D965_5ST_NO_FP] = d965_5st_no_fp_pin_configs, |
2000 | [STAC_DELL_3ST] = dell_3st_pin_configs, | 2019 | [STAC_DELL_3ST] = dell_3st_pin_configs, |
2001 | [STAC_DELL_BIOS] = NULL, | 2020 | [STAC_DELL_BIOS] = NULL, |
2021 | [STAC_927X_VOLKNOB] = NULL, | ||
2002 | }; | 2022 | }; |
2003 | 2023 | ||
2004 | static const char *stac927x_models[STAC_927X_MODELS] = { | 2024 | static const char *stac927x_models[STAC_927X_MODELS] = { |
@@ -2010,6 +2030,7 @@ static const char *stac927x_models[STAC_927X_MODELS] = { | |||
2010 | [STAC_D965_5ST_NO_FP] = "5stack-no-fp", | 2030 | [STAC_D965_5ST_NO_FP] = "5stack-no-fp", |
2011 | [STAC_DELL_3ST] = "dell-3stack", | 2031 | [STAC_DELL_3ST] = "dell-3stack", |
2012 | [STAC_DELL_BIOS] = "dell-bios", | 2032 | [STAC_DELL_BIOS] = "dell-bios", |
2033 | [STAC_927X_VOLKNOB] = "volknob", | ||
2013 | }; | 2034 | }; |
2014 | 2035 | ||
2015 | static struct snd_pci_quirk stac927x_cfg_tbl[] = { | 2036 | static struct snd_pci_quirk stac927x_cfg_tbl[] = { |
@@ -2045,6 +2066,8 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = { | |||
2045 | "Intel D965", STAC_D965_5ST), | 2066 | "Intel D965", STAC_D965_5ST), |
2046 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500, | 2067 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500, |
2047 | "Intel D965", STAC_D965_5ST), | 2068 | "Intel D965", STAC_D965_5ST), |
2069 | /* volume-knob fixes */ | ||
2070 | SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB), | ||
2048 | {} /* terminator */ | 2071 | {} /* terminator */ |
2049 | }; | 2072 | }; |
2050 | 2073 | ||
@@ -5612,10 +5635,14 @@ static int patch_stac927x(struct hda_codec *codec) | |||
5612 | spec->dmic_nids = stac927x_dmic_nids; | 5635 | spec->dmic_nids = stac927x_dmic_nids; |
5613 | spec->num_dmics = STAC927X_NUM_DMICS; | 5636 | spec->num_dmics = STAC927X_NUM_DMICS; |
5614 | 5637 | ||
5615 | spec->init = d965_core_init; | 5638 | spec->init = dell_3st_core_init; |
5616 | spec->dmux_nids = stac927x_dmux_nids; | 5639 | spec->dmux_nids = stac927x_dmux_nids; |
5617 | spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids); | 5640 | spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids); |
5618 | break; | 5641 | break; |
5642 | case STAC_927X_VOLKNOB: | ||
5643 | spec->num_dmics = 0; | ||
5644 | spec->init = stac927x_volknob_core_init; | ||
5645 | break; | ||
5619 | default: | 5646 | default: |
5620 | spec->num_dmics = 0; | 5647 | spec->num_dmics = 0; |
5621 | spec->init = stac927x_core_init; | 5648 | spec->init = stac927x_core_init; |
diff --git a/sound/pci/ice1712/amp.c b/sound/pci/ice1712/amp.c index 37564300b50d..6da21a2bcade 100644 --- a/sound/pci/ice1712/amp.c +++ b/sound/pci/ice1712/amp.c | |||
@@ -52,11 +52,13 @@ static int __devinit snd_vt1724_amp_init(struct snd_ice1712 *ice) | |||
52 | 52 | ||
53 | /* only use basic functionality for now */ | 53 | /* only use basic functionality for now */ |
54 | 54 | ||
55 | ice->num_total_dacs = 2; /* only PSDOUT0 is connected */ | 55 | /* VT1616 6ch codec connected to PSDOUT0 using packed mode */ |
56 | ice->num_total_dacs = 6; | ||
56 | ice->num_total_adcs = 2; | 57 | ice->num_total_adcs = 2; |
57 | 58 | ||
58 | /* Chaintech AV-710 has another codecs, which need initialization */ | 59 | /* Chaintech AV-710 has another WM8728 codec connected to PSDOUT4 |
59 | /* initialize WM8728 codec */ | 60 | (shared with the SPDIF output). Mixer control for this codec |
61 | is not yet supported. */ | ||
60 | if (ice->eeprom.subvendor == VT1724_SUBDEVICE_AV710) { | 62 | if (ice->eeprom.subvendor == VT1724_SUBDEVICE_AV710) { |
61 | for (i = 0; i < ARRAY_SIZE(wm_inits); i += 2) | 63 | for (i = 0; i < ARRAY_SIZE(wm_inits); i += 2) |
62 | wm_put(ice, wm_inits[i], wm_inits[i+1]); | 64 | wm_put(ice, wm_inits[i], wm_inits[i+1]); |
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index cecf1ffeeaaa..d74033a2cfbe 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
@@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol, | |||
2259 | } | 2259 | } |
2260 | 2260 | ||
2261 | static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { | 2261 | static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { |
2262 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2262 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
2263 | .name = "Multi Track Peak", | 2263 | .name = "Multi Track Peak", |
2264 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, | 2264 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, |
2265 | .info = snd_ice1712_pro_peak_info, | 2265 | .info = snd_ice1712_pro_peak_info, |
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index af6e00148621..10fc92c05574 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c | |||
@@ -648,7 +648,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate, | |||
648 | (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { | 648 | (inb(ICEMT1724(ice, DMA_PAUSE)) & DMA_PAUSES)) { |
649 | /* running? we cannot change the rate now... */ | 649 | /* running? we cannot change the rate now... */ |
650 | spin_unlock_irqrestore(&ice->reg_lock, flags); | 650 | spin_unlock_irqrestore(&ice->reg_lock, flags); |
651 | return -EBUSY; | 651 | return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; |
652 | } | 652 | } |
653 | if (!force && is_pro_rate_locked(ice)) { | 653 | if (!force && is_pro_rate_locked(ice)) { |
654 | spin_unlock_irqrestore(&ice->reg_lock, flags); | 654 | spin_unlock_irqrestore(&ice->reg_lock, flags); |
@@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) | |||
1294 | 1294 | ||
1295 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 1295 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
1296 | snd_dma_pci_data(ice->pci), | 1296 | snd_dma_pci_data(ice->pci), |
1297 | 64*1024, 64*1024); | 1297 | 256*1024, 256*1024); |
1298 | 1298 | ||
1299 | ice->pcm = pcm; | 1299 | ice->pcm = pcm; |
1300 | 1300 | ||
@@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) | |||
1408 | 1408 | ||
1409 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 1409 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
1410 | snd_dma_pci_data(ice->pci), | 1410 | snd_dma_pci_data(ice->pci), |
1411 | 64*1024, 64*1024); | 1411 | 256*1024, 256*1024); |
1412 | 1412 | ||
1413 | ice->pcm_ds = pcm; | 1413 | ice->pcm_ds = pcm; |
1414 | 1414 | ||
@@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol, | |||
2110 | } | 2110 | } |
2111 | 2111 | ||
2112 | static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { | 2112 | static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { |
2113 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2113 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
2114 | .name = "Multi Track Peak", | 2114 | .name = "Multi Track Peak", |
2115 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, | 2115 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, |
2116 | .info = snd_vt1724_pro_peak_info, | 2116 | .info = snd_vt1724_pro_peak_info, |
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index acfa4760da49..91683a349035 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c | |||
@@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol, | |||
1626 | struct snd_ctl_elem_value *ucontrol) | 1626 | struct snd_ctl_elem_value *ucontrol) |
1627 | { | 1627 | { |
1628 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); | 1628 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); |
1629 | unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); | 1629 | unsigned int idx = kcontrol->id.subdevice; |
1630 | 1630 | ||
1631 | ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; | 1631 | ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; |
1632 | ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; | 1632 | ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; |
@@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol, | |||
1646 | struct snd_ctl_elem_value *ucontrol) | 1646 | struct snd_ctl_elem_value *ucontrol) |
1647 | { | 1647 | { |
1648 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); | 1648 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); |
1649 | unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); | 1649 | unsigned int idx = kcontrol->id.subdevice; |
1650 | unsigned long port = chip->port + 0x10 * idx; | 1650 | unsigned long port = chip->port + 0x10 * idx; |
1651 | unsigned char val; | 1651 | unsigned char val; |
1652 | int i, change = 0; | 1652 | int i, change = 0; |
@@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata = | |||
1705 | }; | 1705 | }; |
1706 | 1706 | ||
1707 | static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { | 1707 | static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { |
1708 | .name = "VIA DXS Playback Volume", | 1708 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
1709 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1709 | .device = 0, |
1710 | /* .subdevice set later */ | ||
1711 | .name = "PCM Playback Volume", | ||
1710 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | | 1712 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | |
1711 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), | 1713 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), |
1712 | .count = 4, | ||
1713 | .info = snd_via8233_dxs_volume_info, | 1714 | .info = snd_via8233_dxs_volume_info, |
1714 | .get = snd_via8233_dxs_volume_get, | 1715 | .get = snd_via8233_dxs_volume_get, |
1715 | .put = snd_via8233_dxs_volume_put, | 1716 | .put = snd_via8233_dxs_volume_put, |
@@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) | |||
1936 | } | 1937 | } |
1937 | else /* Using DXS when PCM emulation is enabled is really weird */ | 1938 | else /* Using DXS when PCM emulation is enabled is really weird */ |
1938 | { | 1939 | { |
1939 | /* Standalone DXS controls */ | 1940 | for (i = 0; i < 4; ++i) { |
1940 | err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); | 1941 | struct snd_kcontrol *kctl; |
1941 | if (err < 0) | 1942 | |
1942 | return err; | 1943 | kctl = snd_ctl_new1( |
1944 | &snd_via8233_dxs_volume_control, chip); | ||
1945 | if (!kctl) | ||
1946 | return -ENOMEM; | ||
1947 | kctl->id.subdevice = i; | ||
1948 | err = snd_ctl_add(chip->card, kctl); | ||
1949 | if (err < 0) | ||
1950 | return err; | ||
1951 | } | ||
1943 | } | 1952 | } |
1944 | } | 1953 | } |
1945 | /* select spdif data slot 10/11 */ | 1954 | /* select spdif data slot 10/11 */ |