diff options
| -rw-r--r-- | include/sound/emu10k1.h | 1 | ||||
| -rw-r--r-- | sound/core/pcm_native.c | 4 | ||||
| -rw-r--r-- | sound/pci/emu10k1/emu10k1.c | 4 | ||||
| -rw-r--r-- | sound/pci/emu10k1/emupcm.c | 30 | ||||
| -rw-r--r-- | sound/pci/emu10k1/memory.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 1 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 176 | ||||
| -rw-r--r-- | sound/pci/riptide/riptide.c | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8776.c | 7 |
9 files changed, 188 insertions, 50 deletions
diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h index 6a664c3f7c1e..7dc97d12253c 100644 --- a/include/sound/emu10k1.h +++ b/include/sound/emu10k1.h | |||
| @@ -1707,6 +1707,7 @@ struct snd_emu10k1 { | |||
| 1707 | unsigned int card_type; /* EMU10K1_CARD_* */ | 1707 | unsigned int card_type; /* EMU10K1_CARD_* */ |
| 1708 | unsigned int ecard_ctrl; /* ecard control bits */ | 1708 | unsigned int ecard_ctrl; /* ecard control bits */ |
| 1709 | unsigned long dma_mask; /* PCI DMA mask */ | 1709 | unsigned long dma_mask; /* PCI DMA mask */ |
| 1710 | unsigned int delay_pcm_irq; /* in samples */ | ||
| 1710 | int max_cache_pages; /* max memory size / PAGE_SIZE */ | 1711 | int max_cache_pages; /* max memory size / PAGE_SIZE */ |
| 1711 | struct snd_dma_buffer silent_page; /* silent page */ | 1712 | struct snd_dma_buffer silent_page; /* silent page */ |
| 1712 | struct snd_dma_buffer ptb_pages; /* page table pages */ | 1713 | struct snd_dma_buffer ptb_pages; /* page table pages */ |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index a3b2a6479246..134fc6c2e08d 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
| @@ -978,6 +978,10 @@ static int snd_pcm_do_pause(struct snd_pcm_substream *substream, int push) | |||
| 978 | { | 978 | { |
| 979 | if (substream->runtime->trigger_master != substream) | 979 | if (substream->runtime->trigger_master != substream) |
| 980 | return 0; | 980 | return 0; |
| 981 | /* some drivers might use hw_ptr to recover from the pause - | ||
| 982 | update the hw_ptr now */ | ||
| 983 | if (push) | ||
| 984 | snd_pcm_update_hw_ptr(substream); | ||
| 981 | /* The jiffies check in snd_pcm_update_hw_ptr*() is done by | 985 | /* The jiffies check in snd_pcm_update_hw_ptr*() is done by |
| 982 | * a delta betwen the current jiffies, this gives a large enough | 986 | * a delta betwen the current jiffies, this gives a large enough |
| 983 | * delta, effectively to skip the check once. | 987 | * delta, effectively to skip the check once. |
diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 4203782d7cb7..aff8387c45cf 100644 --- a/sound/pci/emu10k1/emu10k1.c +++ b/sound/pci/emu10k1/emu10k1.c | |||
| @@ -52,6 +52,7 @@ static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64}; | |||
| 52 | static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128}; | 52 | static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128}; |
| 53 | static int enable_ir[SNDRV_CARDS]; | 53 | static int enable_ir[SNDRV_CARDS]; |
| 54 | static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */ | 54 | static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */ |
| 55 | static uint delay_pcm_irq[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; | ||
| 55 | 56 | ||
| 56 | module_param_array(index, int, NULL, 0444); | 57 | module_param_array(index, int, NULL, 0444); |
| 57 | MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard."); | 58 | MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard."); |
| @@ -73,6 +74,8 @@ module_param_array(enable_ir, bool, NULL, 0444); | |||
| 73 | MODULE_PARM_DESC(enable_ir, "Enable IR."); | 74 | MODULE_PARM_DESC(enable_ir, "Enable IR."); |
| 74 | module_param_array(subsystem, uint, NULL, 0444); | 75 | module_param_array(subsystem, uint, NULL, 0444); |
| 75 | MODULE_PARM_DESC(subsystem, "Force card subsystem model."); | 76 | MODULE_PARM_DESC(subsystem, "Force card subsystem model."); |
| 77 | module_param_array(delay_pcm_irq, uint, NULL, 0444); | ||
| 78 | MODULE_PARM_DESC(delay_pcm_irq, "Delay PCM interrupt by specified number of samples (default 0)."); | ||
| 76 | /* | 79 | /* |
| 77 | * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400 | 80 | * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400 |
| 78 | */ | 81 | */ |
| @@ -127,6 +130,7 @@ static int __devinit snd_card_emu10k1_probe(struct pci_dev *pci, | |||
| 127 | &emu)) < 0) | 130 | &emu)) < 0) |
| 128 | goto error; | 131 | goto error; |
| 129 | card->private_data = emu; | 132 | card->private_data = emu; |
| 133 | emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f; | ||
| 130 | if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0) | 134 | if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0) |
| 131 | goto error; | 135 | goto error; |
| 132 | if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0) | 136 | if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0) |
diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c index 55b83ef73c63..622bace148e3 100644 --- a/sound/pci/emu10k1/emupcm.c +++ b/sound/pci/emu10k1/emupcm.c | |||
| @@ -332,7 +332,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, | |||
| 332 | evoice->epcm->ccca_start_addr = start_addr + ccis; | 332 | evoice->epcm->ccca_start_addr = start_addr + ccis; |
| 333 | if (extra) { | 333 | if (extra) { |
| 334 | start_addr += ccis; | 334 | start_addr += ccis; |
| 335 | end_addr += ccis; | 335 | end_addr += ccis + emu->delay_pcm_irq; |
| 336 | } | 336 | } |
| 337 | if (stereo && !extra) { | 337 | if (stereo && !extra) { |
| 338 | snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK); | 338 | snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK); |
| @@ -360,7 +360,9 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, | |||
| 360 | /* Assumption that PT is already 0 so no harm overwriting */ | 360 | /* Assumption that PT is already 0 so no harm overwriting */ |
| 361 | snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]); | 361 | snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]); |
| 362 | snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24)); | 362 | snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24)); |
| 363 | snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24)); | 363 | snd_emu10k1_ptr_write(emu, PSST, voice, |
| 364 | (start_addr + (extra ? emu->delay_pcm_irq : 0)) | | ||
| 365 | (send_amount[2] << 24)); | ||
| 364 | if (emu->card_capabilities->emu_model) | 366 | if (emu->card_capabilities->emu_model) |
| 365 | pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */ | 367 | pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */ |
| 366 | else | 368 | else |
| @@ -732,6 +734,23 @@ static void snd_emu10k1_playback_stop_voice(struct snd_emu10k1 *emu, struct snd_ | |||
| 732 | snd_emu10k1_ptr_write(emu, IP, voice, 0); | 734 | snd_emu10k1_ptr_write(emu, IP, voice, 0); |
| 733 | } | 735 | } |
| 734 | 736 | ||
| 737 | static inline void snd_emu10k1_playback_mangle_extra(struct snd_emu10k1 *emu, | ||
| 738 | struct snd_emu10k1_pcm *epcm, | ||
| 739 | struct snd_pcm_substream *substream, | ||
| 740 | struct snd_pcm_runtime *runtime) | ||
| 741 | { | ||
| 742 | unsigned int ptr, period_pos; | ||
| 743 | |||
| 744 | /* try to sychronize the current position for the interrupt | ||
| 745 | source voice */ | ||
| 746 | period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt; | ||
| 747 | period_pos %= runtime->period_size; | ||
| 748 | ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->extra->number); | ||
| 749 | ptr &= ~0x00ffffff; | ||
| 750 | ptr |= epcm->ccca_start_addr + period_pos; | ||
| 751 | snd_emu10k1_ptr_write(emu, CCCA, epcm->extra->number, ptr); | ||
| 752 | } | ||
| 753 | |||
| 735 | static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream, | 754 | static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream, |
| 736 | int cmd) | 755 | int cmd) |
| 737 | { | 756 | { |
| @@ -753,6 +772,8 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream, | |||
| 753 | /* follow thru */ | 772 | /* follow thru */ |
| 754 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 773 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
| 755 | case SNDRV_PCM_TRIGGER_RESUME: | 774 | case SNDRV_PCM_TRIGGER_RESUME: |
| 775 | if (cmd == SNDRV_PCM_TRIGGER_PAUSE_RELEASE) | ||
| 776 | snd_emu10k1_playback_mangle_extra(emu, epcm, substream, runtime); | ||
| 756 | mix = &emu->pcm_mixer[substream->number]; | 777 | mix = &emu->pcm_mixer[substream->number]; |
| 757 | snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix); | 778 | snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix); |
| 758 | snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix); | 779 | snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix); |
| @@ -869,8 +890,9 @@ static snd_pcm_uframes_t snd_emu10k1_playback_pointer(struct snd_pcm_substream * | |||
| 869 | #endif | 890 | #endif |
| 870 | /* | 891 | /* |
| 871 | printk(KERN_DEBUG | 892 | printk(KERN_DEBUG |
| 872 | "ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", | 893 | "ptr = 0x%lx, buffer_size = 0x%lx, period_size = 0x%lx\n", |
| 873 | ptr, runtime->buffer_size, runtime->period_size); | 894 | (long)ptr, (long)runtime->buffer_size, |
| 895 | (long)runtime->period_size); | ||
| 874 | */ | 896 | */ |
| 875 | return ptr; | 897 | return ptr; |
| 876 | } | 898 | } |
diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c index ffb1ddb8dc28..957a311514c8 100644 --- a/sound/pci/emu10k1/memory.c +++ b/sound/pci/emu10k1/memory.c | |||
| @@ -310,8 +310,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst | |||
| 310 | if (snd_BUG_ON(!hdr)) | 310 | if (snd_BUG_ON(!hdr)) |
| 311 | return NULL; | 311 | return NULL; |
| 312 | 312 | ||
| 313 | idx = runtime->period_size >= runtime->buffer_size ? | ||
| 314 | (emu->delay_pcm_irq * 2) : 0; | ||
| 313 | mutex_lock(&hdr->block_mutex); | 315 | mutex_lock(&hdr->block_mutex); |
| 314 | blk = search_empty(emu, runtime->dma_bytes); | 316 | blk = search_empty(emu, runtime->dma_bytes + idx); |
| 315 | if (blk == NULL) { | 317 | if (blk == NULL) { |
| 316 | mutex_unlock(&hdr->block_mutex); | 318 | mutex_unlock(&hdr->block_mutex); |
| 317 | return NULL; | 319 | return NULL; |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 31b5d9eeba68..c424952a734e 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -3049,6 +3049,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3049 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", | 3049 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", |
| 3050 | CXT5066_DELL_LAPTOP), | 3050 | CXT5066_DELL_LAPTOP), |
| 3051 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3051 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
| 3052 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), | ||
| 3052 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), | 3053 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
| 3053 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 3054 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
| 3054 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3055 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 2cd1ae809e46..a4dd04524e43 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -19030,6 +19030,7 @@ static int patch_alc888(struct hda_codec *codec) | |||
| 19030 | /* | 19030 | /* |
| 19031 | * ALC680 support | 19031 | * ALC680 support |
| 19032 | */ | 19032 | */ |
| 19033 | #define ALC680_DIGIN_NID ALC880_DIGIN_NID | ||
| 19033 | #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID | 19034 | #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID |
| 19034 | #define alc680_modes alc260_modes | 19035 | #define alc680_modes alc260_modes |
| 19035 | 19036 | ||
| @@ -19044,23 +19045,93 @@ static hda_nid_t alc680_adc_nids[3] = { | |||
| 19044 | 0x07, 0x08, 0x09 | 19045 | 0x07, 0x08, 0x09 |
| 19045 | }; | 19046 | }; |
| 19046 | 19047 | ||
| 19048 | /* | ||
| 19049 | * Analog capture ADC cgange | ||
| 19050 | */ | ||
| 19051 | static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo, | ||
| 19052 | struct hda_codec *codec, | ||
| 19053 | unsigned int stream_tag, | ||
| 19054 | unsigned int format, | ||
| 19055 | struct snd_pcm_substream *substream) | ||
| 19056 | { | ||
| 19057 | struct alc_spec *spec = codec->spec; | ||
| 19058 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 19059 | unsigned int pre_mic, pre_line; | ||
| 19060 | |||
| 19061 | pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); | ||
| 19062 | pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]); | ||
| 19063 | |||
| 19064 | spec->cur_adc_stream_tag = stream_tag; | ||
| 19065 | spec->cur_adc_format = format; | ||
| 19066 | |||
| 19067 | if (pre_mic || pre_line) { | ||
| 19068 | if (pre_mic) | ||
| 19069 | snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0, | ||
| 19070 | format); | ||
| 19071 | else | ||
| 19072 | snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0, | ||
| 19073 | format); | ||
| 19074 | } else | ||
| 19075 | snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format); | ||
| 19076 | return 0; | ||
| 19077 | } | ||
| 19078 | |||
| 19079 | static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 19080 | struct hda_codec *codec, | ||
| 19081 | struct snd_pcm_substream *substream) | ||
| 19082 | { | ||
| 19083 | snd_hda_codec_cleanup_stream(codec, 0x07); | ||
| 19084 | snd_hda_codec_cleanup_stream(codec, 0x08); | ||
| 19085 | snd_hda_codec_cleanup_stream(codec, 0x09); | ||
| 19086 | return 0; | ||
| 19087 | } | ||
| 19088 | |||
| 19089 | static struct hda_pcm_stream alc680_pcm_analog_auto_capture = { | ||
| 19090 | .substreams = 1, /* can be overridden */ | ||
| 19091 | .channels_min = 2, | ||
| 19092 | .channels_max = 2, | ||
| 19093 | /* NID is set in alc_build_pcms */ | ||
| 19094 | .ops = { | ||
| 19095 | .prepare = alc680_capture_pcm_prepare, | ||
| 19096 | .cleanup = alc680_capture_pcm_cleanup | ||
| 19097 | }, | ||
| 19098 | }; | ||
| 19099 | |||
| 19047 | static struct snd_kcontrol_new alc680_base_mixer[] = { | 19100 | static struct snd_kcontrol_new alc680_base_mixer[] = { |
| 19048 | /* output mixer control */ | 19101 | /* output mixer control */ |
| 19049 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), | 19102 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), |
| 19050 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 19103 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
| 19051 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), | 19104 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), |
| 19052 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), | 19105 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), |
| 19106 | HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT), | ||
| 19053 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 19107 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
| 19108 | HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT), | ||
| 19054 | { } | 19109 | { } |
| 19055 | }; | 19110 | }; |
| 19056 | 19111 | ||
| 19057 | static struct snd_kcontrol_new alc680_capture_mixer[] = { | 19112 | static struct hda_bind_ctls alc680_bind_cap_vol = { |
| 19058 | HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), | 19113 | .ops = &snd_hda_bind_vol, |
| 19059 | HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), | 19114 | .values = { |
| 19060 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), | 19115 | HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), |
| 19061 | HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), | 19116 | HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), |
| 19062 | HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT), | 19117 | HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), |
| 19063 | HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT), | 19118 | 0 |
| 19119 | }, | ||
| 19120 | }; | ||
| 19121 | |||
| 19122 | static struct hda_bind_ctls alc680_bind_cap_switch = { | ||
| 19123 | .ops = &snd_hda_bind_sw, | ||
| 19124 | .values = { | ||
| 19125 | HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), | ||
| 19126 | HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), | ||
| 19127 | HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), | ||
| 19128 | 0 | ||
| 19129 | }, | ||
| 19130 | }; | ||
| 19131 | |||
| 19132 | static struct snd_kcontrol_new alc680_master_capture_mixer[] = { | ||
| 19133 | HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol), | ||
| 19134 | HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch), | ||
| 19064 | { } /* end */ | 19135 | { } /* end */ |
| 19065 | }; | 19136 | }; |
| 19066 | 19137 | ||
| @@ -19068,25 +19139,73 @@ static struct snd_kcontrol_new alc680_capture_mixer[] = { | |||
| 19068 | * generic initialization of ADC, input mixers and output mixers | 19139 | * generic initialization of ADC, input mixers and output mixers |
| 19069 | */ | 19140 | */ |
| 19070 | static struct hda_verb alc680_init_verbs[] = { | 19141 | static struct hda_verb alc680_init_verbs[] = { |
| 19071 | /* Unmute DAC0-1 and set vol = 0 */ | 19142 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19072 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 19143 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19073 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 19144 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19074 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 19075 | 19145 | ||
| 19076 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, | 19146 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
| 19077 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, | 19147 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 19078 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, | 19148 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 19079 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, | 19149 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| 19080 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 19150 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
| 19151 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 19081 | 19152 | ||
| 19082 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19153 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19083 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19154 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19084 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19155 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19085 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19156 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19086 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19157 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19158 | |||
| 19159 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
| 19160 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, | ||
| 19161 | |||
| 19087 | { } | 19162 | { } |
| 19088 | }; | 19163 | }; |
| 19089 | 19164 | ||
| 19165 | /* toggle speaker-output according to the hp-jack state */ | ||
| 19166 | static void alc680_base_setup(struct hda_codec *codec) | ||
| 19167 | { | ||
| 19168 | struct alc_spec *spec = codec->spec; | ||
| 19169 | |||
| 19170 | spec->autocfg.hp_pins[0] = 0x16; | ||
| 19171 | spec->autocfg.speaker_pins[0] = 0x14; | ||
| 19172 | spec->autocfg.speaker_pins[1] = 0x15; | ||
| 19173 | spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18; | ||
| 19174 | spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19; | ||
| 19175 | } | ||
| 19176 | |||
| 19177 | static void alc680_rec_autoswitch(struct hda_codec *codec) | ||
| 19178 | { | ||
| 19179 | struct alc_spec *spec = codec->spec; | ||
| 19180 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 19181 | unsigned int present; | ||
| 19182 | hda_nid_t new_adc; | ||
| 19183 | |||
| 19184 | present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); | ||
| 19185 | |||
| 19186 | new_adc = present ? 0x8 : 0x7; | ||
| 19187 | __snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1); | ||
| 19188 | snd_hda_codec_setup_stream(codec, new_adc, | ||
| 19189 | spec->cur_adc_stream_tag, 0, | ||
| 19190 | spec->cur_adc_format); | ||
| 19191 | |||
| 19192 | } | ||
| 19193 | |||
| 19194 | static void alc680_unsol_event(struct hda_codec *codec, | ||
| 19195 | unsigned int res) | ||
| 19196 | { | ||
| 19197 | if ((res >> 26) == ALC880_HP_EVENT) | ||
| 19198 | alc_automute_amp(codec); | ||
| 19199 | if ((res >> 26) == ALC880_MIC_EVENT) | ||
| 19200 | alc680_rec_autoswitch(codec); | ||
| 19201 | } | ||
| 19202 | |||
| 19203 | static void alc680_inithook(struct hda_codec *codec) | ||
| 19204 | { | ||
| 19205 | alc_automute_amp(codec); | ||
| 19206 | alc680_rec_autoswitch(codec); | ||
| 19207 | } | ||
| 19208 | |||
| 19090 | /* create input playback/capture controls for the given pin */ | 19209 | /* create input playback/capture controls for the given pin */ |
| 19091 | static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, | 19210 | static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, |
| 19092 | const char *ctlname, int idx) | 19211 | const char *ctlname, int idx) |
| @@ -19197,13 +19316,7 @@ static void alc680_auto_init_hp_out(struct hda_codec *codec) | |||
| 19197 | #define alc680_pcm_analog_capture alc880_pcm_analog_capture | 19316 | #define alc680_pcm_analog_capture alc880_pcm_analog_capture |
| 19198 | #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture | 19317 | #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture |
| 19199 | #define alc680_pcm_digital_playback alc880_pcm_digital_playback | 19318 | #define alc680_pcm_digital_playback alc880_pcm_digital_playback |
| 19200 | 19319 | #define alc680_pcm_digital_capture alc880_pcm_digital_capture | |
| 19201 | static struct hda_input_mux alc680_capture_source = { | ||
| 19202 | .num_items = 1, | ||
| 19203 | .items = { | ||
| 19204 | { "Mic", 0x0 }, | ||
| 19205 | }, | ||
| 19206 | }; | ||
| 19207 | 19320 | ||
| 19208 | /* | 19321 | /* |
| 19209 | * BIOS auto configuration | 19322 | * BIOS auto configuration |
| @@ -19218,6 +19331,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec) | |||
| 19218 | alc680_ignore); | 19331 | alc680_ignore); |
| 19219 | if (err < 0) | 19332 | if (err < 0) |
| 19220 | return err; | 19333 | return err; |
| 19334 | |||
| 19221 | if (!spec->autocfg.line_outs) { | 19335 | if (!spec->autocfg.line_outs) { |
| 19222 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { | 19336 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { |
| 19223 | spec->multiout.max_channels = 2; | 19337 | spec->multiout.max_channels = 2; |
| @@ -19239,8 +19353,6 @@ static int alc680_parse_auto_config(struct hda_codec *codec) | |||
| 19239 | add_mixer(spec, spec->kctls.list); | 19353 | add_mixer(spec, spec->kctls.list); |
| 19240 | 19354 | ||
| 19241 | add_verb(spec, alc680_init_verbs); | 19355 | add_verb(spec, alc680_init_verbs); |
| 19242 | spec->num_mux_defs = 1; | ||
| 19243 | spec->input_mux = &alc680_capture_source; | ||
| 19244 | 19356 | ||
| 19245 | err = alc_auto_add_mic_boost(codec); | 19357 | err = alc_auto_add_mic_boost(codec); |
| 19246 | if (err < 0) | 19358 | if (err < 0) |
| @@ -19279,17 +19391,17 @@ static struct snd_pci_quirk alc680_cfg_tbl[] = { | |||
| 19279 | static struct alc_config_preset alc680_presets[] = { | 19391 | static struct alc_config_preset alc680_presets[] = { |
| 19280 | [ALC680_BASE] = { | 19392 | [ALC680_BASE] = { |
| 19281 | .mixers = { alc680_base_mixer }, | 19393 | .mixers = { alc680_base_mixer }, |
| 19282 | .cap_mixer = alc680_capture_mixer, | 19394 | .cap_mixer = alc680_master_capture_mixer, |
| 19283 | .init_verbs = { alc680_init_verbs }, | 19395 | .init_verbs = { alc680_init_verbs }, |
| 19284 | .num_dacs = ARRAY_SIZE(alc680_dac_nids), | 19396 | .num_dacs = ARRAY_SIZE(alc680_dac_nids), |
| 19285 | .dac_nids = alc680_dac_nids, | 19397 | .dac_nids = alc680_dac_nids, |
| 19286 | .num_adc_nids = ARRAY_SIZE(alc680_adc_nids), | ||
| 19287 | .adc_nids = alc680_adc_nids, | ||
| 19288 | .hp_nid = 0x04, | ||
| 19289 | .dig_out_nid = ALC680_DIGOUT_NID, | 19398 | .dig_out_nid = ALC680_DIGOUT_NID, |
| 19290 | .num_channel_mode = ARRAY_SIZE(alc680_modes), | 19399 | .num_channel_mode = ARRAY_SIZE(alc680_modes), |
| 19291 | .channel_mode = alc680_modes, | 19400 | .channel_mode = alc680_modes, |
| 19292 | .input_mux = &alc680_capture_source, | 19401 | .unsol_event = alc680_unsol_event, |
| 19402 | .setup = alc680_base_setup, | ||
| 19403 | .init_hook = alc680_inithook, | ||
| 19404 | |||
| 19293 | }, | 19405 | }, |
| 19294 | }; | 19406 | }; |
| 19295 | 19407 | ||
| @@ -19333,9 +19445,9 @@ static int patch_alc680(struct hda_codec *codec) | |||
| 19333 | setup_preset(codec, &alc680_presets[board_config]); | 19445 | setup_preset(codec, &alc680_presets[board_config]); |
| 19334 | 19446 | ||
| 19335 | spec->stream_analog_playback = &alc680_pcm_analog_playback; | 19447 | spec->stream_analog_playback = &alc680_pcm_analog_playback; |
| 19336 | spec->stream_analog_capture = &alc680_pcm_analog_capture; | 19448 | spec->stream_analog_capture = &alc680_pcm_analog_auto_capture; |
| 19337 | spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture; | ||
| 19338 | spec->stream_digital_playback = &alc680_pcm_digital_playback; | 19449 | spec->stream_digital_playback = &alc680_pcm_digital_playback; |
| 19450 | spec->stream_digital_capture = &alc680_pcm_digital_capture; | ||
| 19339 | 19451 | ||
| 19340 | if (!spec->adc_nids) { | 19452 | if (!spec->adc_nids) { |
| 19341 | spec->adc_nids = alc680_adc_nids; | 19453 | spec->adc_nids = alc680_adc_nids; |
diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index f64fb7d988cb..ad5202efd7a9 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c | |||
| @@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct cmdif *cif, struct snd_riptide *chip) | |||
| 1224 | firmware.firmware.ASIC, firmware.firmware.CODEC, | 1224 | firmware.firmware.ASIC, firmware.firmware.CODEC, |
| 1225 | firmware.firmware.AUXDSP, firmware.firmware.PROG); | 1225 | firmware.firmware.AUXDSP, firmware.firmware.PROG); |
| 1226 | 1226 | ||
| 1227 | if (!chip) | ||
| 1228 | return 1; | ||
| 1229 | |||
| 1227 | for (i = 0; i < FIRMWARE_VERSIONS; i++) { | 1230 | for (i = 0; i < FIRMWARE_VERSIONS; i++) { |
| 1228 | if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware))) | 1231 | if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware))) |
| 1229 | break; | 1232 | return 1; /* OK */ |
| 1230 | } | ||
| 1231 | if (i >= FIRMWARE_VERSIONS) | ||
| 1232 | return 0; /* no match */ | ||
| 1233 | 1233 | ||
| 1234 | if (!chip) | 1234 | } |
| 1235 | return 1; /* OK */ | ||
| 1236 | 1235 | ||
| 1237 | snd_printdd("Writing Firmware\n"); | 1236 | snd_printdd("Writing Firmware\n"); |
| 1238 | if (!chip->fw_entry) { | 1237 | if (!chip->fw_entry) { |
diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index 4e212ed62ea6..f8154e661524 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c | |||
| @@ -178,13 +178,6 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
| 178 | case SND_SOC_DAIFMT_LEFT_J: | 178 | case SND_SOC_DAIFMT_LEFT_J: |
| 179 | iface |= 0x0001; | 179 | iface |= 0x0001; |
| 180 | break; | 180 | break; |
| 181 | /* FIXME: CHECK A/B */ | ||
| 182 | case SND_SOC_DAIFMT_DSP_A: | ||
| 183 | iface |= 0x0003; | ||
| 184 | break; | ||
| 185 | case SND_SOC_DAIFMT_DSP_B: | ||
| 186 | iface |= 0x0007; | ||
| 187 | break; | ||
| 188 | default: | 181 | default: |
| 189 | return -EINVAL; | 182 | return -EINVAL; |
| 190 | } | 183 | } |
