diff options
Diffstat (limited to 'sound/pci')
| -rw-r--r-- | sound/pci/asihpi/hpi6205.c | 7 | ||||
| -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/hda_codec.c | 35 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_eld.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 3 | ||||
| -rw-r--r-- | sound/pci/hda/patch_analog.c | 1 | ||||
| -rw-r--r-- | sound/pci/hda/patch_cirrus.c | 50 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 61 | ||||
| -rw-r--r-- | sound/pci/hda/patch_hdmi.c | 21 | ||||
| -rw-r--r-- | sound/pci/hda/patch_intelhdmi.c | 8 | ||||
| -rw-r--r-- | sound/pci/hda/patch_nvhdmi.c | 10 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 210 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 15 | ||||
| -rw-r--r-- | sound/pci/intel8x0.c | 6 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen.c | 4 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen.h | 1 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen_lib.c | 21 | ||||
| -rw-r--r-- | sound/pci/oxygen/virtuoso.c | 1 | ||||
| -rw-r--r-- | sound/pci/oxygen/xonar_wm87x6.c | 22 | ||||
| -rw-r--r-- | sound/pci/riptide/riptide.c | 11 | ||||
| -rw-r--r-- | sound/pci/rme9652/hdsp.c | 1 | ||||
| -rw-r--r-- | sound/pci/rme9652/hdspm.c | 1 |
25 files changed, 424 insertions, 109 deletions
diff --git a/sound/pci/asihpi/hpi6205.c b/sound/pci/asihpi/hpi6205.c index 3b4413448226..22c5fc625533 100644 --- a/sound/pci/asihpi/hpi6205.c +++ b/sound/pci/asihpi/hpi6205.c | |||
| @@ -941,8 +941,7 @@ static void outstream_host_buffer_free(struct hpi_adapter_obj *pao, | |||
| 941 | 941 | ||
| 942 | } | 942 | } |
| 943 | 943 | ||
| 944 | static u32 outstream_get_space_available(struct hpi_hostbuffer_status | 944 | static u32 outstream_get_space_available(struct hpi_hostbuffer_status *status) |
| 945 | *status) | ||
| 946 | { | 945 | { |
| 947 | return status->size_in_bytes - (status->host_index - | 946 | return status->size_in_bytes - (status->host_index - |
| 948 | status->dSP_index); | 947 | status->dSP_index); |
| @@ -987,6 +986,10 @@ static void outstream_write(struct hpi_adapter_obj *pao, | |||
| 987 | /* write it */ | 986 | /* write it */ |
| 988 | phm->function = HPI_OSTREAM_WRITE; | 987 | phm->function = HPI_OSTREAM_WRITE; |
| 989 | hw_message(pao, phm, phr); | 988 | hw_message(pao, phm, phr); |
| 989 | |||
| 990 | if (phr->error) | ||
| 991 | return; | ||
| 992 | |||
| 990 | /* update status information that the DSP would typically | 993 | /* update status information that the DSP would typically |
| 991 | * update (and will update next time the DSP | 994 | * update (and will update next time the DSP |
| 992 | * buffer update task reads data from the host BBM buffer) | 995 | * buffer update task reads data from the host BBM buffer) |
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/hda_codec.c b/sound/pci/hda/hda_codec.c index dd8fb86c842b..14829210ef0b 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -589,6 +589,7 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card, | |||
| 589 | bus->ops = temp->ops; | 589 | bus->ops = temp->ops; |
| 590 | 590 | ||
| 591 | mutex_init(&bus->cmd_mutex); | 591 | mutex_init(&bus->cmd_mutex); |
| 592 | mutex_init(&bus->prepare_mutex); | ||
| 592 | INIT_LIST_HEAD(&bus->codec_list); | 593 | INIT_LIST_HEAD(&bus->codec_list); |
| 593 | 594 | ||
| 594 | snprintf(bus->workq_name, sizeof(bus->workq_name), | 595 | snprintf(bus->workq_name, sizeof(bus->workq_name), |
| @@ -1068,7 +1069,6 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, | |||
| 1068 | codec->addr = codec_addr; | 1069 | codec->addr = codec_addr; |
| 1069 | mutex_init(&codec->spdif_mutex); | 1070 | mutex_init(&codec->spdif_mutex); |
| 1070 | mutex_init(&codec->control_mutex); | 1071 | mutex_init(&codec->control_mutex); |
| 1071 | mutex_init(&codec->prepare_mutex); | ||
| 1072 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); | 1072 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); |
| 1073 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); | 1073 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); |
| 1074 | snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); | 1074 | snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); |
| @@ -1213,6 +1213,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 1213 | u32 stream_tag, | 1213 | u32 stream_tag, |
| 1214 | int channel_id, int format) | 1214 | int channel_id, int format) |
| 1215 | { | 1215 | { |
| 1216 | struct hda_codec *c; | ||
| 1216 | struct hda_cvt_setup *p; | 1217 | struct hda_cvt_setup *p; |
| 1217 | unsigned int oldval, newval; | 1218 | unsigned int oldval, newval; |
| 1218 | int i; | 1219 | int i; |
| @@ -1253,10 +1254,12 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 1253 | p->dirty = 0; | 1254 | p->dirty = 0; |
| 1254 | 1255 | ||
| 1255 | /* make other inactive cvts with the same stream-tag dirty */ | 1256 | /* make other inactive cvts with the same stream-tag dirty */ |
| 1256 | for (i = 0; i < codec->cvt_setups.used; i++) { | 1257 | list_for_each_entry(c, &codec->bus->codec_list, list) { |
| 1257 | p = snd_array_elem(&codec->cvt_setups, i); | 1258 | for (i = 0; i < c->cvt_setups.used; i++) { |
| 1258 | if (!p->active && p->stream_tag == stream_tag) | 1259 | p = snd_array_elem(&c->cvt_setups, i); |
| 1259 | p->dirty = 1; | 1260 | if (!p->active && p->stream_tag == stream_tag) |
| 1261 | p->dirty = 1; | ||
| 1262 | } | ||
| 1260 | } | 1263 | } |
| 1261 | } | 1264 | } |
| 1262 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); | 1265 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); |
| @@ -1306,12 +1309,16 @@ static void really_cleanup_stream(struct hda_codec *codec, | |||
| 1306 | /* clean up the all conflicting obsolete streams */ | 1309 | /* clean up the all conflicting obsolete streams */ |
| 1307 | static void purify_inactive_streams(struct hda_codec *codec) | 1310 | static void purify_inactive_streams(struct hda_codec *codec) |
| 1308 | { | 1311 | { |
| 1312 | struct hda_codec *c; | ||
| 1309 | int i; | 1313 | int i; |
| 1310 | 1314 | ||
| 1311 | for (i = 0; i < codec->cvt_setups.used; i++) { | 1315 | list_for_each_entry(c, &codec->bus->codec_list, list) { |
| 1312 | struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); | 1316 | for (i = 0; i < c->cvt_setups.used; i++) { |
| 1313 | if (p->dirty) | 1317 | struct hda_cvt_setup *p; |
| 1314 | really_cleanup_stream(codec, p); | 1318 | p = snd_array_elem(&c->cvt_setups, i); |
| 1319 | if (p->dirty) | ||
| 1320 | really_cleanup_stream(c, p); | ||
| 1321 | } | ||
| 1315 | } | 1322 | } |
| 1316 | } | 1323 | } |
| 1317 | 1324 | ||
| @@ -3502,11 +3509,11 @@ int snd_hda_codec_prepare(struct hda_codec *codec, | |||
| 3502 | struct snd_pcm_substream *substream) | 3509 | struct snd_pcm_substream *substream) |
| 3503 | { | 3510 | { |
| 3504 | int ret; | 3511 | int ret; |
| 3505 | mutex_lock(&codec->prepare_mutex); | 3512 | mutex_lock(&codec->bus->prepare_mutex); |
| 3506 | ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); | 3513 | ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); |
| 3507 | if (ret >= 0) | 3514 | if (ret >= 0) |
| 3508 | purify_inactive_streams(codec); | 3515 | purify_inactive_streams(codec); |
| 3509 | mutex_unlock(&codec->prepare_mutex); | 3516 | mutex_unlock(&codec->bus->prepare_mutex); |
| 3510 | return ret; | 3517 | return ret; |
| 3511 | } | 3518 | } |
| 3512 | EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); | 3519 | EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); |
| @@ -3515,9 +3522,9 @@ void snd_hda_codec_cleanup(struct hda_codec *codec, | |||
| 3515 | struct hda_pcm_stream *hinfo, | 3522 | struct hda_pcm_stream *hinfo, |
| 3516 | struct snd_pcm_substream *substream) | 3523 | struct snd_pcm_substream *substream) |
| 3517 | { | 3524 | { |
| 3518 | mutex_lock(&codec->prepare_mutex); | 3525 | mutex_lock(&codec->bus->prepare_mutex); |
| 3519 | hinfo->ops.cleanup(hinfo, codec, substream); | 3526 | hinfo->ops.cleanup(hinfo, codec, substream); |
| 3520 | mutex_unlock(&codec->prepare_mutex); | 3527 | mutex_unlock(&codec->bus->prepare_mutex); |
| 3521 | } | 3528 | } |
| 3522 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); | 3529 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); |
| 3523 | 3530 | ||
| @@ -4529,7 +4536,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, | |||
| 4529 | cfg->hp_outs--; | 4536 | cfg->hp_outs--; |
| 4530 | memmove(cfg->hp_pins + i, cfg->hp_pins + i + 1, | 4537 | memmove(cfg->hp_pins + i, cfg->hp_pins + i + 1, |
| 4531 | sizeof(cfg->hp_pins[0]) * (cfg->hp_outs - i)); | 4538 | sizeof(cfg->hp_pins[0]) * (cfg->hp_outs - i)); |
| 4532 | memmove(sequences_hp + i - 1, sequences_hp + i, | 4539 | memmove(sequences_hp + i, sequences_hp + i + 1, |
| 4533 | sizeof(sequences_hp[0]) * (cfg->hp_outs - i)); | 4540 | sizeof(sequences_hp[0]) * (cfg->hp_outs - i)); |
| 4534 | } | 4541 | } |
| 4535 | } | 4542 | } |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 4303353feda9..62c702240108 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -648,6 +648,7 @@ struct hda_bus { | |||
| 648 | struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; | 648 | struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; |
| 649 | 649 | ||
| 650 | struct mutex cmd_mutex; | 650 | struct mutex cmd_mutex; |
| 651 | struct mutex prepare_mutex; | ||
| 651 | 652 | ||
| 652 | /* unsolicited event queue */ | 653 | /* unsolicited event queue */ |
| 653 | struct hda_bus_unsolicited *unsol; | 654 | struct hda_bus_unsolicited *unsol; |
| @@ -826,7 +827,6 @@ struct hda_codec { | |||
| 826 | 827 | ||
| 827 | struct mutex spdif_mutex; | 828 | struct mutex spdif_mutex; |
| 828 | struct mutex control_mutex; | 829 | struct mutex control_mutex; |
| 829 | struct mutex prepare_mutex; | ||
| 830 | unsigned int spdif_status; /* IEC958 status bits */ | 830 | unsigned int spdif_status; /* IEC958 status bits */ |
| 831 | unsigned short spdif_ctls; /* SPDIF control bits */ | 831 | unsigned short spdif_ctls; /* SPDIF control bits */ |
| 832 | unsigned int spdif_in_enable; /* SPDIF input enable? */ | 832 | unsigned int spdif_in_enable; /* SPDIF input enable? */ |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index 803b298f7411..26c3ade73583 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
| @@ -596,6 +596,8 @@ void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld) | |||
| 596 | } | 596 | } |
| 597 | EXPORT_SYMBOL_HDA(snd_hda_eld_proc_free); | 597 | EXPORT_SYMBOL_HDA(snd_hda_eld_proc_free); |
| 598 | 598 | ||
| 599 | #endif /* CONFIG_PROC_FS */ | ||
| 600 | |||
| 599 | /* update PCM info based on ELD */ | 601 | /* update PCM info based on ELD */ |
| 600 | void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | 602 | void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, |
| 601 | struct hda_pcm_stream *codec_pars) | 603 | struct hda_pcm_stream *codec_pars) |
| @@ -644,5 +646,3 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, | |||
| 644 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); | 646 | pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); |
| 645 | } | 647 | } |
| 646 | EXPORT_SYMBOL_HDA(hdmi_eld_update_pcm_info); | 648 | EXPORT_SYMBOL_HDA(hdmi_eld_update_pcm_info); |
| 647 | |||
| 648 | #endif /* CONFIG_PROC_FS */ | ||
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 1053fff4bd0a..34940a079051 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -126,6 +126,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," | |||
| 126 | "{Intel, ICH10}," | 126 | "{Intel, ICH10}," |
| 127 | "{Intel, PCH}," | 127 | "{Intel, PCH}," |
| 128 | "{Intel, CPT}," | 128 | "{Intel, CPT}," |
| 129 | "{Intel, PBG}," | ||
| 129 | "{Intel, SCH}," | 130 | "{Intel, SCH}," |
| 130 | "{ATI, SB450}," | 131 | "{ATI, SB450}," |
| 131 | "{ATI, SB600}," | 132 | "{ATI, SB600}," |
| @@ -2749,6 +2750,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
| 2749 | { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH }, | 2750 | { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH }, |
| 2750 | /* CPT */ | 2751 | /* CPT */ |
| 2751 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, | 2752 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, |
| 2753 | /* PBG */ | ||
| 2754 | { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, | ||
| 2752 | /* SCH */ | 2755 | /* SCH */ |
| 2753 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, | 2756 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, |
| 2754 | /* ATI SB 450/600 */ | 2757 | /* ATI SB 450/600 */ |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index b697fd2a6f8b..10bbbaf6ebc3 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -3641,6 +3641,7 @@ static struct snd_pci_quirk ad1984_cfg_tbl[] = { | |||
| 3641 | /* Lenovo Thinkpad T61/X61 */ | 3641 | /* Lenovo Thinkpad T61/X61 */ |
| 3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), | 3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
| 3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), | 3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
| 3644 | SND_PCI_QUIRK(0x1028, 0x0233, "Dell Latitude E6400", AD1984_DELL_DESKTOP), | ||
| 3644 | {} | 3645 | {} |
| 3645 | }; | 3646 | }; |
| 3646 | 3647 | ||
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 4ef5efaaaef1..488fd9ade1ba 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
| @@ -972,6 +972,53 @@ static struct hda_verb cs_coef_init_verbs[] = { | |||
| 972 | {} /* terminator */ | 972 | {} /* terminator */ |
| 973 | }; | 973 | }; |
| 974 | 974 | ||
| 975 | /* Errata: CS4207 rev C0/C1/C2 Silicon | ||
| 976 | * | ||
| 977 | * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf | ||
| 978 | * | ||
| 979 | * 6. At high temperature (TA > +85°C), the digital supply current (IVD) | ||
| 980 | * may be excessive (up to an additional 200 μA), which is most easily | ||
| 981 | * observed while the part is being held in reset (RESET# active low). | ||
| 982 | * | ||
| 983 | * Root Cause: At initial powerup of the device, the logic that drives | ||
| 984 | * the clock and write enable to the S/PDIF SRC RAMs is not properly | ||
| 985 | * initialized. | ||
| 986 | * Certain random patterns will cause a steady leakage current in those | ||
| 987 | * RAM cells. The issue will resolve once the SRCs are used (turned on). | ||
| 988 | * | ||
| 989 | * Workaround: The following verb sequence briefly turns on the S/PDIF SRC | ||
| 990 | * blocks, which will alleviate the issue. | ||
| 991 | */ | ||
| 992 | |||
| 993 | static struct hda_verb cs_errata_init_verbs[] = { | ||
| 994 | {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */ | ||
| 995 | {0x11, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */ | ||
| 996 | |||
| 997 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0008}, | ||
| 998 | {0x11, AC_VERB_SET_PROC_COEF, 0x9999}, | ||
| 999 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0017}, | ||
| 1000 | {0x11, AC_VERB_SET_PROC_COEF, 0xa412}, | ||
| 1001 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0001}, | ||
| 1002 | {0x11, AC_VERB_SET_PROC_COEF, 0x0009}, | ||
| 1003 | |||
| 1004 | {0x07, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Rx: D0 */ | ||
| 1005 | {0x08, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Tx: D0 */ | ||
| 1006 | |||
| 1007 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0017}, | ||
| 1008 | {0x11, AC_VERB_SET_PROC_COEF, 0x2412}, | ||
| 1009 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0008}, | ||
| 1010 | {0x11, AC_VERB_SET_PROC_COEF, 0x0000}, | ||
| 1011 | {0x11, AC_VERB_SET_COEF_INDEX, 0x0001}, | ||
| 1012 | {0x11, AC_VERB_SET_PROC_COEF, 0x0008}, | ||
| 1013 | {0x11, AC_VERB_SET_PROC_STATE, 0x00}, | ||
| 1014 | |||
| 1015 | {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */ | ||
| 1016 | {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */ | ||
| 1017 | /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ | ||
| 1018 | |||
| 1019 | {} /* terminator */ | ||
| 1020 | }; | ||
| 1021 | |||
| 975 | /* SPDIF setup */ | 1022 | /* SPDIF setup */ |
| 976 | static void init_digital(struct hda_codec *codec) | 1023 | static void init_digital(struct hda_codec *codec) |
| 977 | { | 1024 | { |
| @@ -991,6 +1038,9 @@ static int cs_init(struct hda_codec *codec) | |||
| 991 | { | 1038 | { |
| 992 | struct cs_spec *spec = codec->spec; | 1039 | struct cs_spec *spec = codec->spec; |
| 993 | 1040 | ||
| 1041 | /* init_verb sequence for C0/C1/C2 errata*/ | ||
| 1042 | snd_hda_sequence_write(codec, cs_errata_init_verbs); | ||
| 1043 | |||
| 994 | snd_hda_sequence_write(codec, cs_coef_init_verbs); | 1044 | snd_hda_sequence_write(codec, cs_coef_init_verbs); |
| 995 | 1045 | ||
| 996 | if (spec->gpio_mask) { | 1046 | if (spec->gpio_mask) { |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 31b5d9eeba68..972e7c453b3d 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -116,6 +116,7 @@ struct conexant_spec { | |||
| 116 | unsigned int dell_vostro:1; | 116 | unsigned int dell_vostro:1; |
| 117 | unsigned int ideapad:1; | 117 | unsigned int ideapad:1; |
| 118 | unsigned int thinkpad:1; | 118 | unsigned int thinkpad:1; |
| 119 | unsigned int hp_laptop:1; | ||
| 119 | 120 | ||
| 120 | unsigned int ext_mic_present; | 121 | unsigned int ext_mic_present; |
| 121 | unsigned int recording; | 122 | unsigned int recording; |
| @@ -2299,6 +2300,18 @@ static void cxt5066_ideapad_automic(struct hda_codec *codec) | |||
| 2299 | } | 2300 | } |
| 2300 | } | 2301 | } |
| 2301 | 2302 | ||
| 2303 | /* toggle input of built-in digital mic and mic jack appropriately */ | ||
| 2304 | static void cxt5066_hp_laptop_automic(struct hda_codec *codec) | ||
| 2305 | { | ||
| 2306 | unsigned int present; | ||
| 2307 | |||
| 2308 | present = snd_hda_jack_detect(codec, 0x1b); | ||
| 2309 | snd_printdd("CXT5066: external microphone present=%d\n", present); | ||
| 2310 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL, | ||
| 2311 | present ? 1 : 3); | ||
| 2312 | } | ||
| 2313 | |||
| 2314 | |||
| 2302 | /* toggle input of built-in digital mic and mic jack appropriately | 2315 | /* toggle input of built-in digital mic and mic jack appropriately |
| 2303 | order is: external mic -> dock mic -> interal mic */ | 2316 | order is: external mic -> dock mic -> interal mic */ |
| 2304 | static void cxt5066_thinkpad_automic(struct hda_codec *codec) | 2317 | static void cxt5066_thinkpad_automic(struct hda_codec *codec) |
| @@ -2408,6 +2421,20 @@ static void cxt5066_ideapad_event(struct hda_codec *codec, unsigned int res) | |||
| 2408 | } | 2421 | } |
| 2409 | 2422 | ||
| 2410 | /* unsolicited event for jack sensing */ | 2423 | /* unsolicited event for jack sensing */ |
| 2424 | static void cxt5066_hp_laptop_event(struct hda_codec *codec, unsigned int res) | ||
| 2425 | { | ||
| 2426 | snd_printdd("CXT5066_hp_laptop: unsol event %x (%x)\n", res, res >> 26); | ||
| 2427 | switch (res >> 26) { | ||
| 2428 | case CONEXANT_HP_EVENT: | ||
| 2429 | cxt5066_hp_automute(codec); | ||
| 2430 | break; | ||
| 2431 | case CONEXANT_MIC_EVENT: | ||
| 2432 | cxt5066_hp_laptop_automic(codec); | ||
| 2433 | break; | ||
| 2434 | } | ||
| 2435 | } | ||
| 2436 | |||
| 2437 | /* unsolicited event for jack sensing */ | ||
| 2411 | static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res) | 2438 | static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res) |
| 2412 | { | 2439 | { |
| 2413 | snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26); | 2440 | snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26); |
| @@ -2989,6 +3016,14 @@ static struct hda_verb cxt5066_init_verbs_portd_lo[] = { | |||
| 2989 | { } /* end */ | 3016 | { } /* end */ |
| 2990 | }; | 3017 | }; |
| 2991 | 3018 | ||
| 3019 | |||
| 3020 | static struct hda_verb cxt5066_init_verbs_hp_laptop[] = { | ||
| 3021 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
| 3022 | {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, | ||
| 3023 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, | ||
| 3024 | { } /* end */ | ||
| 3025 | }; | ||
| 3026 | |||
| 2992 | /* initialize jack-sensing, too */ | 3027 | /* initialize jack-sensing, too */ |
| 2993 | static int cxt5066_init(struct hda_codec *codec) | 3028 | static int cxt5066_init(struct hda_codec *codec) |
| 2994 | { | 3029 | { |
| @@ -3004,6 +3039,8 @@ static int cxt5066_init(struct hda_codec *codec) | |||
| 3004 | cxt5066_ideapad_automic(codec); | 3039 | cxt5066_ideapad_automic(codec); |
| 3005 | else if (spec->thinkpad) | 3040 | else if (spec->thinkpad) |
| 3006 | cxt5066_thinkpad_automic(codec); | 3041 | cxt5066_thinkpad_automic(codec); |
| 3042 | else if (spec->hp_laptop) | ||
| 3043 | cxt5066_hp_laptop_automic(codec); | ||
| 3007 | } | 3044 | } |
| 3008 | cxt5066_set_mic_boost(codec); | 3045 | cxt5066_set_mic_boost(codec); |
| 3009 | return 0; | 3046 | return 0; |
| @@ -3031,6 +3068,7 @@ enum { | |||
| 3031 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ | 3068 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ |
| 3032 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ | 3069 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ |
| 3033 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ | 3070 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ |
| 3071 | CXT5066_HP_LAPTOP, /* HP Laptop */ | ||
| 3034 | CXT5066_MODELS | 3072 | CXT5066_MODELS |
| 3035 | }; | 3073 | }; |
| 3036 | 3074 | ||
| @@ -3041,6 +3079,7 @@ static const char *cxt5066_models[CXT5066_MODELS] = { | |||
| 3041 | [CXT5066_DELL_VOSTO] = "dell-vostro", | 3079 | [CXT5066_DELL_VOSTO] = "dell-vostro", |
| 3042 | [CXT5066_IDEAPAD] = "ideapad", | 3080 | [CXT5066_IDEAPAD] = "ideapad", |
| 3043 | [CXT5066_THINKPAD] = "thinkpad", | 3081 | [CXT5066_THINKPAD] = "thinkpad", |
| 3082 | [CXT5066_HP_LAPTOP] = "hp-laptop", | ||
| 3044 | }; | 3083 | }; |
| 3045 | 3084 | ||
| 3046 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | 3085 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
| @@ -3049,15 +3088,20 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3049 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", | 3088 | SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", |
| 3050 | CXT5066_DELL_LAPTOP), | 3089 | CXT5066_DELL_LAPTOP), |
| 3051 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3090 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
| 3091 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), | ||
| 3052 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), | 3092 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
| 3053 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 3093 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
| 3094 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), | ||
| 3095 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), | ||
| 3054 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3096 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
| 3055 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | 3097 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
| 3098 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), | ||
| 3056 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), | 3099 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), |
| 3057 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), | 3100 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), |
| 3058 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), | 3101 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), |
| 3059 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3102 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), |
| 3060 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), | 3103 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), |
| 3104 | SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), | ||
| 3061 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), | 3105 | SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), |
| 3062 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), | 3106 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), |
| 3063 | {} | 3107 | {} |
| @@ -3114,6 +3158,23 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3114 | spec->num_init_verbs++; | 3158 | spec->num_init_verbs++; |
| 3115 | spec->dell_automute = 1; | 3159 | spec->dell_automute = 1; |
| 3116 | break; | 3160 | break; |
| 3161 | case CXT5066_HP_LAPTOP: | ||
| 3162 | codec->patch_ops.init = cxt5066_init; | ||
| 3163 | codec->patch_ops.unsol_event = cxt5066_hp_laptop_event; | ||
| 3164 | spec->init_verbs[spec->num_init_verbs] = | ||
| 3165 | cxt5066_init_verbs_hp_laptop; | ||
| 3166 | spec->num_init_verbs++; | ||
| 3167 | spec->hp_laptop = 1; | ||
| 3168 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; | ||
| 3169 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | ||
| 3170 | /* no S/PDIF out */ | ||
| 3171 | spec->multiout.dig_out_nid = 0; | ||
| 3172 | /* input source automatically selected */ | ||
| 3173 | spec->input_mux = NULL; | ||
| 3174 | spec->port_d_mode = 0; | ||
| 3175 | spec->mic_boost = 3; /* default 30dB gain */ | ||
| 3176 | break; | ||
| 3177 | |||
| 3117 | case CXT5066_OLPC_XO_1_5: | 3178 | case CXT5066_OLPC_XO_1_5: |
| 3118 | codec->patch_ops.init = cxt5066_olpc_init; | 3179 | codec->patch_ops.init = cxt5066_olpc_init; |
| 3119 | codec->patch_ops.unsol_event = cxt5066_olpc_unsol_event; | 3180 | codec->patch_ops.unsol_event = cxt5066_olpc_unsol_event; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 2bc0f07cf33f..afd6022a96a7 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -707,8 +707,6 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 707 | u32 stream_tag, int format) | 707 | u32 stream_tag, int format) |
| 708 | { | 708 | { |
| 709 | struct hdmi_spec *spec = codec->spec; | 709 | struct hdmi_spec *spec = codec->spec; |
| 710 | int tag; | ||
| 711 | int fmt; | ||
| 712 | int pinctl; | 710 | int pinctl; |
| 713 | int new_pinctl = 0; | 711 | int new_pinctl = 0; |
| 714 | int i; | 712 | int i; |
| @@ -745,24 +743,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 745 | return -EINVAL; | 743 | return -EINVAL; |
| 746 | } | 744 | } |
| 747 | 745 | ||
| 748 | tag = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0) >> 4; | 746 | snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); |
| 749 | fmt = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_STREAM_FORMAT, 0); | ||
| 750 | |||
| 751 | snd_printdd("hdmi_setup_stream: " | ||
| 752 | "NID=0x%x, %sstream=0x%x, %sformat=0x%x\n", | ||
| 753 | nid, | ||
| 754 | tag == stream_tag ? "" : "new-", | ||
| 755 | stream_tag, | ||
| 756 | fmt == format ? "" : "new-", | ||
| 757 | format); | ||
| 758 | |||
| 759 | if (tag != stream_tag) | ||
| 760 | snd_hda_codec_write(codec, nid, 0, | ||
| 761 | AC_VERB_SET_CHANNEL_STREAMID, | ||
| 762 | stream_tag << 4); | ||
| 763 | if (fmt != format) | ||
| 764 | snd_hda_codec_write(codec, nid, 0, | ||
| 765 | AC_VERB_SET_STREAM_FORMAT, format); | ||
| 766 | return 0; | 747 | return 0; |
| 767 | } | 748 | } |
| 768 | 749 | ||
diff --git a/sound/pci/hda/patch_intelhdmi.c b/sound/pci/hda/patch_intelhdmi.c index d382d3c81c0f..36a9b83a6174 100644 --- a/sound/pci/hda/patch_intelhdmi.c +++ b/sound/pci/hda/patch_intelhdmi.c | |||
| @@ -69,20 +69,12 @@ static int intel_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
| 69 | return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); | 69 | return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static int intel_hdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 73 | struct hda_codec *codec, | ||
| 74 | struct snd_pcm_substream *substream) | ||
| 75 | { | ||
| 76 | return 0; | ||
| 77 | } | ||
| 78 | |||
| 79 | static struct hda_pcm_stream intel_hdmi_pcm_playback = { | 72 | static struct hda_pcm_stream intel_hdmi_pcm_playback = { |
| 80 | .substreams = 1, | 73 | .substreams = 1, |
| 81 | .channels_min = 2, | 74 | .channels_min = 2, |
| 82 | .ops = { | 75 | .ops = { |
| 83 | .open = hdmi_pcm_open, | 76 | .open = hdmi_pcm_open, |
| 84 | .prepare = intel_hdmi_playback_pcm_prepare, | 77 | .prepare = intel_hdmi_playback_pcm_prepare, |
| 85 | .cleanup = intel_hdmi_playback_pcm_cleanup, | ||
| 86 | }, | 78 | }, |
| 87 | }; | 79 | }; |
| 88 | 80 | ||
diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index f636870dc718..baa108b9d6aa 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
| @@ -84,7 +84,7 @@ static struct hda_verb nvhdmi_basic_init_7x[] = { | |||
| 84 | #else | 84 | #else |
| 85 | /* support all rates and formats */ | 85 | /* support all rates and formats */ |
| 86 | #define SUPPORTED_RATES \ | 86 | #define SUPPORTED_RATES \ |
| 87 | (SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ | 87 | (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ |
| 88 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ | 88 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ |
| 89 | SNDRV_PCM_RATE_192000) | 89 | SNDRV_PCM_RATE_192000) |
| 90 | #define SUPPORTED_MAXBPS 24 | 90 | #define SUPPORTED_MAXBPS 24 |
| @@ -326,13 +326,6 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo, | |||
| 326 | return 0; | 326 | return 0; |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | static int nvhdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 330 | struct hda_codec *codec, | ||
| 331 | struct snd_pcm_substream *substream) | ||
| 332 | { | ||
| 333 | return 0; | ||
| 334 | } | ||
| 335 | |||
| 336 | static int nvhdmi_dig_playback_pcm_prepare_2ch(struct hda_pcm_stream *hinfo, | 329 | static int nvhdmi_dig_playback_pcm_prepare_2ch(struct hda_pcm_stream *hinfo, |
| 337 | struct hda_codec *codec, | 330 | struct hda_codec *codec, |
| 338 | unsigned int stream_tag, | 331 | unsigned int stream_tag, |
| @@ -350,7 +343,6 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_8ch_89 = { | |||
| 350 | .ops = { | 343 | .ops = { |
| 351 | .open = hdmi_pcm_open, | 344 | .open = hdmi_pcm_open, |
| 352 | .prepare = nvhdmi_dig_playback_pcm_prepare_8ch_89, | 345 | .prepare = nvhdmi_dig_playback_pcm_prepare_8ch_89, |
| 353 | .cleanup = nvhdmi_playback_pcm_cleanup, | ||
| 354 | }, | 346 | }, |
| 355 | }; | 347 | }; |
| 356 | 348 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 2cd1ae809e46..a432e6efd19b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1594,12 +1594,22 @@ static void alc_auto_parse_digital(struct hda_codec *codec) | |||
| 1594 | } | 1594 | } |
| 1595 | 1595 | ||
| 1596 | if (spec->autocfg.dig_in_pin) { | 1596 | if (spec->autocfg.dig_in_pin) { |
| 1597 | hda_nid_t dig_nid; | 1597 | dig_nid = codec->start_nid; |
| 1598 | err = snd_hda_get_connections(codec, | 1598 | for (i = 0; i < codec->num_nodes; i++, dig_nid++) { |
| 1599 | spec->autocfg.dig_in_pin, | 1599 | unsigned int wcaps = get_wcaps(codec, dig_nid); |
| 1600 | &dig_nid, 1); | 1600 | if (get_wcaps_type(wcaps) != AC_WID_AUD_IN) |
| 1601 | if (err > 0) | 1601 | continue; |
| 1602 | spec->dig_in_nid = dig_nid; | 1602 | if (!(wcaps & AC_WCAP_DIGITAL)) |
| 1603 | continue; | ||
| 1604 | if (!(wcaps & AC_WCAP_CONN_LIST)) | ||
| 1605 | continue; | ||
| 1606 | err = get_connection_index(codec, dig_nid, | ||
| 1607 | spec->autocfg.dig_in_pin); | ||
| 1608 | if (err >= 0) { | ||
| 1609 | spec->dig_in_nid = dig_nid; | ||
| 1610 | break; | ||
| 1611 | } | ||
| 1612 | } | ||
| 1603 | } | 1613 | } |
| 1604 | } | 1614 | } |
| 1605 | 1615 | ||
| @@ -5334,6 +5344,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, | |||
| 5334 | 5344 | ||
| 5335 | static struct snd_pci_quirk beep_white_list[] = { | 5345 | static struct snd_pci_quirk beep_white_list[] = { |
| 5336 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), | 5346 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), |
| 5347 | SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), | ||
| 5337 | SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), | 5348 | SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), |
| 5338 | {} | 5349 | {} |
| 5339 | }; | 5350 | }; |
| @@ -14452,6 +14463,7 @@ static void alc269_auto_init(struct hda_codec *codec) | |||
| 14452 | 14463 | ||
| 14453 | enum { | 14464 | enum { |
| 14454 | ALC269_FIXUP_SONY_VAIO, | 14465 | ALC269_FIXUP_SONY_VAIO, |
| 14466 | ALC269_FIXUP_DELL_M101Z, | ||
| 14455 | }; | 14467 | }; |
| 14456 | 14468 | ||
| 14457 | static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = { | 14469 | static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = { |
| @@ -14463,10 +14475,20 @@ static const struct alc_fixup alc269_fixups[] = { | |||
| 14463 | [ALC269_FIXUP_SONY_VAIO] = { | 14475 | [ALC269_FIXUP_SONY_VAIO] = { |
| 14464 | .verbs = alc269_sony_vaio_fixup_verbs | 14476 | .verbs = alc269_sony_vaio_fixup_verbs |
| 14465 | }, | 14477 | }, |
| 14478 | [ALC269_FIXUP_DELL_M101Z] = { | ||
| 14479 | .verbs = (const struct hda_verb[]) { | ||
| 14480 | /* Enables internal speaker */ | ||
| 14481 | {0x20, AC_VERB_SET_COEF_INDEX, 13}, | ||
| 14482 | {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, | ||
| 14483 | {} | ||
| 14484 | } | ||
| 14485 | }, | ||
| 14466 | }; | 14486 | }; |
| 14467 | 14487 | ||
| 14468 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | 14488 | static struct snd_pci_quirk alc269_fixup_tbl[] = { |
| 14469 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | 14489 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
| 14490 | SND_PCI_QUIRK(0x104d, 0x9077, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | ||
| 14491 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | ||
| 14470 | {} | 14492 | {} |
| 14471 | }; | 14493 | }; |
| 14472 | 14494 | ||
| @@ -19030,6 +19052,7 @@ static int patch_alc888(struct hda_codec *codec) | |||
| 19030 | /* | 19052 | /* |
| 19031 | * ALC680 support | 19053 | * ALC680 support |
| 19032 | */ | 19054 | */ |
| 19055 | #define ALC680_DIGIN_NID ALC880_DIGIN_NID | ||
| 19033 | #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID | 19056 | #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID |
| 19034 | #define alc680_modes alc260_modes | 19057 | #define alc680_modes alc260_modes |
| 19035 | 19058 | ||
| @@ -19044,23 +19067,93 @@ static hda_nid_t alc680_adc_nids[3] = { | |||
| 19044 | 0x07, 0x08, 0x09 | 19067 | 0x07, 0x08, 0x09 |
| 19045 | }; | 19068 | }; |
| 19046 | 19069 | ||
| 19070 | /* | ||
| 19071 | * Analog capture ADC cgange | ||
| 19072 | */ | ||
| 19073 | static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo, | ||
| 19074 | struct hda_codec *codec, | ||
| 19075 | unsigned int stream_tag, | ||
| 19076 | unsigned int format, | ||
| 19077 | struct snd_pcm_substream *substream) | ||
| 19078 | { | ||
| 19079 | struct alc_spec *spec = codec->spec; | ||
| 19080 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 19081 | unsigned int pre_mic, pre_line; | ||
| 19082 | |||
| 19083 | pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); | ||
| 19084 | pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]); | ||
| 19085 | |||
| 19086 | spec->cur_adc_stream_tag = stream_tag; | ||
| 19087 | spec->cur_adc_format = format; | ||
| 19088 | |||
| 19089 | if (pre_mic || pre_line) { | ||
| 19090 | if (pre_mic) | ||
| 19091 | snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0, | ||
| 19092 | format); | ||
| 19093 | else | ||
| 19094 | snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0, | ||
| 19095 | format); | ||
| 19096 | } else | ||
| 19097 | snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format); | ||
| 19098 | return 0; | ||
| 19099 | } | ||
| 19100 | |||
| 19101 | static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
| 19102 | struct hda_codec *codec, | ||
| 19103 | struct snd_pcm_substream *substream) | ||
| 19104 | { | ||
| 19105 | snd_hda_codec_cleanup_stream(codec, 0x07); | ||
| 19106 | snd_hda_codec_cleanup_stream(codec, 0x08); | ||
| 19107 | snd_hda_codec_cleanup_stream(codec, 0x09); | ||
| 19108 | return 0; | ||
| 19109 | } | ||
| 19110 | |||
| 19111 | static struct hda_pcm_stream alc680_pcm_analog_auto_capture = { | ||
| 19112 | .substreams = 1, /* can be overridden */ | ||
| 19113 | .channels_min = 2, | ||
| 19114 | .channels_max = 2, | ||
| 19115 | /* NID is set in alc_build_pcms */ | ||
| 19116 | .ops = { | ||
| 19117 | .prepare = alc680_capture_pcm_prepare, | ||
| 19118 | .cleanup = alc680_capture_pcm_cleanup | ||
| 19119 | }, | ||
| 19120 | }; | ||
| 19121 | |||
| 19047 | static struct snd_kcontrol_new alc680_base_mixer[] = { | 19122 | static struct snd_kcontrol_new alc680_base_mixer[] = { |
| 19048 | /* output mixer control */ | 19123 | /* output mixer control */ |
| 19049 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), | 19124 | HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), |
| 19050 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 19125 | HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
| 19051 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), | 19126 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), |
| 19052 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), | 19127 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), |
| 19128 | HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT), | ||
| 19053 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), | 19129 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
| 19130 | HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT), | ||
| 19054 | { } | 19131 | { } |
| 19055 | }; | 19132 | }; |
| 19056 | 19133 | ||
| 19057 | static struct snd_kcontrol_new alc680_capture_mixer[] = { | 19134 | static struct hda_bind_ctls alc680_bind_cap_vol = { |
| 19058 | HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), | 19135 | .ops = &snd_hda_bind_vol, |
| 19059 | HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), | 19136 | .values = { |
| 19060 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), | 19137 | HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), |
| 19061 | HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), | 19138 | HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), |
| 19062 | HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT), | 19139 | HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), |
| 19063 | HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT), | 19140 | 0 |
| 19141 | }, | ||
| 19142 | }; | ||
| 19143 | |||
| 19144 | static struct hda_bind_ctls alc680_bind_cap_switch = { | ||
| 19145 | .ops = &snd_hda_bind_sw, | ||
| 19146 | .values = { | ||
| 19147 | HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), | ||
| 19148 | HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), | ||
| 19149 | HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), | ||
| 19150 | 0 | ||
| 19151 | }, | ||
| 19152 | }; | ||
| 19153 | |||
| 19154 | static struct snd_kcontrol_new alc680_master_capture_mixer[] = { | ||
| 19155 | HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol), | ||
| 19156 | HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch), | ||
| 19064 | { } /* end */ | 19157 | { } /* end */ |
| 19065 | }; | 19158 | }; |
| 19066 | 19159 | ||
| @@ -19068,25 +19161,73 @@ static struct snd_kcontrol_new alc680_capture_mixer[] = { | |||
| 19068 | * generic initialization of ADC, input mixers and output mixers | 19161 | * generic initialization of ADC, input mixers and output mixers |
| 19069 | */ | 19162 | */ |
| 19070 | static struct hda_verb alc680_init_verbs[] = { | 19163 | static struct hda_verb alc680_init_verbs[] = { |
| 19071 | /* Unmute DAC0-1 and set vol = 0 */ | 19164 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19072 | {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 19165 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19073 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 19166 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| 19074 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
| 19075 | 19167 | ||
| 19076 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, | 19168 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
| 19077 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, | 19169 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 19078 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, | 19170 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 19079 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, | 19171 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| 19080 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, | 19172 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
| 19173 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 19081 | 19174 | ||
| 19082 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19175 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19083 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19176 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19084 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19177 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19085 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19178 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19086 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 19179 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 19180 | |||
| 19181 | {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
| 19182 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, | ||
| 19183 | |||
| 19087 | { } | 19184 | { } |
| 19088 | }; | 19185 | }; |
| 19089 | 19186 | ||
| 19187 | /* toggle speaker-output according to the hp-jack state */ | ||
| 19188 | static void alc680_base_setup(struct hda_codec *codec) | ||
| 19189 | { | ||
| 19190 | struct alc_spec *spec = codec->spec; | ||
| 19191 | |||
| 19192 | spec->autocfg.hp_pins[0] = 0x16; | ||
| 19193 | spec->autocfg.speaker_pins[0] = 0x14; | ||
| 19194 | spec->autocfg.speaker_pins[1] = 0x15; | ||
| 19195 | spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18; | ||
| 19196 | spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19; | ||
| 19197 | } | ||
| 19198 | |||
| 19199 | static void alc680_rec_autoswitch(struct hda_codec *codec) | ||
| 19200 | { | ||
| 19201 | struct alc_spec *spec = codec->spec; | ||
| 19202 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
| 19203 | unsigned int present; | ||
| 19204 | hda_nid_t new_adc; | ||
| 19205 | |||
| 19206 | present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); | ||
| 19207 | |||
| 19208 | new_adc = present ? 0x8 : 0x7; | ||
| 19209 | __snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1); | ||
| 19210 | snd_hda_codec_setup_stream(codec, new_adc, | ||
| 19211 | spec->cur_adc_stream_tag, 0, | ||
| 19212 | spec->cur_adc_format); | ||
| 19213 | |||
| 19214 | } | ||
| 19215 | |||
| 19216 | static void alc680_unsol_event(struct hda_codec *codec, | ||
| 19217 | unsigned int res) | ||
| 19218 | { | ||
| 19219 | if ((res >> 26) == ALC880_HP_EVENT) | ||
| 19220 | alc_automute_amp(codec); | ||
| 19221 | if ((res >> 26) == ALC880_MIC_EVENT) | ||
| 19222 | alc680_rec_autoswitch(codec); | ||
| 19223 | } | ||
| 19224 | |||
| 19225 | static void alc680_inithook(struct hda_codec *codec) | ||
| 19226 | { | ||
| 19227 | alc_automute_amp(codec); | ||
| 19228 | alc680_rec_autoswitch(codec); | ||
| 19229 | } | ||
| 19230 | |||
| 19090 | /* create input playback/capture controls for the given pin */ | 19231 | /* create input playback/capture controls for the given pin */ |
| 19091 | static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, | 19232 | static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, |
| 19092 | const char *ctlname, int idx) | 19233 | const char *ctlname, int idx) |
| @@ -19197,13 +19338,7 @@ static void alc680_auto_init_hp_out(struct hda_codec *codec) | |||
| 19197 | #define alc680_pcm_analog_capture alc880_pcm_analog_capture | 19338 | #define alc680_pcm_analog_capture alc880_pcm_analog_capture |
| 19198 | #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture | 19339 | #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture |
| 19199 | #define alc680_pcm_digital_playback alc880_pcm_digital_playback | 19340 | #define alc680_pcm_digital_playback alc880_pcm_digital_playback |
| 19200 | 19341 | #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 | 19342 | ||
| 19208 | /* | 19343 | /* |
| 19209 | * BIOS auto configuration | 19344 | * BIOS auto configuration |
| @@ -19218,6 +19353,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec) | |||
| 19218 | alc680_ignore); | 19353 | alc680_ignore); |
| 19219 | if (err < 0) | 19354 | if (err < 0) |
| 19220 | return err; | 19355 | return err; |
| 19356 | |||
| 19221 | if (!spec->autocfg.line_outs) { | 19357 | if (!spec->autocfg.line_outs) { |
| 19222 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { | 19358 | if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { |
| 19223 | spec->multiout.max_channels = 2; | 19359 | spec->multiout.max_channels = 2; |
| @@ -19239,8 +19375,6 @@ static int alc680_parse_auto_config(struct hda_codec *codec) | |||
| 19239 | add_mixer(spec, spec->kctls.list); | 19375 | add_mixer(spec, spec->kctls.list); |
| 19240 | 19376 | ||
| 19241 | add_verb(spec, alc680_init_verbs); | 19377 | add_verb(spec, alc680_init_verbs); |
| 19242 | spec->num_mux_defs = 1; | ||
| 19243 | spec->input_mux = &alc680_capture_source; | ||
| 19244 | 19378 | ||
| 19245 | err = alc_auto_add_mic_boost(codec); | 19379 | err = alc_auto_add_mic_boost(codec); |
| 19246 | if (err < 0) | 19380 | if (err < 0) |
| @@ -19279,17 +19413,17 @@ static struct snd_pci_quirk alc680_cfg_tbl[] = { | |||
| 19279 | static struct alc_config_preset alc680_presets[] = { | 19413 | static struct alc_config_preset alc680_presets[] = { |
| 19280 | [ALC680_BASE] = { | 19414 | [ALC680_BASE] = { |
| 19281 | .mixers = { alc680_base_mixer }, | 19415 | .mixers = { alc680_base_mixer }, |
| 19282 | .cap_mixer = alc680_capture_mixer, | 19416 | .cap_mixer = alc680_master_capture_mixer, |
| 19283 | .init_verbs = { alc680_init_verbs }, | 19417 | .init_verbs = { alc680_init_verbs }, |
| 19284 | .num_dacs = ARRAY_SIZE(alc680_dac_nids), | 19418 | .num_dacs = ARRAY_SIZE(alc680_dac_nids), |
| 19285 | .dac_nids = alc680_dac_nids, | 19419 | .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, | 19420 | .dig_out_nid = ALC680_DIGOUT_NID, |
| 19290 | .num_channel_mode = ARRAY_SIZE(alc680_modes), | 19421 | .num_channel_mode = ARRAY_SIZE(alc680_modes), |
| 19291 | .channel_mode = alc680_modes, | 19422 | .channel_mode = alc680_modes, |
| 19292 | .input_mux = &alc680_capture_source, | 19423 | .unsol_event = alc680_unsol_event, |
| 19424 | .setup = alc680_base_setup, | ||
| 19425 | .init_hook = alc680_inithook, | ||
| 19426 | |||
| 19293 | }, | 19427 | }, |
| 19294 | }; | 19428 | }; |
| 19295 | 19429 | ||
| @@ -19333,9 +19467,9 @@ static int patch_alc680(struct hda_codec *codec) | |||
| 19333 | setup_preset(codec, &alc680_presets[board_config]); | 19467 | setup_preset(codec, &alc680_presets[board_config]); |
| 19334 | 19468 | ||
| 19335 | spec->stream_analog_playback = &alc680_pcm_analog_playback; | 19469 | spec->stream_analog_playback = &alc680_pcm_analog_playback; |
| 19336 | spec->stream_analog_capture = &alc680_pcm_analog_capture; | 19470 | 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; | 19471 | spec->stream_digital_playback = &alc680_pcm_digital_playback; |
| 19472 | spec->stream_digital_capture = &alc680_pcm_digital_capture; | ||
| 19339 | 19473 | ||
| 19340 | if (!spec->adc_nids) { | 19474 | if (!spec->adc_nids) { |
| 19341 | spec->adc_nids = alc680_adc_nids; | 19475 | spec->adc_nids = alc680_adc_nids; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index f3f861bd1bf8..95148e58026c 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -6303,6 +6303,21 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
| 6303 | { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, | 6303 | { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, |
| 6304 | { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, | 6304 | { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, |
| 6305 | { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, | 6305 | { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, |
| 6306 | { .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx }, | ||
| 6307 | { .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx }, | ||
| 6308 | { .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx }, | ||
| 6309 | { .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx }, | ||
| 6310 | { .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx }, | ||
| 6311 | { .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx }, | ||
| 6312 | { .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx }, | ||
| 6313 | { .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx }, | ||
| 6314 | { .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx }, | ||
| 6315 | { .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx }, | ||
| 6316 | { .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx }, | ||
| 6317 | { .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx }, | ||
| 6318 | { .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx }, | ||
| 6319 | { .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx }, | ||
| 6320 | { .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx }, | ||
| 6306 | {} /* terminator */ | 6321 | {} /* terminator */ |
| 6307 | }; | 6322 | }; |
| 6308 | 6323 | ||
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 6433e65c9507..467749249576 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
| @@ -1776,6 +1776,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
| 1776 | }, | 1776 | }, |
| 1777 | { | 1777 | { |
| 1778 | .subvendor = 0x1014, | 1778 | .subvendor = 0x1014, |
| 1779 | .subdevice = 0x0534, | ||
| 1780 | .name = "ThinkPad X31", | ||
| 1781 | .type = AC97_TUNE_INV_EAPD | ||
| 1782 | }, | ||
| 1783 | { | ||
| 1784 | .subvendor = 0x1014, | ||
| 1779 | .subdevice = 0x1f00, | 1785 | .subdevice = 0x1f00, |
| 1780 | .name = "MS-9128", | 1786 | .name = "MS-9128", |
| 1781 | .type = AC97_TUNE_ALC_JACK | 1787 | .type = AC97_TUNE_ALC_JACK |
diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index 289cb4dacfc7..6c0a11adb2a8 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c | |||
| @@ -543,6 +543,10 @@ static int __devinit get_oxygen_model(struct oxygen *chip, | |||
| 543 | chip->model.suspend = claro_suspend; | 543 | chip->model.suspend = claro_suspend; |
| 544 | chip->model.resume = claro_resume; | 544 | chip->model.resume = claro_resume; |
| 545 | chip->model.set_adc_params = set_ak5385_params; | 545 | chip->model.set_adc_params = set_ak5385_params; |
| 546 | chip->model.device_config = PLAYBACK_0_TO_I2S | | ||
| 547 | PLAYBACK_1_TO_SPDIF | | ||
| 548 | CAPTURE_0_FROM_I2S_2 | | ||
| 549 | CAPTURE_1_FROM_SPDIF; | ||
| 546 | break; | 550 | break; |
| 547 | } | 551 | } |
| 548 | if (id->driver_data == MODEL_MERIDIAN || | 552 | if (id->driver_data == MODEL_MERIDIAN || |
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 6147216af744..a3409edcfb50 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h | |||
| @@ -155,6 +155,7 @@ void oxygen_pci_remove(struct pci_dev *pci); | |||
| 155 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); | 155 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); |
| 156 | int oxygen_pci_resume(struct pci_dev *pci); | 156 | int oxygen_pci_resume(struct pci_dev *pci); |
| 157 | #endif | 157 | #endif |
| 158 | void oxygen_pci_shutdown(struct pci_dev *pci); | ||
| 158 | 159 | ||
| 159 | /* oxygen_mixer.c */ | 160 | /* oxygen_mixer.c */ |
| 160 | 161 | ||
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index fad03d64e3ad..7e93cf884437 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c | |||
| @@ -519,16 +519,21 @@ static void oxygen_init(struct oxygen *chip) | |||
| 519 | } | 519 | } |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | static void oxygen_card_free(struct snd_card *card) | 522 | static void oxygen_shutdown(struct oxygen *chip) |
| 523 | { | 523 | { |
| 524 | struct oxygen *chip = card->private_data; | ||
| 525 | |||
| 526 | spin_lock_irq(&chip->reg_lock); | 524 | spin_lock_irq(&chip->reg_lock); |
| 527 | chip->interrupt_mask = 0; | 525 | chip->interrupt_mask = 0; |
| 528 | chip->pcm_running = 0; | 526 | chip->pcm_running = 0; |
| 529 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); | 527 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); |
| 530 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); | 528 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); |
| 531 | spin_unlock_irq(&chip->reg_lock); | 529 | spin_unlock_irq(&chip->reg_lock); |
| 530 | } | ||
| 531 | |||
| 532 | static void oxygen_card_free(struct snd_card *card) | ||
| 533 | { | ||
| 534 | struct oxygen *chip = card->private_data; | ||
| 535 | |||
| 536 | oxygen_shutdown(chip); | ||
| 532 | if (chip->irq >= 0) | 537 | if (chip->irq >= 0) |
| 533 | free_irq(chip->irq, chip); | 538 | free_irq(chip->irq, chip); |
| 534 | flush_scheduled_work(); | 539 | flush_scheduled_work(); |
| @@ -778,3 +783,13 @@ int oxygen_pci_resume(struct pci_dev *pci) | |||
| 778 | } | 783 | } |
| 779 | EXPORT_SYMBOL(oxygen_pci_resume); | 784 | EXPORT_SYMBOL(oxygen_pci_resume); |
| 780 | #endif /* CONFIG_PM */ | 785 | #endif /* CONFIG_PM */ |
| 786 | |||
| 787 | void oxygen_pci_shutdown(struct pci_dev *pci) | ||
| 788 | { | ||
| 789 | struct snd_card *card = pci_get_drvdata(pci); | ||
| 790 | struct oxygen *chip = card->private_data; | ||
| 791 | |||
| 792 | oxygen_shutdown(chip); | ||
| 793 | chip->model.cleanup(chip); | ||
| 794 | } | ||
| 795 | EXPORT_SYMBOL(oxygen_pci_shutdown); | ||
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index f03a2f2cffee..06c863e86e3d 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
| @@ -95,6 +95,7 @@ static struct pci_driver xonar_driver = { | |||
| 95 | .suspend = oxygen_pci_suspend, | 95 | .suspend = oxygen_pci_suspend, |
| 96 | .resume = oxygen_pci_resume, | 96 | .resume = oxygen_pci_resume, |
| 97 | #endif | 97 | #endif |
| 98 | .shutdown = oxygen_pci_shutdown, | ||
| 98 | }; | 99 | }; |
| 99 | 100 | ||
| 100 | static int __init alsa_card_xonar_init(void) | 101 | static int __init alsa_card_xonar_init(void) |
diff --git a/sound/pci/oxygen/xonar_wm87x6.c b/sound/pci/oxygen/xonar_wm87x6.c index dbc4b89d74e4..b82c1cfa96f5 100644 --- a/sound/pci/oxygen/xonar_wm87x6.c +++ b/sound/pci/oxygen/xonar_wm87x6.c | |||
| @@ -53,6 +53,8 @@ struct xonar_wm87x6 { | |||
| 53 | struct xonar_generic generic; | 53 | struct xonar_generic generic; |
| 54 | u16 wm8776_regs[0x17]; | 54 | u16 wm8776_regs[0x17]; |
| 55 | u16 wm8766_regs[0x10]; | 55 | u16 wm8766_regs[0x10]; |
| 56 | struct snd_kcontrol *line_adcmux_control; | ||
| 57 | struct snd_kcontrol *mic_adcmux_control; | ||
| 56 | struct snd_kcontrol *lc_controls[13]; | 58 | struct snd_kcontrol *lc_controls[13]; |
| 57 | }; | 59 | }; |
| 58 | 60 | ||
| @@ -193,6 +195,7 @@ static void xonar_ds_init(struct oxygen *chip) | |||
| 193 | static void xonar_ds_cleanup(struct oxygen *chip) | 195 | static void xonar_ds_cleanup(struct oxygen *chip) |
| 194 | { | 196 | { |
| 195 | xonar_disable_output(chip); | 197 | xonar_disable_output(chip); |
| 198 | wm8776_write(chip, WM8776_RESET, 0); | ||
| 196 | } | 199 | } |
| 197 | 200 | ||
| 198 | static void xonar_ds_suspend(struct oxygen *chip) | 201 | static void xonar_ds_suspend(struct oxygen *chip) |
| @@ -603,6 +606,7 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, | |||
| 603 | { | 606 | { |
| 604 | struct oxygen *chip = ctl->private_data; | 607 | struct oxygen *chip = ctl->private_data; |
| 605 | struct xonar_wm87x6 *data = chip->model_data; | 608 | struct xonar_wm87x6 *data = chip->model_data; |
| 609 | struct snd_kcontrol *other_ctl; | ||
| 606 | unsigned int mux_bit = ctl->private_value; | 610 | unsigned int mux_bit = ctl->private_value; |
| 607 | u16 reg; | 611 | u16 reg; |
| 608 | int changed; | 612 | int changed; |
| @@ -610,8 +614,18 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, | |||
| 610 | mutex_lock(&chip->mutex); | 614 | mutex_lock(&chip->mutex); |
| 611 | reg = data->wm8776_regs[WM8776_ADCMUX]; | 615 | reg = data->wm8776_regs[WM8776_ADCMUX]; |
| 612 | if (value->value.integer.value[0]) { | 616 | if (value->value.integer.value[0]) { |
| 613 | reg &= ~0x003; | ||
| 614 | reg |= mux_bit; | 617 | reg |= mux_bit; |
| 618 | /* line-in and mic-in are exclusive */ | ||
| 619 | mux_bit ^= 3; | ||
| 620 | if (reg & mux_bit) { | ||
| 621 | reg &= ~mux_bit; | ||
| 622 | if (mux_bit == 1) | ||
| 623 | other_ctl = data->line_adcmux_control; | ||
| 624 | else | ||
| 625 | other_ctl = data->mic_adcmux_control; | ||
| 626 | snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, | ||
| 627 | &other_ctl->id); | ||
| 628 | } | ||
| 615 | } else | 629 | } else |
| 616 | reg &= ~mux_bit; | 630 | reg &= ~mux_bit; |
| 617 | changed = reg != data->wm8776_regs[WM8776_ADCMUX]; | 631 | changed = reg != data->wm8776_regs[WM8776_ADCMUX]; |
| @@ -963,7 +977,13 @@ static int xonar_ds_mixer_init(struct oxygen *chip) | |||
| 963 | err = snd_ctl_add(chip->card, ctl); | 977 | err = snd_ctl_add(chip->card, ctl); |
| 964 | if (err < 0) | 978 | if (err < 0) |
| 965 | return err; | 979 | return err; |
| 980 | if (!strcmp(ctl->id.name, "Line Capture Switch")) | ||
| 981 | data->line_adcmux_control = ctl; | ||
| 982 | else if (!strcmp(ctl->id.name, "Mic Capture Switch")) | ||
| 983 | data->mic_adcmux_control = ctl; | ||
| 966 | } | 984 | } |
| 985 | if (!data->line_adcmux_control || !data->mic_adcmux_control) | ||
| 986 | return -ENXIO; | ||
| 967 | BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); | 987 | BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); |
| 968 | for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { | 988 | for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { |
| 969 | ctl = snd_ctl_new1(&lc_controls[i], chip); | 989 | ctl = snd_ctl_new1(&lc_controls[i], chip); |
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/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index b92adef8e81e..d6fa7bfd9aa1 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c | |||
| @@ -4609,6 +4609,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne | |||
| 4609 | if (err < 0) | 4609 | if (err < 0) |
| 4610 | return err; | 4610 | return err; |
| 4611 | 4611 | ||
| 4612 | memset(&info, 0, sizeof(info)); | ||
| 4612 | spin_lock_irqsave(&hdsp->lock, flags); | 4613 | spin_lock_irqsave(&hdsp->lock, flags); |
| 4613 | info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); | 4614 | info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); |
| 4614 | info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); | 4615 | info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); |
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index 547b713d7204..0c98ef9156d8 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c | |||
| @@ -4127,6 +4127,7 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, | |||
| 4127 | 4127 | ||
| 4128 | case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO: | 4128 | case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO: |
| 4129 | 4129 | ||
| 4130 | memset(&info, 0, sizeof(info)); | ||
| 4130 | spin_lock_irq(&hdspm->lock); | 4131 | spin_lock_irq(&hdspm->lock); |
| 4131 | info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); | 4132 | info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); |
| 4132 | info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); | 4133 | info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); |
