Messages in this thread Patch in this message | | | Date | Sun, 23 Nov 2003 10:53:23 +1100 | Subject | [I810_AUDIO] 8/x: Remove divides on playback | From | Herbert Xu <> |
| |
This patch removes a couple of divides on the playback path. -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt Index: kernel-source-2.4/drivers/sound/i810_audio.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.4/drivers/sound/i810_audio.c,v retrieving revision 1.15 diff -u -r1.15 i810_audio.c --- kernel-source-2.4/drivers/sound/i810_audio.c 22 Nov 2003 23:51:09 -0000 1.15 +++ kernel-source-2.4/drivers/sound/i810_audio.c 22 Nov 2003 23:51:29 -0000 @@ -100,6 +100,7 @@ #include <linux/smp_lock.h> #include <linux/ac97_codec.h> #include <linux/wrapper.h> +#include <linux/bitops.h> #include <asm/uaccess.h> #include <asm/hardirq.h> @@ -990,6 +991,7 @@ dmabuf->numfrag = SG_LEN; dmabuf->fragsize = dmabuf->dmasize/dmabuf->numfrag; dmabuf->fragsamples = dmabuf->fragsize >> 1; + dmabuf->fragshift = ffs(dmabuf->fragsize) - 1; dmabuf->userfragsize = dmabuf->ossfragsize; dmabuf->userfrags = dmabuf->dmasize/dmabuf->ossfragsize; @@ -997,16 +999,12 @@ if(dmabuf->ossmaxfrags == 4) { fragint = 8; - dmabuf->fragshift = 2; } else if (dmabuf->ossmaxfrags == 8) { fragint = 4; - dmabuf->fragshift = 3; } else if (dmabuf->ossmaxfrags == 16) { fragint = 2; - dmabuf->fragshift = 4; } else { fragint = 1; - dmabuf->fragshift = 5; } /* * Now set up the ring @@ -1103,7 +1101,7 @@ /* MASKP2(swptr, fragsize) - 1 is the tail of our transfer */ x = MODULOP2(MASKP2(dmabuf->swptr, fragsize) - 1, dmabuf->dmasize); - x /= fragsize; + x >>= dmabuf->fragshift; outb(x, port + OFF_LVI); } @@ -1697,7 +1695,7 @@ goto ret; } - swptr = (swptr + cnt) % dmabuf->dmasize; + swptr = MODULOP2(swptr + cnt, dmabuf->dmasize); spin_lock_irqsave(&state->card->lock, flags); if (PM_SUSPENDED(card)) { | |