Commit fa285190 authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/oss' into for-linus

* topic/oss:
  ALSA: allocation may fail in	snd_pcm_oss_change_params()
  sound: vwsnd: Fix setting of cfgval and ctlval in li_setup_dma()
  sound: fix OSS MIDI output data loss
parents 9cd9f427 cbbb0570
...@@ -1043,10 +1043,15 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) ...@@ -1043,10 +1043,15 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)
runtime->oss.channels = params_channels(params); runtime->oss.channels = params_channels(params);
runtime->oss.rate = params_rate(params); runtime->oss.rate = params_rate(params);
runtime->oss.params = 0;
runtime->oss.prepare = 1;
vfree(runtime->oss.buffer); vfree(runtime->oss.buffer);
runtime->oss.buffer = vmalloc(runtime->oss.period_bytes); runtime->oss.buffer = vmalloc(runtime->oss.period_bytes);
if (!runtime->oss.buffer) {
err = -ENOMEM;
goto failure;
}
runtime->oss.params = 0;
runtime->oss.prepare = 1;
runtime->oss.buffer_used = 0; runtime->oss.buffer_used = 0;
if (runtime->dma_area) if (runtime->dma_area)
snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes)); snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes));
......
...@@ -127,15 +127,16 @@ static void midi_poll(unsigned long dummy) ...@@ -127,15 +127,16 @@ static void midi_poll(unsigned long dummy)
for (dev = 0; dev < num_midis; dev++) for (dev = 0; dev < num_midis; dev++)
if (midi_devs[dev] != NULL && midi_out_buf[dev] != NULL) if (midi_devs[dev] != NULL && midi_out_buf[dev] != NULL)
{ {
int ok = 1; while (DATA_AVAIL(midi_out_buf[dev]))
while (DATA_AVAIL(midi_out_buf[dev]) && ok)
{ {
int ok;
int c = midi_out_buf[dev]->queue[midi_out_buf[dev]->head]; int c = midi_out_buf[dev]->queue[midi_out_buf[dev]->head];
spin_unlock_irqrestore(&lock,flags);/* Give some time to others */ spin_unlock_irqrestore(&lock,flags);/* Give some time to others */
ok = midi_devs[dev]->outputc(dev, c); ok = midi_devs[dev]->outputc(dev, c);
spin_lock_irqsave(&lock, flags); spin_lock_irqsave(&lock, flags);
if (!ok)
break;
midi_out_buf[dev]->head = (midi_out_buf[dev]->head + 1) % MAX_QUEUE_SIZE; midi_out_buf[dev]->head = (midi_out_buf[dev]->head + 1) % MAX_QUEUE_SIZE;
midi_out_buf[dev]->len--; midi_out_buf[dev]->len--;
} }
......
...@@ -628,7 +628,7 @@ static void li_setup_dma(dma_chan_t *chan, ...@@ -628,7 +628,7 @@ static void li_setup_dma(dma_chan_t *chan,
ASSERT(!(buffer_paddr & 0xFF)); ASSERT(!(buffer_paddr & 0xFF));
chan->baseval = (buffer_paddr >> 8) | 1 << (37 - 8); chan->baseval = (buffer_paddr >> 8) | 1 << (37 - 8);
chan->cfgval = (!LI_CCFG_LOCK | chan->cfgval = ((chan->cfgval & ~LI_CCFG_LOCK) |
SHIFT_FIELD(desc->ad1843_slot, LI_CCFG_SLOT) | SHIFT_FIELD(desc->ad1843_slot, LI_CCFG_SLOT) |
desc->direction | desc->direction |
mode | mode |
...@@ -638,9 +638,9 @@ static void li_setup_dma(dma_chan_t *chan, ...@@ -638,9 +638,9 @@ static void li_setup_dma(dma_chan_t *chan,
tmask = 13 - fragshift; /* See Lithium DMA Notes above. */ tmask = 13 - fragshift; /* See Lithium DMA Notes above. */
ASSERT(size >= 2 && size <= 7); ASSERT(size >= 2 && size <= 7);
ASSERT(tmask >= 1 && tmask <= 7); ASSERT(tmask >= 1 && tmask <= 7);
chan->ctlval = (!LI_CCTL_RESET | chan->ctlval = ((chan->ctlval & ~LI_CCTL_RESET) |
SHIFT_FIELD(size, LI_CCTL_SIZE) | SHIFT_FIELD(size, LI_CCTL_SIZE) |
!LI_CCTL_DMA_ENABLE | (chan->ctlval & ~LI_CCTL_DMA_ENABLE) |
SHIFT_FIELD(tmask, LI_CCTL_TMASK) | SHIFT_FIELD(tmask, LI_CCTL_TMASK) |
SHIFT_FIELD(0, LI_CCTL_TPTR)); SHIFT_FIELD(0, LI_CCTL_TPTR));
......
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