vserver 1.9.5.x5
[linux-2.6.git] / sound / oss / cs4281 / cs4281m.c
index 2f38ae7..5fff9c3 100644 (file)
@@ -111,7 +111,7 @@ static void start_adc(struct cs4281_state *s);
 // rather than 64k as some of the games work more responsively.
 // log base 2( buff sz = 32k).
 static unsigned long defaultorder = 3;
-MODULE_PARM(defaultorder, "i");
+module_param(defaultorder, ulong, 0);
 
 //
 // Turn on/off debugging compilation by commenting out "#define CSDEBUG"
@@ -159,8 +159,8 @@ MODULE_PARM(defaultorder, "i");
 #if CSDEBUG
 static unsigned long cs_debuglevel = 1;        // levels range from 1-9
 static unsigned long cs_debugmask = CS_INIT | CS_ERROR;        // use CS_DBGOUT with various mask values
-MODULE_PARM(cs_debuglevel, "i");
-MODULE_PARM(cs_debugmask, "i");
+module_param(cs_debuglevel, ulong, 0);
+module_param(cs_debugmask, ulong, 0);
 #endif
 #define CS_TRUE        1
 #define CS_FALSE       0
@@ -197,7 +197,7 @@ static const char invalid_magic[] =
 })
 
 //LIST_HEAD(cs4281_devs);
-struct list_head cs4281_devs = { &cs4281_devs, &cs4281_devs };
+static struct list_head cs4281_devs = { &cs4281_devs, &cs4281_devs };
 
 struct cs4281_state; 
 
@@ -221,7 +221,8 @@ struct cs4281_state {
 
        // hardware resources 
        unsigned int pBA0phys, pBA1phys;
-       char *pBA0, *pBA1;
+       char __iomem *pBA0;
+       char __iomem *pBA1;
        unsigned int irq;
 
        // mixer registers 
@@ -1018,7 +1019,7 @@ static void printpipelines(struct cs4281_state *s)
 *  Suspend - save the ac97 regs, mute the outputs and power down the part.  
 *
 ****************************************************************************/
-void cs4281_ac97_suspend(struct cs4281_state *s)
+static void cs4281_ac97_suspend(struct cs4281_state *s)
 {
        int Count,i;
 
@@ -1069,7 +1070,7 @@ void cs4281_ac97_suspend(struct cs4281_state *s)
 *  Resume - power up the part and restore its registers..  
 *
 ****************************************************************************/
-void cs4281_ac97_resume(struct cs4281_state *s)
+static void cs4281_ac97_resume(struct cs4281_state *s)
 {
        int Count,i;
 
@@ -1142,7 +1143,7 @@ HWAC97codec::SavePowerState(void)
 } // SavePowerState
 */
 
-void cs4281_SuspendFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
+static void cs4281_SuspendFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
 {
  /*
  * We need to save the contents of the BASIC FIFO Registers.
@@ -1150,7 +1151,7 @@ void cs4281_SuspendFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
        pl->u32FCRn_Save = readl(s->pBA0 + pl->u32FCRnAddress);
        pl->u32FSICn_Save = readl(s->pBA0 + pl->u32FSICnAddress);
 }
-void cs4281_ResumeFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
+static void cs4281_ResumeFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
 {
  /*
  * We need to restore the contents of the BASIC FIFO Registers.
@@ -1158,7 +1159,7 @@ void cs4281_ResumeFIFO(struct cs4281_state *s, struct cs4281_pipeline *pl)
        writel(pl->u32FCRn_Save,s->pBA0 + pl->u32FCRnAddress);
        writel(pl->u32FSICn_Save,s->pBA0 + pl->u32FSICnAddress);
 }
-void cs4281_SuspendDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
+static void cs4281_SuspendDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
 {
        //
        // We need to save the contents of the BASIC DMA Registers.
@@ -1170,7 +1171,7 @@ void cs4281_SuspendDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
        pl->u32DCCn_Save = readl(s->pBA0 + pl->u32DCCnAddress);
        pl->u32DCAn_Save = readl(s->pBA0 + pl->u32DCAnAddress);
 }
-void cs4281_ResumeDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
+static void cs4281_ResumeDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
 {
        //
        // We need to save the contents of the BASIC DMA Registers.
@@ -1183,7 +1184,7 @@ void cs4281_ResumeDMAengine(struct cs4281_state *s, struct cs4281_pipeline *pl)
        writel( pl->u32DCAn_Save, s->pBA0 + pl->u32DCAnAddress);
 }
 
-int cs4281_suspend(struct cs4281_state *s)
+static int cs4281_suspend(struct cs4281_state *s)
 {
        int i;
        u32 u32CLKCR1;
@@ -1339,7 +1340,7 @@ int cs4281_suspend(struct cs4281_state *s)
        return 0;
 }
 
-int cs4281_resume(struct cs4281_state *s)
+static int cs4281_resume(struct cs4281_state *s)
 {
        int i;
        unsigned temp1;
@@ -1694,7 +1695,7 @@ static void start_adc(struct cs4281_state *s)
 #define DMABUF_MINORDER 1      // ==> min buffer size = 8K.
 
 
-extern void dealloc_dmabuf(struct cs4281_state *s, struct dmabuf *db)
+static void dealloc_dmabuf(struct cs4281_state *s, struct dmabuf *db)
 {
        struct page *map, *mapend;
 
@@ -1755,7 +1756,7 @@ static int prog_dmabuf(struct cs4281_state *s, struct dmabuf *db)
                }
                db->buforder = order;
                // Now mark the pages as reserved; otherwise the 
-               // remap_page_range() in cs4281_mmap doesn't work.
+               // remap_pfn_range() in cs4281_mmap doesn't work.
                // 1. get index to last page in mem_map array for rawbuf.
                mapend = virt_to_page(db->rawbuf + 
                        (PAGE_SIZE << db->buforder) - 1);
@@ -1778,7 +1779,7 @@ static int prog_dmabuf(struct cs4281_state *s, struct dmabuf *db)
                }
                s->buforder_tmpbuff = order;
                // Now mark the pages as reserved; otherwise the 
-               // remap_page_range() in cs4281_mmap doesn't work.
+               // remap_pfn_range() in cs4281_mmap doesn't work.
                // 1. get index to last page in mem_map array for rawbuf.
                mapend = virt_to_page(s->tmpbuff + 
                                (PAGE_SIZE << s->buforder_tmpbuff) - 1);
@@ -2148,6 +2149,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                SOUND_MASK_MIC, SOUND_MASK_CD, 0, SOUND_MASK_LINE1,
                SOUND_MASK_LINE, SOUND_MASK_VOLUME, 0, 0
        };
+       void __user *argp = (void __user *)arg;
 
        // Index of mixtable1[] member is Device ID 
        // and must be <= SOUND_MIXER_NRDEVICES.
@@ -2195,26 +2197,26 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 
                case SOUND_MIXER_CS_GETDBGMASK:
                        return put_user(cs_debugmask,
-                                       (unsigned long *) arg);
+                                       (unsigned long __user *) argp);
 
                case SOUND_MIXER_CS_GETDBGLEVEL:
                        return put_user(cs_debuglevel,
-                                       (unsigned long *) arg);
+                                       (unsigned long __user *) argp);
 
                case SOUND_MIXER_CS_SETDBGMASK:
-                       if (get_user(val, (unsigned long *) arg))
+                       if (get_user(val, (unsigned long __user *) argp))
                                return -EFAULT;
                        cs_debugmask = val;
                        return 0;
 
                case SOUND_MIXER_CS_SETDBGLEVEL:
-                       if (get_user(val, (unsigned long *) arg))
+                       if (get_user(val, (unsigned long __user *) argp))
                                return -EFAULT;
                        cs_debuglevel = val;
                        return 0;
 #ifndef NOT_CS4281_PM
                case SOUND_MIXER_CS_APM:
-                       if (get_user(val, (unsigned long *) arg))
+                       if (get_user(val, (unsigned long __user *) argp))
                                return -EFAULT;
                        if(val == CS_IOCTL_CMD_SUSPEND)
                                cs4281_suspend(s);
@@ -2238,7 +2240,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 
        if (cmd == SOUND_MIXER_PRIVATE1) {
                // enable/disable/query mixer preamp 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *) argp))
                        return -EFAULT;
                if (val != -1) {
                        cs4281_read_ac97(s, BA0_AC97_MIC_VOLUME, &temp1);
@@ -2247,11 +2249,11 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                }
                cs4281_read_ac97(s, BA0_AC97_MIC_VOLUME, &temp1);
                val = (temp1 & 0x40) ? 1 : 0;
-               return put_user(val, (int *) arg);
+               return put_user(val, (int __user *) argp);
        }
        if (cmd == SOUND_MIXER_PRIVATE2) {
                // enable/disable/query spatializer 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                if (val != -1) {
                        temp1 = (val & 0x3f) >> 2;
@@ -2262,14 +2264,14 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                                          temp1 | 0x2000);
                }
                cs4281_read_ac97(s, BA0_AC97_3D_CONTROL, &temp1);
-               return put_user((temp1 << 2) | 3, (int *) arg);
+               return put_user((temp1 << 2) | 3, (int __user *)argp);
        }
        if (cmd == SOUND_MIXER_INFO) {
                mixer_info info;
                strlcpy(info.id, "CS4281", sizeof(info.id));
                strlcpy(info.name, "Crystal CS4281", sizeof(info.name));
                info.modify_counter = s->mix.modcnt;
-               if (copy_to_user((void *) arg, &info, sizeof(info)))
+               if (copy_to_user(argp, &info, sizeof(info)))
                        return -EFAULT;
                return 0;
        }
@@ -2277,12 +2279,12 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                _old_mixer_info info;
                strlcpy(info.id, "CS4281", sizeof(info.id));
                strlcpy(info.name, "Crystal CS4281", sizeof(info.name));
-               if (copy_to_user((void *) arg, &info, sizeof(info)))
+               if (copy_to_user(argp, &info, sizeof(info)))
                        return -EFAULT;
                return 0;
        }
        if (cmd == OSS_GETVERSION)
-               return put_user(SOUND_VERSION, (int *) arg);
+               return put_user(SOUND_VERSION, (int __user *) argp);
 
        if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
                return -EINVAL;
@@ -2292,9 +2294,8 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
        if (_SIOC_DIR(cmd) == _SIOC_READ) {
                switch (_IOC_NR(cmd)) {
                case SOUND_MIXER_RECSRC:        // Arg contains a bit for each recording source 
-                       cs4281_read_ac97(s, BA0_AC97_RECORD_SELECT,
-                                        &temp1);
-                       return put_user(mixer_src[temp1 & 7], (int *) arg);
+                       cs4281_read_ac97(s, BA0_AC97_RECORD_SELECT, &temp1);
+                       return put_user(mixer_src[temp1&7], (int __user *)argp);
 
                case SOUND_MIXER_DEVMASK:       // Arg contains a bit for each supported device 
                        return put_user(SOUND_MASK_PCM | SOUND_MASK_SYNTH |
@@ -2302,29 +2303,29 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                                        SOUND_MASK_LINE1 | SOUND_MASK_MIC |
                                        SOUND_MASK_VOLUME |
                                        SOUND_MASK_RECLEV |
-                                       SOUND_MASK_SPEAKER, (int *) arg);
+                                       SOUND_MASK_SPEAKER, (int __user *)argp);
 
                case SOUND_MIXER_RECMASK:       // Arg contains a bit for each supported recording source 
                        return put_user(SOUND_MASK_LINE | SOUND_MASK_MIC |
                                        SOUND_MASK_CD | SOUND_MASK_VOLUME |
-                                       SOUND_MASK_LINE1, (int *) arg);
+                                       SOUND_MASK_LINE1, (int __user *) argp);
 
                case SOUND_MIXER_STEREODEVS:    // Mixer channels supporting stereo 
                        return put_user(SOUND_MASK_PCM | SOUND_MASK_SYNTH |
                                        SOUND_MASK_CD | SOUND_MASK_LINE |
                                        SOUND_MASK_LINE1 | SOUND_MASK_MIC |
                                        SOUND_MASK_VOLUME |
-                                       SOUND_MASK_RECLEV, (int *) arg);
+                                       SOUND_MASK_RECLEV, (int __user *)argp);
 
                case SOUND_MIXER_CAPS:
-                       return put_user(SOUND_CAP_EXCL_INPUT, (int *) arg);
+                       return put_user(SOUND_CAP_EXCL_INPUT, (int __user *)argp);
 
                default:
                        i = _IOC_NR(cmd);
                        if (i >= SOUND_MIXER_NRDEVICES
                            || !(vidx = mixtable1[i]))
                                return -EINVAL;
-                       return put_user(s->mix.vol[vidx - 1], (int *) arg);
+                       return put_user(s->mix.vol[vidx - 1], (int __user *)argp);
                }
        }
        // If ioctl doesn't have both the SIOC_READ and 
@@ -2339,7 +2340,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
        switch (_IOC_NR(cmd)) {
 
        case SOUND_MIXER_RECSRC:        // Arg contains a bit for each recording source 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                i = hweight32(val);     // i = # bits on in val.
                if (i != 1)     // One & only 1 bit must be on.
@@ -2356,7 +2357,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                return 0;
 
        case SOUND_MIXER_VOLUME:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                l = val & 0xff;
                if (l > 100)
@@ -2391,10 +2392,10 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 #else
                s->mix.vol[8] = val;
 #endif
-               return put_user(s->mix.vol[8], (int *) arg);
+               return put_user(s->mix.vol[8], (int __user *)argp);
 
        case SOUND_MIXER_SPEAKER:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                l = val & 0xff;
                if (l > 100)
@@ -2421,10 +2422,10 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 #else
                s->mix.vol[6] = val;
 #endif
-               return put_user(s->mix.vol[6], (int *) arg);
+               return put_user(s->mix.vol[6], (int __user *)argp);
 
        case SOUND_MIXER_RECLEV:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                l = val & 0xff;
                if (l > 100)
@@ -2447,10 +2448,10 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 #else
                s->mix.vol[7] = val;
 #endif
-               return put_user(s->mix.vol[7], (int *) arg);
+               return put_user(s->mix.vol[7], (int __user *)argp);
 
        case SOUND_MIXER_MIC:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                l = val & 0xff;
                if (l > 100)
@@ -2477,16 +2478,16 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 #else
                s->mix.vol[5] = val;
 #endif
-               return put_user(s->mix.vol[5], (int *) arg);
+               return put_user(s->mix.vol[5], (int __user *)argp);
 
 
        case SOUND_MIXER_SYNTH:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                l = val & 0xff;
                if (l > 100)
                        l = 100;
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                r = (val >> 8) & 0xff;
                if (r > 100)
@@ -2512,7 +2513,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
 #else
                s->mix.vol[4] = val;
 #endif
-               return put_user(s->mix.vol[4], (int *) arg);
+               return put_user(s->mix.vol[4], (int __user *)argp);
 
 
        default:
@@ -2522,7 +2523,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                i = _IOC_NR(cmd);
                if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i]))
                        return -EINVAL;
-               if (get_user(val, (int *) arg))
+               if (get_user(val, (int __user *)argp))
                        return -EFAULT;
                l = val & 0xff;
                if (l > 100)
@@ -2558,7 +2559,7 @@ static int mixer_ioctl(struct cs4281_state *s, unsigned int cmd,
                        "write ac97 mixreg[%d]=0x%x mix.vol[]=0x%x\n", 
                                vidx-1,temp1,s->mix.vol[vidx-1]));
 #endif
-               return put_user(s->mix.vol[vidx - 1], (int *) arg);
+               return put_user(s->mix.vol[vidx - 1], (int __user *)argp);
        }
 }
 
@@ -2592,7 +2593,7 @@ static int cs4281_open_mixdev(struct inode *inode, struct file *file)
        CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
                  printk(KERN_INFO "cs4281: cs4281_open_mixdev()- 0\n"));
 
-       return 0;
+       return nonseekable_open(inode, file);
 }
 
 
@@ -2817,7 +2818,7 @@ static void CopySamples(char *dst, char *src, int count, int iChannels,
 // issues with 8 bit capture, so the driver always captures data in 16 bit
 // and then if the user requested 8 bit, converts from 16 to 8 bit.
 //
-static unsigned cs_copy_to_user(struct cs4281_state *s, void *dest,
+static unsigned cs_copy_to_user(struct cs4281_state *s, void __user *dest,
                                unsigned *hwsrc, unsigned cnt,
                                unsigned *copied)
 {
@@ -2859,7 +2860,7 @@ static unsigned cs_copy_to_user(struct cs4281_state *s, void *dest,
 
 // --------------------------------------------------------------------- 
 
-static ssize_t cs4281_read(struct file *file, char *buffer, size_t count,
+static ssize_t cs4281_read(struct file *file, char __user *buffer, size_t count,
                           loff_t * ppos)
 {
        struct cs4281_state *s =
@@ -2874,8 +2875,6 @@ static ssize_t cs4281_read(struct file *file, char *buffer, size_t count,
                  printk(KERN_INFO "cs4281: cs4281_read()+ %Zu \n", count));
 
        VALIDATE_STATE(s);
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
        if (s->dma_adc.mapped)
                return -ENXIO;
        if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
@@ -2975,7 +2974,7 @@ static ssize_t cs4281_read(struct file *file, char *buffer, size_t count,
 }
 
 
-static ssize_t cs4281_write(struct file *file, const char *buffer,
+static ssize_t cs4281_write(struct file *file, const char __user *buffer,
                            size_t count, loff_t * ppos)
 {
        struct cs4281_state *s =
@@ -2990,8 +2989,6 @@ static ssize_t cs4281_write(struct file *file, const char *buffer,
                         count));
        VALIDATE_STATE(s);
 
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
        if (s->dma_dac.mapped)
                return -ENXIO;
        if (!s->dma_dac.ready && (ret = prog_dmabuf_dac(s)))
@@ -3139,9 +3136,10 @@ static int cs4281_mmap(struct file *file, struct vm_area_struct *vma)
        size = vma->vm_end - vma->vm_start;
        if (size > (PAGE_SIZE << db->buforder))
                return -EINVAL;
-       if (remap_page_range
-           (vma, vma->vm_start, virt_to_phys(db->rawbuf), size,
-            vma->vm_page_prot)) return -EAGAIN;
+       if (remap_pfn_range(vma, vma->vm_start,
+                               virt_to_phys(db->rawbuf) >> PAGE_SHIFT,
+                               size, vma->vm_page_prot))
+               return -EAGAIN;
        db->mapped = 1;
 
        CS_DBGOUT(CS_FUNCTION | CS_PARMS | CS_OPEN, 4,
@@ -3161,6 +3159,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
        audio_buf_info abinfo;
        count_info cinfo;
        int val, mapped, ret;
+       int __user *p = (int __user *)arg;
 
        CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO
                 "cs4281: cs4281_ioctl(): file=%p cmd=0x%.8x\n", file, cmd));
@@ -3175,7 +3174,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
                        "cs4281: cs4281_ioctl(): SOUND_VERSION=0x%.8x\n",
                                 SOUND_VERSION));
-               return put_user(SOUND_VERSION, (int *) arg);
+               return put_user(SOUND_VERSION, p);
 
        case SNDCTL_DSP_SYNC:
                CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
@@ -3192,7 +3191,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
        case SNDCTL_DSP_GETCAPS:
                return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
                                DSP_CAP_TRIGGER | DSP_CAP_MMAP,
-                               (int *) arg);
+                               p);
 
        case SNDCTL_DSP_RESET:
                CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
@@ -3216,7 +3215,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                return 0;
 
        case SNDCTL_DSP_SPEED:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
                         "cs4281: cs4281_ioctl(): DSP_SPEED val=%d\n", val));
@@ -3257,10 +3256,10 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                else if (file->f_mode & FMODE_READ)
                        val = s->prop_adc.rate;
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_STEREO:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
                         "cs4281: cs4281_ioctl(): DSP_STEREO val=%d\n", val));
@@ -3279,7 +3278,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                return 0;
 
        case SNDCTL_DSP_CHANNELS:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
                         "cs4281: cs4281_ioctl(): DSP_CHANNELS val=%d\n",
@@ -3310,7 +3309,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                else if (file->f_mode & FMODE_READ)
                        val = s->prop_adc.channels;
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_GETFMTS:        // Returns a mask 
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
@@ -3318,10 +3317,10 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                                 AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
                                 AFMT_U8));
                return put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
-                               AFMT_U8, (int *) arg);
+                               AFMT_U8, p);
 
        case SNDCTL_DSP_SETFMT:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
                         "cs4281: cs4281_ioctl(): DSP_SETFMT val=0x%.8x\n",
@@ -3358,7 +3357,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(KERN_INFO
                  "cs4281: cs4281_ioctl(): DSP_SETFMT return val=0x%.8x\n", 
                        val));
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_POST:
                CS_DBGOUT(CS_IOCTL, 4, printk(KERN_INFO
@@ -3371,10 +3370,10 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                        val |= PCM_ENABLE_INPUT;
                if (file->f_mode & s->ena & FMODE_WRITE)
                        val |= PCM_ENABLE_OUTPUT;
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_SETTRIGGER:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                if (file->f_mode & FMODE_READ) {
                        if (val & PCM_ENABLE_INPUT) {
@@ -3416,7 +3415,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                                abinfo.fragsize,abinfo.bytes,abinfo.fragstotal,
                                abinfo.fragments));
                spin_unlock_irqrestore(&s->lock, flags);
-               return copy_to_user((void *) arg, &abinfo,
+               return copy_to_user(p, &abinfo,
                                    sizeof(abinfo)) ? -EFAULT : 0;
 
        case SNDCTL_DSP_GETISPACE:
@@ -3440,7 +3439,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                            abinfo.bytes >> s->dma_adc.fragshift;
                }
                spin_unlock_irqrestore(&s->lock, flags);
-               return copy_to_user((void *) arg, &abinfo,
+               return copy_to_user(p, &abinfo,
                                    sizeof(abinfo)) ? -EFAULT : 0;
 
        case SNDCTL_DSP_NONBLOCK:
@@ -3456,7 +3455,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                cs4281_update_ptr(s,CS_FALSE);
                val = s->dma_dac.count;
                spin_unlock_irqrestore(&s->lock, flags);
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_GETIPTR:
                if (!(file->f_mode & FMODE_READ))
@@ -3489,7 +3488,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                if (s->dma_adc.mapped)
                        s->dma_adc.count &= s->dma_adc.fragsize - 1;
                spin_unlock_irqrestore(&s->lock, flags);
-               if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))
+               if (copy_to_user(p, &cinfo, sizeof(cinfo)))
                        return -EFAULT;
                return 0;
 
@@ -3515,7 +3514,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                if (s->dma_dac.mapped)
                        s->dma_dac.count &= s->dma_dac.fragsize - 1;
                spin_unlock_irqrestore(&s->lock, flags);
-               if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))
+               if (copy_to_user(p, &cinfo, sizeof(cinfo)))
                        return -EFAULT;
                return 0;
 
@@ -3523,18 +3522,17 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                if (file->f_mode & FMODE_WRITE) {
                        if ((val = prog_dmabuf_dac(s)))
                                return val;
-                       return put_user(s->dma_dac.fragsize, (int *) arg);
+                       return put_user(s->dma_dac.fragsize, p);
                }
                if ((val = prog_dmabuf_adc(s)))
                        return val;
                if (s->conversion)
-                       return put_user(s->dma_adc.fragsize / 2,
-                                       (int *) arg);
+                       return put_user(s->dma_adc.fragsize / 2, p);
                else
-                       return put_user(s->dma_adc.fragsize, (int *) arg);
+                       return put_user(s->dma_adc.fragsize, p);
 
        case SNDCTL_DSP_SETFRAGMENT:
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                return 0;       // Say OK, but do nothing.
 
@@ -3542,7 +3540,7 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision)
                    || (file->f_mode & FMODE_WRITE
                        && s->dma_dac.subdivision)) return -EINVAL;
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
                if (val != 1 && val != 2 && val != 4)
                        return -EINVAL;
@@ -3554,15 +3552,15 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
 
        case SOUND_PCM_READ_RATE:
                if (file->f_mode & FMODE_READ)
-                       return put_user(s->prop_adc.rate, (int *) arg);
+                       return put_user(s->prop_adc.rate, p);
                else if (file->f_mode & FMODE_WRITE)
-                       return put_user(s->prop_dac.rate, (int *) arg);
+                       return put_user(s->prop_dac.rate, p);
 
        case SOUND_PCM_READ_CHANNELS:
                if (file->f_mode & FMODE_READ)
-                       return put_user(s->prop_adc.channels, (int *) arg);
+                       return put_user(s->prop_adc.channels, p);
                else if (file->f_mode & FMODE_WRITE)
-                       return put_user(s->prop_dac.channels, (int *) arg);
+                       return put_user(s->prop_dac.channels, p);
 
        case SOUND_PCM_READ_BITS:
                if (file->f_mode & FMODE_READ)
@@ -3570,13 +3568,13 @@ static int cs4281_ioctl(struct inode *inode, struct file *file,
                            put_user(
                                     (s->prop_adc.
                                      fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
-                                    (int *) arg);
+                                    p);
                else if (file->f_mode & FMODE_WRITE)
                        return
                            put_user(
                                     (s->prop_dac.
                                      fmt & (AFMT_S8 | AFMT_U8)) ? 8 : 16,
-                                    (int *) arg);
+                                    p);
 
        case SOUND_PCM_WRITE_FILTER:
        case SNDCTL_DSP_SETSYNCRO:
@@ -3725,7 +3723,7 @@ static int cs4281_open(struct inode *inode, struct file *file)
        }
        CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2,
                  printk(KERN_INFO "cs4281: cs4281_open()- 0\n"));
-       return 0;
+       return nonseekable_open(inode, file);
 }
 
 
@@ -3831,7 +3829,7 @@ static void cs4281_midi_timer(unsigned long data)
 
 // --------------------------------------------------------------------- 
 
-static ssize_t cs4281_midi_read(struct file *file, char *buffer,
+static ssize_t cs4281_midi_read(struct file *file, char __user *buffer,
                                size_t count, loff_t * ppos)
 {
        struct cs4281_state *s =
@@ -3842,8 +3840,6 @@ static ssize_t cs4281_midi_read(struct file *file, char *buffer,
        int cnt;
 
        VALIDATE_STATE(s);
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
        if (!access_ok(VERIFY_WRITE, buffer, count))
                return -EFAULT;
        ret = 0;
@@ -3879,7 +3875,7 @@ static ssize_t cs4281_midi_read(struct file *file, char *buffer,
 }
 
 
-static ssize_t cs4281_midi_write(struct file *file, const char *buffer,
+static ssize_t cs4281_midi_write(struct file *file, const char __user *buffer,
                                 size_t count, loff_t * ppos)
 {
        struct cs4281_state *s =
@@ -3890,8 +3886,6 @@ static ssize_t cs4281_midi_write(struct file *file, const char *buffer,
        int cnt;
 
        VALIDATE_STATE(s);
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
        if (!access_ok(VERIFY_READ, buffer, count))
                return -EFAULT;
        ret = 0;
@@ -4025,7 +4019,7 @@ static int cs4281_midi_open(struct inode *inode, struct file *file)
             f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ |
                                            FMODE_MIDI_WRITE);
        up(&s->open_sem);
-       return 0;
+       return nonseekable_open(inode, file);
 }
 
 
@@ -4118,7 +4112,7 @@ static struct initvol {
 
 
 #ifndef NOT_CS4281_PM
-void __devinit cs4281_BuildFIFO(
+static void __devinit cs4281_BuildFIFO(
        struct cs4281_pipeline *p, 
        struct cs4281_state *s)
 {
@@ -4165,7 +4159,7 @@ void __devinit cs4281_BuildFIFO(
 
 }
 
-void __devinit cs4281_BuildDMAengine(
+static void __devinit cs4281_BuildDMAengine(
        struct cs4281_pipeline *p, 
        struct cs4281_state *s)
 {
@@ -4235,7 +4229,7 @@ void __devinit cs4281_BuildDMAengine(
 
 }
 
-void __devinit cs4281_InitPM(struct cs4281_state *s)
+static void __devinit cs4281_InitPM(struct cs4281_state *s)
 {
        int i;
        struct cs4281_pipeline *p;
@@ -4465,7 +4459,7 @@ static struct pci_device_id cs4281_pci_tbl[] = {
 
 MODULE_DEVICE_TABLE(pci, cs4281_pci_tbl);
 
-struct pci_driver cs4281_pci_driver = {
+static struct pci_driver cs4281_pci_driver = {
        .name     = "cs4281",
        .id_table = cs4281_pci_tbl,
        .probe    = cs4281_probe,
@@ -4474,7 +4468,7 @@ struct pci_driver cs4281_pci_driver = {
        .resume   = CS4281_RESUME_TBL,
 };
 
-int __init cs4281_init_module(void)
+static int __init cs4281_init_module(void)
 {
        int rtn = 0;
        CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO 
@@ -4489,7 +4483,7 @@ int __init cs4281_init_module(void)
        return rtn;
 }
 
-void __exit cs4281_cleanup_module(void)
+static void __exit cs4281_cleanup_module(void)
 {
        pci_unregister_driver(&cs4281_pci_driver);
 #ifndef NOT_CS4281_PM
@@ -4509,9 +4503,3 @@ MODULE_LICENSE("GPL");
 module_init(cs4281_init_module);
 module_exit(cs4281_cleanup_module);
 
-#ifndef MODULE
-int __init init_cs4281(void)
-{
-       return cs4281_init_module();
-}
-#endif