diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2015-03-09 12:33:55 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-04-02 21:34:55 -0400 |
commit | 635d62f073247e71b51167a01b84f08ff4ca000c (patch) | |
tree | 9c23e9119ff1e41b7c4580ea6cd0cbdac94a17f2 | |
parent | b3226f961aa91eb94971939400c7506e7dcc86c0 (diff) |
[media] ivtv: embed video_device
Embed the video_device struct to simplify the error handling and in
order to (eventually) get rid of video_device_alloc/release.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Cc: Andy Walls <awalls@md.metrocast.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-alsa-main.c | 2 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-alsa-pcm.c | 2 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-driver.c | 4 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-driver.h | 2 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-fileops.c | 2 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-ioctl.c | 8 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-irq.c | 8 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-streams.c | 107 | ||||
-rw-r--r-- | drivers/media/pci/ivtv/ivtv-streams.h | 2 |
9 files changed, 61 insertions, 76 deletions
diff --git a/drivers/media/pci/ivtv/ivtv-alsa-main.c b/drivers/media/pci/ivtv/ivtv-alsa-main.c index 39b52929755a..41fa21534edf 100644 --- a/drivers/media/pci/ivtv/ivtv-alsa-main.c +++ b/drivers/media/pci/ivtv/ivtv-alsa-main.c | |||
@@ -224,7 +224,7 @@ static int ivtv_alsa_load(struct ivtv *itv) | |||
224 | } | 224 | } |
225 | 225 | ||
226 | s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM]; | 226 | s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM]; |
227 | if (s->vdev == NULL) { | 227 | if (s->vdev.v4l2_dev == NULL) { |
228 | IVTV_DEBUG_ALSA_INFO("%s: PCM stream for card is disabled - " | 228 | IVTV_DEBUG_ALSA_INFO("%s: PCM stream for card is disabled - " |
229 | "skipping\n", __func__); | 229 | "skipping\n", __func__); |
230 | return 0; | 230 | return 0; |
diff --git a/drivers/media/pci/ivtv/ivtv-alsa-pcm.c b/drivers/media/pci/ivtv/ivtv-alsa-pcm.c index 7bf9cbca4fa6..f198b9826ed8 100644 --- a/drivers/media/pci/ivtv/ivtv-alsa-pcm.c +++ b/drivers/media/pci/ivtv/ivtv-alsa-pcm.c | |||
@@ -167,7 +167,7 @@ static int snd_ivtv_pcm_capture_open(struct snd_pcm_substream *substream) | |||
167 | 167 | ||
168 | s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM]; | 168 | s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM]; |
169 | 169 | ||
170 | v4l2_fh_init(&item.fh, s->vdev); | 170 | v4l2_fh_init(&item.fh, &s->vdev); |
171 | item.itv = itv; | 171 | item.itv = itv; |
172 | item.type = s->type; | 172 | item.type = s->type; |
173 | 173 | ||
diff --git a/drivers/media/pci/ivtv/ivtv-driver.c b/drivers/media/pci/ivtv/ivtv-driver.c index 802642d26643..c2e60b4f292d 100644 --- a/drivers/media/pci/ivtv/ivtv-driver.c +++ b/drivers/media/pci/ivtv/ivtv-driver.c | |||
@@ -1284,7 +1284,7 @@ static int ivtv_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) | |||
1284 | return 0; | 1284 | return 0; |
1285 | 1285 | ||
1286 | free_streams: | 1286 | free_streams: |
1287 | ivtv_streams_cleanup(itv, 1); | 1287 | ivtv_streams_cleanup(itv); |
1288 | free_irq: | 1288 | free_irq: |
1289 | free_irq(itv->pdev->irq, (void *)itv); | 1289 | free_irq(itv->pdev->irq, (void *)itv); |
1290 | free_i2c: | 1290 | free_i2c: |
@@ -1444,7 +1444,7 @@ static void ivtv_remove(struct pci_dev *pdev) | |||
1444 | flush_kthread_worker(&itv->irq_worker); | 1444 | flush_kthread_worker(&itv->irq_worker); |
1445 | kthread_stop(itv->irq_worker_task); | 1445 | kthread_stop(itv->irq_worker_task); |
1446 | 1446 | ||
1447 | ivtv_streams_cleanup(itv, 1); | 1447 | ivtv_streams_cleanup(itv); |
1448 | ivtv_udma_free(itv); | 1448 | ivtv_udma_free(itv); |
1449 | 1449 | ||
1450 | v4l2_ctrl_handler_free(&itv->cxhdl.hdl); | 1450 | v4l2_ctrl_handler_free(&itv->cxhdl.hdl); |
diff --git a/drivers/media/pci/ivtv/ivtv-driver.h b/drivers/media/pci/ivtv/ivtv-driver.h index bc309f42c8ed..e8b6c7ad2ba9 100644 --- a/drivers/media/pci/ivtv/ivtv-driver.h +++ b/drivers/media/pci/ivtv/ivtv-driver.h | |||
@@ -327,7 +327,7 @@ struct ivtv; /* forward reference */ | |||
327 | struct ivtv_stream { | 327 | struct ivtv_stream { |
328 | /* These first four fields are always set, even if the stream | 328 | /* These first four fields are always set, even if the stream |
329 | is not actually created. */ | 329 | is not actually created. */ |
330 | struct video_device *vdev; /* NULL when stream not created */ | 330 | struct video_device vdev; /* vdev.v4l2_dev is NULL if there is no device */ |
331 | struct ivtv *itv; /* for ease of use */ | 331 | struct ivtv *itv; /* for ease of use */ |
332 | const char *name; /* name of the stream */ | 332 | const char *name; /* name of the stream */ |
333 | int type; /* stream type */ | 333 | int type; /* stream type */ |
diff --git a/drivers/media/pci/ivtv/ivtv-fileops.c b/drivers/media/pci/ivtv/ivtv-fileops.c index e5ff6277ca85..605d280d8a5f 100644 --- a/drivers/media/pci/ivtv/ivtv-fileops.c +++ b/drivers/media/pci/ivtv/ivtv-fileops.c | |||
@@ -995,7 +995,7 @@ static int ivtv_open(struct file *filp) | |||
995 | IVTV_DEBUG_WARN("nomem on v4l2 open\n"); | 995 | IVTV_DEBUG_WARN("nomem on v4l2 open\n"); |
996 | return -ENOMEM; | 996 | return -ENOMEM; |
997 | } | 997 | } |
998 | v4l2_fh_init(&item->fh, s->vdev); | 998 | v4l2_fh_init(&item->fh, &s->vdev); |
999 | item->itv = itv; | 999 | item->itv = itv; |
1000 | item->type = s->type; | 1000 | item->type = s->type; |
1001 | 1001 | ||
diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c index 4d8ee18c3feb..fa875655ede6 100644 --- a/drivers/media/pci/ivtv/ivtv-ioctl.c +++ b/drivers/media/pci/ivtv/ivtv-ioctl.c | |||
@@ -987,7 +987,7 @@ int ivtv_s_input(struct file *file, void *fh, unsigned int inp) | |||
987 | else | 987 | else |
988 | std = V4L2_STD_ALL; | 988 | std = V4L2_STD_ALL; |
989 | for (i = 0; i <= IVTV_ENC_STREAM_TYPE_VBI; i++) | 989 | for (i = 0; i <= IVTV_ENC_STREAM_TYPE_VBI; i++) |
990 | itv->streams[i].vdev->tvnorms = std; | 990 | itv->streams[i].vdev.tvnorms = std; |
991 | 991 | ||
992 | /* prevent others from messing with the streams until | 992 | /* prevent others from messing with the streams until |
993 | we're finished changing inputs. */ | 993 | we're finished changing inputs. */ |
@@ -1038,7 +1038,7 @@ static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency * | |||
1038 | struct ivtv *itv = fh2id(fh)->itv; | 1038 | struct ivtv *itv = fh2id(fh)->itv; |
1039 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | 1039 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; |
1040 | 1040 | ||
1041 | if (s->vdev->vfl_dir) | 1041 | if (s->vdev.vfl_dir) |
1042 | return -ENOTTY; | 1042 | return -ENOTTY; |
1043 | if (vf->tuner != 0) | 1043 | if (vf->tuner != 0) |
1044 | return -EINVAL; | 1044 | return -EINVAL; |
@@ -1052,7 +1052,7 @@ int ivtv_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *v | |||
1052 | struct ivtv *itv = fh2id(fh)->itv; | 1052 | struct ivtv *itv = fh2id(fh)->itv; |
1053 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; | 1053 | struct ivtv_stream *s = &itv->streams[fh2id(fh)->type]; |
1054 | 1054 | ||
1055 | if (s->vdev->vfl_dir) | 1055 | if (s->vdev.vfl_dir) |
1056 | return -ENOTTY; | 1056 | return -ENOTTY; |
1057 | if (vf->tuner != 0) | 1057 | if (vf->tuner != 0) |
1058 | return -EINVAL; | 1058 | return -EINVAL; |
@@ -1547,7 +1547,7 @@ static int ivtv_log_status(struct file *file, void *fh) | |||
1547 | for (i = 0; i < IVTV_MAX_STREAMS; i++) { | 1547 | for (i = 0; i < IVTV_MAX_STREAMS; i++) { |
1548 | struct ivtv_stream *s = &itv->streams[i]; | 1548 | struct ivtv_stream *s = &itv->streams[i]; |
1549 | 1549 | ||
1550 | if (s->vdev == NULL || s->buffers == 0) | 1550 | if (s->vdev.v4l2_dev == NULL || s->buffers == 0) |
1551 | continue; | 1551 | continue; |
1552 | IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags, | 1552 | IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags, |
1553 | (s->buffers - s->q_free.buffers) * 100 / s->buffers, | 1553 | (s->buffers - s->q_free.buffers) * 100 / s->buffers, |
diff --git a/drivers/media/pci/ivtv/ivtv-irq.c b/drivers/media/pci/ivtv/ivtv-irq.c index e7d701777e53..36ca2d67c812 100644 --- a/drivers/media/pci/ivtv/ivtv-irq.c +++ b/drivers/media/pci/ivtv/ivtv-irq.c | |||
@@ -75,7 +75,7 @@ static void ivtv_pio_work_handler(struct ivtv *itv) | |||
75 | 75 | ||
76 | IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n"); | 76 | IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n"); |
77 | if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS || | 77 | if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS || |
78 | s->vdev == NULL || !ivtv_use_pio(s)) { | 78 | s->vdev.v4l2_dev == NULL || !ivtv_use_pio(s)) { |
79 | itv->cur_pio_stream = -1; | 79 | itv->cur_pio_stream = -1; |
80 | /* trigger PIO complete user interrupt */ | 80 | /* trigger PIO complete user interrupt */ |
81 | write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44); | 81 | write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44); |
@@ -132,7 +132,7 @@ static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MA | |||
132 | int rc; | 132 | int rc; |
133 | 133 | ||
134 | /* sanity checks */ | 134 | /* sanity checks */ |
135 | if (s->vdev == NULL) { | 135 | if (s->vdev.v4l2_dev == NULL) { |
136 | IVTV_DEBUG_WARN("Stream %s not started\n", s->name); | 136 | IVTV_DEBUG_WARN("Stream %s not started\n", s->name); |
137 | return -1; | 137 | return -1; |
138 | } | 138 | } |
@@ -890,8 +890,8 @@ static void ivtv_irq_vsync(struct ivtv *itv) | |||
890 | if (s) | 890 | if (s) |
891 | wake_up(&s->waitq); | 891 | wake_up(&s->waitq); |
892 | } | 892 | } |
893 | if (s && s->vdev) | 893 | if (s && s->vdev.v4l2_dev) |
894 | v4l2_event_queue(s->vdev, frame ? &evtop : &evbottom); | 894 | v4l2_event_queue(&s->vdev, frame ? &evtop : &evbottom); |
895 | wake_up(&itv->vsync_waitq); | 895 | wake_up(&itv->vsync_waitq); |
896 | 896 | ||
897 | /* Send VBI to saa7127 */ | 897 | /* Send VBI to saa7127 */ |
diff --git a/drivers/media/pci/ivtv/ivtv-streams.c b/drivers/media/pci/ivtv/ivtv-streams.c index f0a1cc472313..cfb61f23d8ed 100644 --- a/drivers/media/pci/ivtv/ivtv-streams.c +++ b/drivers/media/pci/ivtv/ivtv-streams.c | |||
@@ -159,11 +159,9 @@ static struct { | |||
159 | static void ivtv_stream_init(struct ivtv *itv, int type) | 159 | static void ivtv_stream_init(struct ivtv *itv, int type) |
160 | { | 160 | { |
161 | struct ivtv_stream *s = &itv->streams[type]; | 161 | struct ivtv_stream *s = &itv->streams[type]; |
162 | struct video_device *vdev = s->vdev; | ||
163 | 162 | ||
164 | /* we need to keep vdev, so restore it afterwards */ | 163 | /* we need to keep vdev, so restore it afterwards */ |
165 | memset(s, 0, sizeof(*s)); | 164 | memset(s, 0, sizeof(*s)); |
166 | s->vdev = vdev; | ||
167 | 165 | ||
168 | /* initialize ivtv_stream fields */ | 166 | /* initialize ivtv_stream fields */ |
169 | s->itv = itv; | 167 | s->itv = itv; |
@@ -194,10 +192,10 @@ static int ivtv_prep_dev(struct ivtv *itv, int type) | |||
194 | int num_offset = ivtv_stream_info[type].num_offset; | 192 | int num_offset = ivtv_stream_info[type].num_offset; |
195 | int num = itv->instance + ivtv_first_minor + num_offset; | 193 | int num = itv->instance + ivtv_first_minor + num_offset; |
196 | 194 | ||
197 | /* These four fields are always initialized. If vdev == NULL, then | 195 | /* These four fields are always initialized. If vdev.v4l2_dev == NULL, then |
198 | this stream is not in use. In that case no other fields but these | 196 | this stream is not in use. In that case no other fields but these |
199 | four can be used. */ | 197 | four can be used. */ |
200 | s->vdev = NULL; | 198 | s->vdev.v4l2_dev = NULL; |
201 | s->itv = itv; | 199 | s->itv = itv; |
202 | s->type = type; | 200 | s->type = type; |
203 | s->name = ivtv_stream_info[type].name; | 201 | s->name = ivtv_stream_info[type].name; |
@@ -218,40 +216,33 @@ static int ivtv_prep_dev(struct ivtv *itv, int type) | |||
218 | 216 | ||
219 | ivtv_stream_init(itv, type); | 217 | ivtv_stream_init(itv, type); |
220 | 218 | ||
221 | /* allocate and initialize the v4l2 video device structure */ | 219 | snprintf(s->vdev.name, sizeof(s->vdev.name), "%s %s", |
222 | s->vdev = video_device_alloc(); | ||
223 | if (s->vdev == NULL) { | ||
224 | IVTV_ERR("Couldn't allocate v4l2 video_device for %s\n", s->name); | ||
225 | return -ENOMEM; | ||
226 | } | ||
227 | |||
228 | snprintf(s->vdev->name, sizeof(s->vdev->name), "%s %s", | ||
229 | itv->v4l2_dev.name, s->name); | 220 | itv->v4l2_dev.name, s->name); |
230 | 221 | ||
231 | s->vdev->num = num; | 222 | s->vdev.num = num; |
232 | s->vdev->v4l2_dev = &itv->v4l2_dev; | 223 | s->vdev.v4l2_dev = &itv->v4l2_dev; |
233 | if (ivtv_stream_info[type].v4l2_caps & | 224 | if (ivtv_stream_info[type].v4l2_caps & |
234 | (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_SLICED_VBI_OUTPUT)) | 225 | (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_SLICED_VBI_OUTPUT)) |
235 | s->vdev->vfl_dir = VFL_DIR_TX; | 226 | s->vdev.vfl_dir = VFL_DIR_TX; |
236 | s->vdev->fops = ivtv_stream_info[type].fops; | 227 | s->vdev.fops = ivtv_stream_info[type].fops; |
237 | s->vdev->ctrl_handler = itv->v4l2_dev.ctrl_handler; | 228 | s->vdev.ctrl_handler = itv->v4l2_dev.ctrl_handler; |
238 | s->vdev->release = video_device_release; | 229 | s->vdev.release = video_device_release_empty; |
239 | s->vdev->tvnorms = V4L2_STD_ALL; | 230 | s->vdev.tvnorms = V4L2_STD_ALL; |
240 | s->vdev->lock = &itv->serialize_lock; | 231 | s->vdev.lock = &itv->serialize_lock; |
241 | if (s->type == IVTV_DEC_STREAM_TYPE_VBI) { | 232 | if (s->type == IVTV_DEC_STREAM_TYPE_VBI) { |
242 | v4l2_disable_ioctl(s->vdev, VIDIOC_S_AUDIO); | 233 | v4l2_disable_ioctl(&s->vdev, VIDIOC_S_AUDIO); |
243 | v4l2_disable_ioctl(s->vdev, VIDIOC_G_AUDIO); | 234 | v4l2_disable_ioctl(&s->vdev, VIDIOC_G_AUDIO); |
244 | v4l2_disable_ioctl(s->vdev, VIDIOC_ENUMAUDIO); | 235 | v4l2_disable_ioctl(&s->vdev, VIDIOC_ENUMAUDIO); |
245 | v4l2_disable_ioctl(s->vdev, VIDIOC_ENUMINPUT); | 236 | v4l2_disable_ioctl(&s->vdev, VIDIOC_ENUMINPUT); |
246 | v4l2_disable_ioctl(s->vdev, VIDIOC_S_INPUT); | 237 | v4l2_disable_ioctl(&s->vdev, VIDIOC_S_INPUT); |
247 | v4l2_disable_ioctl(s->vdev, VIDIOC_G_INPUT); | 238 | v4l2_disable_ioctl(&s->vdev, VIDIOC_G_INPUT); |
248 | v4l2_disable_ioctl(s->vdev, VIDIOC_S_FREQUENCY); | 239 | v4l2_disable_ioctl(&s->vdev, VIDIOC_S_FREQUENCY); |
249 | v4l2_disable_ioctl(s->vdev, VIDIOC_G_FREQUENCY); | 240 | v4l2_disable_ioctl(&s->vdev, VIDIOC_G_FREQUENCY); |
250 | v4l2_disable_ioctl(s->vdev, VIDIOC_S_TUNER); | 241 | v4l2_disable_ioctl(&s->vdev, VIDIOC_S_TUNER); |
251 | v4l2_disable_ioctl(s->vdev, VIDIOC_G_TUNER); | 242 | v4l2_disable_ioctl(&s->vdev, VIDIOC_G_TUNER); |
252 | v4l2_disable_ioctl(s->vdev, VIDIOC_S_STD); | 243 | v4l2_disable_ioctl(&s->vdev, VIDIOC_S_STD); |
253 | } | 244 | } |
254 | ivtv_set_funcs(s->vdev); | 245 | ivtv_set_funcs(&s->vdev); |
255 | return 0; | 246 | return 0; |
256 | } | 247 | } |
257 | 248 | ||
@@ -266,7 +257,7 @@ int ivtv_streams_setup(struct ivtv *itv) | |||
266 | if (ivtv_prep_dev(itv, type)) | 257 | if (ivtv_prep_dev(itv, type)) |
267 | break; | 258 | break; |
268 | 259 | ||
269 | if (itv->streams[type].vdev == NULL) | 260 | if (itv->streams[type].vdev.v4l2_dev == NULL) |
270 | continue; | 261 | continue; |
271 | 262 | ||
272 | /* Allocate Stream */ | 263 | /* Allocate Stream */ |
@@ -277,7 +268,7 @@ int ivtv_streams_setup(struct ivtv *itv) | |||
277 | return 0; | 268 | return 0; |
278 | 269 | ||
279 | /* One or more streams could not be initialized. Clean 'em all up. */ | 270 | /* One or more streams could not be initialized. Clean 'em all up. */ |
280 | ivtv_streams_cleanup(itv, 0); | 271 | ivtv_streams_cleanup(itv); |
281 | return -ENOMEM; | 272 | return -ENOMEM; |
282 | } | 273 | } |
283 | 274 | ||
@@ -288,28 +279,26 @@ static int ivtv_reg_dev(struct ivtv *itv, int type) | |||
288 | const char *name; | 279 | const char *name; |
289 | int num; | 280 | int num; |
290 | 281 | ||
291 | if (s->vdev == NULL) | 282 | if (s->vdev.v4l2_dev == NULL) |
292 | return 0; | 283 | return 0; |
293 | 284 | ||
294 | num = s->vdev->num; | 285 | num = s->vdev.num; |
295 | /* card number + user defined offset + device offset */ | 286 | /* card number + user defined offset + device offset */ |
296 | if (type != IVTV_ENC_STREAM_TYPE_MPG) { | 287 | if (type != IVTV_ENC_STREAM_TYPE_MPG) { |
297 | struct ivtv_stream *s_mpg = &itv->streams[IVTV_ENC_STREAM_TYPE_MPG]; | 288 | struct ivtv_stream *s_mpg = &itv->streams[IVTV_ENC_STREAM_TYPE_MPG]; |
298 | 289 | ||
299 | if (s_mpg->vdev) | 290 | if (s_mpg->vdev.v4l2_dev) |
300 | num = s_mpg->vdev->num + ivtv_stream_info[type].num_offset; | 291 | num = s_mpg->vdev.num + ivtv_stream_info[type].num_offset; |
301 | } | 292 | } |
302 | video_set_drvdata(s->vdev, s); | 293 | video_set_drvdata(&s->vdev, s); |
303 | 294 | ||
304 | /* Register device. First try the desired minor, then any free one. */ | 295 | /* Register device. First try the desired minor, then any free one. */ |
305 | if (video_register_device_no_warn(s->vdev, vfl_type, num)) { | 296 | if (video_register_device_no_warn(&s->vdev, vfl_type, num)) { |
306 | IVTV_ERR("Couldn't register v4l2 device for %s (device node number %d)\n", | 297 | IVTV_ERR("Couldn't register v4l2 device for %s (device node number %d)\n", |
307 | s->name, num); | 298 | s->name, num); |
308 | video_device_release(s->vdev); | ||
309 | s->vdev = NULL; | ||
310 | return -ENOMEM; | 299 | return -ENOMEM; |
311 | } | 300 | } |
312 | name = video_device_node_name(s->vdev); | 301 | name = video_device_node_name(&s->vdev); |
313 | 302 | ||
314 | switch (vfl_type) { | 303 | switch (vfl_type) { |
315 | case VFL_TYPE_GRABBER: | 304 | case VFL_TYPE_GRABBER: |
@@ -346,29 +335,25 @@ int ivtv_streams_register(struct ivtv *itv) | |||
346 | return 0; | 335 | return 0; |
347 | 336 | ||
348 | /* One or more streams could not be initialized. Clean 'em all up. */ | 337 | /* One or more streams could not be initialized. Clean 'em all up. */ |
349 | ivtv_streams_cleanup(itv, 1); | 338 | ivtv_streams_cleanup(itv); |
350 | return -ENOMEM; | 339 | return -ENOMEM; |
351 | } | 340 | } |
352 | 341 | ||
353 | /* Unregister v4l2 devices */ | 342 | /* Unregister v4l2 devices */ |
354 | void ivtv_streams_cleanup(struct ivtv *itv, int unregister) | 343 | void ivtv_streams_cleanup(struct ivtv *itv) |
355 | { | 344 | { |
356 | int type; | 345 | int type; |
357 | 346 | ||
358 | /* Teardown all streams */ | 347 | /* Teardown all streams */ |
359 | for (type = 0; type < IVTV_MAX_STREAMS; type++) { | 348 | for (type = 0; type < IVTV_MAX_STREAMS; type++) { |
360 | struct video_device *vdev = itv->streams[type].vdev; | 349 | struct video_device *vdev = &itv->streams[type].vdev; |
361 | 350 | ||
362 | itv->streams[type].vdev = NULL; | 351 | if (vdev->v4l2_dev == NULL) |
363 | if (vdev == NULL) | ||
364 | continue; | 352 | continue; |
365 | 353 | ||
354 | video_unregister_device(vdev); | ||
366 | ivtv_stream_free(&itv->streams[type]); | 355 | ivtv_stream_free(&itv->streams[type]); |
367 | /* Unregister or release device */ | 356 | itv->streams[type].vdev.v4l2_dev = NULL; |
368 | if (unregister) | ||
369 | video_unregister_device(vdev); | ||
370 | else | ||
371 | video_device_release(vdev); | ||
372 | } | 357 | } |
373 | } | 358 | } |
374 | 359 | ||
@@ -492,7 +477,7 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
492 | int captype = 0, subtype = 0; | 477 | int captype = 0, subtype = 0; |
493 | int enable_passthrough = 0; | 478 | int enable_passthrough = 0; |
494 | 479 | ||
495 | if (s->vdev == NULL) | 480 | if (s->vdev.v4l2_dev == NULL) |
496 | return -EINVAL; | 481 | return -EINVAL; |
497 | 482 | ||
498 | IVTV_DEBUG_INFO("Start encoder stream %s\n", s->name); | 483 | IVTV_DEBUG_INFO("Start encoder stream %s\n", s->name); |
@@ -661,7 +646,7 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
661 | u16 width; | 646 | u16 width; |
662 | u16 height; | 647 | u16 height; |
663 | 648 | ||
664 | if (s->vdev == NULL) | 649 | if (s->vdev.v4l2_dev == NULL) |
665 | return -EINVAL; | 650 | return -EINVAL; |
666 | 651 | ||
667 | IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); | 652 | IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); |
@@ -723,7 +708,7 @@ int ivtv_start_v4l2_decode_stream(struct ivtv_stream *s, int gop_offset) | |||
723 | struct ivtv *itv = s->itv; | 708 | struct ivtv *itv = s->itv; |
724 | int rc; | 709 | int rc; |
725 | 710 | ||
726 | if (s->vdev == NULL) | 711 | if (s->vdev.v4l2_dev == NULL) |
727 | return -EINVAL; | 712 | return -EINVAL; |
728 | 713 | ||
729 | if (test_and_set_bit(IVTV_F_S_STREAMING, &s->s_flags)) | 714 | if (test_and_set_bit(IVTV_F_S_STREAMING, &s->s_flags)) |
@@ -778,7 +763,7 @@ void ivtv_stop_all_captures(struct ivtv *itv) | |||
778 | for (i = IVTV_MAX_STREAMS - 1; i >= 0; i--) { | 763 | for (i = IVTV_MAX_STREAMS - 1; i >= 0; i--) { |
779 | struct ivtv_stream *s = &itv->streams[i]; | 764 | struct ivtv_stream *s = &itv->streams[i]; |
780 | 765 | ||
781 | if (s->vdev == NULL) | 766 | if (s->vdev.v4l2_dev == NULL) |
782 | continue; | 767 | continue; |
783 | if (test_bit(IVTV_F_S_STREAMING, &s->s_flags)) { | 768 | if (test_bit(IVTV_F_S_STREAMING, &s->s_flags)) { |
784 | ivtv_stop_v4l2_encode_stream(s, 0); | 769 | ivtv_stop_v4l2_encode_stream(s, 0); |
@@ -793,7 +778,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) | |||
793 | int cap_type; | 778 | int cap_type; |
794 | int stopmode; | 779 | int stopmode; |
795 | 780 | ||
796 | if (s->vdev == NULL) | 781 | if (s->vdev.v4l2_dev == NULL) |
797 | return -EINVAL; | 782 | return -EINVAL; |
798 | 783 | ||
799 | /* This function assumes that you are allowed to stop the capture | 784 | /* This function assumes that you are allowed to stop the capture |
@@ -917,7 +902,7 @@ int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts) | |||
917 | }; | 902 | }; |
918 | struct ivtv *itv = s->itv; | 903 | struct ivtv *itv = s->itv; |
919 | 904 | ||
920 | if (s->vdev == NULL) | 905 | if (s->vdev.v4l2_dev == NULL) |
921 | return -EINVAL; | 906 | return -EINVAL; |
922 | 907 | ||
923 | if (s->type != IVTV_DEC_STREAM_TYPE_YUV && s->type != IVTV_DEC_STREAM_TYPE_MPG) | 908 | if (s->type != IVTV_DEC_STREAM_TYPE_YUV && s->type != IVTV_DEC_STREAM_TYPE_MPG) |
@@ -969,7 +954,7 @@ int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts) | |||
969 | 954 | ||
970 | set_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags); | 955 | set_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags); |
971 | wake_up(&itv->event_waitq); | 956 | wake_up(&itv->event_waitq); |
972 | v4l2_event_queue(s->vdev, &ev); | 957 | v4l2_event_queue(&s->vdev, &ev); |
973 | 958 | ||
974 | /* wake up wait queues */ | 959 | /* wake up wait queues */ |
975 | wake_up(&s->waitq); | 960 | wake_up(&s->waitq); |
@@ -982,7 +967,7 @@ int ivtv_passthrough_mode(struct ivtv *itv, int enable) | |||
982 | struct ivtv_stream *yuv_stream = &itv->streams[IVTV_ENC_STREAM_TYPE_YUV]; | 967 | struct ivtv_stream *yuv_stream = &itv->streams[IVTV_ENC_STREAM_TYPE_YUV]; |
983 | struct ivtv_stream *dec_stream = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV]; | 968 | struct ivtv_stream *dec_stream = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV]; |
984 | 969 | ||
985 | if (yuv_stream->vdev == NULL || dec_stream->vdev == NULL) | 970 | if (yuv_stream->vdev.v4l2_dev == NULL || dec_stream->vdev.v4l2_dev == NULL) |
986 | return -EINVAL; | 971 | return -EINVAL; |
987 | 972 | ||
988 | IVTV_DEBUG_INFO("ivtv ioctl: Select passthrough mode\n"); | 973 | IVTV_DEBUG_INFO("ivtv ioctl: Select passthrough mode\n"); |
diff --git a/drivers/media/pci/ivtv/ivtv-streams.h b/drivers/media/pci/ivtv/ivtv-streams.h index a653a5136417..3d76a415fbd8 100644 --- a/drivers/media/pci/ivtv/ivtv-streams.h +++ b/drivers/media/pci/ivtv/ivtv-streams.h | |||
@@ -23,7 +23,7 @@ | |||
23 | 23 | ||
24 | int ivtv_streams_setup(struct ivtv *itv); | 24 | int ivtv_streams_setup(struct ivtv *itv); |
25 | int ivtv_streams_register(struct ivtv *itv); | 25 | int ivtv_streams_register(struct ivtv *itv); |
26 | void ivtv_streams_cleanup(struct ivtv *itv, int unregister); | 26 | void ivtv_streams_cleanup(struct ivtv *itv); |
27 | 27 | ||
28 | /* Capture related */ | 28 | /* Capture related */ |
29 | int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s); | 29 | int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s); |