|
@@ -711,28 +711,26 @@ static int ivtv_g_chip_ident(struct file *file, void *fh, struct v4l2_dbg_chip_i
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
-static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
|
|
|
+static int ivtv_itvc(struct ivtv *itv, bool get, u64 reg, u64 *val)
|
|
|
{
|
|
|
- struct v4l2_dbg_register *regs = arg;
|
|
|
volatile u8 __iomem *reg_start;
|
|
|
|
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
|
return -EPERM;
|
|
|
- if (regs->reg >= IVTV_REG_OFFSET && regs->reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
|
|
|
+ if (reg >= IVTV_REG_OFFSET && reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
|
|
|
reg_start = itv->reg_mem - IVTV_REG_OFFSET;
|
|
|
- else if (itv->has_cx23415 && regs->reg >= IVTV_DECODER_OFFSET &&
|
|
|
- regs->reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
|
|
|
+ else if (itv->has_cx23415 && reg >= IVTV_DECODER_OFFSET &&
|
|
|
+ reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
|
|
|
reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
|
|
|
- else if (regs->reg < IVTV_ENCODER_SIZE)
|
|
|
+ else if (reg < IVTV_ENCODER_SIZE)
|
|
|
reg_start = itv->enc_mem;
|
|
|
else
|
|
|
return -EINVAL;
|
|
|
|
|
|
- regs->size = 4;
|
|
|
- if (cmd == VIDIOC_DBG_G_REGISTER)
|
|
|
- regs->val = readl(regs->reg + reg_start);
|
|
|
+ if (get)
|
|
|
+ *val = readl(reg + reg_start);
|
|
|
else
|
|
|
- writel(regs->val, regs->reg + reg_start);
|
|
|
+ writel(*val, reg + reg_start);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -740,8 +738,10 @@ static int ivtv_g_register(struct file *file, void *fh, struct v4l2_dbg_register
|
|
|
{
|
|
|
struct ivtv *itv = fh2id(fh)->itv;
|
|
|
|
|
|
- if (v4l2_chip_match_host(®->match))
|
|
|
- return ivtv_itvc(itv, VIDIOC_DBG_G_REGISTER, reg);
|
|
|
+ if (v4l2_chip_match_host(®->match)) {
|
|
|
+ reg->size = 4;
|
|
|
+ return ivtv_itvc(itv, true, reg->reg, ®->val);
|
|
|
+ }
|
|
|
/* TODO: subdev errors should not be ignored, this should become a
|
|
|
subdev helper function. */
|
|
|
ivtv_call_all(itv, core, g_register, reg);
|
|
@@ -753,7 +753,7 @@ static int ivtv_s_register(struct file *file, void *fh, struct v4l2_dbg_register
|
|
|
struct ivtv *itv = fh2id(fh)->itv;
|
|
|
|
|
|
if (v4l2_chip_match_host(®->match))
|
|
|
- return ivtv_itvc(itv, VIDIOC_DBG_S_REGISTER, reg);
|
|
|
+ return ivtv_itvc(itv, false, reg->reg, ®->val);
|
|
|
/* TODO: subdev errors should not be ignored, this should become a
|
|
|
subdev helper function. */
|
|
|
ivtv_call_all(itv, core, s_register, reg);
|