Commit 531d83a3 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

V4L/DVB (8506): empress: fix control handling oops

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 1052efe0
...@@ -329,6 +329,22 @@ static int empress_g_ext_ctrls(struct file *file, void *priv, ...@@ -329,6 +329,22 @@ static int empress_g_ext_ctrls(struct file *file, void *priv,
return saa7134_i2c_call_saa6752(dev, VIDIOC_G_EXT_CTRLS, ctrls); return saa7134_i2c_call_saa6752(dev, VIDIOC_G_EXT_CTRLS, ctrls);
} }
static int empress_g_ctrl(struct file *file, void *priv,
struct v4l2_control *c)
{
struct saa7134_dev *dev = file->private_data;
return saa7134_g_ctrl_internal(dev, NULL, c);
}
static int empress_s_ctrl(struct file *file, void *priv,
struct v4l2_control *c)
{
struct saa7134_dev *dev = file->private_data;
return saa7134_s_ctrl_internal(dev, NULL, c);
}
static int empress_queryctrl(struct file *file, void *priv, static int empress_queryctrl(struct file *file, void *priv,
struct v4l2_queryctrl *c) struct v4l2_queryctrl *c)
{ {
...@@ -415,8 +431,8 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = { ...@@ -415,8 +431,8 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
.vidioc_queryctrl = empress_queryctrl, .vidioc_queryctrl = empress_queryctrl,
.vidioc_querymenu = empress_querymenu, .vidioc_querymenu = empress_querymenu,
.vidioc_g_ctrl = saa7134_g_ctrl, .vidioc_g_ctrl = empress_g_ctrl,
.vidioc_s_ctrl = saa7134_s_ctrl, .vidioc_s_ctrl = empress_s_ctrl,
}; };
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
......
...@@ -1112,10 +1112,8 @@ static struct videobuf_queue_ops video_qops = { ...@@ -1112,10 +1112,8 @@ static struct videobuf_queue_ops video_qops = {
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c) int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c)
{ {
struct saa7134_fh *fh = priv;
struct saa7134_dev *dev = fh->dev;
const struct v4l2_queryctrl* ctrl; const struct v4l2_queryctrl* ctrl;
ctrl = ctrl_by_id(c->id); ctrl = ctrl_by_id(c->id);
...@@ -1160,20 +1158,31 @@ int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c) ...@@ -1160,20 +1158,31 @@ int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c)
} }
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(saa7134_g_ctrl); EXPORT_SYMBOL_GPL(saa7134_g_ctrl_internal);
static int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c)
{
struct saa7134_fh *fh = priv;
return saa7134_g_ctrl_internal(fh->dev, fh, c);
}
int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c) int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c)
{ {
const struct v4l2_queryctrl* ctrl; const struct v4l2_queryctrl* ctrl;
struct saa7134_fh *fh = f;
struct saa7134_dev *dev = fh->dev;
unsigned long flags; unsigned long flags;
int restart_overlay = 0; int restart_overlay = 0;
int err = -EINVAL; int err;
/* When called from the empress code fh == NULL.
That needs to be fixed somehow, but for now this is
good enough. */
if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio); err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err) if (0 != err)
return err; return err;
}
err = -EINVAL;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
...@@ -1274,7 +1283,14 @@ int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c) ...@@ -1274,7 +1283,14 @@ int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c)
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return err; return err;
} }
EXPORT_SYMBOL_GPL(saa7134_s_ctrl); EXPORT_SYMBOL_GPL(saa7134_s_ctrl_internal);
static int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c)
{
struct saa7134_fh *fh = f;
return saa7134_s_ctrl_internal(fh->dev, fh, c);
}
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
......
...@@ -663,8 +663,8 @@ extern unsigned int video_debug; ...@@ -663,8 +663,8 @@ extern unsigned int video_debug;
extern struct video_device saa7134_video_template; extern struct video_device saa7134_video_template;
extern struct video_device saa7134_radio_template; extern struct video_device saa7134_radio_template;
int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c); int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c); int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c); int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c);
int saa7134_videoport_init(struct saa7134_dev *dev); int saa7134_videoport_init(struct saa7134_dev *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment