Commit d590c6cd authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-fix-3.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "Here are a collection of small fixes after 3.18 merge.

  The urgent one is the fix for kernel panics with linked PCM substream
  triggered by the recent nonatomic PCM ops support.  Other two fixes
  (emu10k1 and bebob) are stable fixes, and one easy PCI ID addition for
  a new Intel HD-audio controller"

* tag 'sound-fix-3.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda_intel: Add Device IDs for Intel Sunrise Point PCH
  ALSA: emu10k1: Fix deadlock in synth voice lookup
  ALSA: pcm: Fix referred substream in snd_pcm_action_group() unlock loop
  ALSA: bebob: Fix failure to detect source of clock for Terratec Phase 88
parents fb378df5 c8b00fd2
...@@ -818,7 +818,7 @@ static int snd_pcm_action_group(struct action_ops *ops, ...@@ -818,7 +818,7 @@ static int snd_pcm_action_group(struct action_ops *ops,
/* unlock streams */ /* unlock streams */
snd_pcm_group_for_each_entry(s1, substream) { snd_pcm_group_for_each_entry(s1, substream) {
if (s1 != substream) { if (s1 != substream) {
if (s->pcm->nonatomic) if (s1->pcm->nonatomic)
mutex_unlock(&s1->self_group.mutex); mutex_unlock(&s1->self_group.mutex);
else else
spin_unlock(&s1->self_group.lock); spin_unlock(&s1->self_group.lock);
......
...@@ -17,10 +17,10 @@ phase88_rack_clk_src_get(struct snd_bebob *bebob, unsigned int *id) ...@@ -17,10 +17,10 @@ phase88_rack_clk_src_get(struct snd_bebob *bebob, unsigned int *id)
unsigned int enable_ext, enable_word; unsigned int enable_ext, enable_word;
int err; int err;
err = avc_audio_get_selector(bebob->unit, 0, 0, &enable_ext); err = avc_audio_get_selector(bebob->unit, 0, 9, &enable_ext);
if (err < 0) if (err < 0)
goto end; goto end;
err = avc_audio_get_selector(bebob->unit, 0, 0, &enable_word); err = avc_audio_get_selector(bebob->unit, 0, 8, &enable_word);
if (err < 0) if (err < 0)
goto end; goto end;
......
...@@ -85,6 +85,8 @@ snd_emu10k1_ops_setup(struct snd_emux *emux) ...@@ -85,6 +85,8 @@ snd_emu10k1_ops_setup(struct snd_emux *emux)
* get more voice for pcm * get more voice for pcm
* *
* terminate most inactive voice and give it as a pcm voice. * terminate most inactive voice and give it as a pcm voice.
*
* voice_lock is already held.
*/ */
int int
snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw) snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw)
...@@ -92,12 +94,10 @@ snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw) ...@@ -92,12 +94,10 @@ snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw)
struct snd_emux *emu; struct snd_emux *emu;
struct snd_emux_voice *vp; struct snd_emux_voice *vp;
struct best_voice best[V_END]; struct best_voice best[V_END];
unsigned long flags;
int i; int i;
emu = hw->synth; emu = hw->synth;
spin_lock_irqsave(&emu->voice_lock, flags);
lookup_voices(emu, hw, best, 1); /* no OFF voices */ lookup_voices(emu, hw, best, 1); /* no OFF voices */
for (i = 0; i < V_END; i++) { for (i = 0; i < V_END; i++) {
if (best[i].voice >= 0) { if (best[i].voice >= 0) {
...@@ -113,11 +113,9 @@ snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw) ...@@ -113,11 +113,9 @@ snd_emu10k1_synth_get_voice(struct snd_emu10k1 *hw)
vp->emu->num_voices--; vp->emu->num_voices--;
vp->ch = -1; vp->ch = -1;
vp->state = SNDRV_EMUX_ST_OFF; vp->state = SNDRV_EMUX_ST_OFF;
spin_unlock_irqrestore(&emu->voice_lock, flags);
return ch; return ch;
} }
} }
spin_unlock_irqrestore(&emu->voice_lock, flags);
/* not found */ /* not found */
return -ENOMEM; return -ENOMEM;
......
...@@ -218,6 +218,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," ...@@ -218,6 +218,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
"{Intel, LPT}," "{Intel, LPT},"
"{Intel, LPT_LP}," "{Intel, LPT_LP},"
"{Intel, WPT_LP}," "{Intel, WPT_LP},"
"{Intel, SPT},"
"{Intel, HPT}," "{Intel, HPT},"
"{Intel, PBG}," "{Intel, PBG},"
"{Intel, SCH}," "{Intel, SCH},"
...@@ -1998,6 +1999,9 @@ static const struct pci_device_id azx_ids[] = { ...@@ -1998,6 +1999,9 @@ static const struct pci_device_id azx_ids[] = {
/* Wildcat Point-LP */ /* Wildcat Point-LP */
{ PCI_DEVICE(0x8086, 0x9ca0), { PCI_DEVICE(0x8086, 0x9ca0),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
/* Sunrise Point */
{ PCI_DEVICE(0x8086, 0xa170),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
/* Haswell */ /* Haswell */
{ PCI_DEVICE(0x8086, 0x0a0c), { PCI_DEVICE(0x8086, 0x0a0c),
.driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment