X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Foss%2Fmsnd.c;h=ba38d6200099f883f3f188d6e9255bf07afa80b6;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=deb126d8f3baea7f07638a3116632b15f24c73e8;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/sound/oss/msnd.c b/sound/oss/msnd.c index deb126d8f..ba38d6200 100644 --- a/sound/oss/msnd.c +++ b/sound/oss/msnd.c @@ -24,7 +24,6 @@ * ********************************************************************/ -#include #include #include #include @@ -33,6 +32,8 @@ #include #include #include +#include + #include #include #include @@ -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; @@ -59,9 +60,6 @@ int __init msnd_register(multisound_dev_t *dev) devs[i] = dev; ++num_devs; - - MOD_INC_USE_COUNT; - return 0; } @@ -80,35 +78,14 @@ void msnd_unregister(multisound_dev_t *dev) devs[i] = NULL; --num_devs; - - MOD_DEC_USE_COUNT; } -int msnd_get_num_devs(void) +void msnd_init_queue(void __iomem *base, int start, int size) { - 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) -{ - 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) @@ -118,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) @@ -144,12 +119,40 @@ void msnd_fifo_make_empty(msnd_fifo *f) f->len = f->tail = f->head = 0; } -int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len, int user) +int msnd_fifo_write_io(msnd_fifo *f, char __iomem *buf, size_t len) { int count = 0; - if (f->len == f->n) - return 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; while ((count < len) && (f->len != f->n)) { @@ -166,11 +169,7 @@ int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len, int user) nwritten = len - count; } - if (user) { - if (copy_from_user(f->data + f->tail, buf, nwritten)) - return -EFAULT; - } else - isa_memcpy_fromio(f->data + f->tail, (unsigned long) buf, nwritten); + memcpy(f->data + f->tail, buf, nwritten); count += nwritten; buf += nwritten; @@ -182,12 +181,40 @@ int msnd_fifo_write(msnd_fifo *f, const char *buf, size_t len, int user) return count; } -int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len, int user) +int msnd_fifo_read_io(msnd_fifo *f, char __iomem *buf, size_t len) { int count = 0; - if (f->len == 0) - return f->len; + 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; while ((count < len) && (f->len > 0)) { @@ -204,11 +231,7 @@ int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len, int user) nread = len - count; } - if (user) { - if (copy_to_user(buf, f->data + f->head, nread)) - return -EFAULT; - } else - isa_memcpy_toio((unsigned long) buf, f->data + f->head, nread); + memcpy(buf, f->data + f->head, nread); count += nread; buf += nread; @@ -220,25 +243,25 @@ int msnd_fifo_read(msnd_fifo *f, char *buf, size_t len, int user) 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; @@ -250,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; } @@ -267,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; } @@ -291,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; } @@ -308,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); @@ -339,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; @@ -356,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); @@ -365,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);