mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 18:55:12 +00:00
Revert "ALSA: emu10k1 - delay the PCM interrupts (add pcm_irq_delay parameter)"
This workaround fails to address the underlying problem, which is
actually wholly self-made. Subsequent patches will fix it.
This reverts commit 56385a12d9
.
Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230517174256.3657060-2-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
af7fd0276e
commit
1e5323bd77
@ -1670,7 +1670,6 @@ struct snd_emu10k1 {
|
||||
unsigned int address_mode; /* address mode */
|
||||
unsigned long dma_mask; /* PCI DMA mask */
|
||||
bool iommu_workaround; /* IOMMU workaround needed */
|
||||
unsigned int delay_pcm_irq; /* in samples */
|
||||
int max_cache_pages; /* max memory size / PAGE_SIZE */
|
||||
struct snd_dma_buffer silent_page; /* silent page */
|
||||
struct snd_dma_buffer ptb_pages; /* page table pages */
|
||||
|
@ -1605,10 +1605,6 @@ static int snd_pcm_do_pause(struct snd_pcm_substream *substream,
|
||||
{
|
||||
if (substream->runtime->trigger_master != substream)
|
||||
return 0;
|
||||
/* some drivers might use hw_ptr to recover from the pause -
|
||||
update the hw_ptr now */
|
||||
if (pause_pushed(state))
|
||||
snd_pcm_update_hw_ptr(substream);
|
||||
/* The jiffies check in snd_pcm_update_hw_ptr*() is done by
|
||||
* a delta between the current jiffies, this gives a large enough
|
||||
* delta, effectively to skip the check once.
|
||||
|
@ -34,7 +34,6 @@ static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64};
|
||||
static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128};
|
||||
static bool enable_ir[SNDRV_CARDS];
|
||||
static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
|
||||
static uint delay_pcm_irq[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
|
||||
|
||||
module_param_array(index, int, NULL, 0444);
|
||||
MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard.");
|
||||
@ -56,8 +55,6 @@ module_param_array(enable_ir, bool, NULL, 0444);
|
||||
MODULE_PARM_DESC(enable_ir, "Enable IR.");
|
||||
module_param_array(subsystem, uint, NULL, 0444);
|
||||
MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
|
||||
module_param_array(delay_pcm_irq, uint, NULL, 0444);
|
||||
MODULE_PARM_DESC(delay_pcm_irq, "Delay PCM interrupt by specified number of samples (default 0).");
|
||||
/*
|
||||
* Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400
|
||||
*/
|
||||
@ -103,7 +100,6 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci,
|
||||
enable_ir[dev], subsystem[dev]);
|
||||
if (err < 0)
|
||||
return err;
|
||||
emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f;
|
||||
err = snd_emu10k1_pcm(emu, 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
@ -290,7 +290,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
|
||||
evoice->epcm->ccca_start_addr = start_addr + ccis;
|
||||
if (extra) {
|
||||
start_addr += ccis;
|
||||
end_addr += ccis + emu->delay_pcm_irq;
|
||||
end_addr += ccis;
|
||||
}
|
||||
}
|
||||
if (stereo && !extra) {
|
||||
@ -315,9 +315,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
|
||||
snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
|
||||
// Stereo slaves don't need to have the addresses set, but it doesn't hurt
|
||||
snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
|
||||
snd_emu10k1_ptr_write(emu, PSST, voice,
|
||||
(start_addr + (extra ? emu->delay_pcm_irq : 0)) |
|
||||
(send_amount[2] << 24));
|
||||
snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
|
||||
if (emu->card_capabilities->emu_model)
|
||||
pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
|
||||
else
|
||||
@ -647,23 +645,6 @@ static void snd_emu10k1_playback_set_stopped(struct snd_emu10k1 *emu,
|
||||
epcm->running = 0;
|
||||
}
|
||||
|
||||
static inline void snd_emu10k1_playback_mangle_extra(struct snd_emu10k1 *emu,
|
||||
struct snd_emu10k1_pcm *epcm,
|
||||
struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_runtime *runtime)
|
||||
{
|
||||
unsigned int ptr, period_pos;
|
||||
|
||||
/* try to sychronize the current position for the interrupt
|
||||
source voice */
|
||||
period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt;
|
||||
period_pos %= runtime->period_size;
|
||||
ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->extra->number);
|
||||
ptr &= ~0x00ffffff;
|
||||
ptr |= epcm->ccca_start_addr + period_pos;
|
||||
snd_emu10k1_ptr_write(emu, CCCA, epcm->extra->number, ptr);
|
||||
}
|
||||
|
||||
static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd)
|
||||
{
|
||||
@ -686,8 +667,6 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
||||
fallthrough;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
if (cmd == SNDRV_PCM_TRIGGER_PAUSE_RELEASE)
|
||||
snd_emu10k1_playback_mangle_extra(emu, epcm, substream, runtime);
|
||||
mix = &emu->pcm_mixer[substream->number];
|
||||
snd_emu10k1_playback_unmute_voice(emu, epcm->voices[0], true, mix);
|
||||
snd_emu10k1_playback_unmute_voice(emu, epcm->voices[1], false, mix);
|
||||
|
@ -315,10 +315,8 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst
|
||||
if (snd_BUG_ON(!hdr))
|
||||
return NULL;
|
||||
|
||||
idx = runtime->period_size >= runtime->buffer_size ?
|
||||
(emu->delay_pcm_irq * 2) : 0;
|
||||
mutex_lock(&hdr->block_mutex);
|
||||
blk = search_empty(emu, runtime->dma_bytes + idx);
|
||||
blk = search_empty(emu, runtime->dma_bytes);
|
||||
if (blk == NULL) {
|
||||
mutex_unlock(&hdr->block_mutex);
|
||||
return NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user