Commit 09b3bc22 authored by Steven Toth's avatar Steven Toth Committed by Mauro Carvalho Chehab

[media] cx23885: Control cleanup on the MPEG Encoder

Added three new control calls (g_std, querystd and g_ctrl) to
the -417 driver. Also routed other controls through the main
cx23885 driver meaning that the controls for the 417 and the
raw video device all enter the driver code and are handled
in a single place.
Signed-off-by: default avatarSteven Toth <stoth@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 35045137
...@@ -1212,6 +1212,16 @@ static int cx23885_querymenu(struct cx23885_dev *dev, ...@@ -1212,6 +1212,16 @@ static int cx23885_querymenu(struct cx23885_dev *dev,
cx2341x_ctrl_get_menu(&dev->mpeg_params, qmenu->id)); cx2341x_ctrl_get_menu(&dev->mpeg_params, qmenu->id));
} }
static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
{
struct cx23885_fh *fh = file->private_data;
struct cx23885_dev *dev = fh->dev;
call_all(dev, core, g_std, id);
return 0;
}
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id) static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
{ {
struct cx23885_fh *fh = file->private_data; struct cx23885_fh *fh = file->private_data;
...@@ -1224,55 +1234,31 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id) ...@@ -1224,55 +1234,31 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
if (i == ARRAY_SIZE(cx23885_tvnorms)) if (i == ARRAY_SIZE(cx23885_tvnorms))
return -EINVAL; return -EINVAL;
dev->encodernorm = cx23885_tvnorms[i]; dev->encodernorm = cx23885_tvnorms[i];
/* Have the drier core notify the subdevices */
mutex_lock(&dev->lock);
cx23885_set_tvnorm(dev, *id);
mutex_unlock(&dev->lock);
return 0; return 0;
} }
static int vidioc_enum_input(struct file *file, void *priv, static int vidioc_enum_input(struct file *file, void *priv,
struct v4l2_input *i) struct v4l2_input *i)
{ {
struct cx23885_fh *fh = file->private_data; struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
struct cx23885_dev *dev = fh->dev; dprintk(1, "%s()\n", __func__);
struct cx23885_input *input; return cx23885_enum_input(dev, i);
int n;
if (i->index >= 4)
return -EINVAL;
input = &cx23885_boards[dev->board].input[i->index];
if (input->type == 0)
return -EINVAL;
/* FIXME
* strcpy(i->name, input->name); */
strcpy(i->name, "unset");
if (input->type == CX23885_VMUX_TELEVISION ||
input->type == CX23885_VMUX_CABLE)
i->type = V4L2_INPUT_TYPE_TUNER;
else
i->type = V4L2_INPUT_TYPE_CAMERA;
for (n = 0; n < ARRAY_SIZE(cx23885_tvnorms); n++)
i->std |= cx23885_tvnorms[n].id;
return 0;
} }
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
{ {
struct cx23885_fh *fh = file->private_data; return cx23885_get_input(file, priv, i);
struct cx23885_dev *dev = fh->dev;
*i = dev->input;
return 0;
} }
static int vidioc_s_input(struct file *file, void *priv, unsigned int i) static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
{ {
if (i >= 4) return cx23885_set_input(file, priv, i);
return -EINVAL;
return 0;
} }
static int vidioc_g_tuner(struct file *file, void *priv, static int vidioc_g_tuner(struct file *file, void *priv,
...@@ -1325,43 +1311,25 @@ static int vidioc_g_frequency(struct file *file, void *priv, ...@@ -1325,43 +1311,25 @@ static int vidioc_g_frequency(struct file *file, void *priv,
} }
static int vidioc_s_frequency(struct file *file, void *priv, static int vidioc_s_frequency(struct file *file, void *priv,
struct v4l2_frequency *f) struct v4l2_frequency *f)
{ {
struct cx23885_fh *fh = file->private_data; return cx23885_set_frequency(file, priv, f);
struct cx23885_dev *dev = fh->dev; }
cx23885_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0,
CX23885_END_NOW, CX23885_MPEG_CAPTURE,
CX23885_RAW_BITS_NONE);
dprintk(1, "VIDIOC_S_FREQUENCY: dev type %d, f\n",
dev->tuner_type);
dprintk(1, "VIDIOC_S_FREQUENCY: f tuner %d, f type %d\n",
f->tuner, f->type);
if (UNSET == dev->tuner_type)
return -EINVAL;
if (f->tuner != 0)
return -EINVAL;
if (f->type != V4L2_TUNER_ANALOG_TV)
return -EINVAL;
dev->freq = f->frequency;
call_all(dev, tuner, s_frequency, f);
cx23885_initialize_codec(dev, 0); static int vidioc_g_ctrl(struct file *file, void *priv,
struct v4l2_control *ctl)
{
struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
return 0; return cx23885_get_control(dev, ctl);
} }
static int vidioc_s_ctrl(struct file *file, void *priv, static int vidioc_s_ctrl(struct file *file, void *priv,
struct v4l2_control *ctl) struct v4l2_control *ctl)
{ {
struct cx23885_fh *fh = file->private_data; struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
struct cx23885_dev *dev = fh->dev;
/* Update the A/V core */ return cx23885_set_control(dev, ctl);
call_all(dev, core, s_ctrl, ctl);
return 0;
} }
static int vidioc_querycap(struct file *file, void *priv, static int vidioc_querycap(struct file *file, void *priv,
...@@ -1693,6 +1661,8 @@ static struct v4l2_file_operations mpeg_fops = { ...@@ -1693,6 +1661,8 @@ static struct v4l2_file_operations mpeg_fops = {
}; };
static const struct v4l2_ioctl_ops mpeg_ioctl_ops = { static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
.vidioc_querystd = vidioc_g_std,
.vidioc_g_std = vidioc_g_std,
.vidioc_s_std = vidioc_s_std, .vidioc_s_std = vidioc_s_std,
.vidioc_enum_input = vidioc_enum_input, .vidioc_enum_input = vidioc_enum_input,
.vidioc_g_input = vidioc_g_input, .vidioc_g_input = vidioc_g_input,
...@@ -1702,6 +1672,7 @@ static const struct v4l2_ioctl_ops mpeg_ioctl_ops = { ...@@ -1702,6 +1672,7 @@ static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
.vidioc_g_frequency = vidioc_g_frequency, .vidioc_g_frequency = vidioc_g_frequency,
.vidioc_s_frequency = vidioc_s_frequency, .vidioc_s_frequency = vidioc_s_frequency,
.vidioc_s_ctrl = vidioc_s_ctrl, .vidioc_s_ctrl = vidioc_s_ctrl,
.vidioc_g_ctrl = vidioc_g_ctrl,
.vidioc_querycap = vidioc_querycap, .vidioc_querycap = vidioc_querycap,
.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
......
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