patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / sound / oss / rme96xx.c
index 9e96693..404ba23 100644 (file)
@@ -661,13 +661,13 @@ inline int rme96xx_getispace(struct dmabuf * dma, unsigned int hwp)
 }
 
 
-inline int rme96xx_copyfromuser(struct dmabuf* dma,const char* buffer,int count,int hop)
+inline int rme96xx_copyfromuser(struct dmabuf* dma,const char __user * buffer,int count,int hop)
 {
        int swptr = dma->writeptr;
        switch (dma->format) {
        case AFMT_S32_BLOCKED:
        {
-            char* buf = (char*)buffer;
+            char __user * buf = (char __user *)buffer;
             int cnt = count/dma->outchannels;
             int i;
             for (i=0;i < dma->outchannels;i++) {
@@ -686,7 +686,7 @@ inline int rme96xx_copyfromuser(struct dmabuf* dma,const char* buffer,int count,
             int i,j;
             int cnt = count/dma->outchannels;
             for (i=0;i < dma->outchannels + dma->mono;i++) {
-                    short* sbuf = (short*)buffer + i*(!dma->mono);
+                    short __user * sbuf = (short __user *)buffer + i*(!dma->mono);
                     short* hwbuf =(short*) &dma->s->playbuf[(dma->outoffset + i)*RME96xx_DMA_MAX_SAMPLES];          
                     hwbuf+=(swptr>>1);
                     for (j=0;j<(cnt>>1);j++) {
@@ -710,13 +710,13 @@ inline int rme96xx_copyfromuser(struct dmabuf* dma,const char* buffer,int count,
 }
 
 /* The count argument is the number of bytes */
-inline int rme96xx_copytouser(struct dmabuf* dma,const char* buffer,int count,int hop)
+inline int rme96xx_copytouser(struct dmabuf* dma,const char __user* buffer,int count,int hop)
 {
        int swptr = dma->readptr;
        switch (dma->format) {
        case AFMT_S32_BLOCKED:
        {
-            char* buf = (char*)buffer;
+            char __user * buf = (char __user *)buffer;
             int cnt = count/dma->inchannels;
             int i;
 
@@ -736,7 +736,7 @@ inline int rme96xx_copytouser(struct dmabuf* dma,const char* buffer,int count,in
             int i,j;
             int cnt = count/dma->inchannels;
             for (i=0;i < dma->inchannels;i++) {
-                 short* sbuf = (short*)buffer + i;
+                 short __user * sbuf = (short __user *)buffer + i;
                  short* hwbuf =(short*) &dma->s->recbuf[(dma->inoffset + i)*RME96xx_DMA_MAX_SAMPLES];       
                  hwbuf+=(swptr>>1);
                  for (j=0;j<(cnt>>1);j++) {
@@ -1121,7 +1121,6 @@ module_exit(cleanup_rme96xx);
 
 static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd, unsigned long arg)
 {
-
        struct dmabuf * dma = (struct dmabuf *)file->private_data; 
        rme96xx_info *s = dma->s;
        unsigned long flags;
@@ -1129,6 +1128,8 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
         count_info cinfo;
        int count;
        int val = 0;
+       void __user *argp = (void __user *)arg;
+       int __user *p = argp;
 
        VALIDATE_STATE(s);
 
@@ -1136,7 +1137,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
 
        switch (cmd) {
        case OSS_GETVERSION:
-               return put_user(SOUND_VERSION, (int *)arg);
+               return put_user(SOUND_VERSION, p);
 
        case SNDCTL_DSP_SYNC:
 #if 0
@@ -1149,14 +1150,14 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                return 0;
 
        case SNDCTL_DSP_GETCAPS:
-               return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP, (int *)arg);
+               return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP, p);
                
         case SNDCTL_DSP_RESET:
 //             rme96xx_clearbufs(dma);
                return 0;
 
         case SNDCTL_DSP_SPEED:
-                if (get_user(val, (int *)arg))
+                if (get_user(val, p))
                        return -EFAULT;
                if (val >= 0) {
 /* generally it's not a problem if we change the speed 
@@ -1195,10 +1196,10 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                        spin_unlock_irqrestore(&s->lock, flags);
                }
                DBG(printk("speed set to %d\n",val));
-               return put_user(val, (int *)arg);
+               return put_user(val, p);
                
         case SNDCTL_DSP_STEREO: /* this plays a mono file on two channels */
-                if (get_user(val, (int *)arg))
+                if (get_user(val, p))
                        return -EFAULT;
                
                if (!val) {
@@ -1216,7 +1217,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                return 0;
         case SNDCTL_DSP_CHANNELS:
                /* remember to check for resonable offset/channel pairs here */
-                if (get_user(val, (int *)arg))
+                if (get_user(val, p))
                        return -EFAULT;
 
                if (file->f_mode & FMODE_WRITE) {                       
@@ -1236,14 +1237,14 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
 
                dma->mono=0;
 
-               return put_user(val, (int *)arg);
+               return put_user(val, p);
                
        case SNDCTL_DSP_GETFMTS: /* Returns a mask */
-                return put_user(RME96xx_FMT, (int *)arg);
+                return put_user(RME96xx_FMT, p);
                
        case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
                DBG(printk("setting to format %x\n",val)); 
-               if (get_user(val, (int *)arg))
+               if (get_user(val, p))
                        return -EFAULT;
                if (val != AFMT_QUERY) {
                        if (val & RME96xx_FMT)
@@ -1257,7 +1258,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                                break;
                        }
                }
-               return put_user(dma->format, (int *)arg);
+               return put_user(dma->format, p);
                
        case SNDCTL_DSP_POST:
                 return 0;
@@ -1270,10 +1271,10 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                if (file->f_mode & FMODE_WRITE && s->ctrl & CTRL_DAC2_EN) 
                        val |= PCM_ENABLE_OUTPUT;
 #endif
-               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 0
                if (file->f_mode & FMODE_READ) {
@@ -1309,7 +1310,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                 abinfo.fragstotal = 2;
                 abinfo.fragments = (count > s->fragsize); 
 
-               return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+               return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
 
        case SNDCTL_DSP_GETISPACE:
                if (!(file->f_mode & FMODE_READ))
@@ -1323,7 +1324,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                 abinfo.bytes = (count*dma->inchannels)>>dma->formatshift;
                 abinfo.fragstotal = 2;
                 abinfo.fragments = count > s->fragsize; 
-               return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
+               return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
                
         case SNDCTL_DSP_NONBLOCK:
                 file->f_flags |= O_NONBLOCK;
@@ -1339,7 +1340,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                if (count < 0)
                        count += s->fragsize<<1;
 
-               return put_user(count, (int *)arg);
+               return put_user(count, p);
 
 
 /* check out how to use mmaped mode (can only be blocked !!!) */
@@ -1359,7 +1360,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                        dma->readptr &= s->fragsize<<1;
                spin_unlock_irqrestore(&s->lock,flags);
 
-                if (copy_to_user((void *)arg, &cinfo, sizeof(cinfo)))
+                if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
                        return -EFAULT;
                return 0;
 
@@ -1378,14 +1379,14 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                if (dma->mmapped)
                        dma->writeptr &= s->fragsize<<1;
                spin_unlock_irqrestore(&s->lock,flags);
-                if (copy_to_user((void *)arg, &cinfo, sizeof(cinfo)))
+                if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
                        return -EFAULT;
                return 0;
         case SNDCTL_DSP_GETBLKSIZE:
-            return put_user(s->fragsize, (int *)arg);
+            return put_user(s->fragsize, p);
 
         case SNDCTL_DSP_SETFRAGMENT:
-                if (get_user(val, (int *)arg))
+                if (get_user(val, p))
                        return -EFAULT;
                val&=0xffff;
                val -= 7;
@@ -1399,7 +1400,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision) ||
                    (file->f_mode & FMODE_WRITE && s->dma_dac2.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;
@@ -1413,10 +1414,10 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
         case SOUND_PCM_READ_RATE:
                /* HP20020201 */
                s->rate = rme96xx_get_sample_rate_status(s);
-               return put_user(s->rate, (int *)arg);
+               return put_user(s->rate, p);
 
         case SOUND_PCM_READ_CHANNELS:
-               return put_user(dma->outchannels, (int *)arg);
+               return put_user(dma->outchannels, p);
 
         case SOUND_PCM_READ_BITS:
                switch (dma->format) {
@@ -1427,7 +1428,7 @@ static int rme96xx_ioctl(struct inode *in, struct file *file, unsigned int cmd,
                                val = 16;
                                break;
                }
-               return put_user(val, (int *)arg);
+               return put_user(val, p);
 
         case SOUND_PCM_WRITE_FILTER:
         case SNDCTL_DSP_SETSYNCRO:
@@ -1529,7 +1530,7 @@ static int rme96xx_release(struct inode *in, struct file *file)
 }
 
 
-static ssize_t rme96xx_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
+static ssize_t rme96xx_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
 {
        struct dmabuf *dma = (struct dmabuf *)file->private_data;
        ssize_t ret = 0;
@@ -1597,7 +1598,7 @@ static ssize_t rme96xx_write(struct file *file, const char *buffer, size_t count
        return ret;
 }
 
-static ssize_t rme96xx_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
+static ssize_t rme96xx_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
 { 
        struct dmabuf *dma = (struct dmabuf *)file->private_data;
        ssize_t ret = 0;
@@ -1793,6 +1794,8 @@ static int rme96xx_mixer_ioctl(struct inode *inode, struct file *file, unsigned
        rme96xx_info *s = (rme96xx_info *)file->private_data;
        u32 status;
        int spdifrate;
+       void __user *argp = (void __user *)arg;
+       int __user *p = argp;
 
        status = readl(s->iobase + RME96xx_status_register);
        /* hack to convert rev 1.5 SPDIF rate to "crystalrate" format   HP 20020201 */
@@ -1802,7 +1805,7 @@ static int rme96xx_mixer_ioctl(struct inode *inode, struct file *file, unsigned
        VALIDATE_STATE(s);
        if (cmd == SOUND_MIXER_PRIVATE1) {
                rme_mixer mixer;
-               if (copy_from_user(&mixer,(void*)arg,sizeof(mixer)))
+               if (copy_from_user(&mixer,argp,sizeof(mixer)))
                        return -EFAULT;
                
                mixer.devnr &= RME96xx_MASK_DEVS;
@@ -1825,14 +1828,14 @@ static int rme96xx_mixer_ioctl(struct inode *inode, struct file *file, unsigned
                mixer.o_offset = s->dma[mixer.devnr].outoffset;
                mixer.i_offset = s->dma[mixer.devnr].inoffset;
 
-               return copy_to_user((void *)arg, &mixer, sizeof(mixer)) ? -EFAULT : 0;
+               return copy_to_user(argp, &mixer, sizeof(mixer)) ? -EFAULT : 0;
        }
        if (cmd == SOUND_MIXER_PRIVATE2) {
-               return put_user(status, (int *)arg);
+               return put_user(status, p);
        }
        if (cmd == SOUND_MIXER_PRIVATE3) {
                u32 control;
-               if (copy_from_user(&control,(void*)arg,sizeof(control)))
+               if (copy_from_user(&control,argp,sizeof(control)))
                        return -EFAULT;
                if (file->f_mode & FMODE_WRITE) {
                        s->control_register &= ~RME96xx_mixer_allowed;
@@ -1840,7 +1843,7 @@ static int rme96xx_mixer_ioctl(struct inode *inode, struct file *file, unsigned
                        writel(control,s->iobase + RME96xx_control_register);
                }
 
-            return put_user(s->control_register, (int *)arg);
+            return put_user(s->control_register, p);
        }
        return -1;
 }