diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-blackbird.c')
| -rw-r--r-- | drivers/media/video/cx88/cx88-blackbird.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c index 078be631955..d3ae5b4dfca 100644 --- a/drivers/media/video/cx88/cx88-blackbird.c +++ b/drivers/media/video/cx88/cx88-blackbird.c | |||
| @@ -1078,7 +1078,7 @@ static int mpeg_open(struct inode *inode, struct file *file) | |||
| 1078 | } | 1078 | } |
| 1079 | } | 1079 | } |
| 1080 | 1080 | ||
| 1081 | if (blackbird_initialize_codec(dev) < 0) { | 1081 | if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) { |
| 1082 | if (drv) | 1082 | if (drv) |
| 1083 | drv->request_release(drv); | 1083 | drv->request_release(drv); |
| 1084 | unlock_kernel(); | 1084 | unlock_kernel(); |
| @@ -1109,6 +1109,8 @@ static int mpeg_open(struct inode *inode, struct file *file) | |||
| 1109 | fh->mpegq.field); | 1109 | fh->mpegq.field); |
| 1110 | unlock_kernel(); | 1110 | unlock_kernel(); |
| 1111 | 1111 | ||
| 1112 | atomic_inc(&dev->core->mpeg_users); | ||
| 1113 | |||
| 1112 | return 0; | 1114 | return 0; |
| 1113 | } | 1115 | } |
| 1114 | 1116 | ||
| @@ -1118,7 +1120,7 @@ static int mpeg_release(struct inode *inode, struct file *file) | |||
| 1118 | struct cx8802_dev *dev = fh->dev; | 1120 | struct cx8802_dev *dev = fh->dev; |
| 1119 | struct cx8802_driver *drv = NULL; | 1121 | struct cx8802_driver *drv = NULL; |
| 1120 | 1122 | ||
| 1121 | if (dev->mpeg_active) | 1123 | if (dev->mpeg_active && atomic_read(&dev->core->mpeg_users) == 1) |
| 1122 | blackbird_stop_codec(dev); | 1124 | blackbird_stop_codec(dev); |
| 1123 | 1125 | ||
| 1124 | cx8802_cancel_buffers(fh->dev); | 1126 | cx8802_cancel_buffers(fh->dev); |
| @@ -1138,6 +1140,8 @@ static int mpeg_release(struct inode *inode, struct file *file) | |||
| 1138 | if (drv) | 1140 | if (drv) |
| 1139 | drv->request_release(drv); | 1141 | drv->request_release(drv); |
| 1140 | 1142 | ||
| 1143 | atomic_dec(&dev->core->mpeg_users); | ||
| 1144 | |||
| 1141 | return 0; | 1145 | return 0; |
| 1142 | } | 1146 | } |
| 1143 | 1147 | ||
| @@ -1158,6 +1162,10 @@ static unsigned int | |||
| 1158 | mpeg_poll(struct file *file, struct poll_table_struct *wait) | 1162 | mpeg_poll(struct file *file, struct poll_table_struct *wait) |
| 1159 | { | 1163 | { |
| 1160 | struct cx8802_fh *fh = file->private_data; | 1164 | struct cx8802_fh *fh = file->private_data; |
| 1165 | struct cx8802_dev *dev = fh->dev; | ||
| 1166 | |||
| 1167 | if (!dev->mpeg_active) | ||
| 1168 | blackbird_start_codec(file, fh); | ||
| 1161 | 1169 | ||
| 1162 | return videobuf_poll_stream(file, &fh->mpegq, wait); | 1170 | return videobuf_poll_stream(file, &fh->mpegq, wait); |
| 1163 | } | 1171 | } |
