diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2010-06-27 05:07:26 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-08-08 22:43:06 -0400 |
commit | f7b80e6919df812b4bed99a927325312a904111b (patch) | |
tree | 6828bb6bfeea81a8345b148dbca8b2fdcadec7eb /drivers/media | |
parent | 2fd781448acd6cbc3ca9d2f48b0e16f67a77bf51 (diff) |
V4L/DVB: ivtv: convert to the new control framework
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/ivtv/ivtv-controls.c | 276 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-controls.h | 6 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-driver.c | 18 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-driver.h | 5 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-fileops.c | 23 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-firmware.c | 6 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-ioctl.c | 31 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-streams.c | 24 |
8 files changed, 88 insertions, 301 deletions
diff --git a/drivers/media/video/ivtv/ivtv-controls.c b/drivers/media/video/ivtv/ivtv-controls.c index b588e30cbcf0..b31ee1bceef8 100644 --- a/drivers/media/video/ivtv/ivtv-controls.c +++ b/drivers/media/video/ivtv/ivtv-controls.c | |||
@@ -17,163 +17,14 @@ | |||
17 | along with this program; if not, write to the Free Software | 17 | along with this program; if not, write to the Free Software |
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | #include <linux/kernel.h> | ||
21 | #include <linux/slab.h> | ||
22 | 20 | ||
23 | #include "ivtv-driver.h" | 21 | #include "ivtv-driver.h" |
24 | #include "ivtv-cards.h" | ||
25 | #include "ivtv-ioctl.h" | 22 | #include "ivtv-ioctl.h" |
26 | #include "ivtv-routing.h" | ||
27 | #include "ivtv-i2c.h" | ||
28 | #include "ivtv-mailbox.h" | ||
29 | #include "ivtv-controls.h" | 23 | #include "ivtv-controls.h" |
30 | 24 | ||
31 | /* Must be sorted from low to high control ID! */ | 25 | static int ivtv_s_stream_vbi_fmt(struct cx2341x_handler *cxhdl, u32 fmt) |
32 | static const u32 user_ctrls[] = { | ||
33 | V4L2_CID_USER_CLASS, | ||
34 | V4L2_CID_BRIGHTNESS, | ||
35 | V4L2_CID_CONTRAST, | ||
36 | V4L2_CID_SATURATION, | ||
37 | V4L2_CID_HUE, | ||
38 | V4L2_CID_AUDIO_VOLUME, | ||
39 | V4L2_CID_AUDIO_BALANCE, | ||
40 | V4L2_CID_AUDIO_BASS, | ||
41 | V4L2_CID_AUDIO_TREBLE, | ||
42 | V4L2_CID_AUDIO_MUTE, | ||
43 | V4L2_CID_AUDIO_LOUDNESS, | ||
44 | 0 | ||
45 | }; | ||
46 | |||
47 | static const u32 *ctrl_classes[] = { | ||
48 | user_ctrls, | ||
49 | cx2341x_mpeg_ctrls, | ||
50 | NULL | ||
51 | }; | ||
52 | |||
53 | |||
54 | int ivtv_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *qctrl) | ||
55 | { | ||
56 | struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; | ||
57 | const char *name; | ||
58 | |||
59 | qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id); | ||
60 | if (qctrl->id == 0) | ||
61 | return -EINVAL; | ||
62 | |||
63 | switch (qctrl->id) { | ||
64 | /* Standard V4L2 controls */ | ||
65 | case V4L2_CID_USER_CLASS: | ||
66 | return v4l2_ctrl_query_fill(qctrl, 0, 0, 0, 0); | ||
67 | case V4L2_CID_BRIGHTNESS: | ||
68 | case V4L2_CID_HUE: | ||
69 | case V4L2_CID_SATURATION: | ||
70 | case V4L2_CID_CONTRAST: | ||
71 | if (v4l2_subdev_call(itv->sd_video, core, queryctrl, qctrl)) | ||
72 | qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; | ||
73 | return 0; | ||
74 | |||
75 | case V4L2_CID_AUDIO_VOLUME: | ||
76 | case V4L2_CID_AUDIO_MUTE: | ||
77 | case V4L2_CID_AUDIO_BALANCE: | ||
78 | case V4L2_CID_AUDIO_BASS: | ||
79 | case V4L2_CID_AUDIO_TREBLE: | ||
80 | case V4L2_CID_AUDIO_LOUDNESS: | ||
81 | if (v4l2_subdev_call(itv->sd_audio, core, queryctrl, qctrl)) | ||
82 | qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; | ||
83 | return 0; | ||
84 | |||
85 | default: | ||
86 | if (cx2341x_ctrl_query(&itv->params, qctrl)) | ||
87 | qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; | ||
88 | return 0; | ||
89 | } | ||
90 | strncpy(qctrl->name, name, sizeof(qctrl->name) - 1); | ||
91 | qctrl->name[sizeof(qctrl->name) - 1] = 0; | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | int ivtv_querymenu(struct file *file, void *fh, struct v4l2_querymenu *qmenu) | ||
96 | { | ||
97 | struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; | ||
98 | struct v4l2_queryctrl qctrl; | ||
99 | |||
100 | qctrl.id = qmenu->id; | ||
101 | ivtv_queryctrl(file, fh, &qctrl); | ||
102 | return v4l2_ctrl_query_menu(qmenu, &qctrl, | ||
103 | cx2341x_ctrl_get_menu(&itv->params, qmenu->id)); | ||
104 | } | ||
105 | |||
106 | static int ivtv_try_ctrl(struct file *file, void *fh, | ||
107 | struct v4l2_ext_control *vctrl) | ||
108 | { | ||
109 | struct v4l2_queryctrl qctrl; | ||
110 | const char **menu_items = NULL; | ||
111 | int err; | ||
112 | |||
113 | qctrl.id = vctrl->id; | ||
114 | err = ivtv_queryctrl(file, fh, &qctrl); | ||
115 | if (err) | ||
116 | return err; | ||
117 | if (qctrl.type == V4L2_CTRL_TYPE_MENU) | ||
118 | menu_items = v4l2_ctrl_get_menu(qctrl.id); | ||
119 | return v4l2_ctrl_check(vctrl, &qctrl, menu_items); | ||
120 | } | ||
121 | |||
122 | static int ivtv_s_ctrl(struct ivtv *itv, struct v4l2_control *vctrl) | ||
123 | { | ||
124 | switch (vctrl->id) { | ||
125 | /* Standard V4L2 controls */ | ||
126 | case V4L2_CID_BRIGHTNESS: | ||
127 | case V4L2_CID_HUE: | ||
128 | case V4L2_CID_SATURATION: | ||
129 | case V4L2_CID_CONTRAST: | ||
130 | return v4l2_subdev_call(itv->sd_video, core, s_ctrl, vctrl); | ||
131 | |||
132 | case V4L2_CID_AUDIO_VOLUME: | ||
133 | case V4L2_CID_AUDIO_MUTE: | ||
134 | case V4L2_CID_AUDIO_BALANCE: | ||
135 | case V4L2_CID_AUDIO_BASS: | ||
136 | case V4L2_CID_AUDIO_TREBLE: | ||
137 | case V4L2_CID_AUDIO_LOUDNESS: | ||
138 | return v4l2_subdev_call(itv->sd_audio, core, s_ctrl, vctrl); | ||
139 | |||
140 | default: | ||
141 | IVTV_DEBUG_IOCTL("invalid control 0x%x\n", vctrl->id); | ||
142 | return -EINVAL; | ||
143 | } | ||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | static int ivtv_g_ctrl(struct ivtv *itv, struct v4l2_control *vctrl) | ||
148 | { | 26 | { |
149 | switch (vctrl->id) { | 27 | struct ivtv *itv = container_of(cxhdl, struct ivtv, cxhdl); |
150 | /* Standard V4L2 controls */ | ||
151 | case V4L2_CID_BRIGHTNESS: | ||
152 | case V4L2_CID_HUE: | ||
153 | case V4L2_CID_SATURATION: | ||
154 | case V4L2_CID_CONTRAST: | ||
155 | return v4l2_subdev_call(itv->sd_video, core, g_ctrl, vctrl); | ||
156 | |||
157 | case V4L2_CID_AUDIO_VOLUME: | ||
158 | case V4L2_CID_AUDIO_MUTE: | ||
159 | case V4L2_CID_AUDIO_BALANCE: | ||
160 | case V4L2_CID_AUDIO_BASS: | ||
161 | case V4L2_CID_AUDIO_TREBLE: | ||
162 | case V4L2_CID_AUDIO_LOUDNESS: | ||
163 | return v4l2_subdev_call(itv->sd_audio, core, g_ctrl, vctrl); | ||
164 | default: | ||
165 | IVTV_DEBUG_IOCTL("invalid control 0x%x\n", vctrl->id); | ||
166 | return -EINVAL; | ||
167 | } | ||
168 | return 0; | ||
169 | } | ||
170 | |||
171 | static int ivtv_setup_vbi_fmt(struct ivtv *itv, enum v4l2_mpeg_stream_vbi_fmt fmt) | ||
172 | { | ||
173 | if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_CAPTURE)) | ||
174 | return -EINVAL; | ||
175 | if (atomic_read(&itv->capturing) > 0) | ||
176 | return -EBUSY; | ||
177 | 28 | ||
178 | /* First try to allocate sliced VBI buffers if needed. */ | 29 | /* First try to allocate sliced VBI buffers if needed. */ |
179 | if (fmt && itv->vbi.sliced_mpeg_data[0] == NULL) { | 30 | if (fmt && itv->vbi.sliced_mpeg_data[0] == NULL) { |
@@ -208,106 +59,43 @@ static int ivtv_setup_vbi_fmt(struct ivtv *itv, enum v4l2_mpeg_stream_vbi_fmt fm | |||
208 | return 0; | 59 | return 0; |
209 | } | 60 | } |
210 | 61 | ||
211 | int ivtv_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) | 62 | static int ivtv_s_video_encoding(struct cx2341x_handler *cxhdl, u32 val) |
212 | { | 63 | { |
213 | struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; | 64 | struct ivtv *itv = container_of(cxhdl, struct ivtv, cxhdl); |
214 | struct v4l2_control ctrl; | 65 | int is_mpeg1 = val == V4L2_MPEG_VIDEO_ENCODING_MPEG_1; |
215 | 66 | struct v4l2_mbus_framefmt fmt; | |
216 | if (c->ctrl_class == V4L2_CTRL_CLASS_USER) { | 67 | |
217 | int i; | 68 | /* fix videodecoder resolution */ |
218 | int err = 0; | 69 | fmt.width = cxhdl->width / (is_mpeg1 ? 2 : 1); |
219 | 70 | fmt.height = cxhdl->height; | |
220 | for (i = 0; i < c->count; i++) { | 71 | fmt.code = V4L2_MBUS_FMT_FIXED; |
221 | ctrl.id = c->controls[i].id; | 72 | v4l2_subdev_call(itv->sd_video, video, s_mbus_fmt, &fmt); |
222 | ctrl.value = c->controls[i].value; | 73 | return 0; |
223 | err = ivtv_g_ctrl(itv, &ctrl); | ||
224 | c->controls[i].value = ctrl.value; | ||
225 | if (err) { | ||
226 | c->error_idx = i; | ||
227 | break; | ||
228 | } | ||
229 | } | ||
230 | return err; | ||
231 | } | ||
232 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) | ||
233 | return cx2341x_ext_ctrls(&itv->params, 0, c, VIDIOC_G_EXT_CTRLS); | ||
234 | return -EINVAL; | ||
235 | } | 74 | } |
236 | 75 | ||
237 | int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) | 76 | static int ivtv_s_audio_sampling_freq(struct cx2341x_handler *cxhdl, u32 idx) |
238 | { | 77 | { |
239 | struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; | 78 | static const u32 freqs[3] = { 44100, 48000, 32000 }; |
240 | struct v4l2_control ctrl; | 79 | struct ivtv *itv = container_of(cxhdl, struct ivtv, cxhdl); |
241 | |||
242 | if (c->ctrl_class == V4L2_CTRL_CLASS_USER) { | ||
243 | int i; | ||
244 | int err = 0; | ||
245 | |||
246 | for (i = 0; i < c->count; i++) { | ||
247 | ctrl.id = c->controls[i].id; | ||
248 | ctrl.value = c->controls[i].value; | ||
249 | err = ivtv_s_ctrl(itv, &ctrl); | ||
250 | c->controls[i].value = ctrl.value; | ||
251 | if (err) { | ||
252 | c->error_idx = i; | ||
253 | break; | ||
254 | } | ||
255 | } | ||
256 | return err; | ||
257 | } | ||
258 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) { | ||
259 | static u32 freqs[3] = { 44100, 48000, 32000 }; | ||
260 | struct cx2341x_mpeg_params p = itv->params; | ||
261 | int err = cx2341x_ext_ctrls(&p, atomic_read(&itv->capturing), c, VIDIOC_S_EXT_CTRLS); | ||
262 | unsigned idx; | ||
263 | |||
264 | if (err) | ||
265 | return err; | ||
266 | 80 | ||
267 | if (p.video_encoding != itv->params.video_encoding) { | 81 | /* The audio clock of the digitizer must match the codec sample |
268 | int is_mpeg1 = p.video_encoding == | 82 | rate otherwise you get some very strange effects. */ |
269 | V4L2_MPEG_VIDEO_ENCODING_MPEG_1; | 83 | if (idx < ARRAY_SIZE(freqs)) |
270 | struct v4l2_mbus_framefmt fmt; | 84 | ivtv_call_all(itv, audio, s_clock_freq, freqs[idx]); |
271 | 85 | return 0; | |
272 | /* fix videodecoder resolution */ | ||
273 | fmt.width = itv->params.width / (is_mpeg1 ? 2 : 1); | ||
274 | fmt.height = itv->params.height; | ||
275 | fmt.code = V4L2_MBUS_FMT_FIXED; | ||
276 | v4l2_subdev_call(itv->sd_video, video, s_mbus_fmt, &fmt); | ||
277 | } | ||
278 | err = cx2341x_update(itv, ivtv_api_func, &itv->params, &p); | ||
279 | if (!err && itv->params.stream_vbi_fmt != p.stream_vbi_fmt) | ||
280 | err = ivtv_setup_vbi_fmt(itv, p.stream_vbi_fmt); | ||
281 | itv->params = p; | ||
282 | itv->dualwatch_stereo_mode = p.audio_properties & 0x0300; | ||
283 | idx = p.audio_properties & 0x03; | ||
284 | /* The audio clock of the digitizer must match the codec sample | ||
285 | rate otherwise you get some very strange effects. */ | ||
286 | if (idx < ARRAY_SIZE(freqs)) | ||
287 | ivtv_call_all(itv, audio, s_clock_freq, freqs[idx]); | ||
288 | return err; | ||
289 | } | ||
290 | return -EINVAL; | ||
291 | } | 86 | } |
292 | 87 | ||
293 | int ivtv_try_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) | 88 | static int ivtv_s_audio_mode(struct cx2341x_handler *cxhdl, u32 val) |
294 | { | 89 | { |
295 | struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; | 90 | struct ivtv *itv = container_of(cxhdl, struct ivtv, cxhdl); |
296 | 91 | ||
297 | if (c->ctrl_class == V4L2_CTRL_CLASS_USER) { | 92 | itv->dualwatch_stereo_mode = val; |
298 | int i; | 93 | return 0; |
299 | int err = 0; | ||
300 | |||
301 | for (i = 0; i < c->count; i++) { | ||
302 | err = ivtv_try_ctrl(file, fh, &c->controls[i]); | ||
303 | if (err) { | ||
304 | c->error_idx = i; | ||
305 | break; | ||
306 | } | ||
307 | } | ||
308 | return err; | ||
309 | } | ||
310 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) | ||
311 | return cx2341x_ext_ctrls(&itv->params, atomic_read(&itv->capturing), c, VIDIOC_TRY_EXT_CTRLS); | ||
312 | return -EINVAL; | ||
313 | } | 94 | } |
95 | |||
96 | struct cx2341x_handler_ops ivtv_cxhdl_ops = { | ||
97 | .s_audio_mode = ivtv_s_audio_mode, | ||
98 | .s_audio_sampling_freq = ivtv_s_audio_sampling_freq, | ||
99 | .s_video_encoding = ivtv_s_video_encoding, | ||
100 | .s_stream_vbi_fmt = ivtv_s_stream_vbi_fmt, | ||
101 | }; | ||
diff --git a/drivers/media/video/ivtv/ivtv-controls.h b/drivers/media/video/ivtv/ivtv-controls.h index 1c7721e23c9b..d12893dd0183 100644 --- a/drivers/media/video/ivtv/ivtv-controls.h +++ b/drivers/media/video/ivtv/ivtv-controls.h | |||
@@ -21,10 +21,6 @@ | |||
21 | #ifndef IVTV_CONTROLS_H | 21 | #ifndef IVTV_CONTROLS_H |
22 | #define IVTV_CONTROLS_H | 22 | #define IVTV_CONTROLS_H |
23 | 23 | ||
24 | int ivtv_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *a); | 24 | extern struct cx2341x_handler_ops ivtv_cxhdl_ops; |
25 | int ivtv_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a); | ||
26 | int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a); | ||
27 | int ivtv_try_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a); | ||
28 | int ivtv_querymenu(struct file *file, void *fh, struct v4l2_querymenu *a); | ||
29 | 25 | ||
30 | #endif | 26 | #endif |
diff --git a/drivers/media/video/ivtv/ivtv-driver.c b/drivers/media/video/ivtv/ivtv-driver.c index 53ea31aab155..e421d15b0f5c 100644 --- a/drivers/media/video/ivtv/ivtv-driver.c +++ b/drivers/media/video/ivtv/ivtv-driver.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include "ivtv-cards.h" | 53 | #include "ivtv-cards.h" |
54 | #include "ivtv-vbi.h" | 54 | #include "ivtv-vbi.h" |
55 | #include "ivtv-routing.h" | 55 | #include "ivtv-routing.h" |
56 | #include "ivtv-controls.h" | ||
56 | #include "ivtv-gpio.h" | 57 | #include "ivtv-gpio.h" |
57 | 58 | ||
58 | #include <media/tveeprom.h> | 59 | #include <media/tveeprom.h> |
@@ -734,9 +735,8 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv) | |||
734 | itv->open_id = 1; | 735 | itv->open_id = 1; |
735 | 736 | ||
736 | /* Initial settings */ | 737 | /* Initial settings */ |
737 | cx2341x_fill_defaults(&itv->params); | 738 | itv->cxhdl.port = CX2341X_PORT_MEMORY; |
738 | itv->params.port = CX2341X_PORT_MEMORY; | 739 | itv->cxhdl.capabilities = CX2341X_CAP_HAS_SLICED_VBI; |
739 | itv->params.capabilities = CX2341X_CAP_HAS_SLICED_VBI; | ||
740 | init_waitqueue_head(&itv->eos_waitq); | 740 | init_waitqueue_head(&itv->eos_waitq); |
741 | init_waitqueue_head(&itv->event_waitq); | 741 | init_waitqueue_head(&itv->event_waitq); |
742 | init_waitqueue_head(&itv->vsync_waitq); | 742 | init_waitqueue_head(&itv->vsync_waitq); |
@@ -1006,6 +1006,13 @@ static int __devinit ivtv_probe(struct pci_dev *pdev, | |||
1006 | retval = -ENOMEM; | 1006 | retval = -ENOMEM; |
1007 | goto err; | 1007 | goto err; |
1008 | } | 1008 | } |
1009 | retval = cx2341x_handler_init(&itv->cxhdl, 50); | ||
1010 | if (retval) | ||
1011 | goto err; | ||
1012 | itv->v4l2_dev.ctrl_handler = &itv->cxhdl.hdl; | ||
1013 | itv->cxhdl.ops = &ivtv_cxhdl_ops; | ||
1014 | itv->cxhdl.priv = itv; | ||
1015 | itv->cxhdl.func = ivtv_api_func; | ||
1009 | 1016 | ||
1010 | IVTV_DEBUG_INFO("base addr: 0x%08x\n", itv->base_addr); | 1017 | IVTV_DEBUG_INFO("base addr: 0x%08x\n", itv->base_addr); |
1011 | 1018 | ||
@@ -1127,7 +1134,7 @@ static int __devinit ivtv_probe(struct pci_dev *pdev, | |||
1127 | itv->yuv_info.v4l2_src_w = itv->yuv_info.osd_full_w; | 1134 | itv->yuv_info.v4l2_src_w = itv->yuv_info.osd_full_w; |
1128 | itv->yuv_info.v4l2_src_h = itv->yuv_info.osd_full_h; | 1135 | itv->yuv_info.v4l2_src_h = itv->yuv_info.osd_full_h; |
1129 | 1136 | ||
1130 | itv->params.video_gop_size = itv->is_60hz ? 15 : 12; | 1137 | cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz); |
1131 | 1138 | ||
1132 | itv->stream_buf_size[IVTV_ENC_STREAM_TYPE_MPG] = 0x08000; | 1139 | itv->stream_buf_size[IVTV_ENC_STREAM_TYPE_MPG] = 0x08000; |
1133 | itv->stream_buf_size[IVTV_ENC_STREAM_TYPE_PCM] = 0x01200; | 1140 | itv->stream_buf_size[IVTV_ENC_STREAM_TYPE_PCM] = 0x01200; |
@@ -1322,6 +1329,8 @@ int ivtv_init_on_first_open(struct ivtv *itv) | |||
1322 | /* For cards with video out, this call needs interrupts enabled */ | 1329 | /* For cards with video out, this call needs interrupts enabled */ |
1323 | ivtv_s_std(NULL, &fh, &itv->tuner_std); | 1330 | ivtv_s_std(NULL, &fh, &itv->tuner_std); |
1324 | 1331 | ||
1332 | /* Setup initial controls */ | ||
1333 | cx2341x_handler_setup(&itv->cxhdl); | ||
1325 | return 0; | 1334 | return 0; |
1326 | } | 1335 | } |
1327 | 1336 | ||
@@ -1386,7 +1395,6 @@ static void ivtv_remove(struct pci_dev *pdev) | |||
1386 | printk(KERN_INFO "ivtv: Removed %s\n", itv->card_name); | 1395 | printk(KERN_INFO "ivtv: Removed %s\n", itv->card_name); |
1387 | 1396 | ||
1388 | v4l2_device_unregister(&itv->v4l2_dev); | 1397 | v4l2_device_unregister(&itv->v4l2_dev); |
1389 | v4l2_ctrl_handler_free(&itv->hdl_gpio); | ||
1390 | kfree(itv); | 1398 | kfree(itv); |
1391 | } | 1399 | } |
1392 | 1400 | ||
diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h index d2260de4c812..75803141481e 100644 --- a/drivers/media/video/ivtv/ivtv-driver.h +++ b/drivers/media/video/ivtv/ivtv-driver.h | |||
@@ -62,6 +62,7 @@ | |||
62 | #include <linux/dvb/audio.h> | 62 | #include <linux/dvb/audio.h> |
63 | #include <media/v4l2-common.h> | 63 | #include <media/v4l2-common.h> |
64 | #include <media/v4l2-ioctl.h> | 64 | #include <media/v4l2-ioctl.h> |
65 | #include <media/v4l2-ctrls.h> | ||
65 | #include <media/v4l2-device.h> | 66 | #include <media/v4l2-device.h> |
66 | #include <media/v4l2-fh.h> | 67 | #include <media/v4l2-fh.h> |
67 | #include <media/tuner.h> | 68 | #include <media/tuner.h> |
@@ -631,8 +632,9 @@ struct ivtv { | |||
631 | struct ivtv_options options; /* user options */ | 632 | struct ivtv_options options; /* user options */ |
632 | 633 | ||
633 | struct v4l2_device v4l2_dev; | 634 | struct v4l2_device v4l2_dev; |
634 | struct v4l2_subdev sd_gpio; /* GPIO sub-device */ | 635 | struct cx2341x_handler cxhdl; |
635 | struct v4l2_ctrl_handler hdl_gpio; | 636 | struct v4l2_ctrl_handler hdl_gpio; |
637 | struct v4l2_subdev sd_gpio; /* GPIO sub-device */ | ||
636 | u16 instance; | 638 | u16 instance; |
637 | 639 | ||
638 | /* High-level state info */ | 640 | /* High-level state info */ |
@@ -649,7 +651,6 @@ struct ivtv { | |||
649 | v4l2_std_id std_out; /* current TV output standard */ | 651 | v4l2_std_id std_out; /* current TV output standard */ |
650 | u8 audio_stereo_mode; /* decoder setting how to handle stereo MPEG audio */ | 652 | u8 audio_stereo_mode; /* decoder setting how to handle stereo MPEG audio */ |
651 | u8 audio_bilingual_mode; /* decoder setting how to handle bilingual MPEG audio */ | 653 | u8 audio_bilingual_mode; /* decoder setting how to handle bilingual MPEG audio */ |
652 | struct cx2341x_mpeg_params params; /* current encoder parameters */ | ||
653 | 654 | ||
654 | 655 | ||
655 | /* Locking */ | 656 | /* Locking */ |
diff --git a/drivers/media/video/ivtv/ivtv-fileops.c b/drivers/media/video/ivtv/ivtv-fileops.c index a6a2cdb81566..d727485da886 100644 --- a/drivers/media/video/ivtv/ivtv-fileops.c +++ b/drivers/media/video/ivtv/ivtv-fileops.c | |||
@@ -150,12 +150,10 @@ void ivtv_release_stream(struct ivtv_stream *s) | |||
150 | static void ivtv_dualwatch(struct ivtv *itv) | 150 | static void ivtv_dualwatch(struct ivtv *itv) |
151 | { | 151 | { |
152 | struct v4l2_tuner vt; | 152 | struct v4l2_tuner vt; |
153 | u32 new_bitmap; | ||
154 | u32 new_stereo_mode; | 153 | u32 new_stereo_mode; |
155 | const u32 stereo_mask = 0x0300; | 154 | const u32 dual = 0x02; |
156 | const u32 dual = 0x0200; | ||
157 | 155 | ||
158 | new_stereo_mode = itv->params.audio_properties & stereo_mask; | 156 | new_stereo_mode = v4l2_ctrl_g_ctrl(itv->cxhdl.audio_mode); |
159 | memset(&vt, 0, sizeof(vt)); | 157 | memset(&vt, 0, sizeof(vt)); |
160 | ivtv_call_all(itv, tuner, g_tuner, &vt); | 158 | ivtv_call_all(itv, tuner, g_tuner, &vt); |
161 | if (vt.audmode == V4L2_TUNER_MODE_LANG1_LANG2 && (vt.rxsubchans & V4L2_TUNER_SUB_LANG2)) | 159 | if (vt.audmode == V4L2_TUNER_MODE_LANG1_LANG2 && (vt.rxsubchans & V4L2_TUNER_SUB_LANG2)) |
@@ -164,16 +162,10 @@ static void ivtv_dualwatch(struct ivtv *itv) | |||
164 | if (new_stereo_mode == itv->dualwatch_stereo_mode) | 162 | if (new_stereo_mode == itv->dualwatch_stereo_mode) |
165 | return; | 163 | return; |
166 | 164 | ||
167 | new_bitmap = new_stereo_mode | (itv->params.audio_properties & ~stereo_mask); | 165 | IVTV_DEBUG_INFO("dualwatch: change stereo flag from 0x%x to 0x%x.\n", |
168 | 166 | itv->dualwatch_stereo_mode, new_stereo_mode); | |
169 | IVTV_DEBUG_INFO("dualwatch: change stereo flag from 0x%x to 0x%x. new audio_bitmask=0x%ux\n", | 167 | if (v4l2_ctrl_s_ctrl(itv->cxhdl.audio_mode, new_stereo_mode)) |
170 | itv->dualwatch_stereo_mode, new_stereo_mode, new_bitmap); | 168 | IVTV_DEBUG_INFO("dualwatch: changing stereo flag failed\n"); |
171 | |||
172 | if (ivtv_vapi(itv, CX2341X_ENC_SET_AUDIO_PROPERTIES, 1, new_bitmap) == 0) { | ||
173 | itv->dualwatch_stereo_mode = new_stereo_mode; | ||
174 | return; | ||
175 | } | ||
176 | IVTV_DEBUG_INFO("dualwatch: changing stereo flag failed\n"); | ||
177 | } | 169 | } |
178 | 170 | ||
179 | static void ivtv_update_pgm_info(struct ivtv *itv) | 171 | static void ivtv_update_pgm_info(struct ivtv *itv) |
@@ -894,7 +886,8 @@ int ivtv_v4l2_close(struct file *filp) | |||
894 | if (atomic_read(&itv->capturing) > 0) { | 886 | if (atomic_read(&itv->capturing) > 0) { |
895 | /* Undo video mute */ | 887 | /* Undo video mute */ |
896 | ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1, | 888 | ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1, |
897 | itv->params.video_mute | (itv->params.video_mute_yuv << 8)); | 889 | v4l2_ctrl_g_ctrl(itv->cxhdl.video_mute) | |
890 | (v4l2_ctrl_g_ctrl(itv->cxhdl.video_mute_yuv) << 8)); | ||
898 | } | 891 | } |
899 | /* Done! Unmute and continue. */ | 892 | /* Done! Unmute and continue. */ |
900 | ivtv_unmute(itv); | 893 | ivtv_unmute(itv); |
diff --git a/drivers/media/video/ivtv/ivtv-firmware.c b/drivers/media/video/ivtv/ivtv-firmware.c index d8bf2b01729d..4df01947a7df 100644 --- a/drivers/media/video/ivtv/ivtv-firmware.c +++ b/drivers/media/video/ivtv/ivtv-firmware.c | |||
@@ -248,9 +248,9 @@ void ivtv_init_mpeg_decoder(struct ivtv *itv) | |||
248 | volatile u8 __iomem *mem_offset; | 248 | volatile u8 __iomem *mem_offset; |
249 | 249 | ||
250 | data[0] = 0; | 250 | data[0] = 0; |
251 | data[1] = itv->params.width; /* YUV source width */ | 251 | data[1] = itv->cxhdl.width; /* YUV source width */ |
252 | data[2] = itv->params.height; | 252 | data[2] = itv->cxhdl.height; |
253 | data[3] = itv->params.audio_properties; /* Audio settings to use, | 253 | data[3] = itv->cxhdl.audio_properties; /* Audio settings to use, |
254 | bitmap. see docs. */ | 254 | bitmap. see docs. */ |
255 | if (ivtv_api(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, data)) { | 255 | if (ivtv_api(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, data)) { |
256 | IVTV_ERR("ivtv_init_mpeg_decoder failed to set decoder source\n"); | 256 | IVTV_ERR("ivtv_init_mpeg_decoder failed to set decoder source\n"); |
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c index 11ac2fa33ef7..4eed9123683e 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.c +++ b/drivers/media/video/ivtv/ivtv-ioctl.c | |||
@@ -162,7 +162,7 @@ int ivtv_set_speed(struct ivtv *itv, int speed) | |||
162 | data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0; | 162 | data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0; |
163 | data[1] = (speed < 0); | 163 | data[1] = (speed < 0); |
164 | data[2] = speed < 0 ? 3 : 7; | 164 | data[2] = speed < 0 ? 3 : 7; |
165 | data[3] = itv->params.video_b_frames; | 165 | data[3] = v4l2_ctrl_g_ctrl(itv->cxhdl.video_b_frames); |
166 | data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0; | 166 | data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0; |
167 | data[5] = 0; | 167 | data[5] = 0; |
168 | data[6] = 0; | 168 | data[6] = 0; |
@@ -339,8 +339,8 @@ static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f | |||
339 | struct ivtv *itv = id->itv; | 339 | struct ivtv *itv = id->itv; |
340 | struct v4l2_pix_format *pixfmt = &fmt->fmt.pix; | 340 | struct v4l2_pix_format *pixfmt = &fmt->fmt.pix; |
341 | 341 | ||
342 | pixfmt->width = itv->params.width; | 342 | pixfmt->width = itv->cxhdl.width; |
343 | pixfmt->height = itv->params.height; | 343 | pixfmt->height = itv->cxhdl.height; |
344 | pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M; | 344 | pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M; |
345 | pixfmt->field = V4L2_FIELD_INTERLACED; | 345 | pixfmt->field = V4L2_FIELD_INTERLACED; |
346 | pixfmt->priv = 0; | 346 | pixfmt->priv = 0; |
@@ -568,7 +568,6 @@ static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f | |||
568 | { | 568 | { |
569 | struct ivtv_open_id *id = fh; | 569 | struct ivtv_open_id *id = fh; |
570 | struct ivtv *itv = id->itv; | 570 | struct ivtv *itv = id->itv; |
571 | struct cx2341x_mpeg_params *p = &itv->params; | ||
572 | struct v4l2_mbus_framefmt mbus_fmt; | 571 | struct v4l2_mbus_framefmt mbus_fmt; |
573 | int ret = ivtv_try_fmt_vid_cap(file, fh, fmt); | 572 | int ret = ivtv_try_fmt_vid_cap(file, fh, fmt); |
574 | int w = fmt->fmt.pix.width; | 573 | int w = fmt->fmt.pix.width; |
@@ -577,15 +576,15 @@ static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f | |||
577 | if (ret) | 576 | if (ret) |
578 | return ret; | 577 | return ret; |
579 | 578 | ||
580 | if (p->width == w && p->height == h) | 579 | if (itv->cxhdl.width == w && itv->cxhdl.height == h) |
581 | return 0; | 580 | return 0; |
582 | 581 | ||
583 | if (atomic_read(&itv->capturing) > 0) | 582 | if (atomic_read(&itv->capturing) > 0) |
584 | return -EBUSY; | 583 | return -EBUSY; |
585 | 584 | ||
586 | p->width = w; | 585 | itv->cxhdl.width = w; |
587 | p->height = h; | 586 | itv->cxhdl.height = h; |
588 | if (p->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1) | 587 | if (v4l2_ctrl_g_ctrl(itv->cxhdl.video_encoding) == V4L2_MPEG_VIDEO_ENCODING_MPEG_1) |
589 | fmt->fmt.pix.width /= 2; | 588 | fmt->fmt.pix.width /= 2; |
590 | mbus_fmt.width = fmt->fmt.pix.width; | 589 | mbus_fmt.width = fmt->fmt.pix.width; |
591 | mbus_fmt.height = h; | 590 | mbus_fmt.height = h; |
@@ -1114,9 +1113,10 @@ int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | |||
1114 | 1113 | ||
1115 | itv->std = *std; | 1114 | itv->std = *std; |
1116 | itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0; | 1115 | itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0; |
1117 | itv->params.is_50hz = itv->is_50hz = !itv->is_60hz; | 1116 | itv->is_50hz = !itv->is_60hz; |
1118 | itv->params.width = 720; | 1117 | cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz); |
1119 | itv->params.height = itv->is_50hz ? 576 : 480; | 1118 | itv->cxhdl.width = 720; |
1119 | itv->cxhdl.height = itv->is_50hz ? 576 : 480; | ||
1120 | itv->vbi.count = itv->is_50hz ? 18 : 12; | 1120 | itv->vbi.count = itv->is_50hz ? 18 : 12; |
1121 | itv->vbi.start[0] = itv->is_50hz ? 6 : 10; | 1121 | itv->vbi.start[0] = itv->is_50hz ? 6 : 10; |
1122 | itv->vbi.start[1] = itv->is_50hz ? 318 : 273; | 1122 | itv->vbi.start[1] = itv->is_50hz ? 318 : 273; |
@@ -1157,7 +1157,7 @@ int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | |||
1157 | ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz); | 1157 | ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz); |
1158 | itv->main_rect.left = itv->main_rect.top = 0; | 1158 | itv->main_rect.left = itv->main_rect.top = 0; |
1159 | itv->main_rect.width = 720; | 1159 | itv->main_rect.width = 720; |
1160 | itv->main_rect.height = itv->params.height; | 1160 | itv->main_rect.height = itv->cxhdl.height; |
1161 | ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4, | 1161 | ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4, |
1162 | 720, itv->main_rect.height, 0, 0); | 1162 | 720, itv->main_rect.height, 0, 0); |
1163 | yi->main_rect = itv->main_rect; | 1163 | yi->main_rect = itv->main_rect; |
@@ -1554,7 +1554,7 @@ static int ivtv_log_status(struct file *file, void *fh) | |||
1554 | } | 1554 | } |
1555 | IVTV_INFO("Tuner: %s\n", | 1555 | IVTV_INFO("Tuner: %s\n", |
1556 | test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV"); | 1556 | test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV"); |
1557 | cx2341x_log_status(&itv->params, itv->v4l2_dev.name); | 1557 | v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name); |
1558 | IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags); | 1558 | IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags); |
1559 | for (i = 0; i < IVTV_MAX_STREAMS; i++) { | 1559 | for (i = 0; i < IVTV_MAX_STREAMS; i++) { |
1560 | struct ivtv_stream *s = &itv->streams[i]; | 1560 | struct ivtv_stream *s = &itv->streams[i]; |
@@ -1942,11 +1942,6 @@ static const struct v4l2_ioctl_ops ivtv_ioctl_ops = { | |||
1942 | .vidioc_s_register = ivtv_s_register, | 1942 | .vidioc_s_register = ivtv_s_register, |
1943 | #endif | 1943 | #endif |
1944 | .vidioc_default = ivtv_default, | 1944 | .vidioc_default = ivtv_default, |
1945 | .vidioc_queryctrl = ivtv_queryctrl, | ||
1946 | .vidioc_querymenu = ivtv_querymenu, | ||
1947 | .vidioc_g_ext_ctrls = ivtv_g_ext_ctrls, | ||
1948 | .vidioc_s_ext_ctrls = ivtv_s_ext_ctrls, | ||
1949 | .vidioc_try_ext_ctrls = ivtv_try_ext_ctrls, | ||
1950 | .vidioc_subscribe_event = ivtv_subscribe_event, | 1945 | .vidioc_subscribe_event = ivtv_subscribe_event, |
1951 | .vidioc_unsubscribe_event = v4l2_event_unsubscribe, | 1946 | .vidioc_unsubscribe_event = v4l2_event_unsubscribe, |
1952 | }; | 1947 | }; |
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c index 55df4190c28d..512607e0cda3 100644 --- a/drivers/media/video/ivtv/ivtv-streams.c +++ b/drivers/media/video/ivtv/ivtv-streams.c | |||
@@ -210,6 +210,7 @@ static int ivtv_prep_dev(struct ivtv *itv, int type) | |||
210 | 210 | ||
211 | s->vdev->num = num; | 211 | s->vdev->num = num; |
212 | s->vdev->v4l2_dev = &itv->v4l2_dev; | 212 | s->vdev->v4l2_dev = &itv->v4l2_dev; |
213 | s->vdev->ctrl_handler = itv->v4l2_dev.ctrl_handler; | ||
213 | s->vdev->fops = ivtv_stream_info[type].fops; | 214 | s->vdev->fops = ivtv_stream_info[type].fops; |
214 | s->vdev->release = video_device_release; | 215 | s->vdev->release = video_device_release; |
215 | s->vdev->tvnorms = V4L2_STD_ALL; | 216 | s->vdev->tvnorms = V4L2_STD_ALL; |
@@ -451,7 +452,6 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
451 | { | 452 | { |
452 | u32 data[CX2341X_MBOX_MAX_DATA]; | 453 | u32 data[CX2341X_MBOX_MAX_DATA]; |
453 | struct ivtv *itv = s->itv; | 454 | struct ivtv *itv = s->itv; |
454 | struct cx2341x_mpeg_params *p = &itv->params; | ||
455 | int captype = 0, subtype = 0; | 455 | int captype = 0, subtype = 0; |
456 | int enable_passthrough = 0; | 456 | int enable_passthrough = 0; |
457 | 457 | ||
@@ -472,7 +472,7 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
472 | } | 472 | } |
473 | itv->mpg_data_received = itv->vbi_data_inserted = 0; | 473 | itv->mpg_data_received = itv->vbi_data_inserted = 0; |
474 | itv->dualwatch_jiffies = jiffies; | 474 | itv->dualwatch_jiffies = jiffies; |
475 | itv->dualwatch_stereo_mode = p->audio_properties & 0x0300; | 475 | itv->dualwatch_stereo_mode = v4l2_ctrl_g_ctrl(itv->cxhdl.audio_mode); |
476 | itv->search_pack_header = 0; | 476 | itv->search_pack_header = 0; |
477 | break; | 477 | break; |
478 | 478 | ||
@@ -560,12 +560,12 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
560 | itv->pgm_info_offset, itv->pgm_info_num); | 560 | itv->pgm_info_offset, itv->pgm_info_num); |
561 | 561 | ||
562 | /* Setup API for Stream */ | 562 | /* Setup API for Stream */ |
563 | cx2341x_update(itv, ivtv_api_func, NULL, p); | 563 | cx2341x_handler_setup(&itv->cxhdl); |
564 | 564 | ||
565 | /* mute if capturing radio */ | 565 | /* mute if capturing radio */ |
566 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) | 566 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) |
567 | ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1, | 567 | ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1, |
568 | 1 | (p->video_mute_yuv << 8)); | 568 | 1 | (v4l2_ctrl_g_ctrl(itv->cxhdl.video_mute_yuv) << 8)); |
569 | } | 569 | } |
570 | 570 | ||
571 | /* Vsync Setup */ | 571 | /* Vsync Setup */ |
@@ -581,6 +581,8 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
581 | 581 | ||
582 | clear_bit(IVTV_F_I_EOS, &itv->i_flags); | 582 | clear_bit(IVTV_F_I_EOS, &itv->i_flags); |
583 | 583 | ||
584 | cx2341x_handler_set_busy(&itv->cxhdl, 1); | ||
585 | |||
584 | /* Initialize Digitizer for Capture */ | 586 | /* Initialize Digitizer for Capture */ |
585 | /* Avoid tinny audio problem - ensure audio clocks are going */ | 587 | /* Avoid tinny audio problem - ensure audio clocks are going */ |
586 | v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1); | 588 | v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1); |
@@ -617,7 +619,6 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
617 | { | 619 | { |
618 | u32 data[CX2341X_MBOX_MAX_DATA]; | 620 | u32 data[CX2341X_MBOX_MAX_DATA]; |
619 | struct ivtv *itv = s->itv; | 621 | struct ivtv *itv = s->itv; |
620 | struct cx2341x_mpeg_params *p = &itv->params; | ||
621 | int datatype; | 622 | int datatype; |
622 | u16 width; | 623 | u16 width; |
623 | u16 height; | 624 | u16 height; |
@@ -627,8 +628,8 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
627 | 628 | ||
628 | IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); | 629 | IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); |
629 | 630 | ||
630 | width = p->width; | 631 | width = itv->cxhdl.width; |
631 | height = p->height; | 632 | height = itv->cxhdl.height; |
632 | 633 | ||
633 | /* set audio mode to left/stereo for dual/stereo mode. */ | 634 | /* set audio mode to left/stereo for dual/stereo mode. */ |
634 | ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode); | 635 | ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode); |
@@ -668,7 +669,7 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
668 | break; | 669 | break; |
669 | } | 670 | } |
670 | if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype, | 671 | if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype, |
671 | width, height, p->audio_properties)) { | 672 | width, height, itv->cxhdl.audio_properties)) { |
672 | IVTV_DEBUG_WARN("Couldn't initialize decoder source\n"); | 673 | IVTV_DEBUG_WARN("Couldn't initialize decoder source\n"); |
673 | } | 674 | } |
674 | 675 | ||
@@ -847,6 +848,8 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) | |||
847 | return 0; | 848 | return 0; |
848 | } | 849 | } |
849 | 850 | ||
851 | cx2341x_handler_set_busy(&itv->cxhdl, 0); | ||
852 | |||
850 | /* Set the following Interrupt mask bits for capture */ | 853 | /* Set the following Interrupt mask bits for capture */ |
851 | ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE); | 854 | ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE); |
852 | del_timer(&itv->dma_timer); | 855 | del_timer(&itv->dma_timer); |
@@ -967,7 +970,8 @@ int ivtv_passthrough_mode(struct ivtv *itv, int enable) | |||
967 | 970 | ||
968 | /* Setup capture if not already done */ | 971 | /* Setup capture if not already done */ |
969 | if (atomic_read(&itv->capturing) == 0) { | 972 | if (atomic_read(&itv->capturing) == 0) { |
970 | cx2341x_update(itv, ivtv_api_func, NULL, &itv->params); | 973 | cx2341x_handler_setup(&itv->cxhdl); |
974 | cx2341x_handler_set_busy(&itv->cxhdl, 1); | ||
971 | } | 975 | } |
972 | 976 | ||
973 | /* Start Passthrough Mode */ | 977 | /* Start Passthrough Mode */ |
@@ -988,6 +992,8 @@ int ivtv_passthrough_mode(struct ivtv *itv, int enable) | |||
988 | clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags); | 992 | clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags); |
989 | clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags); | 993 | clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags); |
990 | itv->output_mode = OUT_NONE; | 994 | itv->output_mode = OUT_NONE; |
995 | if (atomic_read(&itv->capturing) == 0) | ||
996 | cx2341x_handler_set_busy(&itv->cxhdl, 0); | ||
991 | 997 | ||
992 | return 0; | 998 | return 0; |
993 | } | 999 | } |