if (blksize < 0x100)
blksize = 0x100;
if (blksize > 0x10000)
- blksize = 0x100;
+ blksize = 0x10000;
if (blocks < 2)
blocks = 2;
if (!dev->oss.bufsize)
BUG();
+ videobuf_dma_init(&dev->oss.dma);
err = videobuf_dma_init_kernel(&dev->oss.dma, PCI_DMA_FROMDEVICE,
dev->oss.bufsize >> PAGE_SHIFT);
if (0 != err)
fmt |= (2 << 4);
if (!sign)
fmt |= 0x04;
- saa_writel(0x588 >> 2, dev->oss.blksize);
+ saa_writel(0x588 >> 2, dev->oss.blksize -4);
saa_writel(0x58c >> 2, 0x543210 | (fmt << 24));
break;
}
return 0;
}
-static ssize_t dsp_read(struct file *file, char *buffer,
+static ssize_t dsp_read(struct file *file, char __user *buffer,
size_t count, loff_t *ppos)
{
struct saa7134_dev *dev = file->private_data;
return ret;
}
-static ssize_t dsp_write(struct file *file, const char *buffer,
+static ssize_t dsp_write(struct file *file, const char __user *buffer,
size_t count, loff_t *ppos)
{
return -EINVAL;
unsigned int cmd, unsigned long arg)
{
struct saa7134_dev *dev = file->private_data;
+ void __user *argp = (void __user *) arg;
+ int __user *p = argp;
int val = 0;
if (oss_debug > 1)
saa7134_print_ioctl(dev->name,cmd);
switch (cmd) {
case OSS_GETVERSION:
- return put_user(SOUND_VERSION, (int *)arg);
+ return put_user(SOUND_VERSION, p);
case SNDCTL_DSP_GETCAPS:
return 0;
case SNDCTL_DSP_SPEED:
- if (get_user(val, (int*)arg))
+ if (get_user(val, p))
return -EFAULT;
/* fall through */
case SOUND_PCM_READ_RATE:
- return put_user(dev->oss.rate, (int*)arg);
+ return put_user(dev->oss.rate, p);
case SNDCTL_DSP_STEREO:
- if (get_user(val, (int*)arg))
+ if (get_user(val, p))
return -EFAULT;
down(&dev->oss.lock);
dev->oss.channels = val ? 2 : 1;
dsp_rec_start(dev);
}
up(&dev->oss.lock);
- return put_user(dev->oss.channels-1, (int *)arg);
+ return put_user(dev->oss.channels-1, p);
case SNDCTL_DSP_CHANNELS:
- if (get_user(val, (int*)arg))
+ if (get_user(val, p))
return -EFAULT;
if (val != 1 && val != 2)
return -EINVAL;
up(&dev->oss.lock);
/* fall through */
case SOUND_PCM_READ_CHANNELS:
- return put_user(dev->oss.channels, (int *)arg);
+ return put_user(dev->oss.channels, p);
case SNDCTL_DSP_GETFMTS: /* Returns a mask */
return put_user(AFMT_U8 | AFMT_S8 |
AFMT_U16_LE | AFMT_U16_BE |
- AFMT_S16_LE | AFMT_S16_BE, (int*)arg);
+ AFMT_S16_LE | AFMT_S16_BE, p);
case SNDCTL_DSP_SETFMT: /* Selects ONE fmt */
- if (get_user(val, (int*)arg))
+ if (get_user(val, p))
return -EFAULT;
switch (val) {
case AFMT_QUERY:
dsp_rec_start(dev);
}
up(&dev->oss.lock);
- return put_user(dev->oss.afmt,(int*)arg);
+ return put_user(dev->oss.afmt, p);
default:
return -EINVAL;
}
switch (dev->oss.afmt) {
case AFMT_U8:
case AFMT_S8:
- return put_user(8, (int*)arg);
+ return put_user(8, p);
case AFMT_U16_LE:
case AFMT_U16_BE:
case AFMT_S16_LE:
case AFMT_S16_BE:
- return put_user(16, (int*)arg);
+ return put_user(16, p);
default:
return -EINVAL;
}
up(&dev->oss.lock);
return 0;
case SNDCTL_DSP_GETBLKSIZE:
- return put_user(dev->oss.blksize,(int*)arg);
+ return put_user(dev->oss.blksize, p);
case SNDCTL_DSP_SETFRAGMENT:
- if (get_user(val, (int*)arg))
+ if (get_user(val, p))
return -EFAULT;
if (dev->oss.recording_on)
return -EBUSY;
dsp_buffer_free(dev);
- dsp_buffer_conf(dev,1 << (val & 0xffff), (arg >> 16) & 0xffff);
+ /* used to be arg >> 16 instead of val >> 16; fixed */
+ dsp_buffer_conf(dev,1 << (val & 0xffff), (val >> 16) & 0xffff);
dsp_buffer_init(dev);
return 0;
info.fragstotal = dev->oss.blocks;
info.bytes = dev->oss.read_count;
info.fragments = info.bytes / info.fragsize;
- if (copy_to_user((void *)arg, &info, sizeof(info)))
+ if (copy_to_user(argp, &info, sizeof(info)))
return -EFAULT;
return 0;
}
struct saa7134_dev *dev = file->private_data;
enum saa7134_audio_in input;
int val,ret;
+ void __user *argp = (void __user *) arg;
+ int __user *p = argp;
if (oss_debug > 1)
saa7134_print_ioctl(dev->name,cmd);
switch (cmd) {
case OSS_GETVERSION:
- return put_user(SOUND_VERSION, (int *)arg);
+ return put_user(SOUND_VERSION, p);
case SOUND_MIXER_INFO:
{
mixer_info info;
strlcpy(info.id, "TV audio", sizeof(info.id));
strlcpy(info.name, dev->name, sizeof(info.name));
info.modify_counter = dev->oss.count;
- if (copy_to_user((void *)arg, &info, sizeof(info)))
+ if (copy_to_user(argp, &info, sizeof(info)))
return -EFAULT;
return 0;
}
memset(&info,0,sizeof(info));
strlcpy(info.id, "TV audio", sizeof(info.id));
strlcpy(info.name, dev->name, sizeof(info.name));
- if (copy_to_user((void *)arg, &info, sizeof(info)))
+ if (copy_to_user(argp, &info, sizeof(info)))
return -EFAULT;
return 0;
}
case MIXER_READ(SOUND_MIXER_CAPS):
- return put_user(SOUND_CAP_EXCL_INPUT,(int*)arg);
+ return put_user(SOUND_CAP_EXCL_INPUT, p);
case MIXER_READ(SOUND_MIXER_STEREODEVS):
- return put_user(0,(int*)arg);
+ return put_user(0, p);
case MIXER_READ(SOUND_MIXER_RECMASK):
case MIXER_READ(SOUND_MIXER_DEVMASK):
val = SOUND_MASK_LINE1 | SOUND_MASK_LINE2;
if (32000 == dev->oss.rate)
val |= SOUND_MASK_VIDEO;
- return put_user(val,(int*)arg);
+ return put_user(val, p);
case MIXER_WRITE(SOUND_MIXER_RECSRC):
- if (get_user(val, (int *)arg))
+ if (get_user(val, p))
return -EFAULT;
input = dev->oss.input;
if (32000 == dev->oss.rate &&
case LINE2: ret = SOUND_MASK_LINE2; break;
default: ret = 0;
}
- return put_user(ret,(int*)arg);
+ return put_user(ret, p);
case MIXER_WRITE(SOUND_MIXER_VIDEO):
case MIXER_READ(SOUND_MIXER_VIDEO):
if (32000 != dev->oss.rate)
return -EINVAL;
- return put_user(100 | 100 << 8,(int*)arg);
+ return put_user(100 | 100 << 8, p);
case MIXER_WRITE(SOUND_MIXER_LINE1):
- if (get_user(val, (int *)arg))
+ if (get_user(val, p))
return -EFAULT;
val &= 0xff;
val = (val <= 50) ? 50 : 100;
mixer_level(dev,LINE1,dev->oss.line1);
/* fall throuth */
case MIXER_READ(SOUND_MIXER_LINE1):
- return put_user(dev->oss.line1 | dev->oss.line1 << 8,
- (int*)arg);
+ return put_user(dev->oss.line1 | dev->oss.line1 << 8, p);
case MIXER_WRITE(SOUND_MIXER_LINE2):
- if (get_user(val, (int *)arg))
+ if (get_user(val, p))
return -EFAULT;
val &= 0xff;
val = (val <= 50) ? 50 : 100;
mixer_level(dev,LINE2,dev->oss.line2);
/* fall throuth */
case MIXER_READ(SOUND_MIXER_LINE2):
- return put_user(dev->oss.line2 | dev->oss.line2 << 8,
- (int*)arg);
+ return put_user(dev->oss.line2 | dev->oss.line2 << 8, p);
default:
return -EINVAL;