V4L/DVB (8506): empress: fix control handling oops
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
1052efe0fc
commit
531d83a3d3
@ -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 = {
|
|||||||
|
|
||||||
.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 = {
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(saa7134_g_ctrl);
|
EXPORT_SYMBOL_GPL(saa7134_g_ctrl_internal);
|
||||||
|
|
||||||
int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c)
|
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_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;
|
||||||
|
|
||||||
err = v4l2_prio_check(&dev->prio, &fh->prio);
|
/* When called from the empress code fh == NULL.
|
||||||
if (0 != err)
|
That needs to be fixed somehow, but for now this is
|
||||||
return err;
|
good enough. */
|
||||||
|
if (fh) {
|
||||||
|
err = v4l2_prio_check(&dev->prio, &fh->prio);
|
||||||
|
if (0 != err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
err = -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&dev->lock);
|
mutex_lock(&dev->lock);
|
||||||
|
|
||||||
@ -1274,7 +1283,14 @@ error:
|
|||||||
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;
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user