fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / sound / oss / msnd.c
index 6ccdd09..ba38d62 100644 (file)
@@ -24,7 +24,6 @@
  *
  ********************************************************************/
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -33,6 +32,8 @@
 #include <linux/delay.h>
 #include <linux/mm.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
+
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <linux/spinlock.h>
@@ -46,7 +47,7 @@
 static multisound_dev_t                *devs[MSND_MAX_DEVS];
 static int                     num_devs;
 
-int __init msnd_register(multisound_dev_t *dev)
+int msnd_register(multisound_dev_t *dev)
 {
        int i;
 
@@ -79,31 +80,12 @@ void msnd_unregister(multisound_dev_t *dev)
        --num_devs;
 }
 
-int msnd_get_num_devs(void)
-{
-       return num_devs;
-}
-
-multisound_dev_t *msnd_get_dev(int j)
-{
-       int i;
-
-       for (i = 0; i < MSND_MAX_DEVS && j; ++i)
-               if (devs[i] != NULL)
-                       --j;
-
-       if (i == MSND_MAX_DEVS || j != 0)
-               return NULL;
-
-       return devs[i];
-}
-
-void msnd_init_queue(unsigned long base, int start, int size)
+void msnd_init_queue(void __iomem *base, int start, int size)
 {
-       isa_writew(PCTODSP_BASED(start), base + JQS_wStart);
-       isa_writew(PCTODSP_OFFSET(size) - 1, base + JQS_wSize);
-       isa_writew(0, base + JQS_wHead);
-       isa_writew(0, base + JQS_wTail);
+       writew(PCTODSP_BASED(start), base + JQS_wStart);
+       writew(PCTODSP_OFFSET(size) - 1, base + JQS_wSize);
+       writew(0, base + JQS_wHead);
+       writew(0, base + JQS_wTail);
 }
 
 void msnd_fifo_init(msnd_fifo *f)
@@ -113,10 +95,8 @@ void msnd_fifo_init(msnd_fifo *f)
 
 void msnd_fifo_free(msnd_fifo *f)
 {
-       if (f->data) {
-               vfree(f->data);
-               f->data = NULL;
-       }
+       vfree(f->data);
+       f->data = NULL;
 }
 
 int msnd_fifo_alloc(msnd_fifo *f, size_t n)
@@ -139,6 +119,37 @@ void msnd_fifo_make_empty(msnd_fifo *f)
        f->len = f->tail = f->head = 0;
 }
 
+int msnd_fifo_write_io(msnd_fifo *f, char __iomem *buf, size_t len)
+{
+       int count = 0;
+
+       while ((count < len) && (f->len != f->n)) {
+
+               int nwritten;
+
+               if (f->head <= f->tail) {
+                       nwritten = len - count;
+                       if (nwritten > f->n - f->tail)
+                               nwritten = f->n - f->tail;
+               }
+               else {
+                       nwritten = f->head - f->tail;
+                       if (nwritten > len - count)
+                               nwritten = len - count;
+               }
+
+               memcpy_fromio(f->data + f->tail, buf, nwritten);
+
+               count += nwritten;
+               buf += nwritten;
+               f->len += nwritten;
+               f->tail += nwritten;
+               f->tail %= f->n;
+       }
+
+       return count;
+}
+
 int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len)
 {
        int count = 0;
@@ -158,7 +169,7 @@ int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len)
                                nwritten = len - count;
                }
 
-               isa_memcpy_fromio(f->data + f->tail, (unsigned long) buf, nwritten);
+               memcpy(f->data + f->tail, buf, nwritten);
 
                count += nwritten;
                buf += nwritten;
@@ -170,6 +181,37 @@ int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len)
        return count;
 }
 
+int msnd_fifo_read_io(msnd_fifo *f, char __iomem *buf, size_t len)
+{
+       int count = 0;
+
+       while ((count < len) && (f->len > 0)) {
+
+               int nread;
+
+               if (f->tail <= f->head) {
+                       nread = len - count;
+                       if (nread > f->n - f->head)
+                               nread = f->n - f->head;
+               }
+               else {
+                       nread = f->tail - f->head;
+                       if (nread > len - count)
+                               nread = len - count;
+               }
+
+               memcpy_toio(buf, f->data + f->head, nread);
+
+               count += nread;
+               buf += nread;
+               f->len -= nread;
+               f->head += nread;
+               f->head %= f->n;
+       }
+
+       return count;
+}
+
 int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len)
 {
        int count = 0;
@@ -189,7 +231,7 @@ int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len)
                                nread = len - count;
                }
 
-               isa_memcpy_toio((unsigned long) buf, f->data + f->head, nread);
+               memcpy(buf, f->data + f->head, nread);
 
                count += nread;
                buf += nread;
@@ -201,25 +243,25 @@ int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len)
        return count;
 }
 
-int msnd_wait_TXDE(multisound_dev_t *dev)
+static int msnd_wait_TXDE(multisound_dev_t *dev)
 {
        register unsigned int io = dev->io;
        register int timeout = 1000;
     
        while(timeout-- > 0)
-               if (inb(io + HP_ISR) & HPISR_TXDE)
+               if (msnd_inb(io + HP_ISR) & HPISR_TXDE)
                        return 0;
 
        return -EIO;
 }
 
