diff options
Diffstat (limited to 'sound/pci')
| -rw-r--r-- | sound/pci/Kconfig | 2 | ||||
| -rw-r--r-- | sound/pci/ca0106/ca0106_main.c | 5 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 9 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 75 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 5 | ||||
| -rw-r--r-- | sound/pci/oxygen/hifier.c | 4 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen.c | 4 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen_mixer.c | 5 | ||||
| -rw-r--r-- | sound/pci/oxygen/virtuoso.c | 73 |
9 files changed, 154 insertions, 28 deletions
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index f7d95b224a98..31f52d3fc21f 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
| @@ -845,7 +845,7 @@ config SND_VIRTUOSO | |||
| 845 | select SND_OXYGEN_LIB | 845 | select SND_OXYGEN_LIB |
| 846 | help | 846 | help |
| 847 | Say Y here to include support for sound cards based on the | 847 | Say Y here to include support for sound cards based on the |
| 848 | Asus AV100/AV200 chips, i.e., Xonar D2, DX and D2X. | 848 | Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2 and D2X. |
| 849 | 849 | ||
| 850 | To compile this driver as a module, choose M here: the module | 850 | To compile this driver as a module, choose M here: the module |
| 851 | will be called snd-virtuoso. | 851 | will be called snd-virtuoso. |
diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index 2f8b28add276..6abe8a3bd365 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c | |||
| @@ -249,11 +249,12 @@ static struct snd_ca0106_details ca0106_chip_details[] = { | |||
| 249 | .name = "MSI K8N Diamond MB [SB0438]", | 249 | .name = "MSI K8N Diamond MB [SB0438]", |
| 250 | .gpio_type = 2, | 250 | .gpio_type = 2, |
| 251 | .i2c_adc = 1 } , | 251 | .i2c_adc = 1 } , |
| 252 | /* Another MSI K8N Diamond MB, which has apprently a different SSID */ | 252 | /* MSI K8N Diamond PLUS MB */ |
| 253 | { .serial = 0x10091102, | 253 | { .serial = 0x10091102, |
| 254 | .name = "MSI K8N Diamond MB", | 254 | .name = "MSI K8N Diamond MB", |
| 255 | .gpio_type = 2, | 255 | .gpio_type = 2, |
| 256 | .i2c_adc = 1 } , | 256 | .i2c_adc = 1, |
| 257 | .spi_dac = 2 }, | ||
| 257 | /* Shuttle XPC SD31P which has an onboard Creative Labs | 258 | /* Shuttle XPC SD31P which has an onboard Creative Labs |
| 258 | * Sound Blaster Live! 24-bit EAX | 259 | * Sound Blaster Live! 24-bit EAX |
| 259 | * high-definition 7.1 audio processor". | 260 | * high-definition 7.1 audio processor". |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index a73d6ca0a906..1c53e337ecb2 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -278,6 +278,9 @@ enum { | |||
| 278 | /* Defines for Nvidia HDA support */ | 278 | /* Defines for Nvidia HDA support */ |
| 279 | #define NVIDIA_HDA_TRANSREG_ADDR 0x4e | 279 | #define NVIDIA_HDA_TRANSREG_ADDR 0x4e |
| 280 | #define NVIDIA_HDA_ENABLE_COHBITS 0x0f | 280 | #define NVIDIA_HDA_ENABLE_COHBITS 0x0f |
| 281 | #define NVIDIA_HDA_ISTRM_COH 0x4d | ||
| 282 | #define NVIDIA_HDA_OSTRM_COH 0x4c | ||
| 283 | #define NVIDIA_HDA_ENABLE_COHBIT 0x01 | ||
| 281 | 284 | ||
| 282 | /* Defines for Intel SCH HDA snoop control */ | 285 | /* Defines for Intel SCH HDA snoop control */ |
| 283 | #define INTEL_SCH_HDA_DEVC 0x78 | 286 | #define INTEL_SCH_HDA_DEVC 0x78 |
| @@ -900,6 +903,12 @@ static void azx_init_pci(struct azx *chip) | |||
| 900 | update_pci_byte(chip->pci, | 903 | update_pci_byte(chip->pci, |
| 901 | NVIDIA_HDA_TRANSREG_ADDR, | 904 | NVIDIA_HDA_TRANSREG_ADDR, |
| 902 | 0x0f, NVIDIA_HDA_ENABLE_COHBITS); | 905 | 0x0f, NVIDIA_HDA_ENABLE_COHBITS); |
| 906 | update_pci_byte(chip->pci, | ||
| 907 | NVIDIA_HDA_ISTRM_COH, | ||
| 908 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); | ||
| 909 | update_pci_byte(chip->pci, | ||
| 910 | NVIDIA_HDA_OSTRM_COH, | ||
| 911 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); | ||
| 903 | break; | 912 | break; |
| 904 | case AZX_DRIVER_SCH: | 913 | case AZX_DRIVER_SCH: |
| 905 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); | 914 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index add4e87e0b20..66025161bd69 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -952,7 +952,7 @@ do_sku: | |||
| 952 | tmp | 0x2010); | 952 | tmp | 0x2010); |
| 953 | break; | 953 | break; |
| 954 | case 0x10ec0888: | 954 | case 0x10ec0888: |
| 955 | alc888_coef_init(codec); | 955 | /*alc888_coef_init(codec);*/ /* called in alc_init() */ |
| 956 | break; | 956 | break; |
| 957 | case 0x10ec0267: | 957 | case 0x10ec0267: |
| 958 | case 0x10ec0268: | 958 | case 0x10ec0268: |
| @@ -2439,6 +2439,8 @@ static int alc_init(struct hda_codec *codec) | |||
| 2439 | unsigned int i; | 2439 | unsigned int i; |
| 2440 | 2440 | ||
| 2441 | alc_fix_pll(codec); | 2441 | alc_fix_pll(codec); |
| 2442 | if (codec->vendor_id == 0x10ec0888) | ||
| 2443 | alc888_coef_init(codec); | ||
| 2442 | 2444 | ||
| 2443 | for (i = 0; i < spec->num_init_verbs; i++) | 2445 | for (i = 0; i < spec->num_init_verbs; i++) |
| 2444 | snd_hda_sequence_write(codec, spec->init_verbs[i]); | 2446 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
| @@ -6195,7 +6197,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { | |||
| 6195 | SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), | 6197 | SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), |
| 6196 | SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), | 6198 | SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), |
| 6197 | SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), | 6199 | SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), |
| 6198 | SND_PCI_QUIRK(0x106b, 0x00a0, "Apple iMac 24''", ALC885_IMAC24), | ||
| 6199 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), | 6200 | SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), |
| 6200 | SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ | 6201 | SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ |
| 6201 | SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), | 6202 | SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), |
| @@ -6437,6 +6438,39 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec) | |||
| 6437 | } | 6438 | } |
| 6438 | } | 6439 | } |
| 6439 | 6440 | ||
| 6441 | static void alc882_auto_init_input_src(struct hda_codec *codec) | ||
| 6442 | { | ||
| 6443 | struct alc_spec *spec = codec->spec; | ||
| 6444 | const struct hda_input_mux *imux = spec->input_mux; | ||
| 6445 | int c; | ||
| 6446 | |||
| 6447 | for (c = 0; c < spec->num_adc_nids; c++) { | ||
| 6448 | hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; | ||
| 6449 | hda_nid_t nid = spec->capsrc_nids[c]; | ||
| 6450 | int conns, mute, idx, item; | ||
| 6451 | |||
| 6452 | conns = snd_hda_get_connections(codec, nid, conn_list, | ||
| 6453 | ARRAY_SIZE(conn_list)); | ||
| 6454 | if (conns < 0) | ||
| 6455 | continue; | ||
| 6456 | for (idx = 0; idx < conns; idx++) { | ||
| 6457 | /* if the current connection is the selected one, | ||
| 6458 | * unmute it as default - otherwise mute it | ||
| 6459 | */ | ||
| 6460 | mute = AMP_IN_MUTE(idx); | ||
| 6461 | for (item = 0; item < imux->num_items; item++) { | ||
| 6462 | if (imux->items[item].index == idx) { | ||
| 6463 | if (spec->cur_mux[c] == item) | ||
| 6464 | mute = AMP_IN_UNMUTE(idx); | ||
| 6465 | break; | ||
| 6466 | } | ||
| 6467 | } | ||
| 6468 | snd_hda_codec_write(codec, nid, 0, | ||
| 6469 | AC_VERB_SET_AMP_GAIN_MUTE, mute); | ||
| 6470 | } | ||
| 6471 | } | ||
| 6472 | } | ||
| 6473 | |||
| 6440 | /* add mic boosts if needed */ | 6474 | /* add mic boosts if needed */ |
| 6441 | static int alc_auto_add_mic_boost(struct hda_codec *codec) | 6475 | static int alc_auto_add_mic_boost(struct hda_codec *codec) |
| 6442 | { | 6476 | { |
| @@ -6491,6 +6525,7 @@ static void alc882_auto_init(struct hda_codec *codec) | |||
| 6491 | alc882_auto_init_multi_out(codec); | 6525 | alc882_auto_init_multi_out(codec); |
| 6492 | alc882_auto_init_hp_out(codec); | 6526 | alc882_auto_init_hp_out(codec); |
| 6493 | alc882_auto_init_analog_input(codec); | 6527 | alc882_auto_init_analog_input(codec); |
| 6528 | alc882_auto_init_input_src(codec); | ||
| 6494 | if (spec->unsol_event) | 6529 | if (spec->unsol_event) |
| 6495 | alc_sku_automute(codec); | 6530 | alc_sku_automute(codec); |
| 6496 | } | 6531 | } |
| @@ -8285,6 +8320,8 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec) | |||
| 8285 | } | 8320 | } |
| 8286 | } | 8321 | } |
| 8287 | 8322 | ||
| 8323 | #define alc883_auto_init_input_src alc882_auto_init_input_src | ||
| 8324 | |||
| 8288 | /* almost identical with ALC880 parser... */ | 8325 | /* almost identical with ALC880 parser... */ |
| 8289 | static int alc883_parse_auto_config(struct hda_codec *codec) | 8326 | static int alc883_parse_auto_config(struct hda_codec *codec) |
| 8290 | { | 8327 | { |
| @@ -8315,6 +8352,7 @@ static void alc883_auto_init(struct hda_codec *codec) | |||
| 8315 | alc883_auto_init_multi_out(codec); | 8352 | alc883_auto_init_multi_out(codec); |
| 8316 | alc883_auto_init_hp_out(codec); | 8353 | alc883_auto_init_hp_out(codec); |
| 8317 | alc883_auto_init_analog_input(codec); | 8354 | alc883_auto_init_analog_input(codec); |
| 8355 | alc883_auto_init_input_src(codec); | ||
| 8318 | if (spec->unsol_event) | 8356 | if (spec->unsol_event) |
| 8319 | alc_sku_automute(codec); | 8357 | alc_sku_automute(codec); |
| 8320 | } | 8358 | } |
| @@ -8389,8 +8427,6 @@ static int patch_alc883(struct hda_codec *codec) | |||
| 8389 | codec->patch_ops = alc_patch_ops; | 8427 | codec->patch_ops = alc_patch_ops; |
| 8390 | if (board_config == ALC883_AUTO) | 8428 | if (board_config == ALC883_AUTO) |
| 8391 | spec->init_hook = alc883_auto_init; | 8429 | spec->init_hook = alc883_auto_init; |
| 8392 | else if (codec->vendor_id == 0x10ec0888) | ||
| 8393 | spec->init_hook = alc888_coef_init; | ||
| 8394 | 8430 | ||
| 8395 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 8431 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 8396 | if (!spec->loopback.amplist) | 8432 | if (!spec->loopback.amplist) |
| @@ -9663,6 +9699,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
| 9663 | #define alc262_auto_init_multi_out alc882_auto_init_multi_out | 9699 | #define alc262_auto_init_multi_out alc882_auto_init_multi_out |
| 9664 | #define alc262_auto_init_hp_out alc882_auto_init_hp_out | 9700 | #define alc262_auto_init_hp_out alc882_auto_init_hp_out |
| 9665 | #define alc262_auto_init_analog_input alc882_auto_init_analog_input | 9701 | #define alc262_auto_init_analog_input alc882_auto_init_analog_input |
| 9702 | #define alc262_auto_init_input_src alc882_auto_init_input_src | ||
| 9666 | 9703 | ||
| 9667 | 9704 | ||
| 9668 | /* init callback for auto-configuration model -- overriding the default init */ | 9705 | /* init callback for auto-configuration model -- overriding the default init */ |
| @@ -9672,6 +9709,7 @@ static void alc262_auto_init(struct hda_codec *codec) | |||
| 9672 | alc262_auto_init_multi_out(codec); | 9709 | alc262_auto_init_multi_out(codec); |
| 9673 | alc262_auto_init_hp_out(codec); | 9710 | alc262_auto_init_hp_out(codec); |
| 9674 | alc262_auto_init_analog_input(codec); | 9711 | alc262_auto_init_analog_input(codec); |
| 9712 | alc262_auto_init_input_src(codec); | ||
| 9675 | if (spec->unsol_event) | 9713 | if (spec->unsol_event) |
| 9676 | alc_sku_automute(codec); | 9714 | alc_sku_automute(codec); |
| 9677 | } | 9715 | } |
| @@ -13330,6 +13368,8 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) | |||
| 13330 | } | 13368 | } |
| 13331 | } | 13369 | } |
| 13332 | 13370 | ||
| 13371 | #define alc861vd_auto_init_input_src alc882_auto_init_input_src | ||
| 13372 | |||
| 13333 | #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) | 13373 | #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) |
| 13334 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) | 13374 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) |
| 13335 | 13375 | ||
| @@ -13512,6 +13552,7 @@ static void alc861vd_auto_init(struct hda_codec *codec) | |||
| 13512 | alc861vd_auto_init_multi_out(codec); | 13552 | alc861vd_auto_init_multi_out(codec); |
| 13513 | alc861vd_auto_init_hp_out(codec); | 13553 | alc861vd_auto_init_hp_out(codec); |
| 13514 | alc861vd_auto_init_analog_input(codec); | 13554 | alc861vd_auto_init_analog_input(codec); |
| 13555 | alc861vd_auto_init_input_src(codec); | ||
| 13515 | if (spec->unsol_event) | 13556 | if (spec->unsol_event) |
| 13516 | alc_sku_automute(codec); | 13557 | alc_sku_automute(codec); |
| 13517 | } | 13558 | } |
| @@ -14025,6 +14066,13 @@ static struct hda_verb alc662_auto_init_verbs[] = { | |||
| 14025 | { } | 14066 | { } |
| 14026 | }; | 14067 | }; |
| 14027 | 14068 | ||
| 14069 | /* additional verbs for ALC663 */ | ||
| 14070 | static struct hda_verb alc663_auto_init_verbs[] = { | ||
| 14071 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 14072 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 14073 | { } | ||
| 14074 | }; | ||
| 14075 | |||
| 14028 | static struct hda_verb alc663_m51va_init_verbs[] = { | 14076 | static struct hda_verb alc663_m51va_init_verbs[] = { |
| 14029 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 14077 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| 14030 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 14078 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| @@ -14553,6 +14601,14 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, | |||
| 14553 | if (!pin) | 14601 | if (!pin) |
| 14554 | return 0; | 14602 | return 0; |
| 14555 | 14603 | ||
| 14604 | if (pin == 0x17) { | ||
| 14605 | /* ALC663 has a mono output pin on 0x17 */ | ||
| 14606 | sprintf(name, "%s Playback Switch", pfx); | ||
| 14607 | err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, | ||
| 14608 | HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT)); | ||
| 14609 | return err; | ||
| 14610 | } | ||
| 14611 | |||
| 14556 | if (alc880_is_fixed_pin(pin)) { | 14612 | if (alc880_is_fixed_pin(pin)) { |
| 14557 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); | 14613 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); |
| 14558 | /* printk("DAC nid=%x\n",nid); */ | 14614 | /* printk("DAC nid=%x\n",nid); */ |
| @@ -14677,6 +14733,8 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec) | |||
| 14677 | } | 14733 | } |
| 14678 | } | 14734 | } |
| 14679 | 14735 | ||
| 14736 | #define alc662_auto_init_input_src alc882_auto_init_input_src | ||
| 14737 | |||
| 14680 | static int alc662_parse_auto_config(struct hda_codec *codec) | 14738 | static int alc662_parse_auto_config(struct hda_codec *codec) |
| 14681 | { | 14739 | { |
| 14682 | struct alc_spec *spec = codec->spec; | 14740 | struct alc_spec *spec = codec->spec; |
| @@ -14721,6 +14779,14 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 14721 | spec->input_mux = &spec->private_imux; | 14779 | spec->input_mux = &spec->private_imux; |
| 14722 | 14780 | ||
| 14723 | spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; | 14781 | spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; |
| 14782 | if (codec->vendor_id == 0x10ec0663) | ||
| 14783 | spec->init_verbs[spec->num_init_verbs++] = | ||
| 14784 | alc663_auto_init_verbs; | ||
| 14785 | |||
| 14786 | err = alc_auto_add_mic_boost(codec); | ||
| 14787 | if (err < 0) | ||
| 14788 | return err; | ||
| 14789 | |||
| 14724 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; | 14790 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; |
| 14725 | spec->num_mixers++; | 14791 | spec->num_mixers++; |
| 14726 | return 1; | 14792 | return 1; |
| @@ -14733,6 +14799,7 @@ static void alc662_auto_init(struct hda_codec *codec) | |||
| 14733 | alc662_auto_init_multi_out(codec); | 14799 | alc662_auto_init_multi_out(codec); |
| 14734 | alc662_auto_init_hp_out(codec); | 14800 | alc662_auto_init_hp_out(codec); |
| 14735 | alc662_auto_init_analog_input(codec); | 14801 | alc662_auto_init_analog_input(codec); |
| 14802 | alc662_auto_init_input_src(codec); | ||
| 14736 | if (spec->unsol_event) | 14803 | if (spec->unsol_event) |
| 14737 | alc_sku_automute(codec); | 14804 | alc_sku_automute(codec); |
| 14738 | } | 14805 | } |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7fdafcb0015d..ad994fcab725 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -560,8 +560,9 @@ static struct hda_verb dell_eq_core_init[] = { | |||
| 560 | }; | 560 | }; |
| 561 | 561 | ||
| 562 | static struct hda_verb dell_m6_core_init[] = { | 562 | static struct hda_verb dell_m6_core_init[] = { |
| 563 | /* set master volume and direct control */ | 563 | /* set master volume to max value without distortion |
| 564 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 564 | * and direct control */ |
| 565 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, | ||
| 565 | /* setup audio connections */ | 566 | /* setup audio connections */ |
| 566 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, | 567 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 567 | { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, | 568 | { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, |
diff --git a/sound/pci/oxygen/hifier.c b/sound/pci/oxygen/hifier.c index 7442460583dd..dad393ae040a 100644 --- a/sound/pci/oxygen/hifier.c +++ b/sound/pci/oxygen/hifier.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <linux/delay.h> | ||
| 20 | #include <linux/pci.h> | 21 | #include <linux/pci.h> |
| 21 | #include <sound/control.h> | 22 | #include <sound/control.h> |
| 22 | #include <sound/core.h> | 23 | #include <sound/core.h> |
| @@ -107,6 +108,9 @@ static void set_ak4396_params(struct oxygen *chip, | |||
| 107 | else | 108 | else |
| 108 | value |= AK4396_DFS_QUAD; | 109 | value |= AK4396_DFS_QUAD; |
| 109 | data->ak4396_ctl2 = value; | 110 | data->ak4396_ctl2 = value; |
| 111 | |||
| 112 | msleep(1); /* wait for the new MCLK to become stable */ | ||
| 113 | |||
| 110 | ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB); | 114 | ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB); |
| 111 | ak4396_write(chip, AK4396_CONTROL_2, value); | 115 | ak4396_write(chip, AK4396_CONTROL_2, value); |
| 112 | ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); | 116 | ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); |
diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index 7c8ae31eb468..c5829d30ef86 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | * GPIO 1 -> DFS1 of AK5385 | 28 | * GPIO 1 -> DFS1 of AK5385 |
| 29 | */ | 29 | */ |
| 30 | 30 | ||
| 31 | #include <linux/delay.h> | ||
| 31 | #include <linux/mutex.h> | 32 | #include <linux/mutex.h> |
| 32 | #include <linux/pci.h> | 33 | #include <linux/pci.h> |
| 33 | #include <sound/ac97_codec.h> | 34 | #include <sound/ac97_codec.h> |
| @@ -213,6 +214,9 @@ static void set_ak4396_params(struct oxygen *chip, | |||
| 213 | else | 214 | else |
| 214 | value |= AK4396_DFS_QUAD; | 215 | value |= AK4396_DFS_QUAD; |
| 215 | data->ak4396_ctl2 = value; | 216 | data->ak4396_ctl2 = value; |
| 217 | |||
| 218 | msleep(1); /* wait for the new MCLK to become stable */ | ||
| 219 | |||
| 216 | for (i = 0; i < 4; ++i) { | 220 | for (i = 0; i < 4; ++i) { |
| 217 | ak4396_write(chip, i, | 221 | ak4396_write(chip, i, |
| 218 | AK4396_CONTROL_1, AK4396_DIF_24_MSB); | 222 | AK4396_CONTROL_1, AK4396_DIF_24_MSB); |
diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 6facac5aed90..05eb8994c141 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c | |||
| @@ -512,9 +512,12 @@ static int ac97_switch_get(struct snd_kcontrol *ctl, | |||
| 512 | 512 | ||
| 513 | static void mute_ac97_ctl(struct oxygen *chip, unsigned int control) | 513 | static void mute_ac97_ctl(struct oxygen *chip, unsigned int control) |
| 514 | { | 514 | { |
| 515 | unsigned int priv_idx = chip->controls[control]->private_value & 0xff; | 515 | unsigned int priv_idx; |
| 516 | u16 value; | 516 | u16 value; |
| 517 | 517 | ||
| 518 | if (!chip->controls[control]) | ||
| 519 | return; | ||
| 520 | priv_idx = chip->controls[control]->private_value & 0xff; | ||
| 518 | value = oxygen_read_ac97(chip, 0, priv_idx); | 521 | value = oxygen_read_ac97(chip, 0, priv_idx); |
| 519 | if (!(value & 0x8000)) { | 522 | if (!(value & 0x8000)) { |
| 520 | oxygen_write_ac97(chip, 0, priv_idx, value | 0x8000); | 523 | oxygen_write_ac97(chip, 0, priv_idx, value | 0x8000); |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 9a2c16bf94e0..01d7b75f9182 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
| @@ -36,15 +36,15 @@ | |||
| 36 | */ | 36 | */ |
| 37 | 37 | ||
| 38 | /* | 38 | /* |
| 39 | * Xonar DX | 39 | * Xonar D1/DX |
| 40 | * -------- | 40 | * ----------- |
| 41 | * | 41 | * |
| 42 | * CMI8788: | 42 | * CMI8788: |
| 43 | * | 43 | * |
| 44 | * I²C <-> CS4398 (front) | 44 | * I²C <-> CS4398 (front) |
| 45 | * <-> CS4362A (surround, center/LFE, back) | 45 | * <-> CS4362A (surround, center/LFE, back) |
| 46 | * | 46 | * |
| 47 | * GPI 0 <- external power present | 47 | * GPI 0 <- external power present (DX only) |
| 48 | * | 48 | * |
| 49 | * GPIO 0 -> enable output to speakers | 49 | * GPIO 0 -> enable output to speakers |
| 50 | * GPIO 1 -> enable front panel I/O | 50 | * GPIO 1 -> enable front panel I/O |
| @@ -96,6 +96,7 @@ MODULE_PARM_DESC(enable, "enable card"); | |||
| 96 | enum { | 96 | enum { |
| 97 | MODEL_D2, | 97 | MODEL_D2, |
| 98 | MODEL_D2X, | 98 | MODEL_D2X, |
| 99 | MODEL_D1, | ||
| 99 | MODEL_DX, | 100 | MODEL_DX, |
| 100 | }; | 101 | }; |
| 101 | 102 | ||
| @@ -103,6 +104,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = { | |||
| 103 | { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, | 104 | { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, |
| 104 | { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, | 105 | { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, |
| 105 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, | 106 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, |
| 107 | { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, | ||
| 106 | { } | 108 | { } |
| 107 | }; | 109 | }; |
| 108 | MODULE_DEVICE_TABLE(pci, xonar_ids); | 110 | MODULE_DEVICE_TABLE(pci, xonar_ids); |
| @@ -313,15 +315,12 @@ static void cs43xx_init(struct oxygen *chip) | |||
| 313 | cs4362a_write(chip, 0x01, CS4362A_CPEN); | 315 | cs4362a_write(chip, 0x01, CS4362A_CPEN); |
| 314 | } | 316 | } |
| 315 | 317 | ||
| 316 | static void xonar_dx_init(struct oxygen *chip) | 318 | static void xonar_d1_init(struct oxygen *chip) |
| 317 | { | 319 | { |
| 318 | struct xonar_data *data = chip->model_data; | 320 | struct xonar_data *data = chip->model_data; |
| 319 | 321 | ||
| 320 | data->anti_pop_delay = 800; | 322 | data->anti_pop_delay = 800; |
| 321 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; | 323 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; |
| 322 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
| 323 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
| 324 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
| 325 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; | 324 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; |
| 326 | data->cs4362a_fm = CS4362A_FM_SINGLE | | 325 | data->cs4362a_fm = CS4362A_FM_SINGLE | |
| 327 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; | 326 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; |
| @@ -345,6 +344,16 @@ static void xonar_dx_init(struct oxygen *chip) | |||
| 345 | snd_component_add(chip->card, "CS5361"); | 344 | snd_component_add(chip->card, "CS5361"); |
| 346 | } | 345 | } |
| 347 | 346 | ||
| 347 | static void xonar_dx_init(struct oxygen *chip) | ||
| 348 | { | ||
| 349 | struct xonar_data *data = chip->model_data; | ||
| 350 | |||
| 351 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
| 352 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
| 353 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
| 354 | xonar_d1_init(chip); | ||
| 355 | } | ||
| 356 | |||
| 348 | static void xonar_cleanup(struct oxygen *chip) | 357 | static void xonar_cleanup(struct oxygen *chip) |
| 349 | { | 358 | { |
| 350 | struct xonar_data *data = chip->model_data; | 359 | struct xonar_data *data = chip->model_data; |
| @@ -352,7 +361,7 @@ static void xonar_cleanup(struct oxygen *chip) | |||
| 352 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); | 361 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); |
| 353 | } | 362 | } |
| 354 | 363 | ||
| 355 | static void xonar_dx_cleanup(struct oxygen *chip) | 364 | static void xonar_d1_cleanup(struct oxygen *chip) |
| 356 | { | 365 | { |
| 357 | xonar_cleanup(chip); | 366 | xonar_cleanup(chip); |
| 358 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); | 367 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); |
| @@ -365,7 +374,7 @@ static void xonar_d2_resume(struct oxygen *chip) | |||
| 365 | xonar_enable_output(chip); | 374 | xonar_enable_output(chip); |
| 366 | } | 375 | } |
| 367 | 376 | ||
| 368 | static void xonar_dx_resume(struct oxygen *chip) | 377 | static void xonar_d1_resume(struct oxygen *chip) |
| 369 | { | 378 | { |
| 370 | cs43xx_init(chip); | 379 | cs43xx_init(chip); |
| 371 | xonar_enable_output(chip); | 380 | xonar_enable_output(chip); |
| @@ -513,7 +522,7 @@ static const struct snd_kcontrol_new front_panel_switch = { | |||
| 513 | .put = front_panel_put, | 522 | .put = front_panel_put, |
| 514 | }; | 523 | }; |
| 515 | 524 | ||
| 516 | static void xonar_dx_ac97_switch(struct oxygen *chip, | 525 | static void xonar_d1_ac97_switch(struct oxygen *chip, |
| 517 | unsigned int reg, unsigned int mute) | 526 | unsigned int reg, unsigned int mute) |
| 518 | { | 527 | { |
| 519 | if (reg == AC97_LINE) { | 528 | if (reg == AC97_LINE) { |
| @@ -536,7 +545,7 @@ static int xonar_d2_control_filter(struct snd_kcontrol_new *template) | |||
| 536 | return 0; | 545 | return 0; |
| 537 | } | 546 | } |
| 538 | 547 | ||
| 539 | static int xonar_dx_control_filter(struct snd_kcontrol_new *template) | 548 | static int xonar_d1_control_filter(struct snd_kcontrol_new *template) |
| 540 | { | 549 | { |
| 541 | if (!strncmp(template->name, "CD Capture ", 11)) | 550 | if (!strncmp(template->name, "CD Capture ", 11)) |
| 542 | return 1; /* no CD input */ | 551 | return 1; /* no CD input */ |
| @@ -548,7 +557,7 @@ static int xonar_mixer_init(struct oxygen *chip) | |||
| 548 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); | 557 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); |
| 549 | } | 558 | } |
| 550 | 559 | ||
| 551 | static int xonar_dx_mixer_init(struct oxygen *chip) | 560 | static int xonar_d1_mixer_init(struct oxygen *chip) |
| 552 | { | 561 | { |
| 553 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); | 562 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); |
| 554 | } | 563 | } |
| @@ -615,23 +624,51 @@ static const struct oxygen_model xonar_models[] = { | |||
| 615 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 624 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
| 616 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 625 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
| 617 | }, | 626 | }, |
| 627 | [MODEL_D1] = { | ||
| 628 | .shortname = "Xonar D1", | ||
| 629 | .longname = "Asus Virtuoso 100", | ||
| 630 | .chip = "AV200", | ||
| 631 | .owner = THIS_MODULE, | ||
| 632 | .init = xonar_d1_init, | ||
| 633 | .control_filter = xonar_d1_control_filter, | ||
| 634 | .mixer_init = xonar_d1_mixer_init, | ||
| 635 | .cleanup = xonar_d1_cleanup, | ||
| 636 | .suspend = xonar_d1_cleanup, | ||
| 637 | .resume = xonar_d1_resume, | ||
| 638 | .set_dac_params = set_cs43xx_params, | ||
| 639 | .set_adc_params = set_cs53x1_params, | ||
| 640 | .update_dac_volume = update_cs43xx_volume, | ||
| 641 | .update_dac_mute = update_cs43xx_mute, | ||
| 642 | .ac97_switch = xonar_d1_ac97_switch, | ||
| 643 | .dac_tlv = cs4362a_db_scale, | ||
| 644 | .model_data_size = sizeof(struct xonar_data), | ||
| 645 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | | ||
| 646 | PLAYBACK_1_TO_SPDIF | | ||
| 647 | CAPTURE_0_FROM_I2S_2, | ||
| 648 | .dac_channels = 8, | ||
| 649 | .dac_volume_min = 0, | ||
| 650 | .dac_volume_max = 127, | ||
| 651 | .function_flags = OXYGEN_FUNCTION_2WIRE, | ||
| 652 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
| 653 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
| 654 | }, | ||
| 618 | [MODEL_DX] = { | 655 | [MODEL_DX] = { |
| 619 | .shortname = "Xonar DX", | 656 | .shortname = "Xonar DX", |
| 620 | .longname = "Asus Virtuoso 100", | 657 | .longname = "Asus Virtuoso 100", |
| 621 | .chip = "AV200", | 658 | .chip = "AV200", |
| 622 | .owner = THIS_MODULE, | 659 | .owner = THIS_MODULE, |
| 623 | .init = xonar_dx_init, | 660 | .init = xonar_dx_init, |
| 624 | .control_filter = xonar_dx_control_filter, | 661 | .control_filter = xonar_d1_control_filter, |
| 625 | .mixer_init = xonar_dx_mixer_init, | 662 | .mixer_init = xonar_d1_mixer_init, |
| 626 | .cleanup = xonar_dx_cleanup, | 663 | .cleanup = xonar_d1_cleanup, |
| 627 | .suspend = xonar_dx_cleanup, | 664 | .suspend = xonar_d1_cleanup, |
| 628 | .resume = xonar_dx_resume, | 665 | .resume = xonar_d1_resume, |
| 629 | .set_dac_params = set_cs43xx_params, | 666 | .set_dac_params = set_cs43xx_params, |
| 630 | .set_adc_params = set_cs53x1_params, | 667 | .set_adc_params = set_cs53x1_params, |
| 631 | .update_dac_volume = update_cs43xx_volume, | 668 | .update_dac_volume = update_cs43xx_volume, |
| 632 | .update_dac_mute = update_cs43xx_mute, | 669 | .update_dac_mute = update_cs43xx_mute, |
| 633 | .gpio_changed = xonar_gpio_changed, | 670 | .gpio_changed = xonar_gpio_changed, |
| 634 | .ac97_switch = xonar_dx_ac97_switch, | 671 | .ac97_switch = xonar_d1_ac97_switch, |
| 635 | .dac_tlv = cs4362a_db_scale, | 672 | .dac_tlv = cs4362a_db_scale, |
| 636 | .model_data_size = sizeof(struct xonar_data), | 673 | .model_data_size = sizeof(struct xonar_data), |
| 637 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | | 674 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | |
