diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-blackbird.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-blackbird.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c index 660b2a927feb..417d1d5c73c4 100644 --- a/drivers/media/video/cx88/cx88-blackbird.c +++ b/drivers/media/video/cx88/cx88-blackbird.c | |||
@@ -1057,7 +1057,7 @@ static int mpeg_open(struct file *file) | |||
1057 | 1057 | ||
1058 | dprintk( 1, "%s\n", __func__); | 1058 | dprintk( 1, "%s\n", __func__); |
1059 | 1059 | ||
1060 | lock_kernel(); | 1060 | mutex_lock(&dev->core->lock); |
1061 | 1061 | ||
1062 | /* Make sure we can acquire the hardware */ | 1062 | /* Make sure we can acquire the hardware */ |
1063 | drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD); | 1063 | drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD); |
@@ -1065,7 +1065,7 @@ static int mpeg_open(struct file *file) | |||
1065 | err = drv->request_acquire(drv); | 1065 | err = drv->request_acquire(drv); |
1066 | if(err != 0) { | 1066 | if(err != 0) { |
1067 | dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err); | 1067 | dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err); |
1068 | unlock_kernel(); | 1068 | mutex_unlock(&dev->core->lock);; |
1069 | return err; | 1069 | return err; |
1070 | } | 1070 | } |
1071 | } | 1071 | } |
@@ -1073,7 +1073,7 @@ static int mpeg_open(struct file *file) | |||
1073 | if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) { | 1073 | if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) { |
1074 | if (drv) | 1074 | if (drv) |
1075 | drv->request_release(drv); | 1075 | drv->request_release(drv); |
1076 | unlock_kernel(); | 1076 | mutex_unlock(&dev->core->lock); |
1077 | return -EINVAL; | 1077 | return -EINVAL; |
1078 | } | 1078 | } |
1079 | dprintk(1, "open dev=%s\n", video_device_node_name(vdev)); | 1079 | dprintk(1, "open dev=%s\n", video_device_node_name(vdev)); |
@@ -1083,7 +1083,7 @@ static int mpeg_open(struct file *file) | |||
1083 | if (NULL == fh) { | 1083 | if (NULL == fh) { |
1084 | if (drv) | 1084 | if (drv) |
1085 | drv->request_release(drv); | 1085 | drv->request_release(drv); |
1086 | unlock_kernel(); | 1086 | mutex_unlock(&dev->core->lock); |
1087 | return -ENOMEM; | 1087 | return -ENOMEM; |
1088 | } | 1088 | } |
1089 | file->private_data = fh; | 1089 | file->private_data = fh; |
@@ -1094,15 +1094,14 @@ static int mpeg_open(struct file *file) | |||
1094 | V4L2_BUF_TYPE_VIDEO_CAPTURE, | 1094 | V4L2_BUF_TYPE_VIDEO_CAPTURE, |
1095 | V4L2_FIELD_INTERLACED, | 1095 | V4L2_FIELD_INTERLACED, |
1096 | sizeof(struct cx88_buffer), | 1096 | sizeof(struct cx88_buffer), |
1097 | fh); | 1097 | fh, NULL); |
1098 | 1098 | ||
1099 | /* FIXME: locking against other video device */ | 1099 | /* FIXME: locking against other video device */ |
1100 | cx88_set_scale(dev->core, dev->width, dev->height, | 1100 | cx88_set_scale(dev->core, dev->width, dev->height, |
1101 | fh->mpegq.field); | 1101 | fh->mpegq.field); |
1102 | unlock_kernel(); | ||
1103 | 1102 | ||
1104 | atomic_inc(&dev->core->mpeg_users); | 1103 | atomic_inc(&dev->core->mpeg_users); |
1105 | 1104 | mutex_unlock(&dev->core->lock); | |
1106 | return 0; | 1105 | return 0; |
1107 | } | 1106 | } |
1108 | 1107 | ||
@@ -1120,8 +1119,11 @@ static int mpeg_release(struct file *file) | |||
1120 | videobuf_stop(&fh->mpegq); | 1119 | videobuf_stop(&fh->mpegq); |
1121 | 1120 | ||
1122 | videobuf_mmap_free(&fh->mpegq); | 1121 | videobuf_mmap_free(&fh->mpegq); |
1122 | |||
1123 | mutex_lock(&dev->core->lock); | ||
1123 | file->private_data = NULL; | 1124 | file->private_data = NULL; |
1124 | kfree(fh); | 1125 | kfree(fh); |
1126 | mutex_unlock(&dev->core->lock); | ||
1125 | 1127 | ||
1126 | /* Make sure we release the hardware */ | 1128 | /* Make sure we release the hardware */ |
1127 | drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD); | 1129 | drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD); |