-int msnd_wait_HC0(multisound_dev_t *dev)
+static int msnd_wait_HC0(multisound_dev_t *dev)
 {
        register unsigned int io = dev->io;
        register int timeout = 1000;
 
        while(timeout-- > 0)
-               if (!(inb(io + HP_CVR) & HPCVR_HC))
+               if (!(msnd_inb(io + HP_CVR) & HPCVR_HC))
                        return 0;
 
        return -EIO;
@@ -231,7 +273,7 @@ int msnd_send_dsp_cmd(multisound_dev_t *dev, BYTE cmd)
 
        spin_lock_irqsave(&dev->lock, flags);
        if (msnd_wait_HC0(dev) == 0) {
-               outb(cmd, dev->io + HP_CVR);
+               msnd_outb(cmd, dev->io + HP_CVR);
                spin_unlock_irqrestore(&dev->lock, flags);
                return 0;
        }
@@ -248,9 +290,9 @@ int msnd_send_word(multisound_dev_t *dev, unsigned char high,
        register unsigned int io = dev->io;
 
        if (msnd_wait_TXDE(dev) == 0) {
-               outb(high, io + HP_TXH);
-               outb(mid, io + HP_TXM);
-               outb(low, io + HP_TXL);
+               msnd_outb(high, io + HP_TXH);
+               msnd_outb(mid, io + HP_TXM);
+               msnd_outb(low, io + HP_TXL);
                return 0;
        }
 
@@ -272,8 +314,8 @@ int msnd_upload_host(multisound_dev_t *dev, char *bin, int len)
                if (msnd_send_word(dev, bin[i], bin[i + 1], bin[i + 2]) != 0)
                        return -EIO;
 
-       inb(dev->io + HP_RXL);
-       inb(dev->io + HP_CVR);
+       msnd_inb(dev->io + HP_RXL);
+       msnd_inb(dev->io + HP_CVR);
 
        return 0;
 }
@@ -289,11 +331,11 @@ int msnd_enable_irq(multisound_dev_t *dev)
 
        spin_lock_irqsave(&dev->lock, flags);
        if (msnd_wait_TXDE(dev) == 0) {
-               outb(inb(dev->io + HP_ICR) | HPICR_TREQ, dev->io + HP_ICR);
+               msnd_outb(msnd_inb(dev->io + HP_ICR) | HPICR_TREQ, dev->io + HP_ICR);
                if (dev->type == msndClassic)
-                       outb(dev->irqid, dev->io + HP_IRQM);
-               outb(inb(dev->io + HP_ICR) & ~HPICR_TREQ, dev->io + HP_ICR);
-               outb(inb(dev->io + HP_ICR) | HPICR_RREQ, dev->io + HP_ICR);
+                       msnd_outb(dev->irqid, dev->io + HP_IRQM);
+               msnd_outb(msnd_inb(dev->io + HP_ICR) & ~HPICR_TREQ, dev->io + HP_ICR);
+               msnd_outb(msnd_inb(dev->io + HP_ICR) | HPICR_RREQ, dev->io + HP_ICR);
                enable_irq(dev->irq);
                msnd_init_queue(dev->DSPQ, dev->dspq_data_buff, dev->dspq_buff_size);
                spin_unlock_irqrestore(&dev->lock, flags);
@@ -320,9 +362,9 @@ int msnd_disable_irq(multisound_dev_t *dev)
 
        spin_lock_irqsave(&dev->lock, flags);
        if (msnd_wait_TXDE(dev) == 0) {
-               outb(inb(dev->io + HP_ICR) & ~HPICR_RREQ, dev->io + HP_ICR);
+               msnd_outb(msnd_inb(dev->io + HP_ICR) & ~HPICR_RREQ, dev->io + HP_ICR);
                if (dev->type == msndClassic)
-                       outb(HPIRQ_NONE, dev->io + HP_IRQM);
+                       msnd_outb(HPIRQ_NONE, dev->io + HP_IRQM);
                disable_irq(dev->irq);
                spin_unlock_irqrestore(&dev->lock, flags);
                return 0;
@@ -337,8 +379,6 @@ int msnd_disable_irq(multisound_dev_t *dev)
 #ifndef LINUX20
 EXPORT_SYMBOL(msnd_register);
 EXPORT_SYMBOL(msnd_unregister);
-EXPORT_SYMBOL(msnd_get_num_devs);
-EXPORT_SYMBOL(msnd_get_dev);
 
 EXPORT_SYMBOL(msnd_init_queue);
 
@@ -346,11 +386,11 @@ EXPORT_SYMBOL(msnd_fifo_init);
 EXPORT_SYMBOL(msnd_fifo_free);
 EXPORT_SYMBOL(msnd_fifo_alloc);
 EXPORT_SYMBOL(msnd_fifo_make_empty);
+EXPORT_SYMBOL(msnd_fifo_write_io);
+EXPORT_SYMBOL(msnd_fifo_read_io);
 EXPORT_SYMBOL(msnd_fifo_write);
 EXPORT_SYMBOL(msnd_fifo_read);
 
-EXPORT_SYMBOL(msnd_wait_TXDE);
-EXPORT_SYMBOL(msnd_wait_HC0);
 EXPORT_SYMBOL(msnd_send_dsp_cmd);
 EXPORT_SYMBOL(msnd_send_word);
 EXPORT_SYMBOL(msnd_upload_host);