diff options
Diffstat (limited to 'drivers/media/pci/cx18/cx18-ioctl.c')
| -rw-r--r-- | drivers/media/pci/cx18/cx18-ioctl.c | 52 | 
1 files changed, 22 insertions, 30 deletions
diff --git a/drivers/media/pci/cx18/cx18-ioctl.c b/drivers/media/pci/cx18/cx18-ioctl.c index cd8d2c2b162..aee7b6dacbf 100644 --- a/drivers/media/pci/cx18/cx18-ioctl.c +++ b/drivers/media/pci/cx18/cx18-ioctl.c @@ -415,42 +415,34 @@ static int cx18_g_chip_ident(struct file *file, void *fh,  }  #ifdef CONFIG_VIDEO_ADV_DEBUG -static int cx18_cxc(struct cx18 *cx, unsigned int cmd, void *arg) -{ -	struct v4l2_dbg_register *regs = arg; - -	if (!capable(CAP_SYS_ADMIN)) -		return -EPERM; -	if (regs->reg >= CX18_MEM_OFFSET + CX18_MEM_SIZE) -		return -EINVAL; - -	regs->size = 4; -	if (cmd == VIDIOC_DBG_S_REGISTER) -		cx18_write_enc(cx, regs->val, regs->reg); -	else -		regs->val = cx18_read_enc(cx, regs->reg); -	return 0; -} -  static int cx18_g_register(struct file *file, void *fh,  				struct v4l2_dbg_register *reg)  {  	struct cx18 *cx = fh2id(fh)->cx; -	if (v4l2_chip_match_host(®->match)) -		return cx18_cxc(cx, VIDIOC_DBG_G_REGISTER, reg); +	if (v4l2_chip_match_host(®->match)) { +		if (reg->reg >= CX18_MEM_OFFSET + CX18_MEM_SIZE) +			return -EINVAL; +		reg->size = 4; +		reg->val = cx18_read_enc(cx, reg->reg); +		return 0; +	}  	/* FIXME - errors shouldn't be ignored */  	cx18_call_all(cx, core, g_register, reg);  	return 0;  }  static int cx18_s_register(struct file *file, void *fh, -				struct v4l2_dbg_register *reg) +				const struct v4l2_dbg_register *reg)  {  	struct cx18 *cx = fh2id(fh)->cx; -	if (v4l2_chip_match_host(®->match)) -		return cx18_cxc(cx, VIDIOC_DBG_S_REGISTER, reg); +	if (v4l2_chip_match_host(®->match)) { +		if (reg->reg >= CX18_MEM_OFFSET + CX18_MEM_SIZE) +			return -EINVAL; +		cx18_write_enc(cx, reg->val, reg->reg); +		return 0; +	}  	/* FIXME - errors shouldn't be ignored */  	cx18_call_all(cx, core, s_register, reg);  	return 0; @@ -614,7 +606,7 @@ static int cx18_g_frequency(struct file *file, void *fh,  	return 0;  } -int cx18_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf) +int cx18_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)  {  	struct cx18_open_id *id = fh2id(fh);  	struct cx18 *cx = id->cx; @@ -637,15 +629,15 @@ static int cx18_g_std(struct file *file, void *fh, v4l2_std_id *std)  	return 0;  } -int cx18_s_std(struct file *file, void *fh, v4l2_std_id *std) +int cx18_s_std(struct file *file, void *fh, v4l2_std_id std)  {  	struct cx18_open_id *id = fh2id(fh);  	struct cx18 *cx = id->cx; -	if ((*std & V4L2_STD_ALL) == 0) +	if ((std & V4L2_STD_ALL) == 0)  		return -EINVAL; -	if (*std == cx->std) +	if (std == cx->std)  		return 0;  	if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags) || @@ -656,8 +648,8 @@ int cx18_s_std(struct file *file, void *fh, v4l2_std_id *std)  		return -EBUSY;  	} -	cx->std = *std; -	cx->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0; +	cx->std = std; +	cx->is_60hz = (std & V4L2_STD_525_60) ? 1 : 0;  	cx->is_50hz = !cx->is_60hz;  	cx2341x_handler_set_50hz(&cx->cxhdl, cx->is_50hz);  	cx->cxhdl.width = 720; @@ -673,7 +665,7 @@ int cx18_s_std(struct file *file, void *fh, v4l2_std_id *std)  	return 0;  } -static int cx18_s_tuner(struct file *file, void *fh, struct v4l2_tuner *vt) +static int cx18_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)  {  	struct cx18_open_id *id = fh2id(fh);  	struct cx18 *cx = id->cx; @@ -1118,7 +1110,7 @@ static int cx18_log_status(struct file *file, void *fh)  }  static long cx18_default(struct file *file, void *fh, bool valid_prio, -							int cmd, void *arg) +			 unsigned int cmd, void *arg)  {  	struct cx18 *cx = fh2id(fh)->cx;  |