Merge branch 'topic/pcm-indirect-fixes' into for-next
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
commit
70f7922c25
|
@ -129,7 +129,7 @@ static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
|
|||
runtime->avail = 0;
|
||||
else
|
||||
runtime->avail = runtime->buffer_size;
|
||||
runtime->buffer = kvmalloc(runtime->buffer_size, GFP_KERNEL);
|
||||
runtime->buffer = kvzalloc(runtime->buffer_size, GFP_KERNEL);
|
||||
if (!runtime->buffer) {
|
||||
kfree(runtime);
|
||||
return -ENOMEM;
|
||||
|
@ -655,7 +655,7 @@ static int resize_runtime_buffer(struct snd_rawmidi_runtime *runtime,
|
|||
if (params->avail_min < 1 || params->avail_min > params->buffer_size)
|
||||
return -EINVAL;
|
||||
if (params->buffer_size != runtime->buffer_size) {
|
||||
newbuf = kvmalloc(params->buffer_size, GFP_KERNEL);
|
||||
newbuf = kvzalloc(params->buffer_size, GFP_KERNEL);
|
||||
if (!newbuf)
|
||||
return -ENOMEM;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
|
|
|
@ -146,7 +146,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_decouple);
|
|||
*/
|
||||
void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *stream)
|
||||
{
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL, 0, AZX_PPLCCTL_RUN);
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL,
|
||||
AZX_PPLCCTL_RUN, AZX_PPLCCTL_RUN);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_link_stream_start);
|
||||
|
||||
|
@ -171,7 +172,8 @@ void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *stream)
|
|||
|
||||
snd_hdac_ext_link_stream_clear(stream);
|
||||
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL, 0, AZX_PPLCCTL_STRST);
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL,
|
||||
AZX_PPLCCTL_STRST, AZX_PPLCCTL_STRST);
|
||||
udelay(3);
|
||||
timeout = 50;
|
||||
do {
|
||||
|
@ -242,7 +244,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_link_set_stream_id);
|
|||
void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
|
||||
int stream)
|
||||
{
|
||||
snd_hdac_updatew(link->ml_addr, AZX_REG_ML_LOSIDV, 0, (1 << stream));
|
||||
snd_hdac_updatew(link->ml_addr, AZX_REG_ML_LOSIDV, (1 << stream), 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_link_clear_stream_id);
|
||||
|
||||
|
@ -415,7 +417,6 @@ void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *bus,
|
|||
bool enable, int index)
|
||||
{
|
||||
u32 mask = 0;
|
||||
u32 register_mask = 0;
|
||||
|
||||
if (!bus->spbcap) {
|
||||
dev_err(bus->dev, "Address of SPB capability is NULL\n");
|
||||
|
@ -424,12 +425,8 @@ void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *bus,
|
|||
|
||||
mask |= (1 << index);
|
||||
|
||||
register_mask = readl(bus->spbcap + AZX_REG_SPB_SPBFCCTL);
|
||||
|
||||
mask |= register_mask;
|
||||
|
||||
if (enable)
|
||||
snd_hdac_updatel(bus->spbcap, AZX_REG_SPB_SPBFCCTL, 0, mask);
|
||||
snd_hdac_updatel(bus->spbcap, AZX_REG_SPB_SPBFCCTL, mask, mask);
|
||||
else
|
||||
snd_hdac_updatel(bus->spbcap, AZX_REG_SPB_SPBFCCTL, mask, 0);
|
||||
}
|
||||
|
@ -503,7 +500,6 @@ void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
|
|||
bool enable, int index)
|
||||
{
|
||||
u32 mask = 0;
|
||||
u32 register_mask = 0;
|
||||
|
||||
if (!bus->drsmcap) {
|
||||
dev_err(bus->dev, "Address of DRSM capability is NULL\n");
|
||||
|
@ -512,12 +508,8 @@ void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
|
|||
|
||||
mask |= (1 << index);
|
||||
|
||||
register_mask = readl(bus->drsmcap + AZX_REG_SPB_SPBFCCTL);
|
||||
|
||||
mask |= register_mask;
|
||||
|
||||
if (enable)
|
||||
snd_hdac_updatel(bus->drsmcap, AZX_REG_DRSM_CTL, 0, mask);
|
||||
snd_hdac_updatel(bus->drsmcap, AZX_REG_DRSM_CTL, mask, mask);
|
||||
else
|
||||
snd_hdac_updatel(bus->drsmcap, AZX_REG_DRSM_CTL, mask, 0);
|
||||
}
|
||||
|
|
|
@ -500,7 +500,8 @@ static const struct snd_pcm_hardware hal2_pcm_hw = {
|
|||
.info = (SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER),
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_BE,
|
||||
.rates = SNDRV_PCM_RATE_8000_48000,
|
||||
.rate_min = 8000,
|
||||
|
@ -563,6 +564,8 @@ static int hal2_playback_prepare(struct snd_pcm_substream *substream)
|
|||
dac->sample_rate = hal2_compute_rate(dac, runtime->rate);
|
||||
memset(&dac->pcm_indirect, 0, sizeof(dac->pcm_indirect));
|
||||
dac->pcm_indirect.hw_buffer_size = H2_BUF_SIZE;
|
||||
dac->pcm_indirect.hw_queue_size = H2_BUF_SIZE / 2;
|
||||
dac->pcm_indirect.hw_io = dac->buffer_dma;
|
||||
dac->pcm_indirect.sw_buffer_size = snd_pcm_lib_buffer_bytes(substream);
|
||||
dac->substream = substream;
|
||||
hal2_setup_dac(hal2);
|
||||
|
@ -575,9 +578,6 @@ static int hal2_playback_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
hal2->dac.pcm_indirect.hw_io = hal2->dac.buffer_dma;
|
||||
hal2->dac.pcm_indirect.hw_data = 0;
|
||||
substream->ops->ack(substream);
|
||||
hal2_start_dac(hal2);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
|
@ -615,7 +615,6 @@ static int hal2_playback_ack(struct snd_pcm_substream *substream)
|
|||
struct snd_hal2 *hal2 = snd_pcm_substream_chip(substream);
|
||||
struct hal2_codec *dac = &hal2->dac;
|
||||
|
||||
dac->pcm_indirect.hw_queue_size = H2_BUF_SIZE / 2;
|
||||
return snd_pcm_indirect_playback_transfer(substream,
|
||||
&dac->pcm_indirect,
|
||||
hal2_playback_transfer);
|
||||
|
@ -655,6 +654,7 @@ static int hal2_capture_prepare(struct snd_pcm_substream *substream)
|
|||
memset(&adc->pcm_indirect, 0, sizeof(adc->pcm_indirect));
|
||||
adc->pcm_indirect.hw_buffer_size = H2_BUF_SIZE;
|
||||
adc->pcm_indirect.hw_queue_size = H2_BUF_SIZE / 2;
|
||||
adc->pcm_indirect.hw_io = adc->buffer_dma;
|
||||
adc->pcm_indirect.sw_buffer_size = snd_pcm_lib_buffer_bytes(substream);
|
||||
adc->substream = substream;
|
||||
hal2_setup_adc(hal2);
|
||||
|
@ -667,9 +667,6 @@ static int hal2_capture_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
hal2->adc.pcm_indirect.hw_io = hal2->adc.buffer_dma;
|
||||
hal2->adc.pcm_indirect.hw_data = 0;
|
||||
printk(KERN_DEBUG "buffer_dma %x\n", hal2->adc.buffer_dma);
|
||||
hal2_start_adc(hal2);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
|
|
|
@ -1443,7 +1443,8 @@ static const struct snd_pcm_hardware snd_cs46xx_playback =
|
|||
.info = (SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER /*|*/
|
||||
/*SNDRV_PCM_INFO_RESUME*/),
|
||||
/*SNDRV_PCM_INFO_RESUME*/ |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 |
|
||||
SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE |
|
||||
SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE),
|
||||
|
@ -1465,7 +1466,8 @@ static const struct snd_pcm_hardware snd_cs46xx_capture =
|
|||
.info = (SNDRV_PCM_INFO_MMAP |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER /*|*/
|
||||
/*SNDRV_PCM_INFO_RESUME*/),
|
||||
/*SNDRV_PCM_INFO_RESUME*/ |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
|
||||
.rate_min = 5500,
|
||||
|
|
|
@ -1753,7 +1753,8 @@ static const struct snd_pcm_hardware snd_emu10k1_fx8010_playback =
|
|||
{
|
||||
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_RESUME |
|
||||
/* SNDRV_PCM_INFO_MMAP_VALID | */ SNDRV_PCM_INFO_PAUSE),
|
||||
/* SNDRV_PCM_INFO_MMAP_VALID | */ SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rates = SNDRV_PCM_RATE_48000,
|
||||
.rate_min = 48000,
|
||||
|
|
|
@ -3935,7 +3935,8 @@ void snd_hda_bus_reset_codecs(struct hda_bus *bus)
|
|||
|
||||
list_for_each_codec(codec, bus) {
|
||||
/* FIXME: maybe a better way needed for forced reset */
|
||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||
if (current_work() != &codec->jackpoll_work.work)
|
||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||
#ifdef CONFIG_PM
|
||||
if (hda_codec_is_power_on(codec)) {
|
||||
hda_call_codec_suspend(codec);
|
||||
|
|
|
@ -319,7 +319,8 @@ static const struct snd_pcm_hardware snd_rme32_spdif_info = {
|
|||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_START),
|
||||
SNDRV_PCM_INFO_SYNC_START |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE),
|
||||
.rates = (SNDRV_PCM_RATE_32000 |
|
||||
|
@ -346,7 +347,8 @@ static const struct snd_pcm_hardware snd_rme32_adat_info =
|
|||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_START),
|
||||
SNDRV_PCM_INFO_SYNC_START |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats= SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rates = (SNDRV_PCM_RATE_44100 |
|
||||
SNDRV_PCM_RATE_48000),
|
||||
|
@ -370,7 +372,8 @@ static const struct snd_pcm_hardware snd_rme32_spdif_fd_info = {
|
|||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_START),
|
||||
SNDRV_PCM_INFO_SYNC_START |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE),
|
||||
.rates = (SNDRV_PCM_RATE_32000 |
|
||||
|
@ -397,7 +400,8 @@ static const struct snd_pcm_hardware snd_rme32_adat_fd_info =
|
|||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_SYNC_START),
|
||||
SNDRV_PCM_INFO_SYNC_START |
|
||||
SNDRV_PCM_INFO_SYNC_APPLPTR),
|
||||
.formats= SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.rates = (SNDRV_PCM_RATE_44100 |
|
||||
SNDRV_PCM_RATE_48000),
|
||||
|
@ -1104,16 +1108,6 @@ snd_rme32_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
snd_pcm_trigger_done(s, substream);
|
||||
}
|
||||
|
||||
/* prefill playback buffer */
|
||||
if (cmd == SNDRV_PCM_TRIGGER_START && rme32->fullduplex_mode) {
|
||||
snd_pcm_group_for_each_entry(s, substream) {
|
||||
if (s == rme32->playback_substream) {
|
||||
s->ops->ack(s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
if (rme32->running && ! RME32_ISWORKING(rme32))
|
||||
|
|
Loading…
Reference in New Issue