diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2009-02-18 16:53:47 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-03-30 11:43:10 -0400 |
commit | 289596382e6aca005ca53ef20bbc44b9886cb0e0 (patch) | |
tree | 019cb12b023170eb2165ad47c80f484388c0feb5 /drivers/media/video/vino.c | |
parent | 8340ff43c49fe8e0cd049b65fbd2156bd651697e (diff) |
V4L/DVB (10864): vino: introduce v4l2_device.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/vino.c')
-rw-r--r-- | drivers/media/video/vino.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/media/video/vino.c b/drivers/media/video/vino.c index 0a5cd567bfb1..308fa419ae04 100644 --- a/drivers/media/video/vino.c +++ b/drivers/media/video/vino.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <linux/i2c-algo-sgi.h> | 36 | #include <linux/i2c-algo-sgi.h> |
37 | 37 | ||
38 | #include <linux/videodev2.h> | 38 | #include <linux/videodev2.h> |
39 | #include <media/v4l2-common.h> | 39 | #include <media/v4l2-device.h> |
40 | #include <media/v4l2-ioctl.h> | 40 | #include <media/v4l2-ioctl.h> |
41 | #include <linux/mutex.h> | 41 | #include <linux/mutex.h> |
42 | 42 | ||
@@ -295,6 +295,7 @@ struct vino_client { | |||
295 | }; | 295 | }; |
296 | 296 | ||
297 | struct vino_settings { | 297 | struct vino_settings { |
298 | struct v4l2_device v4l2_dev; | ||
298 | struct vino_channel_settings a; | 299 | struct vino_channel_settings a; |
299 | struct vino_channel_settings b; | 300 | struct vino_channel_settings b; |
300 | 301 | ||
@@ -3995,7 +3996,6 @@ over: | |||
3995 | ret = POLLIN | POLLRDNORM; | 3996 | ret = POLLIN | POLLRDNORM; |
3996 | 3997 | ||
3997 | error: | 3998 | error: |
3998 | |||
3999 | return ret; | 3999 | return ret; |
4000 | } | 4000 | } |
4001 | 4001 | ||
@@ -4052,7 +4052,7 @@ static const struct v4l2_file_operations vino_fops = { | |||
4052 | .owner = THIS_MODULE, | 4052 | .owner = THIS_MODULE, |
4053 | .open = vino_open, | 4053 | .open = vino_open, |
4054 | .release = vino_close, | 4054 | .release = vino_close, |
4055 | .ioctl = vino_ioctl, | 4055 | .unlocked_ioctl = vino_ioctl, |
4056 | .mmap = vino_mmap, | 4056 | .mmap = vino_mmap, |
4057 | .poll = vino_poll, | 4057 | .poll = vino_poll, |
4058 | }; | 4058 | }; |
@@ -4068,27 +4068,27 @@ static struct video_device vdev_template = { | |||
4068 | static void vino_module_cleanup(int stage) | 4068 | static void vino_module_cleanup(int stage) |
4069 | { | 4069 | { |
4070 | switch(stage) { | 4070 | switch(stage) { |
4071 | case 10: | 4071 | case 11: |
4072 | video_unregister_device(vino_drvdata->b.vdev); | 4072 | video_unregister_device(vino_drvdata->b.vdev); |
4073 | vino_drvdata->b.vdev = NULL; | 4073 | vino_drvdata->b.vdev = NULL; |
4074 | case 9: | 4074 | case 10: |
4075 | video_unregister_device(vino_drvdata->a.vdev); | 4075 | video_unregister_device(vino_drvdata->a.vdev); |
4076 | vino_drvdata->a.vdev = NULL; | 4076 | vino_drvdata->a.vdev = NULL; |
4077 | case 8: | 4077 | case 9: |
4078 | vino_i2c_del_bus(); | 4078 | vino_i2c_del_bus(); |
4079 | case 7: | 4079 | case 8: |
4080 | free_irq(SGI_VINO_IRQ, NULL); | 4080 | free_irq(SGI_VINO_IRQ, NULL); |
4081 | case 6: | 4081 | case 7: |
4082 | if (vino_drvdata->b.vdev) { | 4082 | if (vino_drvdata->b.vdev) { |
4083 | video_device_release(vino_drvdata->b.vdev); | 4083 | video_device_release(vino_drvdata->b.vdev); |
4084 | vino_drvdata->b.vdev = NULL; | 4084 | vino_drvdata->b.vdev = NULL; |
4085 | } | 4085 | } |
4086 | case 5: | 4086 | case 6: |
4087 | if (vino_drvdata->a.vdev) { | 4087 | if (vino_drvdata->a.vdev) { |
4088 | video_device_release(vino_drvdata->a.vdev); | 4088 | video_device_release(vino_drvdata->a.vdev); |
4089 | vino_drvdata->a.vdev = NULL; | 4089 | vino_drvdata->a.vdev = NULL; |
4090 | } | 4090 | } |
4091 | case 4: | 4091 | case 5: |
4092 | /* all entries in dma_cpu dummy table have the same address */ | 4092 | /* all entries in dma_cpu dummy table have the same address */ |
4093 | dma_unmap_single(NULL, | 4093 | dma_unmap_single(NULL, |
4094 | vino_drvdata->dummy_desc_table.dma_cpu[0], | 4094 | vino_drvdata->dummy_desc_table.dma_cpu[0], |
@@ -4098,8 +4098,10 @@ static void vino_module_cleanup(int stage) | |||
4098 | (void *)vino_drvdata-> | 4098 | (void *)vino_drvdata-> |
4099 | dummy_desc_table.dma_cpu, | 4099 | dummy_desc_table.dma_cpu, |
4100 | vino_drvdata->dummy_desc_table.dma); | 4100 | vino_drvdata->dummy_desc_table.dma); |
4101 | case 3: | 4101 | case 4: |
4102 | free_page(vino_drvdata->dummy_page); | 4102 | free_page(vino_drvdata->dummy_page); |
4103 | case 3: | ||
4104 | v4l2_device_unregister(&vino_drvdata->v4l2_dev); | ||
4103 | case 2: | 4105 | case 2: |
4104 | kfree(vino_drvdata); | 4106 | kfree(vino_drvdata); |
4105 | case 1: | 4107 | case 1: |
@@ -4154,6 +4156,7 @@ static int vino_probe(void) | |||
4154 | static int vino_init(void) | 4156 | static int vino_init(void) |
4155 | { | 4157 | { |
4156 | dma_addr_t dma_dummy_address; | 4158 | dma_addr_t dma_dummy_address; |
4159 | int err; | ||
4157 | int i; | 4160 | int i; |
4158 | 4161 | ||
4159 | vino_drvdata = kzalloc(sizeof(struct vino_settings), GFP_KERNEL); | 4162 | vino_drvdata = kzalloc(sizeof(struct vino_settings), GFP_KERNEL); |
@@ -4162,6 +4165,12 @@ static int vino_init(void) | |||
4162 | return -ENOMEM; | 4165 | return -ENOMEM; |
4163 | } | 4166 | } |
4164 | vino_init_stage++; | 4167 | vino_init_stage++; |
4168 | strlcpy(vino_drvdata->v4l2_dev.name, "vino", | ||
4169 | sizeof(vino_drvdata->v4l2_dev.name)); | ||
4170 | err = v4l2_device_register(NULL, &vino_drvdata->v4l2_dev); | ||
4171 | if (err) | ||
4172 | return err; | ||
4173 | vino_init_stage++; | ||
4165 | 4174 | ||
4166 | /* create a dummy dma descriptor */ | 4175 | /* create a dummy dma descriptor */ |
4167 | vino_drvdata->dummy_page = get_zeroed_page(GFP_KERNEL | GFP_DMA); | 4176 | vino_drvdata->dummy_page = get_zeroed_page(GFP_KERNEL | GFP_DMA); |
@@ -4239,6 +4248,7 @@ static int vino_init_channel_settings(struct vino_channel_settings *vcs, | |||
4239 | sizeof(struct video_device)); | 4248 | sizeof(struct video_device)); |
4240 | strcpy(vcs->vdev->name, name); | 4249 | strcpy(vcs->vdev->name, name); |
4241 | vcs->vdev->release = video_device_release; | 4250 | vcs->vdev->release = video_device_release; |
4251 | vcs->vdev->v4l2_dev = &vino_drvdata->v4l2_dev; | ||
4242 | 4252 | ||
4243 | video_set_drvdata(vcs->vdev, vcs); | 4253 | video_set_drvdata(vcs->vdev, vcs); |
4244 | 4254 | ||
@@ -4293,6 +4303,7 @@ static int __init vino_module_init(void) | |||
4293 | vino_module_cleanup(vino_init_stage); | 4303 | vino_module_cleanup(vino_init_stage); |
4294 | return ret; | 4304 | return ret; |
4295 | } | 4305 | } |
4306 | i2c_set_adapdata(&vino_i2c_adapter, &vino_drvdata->v4l2_dev); | ||
4296 | vino_init_stage++; | 4307 | vino_init_stage++; |
4297 | 4308 | ||
4298 | ret = video_register_device(vino_drvdata->a.vdev, | 4309 | ret = video_register_device(vino_drvdata->a.vdev, |