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

[media] ivtv: simplify how the decoder controls are set up

The code was unnecessarily complex, introducing a hdl_out handler that was
not needed. Instead just add the controls to the cxhdl.hdl handler directly.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 072e6602
...@@ -129,7 +129,7 @@ int ivtv_g_pts_frame(struct ivtv *itv, s64 *pts, s64 *frame) ...@@ -129,7 +129,7 @@ int ivtv_g_pts_frame(struct ivtv *itv, s64 *pts, s64 *frame)
static int ivtv_g_volatile_ctrl(struct v4l2_ctrl *ctrl) static int ivtv_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
{ {
struct ivtv *itv = container_of(ctrl->handler, struct ivtv, hdl_out); struct ivtv *itv = container_of(ctrl->handler, struct ivtv, cxhdl.hdl);
switch (ctrl->id) { switch (ctrl->id) {
/* V4L2_CID_MPEG_VIDEO_DEC_PTS and V4L2_CID_MPEG_VIDEO_DEC_FRAME /* V4L2_CID_MPEG_VIDEO_DEC_PTS and V4L2_CID_MPEG_VIDEO_DEC_FRAME
...@@ -143,7 +143,7 @@ static int ivtv_g_volatile_ctrl(struct v4l2_ctrl *ctrl) ...@@ -143,7 +143,7 @@ static int ivtv_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
static int ivtv_s_ctrl(struct v4l2_ctrl *ctrl) static int ivtv_s_ctrl(struct v4l2_ctrl *ctrl)
{ {
struct ivtv *itv = container_of(ctrl->handler, struct ivtv, hdl_out); struct ivtv *itv = container_of(ctrl->handler, struct ivtv, cxhdl.hdl);
switch (ctrl->id) { switch (ctrl->id) {
/* V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK and MULTILINGUAL_PLAYBACK /* V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK and MULTILINGUAL_PLAYBACK
......
...@@ -1198,28 +1198,28 @@ static int __devinit ivtv_probe(struct pci_dev *pdev, ...@@ -1198,28 +1198,28 @@ static int __devinit ivtv_probe(struct pci_dev *pdev,
itv->tuner_std = itv->std; itv->tuner_std = itv->std;
if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) { if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
v4l2_ctrl_handler_init(&itv->hdl_out, 50); struct v4l2_ctrl_handler *hdl = itv->v4l2_dev.ctrl_handler;
itv->ctrl_pts = v4l2_ctrl_new_std(&itv->hdl_out, &ivtv_hdl_out_ops,
itv->ctrl_pts = v4l2_ctrl_new_std(hdl, &ivtv_hdl_out_ops,
V4L2_CID_MPEG_VIDEO_DEC_PTS, 0, 0, 1, 0); V4L2_CID_MPEG_VIDEO_DEC_PTS, 0, 0, 1, 0);
itv->ctrl_frame = v4l2_ctrl_new_std(&itv->hdl_out, &ivtv_hdl_out_ops, itv->ctrl_frame = v4l2_ctrl_new_std(hdl, &ivtv_hdl_out_ops,
V4L2_CID_MPEG_VIDEO_DEC_FRAME, 0, 0x7fffffff, 1, 0); V4L2_CID_MPEG_VIDEO_DEC_FRAME, 0, 0x7fffffff, 1, 0);
/* Note: V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO is not supported, /* Note: V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO is not supported,
mask that menu item. */ mask that menu item. */
itv->ctrl_audio_playback = itv->ctrl_audio_playback =
v4l2_ctrl_new_std_menu(&itv->hdl_out, &ivtv_hdl_out_ops, v4l2_ctrl_new_std_menu(hdl, &ivtv_hdl_out_ops,
V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK, V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK,
V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO, V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO,
1 << V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO, 1 << V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO,
V4L2_MPEG_AUDIO_DEC_PLAYBACK_STEREO); V4L2_MPEG_AUDIO_DEC_PLAYBACK_STEREO);
itv->ctrl_audio_multilingual_playback = itv->ctrl_audio_multilingual_playback =
v4l2_ctrl_new_std_menu(&itv->hdl_out, &ivtv_hdl_out_ops, v4l2_ctrl_new_std_menu(hdl, &ivtv_hdl_out_ops,
V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK, V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK,
V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO, V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO,
1 << V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO, 1 << V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO,
V4L2_MPEG_AUDIO_DEC_PLAYBACK_LEFT); V4L2_MPEG_AUDIO_DEC_PLAYBACK_LEFT);
v4l2_ctrl_add_handler(&itv->hdl_out, &itv->cxhdl.hdl); if (hdl->error) {
if (itv->hdl_out.error) { retval = hdl->error;
retval = itv->hdl_out.error;
goto free_i2c; goto free_i2c;
} }
v4l2_ctrl_cluster(2, &itv->ctrl_pts); v4l2_ctrl_cluster(2, &itv->ctrl_pts);
...@@ -1260,8 +1260,6 @@ static int __devinit ivtv_probe(struct pci_dev *pdev, ...@@ -1260,8 +1260,6 @@ static int __devinit ivtv_probe(struct pci_dev *pdev,
free_irq: free_irq:
free_irq(itv->pdev->irq, (void *)itv); free_irq(itv->pdev->irq, (void *)itv);
free_i2c: free_i2c:
if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
v4l2_ctrl_handler_free(&itv->hdl_out);
v4l2_ctrl_handler_free(&itv->cxhdl.hdl); v4l2_ctrl_handler_free(&itv->cxhdl.hdl);
exit_ivtv_i2c(itv); exit_ivtv_i2c(itv);
free_io: free_io:
...@@ -1418,8 +1416,6 @@ static void ivtv_remove(struct pci_dev *pdev) ...@@ -1418,8 +1416,6 @@ static void ivtv_remove(struct pci_dev *pdev)
ivtv_streams_cleanup(itv, 1); ivtv_streams_cleanup(itv, 1);
ivtv_udma_free(itv); ivtv_udma_free(itv);
if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
v4l2_ctrl_handler_free(&itv->hdl_out);
v4l2_ctrl_handler_free(&itv->cxhdl.hdl); v4l2_ctrl_handler_free(&itv->cxhdl.hdl);
exit_ivtv_i2c(itv); exit_ivtv_i2c(itv);
......
...@@ -641,7 +641,6 @@ struct ivtv { ...@@ -641,7 +641,6 @@ struct ivtv {
struct v4l2_ctrl *ctrl_audio_playback; struct v4l2_ctrl *ctrl_audio_playback;
struct v4l2_ctrl *ctrl_audio_multilingual_playback; struct v4l2_ctrl *ctrl_audio_multilingual_playback;
}; };
struct v4l2_ctrl_handler hdl_out;
struct v4l2_ctrl_handler hdl_gpio; struct v4l2_ctrl_handler hdl_gpio;
struct v4l2_subdev sd_gpio; /* GPIO sub-device */ struct v4l2_subdev sd_gpio; /* GPIO sub-device */
u16 instance; u16 instance;
......
...@@ -1548,10 +1548,7 @@ static int ivtv_log_status(struct file *file, void *fh) ...@@ -1548,10 +1548,7 @@ static int ivtv_log_status(struct file *file, void *fh)
} }
IVTV_INFO("Tuner: %s\n", IVTV_INFO("Tuner: %s\n",
test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV"); test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
v4l2_ctrl_handler_log_status(&itv->hdl_out, itv->v4l2_dev.name);
else
v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags); IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
for (i = 0; i < IVTV_MAX_STREAMS; i++) { for (i = 0; i < IVTV_MAX_STREAMS; i++) {
struct ivtv_stream *s = &itv->streams[i]; struct ivtv_stream *s = &itv->streams[i];
......
...@@ -223,11 +223,8 @@ static int ivtv_prep_dev(struct ivtv *itv, int type) ...@@ -223,11 +223,8 @@ static int ivtv_prep_dev(struct ivtv *itv, int type)
s->vdev->num = num; s->vdev->num = num;
s->vdev->v4l2_dev = &itv->v4l2_dev; s->vdev->v4l2_dev = &itv->v4l2_dev;
if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
s->vdev->ctrl_handler = &itv->hdl_out;
else
s->vdev->ctrl_handler = itv->v4l2_dev.ctrl_handler;
s->vdev->fops = ivtv_stream_info[type].fops; s->vdev->fops = ivtv_stream_info[type].fops;
s->vdev->ctrl_handler = itv->v4l2_dev.ctrl_handler;
s->vdev->release = video_device_release; s->vdev->release = video_device_release;
s->vdev->tvnorms = V4L2_STD_ALL; s->vdev->tvnorms = V4L2_STD_ALL;
s->vdev->lock = &itv->serialize_lock; s->vdev->lock = &itv->serialize_lock;
......
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