diff options
author | Takashi Iwai <tiwai@suse.de> | 2008-07-30 15:23:06 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-08-25 09:57:43 +0200 |
commit | 5503600a1c5c2c11e14ff428b5d07a1018927bd6 (patch) | |
tree | 80d8dcb53337abb5af9fc4ac3f5ca98b7063c0c0 /sound/pci/via82xx.c | |
parent | a2e3961d0a26870eb23b70edab6814c7f08ce2e0 (diff) | |
download | lwn-5503600a1c5c2c11e14ff428b5d07a1018927bd6.tar.gz lwn-5503600a1c5c2c11e14ff428b5d07a1018927bd6.zip |
ALSA: via82xx - check continuous pages in buffer setup
Check continuous pages in the buffer set up so that the number of
BDL is reduced. Also increased the max buffer size.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/via82xx.c')
-rw-r--r-- | sound/pci/via82xx.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 57e33d7df5fa..1aafe956ee2b 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -313,6 +313,7 @@ struct snd_via_sg_table { } ; #define VIA_TABLE_SIZE 255 +#define VIA_MAX_BUFSIZE (1<<24) struct viadev { unsigned int reg_offset; @@ -456,9 +457,7 @@ static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substre } addr = snd_pcm_sgbuf_get_addr(substream, ofs); ((u32 *)dev->table.area)[idx << 1] = cpu_to_le32(addr); - r = PAGE_SIZE - (ofs % PAGE_SIZE); - if (rest < r) - r = rest; + r = snd_pcm_sgbuf_get_chunk_size(substream, ofs, rest); rest -= r; if (! rest) { if (i == periods - 1) @@ -1147,9 +1146,9 @@ static struct snd_pcm_hardware snd_via82xx_hw = .rate_max = 48000, .channels_min = 1, .channels_max = 2, - .buffer_bytes_max = 128 * 1024, + .buffer_bytes_max = VIA_MAX_BUFSIZE, .period_bytes_min = 32, - .period_bytes_max = 128 * 1024, + .period_bytes_max = VIA_MAX_BUFSIZE / 2, .periods_min = 2, .periods_max = VIA_TABLE_SIZE / 2, .fifo_size = 0, @@ -1403,7 +1402,7 @@ static int __devinit snd_via8233_pcm_new(struct via82xx *chip) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(chip->pci), - 64*1024, 128*1024); + 64*1024, VIA_MAX_BUFSIZE); /* PCM #1: multi-channel playback and 2nd capture */ err = snd_pcm_new(chip->card, chip->card->shortname, 1, 1, 1, &pcm); @@ -1421,7 +1420,7 @@ static int __devinit snd_via8233_pcm_new(struct via82xx *chip) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(chip->pci), - 64*1024, 128*1024); + 64*1024, VIA_MAX_BUFSIZE); return 0; } @@ -1455,7 +1454,7 @@ static int __devinit snd_via8233a_pcm_new(struct via82xx *chip) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(chip->pci), - 64*1024, 128*1024); + 64*1024, VIA_MAX_BUFSIZE); /* SPDIF supported? */ if (! ac97_can_spdif(chip->ac97)) @@ -1474,7 +1473,7 @@ static int __devinit snd_via8233a_pcm_new(struct via82xx *chip) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(chip->pci), - 64*1024, 128*1024) + 64*1024, VIA_MAX_BUFSIZE); return 0; } @@ -1504,7 +1503,7 @@ static int __devinit snd_via686_pcm_new(struct via82xx *chip) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(chip->pci), - 64*1024, 128*1024); + 64*1024, VIA_MAX_BUFSIZE); return 0; } |